派生類數(shù)據(jù)類型與結(jié)構(gòu)體本章主要介紹派生類數(shù)據(jù)類課件_第1頁
派生類數(shù)據(jù)類型與結(jié)構(gòu)體本章主要介紹派生類數(shù)據(jù)類課件_第2頁
派生類數(shù)據(jù)類型與結(jié)構(gòu)體本章主要介紹派生類數(shù)據(jù)類課件_第3頁
派生類數(shù)據(jù)類型與結(jié)構(gòu)體本章主要介紹派生類數(shù)據(jù)類課件_第4頁
派生類數(shù)據(jù)類型與結(jié)構(gòu)體本章主要介紹派生類數(shù)據(jù)類課件_第5頁
已閱讀5頁,還剩123頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第九章派生類數(shù)據(jù)類型與結(jié)構(gòu)體本章主要介紹派生類數(shù)據(jù)類型和結(jié)構(gòu)體,這部分是FORTRAN90以上版本新增加的內(nèi)容,它使FORTRAN語言功能得到進(jìn)一步的加強(qiáng),使用更加方便。9.1派生類數(shù)據(jù)類型FORTRAN90以前的FORTRAN版本,沒有用戶自定義的數(shù)據(jù)類型。這樣給用戶帶來的不便,例如,我們要比較完整的表達(dá)多個(gè)學(xué)生的信息,假設(shè)學(xué)生包含的信息有:學(xué)生所在院系、學(xué)生班級、姓名、學(xué)號、年齡、性別、家庭住址、各科考試成績等等,同時(shí)要對這些數(shù)據(jù)進(jìn)行相應(yīng)的處理,如查找、插入、刪除、計(jì)算、排序等。以前FORTRAN所用的方法是:將學(xué)生的每一項(xiàng)放在一個(gè)數(shù)組中,如:所有學(xué)生的姓名可以放在一個(gè)字符數(shù)組中,學(xué)號可以存放在一個(gè)整型數(shù)組中,成績可以存放在一個(gè)實(shí)型數(shù)組中等等,這樣,要解決這個(gè)問題,需要對多個(gè)不同數(shù)組進(jìn)行處理,編寫程序必須注意各個(gè)學(xué)生所對應(yīng)的數(shù)據(jù)項(xiàng)在數(shù)組中不能錯(cuò)位,否則將會(huì)張冠李戴。第九章派生類數(shù)據(jù)類型與結(jié)構(gòu)體1FORTRAN90在這方面有較大的改進(jìn),主要是允許字定義派生類數(shù)據(jù)類型(簡稱派生類型),有了它,就能較容易地描述上述問題。派生數(shù)據(jù)類型定義的一般格式為:TYPE[,ACCESS[::]]派生類名字分量表ENDTYPE派生類名FORTRAN90在這方面有較大的改進(jìn),主要是允許字定義派生2說明1.TYPE為關(guān)鍵字,是每定義一個(gè)派生類型的起點(diǎn)。2.ACCESS是可供選擇的訪問方式說明,分PRIVATE(私有的)和PUBLIC(公共的)兩種,例如:REAL,PRIVATE::X1,X2該語句定義了兩個(gè)實(shí)型的私有派生類變量X1、X2。注意聲明為PRIVATE時(shí),外部模塊不能訪問它;聲明為PUBLIC屬性的實(shí)體,在其程序單位中用了USE語句就可以使用;默認(rèn)方式為公共訪問方式?!埃海骸睘樽饔糜蚍?/p>

說明1.TYPE為關(guān)鍵字,是每定義一個(gè)派生類型的起點(diǎn)。33.派生類名為一個(gè)標(biāo)識(shí)符,用戶可以用任意標(biāo)示符命名。4.分量表可以是各種類型的數(shù)據(jù),并且可以是多項(xiàng),每項(xiàng)前面必須加上類型說明。5.ENDTYPE派生類名為派生類定義結(jié)束的標(biāo)志。3.派生類名為一個(gè)標(biāo)識(shí)符,用戶可以用任意標(biāo)示符命名。4

下面看一個(gè)具體實(shí)例:TYPESTUDENTCHARACTER(15)NAMEINTEGERNUMLOGICALSEXCHARACTER(30)ADDRESSENDTYPE下面看一個(gè)具體實(shí)例:5其中STUDENT為派生類名。該派生類包含一個(gè)最多可存放15個(gè)字符的字符數(shù)組NAME、一個(gè)整型的變量NUM、一個(gè)邏輯類型變量SEX、一個(gè)最多可存放30個(gè)字符的字符數(shù)組ADDRESS,由于該派生類訪問方式已經(jīng)省略,因此,按照默認(rèn)訪問方式:公共訪問方式對其進(jìn)行訪問。

其中STUDENT為派生類名。該派生類包含一個(gè)最多可存放1569.2結(jié)構(gòu)體的定義與引用

有時(shí)我們需要將不同類型的數(shù)據(jù)結(jié)合成一個(gè)統(tǒng)一的整體,以便于引用。本節(jié)介紹派生類型中一種較簡單的數(shù)據(jù)類型:結(jié)構(gòu)體,它是由若干個(gè)相互之間有聯(lián)系的數(shù)據(jù)項(xiàng)構(gòu)成的。9.2結(jié)構(gòu)體的定義與引用有時(shí)我們需要將不同類型的數(shù)據(jù)結(jié)合7結(jié)構(gòu)體類型定義的一般形式為:TYPE(派生類型名)::結(jié)構(gòu)體名。例如第一節(jié),定義學(xué)生派生類后,就可以用它來定義結(jié)構(gòu)體變量TYPE(STUDENT)::S1,S2

該語句定義了兩個(gè)結(jié)構(gòu)體變量S1和S2,它們都包含STUDENT的所有成員:NAME、NUM、SEX、ADDRESS等5項(xiàng)。

9.2.1結(jié)構(gòu)體類型定義結(jié)構(gòu)體類型定義的一般形式為:9.2.1結(jié)構(gòu)體類型定義8結(jié)構(gòu)體既可以在程序中定義,也可以和其他內(nèi)部數(shù)據(jù)類型一樣放在另一個(gè)派生類型的定義中定義,即所謂嵌套定義。例如TYPESTUDENTRECORDCHARACTER(15)NAMEINTEGERNUMLOGICALSEXCHARACTER(30)ADDRESSENDTYPE結(jié)構(gòu)體既可以在程序中定義,也可以和其他內(nèi)部數(shù)據(jù)類型一樣放在另9TYPESTUDENTTOGETHERTYPE(STUDENTRECORD)::STUDENTREALMATHREAL ENGLISHREAL CHINESEENDTYPE其中,先定義STUDENTRECORD結(jié)構(gòu)體,再把TYPE(STUDENTRECORD)::STUDENT語句放在結(jié)構(gòu)體定義語句TYPESTUDENTTOGETHER之內(nèi),這樣構(gòu)成嵌套定義,即用一個(gè)結(jié)構(gòu)體作為另外一個(gè)結(jié)構(gòu)體的成員。

TYPESTUDENTTOGETHER10這時(shí),如果定義如下結(jié)構(gòu)體:TYPE(STUDENTTOGETHER)::S這樣,結(jié)構(gòu)體變量S包含:三個(gè)實(shí)型變量MATH、ENGLISH、CHINESE和一個(gè)結(jié)構(gòu)體變量STUDENT,而STUDENT又包含NAME、NUM、SEX、ADDRESS四個(gè)成員。

這時(shí),如果定義如下結(jié)構(gòu)體:11

9.2.2結(jié)構(gòu)體成員的引用

結(jié)構(gòu)體成員的引用有兩種方式:1.結(jié)構(gòu)體名%成員表2.結(jié)構(gòu)體名.成員表例如對上面定義個(gè)S1,S2兩個(gè)結(jié)構(gòu)體變量,成員的引用如下:S1.NAME、S1.NUM、S1.SEX、S1.ADDRESSS2%NAME、S2%NUM、S2%SEX、S2%ADDRESS。

9.2.2結(jié)構(gòu)體成員的引用

結(jié)構(gòu)體成員的引用有兩種方式:12注意:(1)兩種引用方式可以交叉使用,但為了清晰起見,在一個(gè)程序中最好使用一種。(2)在含嵌套定義的結(jié)構(gòu)體中,成員引用應(yīng)當(dāng)嵌套使用“%”或“.”,例如,對上面結(jié)構(gòu)體S中成員NUM的引用方式為S%STUDENT%NUM。注意:(1)兩種引用方式可以交叉使用,但為了清晰起見,在一個(gè)13

9.3結(jié)構(gòu)體的初始化

