精品91麻豆免费免费国产在线_男女福利视频_国产一区二区三区小向美奈子_在教室里和同桌做校园h文

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