版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年超市季節(jié)性促銷員勞動合同3篇
- 二零二五版智能家居砌墻裝修承包合同范本2篇
- 二零二五版3海上貨物運輸合同-海上貨物運輸事故處理及賠償協(xié)議2篇
- 二零二五版綜合性博士后研究人員聘用合同書3篇
- 二零二五版物聯(lián)網(wǎng)技術(shù)培訓(xùn)服務(wù)合同樣本2篇
- 二零二五年度版權(quán)買賣合同(圖書)5篇
- 二零二五版勞動合同法下社保購買期限及權(quán)益保障協(xié)議3篇
- 二零二五年度餐廳線上線下融合推廣承包合同2篇
- 二零二五年網(wǎng)絡(luò)廣告投放合同封面素材2篇
- 二零二五版電影IP授權(quán)與贊助合同3篇
- 稅前工資反算表模板
- 廣東省深圳市2023年中考英語試題(含答案與解析)
- MOOC 電工學(xué)(電氣工程學(xué)概論)-天津大學(xué) 中國大學(xué)慕課答案
- 2019級水電站動力設(shè)備專業(yè)三年制人才培養(yǎng)方案
- 室內(nèi)裝飾裝修施工組織設(shè)計方案
- 洗浴中心活動方案
- 送電線路工程施工流程及組織措施
- 肝素誘導(dǎo)的血小板減少癥培訓(xùn)課件
- 韓國文化特征課件
- 抖音認(rèn)證承諾函
- 清潔劑知識培訓(xùn)課件
評論
0/150
提交評論