9.3.1利用賦值語句給結(jié)構(gòu)體成員賦值下面看一個(gè)完整的例子:例9.1某單位職工工資表包含的記錄有:姓名、性別、家庭住址、工資等項(xiàng),現(xiàn)計(jì)算三個(gè)職工工資的平均值。程序如下:

9.3結(jié)構(gòu)體的初始化

9.3.1利用賦值語句給結(jié)構(gòu)體成員14 TYPECLERK CHARACTER(15)NAME LOGICALSEX CHARACTER(30)ADDRESS INTEGERSAL ENDTYPE TYPE(CLERK)::S1,S2,S3 S1.SAL=800 S2%SAL=900 S3.SAL=700 AVER=(S1%SAL+S2.SAL+S3.SAL)/3 PRINT*,"三個(gè)職工的平均工資為:",AVER END TYPECLERK15其中結(jié)構(gòu)體成員賦值的三個(gè)語句為:S1.SAL=800、S2%SAL=900、S3.SAL=700,這與普通變量賦值本質(zhì)上是一樣的,也就是說可以把某結(jié)構(gòu)體變量成員的引用一起當(dāng)作一個(gè)變量來使用,因此也可以用輸入語句來賦值。

其中結(jié)構(gòu)體成員賦值的三個(gè)語句為:S1.SAL=800、16例9.2學(xué)生記錄包含如下數(shù)據(jù)項(xiàng):姓名、一門功課的成績、性別、家庭住址,要求打印學(xué)生各數(shù)據(jù)項(xiàng),并求出該門成績的平均值。程序如下: TYPESTUDENT CHARACTER(15)NAME INTEGERGRADE LOGICALSEX CHARACTER(30)ADDRESS ENDTYPE TYPE(STUDENT)::S1,S2,S3例9.2學(xué)生記錄包含如下數(shù)據(jù)項(xiàng):姓名、一門功課的成績、性別17

PRINT*,"請輸入三個(gè)學(xué)生的名字" READ*,S1.NAME,S2.NAME,S3.NAME PRINT*,"請輸入三個(gè)學(xué)生的成績" READ*,S1.GRADE,S2.GRADE,S3.GRADE PRINT*,"請輸入三個(gè)學(xué)生的性別" READ*,S1%SEX,S2%SEX,S3%SEX PRINT*,"請輸入三個(gè)學(xué)生的住址" READ*,S1.ADDRESS,S2.ADDRESS,S3.ADDRESS PRINT*,"三個(gè)學(xué)生的名字為",S1.NAME,S2.NAME,S3.NAME PRINT*,"請輸入三個(gè)學(xué)生的名字"18

PRINT*,"三個(gè)學(xué)生的性別為",S1%SEX,S2%SEX,S3%SEX PRINT*,"三個(gè)學(xué)生的住址為",S1.ADDRESS,S2.ADDRESS,$S3.ADDRESS AVER=(S1%GRADE+S2.GRADE+S3.GRADE)/3 PRINT*,"三個(gè)學(xué)生的平均成績?yōu)椋?,AVER END PRINT*,"三個(gè)學(xué)生的性別為",S1%SEX,S219請輸入三個(gè)學(xué)生的名字輸入:ZHANGLIWANG回車請輸入三個(gè)學(xué)生的成績輸入三個(gè)正整數(shù)如859080回車請輸入三個(gè)學(xué)生的性別輸入.F..T..F.回車請輸入三個(gè)學(xué)生的住址輸入:CHANGSHAGUANGZHOUBEIJING回車請輸入三個(gè)學(xué)生的名字20

最后輸出結(jié)果為三個(gè)學(xué)生的名字為 ZHANG LI WANG三個(gè)學(xué)生的性別為 F T F三個(gè)學(xué)生的住址為 CHANGSHA GUANGZHOU BEIJING三個(gè)學(xué)生的平均成績?yōu)? 85最后輸出結(jié)果為219.3.2定義的同時(shí)賦值

在定義結(jié)構(gòu)體變量的同時(shí),給定結(jié)構(gòu)體各成員的值。其格式為:TYPE(派生數(shù)據(jù)類名)::結(jié)構(gòu)體變量名=派生數(shù)據(jù)類名(成員初值表)其中,=后面的派生類名即為TYPE后面的派生類名;成員之間的值用“,”隔開。例如結(jié)構(gòu)體如下:

9.3.2定義的同時(shí)賦值在定義結(jié)構(gòu)體變量的同時(shí),給定結(jié)構(gòu)22 TYPETEACHER CHARACTER(12)NAME LOGICALSEX CHARACTER(15)POSITCHARACTER(30)ADDRESS INTEGERSALENDTYPE這樣我們可以用如下方式給對應(yīng)的結(jié)構(gòu)體變量賦值:TYPE(TEACHER)::S1=TEACHER("ZHANG",.TRUE.,"PROFESSOR",”CHANGSHANG”,2000),S2,S3這樣,結(jié)構(gòu)體變量S1的值全部被給定。

TYPETEACHER23這種賦值方式應(yīng)當(dāng)注意:

(1)賦值時(shí),所給的值類型和個(gè)數(shù)應(yīng)與結(jié)構(gòu)體變量定義中各成員的類型與個(gè)數(shù)保持一致。(2)可以將一個(gè)結(jié)構(gòu)體變量的值直接賦給另外一個(gè)結(jié)構(gòu)體變量,

這種賦值方式應(yīng)當(dāng)注意:(1)賦值時(shí),所給的值類型和個(gè)數(shù)應(yīng)與24INTEGERS TYPESTUDENTRECORD CHARACTER(15)NAME INTEGERNUM LOGICALSEX CHARACTER(30)ADDRESS ENDTYPE TYPE(STUDENTRECORD)::S1,S2 S1=STUDENTRECORD("ABCD",20,.TRUE.,"CHANGSHA") S2=S1 S=S2%NUM+S1%NUM PRINT*,S ENDINTEGERS25這里,通過S2=S1語句,使S1和S2兩個(gè)結(jié)構(gòu)體變量得到相同的值,輸出S的結(jié)果為40。當(dāng)結(jié)構(gòu)體中包含成員較多時(shí),可以用嵌套定義的方式,使結(jié)構(gòu)體變得簡潔,如例9.2中,當(dāng)學(xué)生的成績是多門時(shí),可以將它們單獨(dú)定義在一個(gè)結(jié)構(gòu)體中,然后將該結(jié)構(gòu)體包含到主結(jié)構(gòu)體中,下面再看一個(gè)例子:

這里,通過S2=S1語句,使S1和S2兩個(gè)結(jié)構(gòu)體變量得到相同26例9.3、學(xué)生信息包含如下數(shù)據(jù)項(xiàng):姓名、性別、學(xué)號、年齡和5門功課的成績:語文、數(shù)學(xué)、物理、化學(xué)、英語,要求輸入三個(gè)學(xué)生的記錄,打印出相關(guān)信息與總成績。分析:學(xué)生的成績有5門,可以將它們放在一個(gè)名為STUDENTSCORE的結(jié)構(gòu)體中,而將學(xué)生所有記錄存放在名為STUDENTRECORD的結(jié)構(gòu)體中,該結(jié)構(gòu)體包含結(jié)構(gòu)體STUDENTSCORE,然后作相應(yīng)處理,注意學(xué)生成績輸入語句。程序如下:

例9.3、學(xué)生信息包含如下數(shù)據(jù)項(xiàng):姓名、性別、學(xué)號、年齡和527PROGRAMXUESHENGJILU REALAVER1,AVER2,AVER3TYPESTUDENTSCORE REALCHINESE REALMATH REALPHYSICS REALCHEMISTRY REALENGLISH ENDTYPEPROGRAMXUESHENGJILU28TYPESTUDENTRECORD CHARACTER(17)NAME LOGICALSEX INTEGERNUMBER INTEGERBIRTHDAY TYPE(STUDENTSCORE)::SCORE ENDTYPE TYPE(STUDENTRECORD)::S1,S2,S3 PRINT*,"請輸入3個(gè)學(xué)生的姓名" READ*,S1.NAME,S2.NAME,S3.NAME PRINT*,"請輸入3個(gè)學(xué)生的性別" READ*,S1.SEX,S2.SEX,S3.SEX PRINT*,"請輸入3個(gè)學(xué)生的學(xué)號" READ*,S1.NUMBER,S2.NUMBER,S3.NUMBER PRINT*,"請輸入3個(gè)學(xué)生的年齡" READ*,S1.BIRTHDAY,S2.BIRTHDAY,S3.BIRTHDAYTYPESTUDENTRECORD29PRINT*,"請輸入3個(gè)學(xué)生的語文成績" READ*,S1%SCORE%CHINESE,S2%SCORE%CHINESE,S3%SCORE%CHINESE PRINT*,"請輸入3個(gè)學(xué)生的數(shù)學(xué)成績" READ*,S1%SCORE%MATH,S2%SCORE%MATH,S3%SCORE%MATH PRINT*,"請輸入3個(gè)學(xué)生的物理成績" READ*,S1%SCORE%PHYSICS,S2%SCORE%PHYSICS,S3%SCORE%PHYSICS PRINT*,"請輸入3個(gè)學(xué)生的化學(xué)成績" READ*,S1%SCORE%CHEMISTRY,S2%SCORE%CHEMISTRY,S3%SCORE%CHEMISTRY PRINT*,"請輸入3個(gè)學(xué)生的英語成績" READ*,S1%SCORE%ENGLISH,S2%SCORE%ENGLISH,S3%SCORE%ENGLISH AVER1=(S1%SCORE%CHINESE+S1%SCORE%MATH+S1%SCORE%PHYSICS+S1%SCORE%CHEMISTRY+S1%SCORE%ENGLISH)/5.0PRINT*,"請輸入3個(gè)學(xué)生的語文成績"30

