枚舉子界集合記錄_第1頁
枚舉子界集合記錄_第2頁
枚舉子界集合記錄_第3頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、在前面幾章中我們用到了整型、實型、布爾型、字符型的數(shù)據(jù)。以上數(shù)據(jù)類型是由pascal規(guī)定的標(biāo)準(zhǔn)數(shù)據(jù)類型,只要寫integer、real、boolean、char , pascal編譯系統(tǒng)就能識別并按這 些類型來處理。pascal還允許用戶定義一些類型,這是其它一些語言所沒有的,這就使得pascal使用靈活、功能豐富。一、枚舉類型隨著計算機(jī)的不斷普及,程序不僅只用于數(shù)值計算,還更廣泛地用于處理非數(shù)值的數(shù)據(jù)。例如:性別、月份、星期幾、顏色、單位名、學(xué)歷、職業(yè)等,都不是數(shù)值數(shù)據(jù)。在其它程序設(shè)計語言中,一般用一個數(shù)值來代表某一狀態(tài),這種處理方法不直觀,易讀性差。 如果能在程序中用自然語言中有相應(yīng)含義的

2、單詞來代表某一狀態(tài),則程序就很容易閱讀和理解。 也就是說,事先考慮到某一變量可能取的值,盡量用自然語言中含義清楚的單詞來表示它的每一 個值,這種方法稱為枚舉方法,用這種方法定義的類型稱枚舉類型。枚舉類型是一種很有實用價值的數(shù)據(jù)類型,它是pascal 一項重要創(chuàng)新。(一)枚舉類型的定義枚舉類型是一種 自定義類型,要使用枚舉類型當(dāng)然也要先說明枚舉類型,枚舉類型的一般格式:(標(biāo)識符1,標(biāo)識符2,標(biāo)識符n)說明:括號中的每一個標(biāo)識符都稱為枚舉元素或枚舉常量 定義枚舉類型時列出的所有枚舉元素構(gòu)成了這種枚舉類型的值域(取值范圍),也就是說,該類型的變量 所有可能的取值都列出了 枚舉元素只能是標(biāo)識符(除系統(tǒng)

3、標(biāo)識符),不能是數(shù)值常量和字符常量例如,下列類型定義是合法的:type days=(s un,mon ,tue,wed,thu,fri,sat);colors=(red,yellow,blue,white,black,gree n);而下列類型定義是錯誤的(因為枚舉元素非標(biāo)識符):type colortype=('red','yellow','blue','white');numbers=(1,3,5,7,9);ty=(for,do,while);(二) 枚舉類型變量定義了枚舉類型,就可以把某些變量說明成該類型。如:var hol

4、iday,workday:day;in color:colors;也可以把 變量的說明與類型的定義合并在一起,如:var holiday,workday:(s un,mon ,tue,wed,thu,fri,sat);in color:(red,yellow,blue,white,black,gree n);(三) 枚舉類型的性質(zhì)1、枚舉類型屬于順序類型根據(jù)定義類型時各枚舉元素的排列順序確定它們的序號,第一個枚舉元素的序號為0。例如:設(shè)有定義type days=(s un,mon ,tue,wed,thu,fri,sat);則:ord(s un)=0,ord(mon)=1,ord(sat)=6

5、;succ(s un)=mon, succ(m on)=tue,succ(fri)=sat;pred(m on)=sun, pred(tue)=mon, pred(sat)=fri。應(yīng)注意的是:枚舉類型中的第一個元素?zé)o前趨,最后一個元素?zé)o后繼,卻pred(sun)和succ(sat)皆是錯誤的2、對枚舉類型只能進(jìn)行賦值運算和關(guān)系運算:一旦定義了枚舉類型及這種類型的變量,則在語句部分只能對枚舉類型變量賦值,或進(jìn)行關(guān)系運算,不能進(jìn)行算術(shù)運算和邏輯運算。在枚舉 元素比較時,實際上是對其序號的比較。當(dāng)然,賦值或比較時,應(yīng)注意類型一致。例如,設(shè)程序 有如下說明:type days=(s un,mon ,

6、tue,wed,thu,fri,sat);colors=(red,yellow,blue,white,black,gree n);var color:colors;weekday:days;則下列語句是合法的:weekday:=mon; if weekday=s un the n write('rest');weekday<>sun而下面語句是不合法的:mon: =weekday;mon :=1;if weekday=s un or sat the n write('rest');sun>redweekday<>color3、枚舉變

