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

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論