AVER2=(S2%SCORE%CHINESE+S2%SCORE%MATH+S2%SCORE%PHYSICS+S2%SCORE%CHEMISTRY+S2%SCORE%ENGLISH)/5.0 AVER3=(S3%SCORE%CHINESE+S3%SCORE%MATH+S3%SCORE%PHYSICS+S3%SCORE%CHEMISTRY+S3%SCORE%ENGLISH)/5.0 PRINT*,S1.NAME,S1.SEX,S1.NUMBER,S1.BIRTHDAY PRINT*,S1%SCORE%CHINESE,S1%SCORE%MATH,S1%SCORE%PHYSICS,$S1%SCORE%CHEMISTRY,S1%SCORE%ENGLISH,AVER1 AVER2=(S2%SCORE%CHINESE+S231PRINT*,S2.NAME,S2.SEX,S2.NUMBER,S2.BIRTHDAY PRINT*,S2%SCORE%CHINESE,S2%SCORE%MATH,S2%SCORE%PHYSICS,$S2%SCORE%CHEMISTRY,S2%SCORE%ENGLISH,AVER2 PRINT*,S3.NAME,S3.SEX,S3.NUMBER,S3.BIRTHDAY PRINT*,S3%SCORE%CHINESE,S3%SCORE%MATH,S3%SCORE%PHYSICS,$S3%SCORE%CHEMISTRY,S3%SCORE%ENGLISH,AVER3 ENDPRINT*,S2.NAME,S2.SEX,S2.NUMBE329.5綜合實(shí)例

在這一節(jié)中,我們結(jié)合數(shù)據(jù)處理中的一些常見操作,如數(shù)據(jù)的排序、插入、查找、刪除、更新等,介紹結(jié)構(gòu)體的綜合應(yīng)用實(shí)例。為了簡便起見,我們同樣以學(xué)生信息為例,且假設(shè)學(xué)生信息僅僅包含姓名和一門功課的成績,另外加一個(gè)唯一的標(biāo)識(shí)(如學(xué)號),現(xiàn)在考慮如何完成上述的操作。首先定義學(xué)生結(jié)構(gòu)體如下:

9.5綜合實(shí)例在這一節(jié)中,我們結(jié)合數(shù)據(jù)處理中的一些常見33TYPESTUDENTRECORDCHARACTER(15) NAMEINTEGER MARKINTEGER GRADEENDTYPESTUDENTRECORD其中:NAME代表學(xué)生姓名,MARK代表標(biāo)示,GRADE代表成績

TYPESTUDENTRECORD34其次必須考慮的是如何存儲(chǔ)學(xué)生信息的問題。為此,定義如下結(jié)構(gòu)體數(shù)組:TYPE(STUDENTRECORD),DIMENSION(STNUM)::STRECORD其中,STNUM為符號常量,代表學(xué)生人數(shù),可以在使用之前通過INTEGER,PARAMETER::STNUM=20來定義,該語句的含義為定義一個(gè)整型的符號常量STNUM,其值為20,可以根據(jù)學(xué)生人數(shù)修改其值,下面一步一步地介紹完成上述的操作。

其次必須考慮的是如何存儲(chǔ)學(xué)生信息的問題。359.5.1排序

排序(SORTING)是數(shù)據(jù)處理領(lǐng)域中最常用的一種運(yùn)算,分為升序和降序排序兩種,排序方法較多,常見的有簡單交換排序、選擇排序、冒泡排序、堆排序、快速排序、歸并排序等,不同的排序方法,有不同的優(yōu)點(diǎn)和缺點(diǎn),但其中某些排序牽涉到數(shù)據(jù)結(jié)構(gòu)方面的知識(shí),如堆排序,已超出本書范圍,讀者如果有興趣,可以參看有關(guān)數(shù)據(jù)結(jié)構(gòu)方面的知識(shí),這里僅僅使用簡單交換法排序。排序的主要目的之一是為了查找方便,因此一般牽涉到排序字或稱關(guān)鍵詞(KEY)問題,這里用每個(gè)學(xué)生的標(biāo)識(shí)MARK作為關(guān)鍵字進(jìn)行排序字,如果要對學(xué)生的成績排序,只須將MARK改為GRADE即可。

9.5.1排序排序(SORTING)是數(shù)據(jù)處理領(lǐng)域中最常36簡單交換法思想介紹如下:先將除第一個(gè)數(shù)據(jù)項(xiàng)以外的所有數(shù)據(jù)與第一個(gè)數(shù)據(jù)項(xiàng)比較,前者小,則將與它有關(guān)的記錄與后者有關(guān)的記錄交換,顯然,第一輪排序進(jìn)行完畢,排序項(xiàng)最小者將被交換到最前面。然后從第二個(gè)排序項(xiàng)開始重復(fù)前述操作,依次類推,直到排序完成止。我們定義SORT函數(shù)來完成排序操作,程序如下:簡單交換法思想介紹如下:37

SUBROUTINESORT(STRECORD,N) TYPESTUDENTRECORDCHARACTER(15) NAME INTEGER MARK INTEGER GRADE ENDTYPESTUDENTRECORD INTEGER,PARAMETER::STNUM=5 TYPE(STUDENTRECORD),DIMENSION(STNUM)::STRECORD TYPE(STUDENTRECORD)::TEMP INTEGERI,J,NSUBROUTINESORT(STRECORD,N)38 DO I=1,N DO J=I+1,N IF(STRECORD(I)%MARK>STRECORD(J)%MARK)THEN TEMP=STRECORD(I) STRECORD(I)=STRECORD(J) STRECORD(J)=TEMP ENDIFENDDOENDDOEND

DO I=1,N399.5.2查找

查找(SEARCH)同人們?nèi)粘I钣兄芮械穆?lián)系。如從字典中查找單詞,從工資表中查找工資,從電話號碼薄中查找電話,從圖書館中查找書,從地圖上查找路線和地址等。同排序一樣,查找的方法非常多,如順序查找、二分查找、索引查找、分塊查找、B_樹查找等,這里介紹無序情況下的順序查找和有序情況下的二分查找兩種。

9.5.2查找查找(SEARCH)同人們?nèi)粘I钣兄?0

一、順序查找

順序查找的基本思想是:先輸入待查找的標(biāo)示KEY,從第一個(gè)開始,將它與已經(jīng)存放好的學(xué)生記錄中相應(yīng)的項(xiàng)(在這里用MARK)比較,如果KEY與MARK相同,說明已找到,這時(shí)可以輸出相關(guān)信息,如果KEY與MARK不同,則拿下一個(gè)記錄中的MARK與KEY比較,直到找到或者到最后一個(gè)記錄止,并輸出相關(guān)的信息。程序如下:

一、順序查找

