《C語言程序設(shè)計 》課件-第7章_第1頁
《C語言程序設(shè)計 》課件-第7章_第2頁
《C語言程序設(shè)計 》課件-第7章_第3頁
《C語言程序設(shè)計 》課件-第7章_第4頁
《C語言程序設(shè)計 》課件-第7章_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

項目七結(jié)構(gòu)體——學(xué)生信息登記表任務(wù)一了解結(jié)構(gòu)體任務(wù)二結(jié)構(gòu)體變量的引用任務(wù)三輸入學(xué)生信息任務(wù)四輸出學(xué)生信息任務(wù)五項目功能實現(xiàn)任務(wù)六項目擴展思考與練習(xí)

在現(xiàn)實生活中,常常會遇到具有不同數(shù)據(jù)類型的一組數(shù)據(jù),如表7.1所示的學(xué)生信息登記表1,包括姓名、學(xué)號、年齡、性別、成績,顯然該數(shù)據(jù)無法用前面所學(xué)的單一數(shù)據(jù)類型來表示。

任務(wù)一了解結(jié)構(gòu)體

結(jié)構(gòu)體是一種復(fù)合的數(shù)據(jù)類型,也是由若干“成員”組成的一個構(gòu)造類型。每一個“成員”的數(shù)據(jù)類型可以不同,允許是一個基本數(shù)據(jù)類型或者是一個構(gòu)造類型,如數(shù)組、指針或其他結(jié)構(gòu)體等。

結(jié)構(gòu)體類型不同于基本類型,它有以下幾個特點。

(1)結(jié)構(gòu)體由若干“成員”組成,它們都屬于一種已經(jīng)定義的數(shù)據(jù)類型。

(2)系統(tǒng)并沒有預(yù)先定義結(jié)構(gòu)體類型,必須由設(shè)計者事先進行“構(gòu)造”。

(3)要使用結(jié)構(gòu)體類型數(shù)據(jù),必須要先定義結(jié)構(gòu)體,然后再定義此種類型的變量。

1.結(jié)構(gòu)體類型定義

結(jié)構(gòu)體的定義形式如下:

struct結(jié)構(gòu)名

{

類型成員變量名1;

類型成員變量名2;

類型成員變量名n;

};

在這個結(jié)構(gòu)定義中,struct是一個關(guān)鍵字,用于定義結(jié)構(gòu)體的類型,“成員”定義以分號表示結(jié)束。根據(jù)結(jié)構(gòu)體定義,前面表7.1所示的學(xué)生信息登記表(1)就可以用結(jié)構(gòu)體來表示了,定義情況如下:

struct

stu

/*定義學(xué)生信息結(jié)構(gòu)體類型*/

{

char

num[10];

/*學(xué)號*/

charname[20];

/*姓名*/

charsex[4];

/*性別*/

intage; /*年齡*/

intscore; /*成績*/

};

在這個定義中,定義了一個名為stu的學(xué)生信息結(jié)構(gòu)體類型,它由5個成員組成。第一個成員為num,為字符數(shù)組;第二個成員為name,為字符數(shù)組;第三個成員為sex,為字符數(shù)組;第四個成員為age,為整型變量;第五個成員為score,為整型變量。結(jié)構(gòu)體定義之后,就可以同其他數(shù)據(jù)類型一樣,來定義該類型的結(jié)構(gòu)體變量了。

2.結(jié)構(gòu)類型變量的說明

說明結(jié)構(gòu)類型變量有以下兩種常用方法,我們以上面定義的stu為例來加以說明。

(1)在定義結(jié)構(gòu)類型的同時說明結(jié)構(gòu)變量。例如,

說明:上面定義了4個stu結(jié)構(gòu)體類型的變量boy1、boy2、s和p,其中p為結(jié)構(gòu)體指針變量,s為結(jié)構(gòu)體數(shù)組變量,共有s[0]~s[3]4個元素,每個數(shù)組元素都具有stu的結(jié)構(gòu)體形式。

(2)先定義結(jié)構(gòu),再說明結(jié)構(gòu)變量。例如,

structstu /*定義學(xué)生信息結(jié)構(gòu)類型*/

{

charnum[10]; /*學(xué)號*/

charname[20]; /*姓名*/

charsex[4]; /*性別*/

intage; /*年齡*/

intscore; /*成績*/

};

structstuboy1,boy2,*p,s[4];

說明:在這里同樣定義了4個結(jié)構(gòu)體變量,定義時,structstu為一個整體,表示一個結(jié)構(gòu)體類型stu,不能省略前面的關(guān)鍵字struct。

