非常慚愧
接觸Delphi也有一年多了,但是對於其基本類型的使用也是淺嘗輒止,
現在補上吧,亡羊補牢爲時不晚!
根據枚舉定義集合
TMyColor = (mcBlue, mcRed);
TMyColorSet = set of TMyColor ;
根據枚舉定義數組
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]);
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 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);