0

課題として、FORTRAN コードに関係する作業をいくつか与えられましたが、唯一の問題は、まだ教えられていないため、何が起こっているのか完全にはわからないため、Java に変換しようとしました。それを把握しようとする。以下は FORTRAN コードです。

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 の両方の行でサイクルが発生するため、FORTRAN ループが行うことではなく、発生するサイクルを把握するために Java のみで交換しました。

4

1 に答える 1

2

Fortranでは、ステートメント

DO 20 I = 1, 512

終了がlabelの行であるループを開始します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 I = 1, 512
          SUM(I) = I
       END DO

または、私が書くように、暗黙のdoループで配列コンストラクターを使用します。

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

Fortranはの要素ISUMに設定しIます。

したがって、OPの質問に直接答えるために、元のFortranコードは2512行目と4行目を実行し1+2+3+4+...+512ます。

私の意見では、この合計を計算するためにJava(または実際には任意の言語)プログラムを作成することは、コンピューターサイエンス(またはソフトウェアエンジニアリングなど)の学生に教えるべきではないことです。最初のN個の整数の合計にはよく知られている閉じた形の方程式があり(グーグルの用語が何であるかを明確にするためにイタリック体で示されています)、意欲的なソフトウェア開発者はこの閉じた形を知っている必要があります。このような志願者は、この閉じた形式を正確に知って、無意味に反復するプログラムを作成しなくても、示されているようなループで呼び出される操作の数を把握できるようにする必要があります。

結論として、OPのJavaプログラムはF-、実装されるべきものの実装ではないため、私が教えたどのコースでも受講できます。これは、最初のN整数の合計を計算する関数です。これF-は、プログラムの正しさやその他に関係なく適用されます。私はそれほど脅威ではない教師ではないので、この知識がなければソフトウェアエンジニアのふりをする人を雇うことはありません。

于 2012-12-07T10:49:41.373 に答える