简单学C——第五天
結(jié)構(gòu)體
? 首先明確,結(jié)構(gòu)體是一種構(gòu)造的數(shù)據(jù)類型,是一種由多個(gè)數(shù)據(jù)類型如 int,char,double,數(shù)組或者結(jié)構(gòu)體......組成的類型,現(xiàn)在告訴大家如何定義一個(gè)結(jié)構(gòu)體。在定義int整型變量時(shí),大家肯定都知道 int a; ??即定義了一個(gè)int 型變量,系統(tǒng)會自動分配 存int這么大的空間,但是對于結(jié)構(gòu)體而言,它是由許多個(gè)不確定的類型組成的,所以在定義它的時(shí)候需要指明它是由哪些數(shù)據(jù)類型組成的.定義格式有多種,此處只說一種較為簡單的,定義格式如下.
struct 名字 {由哪些數(shù)據(jù)類型組成 };//注意末尾的分號一定要有?
例如:我要定義一個(gè)學(xué)生,學(xué)生需要值得注意的屬性都有什么呢? 假設(shè)需要統(tǒng)計(jì)這名學(xué)生的 1學(xué)號,2姓名,3性別,4班級,5電話,6期末成績,此時(shí)為了簡潔且處理方便,就需要用到結(jié)構(gòu)體
struct student //結(jié)構(gòu)體名 {long long number,tel; // 學(xué)號和電話int score; //成績char name[20],sex[4],clas[20]; //姓名,性別和班級 };如上,就成功定義了一個(gè)關(guān)于學(xué)生信息的結(jié)構(gòu)體,下面實(shí)現(xiàn)具體的輸入輸出操作
#include<stdio.h> struct student {long long number,tel; // 學(xué)號和電話int score; //成績char name[20],sex[4],clas[20]; //姓名,性別和班級 };int main() {struct student tiantian; //聲明了一個(gè)名為tiantian的變量,聲明可以與定義同時(shí)進(jìn)行//現(xiàn)在可以輸入scanf("%lld%s%s%s%lld%d",&tiantian.number,tiantian.name,tiantian.sex,tiantian.clas,&tiantian.tel,&tiantian.score);//輸出printf("%lld %s %s %s %lld %d",tiantian.number,tiantian.name,tiantian.sex,tiantian.clas,tiantian.tel,tiantian.score);return 0; }運(yùn)行結(jié)果:
?
或許在看了上面的之后,你會想,這也太麻煩了吧,我隨便定義6個(gè)獨(dú)立的變量,把它輸入再輸出出來,這樣效果是一樣的,而且代碼也會簡潔很多,不用在用每個(gè)變量時(shí)都再前面加上聲明結(jié)構(gòu)體時(shí)聲明的變量。對于上面這個(gè)這樣想當(dāng)然沒錯(cuò),不過我現(xiàn)在要說,請統(tǒng)計(jì)一下全班所有的人他們各自的 ?1學(xué)號,2姓名,3性別,4班級,5電話,6期末成績,這時(shí)就能體會到結(jié)構(gòu)體的作用之大了,具體看下面的代碼。
?
#include<stdio.h> struct student //結(jié)構(gòu)體名,定義 {long long number,tel; // 學(xué)號和電話int score; //成績char name[20],sex[4],clas[20]; //姓名,性別和班級 };int main() {//假設(shè)此班的學(xué)生低于100名,聲明了一個(gè)名為stu的數(shù)組變量,//數(shù)組中的每一個(gè)元素都可以存放下一個(gè)學(xué)生的六個(gè)信息struct student stu[100];int i;//輸入,,用循環(huán),j假設(shè)有續(xù)名學(xué)生for(i=0;i<5;i++)scanf("%lld%s%s%s%lld%d",&stu[i].number,stu[i].name,stu[i].sex,stu[i].clas,&stu[i].tel,&stu[i].score);//輸出for(i=0;i<5;i++)printf("%lld %s %s %s %lld %d\n",stu[i].number,stu[i].name,stu[i].sex,stu[i].clas,stu[i].tel,stu[i].score);return 0; }運(yùn)行結(jié)果:
?
觀察上面的結(jié)果,輸入了五組數(shù)據(jù),按下回車,輸出存儲在數(shù)組中的結(jié)果,每個(gè)學(xué)生一行,每個(gè)學(xué)生的信息之間空一格。當(dāng)數(shù)字較小的時(shí)候或許還看不出優(yōu)勢,可是如果當(dāng)記錄的學(xué)生數(shù)據(jù)達(dá)到上千組,無疑,用結(jié)構(gòu)體記錄學(xué)生數(shù)據(jù)是較好的方案。
?
比如我要在上述結(jié)構(gòu)體中再添加一個(gè)信息,學(xué)生的出生年月日,此時(shí)應(yīng)該怎么做呢??
可以用到結(jié)構(gòu)體的嵌套,在c語言中,許多的東西都是可以嵌套的。修改上述結(jié)構(gòu)體的定義可得:
#include<stdio.h> struct date //表示日期的結(jié)構(gòu)體 {int year,month,day; }; struct student //結(jié)構(gòu)體名,定義 {long long number,tel; // 學(xué)號和電話int score; //成績char name[20],sex[4],clas[20]; //姓名,性別和班級struct date bri_day; //將上面的表達(dá)日期的結(jié)構(gòu)體套到學(xué)生結(jié)構(gòu)體中表達(dá)學(xué)生的出生年月日 }; int main() {struct student stu[100]; //聲明//內(nèi)容 }由上面的變化可以發(fā)現(xiàn)有一個(gè)問題,訪問年月日的時(shí)候怎么辦呢?當(dāng)然也是層層訪問,如訪問學(xué)生的出生年,就應(yīng)該是:stu[i].bri_day.year;另外可以看到我在主函數(shù)里面即main()
里面只申明了student結(jié)構(gòu)體,并沒有聲明 date結(jié)構(gòu)體,那么是不是就不用聲明date結(jié)構(gòu)體呢?肯定不是的,注意..在student結(jié)構(gòu)體的內(nèi)部,我已經(jīng)進(jìn)行了date結(jié)構(gòu)體的聲明,且聲明變量為bri_day.
當(dāng)然,與結(jié)構(gòu)體類似的類型還有共用體union和枚舉型enum,用法都大同小異,理解了結(jié)構(gòu)體之后再看看他們就是小case了。
轉(zhuǎn)載于:https://www.cnblogs.com/stffer/p/4872960.html
總結(jié)
- 上一篇: 3.js模式-策略模式
- 下一篇: Codeforces Round #32