版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第十一課 枚舉、子界、集合及記錄類型 在前面幾章中我們用到了整型、實型、布爾型、字符型的數(shù)據(jù)。以上數(shù)據(jù)類型是 由 pascal 規(guī)定的標(biāo)準(zhǔn)數(shù)據(jù)類型,只要寫 integer,real,boolean, char, pasca編l 譯系統(tǒng) 就能識別并按這些類型來處理。 pascal還允許用戶定義一些類型,這是其它一些 語言所沒有的,這就使得 pascal使用靈活、功能豐富。一、枚舉類型 隨著計算機的不斷普及,程序不僅只用于數(shù)值計算,還更廣泛地用于處理非數(shù)值 的數(shù)據(jù)。例如,性別、月份、星期幾、顏色、單位名、學(xué)歷、職業(yè)等,都不是數(shù) 值數(shù)據(jù)。在其它程序設(shè)計語言中,一般用一個數(shù)值來代表某一狀態(tài),這種處理方
2、法不直 觀,易讀性差。如果能在程序中用自然語言中有相應(yīng)含義的單詞來代表某一狀 態(tài),則程序就很容易閱讀和理解。也就是說,事先考慮到某一變量可能取的值, 盡量用自然語言中含義清楚的單詞來表示它的每一個值,這種方法稱為枚舉方 法,用這種方法定義的類型稱枚舉類型。枚舉類型是一種很有實用價值的數(shù)據(jù)類型,它是 pascal一項重要創(chuàng)新。(一) 枚舉類型的定義枚舉類型是一種自定義類型,要使用枚舉類型當(dāng)然也要先說明枚舉類型。 枚舉類型的一般格式 :(標(biāo)識符 1,標(biāo)識符 2, 標(biāo),識符 n) 說明: 括號中的每一個標(biāo)識符都稱為枚舉元素或枚舉常量。 定義枚舉類型時列出的所有枚舉元素構(gòu)成了這種枚舉類型的值域(取值范
3、 圍),也就是說,該類型的變量所有可能的取值都列出了。例如,下列類型定義是合法的:type days=(sun,mon,tue,wed,thu,fri,sat); colors=(red,yellow,blue,white,black,green); 而下列類型定義是錯誤的 ( 因為枚舉元素非標(biāo)識符 ): type colortype=('red','yellow','blue','white');numbers=(1,3,5,7,9); ty=(for,do,while);(二) 枚舉類型變量 定義了枚舉類型,就可以把某些變量說
4、明成該類型。如: var holiday,workday:day;incolor:colors; 也可以把變量的說明與類型的定義合并在一起 ,如 : var holiday,workday:(sun,mon,tue,wed,thu,fri,sat);incolor:(red,yellow,blue,white,black,green);(三) 枚舉類型的性質(zhì)枚舉類型屬于順序類型 根據(jù)定義類型時各枚舉元素的排列順序確定它們的序號,第一個枚舉元素的序號 為 0 。例如:設(shè)有定義: type days=(sun,mon,tue,wed,thu,fri,sat);則: ord(sun)=0,ord(m
5、on)=1,ord(sat)=6;succ(sun)=mon,succ(mon)=tue, succ(fri)=sat;pred(mon)=sun,pred(tue)=mon,pred(sat)=fr。i 應(yīng)注意的是:枚舉類型中的第一個元素?zé)o前趨,最后一個元素?zé)o后繼。 對枚舉類型只能進行賦值運算和關(guān)系運算 一旦定義了枚舉類型及這種類型的變量,則在語句部分只能對枚舉類型變量賦 值,或進行關(guān)系運算,不能進行算術(shù)運算和邏輯運算。 在枚舉元素比較時,實際上是對其序號的比較。當(dāng)然,賦值或比較時,應(yīng)注意類 型一致。例如,設(shè)程序有如下說明: type days=(sun,mon,tue,wed,thu,fr
6、i,sat); colors=(red,yellow,blue,white,black,green);var color:colors; weekday:days; 則下列比較或語句是合法的 : weekday:=mon;if weekday=sun then write('rest'); weekday<>sun 而下面比較或語句是不合法的 : mon:=weekday;mon:=1;if weekday=sun or sat then write('rest'); sun>red weekday<>color枚舉變量的值只能用賦
7、值語句來獲得也就是說,不能用 read(或 readln)讀一個枚舉型的值。同樣,也不能用 write( 或 writeln) 輸出一個枚舉型的值。如 write(red)是非法的,會發(fā)生編譯錯誤。千萬不 要誤認(rèn)為,該語句的結(jié)果是輸出 "red" 三個字符。但對枚舉數(shù)據(jù)的輸入與輸出可通過間接方式進行。輸入時,一般可輸入一個代 碼,通過程序進行轉(zhuǎn)換,輸出時,也只是打印出與枚舉元素相對應(yīng)的字符串。這 在后面的例題中將有使用示例。同一個枚舉元素不能出現(xiàn)在兩個或兩個以上的枚舉類型定義中 如:type color1=(red,yellow,white);color2=(blue,re
8、d,black);是不允許的,因為 red屬于兩個枚舉類型。(四) 、枚舉類型應(yīng)用舉例例 1 一周七天用 sun,mon,tue,wed,thu,fri,sat表示, 要求利用枚舉類型編程:當(dāng)輸 入星期幾的數(shù)字 ,能輸出它的后一天是星期幾 (也用英文表示 )。源程序如下:program ex6_1;type week=(sun,mon,tue,wed,thu,fri,sat); vari : integer;day,sucday : week;beginwrite('What date is it');readln(i); case i of 根據(jù)輸入 i 轉(zhuǎn)換成枚舉型 1:d
9、ay:=mon;2:day:=tue;3:day:=wed;4:day:=thu;5:day:=fri;6:day:=sat;7:day:=sun;end; 計算明天 sucdayif (day=sat) then sucday:=sun else sucday:=succ(day); 輸出明天是星期幾 write('The next day is ');case sucday ofsun:writeln('sunday');mon:writeln('monday');tue:writeln('tuesday');wed:writ
10、eln('wednesay');thu:writeln('thursday');fri:writeln('friday');sat:writeln('saturday');end;end.評注:程序中變量 day、 sucday分別表示今天、明天。二、子界類型如果我們定義一個變量 i 為 integer 類型,那么 i 的值在微型機系統(tǒng)的 pascal中 ,使 用 2 字節(jié)的定義表示法 ,取值范圍為 -32768 32767。而事實上,每個程序中所用 的變量的值都有一個確定的范圍。例如,人的年齡一般不超過 150,一個班級的學(xué)生不
11、超過 100 人,一年中的月數(shù) 不超過 12,一月中的天數(shù)不超過 31,等等。如果我們能在程序中對所用的變量的值域作具體規(guī)定的話,就便于檢查出那些不 合法的數(shù)據(jù),這就能更好地保證程序運行的正確性。而且在一定程度上還會節(jié)省 內(nèi)存空間。子界類型就很好解決如上問題。此外,在數(shù)組的定義中,常用到子界類型,以規(guī) 定數(shù)組下標(biāo)的范圍,上一章有關(guān)數(shù)組知識中我們已用到。(一)子界類型定義 子界類型的一般格式: <常量 1>.<常量 2> 說明: 其中常量 1 稱為子界的下界 ,常量 2稱為子界的上界。 下界和上界必須是同一順序類型(該類型稱為子界類型的基類型),且上界的 序號必須大于下界
12、的序號。例如,下列說明:type age=0.5.150;letter=0.'z'let1='z'.'a' 都是錯誤的。 可以直接在變量說明中定義子界類型。如:type letter='a'.'d'var ch1,ch2:letter;可以合并成 :var ch1,ch2:'a'.'d' 當(dāng)然,將類型定義和變量定義分開,則更為清晰。(二)子界類型數(shù)據(jù)的運算規(guī)則 凡可使用基類型的運算規(guī)則同樣適用該類型的子界類型。 例如,可以使用整型變量的地方,也可以使用以整型為基類型的子界類型數(shù)據(jù)。
13、對基類型的運算規(guī)則同樣適用于該類型的子界類型。例如, div, mod要求參加運算的數(shù)據(jù)為整 , 因而也可以為整型的任何子界類型數(shù) 據(jù)?;愋拖嗤牟煌咏珙愋蛿?shù)據(jù)可以進行混合運算。 例如:設(shè)有如下說明:type a=1.100; b=1.1000; c=1.500;varx:a;y:b;t:c;z:integer; 則下列語句也是合法的:Z:=Sqr(x)+y+t; 下列語句 : t:=x+y+z;當(dāng) X+Y+Z 的值在 1500 范圍內(nèi)時是合法的,否則會出錯。(三) 子界類型應(yīng)用舉例例 2 利用子界類型作為情況語句標(biāo)號,編一個對數(shù)字, 大小寫字母和特殊字符進 行判別的程序。 源程序如下:p
14、rogram cas; var c:char;begin readln(c); case c of'0'.'9':writeln('digits');'A'.'Z':writeln('UPPER-CASELETTERS');'a'.'z':writeln('lower-caseletters');esle writeln('special charactors');end;end.例 3 使用子界型情況語句,當(dāng)輸入月、日、年 (10 3
15、0 1986),輸出 30 Oct 1986。 源程序如下 :program ex6_3;var month:1.12; date:1.31; year:1900.1999; begin write('Enter date(mm-dd-yy):'); readln(month,date,year);write(date);case month of1:write('Jan':5);2:write('Feb':5);3:write('Mar':5);4:write('Apr':5);5:write('May&
16、#39;:5);6:write('Jun':5);7:write('Jul':5);8:write('Aug':5);9:write('Sep':5);10:write('Oct':5);11:write('Nov':5);12:write('Dec':5);end;writeln(year:7);end. 枚舉類型和子界類型均是順序類型,在前面一章數(shù)組的定義時,實際上我們已經(jīng) 用到了子界類型,數(shù)組中的下標(biāo)類型確切地講可以是和枚舉類型或子界類型,大 多數(shù)情況下用子界類型。如有如下說明
17、:type color=(red,yellow,blue,white,black);vara:arraycolorof integer;b:array1.100of color;都是允許的。三、集合類型集合是由具有某些共同特征的元素構(gòu)成的一個整體。在 pascal中,一個集合是由具 有同一有序類型的一組數(shù)據(jù)元素所組成,這一有序類型稱為該集合的基類型。(一) 集合類型的定義和變量的說明 集合類型的一般形式為: set of <基類型 >說明: 基類型可以是任意順序類型 , 而不能是實型或其它構(gòu)造類型。同時,基類 型的數(shù)據(jù)的序號不得超過 255。例如下列說明是合法的 :type let
18、ters=set of 'A'.'Z'numbers=set of 0.9;s1=set of char; ss=(sun,mon,tue,wed,thu,fri,sat);s2=set of ss;與其它自定義類型一樣 , 可以將類型說明與變量說明合并在一起 .如: type numbers=set of 0.9;var s:numbers;與 var s:set of 0.9;等價。(二) 集合的值 集合的值是用 "" 和""括起來,中間為用逗號隔開的若干個集合的元素。如: 空集1,2,3 'a',
19、39;e','i','o','u' 都是集合。說明: 集合的值放在一對方括號中,各元素之間用逗號隔開。 在集合中可以沒有任何元素,這樣的集合稱為空集。 在集合中,如果元素的值是連續(xù)的,則可用子界型的表示方法表示。例如: 1,2,3,4,5,7,8,9,10,15可以表示成:1.5,7.10,15 集合的值與方括號內(nèi)元素出現(xiàn)的次序無關(guān)。例如, 1,5,8 和 5,1,8的值相 等。 在集合中同一元素的重復(fù)出現(xiàn)對集合的值沒有影響。例如, 1,8,5,1,8與 1,5,8的值相等。 每個元素可用基類型所允許的表達式來表示。如 1,1+2,4、
20、ch、 succ(ch)。(三) 集合的運算 賦值運算 只能通過賦值語句給集合變量賦值,不能通過讀語句賦值,也不能通過 write( 或 writeln) 語句直接輸出集合變量的值。集合的并、交、差運算 可以對集合進行并、交、差三種運算,每種運算都只能有一個運算符、兩個運算 對象,所得結(jié)果仍為集合。三種運算符分別用 " "、""、""表示。注意它們 與算術(shù)運算的區(qū)別。集合的關(guān)系運算 集合可以進行相等或不相等、包含或被包含的關(guān)系運算,還能測試一個元素是否 在集合中。所用的運算符分別是:、它們都是二目運算,且前個運算符的運算對象都是相容的
21、集合類型,最后一個 運算符的右邊為集合,左邊為與集合基類型相同的表達式。例 4 設(shè)有如下說明:type weekday=(sun,mon,tue,wed,thu,fri,sat); week=set of weekday;subnum=set of 1.50; 寫出下列表達式的值 :sun,sat+sun,tue,fri sun,fri* mon,tue wun,sat * sun.sat sun-mon,tue mon-mon,tue sun.sat-mon,sun,sat 1,2,3,5=1,5,3,2 1,2,3,4<>1.4 1,2,3,5>=1.3 1.5<=
22、1.4 1,2,3<=1.3 2 in 1.10 答: 表達式的值分別是 : sun,sat,tue,fri sun,sat tue.fri TRUE FALSE TRUE FALSE TRUE TRUE 例 5 輸入一系列字符,對其中的數(shù)字字符、字母字符和其它字符分別計數(shù)。輸入 '?'后結(jié)束。 源程序如下: program ex10_2;var id,il,io:integer;ch:char; letter:set of char; digit:set of '0'.'9'begin letter='a'.'z&
23、#39;,'A'.'Z'digit:='0'.'9' id:=0;il:=0;io:=0;repeat read(ch);if ch in letter then il:=il+1 else if ch in digit then id:=id+1 else io:=io+1; until ch='?'writeln('letter:',il,'digit:',id,'Other:',io);end.四、記錄類型 在程序中對于組織和處理大批量的數(shù)據(jù)來說,數(shù)組是一種十分
24、方便而又靈活的工 具,但是數(shù)組在使用中有一個基本限制,這就是:一個數(shù)組中的所有元素都必須 具有相同的類型。但在實際問題中可能會遇到另一類數(shù)據(jù),它是由性質(zhì)各不相同 的成份組成的,即它的各個成 份可能具有不同的類型。例如,有關(guān)一個學(xué)生的數(shù)據(jù)包含下列項目: 學(xué)號 字符串類型 姓名 字符串類型年齡 整型 性別 字符型 成績 實型數(shù)組 Pascal給我們提供了一種叫做記錄的結(jié)構(gòu)類型。在一個記錄中,可以包含不同類 型的并且互相相關(guān)的一些數(shù)據(jù)。(一) 記錄類型的定義在 pascal中,記錄由一組稱為 "域 "的分量組成,每個域可以具有不同的類型。 記錄類型定義的一般形式:record&l
25、t;域名 1>:<類型 1> <域名 2>:<類型 2><域名 n>:<類型 n>end;說明: 域名也稱域變量標(biāo)識符, 應(yīng)符合標(biāo)識符的語法規(guī)則。在同一個記錄中類 型中,各個域不能取相同的名,但在不同的記錄類型中,兩個類型中的域名要以 相同。 記錄類型的定義和記錄變量可以合并為一個定義,如: type date=recordyear:1900.1999; month:1.12;day:1.31end;var x:date; 可以合并成 : var x: record year:1900.1999;month:1.12;day:1
26、.31end;對記錄的操作 ,除了可以進行整體賦值, 只能對記錄的分量 域變量進行。 域變量的表示方法如下:記錄變量名 .域名 如前面定義的記錄 X,其 3個分量分別為 :x.year ,x.month ,x.day。 域變量的使用和一般的變量一樣 , 即域變量是屬于什么數(shù)據(jù)類型,便可以進行 那種數(shù)據(jù)類型所允許的操作。(二) 記錄的嵌套 當(dāng)一個記錄類型的某一個域類型也是記錄類型的時候,我們說發(fā)生了記錄的嵌 套,看下面的例子: 例 6 某人事登記表可用一個記錄表示 , 其中各項數(shù)據(jù)具有不 同的類型,分別命名一個標(biāo)識符。而其中的 " 出生年月日 "又包括三項數(shù)據(jù),還可 以用一個
27、嵌套在內(nèi)層的記錄表示。具體定義如下 :type sexs=(male,female); date=record year:1900.1999;month:1.12;day:1.31;end;personal=recordname:string15;sex:sexs;birthdate:date;home:string40;end;例 7 設(shè)計一個函數(shù)比較兩個 dates日期類型記錄變量的遲早。 設(shè)函數(shù)名、形參及函數(shù)類型定義為:AearlyB(A,B:dates):boolean;函數(shù)的形參為兩個 dates類型的值參數(shù)。當(dāng)函數(shù)值為 true 時表示日期 A 早于日期 B,否則日期 A 遲于日期
28、 B 或等于日期 B。顯然不能對、兩個記錄變量直接進 行比較,而要依具體的意義逐域處理。 源程序如下:program ex6_7;type dates=recordyear:1900.1999;month:1.12;day:1.31end;var x,y:dates;function AearlyB(A,B:dates):boolean;var earln:boolean;beginearly:=false;if (A.year<B.year) then early:=true;if (A.year=B.year)and(A.month<B.month)then early:=tr
29、ue;if (A.year=B.year)and(A.month=B.month)and(A.day<B.day)then early:=true;AearlyB:=early;end;of AearlyBbeginwrite('Input DATE X(mm-dd-yy):')readln(X.month,X.day,X.year);write('Input DATE Y(mm-dd-yy):')readln(Y.month,Y.day,Y.year);if AearlyB(X,Y) then writeln(Date X early!') el
30、se writeln('Date X not early!'); end.(三) 開域語句 在程序中對記錄進行處理時,經(jīng)常要引用同一記錄中不同的域,每次都按 6.4.1 節(jié)所述的格式引用,非常乏味。為此 Pascal提供了一個 with 語句,可以提供引用 域的簡單形式。開域語句一般形式 : with < 記錄變量名表 > do <語句> 功能: 在 do后的語句中使用 with 后的記錄的域時 , 只要直接寫出域名即可,即可 以省略圖 10.2.2中的記錄變量名和 "." 。說明 : 一般在 with 后只使用一個記錄變量名。如:
31、write('Input year:');readln(x.year); write('Input month:');readln(x.month); write('Input day:');readln(x.day); 可以改寫成 : with x do begin write('Input year:');readln(year); write('Input month:');readln(month); write('Input day:');readln(day);end;設(shè) x,y 是相同
32、類型的記錄變量,下列語句是非法的: with x,y do.; with 后接若干個記錄名時 ,應(yīng)是嵌套的關(guān)系。如有記錄說明: var x:record i:integer;y:record j:0.5; k:real; end;m:real end; 可以使用:with x do beginread(i);with y doread(j,k); readln(m);end; 或簡寫為 : with x,y do readln(i,j,k,m);例 8 讀入 10 個日期,再對每個日期輸出第二天的日期。輸入日期的格式是月、 日、年,如 930199,3 輸出的格式為 10/1/1993。分析:
33、 可用一個記錄變量 today 表示日期。 知道一個日期后要更新為第二天的日 期,應(yīng)判斷輸入的日期是否為當(dāng)月的最后一天,或當(dāng)年的最后一天。 源程序如下 :program ex6_8;type date=record month:1.12;day:1.31; year:1900.1999;end;var today:array1.10of date;i:integer; maxdays:28.31;beginfor i:=1 to 10 do 輸入 10個日期 with todayi do readln(month,day,year);for i:=1 to 10 dowith todayi d
34、o 求第 i 個日期中月份最后一天 maxdays begin case month of1,3,5,7,8,10,12:maxdays:=31;4,6,9,11 :maxdays:=30;2 :if(year mod 400=0) or( year mod 4=0) and(year mod 100<>0) then maxdays:=29 else maxdays:=28;end;if day=maxdays then begin day:=1;if month=12 then begin month:=1;year:=year+1;endelse month:=month+1;endelse day:=day+1; writeln(month,'/',day,'/',ye
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度中醫(yī)婦科師承教育合作合同4篇
- 2025年度智能化生產(chǎn)線設(shè)備采購合同補充協(xié)議3篇
- 2024進出口業(yè)務(wù)銷售合同范本
- 2025不銹鋼水箱售后服務(wù)與維護保養(yǎng)合同范本3篇
- 2024版潛孔鉆租賃業(yè)務(wù)協(xié)議要約一
- 家用電烤盤建設(shè)項目申請報告可行性研究報告
- 2025年度智能駕駛技術(shù)研發(fā)中心高級工程師個人聘用合同3篇
- 2025年度個人抵押貸款合同終止及債權(quán)債務(wù)處理合同范本4篇
- 2025年度個人消費信貸融資委托服務(wù)協(xié)議3篇
- 2025年寧夏公路橋梁建設(shè)有限公司招聘筆試參考題庫含答案解析
- GB/T 12914-2008紙和紙板抗張強度的測定
- GB/T 1185-2006光學(xué)零件表面疵病
- ps6000自動化系統(tǒng)用戶操作及問題處理培訓(xùn)
- 家庭教養(yǎng)方式問卷(含評分標(biāo)準(zhǔn))
- 城市軌道交通安全管理課件(完整版)
- 線纜包覆擠塑模設(shè)計和原理
- TSG ZF001-2006 安全閥安全技術(shù)監(jiān)察規(guī)程
- 部編版二年級語文下冊《蜘蛛開店》
- 鍋爐升降平臺管理
- 200m3╱h凈化水處理站設(shè)計方案
- 個體化健康教育記錄表格模板1
評論
0/150
提交評論