3.結(jié)構(gòu)體變量的初始化

結(jié)構(gòu)體類型變量同數(shù)組一樣,可以在定義時對其進行初始化,也可以將定義與初始化分開。

(1)在定義結(jié)構(gòu)體變量時可對其進行初始化。

例如,

(2)將結(jié)構(gòu)體變量定義與初始化分開。例如,

4.結(jié)構(gòu)體變量的存儲

結(jié)構(gòu)體變量也是一種變量,在定義結(jié)構(gòu)體類型時并不會分配存儲空間,只有在進行結(jié)構(gòu)體變量定義時,才會分配內(nèi)存空間,其形式與數(shù)組類似,是按結(jié)構(gòu)體成員定義的先后順序連續(xù)分配空間的,從而使用該結(jié)構(gòu)變量存儲“成員”數(shù)據(jù)。

例如,定義表7.1的學(xué)生信息結(jié)構(gòu)體變量boy1、boy2,代碼如下:

structstu /*定義學(xué)生信息結(jié)構(gòu)類型*/

{

charnum[10]; /*學(xué)號*/

charname[20]; /*姓名*/

charsex[4]; /*性別*/

intage; /*年齡*/

intscore; /*成績*/

}boy1,boy2;

則boy1、boy2在內(nèi)存中的存儲形式如圖7.1所示。圖7.1結(jié)構(gòu)體的存儲形式

任務(wù)二結(jié)構(gòu)體變量的引用

結(jié)構(gòu)體成員的引用方式有如下兩種:

(1)采用“.”運算符引用結(jié)構(gòu)體變量成員的一般形式:結(jié)構(gòu)變量名.成員名

(2)采用“->”運算符引用結(jié)構(gòu)體指針變量成員的形式:結(jié)構(gòu)指針變量名->成員名

1.引用結(jié)構(gòu)變量成員的一般形式

“.”運算符中,“.”可以理解為“的”,即結(jié)構(gòu)變量名的成員名。例如,

注意:s為數(shù)組,不能用s.age=19來賦值;sex為字符數(shù)組,不能用boy1.sex="男"來直接賦值,應(yīng)該使用strcpy(boy1.sex,

"男")來實現(xiàn)。

2.引用結(jié)構(gòu)體指針變量成員的形式

在聲明一個結(jié)構(gòu)體變量為指針類型時,則稱之為結(jié)構(gòu)體指針變量,此時可以采用“->”運算符來引用其“成員”;“->”運算符是由減號和大于號組成的。與前面討論的各類指針變量相同,結(jié)構(gòu)體指針變量也必須要先賦值后才能使用,它的值為指向的結(jié)構(gòu)體變量的首地址。

例如,

說明:結(jié)構(gòu)指針變量名->成員名也可用(*結(jié)構(gòu)指針變量).成員名來代替。

上例中,scanf("%s",p1->sex)可以寫為scanf("%s",

(*p1).sex);

p1->age=19可寫為(*p1).age;

(p2+1)->score=80可寫為(*(p2+1)).score=80或s[1].score=80。

注意:(*p)兩側(cè)的括號不可少,因為成員符“.”的優(yōu)先級高于“*”。如去掉括號寫作*p.age則等效于*(p.age),這樣意義就完全不同了。

任務(wù)三輸入學(xué)生信息

根據(jù)前面所學(xué)知識,就可以實現(xiàn)對本項目(學(xué)生信息登記表)的輸入功能。通過分析可以發(fā)現(xiàn),表7.1所示的學(xué)生信息有多條記錄(多個學(xué)生信息),一個學(xué)生用一個變量顯然是不可取的,所以需要用結(jié)構(gòu)體數(shù)組變量來實現(xiàn)對多條記錄的輸入,可以通過以下兩種常用方法來實現(xiàn)。

(1)如前面所提到的,通過在定義結(jié)構(gòu)體及聲明數(shù)組變量時,對數(shù)組內(nèi)容進行初始化來實現(xiàn)(嚴(yán)格來講這種方法并不符合我們的要求,我們的目標(biāo)是要通過運行時來輸入)。具體程序?qū)崿F(xiàn)如下:

或在main()內(nèi)對數(shù)組初始化:

說明:這種實現(xiàn)方法只能實現(xiàn)學(xué)生記錄數(shù)目確定的情況。

(2)另一種方法:采用循環(huán)語句加scanf()函數(shù)來實現(xiàn)。具體程序?qū)崿F(xiàn)如下:

運行結(jié)果如圖7.2所示。

圖7.2運行結(jié)果

任務(wù)四輸出學(xué)生信息

要實現(xiàn)學(xué)生信息的輸出,可以根據(jù)結(jié)構(gòu)體成員的引用方法,采用循環(huán)語句加printf()函數(shù)來實現(xiàn)。程序?qū)崿F(xiàn)如下:

任務(wù)五項目功能實現(xiàn)

將任務(wù)三和任務(wù)四的任務(wù)分別實現(xiàn)之后,本項目的功能就自然實現(xiàn)了。完整程序如下:

程序運行結(jié)果如圖7.3所示。

圖7.3程序運行結(jié)果

通過上面程序分析可知,該程序只能實現(xiàn)具體已知數(shù)目記錄。我們可以對上述程序進行改進,以達(dá)到隨機可控,如每次輸入一個記錄前提示是否要繼續(xù)輸入;同時,通過變量控制得到輸入的記錄數(shù)目。改進后的程序如下:

程序運行結(jié)果如圖7.4和圖7.5所示。

按“1”輸入學(xué)生信息,如圖7.4所示。

圖7.4按“1”輸入學(xué)生信息

按“2”輸出學(xué)生信息,如圖7.5所示。

圖7.5按“2”輸出學(xué)生信息

任務(wù)六項目擴展

1.根據(jù)學(xué)生成績進行排序?qū)W生成績只是學(xué)生信息的一個“成員”,如果根據(jù)成績好壞對成績進行排序,此時沒有交換整個學(xué)生記錄,會導(dǎo)致學(xué)生信息錯亂,所以需按成績好壞交換整個學(xué)生記錄,這就需要定義一個結(jié)構(gòu)體類型的中間變量,實現(xiàn)記錄的整體交換。具體程序如下(降序):

程序運行結(jié)果如圖7.6和圖7.7所示。

排序之前如圖7.6所示。

圖7.6排序之前

排序之后如圖7.7所示。

圖7.7排序之后

2.結(jié)構(gòu)體嵌套

結(jié)構(gòu)體成員也可以又是一個結(jié)構(gòu)體,即形成了結(jié)構(gòu)體的嵌套。如表7.2所示,學(xué)生成績由語文、數(shù)學(xué)、英語三門課程組成,顯然成績就是一個結(jié)構(gòu)體類型的成員。

程序運行結(jié)果如圖7.8所示。

圖7.8程序運行結(jié)果

3.聯(lián)合體

為了增加程序設(shè)計時數(shù)據(jù)處理的靈活性,在C語言中,可以將不同數(shù)據(jù)類型的數(shù)據(jù)使用共同的存儲區(qū)域,這種構(gòu)造數(shù)據(jù)類型稱為共用體,也即聯(lián)合體。

在實際問題中有很多這樣的例子。如在學(xué)院系部的教師和學(xué)生信息登記表中,填寫內(nèi)容包括姓名、年齡、性別、職業(yè)、單位,其中,“職業(yè)”一項可分為“教師”和“學(xué)生”兩類。對學(xué)生來說,“單位”一項應(yīng)填入班級編號(用整型表示);對教師來說,“單位”一項應(yīng)填入部門名稱(某教研室名稱),如表7.3所示。這就要求把這兩種類型不同的數(shù)據(jù)都填入“單位”這個變量中,就必須把“單位”定義為包含整型和字符型數(shù)組這兩種類型的“聯(lián)合體”。

“聯(lián)合體”與“結(jié)構(gòu)體”在定義、變量說明、引用上是相似的,但兩者也有本質(zhì)上的不同。在“結(jié)構(gòu)體”中,各成員有各自的內(nèi)存空間,一個結(jié)構(gòu)變量的總長度是各成員長度之和。而在“聯(lián)合體”中,各成員共享一段內(nèi)存空間,一個聯(lián)合變量的長度等于各成員中最長的長度。

1)聯(lián)合體的定義

在這里,定義了一個名為perdata的聯(lián)合體類型,它含有兩個成員,一個是名為class的整型成員;另一個是名為office的字符數(shù)組型成員。對聯(lián)合體定義之后,即可對聯(lián)合體變量進行說明,被說明為perdata類型的變量,可以存放整型量class或存放字符數(shù)組office。

2)聯(lián)合體變量的說明

聯(lián)合體變量的說明和結(jié)構(gòu)變量的說明方式相似,如perdata類型的聯(lián)合體變量的直接說明方式如下。

