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 行都需要一个循环,所以我在 Java 中交换它只是为了弄清楚所用的循环,而不是 FORTRAN 循环所做的事情。

4

1 回答 1

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 I = 1, 512
          SUM(I) = I
       END DO

或者,正如我所写,使用带有隐含 do 循环的数组构造函数:

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

Fortran 将 的元素设置I为。SUMI

因此,为了更直接地回答 OP 的问题,原始 Fortran 代码执行了 2512行和 4 行1+2+3+4+...+512

我的观点是,编写一个 Java(或实际上任何语言)程序来计算这个总和正是计算机科学(或软件工程或......)的学生不应该做的那种事情。前 N 个整数之和有一个众所周知的封闭式方程(斜体是为了阐明您应该在谷歌上搜索的术语是什么),任何有抱负的软件开发人员都应该知道这个封闭式。这样一个有抱负的人应该准确地知道这种封闭形式,以便能够弄清楚在循环中调用了多少操作,例如所示的那些,而不必编写程序来进行毫无意义的迭代。

To conclude, OP's Java program would get an F- on any course I taught because it is not an implementation of what ought to have been implemented - a function to calculate the sum of the first N integers. That F- would be applied irrespective of the correctness or otherwise of the program. Since I'm not a teacher that's not much of a threat, but I simply wouldn't hire anyone pretending to be a software engineer without this knowledge.

于 2012-12-07T10:49:41.373 回答