非常慚愧
接觸Delphi也有一年多了,但是對於其基本類型的使用也是淺嘗輒止,
現在補上吧,亡羊補牢為時不晚!
根據枚舉定義集合 TMyColor = (mcBlue, mcRed); TMyColorSet = set of TMyColor ;
根據枚舉定義數組typeTMyEnum = (red,green,blue); {定義枚舉}procedure TForm1.Button1Click(Sender: TObject);const ColorArr: array[TMyEnum] of string=('紅','綠','藍'); {定義數組}var myEnum: TMyEnum; {定義枚舉變數}beginfor myEnum := Low(ColorArr) to High(ColorArr) dobegin ShowMessage(ColorArr[myEnum]);end;
枚舉類型 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. 枚舉類型是一種有序類型,所以枚舉類型的變數可以作為迴圈變數。
子界類型如果我們定義一個變數為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 doBegin { 把四位的十六進位數分四次作為字元讀入 }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 of1: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);