說明:a、b變量均為perdata類型,a、b變量的長度應(yīng)等于perdata的成員中最長的長度,即等于20個字節(jié)。

注意:

①聯(lián)合體采用覆蓋技術(shù)實現(xiàn)聯(lián)合體類型變量各成員的內(nèi)存共享,所以在某一時刻,存放的和起作用的是最后一次存入的成員。如果執(zhí)行以下語句:

strcpy(a.office,”軟件技術(shù)教研室”);a.class=123;

a.class才是有效成員。

②聯(lián)合體中各成員由于共享同一內(nèi)存空間,所以各成員的地址相同。

4.枚舉型

在實際問題中,有些變量的取值被限定在一個有限的范圍內(nèi)。例如,一個星期只有七天,一年只有十二個月等,這些值可以用有限個常量來述敘,此時可以用枚舉型來定義。

1)枚舉型定義

枚舉型定義格式如下:

enum枚舉名

{枚舉值表};

例如,

enumweekday

{Sun,Mon,Tue,Wed,Thu,Fri,Sat};

該枚舉名為weekday,枚舉值共有7個,即一周中的7天。凡被說明為weekday類型變量的取值只能是7天中的某一天。

2)枚舉型變量說明

枚舉型變量的說明同結(jié)構(gòu)體和聯(lián)合體一樣,枚舉變量也可用不同的方式說明,即先定義后說明、同時定義說明或直接說明。設(shè)有變量a、b、c被說明為上述的weekday,可采用下述任一種方式。

定義時直接說明:

enumweekday

{Sun,Mon,Tue,Wed,Thu,Fri,Sat}a,b,c;

先定義后說明:

enumweekday

{Sun,Mon,Tue,Wed,Thu,Fri,Sat};

enumweekdaya,b,c;

說明:

①枚舉型僅適用于取值有限的數(shù)據(jù)。

②枚舉型中的元素不是變量,也不是字符串,它只代表一個常量符號。

③枚舉元素作為常量是有值的,這些值通常是定義時的順序號(從0開始),所以枚舉元素可以進行大小比較,序號大者為大。

④枚舉元素的值也是可以人為改變的,在定義時由程序指定。例如,

enumweekday

{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat};

則Sun=7,Mon=1,從Tue=2開始,依次遞增為3、4、5、6。

思?考?與?練?習(xí)

一、選擇題

1.下面對結(jié)構(gòu)變量的敘述錯誤的是()。

A.相同類型的結(jié)構(gòu)變量間可以相互賦值

B.通過結(jié)構(gòu)變量,可以任意引用它的成員

C.結(jié)構(gòu)變量中某個成員同與其類型相同的簡單變量間可相互賦值

D.結(jié)構(gòu)變量與簡單變量間可以賦值

2.以下各選項企圖說明一種新的類型名,其中正確的是()。

A.typedefv1int; B.typedefv2=int;

C.typedefintv3; D.typedefv4:int;

3.設(shè)有下列結(jié)構(gòu)型變量w的定義,則表達(dá)式"sizeof(w)"的值是()。

struct{longnum;charname[15];union{floatx;shortz;}yz;}w;

A.19 B.20

C.23 D.25

4.若有結(jié)構(gòu)類型定義如下:structbd{intx;floaty;}r,*p=&r;,那么,對r中的成員x的正確引用是()。

A.(*p).r.x B.(*p).x

C.p->r.x D.p.r.x

5.設(shè)有以下結(jié)構(gòu)類型說明和變量定義,則變量a在內(nèi)存中所占的字節(jié)數(shù)是()。

structstud{charnum[6];ints[4];doubleave;}a;

A.22 B.18

C.14 D.28

6.設(shè)有以下說明語句structex{intx;floaty;charz;}example;,則下面的敘述中不正確的是()。

A.structex是結(jié)構(gòu)體類型 B.example是結(jié)構(gòu)體類型名

C.x、y、z都是結(jié)構(gòu)體成員名

D.struct是結(jié)構(gòu)體類型的關(guān)鍵字

7.在TurboC中有如下定義:uniondat{inti;charch;floatf;}x;x在內(nèi)存中所占的字節(jié)數(shù)為()。

A.4 B.7

C.8 D.6

8.有如下結(jié)構(gòu)類型定義以及有關(guān)的語句:

structms{intx;int*p;}s1,s2;s1.x=10;s2.x=s1.x+10;

s1.p=&s2.x;s2.p=&s1.x;*s1.p+=*s2.p;

執(zhí)行以上語句后,s1.x和s2.x的值應(yīng)該是()。

A

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論