From 83c5cdc2d530eff26773b71912c72b56a6ddc06a Mon Sep 17 00:00:00 2001 From: unigeorge <40418272+unigeorge@users.noreply.github.com> Date: Sun, 3 Oct 2021 20:25:39 +0800 Subject: [PATCH] translated --- ...an by writing a -guess the number- game.md | 134 ------------------ ...an by writing a -guess the number- game.md | 129 +++++++++++++++++ 2 files changed, 129 insertions(+), 134 deletions(-) delete mode 100644 sources/tech/20210104 Learn Fortran by writing a -guess the number- game.md create mode 100644 translated/tech/20210104 Learn Fortran by writing a -guess the number- game.md diff --git a/sources/tech/20210104 Learn Fortran by writing a -guess the number- game.md b/sources/tech/20210104 Learn Fortran by writing a -guess the number- game.md deleted file mode 100644 index 89292005f8..0000000000 --- a/sources/tech/20210104 Learn Fortran by writing a -guess the number- game.md +++ /dev/null @@ -1,134 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: (unigeorge) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Learn Fortran by writing a "guess the number" game) -[#]: via: (https://opensource.com/article/21/1/fortran) -[#]: author: (Jim Hall https://opensource.com/users/jim-hall) - -Learn Fortran by writing a "guess the number" game -====== -Because Fortran was written in the punched card era, its syntax is -pretty limited. But you can still write useful and interesting programs -with it. -![Person typing on a 1980's computer][1] - -The first compiled programming language I learned was Fortran 77. While growing up, I taught myself how to write programs in BASIC on the Apple II and later in QBasic on DOS. But when I went to university to study physics, I learned [Fortran][2]. - -Fortran used to be quite common in scientific computing. And once upon a time, all computer systems had a Fortran compiler. Fortran used to be as ubiquitous as Python is today. So if you were a physics student like me, working in the 1990s, you learned Fortran. - -I always thought Fortran was somewhat similar to BASIC, so I quickly took to Fortran whenever I needed to write a quick program to analyze lab data or perform some other numerical analysis. And when I got bored, I wrote a "Guess the number" game in Fortran, where the computer picks a number between one and 100 and asks me to guess the number. The program loops until I guess correctly. - -The "Guess the number" program exercises several concepts in programming languages: how to assign values to variables, how to write statements, and how to perform conditional evaluation and loops. It's a great practical experiment for learning a new programming language. - -### The basics of Fortran programming - -While Fortran has been updated over the years, I am most familiar with Fortran 77, the implementation I learned years ago. Fortran was created when programmers wrote programs on punched cards, so "classic" Fortran is limited to the data you could put on a punched card. That means you could only write classic Fortran programs with these limitations: - - * Only one line of source code per card is allowed. - * Only columns 1–72 are recognized (the last eight columns, 73-80, are reserved for the card sorter). - * Line numbers ("labels") are in columns 1–5. - * Program statements go in columns 7–72. - * To continue a program line, enter a continuation character (usually `+`) in column 6. - * To create a comment line, enter `C` or `*` in column 1. - * Only the characters `A` to `Z` (uppercase), `0` to `9` (numbers), and the special characters `= + - * / ( ) , . $ ' :` and space are used. - - - -With these limitations, you can still write very useful and interesting programs. - -### Guess the number in Fortran - -Explore Fortran by writing the "Guess the number" game. This is my implementation: - - -``` -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 -``` - -If you are familiar with other programming languages, you can probably figure out what this program is doing by reading the source code. The first three lines are a comment block to indicate the program's function. The fourth line, `PROGRAM GUESSNUM`, identifies this as a program, and it is closed by the `END` statement on the last line. - -After defining a few variables, the program prompts the user to enter a random number seed. A Fortran program cannot initialize the random number generator from the operating system, so you must always start the random number generator with a "seed" value and the `SRAND` subroutine. - -Fortran generates random numbers between 0 and 0.999... with the `RAND(0)` function. The `0` value tells the `RAND` function to generate another random number. Multiply this random number by 100 to generate a number between 0 and 99.999…, and then add 1 to get a value between 1 and 100.999… The `INT` function truncates this to an integer; thus, the variable `NUMBER` is a random number between 1 and 100. - -The program prompts the user, then enters a loop. Fortran doesn't support the `while` or `do-while` loops available in more modern programming languages. Instead, you must construct your own using labels (line numbers) and `GOTO` statements. That's why the `READ` statement has a line number; you can jump to this label with the `GOTO` at the end of the loop. - -Punched cards did not have the `<` (less than) or `>` (greater than) symbols, so Fortran adopted a different syntax to compare values. To test if one value is less than another, use the `.LT.` (less than) comparison. To test if a value is greater than another, use `.GT.` (greater than). Equal and not equal are `.EQ.` and `.NE.`, respectively. - -In each iteration of the loop, the program tests the user's guess. If the user's guess is less than the random number, the program prints `TOO LOW`, and if the guess is greater than the random number, the program prints `TOO HIGH`. The loop continues until the user's guess is the same as the random number. - -When the loop exits, the program prints `THATS RIGHT!` and ends immediately. - - -``` -$ 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! -``` - -Every time you run the program, the user needs to enter a different random number seed. If you always enter the same seed, the program will always pick the same random number. - -### Try it in other languages - -This "guess the number" game is a great introductory program when learning a new programming language because it exercises several common programming concepts in a pretty straightforward way. By implementing this simple game in different programming languages, you can demonstrate some core concepts and compare each language's details. - -Do you have a favorite programming language? How would you write the "guess the number" game in it? Follow this article series to see examples of other programming languages that might interest you. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/21/1/fortran - -作者:[Jim Hall][a] -选题:[lujun9972][b] -译者:[unigeorge](https://github.com/unigeorge) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/jim-hall -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/1980s-computer-yearbook.png?itok=eGOYEKK- (Person typing on a 1980's computer) -[2]: https://en.wikipedia.org/wiki/Fortran diff --git a/translated/tech/20210104 Learn Fortran by writing a -guess the number- game.md b/translated/tech/20210104 Learn Fortran by writing a -guess the number- game.md new file mode 100644 index 0000000000..68103275ca --- /dev/null +++ b/translated/tech/20210104 Learn Fortran by writing a -guess the number- game.md @@ -0,0 +1,129 @@ +[#]: collector: (lujun9972) +[#]: translator: (unigeorge) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Learn Fortran by writing a "guess the number" game) +[#]: via: (https://opensource.com/article/21/1/fortran) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) + +通过写“猜数字”游戏学习 Fortran +====== + +Fortran 是在打孔卡时代编写的语言,因此它的语法非常有限。但你仍然可以用它编写有用和有趣的程序。 +![Person typing on a 1980's computer][1] + +Fortran 77 是我学习的第一门编译型编程语言。一开始时,我自学了如何在 Apple II 上用 BASIC 编写程序,后来又学会在 DOS 上用 QBasic 编写程序。但是当我去大学攻读物理学时,我又学习了 [Fortran][2]。 + +Fortran 曾经在科学计算中很常见。曾几何时,所有计算机系统都有一个 Fortran 编译器。Fortran 曾经像今天的 Python 一样无处不在。因此,如果你是像我这样的物理学专业学生,在 1990 年代工作,那你肯定学习了 Fortran。 + +我一直认为 Fortran 与 BASIC 有点相似,所以每当我需要编写一个简短程序,来分析实验室数据或执行其他一些数值分析时,我都会很快想到 Fortran。我在空闲时用 Fortran 编写了一个“猜数字”游戏,其中计算机会在 1 到 100 之间选择一个数字,并让我猜这个数字。程序会一直循环,直到我猜对了为止。 + +“猜数字”程序练习了编程语言中的几个概念:如何为变量赋值、如何编写语句以及如何执行条件判断和循环。这是学习新编程语言时一个很好的的实践案例。 + +### Fortran 编程基础 + +虽然 Fortran 这些年来一直在更新,但我最熟悉的还是 Fortran 77,这是我多年前学习的实现版本。Fortran 是程序员还在打孔卡上编程的年代创建的,因此“经典”Fortran 仅限于处理可以放在打孔卡上的数据。这意味着你只能编写符合以下限制条件的经典 Fortran 程序(LCTT 译注:后来的 Fortran 95 等版本已经对这些限制做了很大的改进,如有兴趣**建议直接学习新版**): + + * 每张卡只允许一行源代码。 + * 仅识别第 1-72 列(最后八列,73-80,保留给卡片分类器)。 + * 行号(“标签”)位于第 1-5 列。 + * 程序语句在第 7-72 列。 + * 要表示跨行,请在第 6 列中输入一个连续字符(通常是 `+`)。 + * 要创建注释行,请在第 1 列中输入 `C` 或 `*`。 + * 只有字符`A` 到`Z`(大写字母)、`0` 到`9`(数字)和特殊字符`= + - * / ( ) , . $ ' :` 和空格能够使用。 + +虽然有这些限制,你仍然可以编写非常有用和有趣的程序。 + +### 在 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` 将其标识为一个 程序program,并由最后一行的 `END` 语句关闭。 + +定义变量后,程序会提示用户输入随机数种子。Fortran 程序无法从操作系统初始化随机数生成器,因此你必须始终使用“种子”值和 `SRAND` 子程序subroutine 启动随机数生成器。 + +Fortran 使用 `RAND(0)` 函数生成 0 到 0.999…… 之间的随机数。参数 `0` 告诉 `RAND` 函数生成一个随机数。将此随机数乘以 100 以生成 0 到 99.999…… 之间的数字,然后加 1 得到 1 到 100.999…… 之间的值。`INT` 函数将结果截断为整数;因此,变量 `NUMBER` 就是一个介于 1 到 100 之间的随机数。 + +程序会给出提示,然后进入一个循环。Fortran 不支持更现代的编程语言中可用的 `while` 或 `do-while` 循环(LCTT 译注:Fortran 95 等新版支持,也因此在一定程度上减少了 `GOTO` 的使用)。相反,你必须使用标签(行号)和 `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! +``` + +每次运行程序时,用户都需要输入不同的随机数种子。如果你总是输入相同的种子,程序给出的随机数也会一直不变。 + +### 在其他语言中尝试 + +在学习一门新的编程语言时,这个“猜数字”游戏是一个很好的入门程序,因为它以非常简单的方式练习了几个常见的编程概念。通过用不同的编程语言实现这个简单的游戏,你可以弄清一些核心概念以及比较每种语言的细节。 + +你有最喜欢的编程语言吗?如何用你最喜欢的语言来编写“猜数字”游戏?跟随本系列文章来查看你可能感兴趣的其他编程语言示例吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/fortran + +作者:[Jim Hall][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/1980s-computer-yearbook.png?itok=eGOYEKK- (Person typing on a 1980's computer) +[2]: https://en.wikipedia.org/wiki/Fortran