7.7   计算机系统

 

一、 《 考试大纲 》 的规定

计算机系统组成;计算机的发展;计算机的分类;计算机系统特点;计算机硬件系统组成; cpu ;存储器;输入/输出设备及控制系统;总线;数模/模数转换;计算机软件系统组成;系统软件;操作系统;操作系统定义;操作系统特征;操作系统功能;操作系统分类;支撑软件;应用软件;计算机程序设计语言。

二、重点内容

1 .计算机的发展

1946 2 月美国宾夕法尼亚大学诞生世界上第一台电子数字积分计算机 eniac 以来,计算机的发展随着其主要部件的演变经历了如下几代历程:

l )第一代计算机(19461956 年),其主要基本特征是其主要部件为电子管;

2 )第二代计算机(19561962 年),其主要特征是其主要部件为晶体管;

3 )第三代计算机(19621970 年),其主要特征是其主要部件为中、小规模集成电路;

4 )第四代计算机(1971 年~至今),其主要特征是其主要部件为大规模、超大规模集成电路。 1971 年英特尔公司( intel )推出了第一代微处理器芯片 inte14004

未来的计算机发展趋势是:高性能、人性化、网络化、多媒体、多极化和智能化

 

2 .计算机的分类

计算机的分类方法有多种,具体为:

1 )按计算机所处理的量值不同,可分为模拟计算机和数字计算机。

2 )按数字计算机用途,可分为专用计算机和通用计算机。

3 )按计算机内部逻辑结构,可分为复杂指令系统计算机和精简指令系统计算机。

4 )按计算机的字长不同,可分为 8 位机、 16 位机、 32 位机和 64 位机。

 

3 .计算机系统组成及其特点

一个完整的计算机系统是由计算机硬件系统和软件系统组合而成的,如图 741 所示。计算机系统的特点是:具有计算、判断、存储、快速操作能力,精确计算能力,通用性好,通俗易用和联网功能。

4 .计算机硬件系统组成。

按照冯·诺依曼结构原理,计算机至少应由运算器、控制器、存储器、输人设备和输出设备五部分组成

通常将运算器和控制器统称为中央处理器,简称 cpu 由中央处理器和内存储器构成主机。 cpu 是分析指令和执行指令的部件,是计算机的核心它主要由运算器、控制器和通用寄存器组成。

存储器,其主要功能是存放程序和数据,可分为内存储器(主存)和外存储器(辅助)。目前内存储器多数是半导体存储器,外存储器通常是磁盘、磁带、光盘等。

输入/输出设备(i / o) ,如图 741 所示。输入/输出设备控制系统,其主要功能是控制输入/输出设备的工作过程,它包括控制输入/输出操作的通道、输入/输出处理器、输入/输出设备控制器等。

1 )总线

在计算机中,各部件之间传递的信息可分为:地址信息、数据信息(包括指令)和控制信息三种类型。

总线是计算机内部传输各种信息的通道,是一组公共信息传输线路,并能为多个部件服务,可分时地发送和接收各部件的信息。根据总线传送信息的类别,总线可分为数据总线、地址总线和控制总线。

总线工作方式通常是由发送信息的部件分时地将信息发往总线,再由总线将这些信息同时发往各个接收信息的部件。对于由哪个部件接收信息,则由输入脉冲控制决定。总线的数据通路宽度是指能够一次并行传送的数据位数。

2 )数模/模数转换设备

计算机硬件系统中的新成员包括辅助存储器和数模/模数转换设备。其中,数模/模数转换设备,其功能是在实时控制系统或过程控制系统中,将模拟量变换为相应的数字量,输入计算机;或将计算机中数字量变换为相应的模拟量,输出到被测试对象。

5 .计算机软件系统

根据组成软件的功能和特点,一般将计算机软件分为两大类:系统软件和应用软件。按照应用和虚拟机的观点,计算机软件又可分为三大类:系统软件、支撑软件和应用软件

没有软件支持的计算机称之为“裸机”

1 )系统软件一般包括操作系统、语言处理程序、诊断程序等。操作系统是计算机硬件和各种用户程序之间的接口程序,位于各种软件的最底层。操作系统的特征是:并发性、共享性、随机性。操作系统有两个主要功能:资源管理和提供友好的界面。操作系统的分类,具体为:

① 按系统功能分:批处理操作系统、分时操作系统、实时操作系统;

② 按计算机配置分:单机配置(又分为大、小、微型和多媒体操作系统)、多机配置(又分为网络、分布式操作系统) ;

③ 按用户数目分:单用户操作系统(如 ms dos windows2000 xp )、多用户操作系统(如 unix ;

④ 按任务数量分:单任务操作系统、多任务操作系统。

批处理操作系统的特点是:批处理、多道程序操作系统。

分时操作系统的特点是:同时性、交互性、独占性。

实时操作系统的特点是:及时性,即及时接收来自现场的数据,及时对其进行分析处理,及时作出相应的响应。实时操作系统通常包括实时控制系统和实时处理系统。

分布式操作系统的特征是:统一性、共享性、透明性和自治性。它与网络操作系统相比,具有更短的响应时间,高容量和高可靠性。两者的主要区别在于资源管理、通信和系统结构。网络操作系统,如 windows nt windows 2000 。对网络操作系统的要求是保证信息传输的准确性、安全性和保密性。

2 )支撑软件与应用软件目前,支撑软件主要包括:各种接口软件、工具软件和数据库。其中,常见的数据库系统有: microsoft access foxpro oracle sql server 。应用软件,如文字处理软件、表格处理软件、辅助设计软件、实时控制软件(像 fix intouch , lookout )等。

6 .计算机程序设计语言

计算机程序设计语言的发展历程为: ① 第一代语言 ― 机器语言; ② 第二代语言 ― 汇编语言; ③ 第三代语言 ― 高级语言、算法语言; ④ 第四代语言 ― 面向问题的语言,如 sql的数据库查询语言, ⑤ 第五代语言 ― 智能性语言,如 prolog 语言