7、量的值 只能用賦值語句 來獲得也就是說,不能用 read(或readln)讀一個枚舉型的值。同樣,也不能用write(或writeln)輸出一個枚舉型的值。如write(red)是非法的,會發(fā)生編譯錯誤。千萬不要誤認(rèn)為,該語句的結(jié)果是輸出"red"三個字符。但對枚舉數(shù)據(jù)的輸入與輸出可通過間接方式進(jìn)行。輸入時,一般可輸入一個代碼,通過程序 進(jìn)行轉(zhuǎn)換,輸出時,也只是打印出與枚舉元素相對應(yīng)的字符串。這在后面的例題中將有使用示例。4、同一個枚舉元素不能出現(xiàn)在兩個或兩個以上的枚舉類型定義中,如:type color1=(red,yellow,white);color2=(blue,r

8、ed,black);是不允許的,因為red屬于兩個枚舉類型。(四) 、枚舉類型應(yīng)用舉例【例1】一周七天用sun、mon tue、wed、thu、fri、sat表示,要求利用枚舉類型編程:當(dāng)輸 入星期幾的數(shù)字,能輸出它的后一天是星期幾(也用英文表示)。源程序如下:program ex6_1;type week=(s un,mon ,tue,wed,thu,fri,sat);vari : in teger;day,sucday : week;beginwrite('What date is it');readln(i);case i of 根據(jù)輸入 i 轉(zhuǎn)換成枚舉型 1:day:=

9、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:=sunelse sucday:=succ(day); 輸出明天是星期幾 write('The next day is ');case sucday ofsun:writeln('sunday');mon:writeln('monday');tue:writeln('tuesday');wed:writeln(&

10、#39;wednesay');thu:writeln('thursday');fri:writeln('friday');sat:writeln('saturday');end;end.評注:程序中變量 day 、sucday 分別表示今天、明天。、子界類型節(jié)的定義表示法,取值范圍為-3276832767 ;而事實上,每個程序中所用的變量的值都有一個確定的范圍;例如 :人的年齡一般不超過150;一個班級的學(xué)生不超過100人;一年中的月數(shù)不超過12; 一月中的天數(shù)不超過31,等等如果我們能在程序中對所用的變量的值域作具體規(guī)定的話,就便于檢查

11、出那些不合法的數(shù)據(jù),這就能更好地保證程序運行的正確性;而且在一定程度上還會節(jié)省內(nèi)存空間。子界類型就很好解決如上問題。此外,在數(shù)組的定義中,常用到子界類型,以規(guī)定數(shù)組下標(biāo) 的范圍,上一章有關(guān)數(shù)組知識中我們已用到。(一)子界類型定義子界類型的一般格式:<常量1>.<常量2>說明:其中常量1稱為子界的下界,常量2稱為子界的上界。 下界和上界必須是同一順序類型(該類型稱為子界類型的基類型),且上界的序號 必須大于下界的序號。例如,下列說明:type age=0.5.150;letter=O.'z:Iet1='z'.'a:都是錯誤的。 可以直接在變

12、量說明中定義子界類型。如:type letter='a'.'d'var ch1,ch2:letter;可以合并成:var ch1,ch2:'a'.'d:當(dāng)然,將類型定義和變量定義分開,則更為清晰。(二)子界類型數(shù)據(jù)的運算規(guī)則1、凡可使用基類型的運算規(guī)則同樣適用該類型的子界類型:例如,可以使用整型變量的地方,也可以使用以整型為基類型的子界類型數(shù)據(jù)。2、對基類型的運算規(guī)則同樣適用于該類型的子界類型:例如,div , mod要求參加運算的數(shù)據(jù)為整 , 因而也可以為整型的任何子界類型數(shù)據(jù)。3、基類型相同的不同子界類型數(shù)據(jù)可以進(jìn)行混合運算:例如,設(shè)

13、有如下說明typea=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ù)字,大小寫字母和特殊字符進(jìn)行判別的程序。源程序如下:program cas;var c:char;beginreadln(c);case c of'0'.'9':writeln('digits');'A'.