順序查找的基本思想是:先輸入待查找的標(biāo)示KE41SUBROUTINESORT_SEARCH(STRECORD,N,KEY) TYPESTUDENTRECORD CHARACTER(15)NAME INTEGERMARK INTEGER GRADE ENDTYPESTUDENTRECORD INTEGER,PARAMETER::STNUM=5 TYPE(STUDENTRECORD),DIMENSION(STNUM)::STRECORD INTEGERI,N,KEYSUBROUTINESORT_SEARCH(STRECOR42

I=1 DOWHILE((STRECORD(I)%MARK.NE.KEY).AND.(I.LE.N)) I=I+1ENDDO IF(I<=N)THEN PRINT*,"學(xué)生已經(jīng)找到,其他相關(guān)的信息為:" PRINT*,"姓名為:",STRECORD(I)%NAME PRINT*,"成績?yōu)?",STRECORD(I)%GRADE ELSE PRINT*,"查無此人" ENDIF END

I=1432.二分查找

二分查找,又稱折半查找。作為二分查找對象的表必須是有序表,其最大的優(yōu)點(diǎn)是查找速度非???,數(shù)據(jù)越多,效果越明顯。其基本思想如下:定義一個(gè)TOP指針(在這里可以理解為數(shù)組的第一個(gè)下標(biāo))指向表的第一個(gè)元素,定義一個(gè)BOT指針,指向表的最后一個(gè)元素,一個(gè)MID指針指向表的中間元素(靠左),即MID=(TOP+BOT)/2取下限,每一次查找,總是將待查項(xiàng)與MID指針?biāo)鶎?yīng)的元素的對應(yīng)項(xiàng)比較,如果對應(yīng)項(xiàng)剛好就是要查找的項(xiàng),則說明已經(jīng)找到,可以輸出相關(guān)的信息;如果對應(yīng)項(xiàng)小于待查項(xiàng),則改BOT=MID-1,重新計(jì)算MID,然后重復(fù)前面的比較;如果對應(yīng)項(xiàng)大于待查項(xiàng),則改TOP=MID+1,重新計(jì)算MID,然后重復(fù)前面的比較。這樣如果到TOP大于BOT還沒有找到對應(yīng)待查項(xiàng),說明該項(xiàng)不在此表中。程序如下:

2.二分查找二分查找,又稱折半查找。作為二分查找對象的表必44SUBROUTINEHALF_SEARCH(STRECORD,TOP,BOT,KEY) TYPESTUDENTRECORD CHARACTER(15)NAME INTEGERMARK INTEGER GRADE ENDTYPESTUDENTRECORD INTEGER,PARAMETER::STNUM=5 TYPE(STUDENTRECORD),DIMENSION(STNUM)::STRECORD

