c语言【7_1】结构体联合体

上传人:e****s 文档编号:243684597 上传时间:2024-09-28 格式:PPT 页数:39 大小:474KB
返回 下载 相关 举报
c语言【7_1】结构体联合体_第1页
第1页 / 共39页
c语言【7_1】结构体联合体_第2页
第2页 / 共39页
c语言【7_1】结构体联合体_第3页
第3页 / 共39页
点击查看更多>>
资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,2024/9/28,39,第7章 结构体、链表与文件系统1,结构体,联合体,枚举类型,1,C,数,据,类,型,基本类型,构造类型,指针类型,空类型,void,定义类型,typedef,数值类型,字符类型,char,枚举类型,enum,整 型,浮点型,单精度型,float,双精度型,double,短整型,short,长整型,long,整型,int,数组,结构体,struct,联合体,union,系统给定的数据类型,在根本类型根底上自己定义的,思考,在程序里表示一个人姓名、性别、年龄,怎么表示?,想表示多少个人呢?,如何用计算机程序实现下述表格的管理?,表,7-1,某学校学生成绩管理表,学号,姓名,性别,入学时间,计算机原理,英 语,数 学,音 乐,1,令狐冲,男,1999,90,83,72,82,2,林平之,男,1999,78,92,88,78,3,岳灵珊,女,1999,89,72,98,66,4,任莹莹,女,1999,78,95,87,90,5, ,6, ,数组的解决方法,int,studentId30;,/*,最多可以管理,30,个学生,每个学生的学号用数组的下标表示*,/,char,studentName3010;,char,studentSex302;,int,timeOfEnter30;,/*,入学时间用,int,表示*,/,int,scoreComputer30;,/*,计算机原理课的成绩*,/,int,scoreEnglish30;,/*,英语课的成绩*,/,int,scoreMath30;,/*,数学课的成绩*,/,int,scoreMusic30;,/*,音乐课的成绩*,/,数据的内存管理方式,90,78,89,78,83,92,72,95,72,88,98,87,82,78,66,90,1,2,3,4,令狐冲,林平之,岳灵珊,任莹莹,男,男,女,女,1999,1999,1999,1999,数组的解决方法,数组可处理大量的同类型数据,数组中,的每一个元素都属于同一种数据类型,数据的内存管理方式,90,78,89,78,83,92,72,95,72,88,98,87,82,78,66,90,1,2,3,4,令狐冲,林平之,岳灵珊,任莹莹,男,男,女,女,1999,1999,1999,1999,数组的解决方法,分配内存不集中,寻址效率不高,对数组进行赋初值时,容易发生错位 ,更新时,,同步不好控制,结构显得比较零散,不容易管理,例如:按计算机成绩排序,使用选择法排序,发现,1,号成绩比,2,号高,交换这两人的成绩,实现方法为:,t=studentId1, studentId1=studentId2;,studentId2=t;,t=scoreComputer1;,scoreComputer1=scoreComputer2,scoreComputer2=t;,t=scoreEnglish1;,scoreEnglish1= scoreEnglish2;,scoreEnglish2=t;,.,这个人的所有相关信息,都必须通过交换语句,进行交换,保证信息同步,希望的内存分配图,1,令狐冲,男,1999,90,83,72,82,2,林平之,男,1999,78,92,88,78,3,岳灵珊,女,1999,89,72,98,66,4,任莹莹,女,1999,78,95,87,90,student1,student2,T=student 1; student1=student 2; student2=T;,结构体的解决方法,struct,STUDENT,int,studentID;,/*,每个学生的序号*,/,char,studentName10;,/*,每个学生的姓名*,/,char,studentSex4;,/*,每个学生的性别*,/,int,timeOfEnter;,/*,每个学生的入学时间*,/,int,scoreComputer;,/*,每个学生的计算机原理成绩*,/,int,scoreEnglish;,/*,每个学生的英语成绩*,/,int,scoreMath;,/*,每个学生的数学成绩*,/,int,scoreMusic;,/*,每个学生的音乐成绩*,/,;,struct STUDENT,是一个类型,struct STUDENT,students4;/,定义,4,个学生,T=,students1; students1=students2; students2=t;,结构体,结构体是,一种,构造,数据类型,用途:把,不同类型,的数据组合成一个整体-,自定义,数据类型,结构体类型定义,struct,结构体名,类型标识符 成员名;,类型标识符 成员名;,.,;,成员类型可以是,根本型或构造型,struct,是,关键字,不能省略,合法标识符,可省,:,无名结构体,分号不能省略,例,struct student, int num;,char name20;,char sex;,int age;,float score;,char addr30;,;,struct student,s,tu1,stu2;,结构体变量的定义,1,、先定义结构体类型,再定义结构体变量,一般形式:,struct,结构体名,类型标识符 成员名;,类型标识符 成员名;,.,;,struct,结构体名,变量名表列,;,定义结构体变,量之后,为其,分,配内存单元,name,num,sex,age,score,addr,4,字节,4,字节,20,字节,1,字节,4,字节,30,字节,.,stu1,结构体的内存占用,int,占用内存字节数,= 4,struct,类型用内存字节数,= ?,是所有成员变量的内存总和吗?,struct,number,short,i;,/2,char,ch;,/1,float,f;,/4,;,printf(%dn, sizeof(,struct,number);,用运算符,sizeof,获得结构体大小,sizeof,(,变量或表达式,),sizeof,(,类型,),8,Why?,结构体的内存占用,事实上所有数据类型在内存中都是从,偶数,地址开始存放的,且结构所占的实际空间一般是按照机器字长对齐的,特定数据类型的数据项的大小是与机器相关的,,且与编译器有关。,i,f,ch,i,ch,f,非所有成员变量的内存总和,8个字节,2,、定义结构体类型的同时定义结构体变量,一般形式:,struct,结构体名,类型标识符 成员名;,类型标识符 成员名;,.,变量名表列,;,例,struct student, int num;,char name20;,char sex;,int age;,float score;,char addr30;,stu1,stu2;,3,、直接定义结构体变量,一般形式:,struct,类型标识符 成员名;,类型标识符 成员名;,.,变量名表列,;,例,struct, int num;,char name20;,char sex;,int age;,float score;,char addr30;,stu1,stu2;,用,无名结构体,直接定义,变量,只能一次,结构体类型与结构体变量概念不同,类型:不分配内存; 变量:分配内存,结构体类型是一个模型,类似系统给定的根本类型比方int、 float 等类型,只是结构体类型是用户自定义的而已。,结构体可嵌套,结构体成员名与程序中变量名可相同,系统不会混淆,例,struct date, int month;,int day;,int year;,;,struct student, int num;,char name20;,struct date,birthday,;,stu,;,num,name,birthday,month,day,year,结构体变量的引用,引用规那么,结构体变量不能整体引用,只能引用变量成员,可以将一个,结构体变量赋值给另一个结构体变量,结构体嵌套时,逐级引用,成员,(,分量,),运算符,优先级,:,1,结合性,:,从左向右,引用方式:,结构体变量名,.,成员名,例,struct student, int num;,char name20;,char sex;,int age;,float score;,char addr30;,stu1,stu2;,stu1.num=10;,stu1.score=85.5;,stu1.score+=stu2.score;,stu1.age+;,例,struct student, int num;,char name20;,char sex;,int age;,float score;,char addr30;,stu1,stu2;,printf(“%d,%s,%c,%d,%f,%sn”,stu1,); (,),stu1=101,“Wan Lin”,M,19,87.5,“DaLian”; (,),例,struct student, int num;,char name20;,char sex;,int age;,float score;,char addr30;,stu1,stu2;,stu2=stu1; ( ),例,struct student, int num;,char name20;,struct date, int month;,int day;,int year;,birthday;,stu1,stu2;,num,name,birthday,month,day,year,stu1.birthday.month=12;,结构体变量的初始化,形式一:,struct,结构体名,类型标识符 成员名;,类型标识符 成员名;,.,;,struct,结构体名,结构体变量,=初始数据;,例 struct student, int num;,char name20;,char sex;,int age;,char addr30;,;,struct student stu1=112,“Wang Lin,M,19, “200 Beijing Road;,形式二:,struct,结构体名,类型标识符 成员名;,类型标识符 成员名;,.,结构体变量,=初始数据;,例 struct student, int num;,char name20;,char sex;,int age;,char addr30;,stu1=112,“Wang Lin,M,19, “200 Beijing Road;,形式三:,struct,类型标识符 成员名;,类型标识符 成员名;,.,结构体变量,=初始数据;,例 struct, int num;,char name20;,char sex;,int age;,char addr30;,stu1=112,“Wang Lin,M,19, “200 Beijing Road;,定义自己的类型名,struct,student,student1,student2;,/*,可以*,/,student,student1,student2;,/*,不可以*,/,typedef,struct,student,STUD,;,STUD,student1,student2;,/*,可以,!*/,typedef,为一种,已存在的,类型定义一个,新名字,STUD,与,struct,student,类型是,同义词,struct,student,int,num;,char,name20;,char,sex;,int,age;,float,score;,char,addr30;,;,结构体数组,结构体数组的定义,struct student, int num;,char name20;,char sex;,int age;,;,struct student,stu,30,;,num,name,sex,age,num,name,sex,age,stu0,stu1,32B,结构体数组初始化,例,struct, int num;,char name20;,char sex;,int age;,stu =,;,顺序初始化:,struct student, int num;,char name20;,char sex;,int age;,;,struct student stu =100,“Wang Lin,M,20,101,“Li Gang,M,19,110,“Liu Yan,F,19;,例,struct student, int num;,char name20;,char sex;,int age;,stu =,;,分行初始化,:,struct student, int num;,char name20;,char sex;,int age;,;,struct student stu =100,“Wang Lin”,M,20,101,“Li Gang”,M,19,110,“Liu Yan”,F,19;,全部初始化时维数可省,结构体数组引用,引用方式:,结构体数组名,下标,.,成员名,struct student, int num;,char name20;,char sex;,int age;,str3;,stu1.age,+;,strcpy(,stu0.name,“,ZhaoDa”);,str0.name=“ZhaoDa ,例如:按学生年龄排序,#include ,struct student, int num;,char name20;,char sex;,int age;,;,void main(),int i,k,j;,structstudent t;,struct student stu3=100,Wang Lin,M,20,101,Li Gang,M,19,110,Liu Yan,F,18;,for(i=0;i2;i+),k=i;,for(j=i+1;jstuj.age) k=j;,if(i!=k), t=stui;stui=stuk;stuk=t;,for(i=0;i3;i+),printf(%d %s %c %d n,stui.num,stui.name,stui.sex,stui.age);,通过二维数组方式排序英语,#include ,int n=4;,void main(),int i,j,k,temp;,/SNO,NAME,ENGLISH,COMPUTER,C,int s105=2001,1111,45,60,80,2002,2222,56,70,90,2006,3333,89,89,78,2021,4444,67,65,63;,for(i=0;in;i+),printf(%6d %6d %6d %6d %6d n,si0,si1,si2,si3,si4);,printf(n);,/按英语排序,for(i=0;in-1;i+),k=i;,for(j=i+1;jn;j+),if(sj3sk3),k=j;,if(i!=k),for(j=0;j5;j+),temp=sij;,sij=skj;,skj=temp;,for(i=0;in;i+),printf(%6d %6d %6d %6d %6d n,si0,si1,si2,si3,si4);,#include ,struct student,int sno;,char name10;,int english;,int computer;,int c;,;,int n=4;,void main(),int i,j,k;,struct student temp;,struct student s10=2001,liwei,45,60,80,2002,hudu,56,70,90,2006,lijing,89,89,78,2021,kitty,67,65,63;,for(i=0;in;i+),printf(%6d %21s %6d %6d %6d n,si.sno,si.name,si.english,si puter,si.c);,printf(n);,for(i=0;in-1;i+),k=i;,for(j=i+1;jn;j+),if(sj putersk puter),k=j;,if(i!=k),temp=si;,si=sk;,sk=temp;,for(i=0;i,成员名,结构体变量名,.,成员名,指向运算符,优先级,: 1,结合方向:从左向右,#include,main(), struct student, long int num;,char name20;,char sex;,float score;,stu_1,*p;,p=,stu_1.num=89101;,strcpy(stu_1.name,Li Lin);,p-sex=M;,p-score=89.5;,printf(nNo:%ldnname:%snsex:%cnscore:%fn,(*p).num,p-name,stu_1.sex,p-score,);,例,int n;,int *p=,*p,=10;,n,=10,struct student stu1;,struct student *p=,stu1.num,=101,; ,(*p).num,=101,运行结果,:,No:89101,name: Li Lin,sex:M,score:89.5,指向结构体数组的指针,struct student, int num;,char name20;,char sex;,int age;,stu3=10101,Li Lin,M,18,10102,Zhang Fun,M,19,10104,Wang Min,F,20;,main(), struct student *p;,for(,p=stu,;pnum,p-name,p-sex,p-age);,num,name,sex,age,stu0,p,stu1,stu2,p+1,stu3,相当于,p = ,构造数据类型,也叫共用体,用途:使几个不同类型的变量共占一段内存,(,相互覆盖,),,节省内存空间,在单片机编程方面使用较多,共用体类型定义,union,共用体名,类型标识符 成员名;,类型标识符 成员名;,.,;,例,union data, int i;,char ch;,float f;,;,类型定义,不分配内存,7.2 联合体union,7.2 联合体union,struct,number,short,i;,char,ch;,float,f;,;,0x0037b00,union,number,short,i;,char,ch;,float,f;,;,printf(%dn, sizeof(struct number);,i,ch,f,8个字节,i,ch,f,4个字节,printf(%dn, sizeof(union number);,联合体类型变量占用的存储空间由占有最大存储区的成员决定,形式二,:,union data, int i;,char ch;,float f;,a,b;,形式一,:,union data, int i;,char ch;,float f;,;,union data,a,b,c,*p,d3;,形式三,:,union, int i;,char ch;,float f;,a,b,c;,联合体变量的定义,f,ch,i,f,ch,i,a,b,共用体,变量定义,分配内存,长度=,最长成员,所占字节数,共用体,变量任何时刻,只有,一个成员,存在,联合体变量引用,引用规那么,不能引用共用体变量,只能引用其成员,共用体指针名,-,成员名,共用体变量名,.,成员名,(*,共用体指针名,).,成员名,共用体变量中起作用的成员是,最后一次存放的成员,例,union, int i;,char ch;,float f;,a;,a=1; (,),在定义共用体变量时,只能初始化第一个成员,例,union, int i;,char ch;,float f;,a=1,a,1.5; (,),可以用一个共用体变量为另一个变量赋值,例,float x;,union, int i; char ch; float f;,a,b;,a.i=1; a.ch=a; a.f=1.5;,b=a; (,),x=a.f; (,),7.2 联合体union,0x0037b00,同一内存单元在每一瞬时只能存放其中一种类型的成员,互相覆盖 ;,起作用的成员是,最后一次存放,的成员,不能作为函数参数,不能给联合体变量名直接赋值,f,4个字节,struct,person,char,name20;,char,sex;,int,age;,union,int,single;,struct,char,spouseName20;,int,child;,married;,struct,date divorcedDay;,marital;,char,marryFlag;,;,联合体的应用,姓名,name,性别,sex,年龄,age,婚姻状况,婚姻状况,标记,未婚,已婚,离婚,配,偶,子,女,年,月,日,union,int,single;,struct,char,spouseName20;,int,child;,married;,struct,date divorcedDay;,marital;,struct,char,spouseName20;,int,child;,married;,问题:一个简单的学校人员管理程序。人员包括教师、职工、学生,结构体与共用体的综合举例,每个人的属性: name; sex; age; 职业特征; 备注如果是学生,填写分数;如果是教师,填写职称;如果是职工,填写工作岗位;,#include ,union rnk,int grade;,char title10;,char post16;,;,struct person,char name20;,char sex;,int age;,char occp;,union rnk rank;,;,void main(),struct person per1;,scanf(%s%d%c%c,per1.name,/,必须按照如下格式输入:,wang 23sf,/scanf(%d,per1.age);,/scanf(%c,/scanf(%c,if(per1.occp=s),scanf(%d,else if(per1.occp=t) scanf(%s,per1.rank.title);,else,scanf(%s,per1.rank.post);,printf(%s %d %c %c ,per1.name,per1.age,per1.occp,per1.sex);,if(per1.occp=s),printf(%dn,per1.rank.grade);,else if(per1.occp=t) printf(%sn,per1.rank.title);,else,printf(%sn,per1.rank.post);,如果一个变量只有几种可能的值,可以定义为枚举类型,enum 枚举量表;,enum _weekday Sun ,Mon ,Tue ,Wed ,Thu ,Fri ,Sat ;,typedef enum _weekday Sun ,Mon ,Tue ,Wed ,Thu , Fri ,Sat weekday;,weekday workay; 或者:enum _weekday workay ,enum boolean True=1,False=0 ;,7.3 枚举类型,例:,enum _weekday workday;,workday=mon;,printf(%dn, workday) /* 输出1 */,假设:,enum _weekday sun=7, mon=1, tue, wed, thu, fri, sat workday;,workday=tue;,printf(%dn, workday) /* 输出2 */,workday=2; /*整型数不能直接赋值给枚举变量, 类型不匹配 */,workday=(enum weekday)2; /* 可以赋值,相当于将顺序号为2的枚举元素赋给workday */,#include ,enum colorred,yellow,blue,white,black;,void print(enum color col),switch(col) ,case red: printf(redt);break;,case yellow: printf(yellowt);break;,case blue: printf(bluet);break;,case white: printf(whitet);break;,case black: printf(blackt);break;,void main(),enum color i,j,k;,enum color m;,int n=0;,for(i=red;i=black;i=(enum color)(int)i+1),for(j=red;j=black;j=(enum color)(int)j+1),for(k=red;k=black;k=(enum color)(int)k+1),if (i!=j&i!=k&j!=k),printf(%d ,+n);,print(i);print(j);print(k);,printf(n);,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 幼儿教育


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!