![第十一章結(jié)構(gòu)體與共同體課件C程序設(shè)計課件_第1頁](http://file4.renrendoc.com/view/370c06f558fc89ea1d59fe8943e58f58/370c06f558fc89ea1d59fe8943e58f581.gif)
![第十一章結(jié)構(gòu)體與共同體課件C程序設(shè)計課件_第2頁](http://file4.renrendoc.com/view/370c06f558fc89ea1d59fe8943e58f58/370c06f558fc89ea1d59fe8943e58f582.gif)
![第十一章結(jié)構(gòu)體與共同體課件C程序設(shè)計課件_第3頁](http://file4.renrendoc.com/view/370c06f558fc89ea1d59fe8943e58f58/370c06f558fc89ea1d59fe8943e58f583.gif)
![第十一章結(jié)構(gòu)體與共同體課件C程序設(shè)計課件_第4頁](http://file4.renrendoc.com/view/370c06f558fc89ea1d59fe8943e58f58/370c06f558fc89ea1d59fe8943e58f584.gif)
![第十一章結(jié)構(gòu)體與共同體課件C程序設(shè)計課件_第5頁](http://file4.renrendoc.com/view/370c06f558fc89ea1d59fe8943e58f58/370c06f558fc89ea1d59fe8943e58f585.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
結(jié)構(gòu)體與共用體
結(jié)構(gòu)體共用體枚舉
第十一章結(jié)構(gòu)體與共用體本章要求:1、掌握結(jié)構(gòu)體的概念,會使用結(jié)構(gòu)體指針,結(jié)構(gòu)體數(shù)組。2、鏈表的概念,熟練掌握用指針處理鏈表。3、了解共用體的概念。4、了解枚舉類型。5、會用typedef定義新數(shù)據(jù)類型。11結(jié)構(gòu)體第十一章結(jié)構(gòu)體與共用體本章要求:1、掌握結(jié)構(gòu)體的1從基本數(shù)據(jù)類型到抽象數(shù)據(jù)類型二進制數(shù)在早期的機器指令及匯編語言中,數(shù)據(jù)對象均用二進制數(shù)表示,沒有類型的概念基本數(shù)據(jù)類型在高級語言中引入了基本數(shù)據(jù)類型:整型、實型、字符型等基本數(shù)據(jù)類型不能方便的解決所有問題,用戶自己構(gòu)造數(shù)據(jù)類型-復(fù)合數(shù)據(jù)類型表示復(fù)雜的數(shù)據(jù)對象,數(shù)組、指針也可算作此類,然而最典型的代表就是“結(jié)構(gòu)體”,抽象數(shù)據(jù)類型(AbstractDataType,簡稱ADT)在復(fù)合數(shù)據(jù)類型基礎(chǔ)上增加了對數(shù)據(jù)的操作類——跨時代的進步從基本數(shù)據(jù)類型到抽象數(shù)據(jù)類型二進制數(shù)基本數(shù)據(jù)類型用戶自己構(gòu)造2思考一個問題在程序里表示一個人(姓名、年齡、性別、……),怎么表示?想表示多個人呢?如何用計算機程序?qū)崿F(xiàn)下述表格的管理?
表11-1某學(xué)校學(xué)生成績管理表學(xué)號姓名性別入學(xué)時間計算機原理英語數(shù)學(xué)物理1令狐沖男1999908372822林平之男1999789288783岳靈珊女1999897298664任瑩瑩女1999789587905……6……思考一個問題在程序里表示一個人(姓名、年齡、性別、……),怎3數(shù)組的解決方法int stuId[30];/*最多可以管理30個學(xué)生,每個學(xué)生的學(xué)號用數(shù)組的下標(biāo)表示*/char stuName[30][10]; char stuSex[30][2]; int timeOfEnter[30];/*入學(xué)時間用int表示*/int scoreCom[30];/*計算機原理課的成績*/int scoreEng[30];/*英語課的成績*/ int scoreMath[30];/*數(shù)學(xué)課的成績*/int scoreMus[30]; /*物理課的成績*/數(shù)組的解決方法int stuId[30];/*最多可以4數(shù)組的解決方法數(shù)據(jù)的內(nèi)存管理方式90788978……83927295……72889887……82786690……1234……令狐沖林平之岳靈珊任瑩瑩……男男女女……1999199919991999……分配內(nèi)存不集中,尋址效率不高結(jié)構(gòu)顯得比較零散,不容易管理數(shù)組的解決方法數(shù)據(jù)的內(nèi)存管理方式90788978……8395希望的內(nèi)存分配圖
1令狐沖男1999908372822林平之男1999789288783岳靈珊女1999897298664任瑩瑩女199978958790希望的內(nèi)存分配圖1令狐沖男1999908372822林平之6結(jié)構(gòu)體的解決方法structSTUDENT
{
intstudID;/*每個學(xué)生的序號*/
charstudName[10];/*每個學(xué)生的姓名*/charstudSex[4];/*每個學(xué)生的性別*/ inttimeOfEnter;/*每個學(xué)生的入學(xué)時間*/ intscoreCom;/*每個學(xué)生的計算機原理成績*/ intscoreEng;/*每個學(xué)生的英語成績*/ intscoreMat; /*每個學(xué)生的數(shù)學(xué)成績*/ intscoreMus;/*每個學(xué)生的物理成績*/
};struct
STUDENT是一個類型struct
STUDENTstudents[4];students[0].studentID
students[0].scoreComputer它們都是變量,一般稱為結(jié)構(gòu)的成員變量結(jié)構(gòu)體的解決方法structSTUDENT
{
i7一、定義一個結(jié)構(gòu)的一般形式在實際問題中,一組數(shù)據(jù)往往具有不同的數(shù)據(jù)類型。例如,學(xué)生登記表中,姓名應(yīng)為
學(xué)號可為
年齡應(yīng)為
性別應(yīng)為
成績可為另一種構(gòu)造數(shù)據(jù)類型——“結(jié)構(gòu)(structure)”或叫“結(jié)構(gòu)體”
它相當(dāng)于其它高級語言中的記錄?!敖Y(jié)構(gòu)”是一種構(gòu)造類型,它是由若干“成員”組成的。每一個成員可以是一個基本數(shù)據(jù)類型或者又是一個構(gòu)造類型。結(jié)構(gòu)既是一種“構(gòu)造”而成的數(shù)據(jù)類型,那么在說明和使用之前必須先定義它,也就是構(gòu)造它。如同在說明和調(diào)用函數(shù)之前要先定義函數(shù)一樣。顯然不能用一個數(shù)組來存放這一組數(shù)據(jù)。因為數(shù)組中各元素的類型和長度都必須一致,以便于編譯系統(tǒng)處理。為了解決這個問題第十一章結(jié)構(gòu)體與共用體字符型;整型或字符型;整型或?qū)嵭?;整型;字符型;一、定義一個結(jié)構(gòu)的一般形式在實際問題中,一組數(shù)據(jù)往往具有8在這個結(jié)構(gòu)定義中,結(jié)構(gòu)名為stu,該結(jié)構(gòu)由4個成員組成。第一個成員為num,整型變量;第二個成員為name,字符數(shù)組;第三個成員為sex,字符變量;第四個成員為score,實型變量。應(yīng)注意在括號后的分號是不可少的。結(jié)構(gòu)定義之后,即可進行變量說明。凡說明為結(jié)構(gòu)stu的變量都由上述4個成員組成。由此可見
結(jié)構(gòu)是一種復(fù)雜的數(shù)據(jù)類型,是數(shù)目固定,類型不同的若干有序變量的集合。定義一個結(jié)構(gòu)的一般形式為:
struct結(jié)構(gòu)名
{成員表列};成員表列由若干個成員組成,每個成員都是該結(jié)構(gòu)的一個組成部分。對每個成員也必須作類型說明,其形式為:
類型說明符成員名;成員名的命名應(yīng)符合標(biāo)識符的書寫規(guī)定
structstu{intnum;charname[20];charsex;floatscore;};例如:復(fù)習(xí):在這個結(jié)構(gòu)定義中,結(jié)構(gòu)名為stu,該結(jié)構(gòu)由4個成員組成。第一9二、結(jié)構(gòu)類型變量的說明說明結(jié)構(gòu)變量有以下三種方法。以上面定義的stu為例來加以說明。1、先定義結(jié)構(gòu),再說明結(jié)構(gòu)變量如:說明了兩個變量boy1和boy2為stu結(jié)構(gòu)類型。也可以用宏定義使一個符號常量來表示一個結(jié)構(gòu)類型。structstu{intnum;charname[20];charsex;floatscore;};structstuboy1,boy2;例如:#defineSTUstructstuSTU{intnum;charname[20];charsex;floatscore;};STUboy1,boy2;二、結(jié)構(gòu)類型變量的說明說明結(jié)構(gòu)變量有以下三種方法。以上面定義102、在定義結(jié)構(gòu)類型的同時說明結(jié)構(gòu)變量structstu{
intnum;charname[20];charsex;floatscore;}boy1,boy2;這種形式的說明的一般形式為:
struct結(jié)構(gòu)名
{
成員表列
}變量名表列;結(jié)構(gòu)類型變量例如:還可以定義
structstuboy3,boy4;2、在定義結(jié)構(gòu)類型的同時說明結(jié)構(gòu)變量結(jié)構(gòu)類型變量例如:還可以113、直接說明結(jié)構(gòu)變量例如:struct{intnum;charname[20];charsex;floatscore;
}boy1,boy2;這種形式的說明的一般形式為:
struct
{成員表列
}變量名表列;結(jié)構(gòu)類型變量第三種方法與第二種方法的區(qū)別在于第三種方法中省去了結(jié)構(gòu)名,而直接給出結(jié)構(gòu)變量。
3、直接說明結(jié)構(gòu)變量結(jié)構(gòu)類型變量第三種方法與第二種方法的區(qū)別12說明了boy1,boy2變量為stu類型后,即可向這兩個變量中的各個成員賦值。在上述stu結(jié)構(gòu)定義中,所有的成員都是基本數(shù)據(jù)類型或數(shù)組類型。三種方法中說明的boy1,boy2變量都具有下圖所示的結(jié)構(gòu):說明了boy1,boy2變量為stu類型13成員也可以又是一個結(jié)構(gòu),即構(gòu)成了嵌套的結(jié)構(gòu)。例如,下圖給出了另一個數(shù)據(jù)結(jié)構(gòu)。struct{intnum;charname[20];charsex;
structdatebirthday;floatscore;}boy1,boy2;按圖可給出以下結(jié)構(gòu)定義:structdate{intmonth;intday;intyear;};首先定義一個結(jié)構(gòu)date,由month(月)、day(日)、year(年)三個成員組成。成員birthday被說明為data結(jié)構(gòu)類型成員也可以又是一個結(jié)構(gòu),即構(gòu)成了嵌套的結(jié)構(gòu)。stru14
成員名可與程序中其它變量同名,互不干擾。例:
structyeardate{intnum;charname[20];charsex;
structdatebirthday;floatscore;}boy1,boy2;intscore;成員名可與程序中其它變量同名,互不干擾。s15三、結(jié)構(gòu)變量成員的表示方法在程序中使用結(jié)構(gòu)變量時,往往不把它作為一個整體來使用。在ANSIC中除了允許具有相同類型的結(jié)構(gòu)變量相互賦值以外,一般對結(jié)構(gòu)變量的使用,包括賦值、輸入、輸出、運算等都是通過結(jié)構(gòu)變量的成員來實現(xiàn)的。表示結(jié)構(gòu)變量成員的一般形式是:
結(jié)構(gòu)變量名.成員名如果成員本身又是一個結(jié)構(gòu)則必須逐級找到最低級的成員才能使用。
即第一個人出生的月份成員可以在程序中單獨使用,與普通變量完全相同。例如:
boy1.num即第一個人的學(xué)號
boy2.sex即第二個人的性別例如:
boy1.birthday.month三、結(jié)構(gòu)變量成員的表示方法在程序中使用結(jié)構(gòu)變量時,16四、結(jié)構(gòu)變量的賦值結(jié)構(gòu)變量的賦值就是給各成員賦值??捎幂斎胝Z句或賦值語句來完成?!纠?1.1】給結(jié)構(gòu)變量賦值并輸出其值。main(){structstu{intnum;char*name;charsex;floatscore;}boy1,boy2;
boy1.num=102;="Zhangping";printf(“輸入性別and分數(shù)\n“);scanf("%c%f",&boy1.sex,&boy1.score);
boy2=boy1;printf(“學(xué)號=%d\n姓名=%s\n",boy2.num,);printf(“性別=%c\n分數(shù)=%f\n",boy2.sex,boy2.score);}用賦值語句給num和name兩個成員賦值name是一個字符串指針變量用scanf函數(shù)動態(tài)地輸入sex和score成員值然后把boy1的所有成員的值整體賦予boy2最后分別輸出boy2的各個成員值本例表示了結(jié)構(gòu)變量的賦值、輸入和輸出的方法四、結(jié)構(gòu)變量的賦值結(jié)構(gòu)變量的賦值就是給各成員賦值??捎幂?7五、結(jié)構(gòu)變量的初始化和其他類型變量一樣,結(jié)構(gòu)變量可以在定義時進行初始化賦值。【例11.2】對結(jié)構(gòu)變量初始化。main(){
structstu
/*定義結(jié)構(gòu)*/
{intnum;char*name;charsex;floatscore;
}
boy2,boy1={102,"Zhangping",'M',78.5};boy2=boy1;printf("Number=%d\nName=%s\n",boy2.num,);printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);}五、結(jié)構(gòu)變量的初始化和其他類型變量一樣,結(jié)構(gòu)變量可以在定義時18六、結(jié)構(gòu)數(shù)組的定義
數(shù)組的元素也可以是結(jié)構(gòu)類型的。因此可以構(gòu)成結(jié)構(gòu)型數(shù)組。結(jié)構(gòu)數(shù)組的每一個元素都是具有相同結(jié)構(gòu)類型的下標(biāo)結(jié)構(gòu)變量。在實際應(yīng)用中,經(jīng)常用結(jié)構(gòu)數(shù)組來表示具有相同數(shù)據(jù)結(jié)構(gòu)的一個群體。如一個班的學(xué)生檔案,一個車間職工的工資表等。方法和結(jié)構(gòu)變量相似,只需說明它為數(shù)組類型即可。
structstu{intnum;char*name;charsex;floatscore;}boy[5];定義了一個結(jié)構(gòu)數(shù)組boy,共有5個元素:boy[0]~boy[4]每個數(shù)組元素都具有structstu的結(jié)構(gòu)形式例如:六、結(jié)構(gòu)數(shù)組的定義數(shù)組的元素也可以是結(jié)構(gòu)類型19structstu{intnum;char*name;charsex;floatscore;}boy[5]={{101,"Liping","M",45},{102,"Zhangping","M",62.5},{103,"Hefang","F",92.5},{104,"Chengling","F",87},{105,"Wangming","M",58};}對結(jié)構(gòu)數(shù)組可以作初始化賦值。例如:當(dāng)對全部元素作初始化賦值時,也可不給出數(shù)組長度。structstu對結(jié)構(gòu)數(shù)組可以作初始化賦值。例如:當(dāng)對全20【例11.3】計算學(xué)生的平均成績和不及格的人數(shù)。structstu{intnum;char*name;charsex;floatscore;}boy[5]={{101,"Liping","M",45},{102,"Zhangping","M",62.5},{103,"Hefang","F",92.5},{104,"Chengling","F",87},{105,"Wangming","M",58};}main(){inti,c=0;floatave,s=0;for(i=0;i<5;i++){s+=boy[i].score;
if(boy[i].score<60)c+=1;}printf("s=%f\n",s);
ave=s/5;printf(“平均分=%f\n人數(shù)=%d\n”,ave,
c);}定義了一個外部結(jié)構(gòu)數(shù)組boy,共5個元素,并作了初始化賦值。在main函數(shù)中用for語句逐個累加各元素的score成員值存于s之中,如score的值小于60(不及格)即計數(shù)器C加1,循環(huán)完畢后計算平均成績,并輸出全班總分,平均分及不及格人數(shù)?!纠?1.3】計算學(xué)生的平均成績和不及格的人數(shù)。stru21【例11.4】建立一個簡易的同學(xué)通訊錄main(){
structmemman[NUM];inti;for(i=0;i<NUM;i++){printf(“輸入姓名:\n");
gets(man[i].name);printf(“輸入電話號碼:\n");
gets(man[i].phone);}printf("name\t\t\tphone\n\n");for(i=0;i<NUM;i++)printf("%s\t\t%s\n",
man[i].name,man[i].phone);}#include"stdio.h"#defineNUM3structmem{charname[20];charphone[15];};定義了一個結(jié)構(gòu)mem,它有兩個成員name和phone用來表示姓名和電話號碼。在主函數(shù)中定義man為具有mem類型的結(jié)構(gòu)數(shù)組。在for語句中,用gets函數(shù)分別輸入各個元素中兩個成員的值。然后又在for語句中用printf語句輸出各元素中兩個成員值?!纠?1.4】建立一個簡易的同學(xué)通訊錄main()#incl22七、結(jié)構(gòu)指針變量的說明和使用1、指向結(jié)構(gòu)變量的指針
一個指針變量當(dāng)用來指向一個結(jié)構(gòu)變量時,稱之為結(jié)構(gòu)指針變量。結(jié)構(gòu)指針變量中的值是所指向的結(jié)構(gòu)變量的首地址。通過結(jié)構(gòu)指針即可訪問該結(jié)構(gòu)變量,這與數(shù)組指針和函數(shù)指針的情況是相同的。結(jié)構(gòu)指針變量說明的一般形式為:
struct結(jié)構(gòu)名*結(jié)構(gòu)指針變量名例如,在前面的例題中定義了stu這個結(jié)構(gòu),如要說明一個指向stu的指針變量pstu,可寫為:
structstu
*pstu;七、結(jié)構(gòu)指針變量的說明和使用1、指向結(jié)構(gòu)變量的指針23結(jié)構(gòu)指針變量也必須要先賦值后才能使用。
賦值是把結(jié)構(gòu)變量的首地址賦予該指針變量,不能把結(jié)構(gòu)名賦予該指針變量。如果boy是被說明為stu類型的結(jié)構(gòu)變量,則:
pstu=&boy
正確而:
pstu=&stu
錯誤
結(jié)構(gòu)名和結(jié)構(gòu)變量是兩個不同的概念,不能混淆。結(jié)構(gòu)名只能表示一個結(jié)構(gòu)形式,編譯系統(tǒng)并不對它分配內(nèi)存空間。只有當(dāng)某變量被說明為這種類型的結(jié)構(gòu)時,才對該變量分配存儲空間。因此上面&stu這種寫法是錯誤的,不可能去取一個結(jié)構(gòu)名的首地址。有了結(jié)構(gòu)指針變量,就能更方便地訪問結(jié)構(gòu)變量的各個成員。結(jié)構(gòu)指針變量也必須要先賦值后才能使用。24其訪問的一般形式為:結(jié)構(gòu)變量.成員名引入結(jié)構(gòu)指針變量以后,則訪問一般形式是:
(*結(jié)構(gòu)指針變量).成員名或為:
結(jié)構(gòu)指針變量->成員名例如:
(*pstu).num或者:
pstu->num注意(*pstu)兩側(cè)的括號不可少,因為成員符“.”的優(yōu)先級高于“*”。去掉括號寫作*pstu.num~*(pstu.num),意義就完全不對了。其訪問的一般形式為:結(jié)構(gòu)變量.成員名25下面通過例子來說明結(jié)構(gòu)指針變量的具體說明和使用方法。structstu{intnum;char*name;charsex;floatscore;}boy1={102,"Zhangping",'M',78.5},*pstu;【例11.5】boy1pstu下面通過例子來說明結(jié)構(gòu)指針變量的具體說明和使用方法。stru26main(){
pstu=&boy1;printf(“學(xué)號=%d\n姓名=%s\n",boy1.num,);printf(“性別=%c\n分數(shù)=%f\n\n”,boy1.sex,boy1.score);printf(“學(xué)號=%d\n姓名=%s\n",(*pstu).num,(*pstu).name);printf(“性別=%c\n分數(shù)=%f\n\n",(*pstu).sex,(*pstu).score);
printf(“學(xué)號=%d\n姓名=%s\n",pstu->num,pstu->name);printf(“性別=%c\n分數(shù)=%f\n\n",pstu->sex,pstu->score);}main()27定義了一個結(jié)構(gòu)stu,定義了stu類型結(jié)構(gòu)變量boy1并作了初始化賦值,還定義了一個指向stu類型結(jié)構(gòu)的指針變量pstu。在main函數(shù)中,pstu被賦予boy1的地址,因此pstu指向boy1。然后在printf語句內(nèi)用三種形式輸出boy1的各個成員值。從運行結(jié)果可以看出:結(jié)構(gòu)變量.成員名boy1.num(*結(jié)構(gòu)指針變量).成員名(*pstu).num結(jié)構(gòu)指針變量->成員名pstu->num這三種用于表示結(jié)構(gòu)成員的形式是完全等效的。定義了一個結(jié)構(gòu)stu,定義了stu類型結(jié)構(gòu)變量boy1并作了282、指向結(jié)構(gòu)數(shù)組的指針
指針變量可以指向一個結(jié)構(gòu)數(shù)組,這時結(jié)構(gòu)指針變量的值是整個結(jié)構(gòu)數(shù)組的首地址。結(jié)構(gòu)指針變量也可指向結(jié)構(gòu)數(shù)組的一個元素,這時結(jié)構(gòu)指針變量的值是該結(jié)構(gòu)數(shù)組元素的首地址。設(shè)ps為指向結(jié)構(gòu)數(shù)組的指針變量則ps也指向該結(jié)構(gòu)數(shù)組的0號元素ps+1指向1號元素ps+i則指向i號元素【例11.6】用指針變量輸出結(jié)構(gòu)數(shù)組。104…..103…...102……101…..psps+iboy2、指向結(jié)構(gòu)數(shù)組的指針指針變量可以指向一個結(jié)29structstu{intnum;char*name;charsex;floatscore;}boy[5]={{101,"Zhouping",'M',45},{102,"Zhangping",'M',62.5},{103,"Lioufang",'F',92.5},{104,"Chengling",'F',87},{105,"Wangming",'M',58},};main(){structstu*ps;printf(“學(xué)號:姓名:性別:分數(shù)\n");for(ps=boy;ps<boy+5;ps++)printf("%d%s%c%f\n",ps->num,ps->name,ps->sex,ps->score);}structstumain()30在程序中,定義了stu結(jié)構(gòu)類型的外部數(shù)組boy并作了初始化賦值。在main函數(shù)內(nèi)定義ps為指向stu類型的指針。在循環(huán)語句for的表達式1中,ps被賦予boy的首地址,然后循環(huán)5次,輸出boy數(shù)組中各成員值。注意的是,一個結(jié)構(gòu)指針變量雖然可以用來訪問結(jié)構(gòu)變量或結(jié)構(gòu)數(shù)組元素的成員,但是,不能使它指向一個成員。也就是說不允許取一個成員的地址來賦予它。
如:
ps=&boy[1].sex;
賦值錯誤只能是:ps=boy;
賦予數(shù)組首地址或者是:ps=&boy[0];
賦予0號元素首地址在程序中,定義了stu結(jié)構(gòu)類型的外部數(shù)組313、結(jié)構(gòu)指針變量作函數(shù)參數(shù)
在ANSIC標(biāo)準中允許用結(jié)構(gòu)變量作函數(shù)參數(shù)進行整體傳送。但是這種傳送要將全部成員逐個傳送,特別是成員為數(shù)組時將會使傳送的時間和空間開銷很大,嚴重地降低了程序的效率。因此最好的辦法就是使用指針,即用指針變量作函數(shù)參數(shù)進行傳送。這時由實參傳向形參的只是地址,從而減少了時間和空間的開銷。3、結(jié)構(gòu)指針變量作函數(shù)參數(shù)在ANSIC標(biāo)準中32【例11.7】計算一組學(xué)生的平均成績和不及格人數(shù)。用結(jié)構(gòu)指針變量作函數(shù)參數(shù)編程。structstu{intnum;char*name;charsex;floatscore;}boy[5]={{101,"Liping",'M',45},{102,"Zhangping",'M',62.5},{103,"Hefang",'F',92.5},{104,"Chengling",'F',87},{105,"Wangming",'M',58},};main(){structstu*ps;voidave(structstu*ps);
ps=boy;ave(ps);}voidave(structstu*ps){intc=0,i;floatave,s=0;for(i=0;i<5;i++,ps++)
{s+=ps->score;if(ps->score<60)c+=1;}printf("s=%f\n",s);ave=s/5;printf(“平均分數(shù)=%f\n人數(shù)=%d\n",ave,c);}關(guān)鍵!s=s+boy[i].score【例11.7】計算一組學(xué)生的平均成績和不及格人數(shù)。struc33程序中定義了函數(shù)ave,其形參為結(jié)構(gòu)指針變量ps。boy被定義為外部結(jié)構(gòu)數(shù)組,因此在整個源程序中有效。在main函數(shù)中定義說明了結(jié)構(gòu)指針變量ps,并把boy的首地址賦予它,使ps指向boy數(shù)組。然后以ps作實參調(diào)用函數(shù)ave。在函數(shù)ave中完成計算平均成績和統(tǒng)計不及格人數(shù)的工作并輸出結(jié)果。由于本程序全部采用指針變量作運算和處理,故速度更快,程序效率更高。程序中定義了函數(shù)ave,其形參為結(jié)構(gòu)指針變34main(){ structSTUDENT*pt; floatsum[4]={0.0},average[4]={0.0}; inti; char *name[]={"Computer","English","Math","Music“}; pt=stu; /*pt指向結(jié)構(gòu)體數(shù)組的第一個元素*/ for(pt=stu;pt<stu+30;pt++){ sum[0]=sum[0]+pt->Computer;/*計算第一門課的成績總和*/ sum[1]=sum[1]+pt->English; /*計算第二門課的成績總和*/ sum[2]=sum[2]+pt->Math; /*計算第三門課的成績總和*/ sum[3]=sum[3]+pt->Music; /*計算第四門課的成績總和*/ } for(i=0;i<4;i++) {average[i]=sum[i]/30; /*求每門功課的平均成績*/ printf("%20s:%4.2f\n",name[i],*(average+i));/*輸出四門課的平均成績*/ }}structSTUDENT{int studentID;char studentName[10];char studentSex[4];struct dattimeOfEnter; intComputer;intEnglish;intMath;intMusic;};structSTUDENTstu[30]={{1,"令狐沖","男",{1999,12,20},90,83,72,82}, {2,"林平之","男",{1999,07,06},78,92,88,78},
{3,"岳靈珊","女",{1999,07,06},89,72,98,66},{4,"任瑩瑩","女",{1999,07,06},78,95,87,90}…};#include<stdio.h>structdat{int year;int month;int day;};main()structSTUDENT#include35八、動態(tài)存儲分配
在數(shù)組一章中,曾介紹過數(shù)組的長度是預(yù)先定義好的,在整個程序中固定不變。C語言中不允許動態(tài)數(shù)組類型。例如:intn;scanf("%d",&n);inta[n];在實際的編程中,往往會發(fā)生這種情況,即所需的內(nèi)存空間取決于實際輸入的數(shù)據(jù),而無法預(yù)先確定。對于這種問題,用數(shù)組的辦法很難解決。為了解決上述問題,C語言提供了一些內(nèi)存管理函數(shù),這些內(nèi)存管理函數(shù)可以按需要動態(tài)地分配內(nèi)存空間,也可把不再使用的空間回收待用,為有效地利用內(nèi)存資源提供了手段。用變量表示長度,想對數(shù)組的大小作動態(tài)說明,這是錯誤的。八、動態(tài)存儲分配在數(shù)組一章中,曾介紹過數(shù)組的36常用的內(nèi)存管理函數(shù)有以下四個:(1)分配內(nèi)存空間函數(shù)malloc(見P387)
函數(shù)原形式:
void*malloc(unsignedsize)功能:在內(nèi)存的動態(tài)存儲區(qū)中分配一塊長度為"size“字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。如內(nèi)存不夠,返回0。
調(diào)用形式:
(類型說明符*)malloc(size)
“類型說明符”表示把該區(qū)域用于何種數(shù)據(jù)類型。(類型說明符*)表示把返回值強制轉(zhuǎn)換為該類型指針?!皊ize”是一個無符號數(shù)。例如:
pc=(char*)malloc(100);Size字節(jié)地址表示分配100個字節(jié)的內(nèi)存空間,并強制轉(zhuǎn)換為字符數(shù)組類型,函數(shù)的返回值為指向該字符數(shù)組的指針,把該指針賦予指針變量pc。常用的內(nèi)存管理函數(shù)有以下四個:地址表示分配100個字節(jié)的內(nèi)存37說明:如果函數(shù)未能成功地執(zhí)行(如自由內(nèi)存不足等),則不能獲得需要的存儲空間,將返回一個空指針NULL,表示分配失敗。格式
(類型說明符*)malloc(size)
中的
(類型說明符*)通常為void類型的指針,表示如需要引用此地址,可用類型轉(zhuǎn)換成需要類型的指針。應(yīng)使用的頭部文件有“malloc.h”例:float*p;p=(float*)malloc(sizeof(float));說明:例:float*p;38例:#include”malloc.h”
#include“string.h”main(){char*p;unsignedsize=20;p=(char*)malloc(size));strcpy(p,“Verygood!”);printf(“%s”,p);free(p);
}
由于計算機可供用動態(tài)分配的內(nèi)存空間是有限的,內(nèi)存動態(tài)分配失敗將導(dǎo)致指針變量值為NULL,因而一般在調(diào)用函數(shù)時進行內(nèi)存動態(tài)分配時須檢查其返回值是否為NULL?!璫har*p;p=malloc(20);if(!p){printf(“outofmemory\n”);exit(1);}if(p==NULL)例:#include”malloc.h”39申請一個結(jié)構(gòu)體的內(nèi)存通常:structtemp{intdata;charname[10];charsex;floatscore;};
structtemp
stu,*pt=&stu;而今:structtemp{intdata;charname[10];charsex;floatscore;};
structtemp
*pt;
定義結(jié)構(gòu)體變量及指針(指向stu)不定義結(jié)構(gòu)體變量pt=(structtemp*)malloc(10*sizeof(structtemp));申請一個結(jié)構(gòu)體的內(nèi)存通常:而今:定義結(jié)構(gòu)體變量及指針不定義結(jié)40(2)分配內(nèi)存空間函數(shù)calloc
函數(shù)原形式:void*
calloc(unsignedn,unsigned
size)
調(diào)用形式:(類型說明符*)calloc(n,size)
功能:在內(nèi)存動態(tài)存儲區(qū)中分配n塊長度為“size”字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。
(類型說明符*)用于強制類型轉(zhuǎn)換。calloc函數(shù)與malloc函數(shù)的區(qū)別僅在于一次可以分配n塊區(qū)域。例如:
ps=(structstu*)
calloc(3,sizeof(structstu));其中的sizeof(structstu)是求stu的結(jié)構(gòu)長度。因此該語句的意思是:⑴按stu的長度分配3塊連續(xù)區(qū)域,⑵強制轉(zhuǎn)換為stu類型,⑶并把其首地址賦予指針變量ps。Size字節(jié)地址Size字節(jié)Size字節(jié)(2)分配內(nèi)存空間函數(shù)calloc地址41(3)釋放內(nèi)存空間函數(shù)free
調(diào)用形式:free(void*ptr);
功能:釋放ptr所指向的一塊內(nèi)存空間,ptr是一個任意類型的指針變量,它指向被釋放區(qū)域的首地址。被釋放區(qū)應(yīng)是由malloc或calloc函數(shù)所分配的區(qū)域。【例11.8】分配一塊區(qū)域,輸入一個學(xué)生數(shù)據(jù)。main(){structstu{intnum;char*name;charsex;floatscore;}*ps;
ps=(structstu*)malloc(sizeof(structstu));ps->num=102;ps->name="Zhangping";ps->sex='M';ps->score=62.5;printf(“學(xué)號=%d\n姓名=%s\n",ps->num,ps->name);printf(“性別=%c\n分數(shù)=%f\n”,ps->sex,ps->score);free(ps);}(3)釋放內(nèi)存空間函數(shù)free【例11.8】分配一塊區(qū)域,輸42#include"
malloc.h"main(){float*ps,*p,i=1.0
ps=(float*)malloc(5*sizeof(float));p=ps;for(j=0;j<5;j++)
*ps++=i++;ps=p;for(j=0;j<5;j++)printf("%f\n",*ps++);free(ps);}運行結(jié)果:1.000002.000003.000004.000005.00000*(ps++)問題:
是否定義了數(shù)組來存放數(shù)據(jù)?#include"malloc.h"運行結(jié)果:1.0043定義了結(jié)構(gòu)stu,定義了stu類型指針變量ps。然后分配一塊stu大內(nèi)存區(qū),并把首地址賦予ps,使ps指向該區(qū)域。再以ps為指向結(jié)構(gòu)的指針變量對各成員賦值,并用printf輸出各成員值。最后用free函數(shù)釋放ps指向的內(nèi)存空間。free()函數(shù)無返回值。整個程序包含了三個步驟,申請內(nèi)存空間——使用內(nèi)存空間——釋放內(nèi)存空間
實現(xiàn)存儲空間的動態(tài)分配定義了結(jié)構(gòu)stu,定義了stu類型指針變量p44歸納:structstu{intnum;char*name;charsex;floatscore;};structstustuend,*pt=&stuend;結(jié)構(gòu)變量.成員名(*結(jié)構(gòu)指針變量).成員名結(jié)構(gòu)指針變量->成員名
#defineNULL0#defineTYPEstructstu#defineLENsizeof(structstu)
TYPEboy,*p;
p=(TYPE*)malloc(LEN);stuend.sex=‘f’,pt->sex=‘f’(*pt).Sex=‘f’歸納:structstu#defineNULL45struct類型的特點一個struct的類型可以定義該類型的變量、數(shù)組、指針……可以做函數(shù)的參數(shù)類型和返回值類型它的成員可以是任意類型基本類型、數(shù)組、指針、結(jié)構(gòu)體、共用體……struct類型的變量兩個結(jié)構(gòu)體變量之間可以相互賦值所以做為函數(shù)的參數(shù)時,是傳值調(diào)用可以取地址&不可能直接參與算術(shù)和比較運算面向?qū)ο蠛蛿?shù)據(jù)庫是struct的思想的發(fā)展struct類型的特點一個struct的類型46思考下面的結(jié)構(gòu)是什么意思?
structtemp
{
intdata;
structtemppt;
};下面的結(jié)構(gòu)是什么意思呢?
structtemp
{
intdata;
structtemp*pt;
};但可以包含指向本結(jié)構(gòu)體類型的指針變量結(jié)構(gòu)體聲明時不能包含自我用于存放地址的成員,常把它稱為指針域。思考下面的結(jié)構(gòu)是什么意思?但可以包含指向本結(jié)構(gòu)體類結(jié)構(gòu)體聲明47九、鏈表的概念采用了動態(tài)分配的辦法為一個結(jié)構(gòu)分配內(nèi)存空間。每一次分配一塊空間可用來存放一個學(xué)生的數(shù)據(jù),我們可稱之為一個結(jié)點。有多少個學(xué)生就應(yīng)該申請分配多少塊內(nèi)存空間,也就是說要建立多少個結(jié)點。當(dāng)然用結(jié)構(gòu)數(shù)組也可以完成上述工作,但如果預(yù)先不能準確把握學(xué)生人數(shù),也就無法確定數(shù)組大小。而且當(dāng)學(xué)生留級、退學(xué)之后也不能把該元素占用的空間從數(shù)組中釋放出來。
九、鏈表的概念采用了動態(tài)分配的辦法為一個結(jié)構(gòu)分配內(nèi)存空間48用動態(tài)存儲的方法可以很好地解決這些問題。有一個學(xué)生就分配一個結(jié)點,無須預(yù)先確定學(xué)生的準確人數(shù),
某學(xué)生退學(xué),可刪去該結(jié)點,并釋放該結(jié)點占用的存儲空間。從而節(jié)約了寶貴的內(nèi)存資源。另一方面,用數(shù)組的方法必須占用一塊連續(xù)的內(nèi)存區(qū)域。而使用動態(tài)分配時,每個結(jié)點之間可以是不連續(xù)的(結(jié)點內(nèi)是連續(xù)的)。結(jié)點之間的聯(lián)系可以用指針實現(xiàn)。即在結(jié)點結(jié)構(gòu)中定義一個成員項用來存放下一結(jié)點的首地址,這個用于存放地址的成員,常把它稱為指針域。用動態(tài)存儲的方法可以很好地解決這些問題49可在第一個結(jié)點的指針域內(nèi)存入第二個結(jié)點的首地址,在第二個結(jié)點的指針域內(nèi)又存放第三個結(jié)點的首地址,如此串連下去直到最后一個結(jié)點。最后一個結(jié)點因無后續(xù)結(jié)點連接,其指針域可賦為0。這樣一種連接方式,在數(shù)據(jù)結(jié)構(gòu)中稱為“鏈表”。①第0個結(jié)點稱為頭結(jié)點,它存放有第一個結(jié)點的首地址,它沒有數(shù)據(jù),只是一個指針變量。②以下的每個結(jié)點都分為兩個域,一個是數(shù)據(jù)域,存放各種實際的數(shù)據(jù),(如學(xué)號num,姓名name,性別sex和成績score等)
另一個域為指針域,存放下一結(jié)點的首地址。③鏈表中的每一個結(jié)點都是同一種結(jié)構(gòu)類型。簡單鏈表示意圖數(shù)據(jù)域指針域可在第一個結(jié)點的指針域內(nèi)存入第二個結(jié)點的首地50例如,一個存放學(xué)生學(xué)號和成績的結(jié)點應(yīng)為以下結(jié)構(gòu):
structstu{intnum;intscore;structstu
*next;}*p;為一個指向stu類型結(jié)構(gòu)的指針變量。兩個成員項組成數(shù)據(jù)域鏈表的主要操作有以下幾種:
建立鏈表;結(jié)構(gòu)的查找與輸出;插入一個結(jié)點;刪除一個結(jié)點;成員項next構(gòu)成指針域例如,一個存放學(xué)生學(xué)號和成績的結(jié)點應(yīng)為以下結(jié)構(gòu):兩個成員項組51建立鏈表--簡單鏈表:
#defineNULL0#defineTYPEstructstu#defineLENsizeof(structstu)structstu{longnum;floatscore;structstu*next;};見書P274
main()
{
structstua,b,c,*head;a.num=200412;b.num=200410;c.score=98;a.next=&b;……h(huán)ead=&a}
靜態(tài)鏈表abcheadNULL建立鏈表--簡單鏈表:#defineNULL0見52【例11.9】建立一個三個結(jié)點的鏈表,存放學(xué)生數(shù)據(jù)。為簡單起見,我們假定學(xué)生數(shù)據(jù)結(jié)構(gòu)中只有學(xué)號和分數(shù)兩項??删帉懸粋€建立鏈表的函數(shù)creat。
#defineNULL0#defineTYPEstructstu#defineLENsizeof(structstu)structstu{intnum;floatscore;structstu*next;};
intn;p1headp2numscorenextnextscorenump1
TYPE*creat(
)建立鏈表{動態(tài)鏈表structstu*head,*p1,
*p2;n=0;
p1=p2=(TYPE*)
malloc(LEN);printf(“輸入學(xué)號和分數(shù)\n");scanf("%d%d",&p1->num,&p1->score);head=NULL;while(p1->num!=0){n=n+1;if(n==1)head=p1;elsep2->next=p1;p2=p1;
p1=(TYPE*)malloc(LEN);scanf("%d%d",&p1->num,&p1->score);}p2->next=NULL;return(head);}p1headp2numscorenextnextscorenump1【例11.9】建立一個三個結(jié)點的鏈表,存放學(xué)生數(shù)據(jù)。為簡單起53p1=(TYPE*)malloc(LEN);p2->next=p1p1=(TYPE*)malloc(LEN);p2->54p2=p1p2=p155第十一章結(jié)構(gòu)體與共同體課件C程序設(shè)計課件56第十一章結(jié)構(gòu)體與共同體課件C程序設(shè)計課件57
#defineNULL0#defineTYPEstructstu#defineLENsizeof(structstu)structstu{intnum;floatscore;structstu*next;};
intn;
TYPE*creat(
)建立鏈表{structstu*head,*p1,
*p2;n=0;
p1=p2=(TYPE*)malloc(LEN);printf(“輸入學(xué)號和分數(shù)\n");scanf("%d%d",&p1->num,&p1->score);head=NULL;while(p1->num!=0){n=n+1;if(n==1)head=p1;elsep2->next=p1;p2=p1;
p1=(TYPE*)
malloc(LEN);scanf("%d%d",&p1->num,&p1->score);}p2->next=NULL;return(head);}p1headp2numscorenext#defineNULL0TYPE*58在函數(shù)外首先用宏定義對三個符號常量作了定義。用TYPE表示structstu,用LEN表示sizeof(structstu)主要的目的是為了在以下程序內(nèi)減少書寫并使閱讀更加方便。結(jié)構(gòu)stu定義為外部類型,程序中的各個函數(shù)均可使用該定義。creat函數(shù)用于建立一個有n個結(jié)點的鏈表,它是一個指針函數(shù),它返回的指針指向stu結(jié)構(gòu)。在creat函數(shù)內(nèi)定義了三個stu結(jié)構(gòu)的指針變量。head為頭指針,p1為指向兩相鄰結(jié)點的前一結(jié)點的指針變量。
p2為后一結(jié)點的指針變量。在函數(shù)外首先用宏定義對三個符號常量作了定義。59
voidprint(structstu*head){structstu*p;p=head;if(head!=NULL)do{printf(“%ld%d”,p->num,p->score);
p=p->next;}while(p!=NULL);}輸出鏈null9120013p10008920011pheadnextscorenump使指針下移p=p->next;voidprint(structstu*he60刪除鏈表head=p1->next;刪除鏈表head=p1->next;61p2->next=p1->next;p2->next=p1->next;62對鏈表的插入操作p0->num>p1->num1.p2=p12.p1=p1->next3.對鏈表的插入操作p0->num>p1->num1.p2=p163p2->next=p0P0->next=p14.3p1=p1->next3.p2->next=p04.3p1=p1->next3.64第十一章結(jié)構(gòu)體與共同體課件C程序設(shè)計課件65第十一章結(jié)構(gòu)體與共同體課件C程序設(shè)計課件66十、共用體共用體的概念
有時需要使幾種不同類型的變量存放到同一段內(nèi)存單元中。例如
,可把一個整型變量、一個字符型變量、一個實型變量放在同一個地址開始的內(nèi)存單元中。
3個變量在內(nèi)存中占的字節(jié)數(shù)不同
,但都從同一地址開始
存放。也就是使用覆蓋技術(shù)
,幾個變量互相覆蓋。這種使幾個不同的變量共占同一段內(nèi)存的結(jié)構(gòu),稱為“共用體”類型的結(jié)構(gòu)。整型變量i字符變量ch實型變量t設(shè)地址為1000十、共用體共用體的概念整型變量67共用體,或稱為聯(lián)合(Union)unionnumber
{
shortx;
charch;
floaty;
};基本上和struct一樣x、ch和y處于同樣的地址sizeof(unionnumber)取決于占空間最多的那個成員變量1000H1.同一內(nèi)存單元在每一瞬時2.只能存放其中一種類型的成員;3.起作用的成員是最后一次存放的成員4.不能作為函數(shù)參數(shù)共用體,或稱為聯(lián)合(Union)unionnumber
{68定義共用體類型變量的一般形式為
union
共用體名{
成員表列
}變量表列;也可以將類型聲明與變量定義分開;即先聲明一個uniondata類型,再將a、b、c定義為uniondata類型。也可以直接定義共用體變量uniondata{
inti;
char
ch;
floatf;}a,b,c;uniondata{
inti;
charch;
floatf;};uniondata
a,
b,
c;union{
inti;
charch;
floatf;}a,
b,
c;定義共用體類型變量的一般形式為 uniondatauni69“共用體”與“結(jié)構(gòu)體”的定義形式相似。但它們的含義是不同的。
結(jié)構(gòu)體變量所占內(nèi)存長度是各成員占的內(nèi)存長度之和。每個成員分別占有其自己的內(nèi)存單元。
共用體變量所占的內(nèi)存長度等于最長的成員的長度。
例如,上面定義的“共用體”變量a、b、c各占4個字節(jié)(因為一個實型變量占4個字節(jié)),而不是各占2+1+4=7個字節(jié)。
“共用體”與“結(jié)構(gòu)體”的定義形式相似。但它們70共用體變量的引用方式
只有先定義了共用體變量才能引用它。而且不能引用共用體變量,而只能引用共用體變量中的成員。例如
,前面定義了a、b、c為共用體變量,下面的引用方式是正確的
:
a.i
(引用共用體變量中的整型變量
i)
a.ch
(引用共用體變量中的字符變量
ch)
a.f
(引用共用體變量中的實型變量
f)不能只引用共用體變量,例如
:
printf("
%d",
a
)
a的存儲區(qū)有好幾種類型
,分別占不同長度的存儲區(qū)
,僅寫共用體變量名
a,難以使系統(tǒng)確定究竟輸出的是哪一個成員的值。
應(yīng)寫成
printf(“%d”,a.i)或
printf("%c",a.ch)錯誤共用體變量的引用方式錯誤71共用體類型數(shù)據(jù)的特點在使用共用體類型數(shù)據(jù)時要注意以下一些特點:同一個內(nèi)存段可以用來存放幾種不同類型的成員
,但在
每一瞬時只能存放其中一種
,
而不是同時存放幾種。也
就是說
,每一瞬時只有一個成員起作用
,其他的成員不
起作用
,即不是同時都存在和起作用。(2)共用體變量中起作用的成員是最后一次存放的成員
,在
存入一個新的成員后原有的成員就失去作用。如有以下
賦值語句
:
a.i=1;
a.ch=‘a(chǎn)’;a.f=1.5;在完成以上3個賦值運算以后
,只有
a.f是有效的
,a.i和
a.C已經(jīng)無意義了。此時用printf("%d",a.i)是不行的
,而用
printf("%f",a.f)是可以的
,因為最后一次的賦值是向a.f賦值。因此在引用共用體變量時應(yīng)十分注意當(dāng)前存放在共用體變量中的究竟是哪個成員。共用體類型數(shù)據(jù)的特點在完成以上3個賦值運算以后,只有72(3)共用體變量的地址和它的各成員的地址都是同一地址。例如:&a、&a.i、&a.ch、&a.f
都是同一地址值(4)不能對共用體變量名賦值
,也不能企圖引用變量名來得到一個成員值,又不能在定義共用體變量時對它初始化。例如,下面這些都是不對的:
①union
{
inti;
charch;
floatf;}a=(1,
'a',
1.5);(不能初始化)②a=1;(不能對共用體變量賦值)③m=a;(不能引用共用體變量名以得到一個值)(3)共用體變量的地址和它的各成員的地址都是同一地址。73(5)不能把共用體變量作為函數(shù)參數(shù)
,也不能使函數(shù)帶回共用體變量,但可以使用指向共用體變量的指針(與結(jié)構(gòu)體變量這種用法相仿)。(6)共用體類型可以出現(xiàn)在結(jié)構(gòu)體類型定義中,也可以定義共用體數(shù)組。反之,結(jié)構(gòu)體也可以出現(xiàn)在共用體類型定義中,數(shù)組也可以作為共用體的成員。(5)不能把共用體變量作為函數(shù)參數(shù),也不能使函數(shù)帶回共74例11.12
設(shè)有若干個人員的數(shù)據(jù),其中有學(xué)生和教師。學(xué)生的數(shù)據(jù)中包括
:
姓名、號碼、性別、職業(yè)、班級。教師的數(shù)據(jù)包括:
姓名、號碼、性別、職業(yè)、職務(wù)。學(xué)生和教師所包含的數(shù)據(jù)是不同的?,F(xiàn)要求把它們放在同一表格中,見圖。
溫馨提示
- 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度特色民宿體驗住宿協(xié)議
- 二零二五年度消防設(shè)備定制設(shè)計與銷售合同
- 二零二五年度農(nóng)產(chǎn)品線上線下一體化購銷合同標(biāo)準
- 施工現(xiàn)場施工防傳染病傳播制度
- 個人兼職用工合同模板
- 鄉(xiāng)村別墅租賃合同樣本
- 二手房買賣雙方合同模板
- 事業(yè)單位合同到期人員停薪留職新政
- 個人與個人汽車租賃合同示范文本
- 中外科研合作合同(四):專有技術(shù)共享
- 2025年上半年山東氣象局應(yīng)屆高校畢業(yè)生招考易考易錯模擬試題(共500題)試卷后附參考答案
- 人教版2024-2025學(xué)年八年級上學(xué)期數(shù)學(xué)期末壓軸題練習(xí)
- 【人教版化學(xué)】必修1 知識點默寫小紙條(答案背誦版)
- 安徽新宸新材料有限公司年產(chǎn)6000噸鋰離子電池材料雙氟磺酰亞胺鋰項目環(huán)境影響報告書
- 日本酒類消費行業(yè)市場分析報告
- GB/T 29594-2013可再分散性乳膠粉
- 西子奧的斯電梯ACD2調(diào)試說明書
- 成長感恩責(zé)任高中主題班會-課件
- 建設(shè)項目全過程工程咨詢服務(wù)指引(咨詢企業(yè)版)(征求意見稿)
- 分手的協(xié)議書模板(5篇)
- 2020年度安徽省中考數(shù)學(xué)科目試卷
評論
0/150
提交評論