1 )汇编程序与编译程序

汇编程序是指把由汇编语言编写的源程序,翻译成目标程序(即计算机可执行程序)的软件。

编译程序是指把由高级语言编写的源程序,翻译成计算机可执行程序的软件。

计算机能执行高级语言编写的程序,实际上是先将用高级语言编写的程序(称为源程序),用解释或编译的方法,变为计算机可执行程序(或称为机器语言程序),再由计算机执行这个机器语言程序。所以,一个计算机程序的执行过程可分为编程、编译、连接和运行四个过程。

上述解释或编译的方法,可用编译程序和解释程序,两者的本质区别是:在翻译的过程中,编译程序是在整体理解源程序的基础上进行翻译的,而解释程序对源程序采取的是根据程序语句执行的,顺利进行逐条语句翻译的方法。

其次,编译程序有保存的目标程序,而解释程序无保存的目标程序;

 

第三,编译代码比解释代码运行的速度要快。

使用编译程序的高级语言有 fortran cobol pascal c++、 visualc++等。使用解释程序的高级语言有 basic

2 )常用的程序设计语言 fortran 语言,主要用于科学计算,广泛用于数学、科学和工程计算。

basic 语言,主要为初学者设计的小型高级语言; visual basic vb )是 windows 下的可视化编程语言环境,支持面向对象的程序设计。

c 语言,适用于系统软件和大量应用软件。 c 语言是结构化、模块化的语言,是面向过程的。 c ++语言,是增加了面向对象的程序设计的“类” ( class )的机制,其功能比 c 语言更强大。 pascal 语言,适用于教学,用于帮助学生学习计算机编程。 lisp 语言,人工智能程序,主要用于构建人工智能程序。

java语言,是完全面向对象的语言,是因特网应用的主要开发语言之一,并且它的运行与操作系统平台无关。

第七节 计算机程序设计语言
 
一、程序设计语言
计算机程序设计语言又称算法语言。目前国内外比较通用的算法语言有多种,如 basic、fortran、pascal、algol、c等。随着算法语言本身的发展和完善,同一 语言中还有不同的标准文本问世。每种语言都有其自身的规则和特点,但也有共性的地方。
在目前通用的算法语言中, fortran语言特别适用于科学计算,又是为我国广大结构工程技术人员较为普遍掌握的一种语言,因此,本次注册结构工程师考试的内容选为 fortran 语言。fortran语言于50年代出现于美国。1966年,美国国家标准化协会(ansi)公布了标准fortran (ansi x3. 9-1966 ), 1977年对其进行了修订, 1978年,将其定为国家标准,称为fortran 77(ansi x3. 9-1978) 。以下有关内容,主要参照fortran 77的标准进行说明。
 
二、fortran的程序构成和基本规定
(一)程序构成
一个完整的fortran程序由一个主程序或一个主程序和若干个子程序组成。主程序与每个子程序都是一个独立的程序单位,称为一个程序模块。关于程序的构成,有如下一些基本规定。
1.程序由若干行组成。
2.在fortran中,程序行分为语句行和注释行。
 (1)语句行由fortran语句组成,包括执行语句和非执行语句。执行语句使计算机在运行时产生某些操作,如赋值语句、输入输出语句等。非执行语句为计算机在编译或 运行时提供某种信息,本身不产生操作,如说明语句、格式语句等。
(2)注释行又称为非语句行,在程序中起注释作用,便于程序的编写、修改和维护。
3. fortran规定,每个语句行只能写一个语句;但当语句长度超过规定的一行范围、或者为表达清晰起见需要将一个语句分行书写时,可以采用连续行。连续行的第一行称为始行,以后各行称为续行。
4.fortran语句可以有标号。标号作为一个语句被其他语句引用的标志。在同一个程序单位中,不能出现相同的语句标号。
5.程序单位的最后一行语句,必须是end 语句。如果一个fortran语句行与注释行的集合,最末没有end,可称其为一个语句块或程序段,但不能作为一个程序单位。
 
(二)书写规则
1.fortran77的字符集由26个英文字母、10个数字和其他13个专用字符组成。
2.一个程序行有80列,每列写一个字符。
3.程序行的第1列如写上c或*,表示该行为注释行。注释内容可写在该行中除第1列外的任何位置。
4.在语句行中,程序行的第1列至第5列为语句标号区,标号区内是最多为5位的无符号整数;程序行的第6列为续行区,若某行为续行,则标号区必须空白,且第6列为非0的任一fortran77字符(不能为空格) ;第7列至第72列为语句区
例如,在边长为b的正方形中挖一个半径为r的圆,计算剩余的面积;若b<2r, 则给出相关信息。该问题的fortran程序可编写如下。
c computation of area.
read*, b, r
if (b. lt.2*r) then
write (*, 10)
10 format ('error message: b less than 2*r
else
write (*,(”area =”, f10.2))
$ b*b-3.14159*r*r
endif
end
本例中,第1行为注释行,第5行为带标号的语句,第7~8行为连续行,符号$为续行标志。
 
(三)常量与变量
1.常量指程序中其值固定不变的一些量,包括以下6种类型。
(1)整形常量,也称整数。一个整数可采用正、负号和数字字符表示,正号可以省略.。
(2)实型常量,也称实数。可以用小数形式或指数形式表示。用指数形式表示的实数如11.3e5,+11. 3e+5, 1. e-12,-.23e12等。
(3)双精度实型常量,或称双精度实数。双精度实数也是实数。但在一般的微型计算 机中,实数的有效位数为7位,双精度实数的有效位数可以达到15~17位。双精度实数的表示方法,除在指数形式的表达中用字符d代替e以外,其余和实数相同。
(4)复型常量,简称复数。在fortran中,用一对圆括弧括起来的两个实数表示。如(12 . 0 ,-6.e2 )表示复数12.0—600.0i。
(5)逻辑型常量。fortran中的逻辑型常量有两个值: . true.与. false.。
(6)字符型常量,也称为字符串。计算机系统使用的若干个字符,用一对单引号括起 来后,就作为字符串。
2.变量指在程序运行期间可以改变的量。
(1)变量的类型与常量相对应,分为整型变量、实型变量、双精度实型变量、复型变 量、逻辑型变量与字符串变量。
(2)变量名按一定的规则命名。在fortran中,变量名采用1至6个字符(数字 或字母) ,其中第一个字符必须是字母。fortran77规定,变量名书写时不区别字母的大写与小写,例如abc与abc都指同一个变量。
(3)变量类型的说明方法。
1 i-n隐含规则。在程序单位中没有其他说明时,以字母i, j, k, l, m, n中的 任一个字母打头命名的变量都是整型变量。
2)用类型说明语句规定变量类型。例如:
integer a, count
real icount
double precision xing
complex dup
logical jug
character头10 filenm
分别表示变量a, count为整型, icount为实型, xing为双精度实型, dup为复 制, jug为逻辑型, filenm为字符型变量,其长度为10个字符。
3)用隐含说明语句implicit语句,可以将程序单位中以某一字母开头的所有变量 指定为所需类型。例如:
implicit integer (a, c), real (i-k)
指定了以a与c字母开头的所有变量都是整型变量,以字母i至k开头的所有变量为实 型变量。
类型说明语句和隐含说明语句只在本程序单位中有效;它们必须放在程序单位所有可执行语句的前面,而implicit语句又必须在所有的类型说明语句的前面。确定变量类型的三种方法中,类型说明语句的优先级最高, i-n规则的优先级最低。
 
 (四)数组
