2014-04-03 100 views
1

我正尝试使用FORTRAN创建pascal三角形。我做了算法。在C编译成功,但由于某种原因,我没有在FORTRAN中获得相同的期望结果。任何人都可以帮我解决这个问题吗?FORTRAN中的Pascal三角形

代码在C(工作):在FORTRAN

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    unsigned int c, i, j, k,n; 
    scanf("%d",&n); 

    for(i=0; i < n; i++) { 
    c = 1; 
    for(j=1; j <= (n-1-i); j++) printf(" "); 
    for(k=0; k <= i; k++) { 
     printf("%2d", c); 
     c = c * (i-k)/(k+1); 
    } 
    printf("\n"); 

    } 
    return 0; 
} 

代码(不工作,需要帮​​助这里):

program pascal 
    implicit none 
    integer i,j,k,p,n 
    read(*,*)n 
    i=0 
    do while(i.lt.n) 
    p=1 
    do j=1,n-1-i 
    write(*,5) 
    5 format(1x) 
    enddo 
    do k = 0,i 
    write(*,1)p 
    1 format(i2) 
    p = p*(i-k)/(k+1) 
    enddo 
    i=i+1 
    write(*,2) 
    2 format(/) 
    enddo 
endprogram 
+2

尽管我爱fortran,我讨厌它是I/O时它涉及到格式化输出。 – ja72

回答

0

你可以试试这个。请注意,如果输入n> 9的数字,它将不起作用(并且对于n> 5,它不是那么漂亮)。

program pascal 
    implicit none 
    integer :: i, j, n, c 
    read(*, *) n 
    do i = 0, n - 1 
     c = 1 
     do j = 0, n - i 
      write(*, "(' ')", advance="no") 
     end do 
     do j = 0, i 
      write(*, "(I2)", advance="no") c 
      c = (c * (i - j))/(j + 1) 
     end do 
     write(*, *) 
    end do 
end program 

在你的程序中,几乎所有的东西是正确的,当你打印情况除外:Fortran语言总是添加一个新的行,如果你不添加可选advance="no"

关于样式,这里将格式放在单独的行中并不是很有用,并且.lt.可以替换为Fortran 90中的<。另外,缩进在内部循环中不正确。

+0

我发现这已经在谷歌虽然。是的,这里的问题是,如你所提到的那样,它不能用于超过8行。这就是为什么我正在寻找更灵活的代码。如果你能告诉我我的代码出错了,我会非常感激,因为就我认为我的算法是正确的而言。 感谢您的回复。 – Arman

+0

回复您编辑的答案:哦,我看到事情搞砸了。感谢您指出了这一点。 – Arman

1

这里有一些改进,可以处理的n较大值:

program pascal 
implicit none 
integer i,j,k,p,n 
write (*, '("input n: ")', advance="no") 
read(*,*) n 
do i=0,n-1 
    p=1 
    do j=1,n-1-i 
     write(*,'(3X)', advance="no") 
    enddo 
    do k = 0,i 
     write(*,'(I6)', advance="no") p 
     p = p*(i-k)/(k+1) 
    enddo 
    write(*, '(/)') 
enddo 
endprogram 

对这一计划的格式化IO似乎很简单我。更复杂的是,如果你想弄清楚最大的整数,将输出一个特定的值为n,并输出最紧凑的三角形,这种情况下...

+0

感谢您的有用答复。我已经解决了这个问题。猜猜我不知道advance =“no”语法。我现在将用不同的值来试验我的代码。 – Arman