列舉型別和子界型別

2021-04-12 14:16:13 字數 3308 閱讀 4820

列舉型別和子界型別

一、型別定義

二、列舉型

三、子界型

四、型別相容和賦值相容

一、型別定義

1、型別定義的語法圖

型別定義的語法格式:

type

《識別符號1>=《型別1>;

《識別符號2>=《型別2>;

……《識別符號n>=《型別n>;

2、格式說明:type是保留字型別定義符。型別名必須遵循識別符號的起名規則,「=」右邊的型別就是使用者描述的資料型別。執行此語句後我們就可以用「=」左邊的識別符號代表右邊的集合了。

使用者自定義型別就是使用者遵循pascal語言規則結合使用者需要自己定義新的型別。前面的標準型別,系統已經定義好了,我們可以直接使用它說明變數,使用此類資料。而使用者自定義型別要先定義型別,才能說明變數,使用此類資料。使用者自定義型別有兩類:列舉型別和子界型別。

二、列舉型別

在程式設計中,程式設計師常常會發現用4種標準型別很難自然地描述所要處理的某種資料。例如,表示星期幾,在程式設計中,我們一般用整型數0、1、2、3、4、5、6表示不是很直觀,1既可表示數值1,又可以表示星期一,閱讀者要根據實際情況進行區分。在

pascal中提供了形象表示這類資料的型別既列舉型別。

列舉型別顧名思義就是將需要的資料一一枚舉出來,組成乙個型別。

列舉型別的形式:

(識別符號1,……,識別符號n);

例如:

type

daystype=(sunday,monday,tuesday,wednesday,thursday,friday,saturday);

列舉元素只能是識別符號,而不能是數值常量或字元常量。例如以下的定義是錯誤的:

type daystype=('sun','mon','tue','wed','thu','fri','sat');

列舉元素是識別符號,不要把作為列舉元素的識別符號視作變數名,它不能被賦值。同乙個列舉元素不能出現在兩個或兩個以上的列舉型別定義中。例如以下的定義是錯誤的:

type daytype1=(monday,tuesday);

daytype2=(monday,wednesday);

可以將列舉型別的定義和變數的定義結合在一起。例如:

var a:(monday,tuesday,sunday)

列舉型別屬於順序型別。根據定義型別時各列舉元素的排列順序確定它們的序列,序列號從0開始

例如:已經定義daystype

ord(sunday)=0,succ(sunday)=monday,pred(friday)=thursday;

但是列舉型別中的第乙個元素沒有前趨,最後乙個元素沒有後繼。pascal不允許直接讀寫列舉值,所以列舉值的輸出常用case語句間接的輸出。列舉值的輸入,則要一一判斷讀入字元是否是列舉型別的識別符號。若是才能賦給列舉變數,否則就會出錯。

例如:列舉值的輸出

case day of

sunday:write('sunday');

monday:write('monday');

tuesday:write('tuesday');

wednesday:write('wednesday');

thursday:write('thursday');

friday:write('friday');

saturday:write('saturday');

end;

三、子界型別

子界型別是由整型、字元型、列舉型、布林型的兩個常量指定該型別的值域區間。子界型別的形式:

常量1..常量n

兩個常量必須是同一種順序型別。例如:a..b,要求a<=b

例如:type

a=1..3;

b='a'..'d';

乙個子界型別繼承它的常量型別的運算子和標準函式,常量型別相容的不同子界型別可以混合運算,可以賦值。可以將子界型別的定義和變數的定義結合在一起。例如:

var a:1..9;

例 按月、日、年順序讀入一日期,輸出該日期是這一年中的第幾天。

program date;

var year:0..2010;

month,i:1..12;

day:1..31;

dayth:integer;

begin

read(month,day,year);

dayth:=0;

for i:=1 to month-1 do

case i of

1,3,5,7,8,10,12:dayth:=dayth+31;

2:if ((year mod 4=0)and(year mod 100<>0)or(year mod 400 =0)

then dayth:=dayth+29

else dayth=:=dayth+28;

4,6,9,11:dayth:=dayth+30;

end;

dayth:=dayth+day;

writeln(dayth)

end.

四、型別相容和賦值相容

1.型別相容性

型別相容是對參加同一運算的兩個物件的型別要求。設有兩個變數,如果滿足下列條件之一,就說這兩個變數的型別相容。

(1)兩個變數的型別相同

a.兩個變數被同一型別說明。

例如:var a,b:1..30;

b.兩個變數的型別是同一型別識別符號。

例如:var a:1..30; b:1..30;

c.兩個變數的型別是不同的型別識別符號,但在型別定義中已經說明兩個識別符號相同。

例如:type date=1..100;

range=date;

var m:data;n:range;

(2)乙個變數的型別是另乙個變數的子界。

(3)兩個變數的型別都是同一基型別的子界。

(4)兩個變數的型別是基型別相容的集合型別。

(5)兩個變數的型別是成分相同的串型別。

2.賦值相容性

賦值相容是對賦值操作的兩個物件的型別要求。設賦值語句「:=」左邊的變數型別為t,右邊表示式的型別為e,若型別t和型別e滿足下列條件之一,則稱他們是賦值相容的。

(1)t和e是相同的型別,而且型別不是檔案型別,也不是具有檔案類成分的構造型別。

(2)t是實型,而e是整型或整型的子界。

(3)t和e是型別相容的順序型別,並且e的值不超出t所定義的值的範圍

(4)t和e是型別相容的集合型別,並且e的值不超出t所定義的值的範圍

(5)t和e是型別相容的串型別。

當t和e是順序型別或都是集合型別時,不僅要求這兩個型別是相容的,而且要求e的值不超出t所定義的值的範圍;否則將產生型別溢位,而這種錯誤只能在你執行程式時進行檢查,因此你必須要避免不發生這種錯誤。

列舉和類型別

1.定義和初始化列舉 關鍵字enum 預設地,第乙個列舉成員賦值為0,後面的每個列舉成員賦的值比前面的大1。2.列舉成員是常量 可以為乙個或多個列舉成員提供初始值,用來初始化列舉成員的值必須是乙個常量表示式。enum forms 在列舉型別forms中,顯示將shape賦值為1。其他列舉成員隱式初始...

擴充套件型別 列舉型別

擴充套件型別 型別別名 列舉 介面 類。在型別約束位置,會產生重複 可以使用型別別名解決該問題 邏輯含義和真實的值產生了混淆,會導致修改真實的值的時候,產生大量的修改 字面量型別不會進入到編譯結果,比如我們想迴圈便利它的值,那麼就不行。所以需要使用列舉 enum gender gender.male...

C 列舉型別和共用體型別

我們主要學習的是 1.列舉型別 2.共用體型別 a.列舉型別的定義以及列舉型別的格式?列舉型別提供了一組常量的集合。c 中可以使用關鍵字enum定義列舉型別,下面是列舉型別的格式 enum 列舉型別名 enum date b.定義列舉型別時,可以給常量提供乙個整數值。如果沒有提供整數值,預設第乙個常...