2012-12-07 83 views
0

因爲我一直在考慮一些東西做涉及Fortran代碼的分配,但唯一的問題是,我們沒有被教導這些事,所以我不完全知道發生了什麼,所以我已經試圖將它轉換成Java來試圖抓住它。以下是Fortran代碼:轉換FORTRAN循環到Java

L1:  DO 20 I = 1, 512 
L2:   SUM(I) = 0 
L3:   DO 40 J = 1, I 
L4: 40   SUM(I) = SUM(I) + 1 
L5: 20  CONTINUE 

的想法是,L2和L4都需要一個機器週期,我得把它需要多長時間循環完成。以下是我的Java,我認爲至少是相當接近的鍛鍊價值我想:

public static void main(String[] args) { 
    int cycles = 0; 
    for(int i = 1; i < 512; i++){ 
     cycles = cycles + 1; 
     for(int j = 1; j < i; j++){ 
      cycles = cycles +1; 
     } 
    } 
    System.out.println(cycles); 
} 

這個問題似乎正確嗎?任何幫助表示讚賞。我已經通過數學思考並得到了不同的答案(儘管兩者都很接近),所以我不確定哪個更好。

編輯:我想明確指出,我並不是試圖直接將FORTRAN移植到Java,而只是使用Java來計算上述循環時間。

編輯2:我沒有試圖創建數組,只計算循環期間所採用的週期。因爲L2和L4兩行都需要一個循環,所以我只在Java中交換它以計算所採用的週期,而不是做FORTRAN循環做的事情。

+0

你的陳述應該是「<=」不是「<」。你錯過了一些週期。 –

+0

爲什麼downvoted -2​​? –

+0

@HighPerformanceMark ooops,現在打了一個錯字 - 修正它。它是I + 1. – whitfin

回答

2

在Fortran聲明

DO 20 I = 1, 512 

開始一個循環,其末端與標籤20行。同樣,內部循環以標記爲40的語句結束。在現代Fortran語言,這可能看起來像

DO I = 1, 512 
     SUM(I) = 0 
     DO J = 1, I 
      SUM(I) = SUM(I) + 1 
     END DO 
    END DO 

甚至,因爲Fortran語言(因爲Fortran 90的)有數組聲明,並作爲Duffymo觀察到,SUM是一個數組

​​

,或者我會寫,使用陣列構造有一個隱含的do循環:

SUM = [(I,I=1,512)] 

函數Fortran設置元件ISUMI

因此,要更直接地回答OP的問題,最初的Fortran代碼執行第2行512次和第4行1+2+3+4+...+512次。

我的看法是,編寫Java(或實際上任何語言)程序來計算這個數額正是諸如此類的事情:計算機科學(或軟件工程或......)的學生應學會不要做;沒有爲和第N個整數的一個衆所周知的封閉形式的方程(斜體澄清你應該谷歌搜索術語是什麼)和任何有抱負的軟件開發人員應該知道這種封閉形式。這種上進應該準確知道這個封閉形式要能找出多少次操作循環中被調用,如無需編寫一個程序來無意義重複顯示的朋友。總而言之,OP的Java程序在我教過的任何課程中都會得到一個F-,因爲它不是實現應該實現的功能 - 計算第一個N整數之和的函數。無論程序的正確性或其他方面如何,都將應用F-。由於我不是一個沒有多大威脅的老師,但我根本不會僱用任何假裝成爲沒有這方面知識的軟件工程師。

+0

事實上,我確實在回答擴展部分的問題,因爲我沒有真正查看足夠的代碼來了解需要什麼。我首先使用Java的唯一原因是因爲我認爲創建循環對我來說更容易,而不是必須思考它(從未見過FORTRAN和導師對問題有點混亂)。 – whitfin