




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
7.1結(jié)構(gòu)體7.2結(jié)構(gòu)數(shù)組
7.3結(jié)構(gòu)指針變量7.4聯(lián)合體(共用體)
小結(jié)習(xí)題實訓(xùn)
7.1.1結(jié)構(gòu)體的定義
7.1結(jié)構(gòu)體7.1.2結(jié)構(gòu)類型變量的說明
可以用以下三種方法之一說明結(jié)構(gòu)變量。以上面定義的結(jié)構(gòu)student為例說明如下:
(1)先定義結(jié)構(gòu),再說明結(jié)構(gòu)變量。
(2)在定義的同時說明結(jié)構(gòu)變量。
(3)在定義的同時直接說明結(jié)構(gòu)變量,可以省去結(jié)構(gòu)名。7.1.3結(jié)構(gòu)類型變量的引用
表示結(jié)構(gòu)變量成員的一般形式是:
結(jié)構(gòu)變量名.成員名
其中,“.”運算符相當于中文中的“的”,語句表示取結(jié)構(gòu)變量的指定的成員值。如stu1.sex表示學(xué)生1的性別,stu2.score表示學(xué)生2的成績,stu1.birthay.year則表示學(xué)生1出生的年份,等等。7.1.4結(jié)構(gòu)類型變量的初始化
和簡單變量一樣,結(jié)構(gòu)變量可以在定義時直接初始化,其形式與給數(shù)組變量初始化類似。
【例7-1】錄入項目小組同學(xué)的成績,輸出不及格學(xué)生的詳細信息。
程序的運行結(jié)果如圖7-1所示。圖7-1例7-1程序的運行結(jié)果例7-1只對一個小組中3個同學(xué)的一門功課的成績進行了處理,要是一個班的同學(xué)的成績也用此方法做,那就太麻煩了。
【例7-2】計算學(xué)生的平均成績和不及格的人數(shù)。
程序的運行結(jié)果如圖7-2所示。7.2結(jié)構(gòu)數(shù)組圖7-2例7-2程序的運行結(jié)果
【例7-3】建立同學(xué)通信錄。
用宏定義結(jié)構(gòu)數(shù)組的元素個數(shù),通過鍵盤錄入學(xué)生的姓名和電話,并輸出。假設(shè)有5個同學(xué)的信息存入通信錄中。
程序的運行結(jié)果如圖7-3所示。圖7-3例7-3程序的運行結(jié)果7.3.1結(jié)構(gòu)指針變量的定義
當用一個指針變量指向一個結(jié)構(gòu)變量時,稱之為結(jié)構(gòu)指針變量。
結(jié)構(gòu)指針變量中的值是所指向的結(jié)構(gòu)變量的首地址。通過結(jié)構(gòu)指針即可訪問該結(jié)構(gòu)變量,這與數(shù)組指針和函數(shù)指針的情況是相同的。7.3結(jié)構(gòu)指針變量
【例7-4】用結(jié)構(gòu)指針變量重寫例7-2。
程序運行結(jié)果如圖7-2所示。
與前面討論的各類指針變量相同,結(jié)構(gòu)指針變量也必須在先賦值后才能使用。賦值是把結(jié)構(gòu)變量的首地址賦予該指針變量,不能把結(jié)構(gòu)名賦予該指針變量。7.3.2結(jié)構(gòu)指針變量用作函數(shù)參數(shù)
由于結(jié)構(gòu)允許整體賦值,因此可以將結(jié)構(gòu)作為參數(shù)傳遞給函數(shù)。也可以定義返回值為結(jié)構(gòu)的函數(shù),而用指針變量作函數(shù)參數(shù)進行傳送。這時由實參傳向形參的只是地址,從而減少了時間和空間的開銷,大大提高了運行效率。
【例7-5】
用結(jié)構(gòu)成員作為參數(shù)傳遞給函數(shù)來改寫例7-2。
程序運行結(jié)果如圖7-2所示。
【例7-6】已知兩個復(fù)數(shù)的和是一個復(fù)數(shù),兩個復(fù)數(shù)實部的和構(gòu)成和復(fù)數(shù)的實部,兩個復(fù)數(shù)虛部的和構(gòu)成和復(fù)數(shù)的虛部。若x=a+bi、y=c+di是兩個復(fù)數(shù),其中a、b、c、d均為實數(shù),則和復(fù)數(shù)為(a+c)+(b+d)i。定義一個complex結(jié)構(gòu),用以描述復(fù)數(shù)的結(jié)構(gòu);定義一個add函數(shù),用以求兩個復(fù)數(shù)的和并返回和復(fù)數(shù)。
程序的運行結(jié)果如圖7-4所示。圖7-4例7-6程序的運行結(jié)果班級可用整型量表示,教研室只能用字符類型表示,要求把這兩種類型不同的數(shù)據(jù)都填入“單位”這個變量中,就必須把“單位”定義為包含整型和字符型數(shù)組這兩種類型的“聯(lián)合”。
“聯(lián)合”與“結(jié)構(gòu)”有一些相似之處,但兩者有著本質(zhì)上的不同。7.4聯(lián)合體(共用體)7.4.1聯(lián)合體的定義
7.4.2聯(lián)合變量的聲明
聯(lián)合變量的聲明和結(jié)構(gòu)體的類似,也有三種形式(下面以定義的聯(lián)合類型section為例加以聲明):
(1)定義之后聲明:
unionsectiona,b;
聲明了a和b為聯(lián)合體section類型的變量。
(2)定義的同時聲明:
unionsection
{
intcls;
charoffice[10];
}a,b;
同樣也聲明了聯(lián)合體section的變量a和b。(3)直接聲明:
union
{
intclass;
charoffice[10];
}a,b;7.4.3聯(lián)合變量的使用
對聯(lián)合變量的賦值和使用,都只能是對變量的成員進行。一個聯(lián)合變量,每次只能賦予一個成員值。換句話說,一個聯(lián)合變量的值就是聯(lián)合變量的某一個成員值。
【例7-7】
在學(xué)校全體師生填寫的調(diào)查表中,教師數(shù)據(jù)有姓名、年齡、職業(yè)、教研室4項,學(xué)生有姓名、年齡、職業(yè)、班級4項。
程序的運行結(jié)果如圖7-5所示。圖7-5例7-7程序的運行結(jié)果結(jié)構(gòu)和聯(lián)合是用于處理具有不同數(shù)據(jù)類型的數(shù)據(jù)集合。結(jié)構(gòu)名和結(jié)構(gòu)變量、聯(lián)合名和聯(lián)合變量均是兩個不同的概念,不能混淆。結(jié)構(gòu)名只能表示一個結(jié)構(gòu)形式,編譯系統(tǒng)并不對它分配內(nèi)存空間。只有當某變量被說明為這種類型的結(jié)構(gòu)時,才給該變量分配存儲空間。而在聯(lián)合中,各成員共享一段內(nèi)存空間,它用于動態(tài)地存儲聯(lián)合體中指定成員的值。【小結(jié)】一、填空題
1.下列程序的運行結(jié)果是
。
#include<stdio.h>
structworker
{【習(xí)題】 longintnum;
charname[10];
charsex;
intage;
}li={10303101,"LiNing",'M',19};
voidmain()
{ printf("No:%ld\tName:%s\tSex:%c\tAge:%2d\n",li.num,,li.sex,li.age);
}2.下列程序的運行結(jié)果是
。
#include<stdio.h>
structfruit
{
intnum;
char*name;}f[4]={{10,"Apple"},{20,"Orange"},{30,"Banana"},{40,"Pear"}},*p=f;
voidmain()
{
printf("%d",(*p++).num);
printf("%s",p->name);
printf("%s\n",++p->name);
}3.下列程序的運行結(jié)果是
。
#include<stdio.h>
structstu
{
intx;
int*y;
}*p;
intd[4]={10,20,30,40}; structstua[4]={50,&d[0],60,&d[1],70,&d[2],70,&d[3]};
voidmain()
{
p=a;
printf("%d",++p->x);
printf(",%d",(++p)->x);
printf(",%d\n",++(*p->y));
}4.完成下列程序。
#include<stdio.h>
uniondata
{
inti[2];
floata;
longb;
charc[4];
};voidmain()
{
;
scanf("%d,%d",&u.i[0],&u.i[1]);
printf("i[0]=%d,i[1]=%d\n",u.i[0],u.i[1]);
scanf("%f",&u.a);
printf("a=%f\n",u.a);
scanf(“%ld”,&u.b);
printf(“b=%d\n”,u.b);
;
printf("c[0]=%c,c[1]=%c,c[2]=%c,c[3]=%c\n",u.c[0],u.c[1],u.c[2],u.c[3]);
}5.下面這段程序的運行結(jié)果是
。
#include<stdio.h>
structbook
{
charname[50];
intpages;
};voidmain()
{
structbookbook1={"JaneEyre",385};
printf("%s%d",,book1.pages);
}二、選擇題
1.下列結(jié)構(gòu)定義正確的是()。
A.?struct{intx;inty};
B.?structs{intx;inty;};
C.?structs{intx;inty;} D.?structs{intx,inty;};
2.已知:
structx{inta;intb;}y;
則訪問結(jié)構(gòu)變量y的成員a的表達式正確的是()。
A.?y.a
B.?x.a C.?y->a D.?*y.a3.定義了如下結(jié)構(gòu):
struct
{
intx;
inty;
}mm;
在main()函數(shù)中輸出mm的成員值,正確的是()。
A.
printf("%d",mm);
B.?printf("%d%d",mm);
C.?printf("%d,%d",mm.x,mm.y);
D.?printf("%d,%d",mm->x,mm->y);
4.定義了一個個人信息結(jié)構(gòu)體personal,其中嵌套了一個出生年月的結(jié)構(gòu)birth,在主程序中以“XXXX年XX月XX日”格式輸出person1的出生年月的語句是()。structbirth
{
intyear;
intmonth;
intday;
};
structpersonal{
charID[18];
charname[10];
charsex;
structbirthdate;
}person1;
A.?printf(“%4d%2d%2d”,date.year,date.month,date.day);
B.?printf("%4d%2d%2d",person1.date.year,person1.date.month,person1.date.day);
C.?printf("%4d年%2d月%2d日",person1.date.year,person1.date.month,person1.date.day);
D.?printf("%4d%2d%2d",person1.date.year,年,person1.date.month,月,person1.date.day,日);
5.一個整型數(shù)存儲時占兩個字節(jié),低字節(jié)在左邊,高字節(jié)在右邊,利用聯(lián)合體的特點取出整型數(shù)16961的高字節(jié)和低字節(jié),下列程序運行結(jié)果正確的是()。unionint_byte
{
charc[2];
intd;
}ib;
voidmain()
{ ib.d=16961;
printf(“%d,%c”,ib.c[0],ib.c[0]);
printf(“,%d,%c”,ib.c[1],ib.c[1]);
}
A.?16,
,61,=
B.?61,=,16,
C.?66,B,65,A D.?65,A,66,B三、編程題
1.定義一個三角形結(jié)構(gòu),它有3個成員,分別表示三角形的3條邊。編寫一個函數(shù)來判斷該3條邊是否能構(gòu)成一個直角三角形的函數(shù),并編寫測試程序檢驗。
2.編寫一個工資計算程序,其中有不同的崗位(假設(shè)有工人和技術(shù)員兩個崗位),不同的崗位資金的系數(shù)是不同的(假設(shè)分別是100和150)。編寫一個函數(shù)用于計算工資,并編寫測試程序檢驗。一、實訓(xùn)的目的與要求
1.掌握結(jié)構(gòu)體和聯(lián)合體的定義,理解struct和union是定義的關(guān)鍵字而不是類型;
2.熟悉各種結(jié)構(gòu)、聯(lián)合類型成員的引用方法;
3.應(yīng)用結(jié)構(gòu)體變量、指針及數(shù)組解決實際問題?!緦嵱?xùn)】二、實訓(xùn)內(nèi)容
1.在“學(xué)生成績管理信息系統(tǒng)”中,學(xué)生的信息由一個結(jié)構(gòu)類型定義,通過不同的結(jié)構(gòu)數(shù)組來存放學(xué)生的各種信息,也就是記錄,每個結(jié)構(gòu)數(shù)組的一個元素就是一條學(xué)生記錄。假設(shè)學(xué)生結(jié)構(gòu)成員有學(xué)號、姓名、成績1、成績2、總成績和名次。并錄入幾條信息進行測試。(1)學(xué)生信息結(jié)構(gòu)定義為:
structstudent
{
charID[10]; //學(xué)號
charName[10] ; //姓名
floatscore1; //成績1
floatscore2; //成績2
floatsum; //總成績
intorder; //名次
};
(2)每個學(xué)生的信息就是這個student結(jié)構(gòu)中所有成員的集合,因此用一個結(jié)構(gòu)數(shù)組來存放所有學(xué)生的信息,學(xué)生的人數(shù)可以用字符常量在文件開始定義。
(3)使用循環(huán)結(jié)構(gòu)和scanf()語句錄入學(xué)生的信息:
for(inti=0;i<num;i++)
{
scanf("%s%s%f%f%f%d",stu[i].ID,stu[i].Name,&stu[i].score1,
&stu[i].score2,&stu[i].sum,&stu[i].order);
}
(4)同樣使用循環(huán)結(jié)構(gòu)來顯示學(xué)生的信息,作為listAll()的函數(shù)體。
(5)對于單條信息的顯示,只要去掉循環(huán)頭就可以了,只是單條記錄顯示時要確定記錄的位置。(6)通過學(xué)號返回數(shù)組下標的函數(shù)是按如下定義的:
intintByID(charid[])
{
for(inti=0;i<num;i++)
?{
if(strcmp(stu[i].ID,id)==0)
returni;
?}
??return-1;
}
(7)用同樣的方法定義通過姓名返回數(shù)組下標的函數(shù):intintByName(charname[])。
(8)計算總分的函數(shù)很簡單,定義如下
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 社區(qū)醫(yī)學(xué)課題申報書范文
- 寫勞務(wù)合同合同范本
- 議政調(diào)研課題申報書
- 課題申報書課題名稱字體
- 市課題申報書
- 2024用電信息采集終端
- 廚房用油供貨合同范本
- 壓濾機合同范本
- 合同范本文書
- 勞動合同范例錯
- 行人過街調(diào)查表
- 弟子規(guī)全文及解釋精簡打印版
- 《畜牧獸醫(yī)行政法規(guī)》教案
- 《祖父的園子》PPT課件【精美版】
- 新概念英語第一冊期末測試試卷附答案
- GB/T 1689-1998硫化橡膠耐磨性能的測定(用阿克隆磨耗機)
- FZ/T 74001-2020紡織品針織運動護具
- 強制執(zhí)行申請書表格
- 二年級看圖寫話春天來了(課堂PPT)
- 房建市政項目全過程工程咨詢招標文件范本
- 2023年南充臨江東方發(fā)展實業(yè)集團有限公司招聘筆試題庫及答案解析
評論
0/150
提交評論