SUBROUTINEHALF_SEARCH(STRECOR45 INTEGERTOP,BOT,MID,KEY MID=(TOP+BOT)/2 DO100WHILE((STRECORD(MID)%MARK.NE.KEY).AND.(TOP.LE.BOT)) IF(STRECORD(MID)%MARK<KEY)THEN TOP=MID+1 ELSE BOT=MID-1 ENDIF MID=(TOP+BOT)/2 INTEGERTOP,BOT,MID,KEY46100 CONTINUE

IF(TOP<=BOT)THEN

PRINT*,"學(xué)生已經(jīng)找到,其他相關(guān)的信息為:"

PRINT*,"姓名為:",STRECORD(MID)%NAME

PRINT*,"成績?yōu)?",STRECORD(MID)%GRADE

ELSE

PRINT*,"查無此人"

ENDIF

END

100 CONTINUE

IF(TOP<=BOT)THE479.5.3插入

插入是在原有信息的基礎(chǔ)上加入一個(gè)新的記錄,一般而言,分為表頭插入,表尾插入和有序插入,這里主要介紹有序插入。所謂有序插入在根據(jù)關(guān)鍵字排好序的有序表中,插入一個(gè)新的記錄,方法如下:先查找位置,將新記錄的關(guān)鍵字與有序表中關(guān)鍵字比較,如果新記錄的關(guān)鍵字小于當(dāng)前比較的關(guān)鍵字,則拿下一個(gè)記錄的關(guān)鍵字與新記錄比較,直到表中記錄的關(guān)鍵字大于新記錄止,這時(shí)說明新記錄應(yīng)當(dāng)插入該記錄的前面。

9.5.3插入插入是在原有信息的基礎(chǔ)上加入一個(gè)新的記錄,48然后是表中記錄的移動(dòng),這時(shí),先應(yīng)從當(dāng)前表中最后一個(gè)記錄開始到關(guān)鍵字剛好大于新記錄的所有項(xiàng)依次后移。最后將新記錄的置于查找到的位置即完成插入操作。為了理解該算法,下面用一個(gè)具體實(shí)例來對其進(jìn)行說明。假設(shè)某有序表關(guān)鍵字依次如下:1 3 5 7 8 10 12 16新插入的記錄關(guān)鍵字為4,則插入過程示意圖如下:然后是表中記錄的移動(dòng),這時(shí),先應(yīng)從當(dāng)前表中最后一個(gè)記錄開始到49

關(guān)鍵字為4的新記錄插入位置1 3 5 7 8 10 12 16關(guān)鍵字為4的新記錄插入位置1 3 5 7 8 10 12 50元素后移動(dòng)以后結(jié)果:1 3 5 5 7 8 10 12 16其中第一個(gè)5所在的記錄在將被新記錄覆蓋。插入新記錄后,按關(guān)鍵字顯示的結(jié)果為1 3 4 5 7 8 10 12 16

元素后移動(dòng)以后結(jié)果:51程序如下:SUBROUTINESORT_INSERT(STRECORD,NEW,N)TYPESTUDENTRECORDCHARACTER(15)NAMEINTEGER MARKINTEGER GRADEENDTYPESTUDENTRECORD INTEGER,PARAMETER::STNUM=5程序如下:52 TYPE(STUDENTRECORD),DIMENSION(STNUM+1)::STRECORD TYPE(STUDENTRECORD)::NEW INTEGERI,N,JI=1 DO WHILE((STRECORD(I)%MARK.LT.NEW%MARK).AND.(I.LE.N-1)) I=I+1ENDDO DOJ=N-1,I,-1 STRECORD(J+1)=STRECORD(J) ENDDOSTRECORD(I)=NEW END

TYPE(STUDENTRECORD),DIMENS539.5.4刪除

刪除操作也是數(shù)據(jù)處理中常見的操作之一,要完成刪除操作,第一步根據(jù)給定的信息(一般為關(guān)鍵字)查找相關(guān)的記錄,然后刪除。刪除有兩種方式,第一種是將待刪除的記錄所在的存儲(chǔ)單元置空;第二種是將后面內(nèi)容覆蓋前面內(nèi)容,下面要介紹的是第二種。設(shè)待刪項(xiàng)為DEKEY,刪除函數(shù)名為DEL,程序如下:

9.5.4刪除刪除操作也是數(shù)據(jù)處理中常見的操作之一,要完54 SUBROUTINEDEL(STRECORD,DEKEY,N) TYPESTUDENTRECORDCHARACTER(15)NAME INTEGERMARK INTEGER GRADE ENDTYPESTUDENTRECORD INTEGER,PARAMETER::STNUM=5 TYPE(STUDENTRECORD),DIMENSION(STNUM)::STRECORD TYPE(STUDENTRECORD)::TEMP INTEGERI,N,J,DEKEY SUBROUTINEDEL(STRECORD,DEKEY55N=STNUMI=1 DO100WHILE((STRECORD(I)%MARK.NE.DEKEY).AND.(I.LE.N))I=I+1ENDDO IF(I.GT.N)THEN PRINT*,"學(xué)生記錄沒找到,無法刪除!" ELSETEMP=STRECORD(I)DOJ=I,NSTRECORD(J)=STRECORD(J+1)ENDDO PRINT*,"刪除的記錄為:",TEMP%NAME,TEMP%MARK,TEMP%GRADEENDIFEND其中,TEMP為一個(gè)臨時(shí)記錄,用于存放待刪記錄。N=STNUM569.5.6主程序

前面以給出了學(xué)生記錄的一些基本操作函數(shù),下面給出其主函數(shù),讀者可以將它與前面的函數(shù)結(jié)合起來一起使用。PROGRAMSTUDENT_RECORDSTYPESTUDENTRECORDCHARACTER(15)NAMEINTEGERMARKINTEGER GRADEENDTYPESTUDENTRECORDINTEGER,PARAMETER::STNUM=109.5.6主程序前面以給出了學(xué)生記錄的一些基本操作函數(shù),57!定義一個(gè)符號常量STNUM=10,用來代表要處理的學(xué)生數(shù)TYPE(STUDENTRECORD),DIMENSION(STNUM+1)::STRECORDTYPE(STUDENTRECORD)::NEW1…EXTERNALSORT,SORT_SEARCH,HALF_SEARCH,SORT_INSERT,DEL!調(diào)用函數(shù)的說明語句PRINT*,"請輸入學(xué)生有關(guān)的信息"DOI=1,STNUMREAD*,STRECORD(I)%NAME,STRECORD(I)%MARK,STRECORD(I)%GRADEENDDO!定義一個(gè)符號常量STNUM=10,用來代表要處理的學(xué)生數(shù)58PRINT*,"請輸入待處理的學(xué)生有關(guān)的信息"READ*,……CALL……!調(diào)用函數(shù)的語句,其函數(shù)個(gè)數(shù)可以根據(jù)需要增減PRINT*,“處理后學(xué)生所有信息如下:”DOI=1,STNUMPRINT*,STRECORD(I)%NAME,STRECORD(I)%MARK,STRECORD(I)%GRADEENDDOPRINT*,…ENDPRINT*,"請輸入待處理的學(xué)生有關(guān)的信息"59主函數(shù)說明如下:首先定義學(xué)生信息結(jié)構(gòu)體,其成員為學(xué)生姓名(NAME)、標(biāo)示(MARK)、和一門成績(GRADE),大家可以根據(jù)自己需要增加其他項(xiàng)。然后輸入記錄信息,及待處理的內(nèi)容明,如待查學(xué)生的關(guān)鍵字,待插學(xué)生的記錄等,它們就是后面各處理函數(shù)的實(shí)際參數(shù),再根據(jù)處理的需要調(diào)用不同的函數(shù),最后輸出相關(guān)的信息。

主函數(shù)說明如下:60習(xí)

1、

寫出下列程序的結(jié)果(1) TYPETEACHER CHARACTER(12)NAME LOGICALSEX CHARACTER(15)POSITCHARACTER(30)ADDRESS INTEGERSALENDTYPE TYPE(TEACHER)::S1,S2,S3 S1.SAL=800 S2%SAL=900 S3.SAL=700習(xí)題1、

寫出下列程序的結(jié)果61 READ*,S1.SAL,S2.SAL,S3.SAL AVER=(S1%SAL+S2.SAL+S3.SAL)/3 PRINT*,"aver=",AVER END輸入300400500輸出結(jié)果為:(2) TYPESTUDENTRECORD CHARACTER(15) NAME INTEGER MARK INTEGER GRADE ENDTYPESTUDENTRECORD INTEGER,PARAMETER::STNUM=5 TYPE(STUDENTRECORD),DIMENSION(STNUM)::STRECORD TYPE(STUDENTRECORD)::TEMP INTEGERI,J

DO I=1,STNUM READ*,STRECORD(I)%NAME,STRECORD(I)%MARK,STRECORD(I)%GRADE ENDDO READ*,S1.SAL,S2.SAL,S3.SAL62

DO I=1,STNUM DO J=I+1,STNUM IF(STRECORD(I)%MARK>STRECORD(J)%MARK)THEN TEMP=STRECORD(I) STRECORD(I)=STRECORD(J) STRECORD(J)=TEMP ENDIF ENDDO ENDDO DO I=1,STNUM PRINT*,STRECORD(I)%NAME,STRECORD(I)%MARK,STRECORD(I)%GRADE ENDDO END當(dāng)輸入zhang 5 89li 3 65 DO I=1,STNUM63zhao 4 69liu 1 94hu 2 77時(shí),輸出:2、定義一個(gè)結(jié)構(gòu)體變量,其成員包括學(xué)生的:學(xué)號、性別、年齡、專業(yè)、住址、電話號碼等。3、用兩種不同的方法為上面結(jié)構(gòu)體變量賦值。4、定義結(jié)構(gòu)體數(shù)組,結(jié)構(gòu)體成員同第一題,為它賦值并輸出。

5、在第第三題的基礎(chǔ)上,以學(xué)號作關(guān)鍵字,完成查找更新等操作。6、已知職工工資表記錄包括:職工號、姓名、年齡、職稱、工資,建立一個(gè)10個(gè)職工組成的記錄表,并找出職工中工資最高和最低者及相關(guān)信息,統(tǒng)計(jì)工資總額,計(jì)算職工平均工資。zhao 4 6964第九章派生類數(shù)據(jù)類型與結(jié)構(gòu)體本章主要介紹派生類數(shù)據(jù)類型和結(jié)構(gòu)體,這部分是FORTRAN90以上版本新增加的內(nèi)容,它使FORTRAN語言功能得到進(jìn)一步的加強(qiáng),使用更加方便。9.1派生類數(shù)據(jù)類型FORTRAN90以前的FORTRAN版本,沒有用戶自定義的數(shù)據(jù)類型。這樣給用戶帶來的不便,例如,我們要比較完整的表達(dá)多個(gè)學(xué)生的信息,假設(shè)學(xué)生包含的信息有:學(xué)生所在院系、學(xué)生班級、姓名、學(xué)號、年齡、性別、家庭住址、各科考試成績等等,同時(shí)要對這些數(shù)據(jù)進(jìn)行相應(yīng)的處理,如查找、插入、刪除、計(jì)算、排序等。以前FORTRAN所用的方法是:將學(xué)生的每一項(xiàng)放在一個(gè)數(shù)組中,如:所有學(xué)生的姓名可以放在一個(gè)字符數(shù)組中,學(xué)號可以存放在一個(gè)整型數(shù)組中,成績可以存放在一個(gè)實(shí)型數(shù)組中等等,這樣,要解決這個(gè)問題,需要對多個(gè)不同數(shù)組進(jìn)行處理,編寫程序必須注意各個(gè)學(xué)生所對應(yīng)的數(shù)據(jù)項(xiàng)在數(shù)組中不能錯(cuò)位,否則將會(huì)張冠李戴。第九章派生類數(shù)據(jù)類型與結(jié)構(gòu)體65FORTRAN90在這方面有較大的改進(jìn),主要是允許字定義派生類數(shù)據(jù)類型(簡稱派生類型),有了它,就能較容易地描述上述問題。派生數(shù)據(jù)類型定義的一般格式為:TYPE[,ACCESS[::]]派生類名字分量表ENDTYPE派生類名FORTRAN90在這方面有較大的改進(jìn),主要是允許字定義派生66說明1.TYPE為關(guān)鍵字,是每定義一個(gè)派生類型的起點(diǎn)。2.ACCESS是可供選擇的訪問方式說明,分PRIVATE(私有的)和PUBLIC(公共的)兩種,例如:REAL,PRIVATE::X1,X2該語句定義了兩個(gè)實(shí)型的私有派生類變量X1、X2。注意聲明為PRIVATE時(shí),外部模塊不能訪問它;聲明為PUBLIC屬性的實(shí)體,在其程序單位中用了USE語句就可以使用;默認(rèn)方式為公共訪問方式?!埃海骸睘樽饔糜蚍?。

說明1.TYPE為關(guān)鍵字,是每定義一個(gè)派生類型的起點(diǎn)。673.派生類名為一個(gè)標(biāo)識(shí)符,用戶可以用任意標(biāo)示符命名。4.分量表可以是各種類型的數(shù)據(jù),并且可以是多項(xiàng),每項(xiàng)前面必須加上類型說明。5.ENDTYPE派生類名為派生類定義結(jié)束的標(biāo)志。3.派生類名為一個(gè)標(biāo)識(shí)符,用戶可以用任意標(biāo)示符命名。68

下面看一個(gè)具體實(shí)例:TYPESTUDENTCHARACTER(15)NAMEINTEGERNUMLOGICALSEXCHARACTER(30)ADDRESSENDTYPE下面看一個(gè)具體實(shí)例:69其中STUDENT為派生類名。該派生類包含一個(gè)最多可存放15個(gè)字符的字符數(shù)組NAME、一個(gè)整型的變量NUM、一個(gè)邏輯類型變量SEX、一個(gè)最多可存放30個(gè)字符的字符數(shù)組ADDRESS,由于該派生類訪問方式已經(jīng)省略,因此,按照默認(rèn)訪問方式:公共訪問方式對其進(jìn)行訪問。

其中STUDENT為派生類名。該派生類包含一個(gè)最多可存放15709.2結(jié)構(gòu)體的定義與引用

有時(shí)我們需要將不同類型的數(shù)據(jù)結(jié)合成一個(gè)統(tǒng)一的整體,以便于引用。本節(jié)介紹派生類型中一種較簡單的數(shù)據(jù)類型:結(jié)構(gòu)體,它是由若干個(gè)相互之間有聯(lián)系的數(shù)據(jù)項(xiàng)構(gòu)成的。9.2結(jié)構(gòu)體的定義與引用有時(shí)我們需要將不同類型的數(shù)據(jù)結(jié)合71結(jié)構(gòu)體類型定義的一般形式為:TYPE(派生類型名)::結(jié)構(gòu)體名。例如第一節(jié),定義學(xué)生派生類后,就可以用它來定義結(jié)構(gòu)體變量TYPE(STUDENT)::S1,S2

該語句定義了兩個(gè)結(jié)構(gòu)體變量S1和S2,它們都包含STUDENT的所有成員:NAME、NUM、SEX、ADDRESS等5項(xiàng)。

9.2.1結(jié)構(gòu)體類型定義結(jié)構(gòu)體類型定義的一般形式為:9.2.1結(jié)構(gòu)體類型定義72結(jié)構(gòu)體既可以在程序中定義,也可以和其他內(nèi)部數(shù)據(jù)類型一樣放在另一個(gè)派生類型的定義中定義,即所謂嵌套定義。例如TYPESTUDENTRECORDCHARACTER(15)NAMEINTEGERNUMLOGICALSEXCHARACTER(30)ADDRESSENDTYPE結(jié)構(gòu)體既可以在程序中定義,也可以和其他內(nèi)部數(shù)據(jù)類型一樣放在另73TYPESTUDENTTOGETHERTYPE(STUDENTRECORD)::STUDENTREALMATHREAL ENGLISHREAL CHINESEENDTYPE其中,先定義STUDENTRECORD結(jié)構(gòu)體,再把TYPE(STUDENTRECORD)::STUDENT語句放在結(jié)構(gòu)體定義語句TYPESTUDENTTOGETHER之內(nèi),這樣構(gòu)成嵌套定義,即用一個(gè)結(jié)構(gòu)體作為另外一個(gè)結(jié)構(gòu)體的成員。

TYPESTUDENTTOGETHER74這時(shí),如果定義如下結(jié)構(gòu)體:TYPE(STUDENTTOGETHER)::S這樣,結(jié)構(gòu)體變量S包含:三個(gè)實(shí)型變量MATH、ENGLISH、CHINESE和一個(gè)結(jié)構(gòu)體變量STUDENT,而STUDENT又包含NAME、NUM、SEX、ADDRESS四個(gè)成員。

這時(shí),如果定義如下結(jié)構(gòu)體:75

9.2.2結(jié)構(gòu)體成員的引用

結(jié)構(gòu)體成員的引用有兩種方式:1.結(jié)構(gòu)體名%成員表2.結(jié)構(gòu)體名.成員表例如對上面定義個(gè)S1,S2兩個(gè)結(jié)構(gòu)體變量,成員的引用如下:S1.NAME、S1.NUM、S1.SEX、S1.ADDRESSS2%NAME、S2%NUM、S2%SEX、S2%ADDRESS。

9.2.2結(jié)構(gòu)體成員的引用

結(jié)構(gòu)體成員的引用有兩種方式:76注意:(1)兩種引用方式可以交叉使用,但為了清晰起見,在一個(gè)程序中最好使用一種。(2)在含嵌套定義的結(jié)構(gòu)體中,成員引用應(yīng)當(dāng)嵌套使用“%”或“.”,例如,對上面結(jié)構(gòu)體S中成員NUM的引用方式為S%STUDENT%NUM。注意:(1)兩種引用方式可以交叉使用,但為了清晰起見,在一個(gè)77

9.3結(jié)構(gòu)體的初始化

9.3.1利用賦值語句給結(jié)構(gòu)體成員賦值下面看一個(gè)完整的例子:例9.1某單位職工工資表包含的記錄有:姓名、性別、家庭住址、工資等項(xiàng),現(xiàn)計(jì)算三個(gè)職工工資的平均值。程序如下:

9.3結(jié)構(gòu)體的初始化

9.3.1利用賦值語句給結(jié)構(gòu)體成員78 TYPECLERK CHARACTER(15)NAME LOGICALSEX CHARACTER(30)ADDRESS INTEGERSAL ENDTYPE TYPE(CLERK)::S1,S2,S3 S1.SAL=800 S2%SAL=900 S3.SAL=700 AVER=(S1%SAL+S2.SAL+S3.SAL)/3 PRINT*,"三個(gè)職工的平均工資為:",AVER END TYPECLERK79其中結(jié)構(gòu)體成員賦值的三個(gè)語句為:S1.SAL=800、S2%SAL=900、S3.SAL=700,這與普通變量賦值本質(zhì)上是一樣的,也就是說可以把某結(jié)構(gòu)體變量成員的引用一起當(dāng)作一個(gè)變量來使用,因此也可以用輸入語句來賦值。

其中結(jié)構(gòu)體成員賦值的三個(gè)語句為:S1.SAL=800、80例9.2學(xué)生記錄包含如下數(shù)據(jù)項(xiàng):姓名、一門功課的成績、性別、家庭住址,要求打印學(xué)生各數(shù)據(jù)項(xiàng),并求出該門成績的平均值。程序如下: TYPESTUDENT CHARACTER(15)NAME INTEGERGRADE LOGICALSEX CHARACTER(30)ADDRESS ENDTYPE TYPE(STUDENT)::S1,S2,S3例9.2學(xué)生記錄包含如下數(shù)據(jù)項(xiàng):姓名、一門功課的成績、性別81

PRINT*,"請輸入三個(gè)學(xué)生的名字" READ*,S1.NAME,S2.NAME,S3.NAME PRINT*,"請輸入三個(gè)學(xué)生的成績" READ*,S1.GRADE,S2.GRADE,S3.GRADE PRINT*,"請輸入三個(gè)學(xué)生的性別" READ*,S1%SEX,S2%SEX,S3%SEX PRINT*,"請輸入三個(gè)學(xué)生的住址" READ*,S1.ADDRESS,S2.ADDRESS,S3.ADDRESS PRINT*,"三個(gè)學(xué)生的名字為",S1.NAME,S2.NAME,S3.NAME PRINT*,"請輸入三個(gè)學(xué)生的名字"82

PRINT*,"三個(gè)學(xué)生的性別為",S1%SEX,S2%SEX,S3%SEX PRINT*,"三個(gè)學(xué)生的住址為",S1.ADDRESS,S2.ADDRESS,$S3.ADDRESS AVER=(S1%GRADE+S2.GRADE+S3.GRADE)/3 PRINT*,"三個(gè)學(xué)生的平均成績?yōu)椋?,AVER END PRINT*,"三個(gè)學(xué)生的性別為",S1%SEX,S283請輸入三個(gè)學(xué)生的名字輸入:ZHANGLIWANG回車請輸入三個(gè)學(xué)生的成績輸入三個(gè)正整數(shù)如859080回車請輸入三個(gè)學(xué)生的性別輸入.F..T..F.回車請輸入三個(gè)學(xué)生的住址輸入:CHANGSHAGUANGZHOUBEIJING回車請輸入三個(gè)學(xué)生的名字84

最后輸出結(jié)果為三個(gè)學(xué)生的名字為 ZHANG LI WANG三個(gè)學(xué)生的性別為 F T F三個(gè)學(xué)生的住址為 CHANGSHA GUANGZHOU BEIJING三個(gè)學(xué)生的平均成績?yōu)? 85最后輸出結(jié)果為859.3.2定義的同時(shí)賦值

在定義結(jié)構(gòu)體變量的同時(shí),給定結(jié)構(gòu)體各成員的值。其格式為:TYPE(派生數(shù)據(jù)類名)::結(jié)構(gòu)體變量名=派生數(shù)據(jù)類名(成員初值表)其中,=后面的派生類名即為TYPE后面的派生類名;成員之間的值用“,”隔開。例如結(jié)構(gòu)體如下:

9.3.2定義的同時(shí)賦值在定義結(jié)構(gòu)體變量的同時(shí),給定結(jié)構(gòu)86 TYPETEACHER CHARACTER(12)NAME LOGICALSEX CHARACTER(15)POSITCHARACTER(30)ADDRESS INTEGERSALENDTYPE這樣我們可以用如下方式給對應(yīng)的結(jié)構(gòu)體變量賦值:TYPE(TEACHER)::S1=TEACHER("ZHANG",.TRUE.,"PROFESSOR",”CHANGSHANG”,2000),S2,S3這樣,結(jié)構(gòu)體變量S1的值全部被給定。

TYPETEACHER87這種賦值方式應(yīng)當(dāng)注意:

(1)賦值時(shí),所給的值類型和個(gè)數(shù)應(yīng)與結(jié)構(gòu)體變量定義中各成員的類型與個(gè)數(shù)保持一致。(2)可以將一個(gè)結(jié)構(gòu)體變量的值直接賦給另外一個(gè)結(jié)構(gòu)體變量,

這種賦值方式應(yīng)當(dāng)注意:(1)賦值時(shí),所給的值類型和個(gè)數(shù)應(yīng)與88INTEGERS TYPESTUDENTRECORD CHARACTER(15)NAME INTEGERNUM LOGICALSEX CHARACTER(30)ADDRESS ENDTYPE TYPE(STUDENTRECORD)::S1,S2 S1=STUDENTRECORD("ABCD",20,.TRUE.,"CHANGSHA") S2=S1 S=S2%NUM+S1%NUM PRINT*,S ENDINTEGERS89這里,通過S2=S1語句,使S1和S2兩個(gè)結(jié)構(gòu)體變量得到相同的值,輸出S的結(jié)果為40。當(dāng)結(jié)構(gòu)體中包含成員較多時(shí),可以用嵌套定義的方式,使結(jié)構(gòu)體變得簡潔,如例9.2中,當(dāng)學(xué)生的成績是多門時(shí),可以將它們單獨(dú)定義在一個(gè)結(jié)構(gòu)體中,然后將該結(jié)構(gòu)體包含到主結(jié)構(gòu)體中,下面再看一個(gè)例子:

這里,通過S2=S1語句,使S1和S2兩個(gè)結(jié)構(gòu)體變量得到相同90例9.3、學(xué)生信息包含如下數(shù)據(jù)項(xiàng):姓名、性別、學(xué)號、年齡和5門功課的成績:語文、數(shù)學(xué)、物理、化學(xué)、英語,要求輸入三個(gè)學(xué)生的記錄,打印出相關(guān)信息與總成績。分析:學(xué)生的成績有5門,可以將它們放在一個(gè)名為STUDENTSCORE的結(jié)構(gòu)體中,而將學(xué)生所有記錄存放在名為STUDENTRECORD的結(jié)構(gòu)體中,該結(jié)構(gòu)體包含結(jié)構(gòu)體STUDENTSCORE,然后作相應(yīng)處理,注意學(xué)生成績輸入語句。程序如下:

例9.3、學(xué)生信息包含如下數(shù)據(jù)項(xiàng):姓名、性別、學(xué)號、年齡和591PROGRAMXUESHENGJILU REALAVER1,AVER2,AVER3TYPESTUDENTSCORE REALCHINESE REALMATH REALPHYSICS REALCHEMISTRY REALENGLISH ENDTYPEPROGRAMXUESHENGJILU92TYPESTUDENTRECORD CHARACTER(17)NAME LOGICALSEX INTEGERNUMBER INTEGERBIRTHDAY TYPE(STUDENTSCORE)::SCORE ENDTYPE TYPE(STUDENTRECORD)::S1,S2,S3 PRINT*,"請輸入3個(gè)學(xué)生的姓名" READ*,S1.NAME,S2.NAME,S3.NAME PRINT*,"請輸入3個(gè)學(xué)生的性別" READ*,S1.SEX,S2.SEX,S3.SEX PRINT*,"請輸入3個(gè)學(xué)生的學(xué)號" READ*,S1.NUMBER,S2.NUMBER,S3.NUMBER PRINT*,"請輸入3個(gè)學(xué)生的年齡" READ*,S1.BIRTHDAY,S2.BIRTHDAY,S3.BIRTHDAYTYPESTUDENTRECORD93PRINT*,"請輸入3個(gè)學(xué)生的語文成績" READ*,S1%SCORE%CHINESE,S2%SCORE%CHINESE,S3%SCORE%CHINESE PRINT*,"請輸入3個(gè)學(xué)生的數(shù)學(xué)成績" READ*,S1%SCORE%MATH,S2%SCORE%MATH,S3%SCORE%MATH PRINT*,"請輸入3個(gè)學(xué)生的物理成績" READ*,S1%SCORE%PHYSICS,S2%SCORE%PHYSICS,S3%SCORE%PHYSICS PRINT*,"請輸入3個(gè)學(xué)生的化學(xué)成績" READ*,S1%SCORE%CHEMISTRY,S2%SCORE%CHEMISTRY,S3%SCORE%CHEMISTRY PRINT*,"請輸入3個(gè)學(xué)生的英語成績" READ*,S1%SCORE%ENGLISH,S2%SCORE%ENGLISH,S3%SCORE%ENGLISH AVER1=(S1%SCORE%CHINESE+S1%SCORE%MATH+S1%SCORE%PHYSICS+S1%SCORE%CHEMISTRY+S1%SCORE%ENGLISH)/5.0PRINT*,"請輸入3個(gè)學(xué)生的語文成績"94

AVER2=(S2%SCORE%CHINESE+S2%SCORE%MATH+S2%SCORE%PHYSICS+S2%SCORE%CHEMISTRY+S2%SCORE%ENGLISH)/5.0 AVER3=(S3%SCORE%CHINESE+S3%SCORE%MATH+S3%SCORE%PHYSICS+S3%SCORE%CHEMISTRY+S3%SCORE%ENGLISH)/5.0 PRINT*,S1.NAME,S1.SEX,S1.NUMBER,S1.BIRTHDAY PRINT*,S1%SCORE%CHINESE,S1%SCORE%MATH,S1%SCORE%PHYSICS,$S1%SCORE%CHEMISTRY,S1%SCORE%ENGLISH,AVER1 AVER2=(S2%SCORE%CHINESE+S295PRINT*,S2.NAME,S2.SEX,S2.NUMBER,S2.BIRTHDAY PRINT*,S2%SCORE%CHINESE,S2%SCORE%MATH,S2%SCORE%PHYSICS,$S2%SCORE%CHEMISTRY,S2%SCORE%ENGLISH,AVER2 PRINT*,S3.NAME,S3.SEX,S3.NUMBER,S3.BIRTHDAY PRINT*,S3%SCORE%CHINESE,S3%SCORE%MATH,S3%SCORE%PHYSICS,$S3%SCORE%CHEMISTRY,S3%SCORE%ENGLISH,AVER3 ENDPRINT*,S2.NAME,S2.SEX,S2.NUMBE969.5綜合實(shí)例

在這一節(jié)中,我們結(jié)合數(shù)據(jù)處理中的一些常見操作,如數(shù)據(jù)的排序、插入、查找、刪除、更新等,介紹結(jié)構(gòu)體的綜合應(yīng)用實(shí)例。為了簡便起見,我們同樣以學(xué)生信息為例,且假設(shè)學(xué)生信息僅僅包含姓名和一門功課的成績,另外加一個(gè)唯一的標(biāo)識(shí)(如學(xué)號),現(xiàn)在考慮如何完成上述的操作。首先定義學(xué)生結(jié)構(gòu)體如下:

9.5綜合實(shí)例在這一節(jié)中,我們結(jié)合數(shù)據(jù)處理中的一些常見97TYPESTUDENTRECORDCHARACTER(15) NAMEINTEGER MARKINTEGER GRADEENDTYPESTUDENTRECORD其中:NAME代表學(xué)生姓名,MARK代表標(biāo)示,GRADE代表成績

TYPESTUDENTRECORD98其次必須考慮的是如何存儲(chǔ)學(xué)生信息的問題。為此,定義如下結(jié)構(gòu)體數(shù)組:TYPE(STUDENTRECORD),DIMENSION(STNUM)::STRECORD其中,STNUM為符號常量,代表學(xué)生人數(shù),可以在使用之前通過INTEGER,PARAMETER::STNUM=20來定義,該語句的含義為定義一個(gè)整型的符號常量STNUM,其值為20,可以根據(jù)學(xué)生人數(shù)修改其值,下面一步一步地介紹完成上述的操作。

其次必須考慮的是如何存儲(chǔ)學(xué)生信息的問題。999.5.1排序

排序(SORTING)是數(shù)據(jù)處理領(lǐng)域中最常用的一種運(yùn)算,分為升序和降序排序兩種,排序方法較多,常見的有簡單交換排序、選擇排序、冒泡排序、堆排序、快速排序、歸并排序等,不同的排序方法,有不同的優(yōu)點(diǎn)和缺點(diǎn),但其中某些排序牽涉到數(shù)據(jù)結(jié)構(gòu)方面的知識(shí),如堆排序,已超出本書范圍,讀者如果有興趣,可以參看有關(guān)數(shù)據(jù)結(jié)構(gòu)方面的知識(shí),這里僅僅使用簡單交換法排序。排序的主要目的之一是為了查找方便,因此一般牽涉到排序字或稱關(guān)鍵詞(KEY)問題,這里用每個(gè)學(xué)生的標(biāo)識(shí)MARK作為關(guān)鍵字進(jìn)行排序字,如果要對學(xué)生的成績排序,只須將MARK改為GRADE即可。

9.5.1排序排序(SORTING)是數(shù)據(jù)處理領(lǐng)域中最常100簡單交換法思想介紹如下:先將除第一個(gè)數(shù)據(jù)項(xiàng)以外的所有數(shù)據(jù)與第一個(gè)數(shù)據(jù)項(xiàng)比較,前者小,則將與它有關(guān)的記錄與后者有關(guān)的記錄交換,顯然,第一輪排序進(jìn)行完畢,排序項(xiàng)最小者將被交換到最前面。然后從第二個(gè)排序項(xiàng)開始重復(fù)前述操作,依次類推,直到排序完成止。我們定義SORT函數(shù)來完成排序操作,程序如下:簡單交換法思想介紹如下:101

SUBROUTINESORT(STRECORD,N) TYPESTUDENTRECORDCHARACTER(15) NAME INTEGER MARK INTEGER GRADE ENDTYPESTUDENTRECORD INTEGER,PARAMETER::STNUM=5 TYPE(STUDENTRECORD),DIMENSION(STNUM)::STRECORD TYPE(STUDENTRECORD)::TEMP INTEGERI,J,NSUBROUTINESORT(STRECORD,N)102 DO I=1,N DO J=I+1,N IF(STRECORD(I)%MARK>STRECORD(J)%MARK)THEN TEMP=STRECORD(I) STRECORD(I)=STRECORD(J) STRECORD(J)=TEMP ENDIFENDDOENDDOEND

DO I=1,N1039.5.2查找

查找(SEARCH)同人們?nèi)粘I钣兄芮械穆?lián)系。如從字典中查找單詞,從工資表中查找工資,從電話號碼薄中查找電話,從圖書館中查找書,從地圖上查找路線和地址等。同排序一樣,查找的方法非常多,如順序查找、二分查找、索引查找、分塊查找、B_樹查找等,這里介紹無序情況下的順序查找和有序情況下的二分查找兩種。

