8结构体&共用体2例1:输出下表学号姓名性别数学英语计算机C语言通信网平均分101张三M809098869088.8102李四M828994819187.4103王五F927886798984.8104何六M898178637677.4105周七F986991856782106……•用什么样的数据类型存储?•缺点?•分配内存不集中,寻址效率不高•对数组进行赋初值时,容易发生错位•结构显得比较零散,不容易管理按行处理如何定义数据类型呢??stu[30];3结构体类型C语言没有为我们提供相应的数据类型,但我们可以根据需要自己定义数据类型。根据题意,我们定义如下的结构体类型:structstudent{intnum;charname[20];charsex;floatscore[5];floataver;};•结构类型的成员!!!注意:structstudent是一个数据类型4结构体变量的定义structstudentstu[30];含义:定义一个一维数组,有30个元素,其数据类型为structstudent为了方便后边的使用,我们可以用typedef为这个数据类型起个别名,typedefstructstudentSTU;STU和其它类型一样使用。???下列语句什么含义?STUa;STUstu1[30];5内存分配共30个数组元素,每个数组元素分配多少字节?可用sizeof(structstudent)求得.101张三M809098869088.8102李四M828994819187.4103王五F927886798984.8104何六M898178637677.4105周七F986991856782106……stustu[0]stu[1]stu[2]stu[3]stu[4]……•那每个学生的学号、姓名、…又如何表示呢?6引用结构体变量的成员结构体变量的成员(member),也称元素(element)或域(filed)。使用引用运算符.对结构类型变量stu[i]中每个成员进行引用例:stu[i].numstu[i].name它们都是变量,与其它同类型变量同样使用。注意区分:•结构体类型;•结构体变量;•结构体变量的成员7例1的实现算法定义结构体类型定义结构体变量输入输出8例1(1)#includestdio.hstructstudent{intnum;/*学号*/charname[20];/*姓名*/charsex;/*性别:m-男,f-女*/floatscore[5];/*成绩*/floataver;/*平均分*/};/*定义结构体类型structstudent,一般都定义为全局可用的数据类型*/typedefstructstudentSTU;/*为数据类型起别名*/voidmain(){inti,j;floatsum;STUstu[30];/*定义结构体变量*/9例1(2)for(i=0;i30;i++)/*输入每个学生的信息*/{printf(“pleaseinputthenumber\n:”);scanf(“%d”,&stu[i].num);getchar();printf(“pleaseinputthename\n:”);scanf(“%s”,stu[i].name);getchar();printf(“form(femaleormail)?\n:”);scanf(“%c”,&stu[i].sex);printf(“pleaseinput5scores:\n:”);for(j=0;j5;j++)/*输入5门课的成绩*/scanf(“%f”,&stu[i].score[j]);sum=0;/*下边计算5门课的平均分,并存放在相应成员变量中*/for(j=0;j5;j++)sum+=stu[i].score[j];stu[i].aver=sum/5;}printf(num\tname\t\tsexc1c2c3c4c5aver\n);for(i=0;i30;i++)/*输出学生基本信息*/{printf(%d\t%s\t%c%3.0f%3.0f%3.0f%3.0f%3.0f%4.1f\n,stu[i].num,stu[i].name,stu[i].sex,stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].score[4],stu[i].score[5],stu[i].average);}10输入写成函数voidInput(STUa[],intn){inti,j;floatsum;for(i=0;in;i++)/*输入每个学生的信息*/{printf(“pleaseinputthenumber\n:”);scanf(“%d”,&stu[i].num);getchar();printf(“pleaseinputthename\n:”);scanf(“%s”,stu[i].name);getchar();printf(“form(femaleormail)?\n:”);scanf(“%c”,&stu[i].sex);printf(“pleaseinput5scores:\n:”);for(j=0;j5;j++)/*输入5门课的成绩*/scanf(“%f”,&stu[i].score[j]);sum=0;/*下边计算5门课的平均分,并存放在相应成员变量中*/for(j=0;jNUMOFCOURSE;j++)sum+=stu[i].score[j];stu[i].aver=sum/NUMOFCOURSE;}}11主函数#includestdio.h#defineNUMOFCOURSE5#defineN30structstudent{intnum;/*学号*/charname[20];/*姓名*/charsex;/*性别:m-男,f-女*/floatscore[NUMOFCOURSE];/*成绩*/floataver;/*平均分*/};/*定义结构体类型structstudent,一般都定义为全局可用的数据类型*/typedefstructstudentSTU;/*为数据类型起别名*/voidInput(STUa[],intn);voidmain(){inti,j;STUstu[N];/*定义结构体变量*/Input(stu,N);printf(num\tname\tsexc1c2c3c4c5aver\n);for(i=0;iN;i++)/*输出学生基本信息*/{printf(%d\t%s\t%c“,stu[i].num,stu[i].name,stu[i].sex);for(j=0;jNUMOFCOURSE;j++)printf(%3.0f,stu[i].score[j];printf(%3.0f,stu[i].average);}}12对数组元素的成员进行引用有三种方式stu[i].num101张三M809098869088.8102李四M828994819187.4103王五F927886798984.8104何六M898178637677.4105周七F986991856782106……stustu[0]stu[1]stu[2]stu[3]stu[4]……1.如果有指针变量p指向数组stu,如何定义指针,如何用指针引用数组元素的成员呢?2.?*p;3.P=?;4.?num5.P++以后到哪儿?•structstudent*p;•p=stu;•…p-num或(*p).numstu[i].num13用指针:例1(1)#includestdio.hstructstudent{intnum;/*学号*/charname[20];/*姓名*/charsex;/*性别:m-男,f-女*/floatscore[5];/*成绩*/floataver;/*平均分*/};/*定义结构体类型structstudent,一般都定义为全局可用的数据类型*/typedefstructstudentSTU;/*为数据类型起别名*/voidmain(){inti,j;floatsum;STUstu[30];/*定义结构体变量*/STU*p;14例1(2)for(p=stu;pstu+30;p++)/*输入每个学生的信息*/{printf(“pleaseinputthenumber\n:”);scanf(“%d”,&p-num);printf(“pleaseinputthename\n:”);scanf(“%s”,p-name);printf(“form(femaleormail)?\n:”);scanf(“%c”,&p-sex);printf(“pleaseinput5scores:\n:”);for(j=0;j5;j++)/*输入5门课的成绩*/scanf(“%f”,&p-score[j]);sum=0;/*下边计算5门课的平均分,并存放在相应成员变量中*/for(j=0;j5;j++)sum+=p-score[j];p-aver=sum/5;}printf(num\tname\t\tsexc1c2c3c4c5aver\n);for(p=stu;pstu+30;p++)/*输出学生基本信息*/{printf(%d\t%s\t%c%3.0f%3.0f%3.0f%3.0f%3.0f%4.1f\n,(*p).num,(*p).name,(*p).sex,(*p).score[1],(*p).score[2],(*p).score[3],(*p).score[4],(*p).score[5],(*p).average);}15如何定义数据类型存储下列表格中的数据姓名name年龄age所在办公室office工作job(或班级class)structperson{charname[10];intage;charjob;depa;};•需要一个数据单元,但不同情况下存不同的数据。李四21学生0600001张三30教师计算机基础教学部unionDEPT{intclass;charoffice[10];}unionDEPT{intclass;charoffice[10];};/*先定义共用体类型*/structperson{charname[10];intage;charjob;unionDEPTdepa;};•共用体类型unionDEPT16#includestdio.hstructperson{charname[10];intage;charjob;unionDEPT{intclass;charoffice[10];}depa;};voidmain(){structpersonps[4];intn,i;for(i=0;i4;i++){scanf(%s%d%c,ps[i].name,&ps[i].age,&ps[i].job);if(ps[i].job==‘s’)/*要先判断job是什么,然后决定存什么*/scanf(%d,&ps[i].depa.class);elseif(ps[i].job=='t')scanf(%s,ps[i].depa.office);}例2printf(\nNameAgeJobClass/office\n);for(i=0;i4;i++){if(ps[i].job==‘s’)/*输出的时候同样先判断,再决定输出什么*/printf(%-10s%-6d%-3c%-10d\n,ps[i].name,ps[i].age,ps[i].job,ps[i].depa.class);elseprintf(%-10s%-6d%-3c%-10s\n,ps[i].name,ps[i].age,ps[i].job,ps[i].depa.office);}}17共用体类型数据的特点unionexample{shortx;charch[4];}a;a.ch[0]a.ch[1]a.ch[2]a.c