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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

(2)系統(tǒng)并沒有預(yù)先定義結(jié)構(gòu)體類型,必須由設(shè)計(jì)者事先進(jìn)行“構(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;

};

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

struct

stu

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

{

char

num[10];

/*學(xué)號(hào)*/

charname[20];

/*姓名*/

charsex[4];

/*性別*/

intage; /*年齡*/

intscore; /*成績(jī)*/

};

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

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

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

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

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

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

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

{

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

charname[20]; /*姓名*/

charsex[4]; /*性別*/

intage; /*年齡*/

intscore; /*成績(jī)*/

};

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

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

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

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

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

例如,

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

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

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

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

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

{

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

charname[20]; /*姓名*/

charsex[4]; /*性別*/

intage; /*年齡*/

intscore; /*成績(jī)*/

}boy1,boy2;

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

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

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

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

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

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

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

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

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

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

在聲明一個(gè)結(jié)構(gòu)體變量為指針類型時(shí),則稱之為結(jié)構(gòu)體指針變量,此時(shí)可以采用“->”運(yùn)算符來引用其“成員”;“->”運(yùn)算符是由減號(hào)和大于號(hào)組成的。與前面討論的各類指針變量相同,結(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è)的括號(hào)不可少,因?yàn)槌蓡T符“.”的優(yōu)先級(jí)高于“*”。如去掉括號(hào)寫作*p.age則等效于*(p.age),這樣意義就完全不同了。

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

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

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

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

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

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

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

圖7.2運(yùn)行結(jié)果

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

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

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

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

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

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

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

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

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

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

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

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

任務(wù)六項(xiàng)目擴(kuò)展

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

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

排序之前如圖7.6所示。

圖7.6排序之前

排序之后如圖7.7所示。

圖7.7排序之后

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

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

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

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

3.聯(lián)合體

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

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

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

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

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

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

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

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

注意:

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

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

a.class才是有效成員。

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

4.枚舉型

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

1)枚舉型定義

枚舉型定義格式如下:

enum枚舉名

{枚舉值表};

例如,

enumweekday

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

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

2)枚舉型變量說明

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

定義時(shí)直接說明:

enumweekday

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

先定義后說明:

enumweekday

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

enumweekdaya,b,c;

說明:

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

②枚舉型中的元素不是變量,也不是字符串,它只代表一個(gè)常量符號(hào)。

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

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

enumweekday

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

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

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

一、選擇題

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

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

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

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

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

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

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

評(píng)論

0/150

提交評(píng)論