9.5.2查找查找(SEARCH)同人們?nèi)粘I钣兄?04

一、順序查找

順序查找的基本思想是:先輸入待查找的標(biāo)示KEY,從第一個(gè)開始,將它與已經(jīng)存放好的學(xué)生記錄中相應(yīng)的項(xiàng)(在這里用MARK)比較,如果KEY與MARK相同,說明已找到,這時(shí)可以輸出相關(guān)信息,如果KEY與MARK不同,則拿下一個(gè)記錄中的MARK與KEY比較,直到找到或者到最后一個(gè)記錄止,并輸出相關(guān)的信息。程序如下:

一、順序查找

順序查找的基本思想是:先輸入待查找的標(biāo)示KE105SUBROUTINESORT_SEARCH(STRECORD,N,KEY) TYPESTUDENTRECORD CHARACTER(15)NAME INTEGERMARK INTEGER GRADE ENDTYPESTUDENTRECORD INTEGER,PARAMETER::STNUM=5 TYPE(STUDENTRECORD),DIMENSION(STNUM)::STRECORD INTEGERI,N,KEYSUBROUTINESORT_SEARCH(STRECOR106

I=1 DOWHILE((STRECORD(I)%MARK.NE.KEY).AND.(I.LE.N)) I=I+1ENDDO IF(I<=N)THEN PRINT*,"學(xué)生已經(jīng)找到,其他相關(guān)的信息為:" PRINT*,"姓名為:",STRECORD(I)%NAME PRINT*,"成績?yōu)?",STRECORD(I)%GRADE ELSE PRINT*,"查無此人" ENDIF END

I=11072.二分查找

二分查找,又稱折半查找。作為二分查找對象的表必須是有序表,其最大的優(yōu)點(diǎn)是查找速度非???,數(shù)據(jù)越多,效果越明顯。其基本思想如下:定義一個(gè)TOP指針(在這里可以理解為數(shù)組的第一個(gè)下標(biāo))指向表的第一個(gè)元素,定義一個(gè)BOT指針,指向表的最后一個(gè)元素,一個(gè)MID指針指向表的中間元素(靠左),即MID=(TOP+BOT)/2取下限,每一次查找,總是將待查項(xiàng)與MID指針?biāo)鶎?yīng)的元素的對應(yīng)項(xiàng)比較,如果對應(yīng)項(xiàng)剛好就是要查找的項(xiàng),則說明已經(jīng)找到,可以輸出相關(guān)的信息;如果對應(yīng)項(xiàng)小于待查項(xiàng),則改BOT=MID-1,重新計(jì)算MID,然后重復(fù)前面的比較;如果對應(yīng)項(xiàng)大于待查項(xiàng),則改TOP=MID+1,重新計(jì)算MID,然后重復(fù)前面的比較。這樣如果到TOP大于BOT還沒有找到對應(yīng)待查項(xiàng),說明該項(xiàng)不在此表中。程序如下:

