通过编写“猜数字”游戏学习 Fortran

由于 Fortran 是在穿孔卡片时代编写的,因此其语法非常有限。但是,您仍然可以使用它编写有用且有趣的程序。
48 位读者喜欢此文章。
Compute like it's 1989

LSE 图书馆提供。由 Opensource.com 修改。CC BY-SA 4.0

我学习的第一种编译型编程语言是 Fortran 77。 在成长过程中,我自学了如何在 Apple II 上用 BASIC 编写程序,后来在 DOS 上用 QBasic 编写程序。 但是,当我上大学学习物理时,我学习了 Fortran

Fortran 曾经在科学计算中非常流行。 曾经有一段时间,所有计算机系统都有 Fortran 编译器。 Fortran 曾经像今天的 Python 一样普及。 因此,如果您像我一样是 1990 年代的物理系学生,您会学习 Fortran。

我一直认为 Fortran 有点类似于 BASIC,因此每当我需要编写快速程序来分析实验室数据或执行其他数值分析时,我都很快就学会了 Fortran。 当我感到无聊时,我用 Fortran 编写了一个“猜数字”游戏,计算机选择一个介于 1 到 100 之间的数字,然后要求我猜数字。 该程序循环直到我猜对为止。

“猜数字”程序练习了编程语言中的几个概念:如何为变量赋值、如何编写语句,以及如何执行条件评估和循环。 它是学习新编程语言的一个很好的实践实验。

Fortran 编程的基础知识

虽然 Fortran 多年来已经更新,但我最熟悉的是 Fortran 77,这是我多年前学习的实现。 Fortran 是在程序员在穿孔卡片上编写程序时创建的,因此“经典” Fortran 仅限于您可以放在穿孔卡片上的数据。 这意味着您只能使用以下限制编写经典 Fortran 程序

  • 每张卡片只允许一行源代码。
  • 仅识别第 1-72 列(最后 8 列,73-80 列,保留给卡片分拣机)。
  • 行号(“标签”)在第 1-5 列中。
  • 程序语句位于第 7-72 列中。
  • 要继续程序行,请在第 6 列中输入一个继续字符(通常为 +)。
  • 要创建注释行,请在第 1 列中输入 C*
  • 仅使用字符 AZ(大写)、09(数字)和特殊字符 = + - * / ( ) , . $ ' : 和空格。

有了这些限制,您仍然可以编写非常有用且有趣的程序。

用 Fortran 猜数字

通过编写“猜数字”游戏来探索 Fortran。 这是我的实现

CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C     PROGRAM TO GUESS A NUMBER 1-100
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
      PROGRAM GUESSNUM
      INTEGER SEED, NUMBER, GUESS

      PRINT *, 'ENTER A RANDOM NUMBER SEED'
      READ *, SEED
      CALL SRAND(SEED)

      NUMBER = INT( RAND(0) * 100 + 1 )

      PRINT *, 'GUESS A NUMBER BETWEEN 1 AND 100'
 10   READ *, GUESS

      IF (GUESS.LT.NUMBER) THEN
         PRINT *, 'TOO LOW'
      ELSE IF (GUESS.GT.NUMBER) THEN
         PRINT *, 'TOO HIGH'
      ENDIF

      IF (GUESS.NE.NUMBER) GOTO 10

      PRINT *, 'THATS RIGHT!'
      END

如果您熟悉其他编程语言,您可能可以通过阅读源代码来了解此程序的作用。 前三行是注释块,用于指示程序的功能。 第四行 PROGRAM GUESSNUM 将其标识为一个程序,并在最后一行的 END 语句中关闭。

在定义几个变量之后,程序提示用户输入一个随机数种子。 Fortran 程序无法从操作系统初始化随机数生成器,因此您必须始终使用“种子”值和 SRAND 子例程启动随机数生成器。

Fortran 使用 RAND(0) 函数生成介于 0 和 0.999... 之间的随机数。 0 值告诉 RAND 函数生成另一个随机数。 将此随机数乘以 100 以生成一个介于 0 和 99.999…之间的数字,然后加 1 以获得一个介于 1 和 100.999…之间的值。 INT 函数将其截断为整数; 因此,变量 NUMBER 是一个介于 1 和 100 之间的随机数。

程序提示用户,然后进入一个循环。 Fortran 不支持更现代的编程语言中可用的 whiledo-while 循环。 相反,您必须使用标签(行号)和 GOTO 语句来构造自己的循环。 这就是 READ 语句具有行号的原因; 您可以使用循环末尾的 GOTO 跳转到此标签。

穿孔卡片没有 <(小于)或 >(大于)符号,因此 Fortran 采用了一种不同的语法来比较值。 要测试一个值是否小于另一个值,请使用 .LT.(小于)比较。 要测试一个值是否大于另一个值,请使用 .GT.(大于)。 等于和不等于分别是 .EQ..NE.

在循环的每次迭代中,程序测试用户的猜测。 如果用户的猜测小于随机数,则程序打印 TOO LOW,如果猜测大于随机数,则程序打印 TOO HIGH。 循环继续,直到用户的猜测与随机数相同。

当循环退出时,程序打印 THATS RIGHT! 并立即结束。

$ gfortran -Wall -o guess guess.f

$ ./guess
 ENTER A RANDOM NUMBER SEED
93759
 GUESS A NUMBER BETWEEN 1 AND 100
50
 TOO LOW
80
 TOO HIGH
60
 TOO LOW
70
 TOO LOW
75
 TOO HIGH
73
 TOO LOW
74
 THATS RIGHT!

每次运行程序时,用户都需要输入不同的随机数种子。 如果您总是输入相同的种子,程序将始终选择相同的随机数。

尝试使用其他语言

当学习新的编程语言时,这个“猜数字”游戏是一个很好的入门程序,因为它以一种非常简单的方式练习了几个常见的编程概念。 通过在不同的编程语言中实现这个简单的游戏,您可以演示一些核心概念并比较每种语言的细节。

您有最喜欢的编程语言吗? 您将如何用它编写“猜数字”游戏? 关注本系列文章,查看您可能感兴趣的其他编程语言的示例。

接下来读什么
标签
photo of Jim Hall
Jim Hall 是一位开源软件倡导者和开发人员,以 GNOME 中的可用性测试以及 FreeDOS 的创始人和项目协调员而闻名。

2 条评论

您可以从操作系统初始化随机数种子 - 一种方法是使用日期函数生成一些东西,然后将其中一些东西放入一个整数作为种子。

https://chinapcbsmt.com/

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.