Delphi基本類型--枚舉 子界 集合 數組


 

[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型,那么它的取值范圍一般為-3276832767。而事實上,每個程序中所用的變量的值都有一個確定的范圍。 例如,人的年齡一般為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、子界類型數據的運算規則  
①凡可使用基類型的運算規則同樣適用該類型的子界類型。  
 例如,可以使用整型變量的地方,也可以使用以整型為基類型的子界類型數據。  
   
②對基類型的運算規則同樣適用於該類型的子界類型。  
   
  例如,divmod要求參加運算的數據為整, 因而也可以為整型的任何子界類型數據。  
③基類型相同的不同子界類型數據可以進行混合運算。  
 例如:設有如下說明:  
  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); 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM