《《C语言综合实验》构造数据类型.ppt》由会员分享,可在线阅读,更多相关《《C语言综合实验》构造数据类型.ppt(44页珍藏版)》请在三一办公上搜索。
1、C语言综合实验,构造数据类型,主要内容,结构体 结构体的定义及引用 结构体数组 结构体与指针 共用体 枚举类型 类型标识符的自定义结构体与链表,1.结构体的定义及引用,有时候需要将不同类型的数据组合成一个有机的整体,这些组合在一个整体中的数据是互相联系的。,如一个学生的信息包括学号、姓名、性别、年龄、成绩、地址等。,int num;,char name20;,char sex;,int age;,float score;,char addr30;,应当把它们组织成一个组合项,在一个组合项内包含若干个类型不同(或相同)的数据项。,语言提供了这种数据结构:允许用户将不同类型的数据组合成一个有机的整
2、体,这些数据互相联系;这种数据结构称为结构体(structure)。,结构体的定义是指定义相应的数据结构及相应的变量。,步骤:先定义一个结构体类型标识符;用该标识符去定义相应的变量。,struct student int num;char name20;char sex;int age;float score;char addr30;,;,说明:,、struct是关键字,不能省略:表示定义结构体;,、student是用户自己定义的结构体类型标识符,即该结构体名;,、结构体中具体每项的定义,由 和 括起来。语言中把用户自己定义的数据项称为成员(或称为域),即每个成员也叫结构体中的一个域。,结构体
3、类型标识符的定义,定义一个结构体类型的一般形式:,struct 结构体类型标识符 类型标识符1成员名1;类型标识符2成员名2;类型标识符n成员名n;,;,结构体名,成员表列,结构体类型标识符的定义,1、定义形式:,struct 结构体类型标识符变量名列表;,2、定义结构体变量的三种方法:,、先定义结构体类型再定义变量名,struct student int num;char name20;float score;;,struct student stu1,stu2;,结构体类型名,结构体变量名,stu1,stu2,在定义了结构体变量后,系统会为之分配内存单元。,sizeof(stu1)=,2+
4、,20+,4,=26,结构体变量的定义,、在定义结构体类型的同时定义变量,struct 结构体类型标识符 类型标识符1成员名1;类型标识符2成员名2;类型标识符n成员名n;变量名列表;,struct student int num;char name20;float score;stu1,stu2;,、直接定义结构体类型变量,struct 类型标识符1成员名1;类型标识符2成员名2;类型标识符n成员名n;变量名列表;,(不出现结构体类型名),struct int num;char name20;float score;stu1,stu2;,3、关于结构体类型的几点说明:,、类型与变量是不同的概
5、念,不要混淆:,a、只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算;,b、在编译时,对类型不分配内存空间,只对变量分配空间。,、只有在定义变量后,才为该变量开辟存储单元。结构体变量所占的内存长度等于每个成员长度之和;,struct student int num;char name20;float score;;,sizeof(struct student)=26,、对结构体中的成员(“域”),可以单独使用,它的作用与地位相当于普通变量;,、成员也可以是一个已定义的结构体类型变量:,struct date int year;int month;int day;,struct st
6、udent int num;char name20;char sex;struct date birthday;char addr30;,sizeof(student)=?,注意:结构体变量中各成员按照结构体类型说明的顺序依次存放在一片连续的内存单元中,但它们的长度不同,不能像访问数组元素那样通过下标访问,而是通过它们的名字(即成员名)访问。,、成员也可以是指向本结构体类型的指针变量;,struct student int num;char name20;float score;struct student*next;,、成员名可以与程序中的变量名相同,二者不代表同一对象。,在定义结构体变量的
7、同时可以给它的全部或部分成员赋初值,完成初始化。结构体类型名 变量名=初值表列;,struct student stu1=10001,“Li Ming”,“男”,1983,7,1,”武汉理工大学”;,结构体变量的初始化,struct student int num;char name20;char sex;struct date int year;int month;int day;birthday;char addr30;,注意:要将结构体变量的各成员的值按类型说明时的顺序一一对应;所赋的值可用常量或常量表达式表示;列出的值可以少于成员的个数,没有给出的初值,由系统自动赋予缺省值。,stru
8、ct student timeint hours,minutes,seconds;nowtime=10,30;,1、引用形式:,结构体变量名.成员名,“.”是成员运算符,在所有的运算符中优先级最高。,struct student int num;char name20;float score;stu1,stu2;,stu1.num=10001;,stu1.score=95;,stu1.name,=Li Ming;,strcpy(stu1.name,Li Ming);,结构体变量的引用,2、不能将一个结构体变量作为一个整体进行输入输出:,printf(%d%s%f,stu1);,scanf(%d
9、%s%f,只能对结构体中的各个成员分别进行输入输出。,printf(%d%s%f,stu1.num,stu1.name,stu1.score);,scanf(%d,gets(stu1.name);,结构体变量的引用,成员名也是一个变量(称为成员变量),具有自己的数据类型,使用与同类型的变量相同。,3、只有在对结构体变量赋值或作为函数参数时才可以对一个结构体变量进行整体操作;(赋值时要求具有相同结构),stu2=stu1;,stu2.num=stu1.num;strcpy(stu2.name,stu1.name);stu2.score=stu1.score;,void fun(student p
10、x);,fun(stu1);,4、如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级的找到最低一级的成员。只能对最低一级的成员进行赋值、存取或运算;,stu1.birthday.year=2002;,结构体变量的引用,5、对成员变量可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算),sum=stu1.score+stu2.score;,stu1.age+;,结构体变量的引用,6、可以引用结构体变量成员的地址,也可以引用结构体变量的地址;,scanf(%d,printf(%x,结构体变量的地址主要用于作函数参数,传递结构体变量的地址;,7、在定义结构体变量的同时,可以
11、进行初始化。,struct student int num;char name20;char sex;char addr30;stu=15001,宋红,M,Beijing;,注意:结构体变量的各个初值用大括号、括起来,大括号内各个成员变量的值之间用逗号分隔,其值必须与成员变量一一对应,且数据类型应与成员变量一致。,结构体变量的引用,#include struct student int num;float score;void main()student stu,max;int i;float sum=0;max.score=0;for(i=0;imax.score)max=stu;sum+=
12、stu.score;printf(nMax:%d-%.1fn,max.num,max.score);printf(Sum is:%.1fn,sum);,例:输入5名学生的学号及成绩,求成绩最好的学生的学号、成绩和所有学生的总成绩。,结构体变量的引用,2.结构体数组,数组的每个元素都是结构体类型的数据,它们分别包含各个成员项。,1、先定义结构体类型,再定义结构体数组,struct student int num;float score;,struct student stu30;,2、定义结构体类型的同时定义结构体数组,struct student int num;float score;stu
13、30;,3、直接定义结构体数组,struct int num;float score;stu30;,一般形式:,struct 结构体类型标识符 类型标识符1成员名1;类型标识符2成员名2;类型标识符n成员名n;结构体数组=数组元素0的各个初值,数组元素1的各个初值,;,struct student int num;char name20;float score;stu3=10101,Li Ming,88,10102,Zhang Jin,92,10103,Wang Lin,98.5;,结构体数组的初始化,说明:,1、初始化时,数组元素的个数可以不指定,系统会根据初值的结构体常量的个数来确定数组元
14、素的个数;,struct student int num;char name20;float score;stu=10101,Li Ming,88,10102,Zhang Jin,92,10103,Wang Lin,98.5;,2、数组中各个元素的初值用大括号 括起来,同一数组元素的各个成员变量的初值用逗号分隔。,结构体数组应用举例,设李红、王建、赵明三名同学某学年考了8门课,要求分别统计出这3名同学该学年的总成绩,并按8门课总成绩的高低排序输出。,#include struct student char name20;float score;void main()student stu3=L
15、i Hong,0,Wang Jian,0,Zhao Ming,0;student temp;int i,j;float x;for(i=1;i=8;i+)printf(nInput the%dth course score:n,i);for(j=0;j3;j+)printf(Name:%-12sScore:,stuj.name);scanf(%f,3.结构体与指针,结构体变量的指针就是该变量所占据的内存段的起始地址。,(1)指向结构体变量的指针(2)指向结构体数组的指针(3)结构体指针作为函数参数,(1)指向结构体变量的指针,1、指向结构体变量指针的定义:,struct student int
16、 num;char name20;float score;,struct student stu,*p;,p=/p中存放着结构体变量stu在内存中的首地址,注意:不能用指向结构体变量的指针指向该结构体变量的某个成员。,p=,int*ip;ip=,、stu.num、stu.name、stu.score,、(*p).num、(*p).name、(*p).score,、p-num、p-name、p-score,2、访问结构体成员变量的三种方法:,3、说明:,、“-”为指向运算符,是优先级最高的运算符;,、成员运算符“.”的优先级高于指针运算符“*”,因此采用“(*p).成员名”形式时,括号不能省略;
17、,、注意以下几种运算:,p-num,得到p指向的结构体变量中的成员num的值,p-num+,得到p指向的结构体变量中的成员num的值,用完后该值加1,+p-num,使p指向的结构体变量中的成员num的值加1,(2)指向结构体数组的指针,指向结构体变量的指针变量,可以指向结构体变量,也可以指向同类型的结构体数组的元素。,struct student int num;char name30;float score;stu30,*p;,p=stu;,p=,p=,p只能指向一个struct student类型的数据(某个元素的的起始地址),不能指向一个成员变量。,(2)指向结构体数组的指针,注意:若p
18、已定义为指向结构体类型的数据,则p只能指向相应类型的变量或数组元素,不能指向数组元素中的某一成员;,#include#include struct student int num;char name20;float score;void main()student stu3=10101,Li,87,10102,Zhang,92,10103,Wang,95;struct student*p;printf(nnNo.Name Score);for(p=stu;pnum,p-name,p-score);,(3)结构体指针作为函数参数,将一个结构体变量的值传递给另一个函数,有3种办法:,、用结构体变量
19、的成员作参数:,将实参值传递给形参,属于“值传递”方式(注意实参与形参的类型保持一致)。,fun(stu.num);,void fun(int);,、用结构体变量作实参:,采取的是“值传递”方式,将结构体变量所占的内存单元的内容全部顺序传递给形参。要求形参也必须是同类型的结构体变量。,例:有一个结构变量stu,内含学生学号、姓名、和3门课的成绩,在main函数中赋值,在另一函数print中打印输出。,、用指向结构体变量(或数组)的指针作实参:,将结构体变量(或数组)的地址传给形参,#include#define FORMAT n%dn%sn%.1fn%.1fn%.1fnstruct stude
20、nt int num;char name20;float score3;void print(student ps)printf(FORMAT,ps.num,ps.name,ps.score0,ps.score1,ps.score2);void main()student stu=10101,Li Ming,87,96,93;print(stu);,主要内容,结构体 结构体的定义及引用 结构体数组 结构体与指针 共用体 枚举类型 类型标识符的自定义结构体与链表,共用体,共用体:使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。定义形式:union 共用体名类型标识符1成员名1;类
21、型标识符2成员名2;类型标识符n成员名n;变量表列;例如:引用形式:共用体名成员名注意:不能只引用共用体变量,union dataint i;char ch;float f;union data a,b,c;,union int i;char ch;float f;a,b,c;,直接定义,先定义类型,注意共用体类型变量与结构体类型变量的区别,结构体类型变量所占内存长度是各成员占的内存长度之和。共用体类型变量所占内存长度等于最长的成员的长度。,union uarea char c_data;short s_data;long l_data;,sizeof(union uarea)的结果为?,共用
22、体类型数据的特点,1.每一瞬时只有一个成员起作用;2.共用体变量中起作用的成员是最后一次存放的成员;3.共用体变量的地址和它的各成员的地址都是同一地址;4.不能对共用体变量名赋值,也不能企图引用变量名来得到成员的值,也不能在定义共用体变量时对它初始化。5.不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可使用指向共用体变量的指针;6.共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。而结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。,枚举类型,所谓“枚举”是指将变量的所有取值一一列举出来,变量的值只限于列举出来的值的范围内。,枚举类型变量的定义:,1、先定
23、义枚举类型标识符,再定义变量,enum 枚举类型标识符枚举元素1,枚举元素2,枚举元素n;,enum 枚举类型标识符 变量列表;,enum personMan,Woman;,enum person x;,enum weekdaySun,Mon,Tue,Wed,Thu,Fri,Sat;,enum weekday workday,weekend;,2、直接定义枚举变量,enum 枚举类型标识符枚举元素1,枚举元素2,枚举元素n变量列表;,enum personMan,Womanx;,enum weekdaySun,Mon,Tue,Wed,Thu,Fri,Sat workday,weekend;,e
24、num BOOLFALSE,TRUE;,3、说明:,Sun、Mon、Sat等称为枚举元素或枚举常量,是用户自定义标识符。,枚举变量的引用,1、在编译时,对枚举元素按常量处理,故称枚举常量。但它们不是常量,不能对它们赋值。,Sun=0;,TRUE=1;,2、枚举元素作为常量,它们是有值的。语言编译时按定义时的顺序使它们的值为0、1、2、,enum weekdaySun,Mon,Tue,Wed,Thu,Fri,Satworkday;,workday=Mon;,printf(%d,workday);,3、可以在定义时改变枚举元素的值,enum weekdaySun=7,Mon=1,Tue,Wed,T
25、hu,Fri,Satworkday;,enum weekdaySun=7,Mon,Tue,Wed=0,Thu,Fri,Sat;,4、枚举值可以用来做判断比较,if(workday=Mon),if(workdaySun),5、一个整数不能直接赋给一个枚举变量,workday=2;,workday=(enum weekday)2;,workday=(enum weekday)(x-y);,例:从键盘输入06的任意整数,0表示星期日,16分别表示星期一到星期六,要求编写程序输出对应的英文名称。,enum weekdaySunday,Monday,Tuesday,Wednesday,Thursday,
26、Friday,Saturdayweek;,switch(week)case Sunday:break;case Monday:break;case Tuesday:break;case Wednesday:break;case Thursday:break;case Friday:break;case Saturday:break;,类型标识符的自定义,1、除了可以直接使用提供的标准类型名(int、char、float等)和自己定义的数据类型(结构体、共用体、枚举类型)外,还可以用typedef声明新的类型名来代替已有的类型名。,typedef int INTEGER,int i,*p;,IN
27、TEGER i,*p;,typedef float REAL,float x,y;,REAL x,y;,2、定义类型标识符的方法:,、按定义变量的方式写出定义体:,、将变量名换成新的类型标识符:,、在最前面加typedef:,3、例:,、定义含有10 个元素的整型数组:,、先按照定义数组的形式书写:int a10;,、将变量名a换成自己指定的类型名:int ARRAY10;,、在前面加上typedef:typedef int ARRAY10;,ARRAY a,b;,、定义字符指针类型:,、char*p;,、char*STRING;,、typedef char*STRING;,STRING p,
28、ps10;,、声明结构体类型:,struct int num;char name20;float score;stu;,struct int num;char name20;float score;STUDENT;,typedef struct int num;char name20;float score;STUDENT;,STUDENT stu30,*p;,4、说明:,、自定义类型标识符可以是任意合法的标识符,习惯上常把用typedef定义的标识符用大写字母表示,以便与系统提供的标准类型标识符相区别;,、用typedef只能为已经存在的数据类型标识符另起一个新名,而不能创造一种新的数据类型
29、;,typedef int ARRAY10;,、typedef与#define有相似之处:,typedef int INTEGER,#define INTEGER int,作用都是用INTEGER代表int。,#define是在编译之前进行处理的,只做简单的字符替换。,typedef是在编译时处理的,实际上并不是做简单的字符替换,如:typedef int ARRAY10;,并不是用“ARRAY10”去代替int,而是采用如同定义变量的方法那样来声明一个类型。,选择菜单,用户根据菜单提示选择要进行的操作优点:方便用户的交互实现方法:窗口菜单,while(1)printf(-n);printf(
30、|菜单|n);printf(|n);printf(|1.输出元素|n);printf(|2.插入元素|n);printf(|3:删除元素|n);printf(|4.查找|n);printf(|5.排序|n);printf(|6.退出程序|n);printf(-n);printf(请输入你的选择n);scanf(%c,习题1、用结构数组实现学生信息的统计功能。struct student long no;/*学号*/char name10;/*姓名*/char sex;/*性别*/int age;/*年龄*/float score;/*平均成绩*/完成下列任务:输入实际学生人数n(2n6);输入每个学生的信息,组成结构数组,并输出;统计男、女生人数并输出;计算全班平均成绩并输出;将低于全班平均成绩的学生信息按行输出,课后习题,习题2、用结构数组保存书的信息。结构体中包含数据:图书编号、图书名称、作者姓名、出版社名、出版日期。涉及各个函数分别实现以下功能:图书信息的输入显示所有图书的信息输入作者姓名,显示该作者编写的图书的记录设计菜单,通过选择菜单调用以上各函数,课后习题,