




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度北京市建筑行業(yè)勞動(dòng)合同培訓(xùn)與考核規(guī)范
- 拆除窗戶勞務(wù)合同范本
- 泵房土建施工合同范本
- 承包燒烤廚房合同范本
- 煤炭居間協(xié)議合同范本
- 項(xiàng)目epc模式合同范本
- 房產(chǎn)抵押轉(zhuǎn)讓合同范本
- 2025建筑工程項(xiàng)目合同簽訂適用的合同法規(guī)參考
- 2025年標(biāo)準(zhǔn)個(gè)人房屋租賃合同范本參考
- 高中地理第三章同步學(xué)案以畜牧業(yè)為主的農(nóng)業(yè)地域類型
- 中國(guó)古典民族樂器分類琵琶二胡樂理文化傳承知識(shí)介紹實(shí)用課件兩篇
- 《中醫(yī)診斷學(xué)課件》
- MQL4命令中文詳解手冊(cè)
- 保安外包服務(wù)投標(biāo)方案(技術(shù)標(biāo))
- 2023年浙江杭州市屬事業(yè)單位統(tǒng)一招聘工作人員371人筆試參考題庫(kù)(共500題)答案詳解版
- 辦公耗材采購(gòu) 投標(biāo)方案(技術(shù)方案)
- 國(guó)家開放大學(xué)《人文英語3》章節(jié)測(cè)試參考答案
- 幼兒繪本故事之十二生肖
- 軍事地形學(xué)課件
- 崗位安全操作規(guī)程
- 促進(jìn)林業(yè)產(chǎn)業(yè)高質(zhì)量發(fā)展的建議
評(píng)論
0/150
提交評(píng)論