2014-04-03 101 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