14、'Z':writeln('UPPER-CASELETTERS');'a'.'z':writeln('lower-caseletters');esle writeln('special charactors');end;end.【例 3】使用子界型情況語句,當(dāng)輸入月、日、年 (10 30 1986) ,輸出 30 Oct 1986 源程序如下 :program ex6_3;var month:1.12;date:1.31;year:1900.1999;beginwrite('Enter dat

15、e(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':5);6:write('Jun':5);7:write('Jul':5);8:write('Aug':5);9:write('Sep':5);10:writ

16、e('Oct':5);11:write('Nov':5);12:write('Dec':5);end;writeln(year:7);end.枚舉類型和子界類型均是順序類型,在前面一章數(shù)組的定義時,實際上我們已經(jīng)用到了子界類型,數(shù)組中的下標(biāo)類型確切地講可以是枚舉類型或子界類型,大多數(shù)情況下用子界類型。如有 如下說明:type color=(red,yellow,blue,white,black);vara:arraycolorof integer;b:array1.100of color;都是允許的。三、集合類型集合是由具有某些共同特征的元素構(gòu)成

17、的一個整體。在 pascal 中,一個集合是由具有同一有 序類型的一組數(shù)據(jù)元素所組成,這一有序類型稱為該集合的基類型。(一) 集合類型的定義和變量的說明集合類型的一般形式為:set of < 基類型 >說明:基類型可以是任意順序類型,而不能是實型或其它構(gòu)造類型;同時,基類型的數(shù)據(jù)的序號 不得超過 255。例如下列說明是合法的type letters=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; 與其它自定義類

18、型一樣,可以將類型說明與變量說明合并在一起。如:type numbers=set of 0.9;var s:numbers;與 var s:set of 0.9;等價。(二) 集合的值集合的值是用 "" 和""括起來,中間為用逗號隔開的若干個集合的元素。如: 空集1,2,3'a','e','i','o','u'都是集合。說明:集合的值放在一對方括號中,各元素之間用逗號隔開 在集合中可以沒有任何元素,這樣的集合稱為空集 在集合中,如果元素的值是連續(xù)的,則可用子界型的表示方法表示

19、。例如: 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 :的值相等。 每個元素可用基類型所允許的表達(dá)式來表示。如1,1+2,4 、: ch、: succ(ch)。(三) 集合的運算1、 賦值運算:只能通過賦值語句給集合變量賦值,不能通過讀語句賦值,也不能通過 write(或 writeln) 語句直接輸出集合變量的值2、集合的并、交、差運算:可以對集合進(jìn)行并、交、差三種運算,每種運算都只能有一

20、個運算符、兩個運算對象,所得結(jié)果仍為集合。三種運算符分別用""、 " "、 ""表示 ;注意它們與算術(shù)運算的區(qū)別3、集合的關(guān)系運算:集合可以進(jìn)行相等或不相等、包含或被包含的關(guān)系運算,還能測試一個元素是否在集合中。所用的運算符分別是:=、V、 =、V =、in它們都是二目運算,且前4個運算符的運算對象都是相容的集合類型,最后一個運算符的右 邊為集合,左邊為與集合基類型相同的表達(dá)式?!纠?4】設(shè)有如下說明:type weekday=(sun,mon,tue,wed,thu,fri,sat);week=set of weekday;subn

21、um=set of 1.50;寫出下列表達(dá)式的值 :sun,sat + sun,tue,fri sun,fri * mon,tue sun, sat * sun .sat sun - mon,tue (5) mon - mon,tue (6) sun .sat - mon,sun, sat (7) 1,2,3,5 = : 1,5,3,2 (8) 1,2,3,4 : <> : 1.4 :(9) 1,2,3,5 >= : 1.3 1.5 : <= : 1.4 :(11) 1,2,3 : <= : 1.3 :(12) 2 in : 1.10 答:表達(dá)式的值分別是 : s

22、un,sat,tue,fri sun,sat sun5 6 tue.fri7 TRUE FALSE9 TRUE FALSE1 TRUE2 TRUE例 5】輸入一系列字符,對其中的數(shù)字字符、字母字符和其它字符分別計數(shù),輸入“?”后結(jié)源程序如下:program ex10_2;var id,il,io:integer;ch:char;letter:set of char;digit:set of '0'.'9'beginletter='a'.'z','A'.'Z'digit:='0'.&#

23、39;9'id:=0;il:=0;io:=0;repeatread(ch);if ch in letterthen il:=il+1else if ch in digitthen id:=id+1else io:=io+1;until ch='?'writeln('letter:',il,'digit:',id,'Other:',io);end.四、記錄類型在程序中對于組織和處理大批量的數(shù)據(jù)來說,數(shù)組是一種十分方便而又靈活的工具,但是數(shù) 組在使用中有一個基本限制,這就是:一個 數(shù)組中的所有元素都必須具有相同的類型 。但在實

24、際 問題中可能會遇到另一類數(shù)據(jù),它是由性質(zhì)各不相同的成份組成的,即它的各個成 份可能具有不 同的類型。例如,有關(guān)一個學(xué)生的數(shù)據(jù)包含下列項目:學(xué)號 字符串類型 姓名 字符串類型年齡 整型性別字符型成績實型數(shù)組Pascal給我們提供了一種叫做記錄的結(jié)構(gòu)類型;在一個記錄中,可以包含不同類型的并且互 相相關(guān)的一些數(shù)據(jù)。(一)記錄類型的定義在pascal中,記錄由一組稱為“域”的分量組成,每個域可以具有不同的類型,記錄類型定 義的一般形式:record<域名1>:<類型1><域名2>:<類型2><域名n>:<類型n>en d;說明:

25、域名也稱域變量標(biāo)識符,應(yīng)符合標(biāo)識符的語法規(guī)則;在同一個記錄中類型中,各個域不能取相同的名,但在不同的記錄類型中,兩個類型中的域名可以相同 記錄類型的定義和記錄變量可以合并為一個定義,如:type date=recordyear:1900.1999;mo nth:1.12;day:1.31en d;var x:date;可以合并成:var x: recordyear:1900.1999;mo nth:1.12;day:1.31end; 對記錄的操作,除了可以進(jìn)行整體賦值,只能對記錄的分量一一域變量進(jìn)行。 域變量的表示方法如下:記錄變量名 . 域名如前面定義的記錄 X, 其 3 個分量分別為 :x

26、.year ; x.month ; x.day 域變量的使用和一般的變量一樣, 即域變量是屬于什么數(shù)據(jù)類型, 便可以進(jìn)行那種數(shù)據(jù)類型所允許的操作。(二) 記錄的嵌套 當(dāng)一個記錄類型的某一個域類型也是記錄類型的時候,我們說發(fā)生了記錄的嵌套,看下面的 例子:【例 6】某人事登記表可用一個記錄表示,其中各項數(shù)據(jù)具有不同的類型, 分別命名一個標(biāo)識符。而其中的“出生年月日”又包括三項數(shù)據(jù),還可以用一個嵌套在內(nèi)層的記錄表示。具體定義如下 :type sexs=(male,female);date=recordyear:1900.1999;month:1.12;day:1.31;end;personal=r

27、ecord name:string15; sex:sexs;birthdate:date; home:string40;end;【例 7】設(shè)計一個函數(shù)比較兩個 dates 日期類型記錄變量的遲早。 設(shè)函數(shù)名、形參及函數(shù)類型定義為:AearlyB(A,B:dates):boolean;A早于日期B,否則日而要依具體的意義函數(shù)的形參為兩個 dates 類型的值參數(shù)。 當(dāng)函數(shù)值為 true 時表示日期 期A遲于日期B或等于日期 B顯然不能對A、E兩個記錄變量直接進(jìn)行比較,逐域處理。源程序如下:program ex6_7;type dates=recordyear:1900.1999;month:1.

28、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:=true;if (A.year=B.year)and(A.month=B.month)and(A.day<B.day)then early:=true; AearlyB:=early;end;of Aearl

29、yBbeginwrite('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!') else writeln('Date X not early!');end.(三) 開域語句在程序中對記錄進(jìn)行處理時,經(jīng)常要引用同一記錄中不同的域,每次都按,非常乏味。為此 Pascal 提供

30、了一個 with 語句,可以提供引用域的簡單形式。 開域語句一般形式: with < 記錄變量名表 > do<語句 >功能:在 do 后的語句中使用 with 后的記錄的域時 , 只要直接寫出域名即可,即可以省略圖II II"." 。說明:一般在with后只使用一個記錄變量名。如:write('Input year:');readln(x.year);write('Input month:');readln(x.month);write('Input day:');readln(x.day);可以改寫成

31、 :with x dobeginwrite('Input year:');readln(year);write('Input month:');readln(month);write('Input day:');readln(day);end; 設(shè) x,y 是相同類型的記錄變量,下列語句是非法的:with x,y do.; with后接若干個記錄名時,應(yīng)是嵌套的關(guān)系。如有記錄說明:var x:recordi:integer;y:recordj:0.5;k:real;end;m:realend;可以使用 :with x dobeginread(i)

32、;with y doread(j,k);readln(m);end;或簡寫為 :with x,y do readln(i,j,k,m);【例 8】讀入 10 個日期,再對每個日期輸出第二天的日期。輸入日期的格式是月、日、年,如9口30口 19 93,輸出的格式為 10/1/1993分析 :可用一個記錄變量 today 表示日期。 知道一個日期后要更新為第二天的日期,應(yīng)判斷輸 入的日期是否為當(dāng)月的最后一天,或當(dāng)年的最后一天。源程序如下 :program ex6_8;type date=recordmonth:1.12;day:1.31;year:1900.1999;end;var today:a

33、rray1.10of date;i:integer; maxdays:28.31;beginfor i:=1 to 10 do 輸入 10 個日期 with todayi doreadln(month,day,year);for i:=1 to 10 dowith todayi do求第 i 個日期中月份最后一天 maxdaysbegincase 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:=29else maxdays:=28;end;if day=maxdaysthen begin day:=1; if month=12then beginmonth:=1;year:=year+1;endelse month:=month+1;endelse day:=day+1;writeln(month,'/'

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論