2.二分查找二分查找,又稱折半查找。作為二分查找對象的表必108SUBROUTINEHALF_SEARCH(STRECORD,TOP,BOT,KEY) TYPESTUDENTRECORD CHARACTER(15)NAME INTEGERMARK INTEGER GRADE ENDTYPESTUDENTRECORD INTEGER,PARAMETER::STNUM=5 TYPE(STUDENTRECORD),DIMENSION(STNUM)::STRECORD

SUBROUTINEHALF_SEARCH(STRECOR109 INTEGERTOP,BOT,MID,KEY MID=(TOP+BOT)/2 DO100WHILE((STRECORD(MID)%MARK.NE.KEY).AND.(TOP.LE.BOT)) IF(STRECORD(MID)%MARK<KEY)THEN TOP=MID+1 ELSE BOT=MID-1 ENDIF MID=(TOP+BOT)/2 INTEGERTOP,BOT,MID,KEY110100 CONTINUE

IF(TOP<=BOT)THEN

PRINT*,"學(xué)生已經(jīng)找到,其他相關(guān)的信息為:"

PRINT*,"姓名為:",STRECORD(MID)%NAME

PRINT*,"成績?yōu)?",STRECORD(MID)%GRADE

ELSE

PRINT*,"查無此人"

ENDIF

END

100 CONTINUE

IF(TOP<=BOT)THE1119.5.3插入

插入是在原有信息的基礎(chǔ)上加入一個(gè)新的記錄,一般而言,分為表頭插入,表尾插入和有序插入,這里主要介紹有序插入。所謂有序插入在根據(jù)關(guān)鍵字排好序的有序表中,插入一個(gè)新的記錄,方法如下:先查找位置,將新記錄的關(guān)鍵字與有序表中關(guān)鍵字比較,如果新記錄的關(guān)鍵字小于當(dāng)前比較的關(guān)鍵字,則拿下一個(gè)記錄的關(guān)鍵字與新記錄比較,直到表中記錄的關(guān)鍵字大于新記錄止,這時(shí)說明新記錄應(yīng)當(dāng)插入該記錄的前面。

9.5.3插入插入是在原有信息的基礎(chǔ)上加入一個(gè)新的記錄,112然后是表中記錄的移動(dòng),這時(shí),先應(yīng)從當(dāng)前表中最后一個(gè)記錄開始到關(guān)鍵字剛好大于新記錄的所有項(xiàng)依次后移。最后將新記錄的置于查找到的位置即完成插入操作。為了理解該算法,下面用一個(gè)具體實(shí)例來對其進(jìn)行說明。假設(shè)某有序表關(guān)鍵字依次如下:1 3 5 7 8 10 12 16新插入的記錄關(guān)鍵字為4,則插入過程示意圖如下:然后是表中記錄的移動(dòng),這時(shí),先應(yīng)從當(dāng)前表中最后一個(gè)記錄開始到113

關(guān)鍵字為4的新記錄插入位置1 3 5 7 8 10 12 16關(guān)鍵字為4的新記錄插入位置1 3 5 7 8 10 12 114元素后移動(dòng)以后結(jié)果:1 3 5 5 7 8 10 12 16其中第一個(gè)5所在的記錄在將被新記錄覆蓋。插入新記錄后,按關(guān)鍵字顯示的結(jié)果為1 3 4 5 7 8 10 12 16

元素后移動(dòng)以后結(jié)果:115程序如下:SUBROUTINESORT_INSERT(STRECORD,NEW,N)TYPESTUDENTRECORDCHARACTER(15)NAMEINTEGER MARKINTEGER GRADEENDTYPESTUDENTRECORD INTEGER,PARAMETER::STNUM=5程序如下:116 TYPE(STUDENTRECORD),DIMENSION(STNUM+1)::STRECORD TYPE(STUDENTRECORD)::NEW INTEGERI,N,JI=1 DO WHILE((STRECORD(I)%MARK.LT.NEW%MARK).AND.(I.LE.N-1)) I=I+1ENDDO DOJ=N-1,I,-1 STRECORD(J+1)=STRECORD(J) ENDDOSTRECORD(I)=NEW END

TYPE(STUDENTRECORD),DIMENS1179.5.4刪除

刪除操作也是數(shù)據(jù)處理中常見的操作之一,要

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論