1.数组的定义
有些互相关联的数据,作为单个变量处理并不方便。程序设计语言通常把这种相互关联的数据按一定的顺序关系组成一个集合,该集合称为数组;组成数组的基本单元称为数组元素,每一个数组元素对应一个数据。
在fortran中,使用数组前必须对数组进行定义,包括对数组命名;确定数组的类型;确定数组的维数及大小;指出数组各维下标的下限与上限。数组的命名规则与变量的命名规则相同。
确定数组类型、维数及其大小的方法有以下两种。
(1)用类型说明语句定义数组。例如:
integer x (-2:30), xyz (1 :20, 0: 15)
定义了两个整型数组。其中x称为一维数组,下标的下限与上限分别为-2与30,即这个一维数组共有30-(-2) + 1 = 33个元素,它们分别为: x (- 2), x (-1), x (0), x (1),…, x (30); xyz称为二维数组,第一个下标的下限与上限分别为1与20,第 二个下标的下限与上限分别为0与15,即这个二维数组共有(20-1 + 1) x (15-0 + 1)=20×16=320个整型元素,它们分别为:
xyz (1, 0), xyz (1, 1),…, xyz (1, 15)
xyz ( 20, 0), xyz ( 20, 1),…, xyz (20, 15 )
字符型数组必须用类型说明语句定义。例如:
character*8 out (10)
数组out每个元素的长度都是8,即每个元素都可以存放8个字符。
(2)用dimension语句定义数组。这时,数组的类型按隐含规则确定,或者可以用类型说明语句再次说明其类型。例如:
dimension [ im (-1:10), ia (0:100 , - 2:0), x (1:5 )]
real ia
integer x
其中,im为一维整型数组, ia为2维实型数组,x为一维整型数组。
当数组的下标下限为1时,可以省略说明下标下限。例如,下列数组说明
dimension a (100), b (5,5)
等价于
dimension a (1:100), b (1:5, 1:5)
目前在许多微机上使用的fortran 77子集中,数组的下标下限只允许为1,并且也只允许用省略下限的数组说明。
数组说明语句必须放在所有可执行语句与data 语句之前。
2.数组在内存中的存储形式
在fortran中,数组的各元素是按顺序存储在计算机内存单元中的。(特别需要注意的是, 2维和2维以上的多维数组中,各元素是以列为主存储的。)
例如,有一个二维数组1(1:2,1:3),该数组可以写成数表的形式
i   (1,   1 i   (1,   2 i   (1,   3
i   (2,   1 i   (2,   2 i   (2,   3
各元素的值为i (1, 1)=1, 1(1,2) =2, 1(1,3)=-1, i ( 2 , 1) = 20 , i ( 2 , 2) = 40 , i ( 2, 3)=50,在内存中存放的顺序是1(1, 1), 1(2, 1), 1(1,2), i (2, 2), i (1, 3) i (2, 3),如果按内存存放顺序将这个数组的元素打印出来,数据的顺序将是:
1,20,2,40,-1,50
其他多维数组中的元素也是按同样规则存储的,即先存储第1列,再存储第2列,以 此类推,最后存储数组中的最后一列。
 
(五)各种运算符及其运算的优先级
1.算术运算符。fortran有五个算术运算符,它们是:
加法运算符+
减法运算符-
乘法运算符*
除法运算符/
乘幕运算符**
这五个算术运算符的运算顺序是:
(1)乘幕运算符**优先级最高;
(2)乘法与除法运算符*,/优先级次之;
(3)加法与减法运算符十,一优先级最低。
对于同一优先级的两个运算符,按"先左后右"的原则进行计算。
2.关系运算符。fortran有六个关系运算符,用于比较两个表达式相等或不等。它们是:
大于.gt.
大于或等于.ge.
小于.lt.
小于或等于.le.
等于.eq.
不等于.ne.
经过关系运算符比较后,得到一个逻辑型的值。例如,整型变量i的值为10, j的值为 12,则i.lt.j的结果为"真" (. true.),而i.eq.j的结果为"假" (. false.)。
3.逻辑运算符。fortran有五个逻辑运算符,它们是:
逻辑与.and.两个逻辑型量都为"真"时,其值为"真",否则为"假",
逻辑或.or.两个逻辑型量都为"假"时,其值为"假",否则为"真";
逻辑非.not.一个逻辑型量为"真"时,其值为"假",否则为"真",
逻辑等.eqv.两个逻辑型量等值时,其值为"真",否则为"假",
逻辑不等.neqv.两个逻辑型量不等值时,其值为"真",否则为"假"。
逻辑运算符中,除了逻辑非运算符. not.只有一个运算对象外,其余四个逻辑运算 符均有两个运算对象。
逻辑运算符的优先级如下:
(1) . not.
(2) . and.
(3) .or.
(4) .eqv.与.neqv.这两个运算符按"先左后右"的原则进行计算。
三、赋值语旬
赋值语句的一般格式为:
变量名=表达式
其中,连接变量名和表达式的符号" ="称为赋值号。在fortran 77中,有三种赋值 语句:算术赋值语句,逻辑赋值语句和字符赋值语句。
(一)算术赋值语句
1.算术赋值语句中赋值号右边是算术表达式。算术表达式可以是单个变量或数组元 素,可以是用算术运算符号连接起来的数值计算过程。
(1)算术表达式中的各个数据量(常量或变量)的类型一般应该一致。如果不一致, fortran程序在运行中先将其进行转换,再进行计算。例如实型变量和整型变量进行 计算时,整型变量的数值先被转换为实型。
(2)算术表达式计算中,特别应注意两个整型量之间的除法(称为整除)。例如,算术表达式10.0-2/4*10.0的计算过程是
10.0 – 0*10.0= 10.0 -0.0= 10.0
如果表达式写为10.0-2/4.0*10.0,则计算过程是
10.0-2.0/4.0*10.0=10.0-0.5*10.0=5.0
因为2/4是整除,其结果为0,而进行2/4.0的计算时,整型量2先被转化为实型。
2.算术赋值左边只能是数值型变量名或数值型数组元素。如果赋值号左边的变量与 右边的表达式类型不一样时,系统将自动把右边表达式计算的结果转换为与左边变量的类 型一致后再赋给该变量。
 
(二)逻辑赋值语句
在逻辑赋值语句中,赋值号左边为逻辑变量或逻辑型数组元素,右边为一个逻辑表 达式。
 
(三)字符赋值语句
1.字符赋值语句赋值号的左边为字符变量或字符型数组元素。
2.赋值号的右边为字符表达式,可以是单个字符串或用字符运算符连接起来的字符串。字符运算符只有一个,表示为矿,含义为连接该符号两边的字符串.
3.执行字符赋值语句时,应注意字符串的长度与赋值号右边变量或数组元素的长度的关系。例如:
character*4 a, b*6, c
a= 'file
b=a//’'name'
c=b (5:6)
定义字符型变量时,根据类型说明语句的规定,a长度为4,而变量b因有专门说明,其长度为6。程序运行后,变量a的长度与赋值号右边字符串长一致,a的值为 ‘file' ;而b的长度小于‘file'和‘name'两个字符串长度之和,因此多余的字 符被截去,b的值为‘filena'; c的结果为‘na__' ,其中最后两格为空格符,这是 因为c的长度为4,大于字符串‘na'的长度,于是在其右边补上2个空格符后形成4 个字符长再赋值给c.在上面的程序例中,出现表达式b (5:6),称为"子串",表示取出字符串的一部分,本例中,表示将b的字符串‘filena'中的第5个字符至第6 个字符取出。
 
四、循环语句
(一)do语句
do语句的一般形式为:
do n v = el, e2, e3
n循环体
其中,n为语句标号;v为循环控制变量,它只能是简单变量(整型或实型) ,不能是表 达式; el, e2, e3分别为循环控制变量的初值、终值与增量(步长) ,它们都可以是表达 式,当e3为1时可以省略不写。循环体是若干语句的集合,其中最后一个语句称为循环 终端语句;若循环体只有一个语句,则该语句也就是终端语句。终端语句必须有标号n。
在do循环执行时,首先计算表达式el, e2, e3的值,并将它们化为与循环控制变量v的类型一致;然后将初值赋给循环控制变量v,并计算需要循环的次数;最后根据 循环次数重复执行循环体中的语句,并每次执行完循环体后,将循环控制变量增值一次, 循环次数减少一次。当循环次数为零时,则结束循环,转向程序规定的下一个语句。
 
(二)继续语句continue
continue是一个可执行语句,其功能是使程序的流程继续到逻辑上的下一个语句。
fortran 77规定,循环终端语句必须是一个可执行语句,但不能是goto语句、 块if语句、else语句、else if 语句、endif语句、00语句、stop语句、end语句。由于这些限制,通常用continue 语句作为循环的终端语句。当然, continue 语句也可用在其他场合。
 
(三)循环嵌套
使用循环嵌套可以实现多重循环。这时应注意各重循环的层次和循环变量的关系。例如,编写一个计算乘法表的程序段,可以写为:
do 10 1=1, 9
do 8 j=l, 9
ij = i*j
8 continue
10 continue
本例中,外层循环控制变量i初值为1,终值为9,内层循环控制变量j初值为外层循环 控制变量i的当前值,终值为9。外层的第1次循环,内层经过9-1+1=9次循环,依次 计算1×1=1,1×2=2,…,1×9=9,外层的第2次循环,内层经过9-2+1=8次循 环,依次计算2×2=4, 2×3=6,…, 2×9 = 18……
 
(四)使用循环语句应注意的若干问题
1.正确选定循环变量的初值。比如,对累加问题和连乘问题,变量初值不正确,使 影响最终结果。
例如计算m=1!十2! +……十10! ,采用循环语句编写程序,涉及到累加和连乘。 其程序可编写如下:
m=0
n=1
do 20 i= 1, 10
n=n×i
m=m十n
20 continue
print*,m
end
例中, n用于存放连乘结果,其初值设定为1,而m用于存放累加结果,其初值设定为0。
2. do语句可以和转换语句,条件语句等结合起来使用,此时应注意从循环体内可以 转向循环体外,但不允许从循环体外转向循环体内;从内层循环中可以转向外层循环,但不允许从外层循环转向内层循环中。
3.当内外层循环体的终端语句相同,且两个终端语句之间没有其他语句时,可以合 并使用一个终端语句。例如,前面计算乘法表的程序段可以写为:
do 10 i=1. 9
do 10j=i,9
ij = i*j
10 continue
或写为
do 10 i=1,9
00 10 j=i, 9
10 ij=i*j
 
五、输入输出语旬
(一)表控输入输出
表控输入输出语句是一种隐含格式的输入输出语句,其格式由程序编译系统提供,在 程序语句中不予表示。
1.表控输出语句
fortran 77表控输出语句有两种方式:
print*,输出量表
write (*,*)输出量表
这两种表控输出语句的作用是相同的,但一般微机上的fortran 77子集不提供print 语句,所以通常使用write 语句。
2.表控输入
fortran 77表控输入语句有两种型式:
read*,输入量表
read (*,*)输入量表
表控输入又称为自由格式输入。表控输入语句要求用户在隐含的输入设备(通常是键盘)上输入所需的数据,在输入数据时,各数据之间用逗号或空格分隔。
 
(二)格式输入输出
1.格式输出数据语句write语句和format语句
write语句的一般形式为:
write (u, f)输出量表
其中, u为部件说明符,用以指出在哪个设备上进行输出,通常也称为通道号,当u为记号*时,表示在显示器(标准输出设备)上进行输出。f为格式说明,它通常是一个格式语句的标号,用以指出输出数据所采用的格式。
格式语句的一般形式为:
标号format (格式说明)
例如:
write (*, 10) a, b, a*b
10 format (lx, f6.2, f7.3, f10.4)
format语句中,第一个"1x"称为纵向控制符,它表示前进一空格后再输出后面的数据,后面的三个项分别说明了三个实型数据输出的,称为格式编辑符。
fortran 77也允许在write语句中直接指定输出格式,从而可以省略格式语句 format。例如,上面的输出语句与格式语句可以合并成一个,即:
write (*, i (1x , f6. 2, f7. 3, f10.4) ') a, b, a*b
2.格式编辑符 fortran常用的格式符有十几种,详细可参照任何一本fortran教材或专用于册。
 
(三)隐循环的输入输出
数组元素的输入输出可以采用循环方式实现。 例如:
dimension x (20)
do 10 1= 1, 20
10 read*, x (i)
程序段执行时进行20次循环,每次输入1个数据。这个输入程序段可以改写如下: dimension x (20)
read*, (x (i), i = 1, 20)
其中第2句就是隐循环的输入语句。循环控制变量i的初值为1,终值为20,步长为1而 予以省略。隐循环语句的作用与do语句是相同的;但使用隐循环语句时, 20个数据允 许一次性输入,当然,数据与数据之间要用空格符或逗号区别开来。
隐循环语句也用于输出语句,也可使用多重循环。例如
dimension y (l0, 6)
read (*,*) ((y (i, j), j=1, 6), i=1, 10)
write (*, 5) ((y (i, j), j=1, 6), i=1, 10)
5   format (lx, 6f10.2)
运行程序段时,首先读入60个数据, y (1, 1), y (1,2),……, y (1, 6), y (2, 1), y (2, 2),……, y (2, 6),……, y (10, 1), y (10, 2),……, y (10, 6), 然后输出60个数据,每行输出6个数据,数据的排列顺序与输入时相同。
 
例:
1.fortran 语句: i=25 + 3.0**2 / 2 执行后,整型变量 i 的值是()。
a . 29 . 5
b . 30
c . 29
d . 28
【 解 】 由条件, i 为整型变量知 a 项不对,应排除。 i=25 + 3 . 0**2 / 2=29 ,所以应选 c 项。
 
2.fortran 语句: b=10 . 0 -2/ 4 * 10 . 0 执行后,变量 b 的值是()。
a . 10 . 0
b . 5 . 0
c . 10
d . 5
【 解 】 由条件, b=10 . 0 -0×10 . 0=10 . 0 ,所以应选 a 。
 
3.不等式 2 . 0≤y≤10.0对应的 y表达式是(a)
a . 2 . 0 . le . y . and . y . le .10.0
b . 2 . 0 . ge.y. le .10.0
c. 2 . 0 . le.y. le .10.0;
d y . ge.2.0 . or.le.10.0
 
4.下列各符号中, 可作为 rortran77 合法变量名的是(c)
a . 112fa
b . f- 312;
c. abd
d π
 
5.若有语句: integerb (-1:2 , 3:7 ) ,则数组 b 中所包含的元素个数为(c)。
a . 10
b . 15
c . 20
d . 24
 
六、控制语句
一般情况下, fortran程序是按语句顺序执行的,但需要时,可以改变这种顺序。 这种改变可以通过各种控制转移语句、逻辑条件语句等来实现。
(一)转移语句
1.无条件转移语句
无条件转移语句的一般形式为:
goto n
当程序流程到达goto语句时,随后就转向语句标号为n的语句。标号为n的语句必须是可执行语句,但它在程序中的排列位置,可以在引导到它的goto语句之后,也可以 在该goto 语句之前。无条件转移语句常和其他控制语句结合起来使用。
2.算术条件转移语句
算术条件转移语句的一般形式为:
if (e) nl, n2, n3
其中, e必须是算术表达式,当表达式运算结果e<0时,程序转向标号为n1的语句;当 e=0时,转向标号为n2的语句;当e>0时,转向标号为n3的语句。
例如,计算边长为b的正方形中挖去半径为r的圆后的面积,若b<2r,则给出相 关信息。该问题的fortran程序可用别辽条件转移语句编写如下。
c computation of area.
read*b.r
if (b-2*r) 5, 15, 15
5 write (*, 10)
10 format ('error message: b less than 2*r)
goto 20
15 area=b*b-3.14159*r*r
write *area
20 continue
end
本例中,在算术条件转移语句的第1个分支后,使用了goto语句;倘没有此语句,则 程序按顺序仍会执行标号为15的语句,从而得出不正确的结果。
3.计算转移语句
计算转移语句的一般形式为:
goto (n1, n2,……, nm), e
其中, ni (i = 1, 2,……, m)是被转向的语句标号,共m个; e是一个整型算术表达 式,其值不得小于1且不得大于m。当e的值等于1时,程序转向标号nl的语句,当e 的值等于2时转向标号n2的话句,当e的值为m时转向标号为nm的语句。整型算术表 达式e前的逗号可以省略。计算转移语句通常也和goto语句结合起来使用。 例如,有如下一个程序:
read*,m
goto (20, 30, 40, 50) m
20 n=m goto 60
30 n=m*2 goto 60
40 n=m*3 goto 60
50 n=m*4
60 write*,n
end
程序运行时,若输入1,则转向标号为20的语句,x的值为1 ;若输入2,则转向标号为 30的语句,x的值为4;输入3,转向标号为40的语句,x的值为9,输入4,转向标号 为50的语句,x的值为16
 
(二)逻辑条件语句
1.逻辑if语句
逻辑if 语句用来实现选择结构。它的一般形式为:
if (逻辑表达式)内嵌语句
其中内嵌语句是单独的一个可执行语句。逻辑if语句执行时,首先计算逻辑表达式的值, 如果逻辑表达式的值为"真",则执行内嵌语句,若内嵌语句非转移语句,则执行该语句 后继续按顺序往下执行,若内嵌语句是转移语句,则转向指定的语句;如果逻辑表达式的值为"假",则不执行内嵌语句,而直接执行该语句后面的语句。
例如,从键盘读入一个代表百分制成绩的数据,如果数据在90-100之间就输出 ‘excellent' ,在80-89之间输出‘good' ,在60-79之间输出‘pass' ,在60以下则输出 ‘not pass' 。其程序可以如下编写:
read (*.*) ipoint
if (ipoint. gt .100. or. ipoint. lt. 0) write (*,*) 'data error'
if (ipoint.ge.90.and. ipoint. le.100) write (*.*) 'excellent'
if (ipoint.ge.80.and.ipoint.le89) write ( * . *'good'
if (ipoint.ge.60.and. ipoint. le. 79) write (*.*) 'pass'
if (ipoint.ge.0.and. ipoint. le.59) write (*.*) 'not pass'
end
2.块if结构的各种形式
(1)块if和endif形式
if (逻辑表达式) then
语句块
endif
当逻辑表达式的值为"真"时,执行语句块,否则按顺序执行endif后的语句。例如, 如下程序段:
read*, rn, an
if (rn.ge.0.0.and.an.gt.0.0) then
stress=rn/an
write*rn,an,stress
endif
end
当rn大于等于零且an大于零时,执行赋值语句和输出语句。
(2)使用else的形式
if (逻辑表达式) then
语句块1
else
语句块2
endif
当逻辑表达式的值为"真"时,执行语句块1 ,当逻辑表达式的值为"假"时,执行语句块2。由此可见,使用else的形式,可以进行两个分支的选择。
(3)使用else if的形式
if (逻辑表达式1) then
语句块1
else if (逻辑表达式2) then
语句块2
else
语句块3
endif
这种形式,允许在三个分支中作出选择。当逻辑表达式1的值为"真"时,执行语句 块1表示的分支;当逻辑表达式1的值为"假"而逻辑表达式2的值为"真"时,执行语 句块2表示的分支;当逻辑表达式1的值和逻辑表达式2的值均为"假"时,执行语句块 3表示的分支。
3.块if结构的嵌套
在一个块if结构的语句块中,可以完整地包含另一个或多个块if结构,称为块if 的嵌套。块的嵌套可以多层。
 
七、函数与子程序(过程)
(一)内部函数
内部函数是预先编制的一些常用函数或算法的过程,由fortran语言提供,可以, 直接调用。内部函数调用时的一般形式是:
内部函数名(实元表)
实元表中元素的数据类型、个数是预先规定的。
常用内部函数及其功能可查阅fortran教材或用户手册。
 
(二)语句函数
1.语句函数的定义
定义语句函数的语句称为语句函数语句。其一般形式为:
函数名(形参表) =表达式。
其中,函数名的命名规则与一般变量名相同,所以它也可以用类型说明语句等来说明。形参又称哑元,是一些变量名,一般应出现在表达式中。
语句函数在程序单位中的位置,应在所有可执行语句之前。
2.语句函数的调用
调用语句函数的结果是得到一个函数值,因此,调用语句函数时代之以实际变量(又称实元)。
 
(三)函数子程序
一个函数子程序是一个独立的fortran程序单位。它的第一个语句必须是function语句,最后一个语句必须是end 语句。即函数子程序的一般结构为:
[类型说明] function函数名(形参表)
语句块
[return]
end
也可以写为:
function函数名(形参表)
[类型说明函数名]
语句块
[return]
end
其中函数名的命名规则与变量相间,而函数名的类型决定了函数值的类型。在函数子程序中,形参可以是变量名、数组名、外部过程名,而形参的命名与类型说明也与变量相同,形参数组也必须在函数子程序中予以定义。
函数子程序的函数值由函数名带回到调用该函数子程序的程序,因此,在函数子程序 中必须对函数名赋值。在函数子程序中,函数名应该像普通变量那样来使用。在函数子程序中,所有的名字、语句标号都可以和其他程序单位中的相同而彼此没有 任何关系。
在函数子程序中, end语句的功能有两个:一是表示该程序单位的结束,二是具有返回语句return的功能。函数子程序中必须有并且只有一个end语句,而且只 能是子程序的最后一个语句。当在子程序的其他位置须要返回时,可以使用return 语句。
 
(四)子程序
1.子程序的结构
一个子程序是一个独立的fortran程序单位。
子程序的第一个语句必须是subroutine语句,最后一个语句必须是end 语句。 即子程序的一般结构为:
subroutine子程序名(形参表)
语句块
[return]
end
子程序名的命名规则与普通变量相同。但是子程序中的子程序名不能用于返回数值,这与函数子程序是不同的。因此,子程序名没有类型,它不能在本程序单位中使用。 subroutine 语句中的形参表可以省略。这时子程序名后的括弧不要保留。对子程序的其他有关规定与函数子程序相同。
2.子程序的调用
子程序调用通过call 语句实现。其形式为:
call子程序名(实参)
其他有关对子程序的调用规定与函数子程序相同。
 
八、程序单位间的数据传递
(一)虚实结合
虚实结合又称哑实结合,是各程序单位(主程序和各种过程如函数子程序)之间传递数据的一种重要途径。
1.变量的虚实结合
当子程序等过程的形参为变量时,则在调用时所对应的实参可以是类型相同的常数、变量、数组元素或表达式;子程序调用后,其运行的结果通过这些实参返回到调用者。在fortran77中,当形参变量所对应的实参是变量或数组元素时,则它们之间的结合方 式是地址结合;而当形参变量所对应的实参是常数或表达式时,其结合方法对于不同的 fortran系统有可能是不同的。
2.数组的虚实结合
当子程序中的形参为数组名时,则在调用时所对应的实参必须是数组名或数组元素。
如果实参是数组名,则实参数组与形参数组按地址结合,实参数组与形参数组都从第 一个元素开始按列逐个对应。例如,有主程序与子程序如下:
program main
integer a (0:5)
call sb (a)
end
subroutine sb (b)
 integer b (-1:2)
end
则在主程序中使用call语句调用子程序sb时,实参数组与形参数组的结合情况如下:
实参数组 形参数组
a (0)——b (-1)
a (1)一一b (0)
a (2)——b (1)
a (3)一一b (2)
a (4)
a (5)
也即调用sb时,a数组的头4个元素与b数组的元素对应,这些对应元素实际上为同一 存储地址。
如果实参是数组元素,则从该元素开始依次与形参数组的第一个元素起按列逐个对应,它们也是按地址结合。例如,有主程序与子程序如下:
program main
dimention a (8)
call sb (a(5))
end
subroutine sb (b)
dimension b (3)
end
则在调用语句执行时,实参数组a与形参数组b的结合情况如下: 实参数组形参数组
a (1)
a (2)
a (3)
a (4)
a (5)——b (1)
a (6)一一b (2)
a (7)——b (3)
a (8)
fortran 77规定,不管实参是数组名还是数组元素,用作实参的数组,其维数、各维下标的上下限及数组中元素个数可以和与之结合的形参数组不同,但要求从与形参数组的第一个元素结合的实参数组元素算起,以后的实参数组元素的个数不能少于形参数组元素的个数。
多维数组或数组元素虚实结合时,要特别注意fortran中数组按列存放的规定, 不要搞错存储地址的对应关系。例如:
program main
dimension a (3, 2)
call sb (a)
。。。
end
subroutine sb (b)
dimension b (2, 3)
。。。
end
这种情况下,数组元索地址的对应关系是:
实参数组 形参数组
a (1, 1)一一b (1, 1)
a (2, 1)一一b (2, 1)
a (3, 1) 一一b (1, 2)
a (1, 2) 一一b (2, 2)
a (2, 2) 一一b (1, 3)
a (3, 2) 一一b (2, 3)
3.可调数组
在主程序中定义数组元素时,定义说明符中各维下标的上下限必须为整常数,不能是 变量或算术表达式。但在子程序中定义数组时,允许用变量来定义各维下标的上下限。子程序中用变量来定义各维下标上下限的数组称为可调数组。但使用可调数组必须遵循以下 几个原则。
(1)可调数组名必须是形参数组名。
(2)说明可调数组各维下标上下限的表达式中只能出现整型变量,且这种变量必须是形参或出现在common 语句中。但在某些fortran 77子集中,定义可调数组各维下 标上下限时只能是整型变量,而不能是任何算术表达式。
(3)可调数组的大小不得超过对应实参数组的大小。
4.字符型变量的虚实结合
(1)当子程序中的形参为字符型变量时,对应的实参必须是字符型变量、字符常数、字符型数组元素或字符表达式。字符型实参必须用character 语句加以说明。
(2)如果字符型形参的长度小于对应的实参长度,则从实参中最左边的字符开始与形参结合,而实参中右边多余的字符被截去。例如:
character a*5
a=abcde'
call sb (a)
end
subroutine sb (x)
character x*3
write (* , *) x
end
程序执行后的输出结果为: abc。
(3)在fortran 77中,对字符型形参的长度还可以用"*"号来说明,此时,形 参字符变量自动与对应的实参取相同的长度。例如在上面的子程序sb中,如果将character x*3改变为character x* (*) ,则执行后,输出的结果为: abcde。
(4)当子程序中形参为字符型数组时,如果形参字符型数组元素的长度与对应实参字符型数组元素长度一致,则其虚实结合的情况与一般的数组虚实结合的情况相同。如果形参与实参的字符型数组元素长度不同,则按字符依次对应。例如,有主程序与子程序 如下:
character a (5) *3
data a(' abc', 'def', 'ghi', 'jkl', 'mno' )
call sb (a)
end
subroutine sb (d)
character d (4) *2
end
则形参数组d中元素的值为:
d (1):' ab'
d (2): 'cd'
d (3): 'ef'
d (4): 'gh'
(5)过程名的虚实结合 fortran允许子程序中的形参为过程名,此时,调用程序中的实参必须是过程名.如果实参是外部过程名(如函数子程序名、子程序名) ,则该外部过程名在调用程序 中必须用external 语句说明。
如果实参是内部过程名(如内部函数名) ,则该内部过程名在调用中必须用intrinsic语句说明。
 
(二)公用区语句
1.公用区语句的一般形式
common [公用区名l/]变量表1, [公用区名2/变量表2]…
没有公用区名的就称为无名公用区,其他都是有名公用区;一个完整的程序只能设置一个无名公用区,但可以有多个有名公用区;变量表中,可以是变量名、数组名、数组说明符,互相之间用逗号隔开。例如:
common a, b (3), c (2)
定义了b是3个元素的一维数组, c是2个元素的一维数组。这条语句与下面两句语句是 等价的:
dimension b (3), c (2)
common a, b, c
2.利用公用区进行数据传递时,在元名公用区或同名的有名公用区中,位置排列相 同的变量、数组,实际上使用同一存储地址,亦即共享同一数据。例如:
program main
common a, i (2) /coml/d, c
。。。
call sb
end
subroutine sb
common aa, ]k (2) /coml/f, g
end
其中,主程序中的变量a的数据与子程序的变量aa共享,数组1的数据与jk共享,而d, c的数据分别与f, g共享。由此可以知道,各个程序单位中common语句中的变量类型 必须按位置一一对应一致才能正确传递数据。
 
九、文件
fortran程序输入输出的基本单位称为记录。记录是数值或字符的序列。记录的集合称作文件。
(一)文件的存取方式
1.顺序文件
顺序文件中的记录是一个接一个按顺序存放的,即总从第1个记录开始,然后是第2 个记录,第3个记录,…,要取任何一个记录,都必须从第1个记录开始。
2.直接文件
直接文件又称直接存取文件,或随机文件。它可以按任意顺序读写某一记录。直接文件中每个记录的长度都是相等的。
 
(二)文件操作语句
文件操作语句有打开文件的open语句和关闭文件的close 语句。此外还有文件的 读写语句read语句和write语句。
 
(三)文件定位
设想在文件的读写操作时存在一根指针。起先指针停在文件的开始处,随着文件存取 的进行,指针在文件中移动。控制指针的位置,即定位,在fortran中可以通过如下语句来实现。
i.rewind语句
rewind语句也称回绕语句。它的形式是:
rewind设备号
它使与指定设备号相连的文件中的指针定位在文件的开头。
在fortran中,用open语句打开一个文件,指针也是在文件的开头位置。因此对一个已经打开的文件,要使指针移到开头,也可组合使用close和open 语句。
2.backspace语句
语句backspace的形式是:
backspace设备号
它使与指定设备号相连的文件中的指针退回一个记录。
 
例题:
 
1.阅读下列 fortran 程序:
integer sum
sum=0
do 10 i= 1 , 10 , 4
do 10 j = 5 , 100 , 20
do 10 k =-10 ,-5 ,2
10 sum = sum + 1
上面程序的运行结果为(c)。
a . 15
b .30;
c .45;
d .60
k取值3次,j取值5次,i取值3次,共取值45次
 
2.若有integer a (-2:2, 0: 3, 1: 2) ,按照在内存中的存储次序,数组a中第8号元素为(b)
(a) a (-1,0,2) 
(b) a (0,1,1)
(c) a (2, 1,2)
(d) a (1, 1,1)
a中数据按列排序,a(5,4,2)第八个元素是a(3,2,1),对应本题应为a (0,1,1)
 
3.对下列程序段
read (*,*) x
if ( (x. lt. - 5.0) .or. (x.eq. -1.0)) then
y=0.0
elseif (x.lt.0.0) then
y=1.0/(x+1.0)
elseif (x. lt.5.0) then
y=1.0/(x+2.0)
else
y=0.0
endif
write (*,*) y
若输入4.0,则结果为:(c)   
(a) 0.0    
(b) 1/5  
(c) 1/6   
(d) 1/4十2.0
输入的是4,小于5,所以输出结果为1/(2+4)=1/6
 
4.阅读下列 fortran 程序:
dimension a ( 2 , 2 )
integer a , y
y =0
do 20 i=1,2
do 20 j = 1 , 2
a ( i , j ) = i * i + j*j
y = ( y + a ( i , j ) ) / 2
20 continue
write ( * ,*) y
end
此程序运行的结果为(a)。
a . 6
b . 9
c . 10
d 20
y1=2/2=1,y2=(1+5)/2=3,y3=(3+5)/2=4,y4=(4+8)/2=6
 
5.阅读下列 fortran 程序:
k = 0
do 10 i= 1 , 6 , 2
do 10 j= 1 , 6 , 3
if ( k . lt . i * j )
k = i*j
10 continue write (*,* ) k
end
此程序执行后的输出结果为(c)。
a . 18
b . 30
c . 20
d . 36
i,j乘积的最大值为4×5=20
 
6.以下程序段
dimension a (4)
read*,a
i=1
10 j = i + 1
20 if (a (i) . lt. a (j)) then
t=a (j)
a (j)=a (i)
a (i)=t
endif
j=j+l
if (j.le. 4) goto 20
i=i+1
if (1. le.3) goto 10
print*, a (4)
end
若输入4, 2, 3, 5,则程序运行结果为(b)  
(a) 4 
(b) 2 
(c) 3    
(d) 5
   相当于把数列从大到小排列,最后5,4,3,2,故选b
 
7.对下列程序段
parameter (n=3)
integer a (n, n)
read*,a
do 10 j=1, n
ls=0
do 20 1= 1, n
20    ls= ls+ a (i, j)
ls=ls/n
do 30 i=1, n
30   a (i, j) = a(i, j)-ls
10 continue
print*,a
end
若输入2, 4, 6, 8, 10, 12, 14, 16, 18
则程序运行后a (3, 2)为(c)
(a) -2   
(b) 0     
(c) 2   
(d) 12
                              2 8 14
原数组注意是按列存储数据,a=4 10 16
                             6 12 18
每一列和除三,每个元素减去上述结果,a变为
    -2 -2 -2
a= 0   0    0
    2   2    2
a(3,2)为2