[plain] view plain copy <strong>根據枚舉定義集合 </strong> TMyColor = (mcBlue, mcRed); TMyColorSet = set of TMyColor ; [plain] view plain copy <strong>根據枚舉定義數組</strong> type TMyEnum = (red,green,blue); {定義枚舉} procedure TForm1.Button1Click(Sender: TObject); const ColorArr: array[TMyEnum] of string=('紅','綠','藍'); {定義數組} var myEnum: TMyEnum; {定義枚舉變量} begin for myEnum := Low(ColorArr) to High(ColorArr) do begin ShowMessage(ColorArr[myEnum]); //myEnum變化時,就得到它對應的描述 end; [plain] view plain copy <strong>枚舉類型</strong> Pascal程序不僅用於數值處理,還更廣泛地用於處理非數值的數據。例如,性別、月份、星期幾、顏色、單位名、學歷、職業等。 1、枚舉類型的定義 格式: type 枚舉類型標識符=(標識符1,標識符2,…,標識符n) 2、枚舉類型數據特點 ① 枚舉元素只能是標識符; 例如,下列類型定義是合法的: type days=(sun,mon,tue,wed,thu,fri,sat); colors=(red,yellow,blue,white,black,green); 而下列類型定義是錯誤的: type colortype=('red','yellow','blue','white'); numbers=(1,3,5,7,9); 定義枚舉類型時列出的所有枚舉元素構成了這種枚舉類型的值域(取值范圍)。 ② 枚舉類型屬於順序類型 根據定義類型時各枚舉元素的排列順序確定它們的序號,且序號從0開始。 例如,定義type days=(sun,mon,tue,wed,thu,fri,sat); 則, ord(sun)=0,ord(mon)=1,……,以此類推。 枚舉類型中的第一個元素無前趨,最后一個元素無后繼。 pred(sat)=fri; succ(sun)=mon; ord(sat)=6; ③ 同一個枚舉元素不能出現在兩個或兩個以上的枚舉類型定義中。如下列定義是錯誤的: type color1=(red,yellow,white); color2=(blue,red,black); 因為red屬於枚舉類型color1和 color2 ④ 枚舉類型變量只能進行賦值運算和關系運算,不能進行算術運算和邏輯運算。 在枚舉元素比較時,實際上是對其序號的比較。 例如定義如下: type days=(sun,mon,tue,wed,thu,fri,sat); colors=(red,yellow,blue,white,black,green); var color:colors; weekday:days; 則下面語句是合法的: weekday:=mon; if weekday=sun then write('rest'); 而下面語句是不合法的: mon:=1; 錯把枚舉值當成變量名; weekday:=blue; 枚舉值blue不屬於枚舉變量weekday的值域; read(color); 枚舉類型變量 不能用讀語句進行賦值; write(weekday); writeln(blue);不能通過寫語句輸出枚舉類型的變量值和枚舉值。 ⑤ 可以把變量的說明與類型的定義合並在一起,如: var holiday,workday:(sun,mon,tue,wed,thu,fri,sat); color:(red,yellow,blue,white,black,green); 對枚舉數據的輸入與輸出可通過間接方式進行。輸入時,一般可輸入一個代碼,通過程序進行轉換,輸出時,也只是打印出與枚舉元素相對應的字符串。這在后面的例題中將有使用示例。 二、枚舉類型的應用 例1、輸入今天是星期幾的序號,輸出明天是星期幾的英文單詞(星期天序號為0)。 type weekday=(sun,mon,tue,wed,thu,fri,sat); var i : integer; today,tomorrow : weekday; begin writeln('What date is it'); readln(i); case i of { 根據輸入轉換成枚舉型 } 0:today:=sun; 1:today:=mon; 2:today:=tue; 3:today:=wed; 4:today:=thu; 5:today:=fri; 6:today:=sat; end; if (today=sat) then tomorrow:=sun else tomorrow:=succ(today); write('The tomorrow is '); case tomorrow of sun:writeln('sunday'); mon:writeln('monday'); tue:writeln('tuesday'); wed:writeln('wednesay'); thu:writeln('thursday'); fri:writeln('friday'); sat:writeln('saturday'); end; end. 枚舉類型是一種有序類型,所以枚舉類型的變量可以作為循環變量。 [plain] view plain copy <strong>子界類型</strong> 如果我們定義一個變量為integer型,那么它的取值范圍一般為-32768~32767。而事實上,每個程序中所用的變量的值都有一個確定的范圍。 例如,人的年齡一般為1到120歲,一年中的月數為1到12月,一月中的天數為1到31天等等。 如果能在程序中對所用的變量的值域作具體規定,就便於檢查出那些不合法的數據,這就能更好地保證程序運行的正確性且在一定程度上節省內存空間。 子界類型能很好解決上面的問題。此外,在數組的定義中,常用到子界類型,以規定數組下標的范圍。 1、定義格式: type 子界類型標識符=常量1..常量2 常量1稱為子界的下界,常量2稱為子界的上界; ①下界和上界必須是同一順序類型(該類型稱為子界類型的基類型),且上界的序號必須大於下界的序號。 例如 type age=1..100; letter='a' ..'z'; ②可以直接在變量說明中定義子界類型。如: type letter='a'..' z '; var ch1,ch2:letter; 可以合並成: var ch1,ch2:'a'..'d'; 2、子界類型數據的運算規則 ①凡可使用基類型的運算規則同樣適用該類型的子界類型。 例如,可以使用整型變量的地方,也可以使用以整型為基類型的子界類型數據。 ②對基類型的運算規則同樣適用於該類型的子界類型。 例如,div,mod要求參加運算的數據為整, 因而也可以為整型的任何子界類型數據。 ③基類型相同的不同子界類型數據可以進行混合運算。 例如:設有如下說明: var x:1..100; y:1..500; z:1..1000; a:integer; 則下列語句是合法的: a:=Sqr(x)+y+z; z:=x+y 下列語句: y:=x+z+a; 當x+y+a的值在1~500范圍內時是合法的,否則會出錯。 三、子界類型應用舉例 例1、使用子界型情況語句,當輸入月、日、年(10 30 1986),輸出30 Oct 1986。 var month:1..12; day:1..31; year:1900..2003; begin write('Enter date(mm dd yy):'); readln(month,day,year); write(day); case month of 1: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:write('Oct':5); 11:write('Nov':5); 12:write('Dec':5); end; writeln(year:7); end. 例2、將一個四位的十六進制數轉換成十進制數。 Var ch:char; n:1..4; d1,d2,d3,d4,t:0..15; s:real; Begin Write('The hex number is '); For n=1 to 4 do Begin { 把四位的十六進制數分四次作為字符讀入 } Read(ch); write(ch); { 分別轉換為十進制的數d1,d2,d3,d4, } if (ch>='0') and (ch<='9')then t:=ord(ch)-48; if (ch>='a') and (ch<='z')then t:=ord(ch)-87; if (ch>='A') and (ch<='Z')then t:=ord(ch)-55; case n of 1:di:=t; 2:d2:=t; 3:d3:=t; 4:d4:=t; end, end; s:=d1*16*16*16+d2*16*16+d3*16+d4; writeln('dec:',s) end.
數組 type TBigByteArray = array [0 .. MaxInt - 1] of byte TBytes = TBigByteArray; PBigByteArray = ^TBigByteArray; var PText: PBigByteArray //方法一:指針操作 分配空間 GetMem(PText, 10); //方法二:動態數組定義 推薦這種方式,代碼簡潔多了 TextArr: array of byte; SetLength(TextArr, 10);