《C语言综合实验》2构造数据类型.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

C语言综合实验构造数据类型构造数据类型除了int、float、char等基本数据类型外,C语言还提供了构造数据类型,来满足不同应用的需要。构造数据类型是由基本数据类型按一定规则组成的,也称作“导出类型”。构造数据类型包括数组、结构体、共用体。数组(array)就是一种构造类型。它能将具有相同类型的数据组合在一起,通常是用于处理批量数据。主要内容结构体–结构体的定义及引用–结构体数组–结构体与指针共用体枚举类型类型标识符的自定义1.结构体的定义及引用有时候需要将不同类型的数据组合成一个有机的整体,这些组合在一个整体中的数据是互相联系的。如一个学生的信息包括学号、姓名、性别、年龄、成绩、地址等。numnamesexagescoreaddr08001LiMingM1996.5武汉intnum;charname[20];charsex;intage;floatscore;charaddr[30];可以把它们组织成一个组合项,在一个组合项内包含若干个类型不同(或相同)的数据项。C语言提供了这种数据结构:允许用户将不同类型的数据组合成一个有机的整体,这些数据互相联系,这种数据结构称为结构体(structure)。结构体的定义是指定义相应的数据结构及相应的变量。步骤:①先定义一个结构体类型标识符②用该标识符去定义相应的变量structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};说明:①struct是关键字,不能省略,表示定义结构体;②student是用户自己定义的结构体类型标识符,即该结构体名;③结构体中具体每项的定义,由{}括起来。C语言中把用户自己定义的数据项称为成员(或域),即每个成员也叫结构体中的一个域。结构体类型标识符的定义定义一个结构体类型的一般形式:struct结构体类型标识符{类型标识符1成员名1;类型标识符2成员名2;…………类型标识符n成员名n;};结构体名成员列表结构体类型标识符的定义1、定义形式:[struct]结构体类型标识符变量名列表;2、定义结构体变量的三种方法:①先定义结构体类型再定义变量名structstudent{intnum;charname[20];floatscore;};structstudentstu1,stu2;结构体类型名结构体变量名08001Zhang9208002Li97stu1stu2在定义了结构体变量后,系统会为之分配内存单元,大小为所有成员所占内存之和:sizeof(stu1)=2+20+4=26结构体变量的定义②在定义结构体类型的同时定义变量struct结构体类型标识符{类型标识符1成员名1;类型标识符2成员名2;…………类型标识符n成员名n;}变量名列表;structstudent{intnum;charname[20];floatscore;}stu1,stu2;③直接定义结构体类型变量struct{类型标识符1成员名1;类型标识符2成员名2;…………类型标识符n成员名n;}变量名列表;(不出现结构体类型名)struct{intnum;charname[20];floatscore;}stu1,stu2;3、关于结构体类型的几点说明:①类型与变量是不同的概念,不要混淆:a、只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算;b、在编译时,对类型不分配内存空间,只对变量分配空间。②只有在定义变量后,才为该变量开辟存储单元。结构体变量所占的内存长度等于每个成员长度之和;structstudent{intnum;charname[20];floatscore;};sizeof(structstudent)=2+20+4=26③对结构体中的成员(“域”),可以单独使用,其作用与地位相当于普通变量;④成员也可以是一个已定义的结构体类型变量,即结构体可以嵌套;structdate{intyear;intmonth;intday;};structstudent{intnum;charname[20];charsex;structdatebirthday;charaddr[30];};sizeof(student)=?注意:结构体变量中各成员按照结构体类型说明的顺序依次存放在一片连续的内存单元中,但它们的长度不同,不能像访问数组元素那样通过下标访问,而是通过它们的名字(即成员名)访问。⑤成员也可以是指向本结构体类型的指针变量;structstudent{intnum;charname[20];floatscore;structstudent*next;};⑥成员名可以与程序中的变量名相同,二者不代表同一对象。链表在定义结构体变量的同时可以给它的全部或部分成员赋初值,完成初始化。结构体类型名变量名={初值表列};structstudentstu1={10001,“LiMing”,“男”,{1983,7,1},“武汉理工大学”};结构体变量的初始化structstudent{intnum;charname[20];charsex;structdate{intyear;intmonth;intday;}birthday;charaddr[30];};注意:要将结构体变量的各成员的值按类型说明时的顺序一一对应;所赋的值可用常量或常量表达式表示;列出的值可以少于成员的个数,没有给出的初值,由系统自动赋予缺省值。structtime{inthours,minutes,seconds;}nowtime={10,30};1、引用形式:结构体变量名.成员名“.”是成员运算符,在所有的运算符中优先级最高。structstudent{intnum;charname[20];floatscore;}stu1,stu2;stu1.num=10001;stu1.score=95;stu1.name=LiMing;strcpy(stu1.name,LiMing);结构体变量的引用2、不能将一个结构体变量作为一个整体进行输入输出:printf(%d%s%f,stu1);scanf(%d%s%f,&stu1);只能对结构体中的各个成员分别进行输入输出。printf(%d%s%f,stu1.num,stu1.name,stu1.score);scanf(%d,&stu1.num);gets(stu1.name);结构体变量的引用成员名也是一个变量(称为成员变量),具有自己的数据类型,使用与基本类型的变量相同。3、只有在对结构体变量赋值或作为函数参数时才可以对一个结构体变量进行整体操作;(赋值时要求具有相同结构)stu2=stu1;stu2.num=stu1.num;strcpy(stu2.name,stu1.name);stu2.score=stu1.score;voidfun(studentpx);fun(stu1);4、如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级的找到最低一级的成员。只能对最低一级的成员进行赋值、存取或运算;stu1.birthday.year=2002;结构体变量的引用structstudent{intnum;charname[20];charsex;structdate{intyear;intmonth;intday;}birthday;charaddr[30];}stu1;5、对成员变量可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)sum=stu1.score+stu2.score;stu1.age++;结构体变量的引用6、可以引用结构体变量成员的地址,也可以引用结构体变量的地址;scanf(%d,&stu1.num);结构体变量的地址主要用于作函数参数,传递结构体变量的地址;voidfun(student*px);fun(&stu1);7、在定义结构体变量的同时,可以进行初始化。structstudent{intnum;charname[20];charsex;charaddr[30];}stu={15001,宋红,'M',Beijing};注意:结构体变量的各个初值用大括号{、}括起来,大括号内各个成员变量的值之间用逗号分隔,其值必须与成员变量一一对应,且数据类型应与成员变量一致。结构体变量的引用#includestdio.hstructstudent{intnum;floatscore;};voidmain(){studentstu,max;inti;floatsum=0;max.score=0;for(i=0;i5;i++){scanf(%d%f,&stu.num,&stu.score);if(stu.scoremax.score)max=stu;sum+=stu.score;}printf(\nMax:%d-%.1f\n,max.num,max.score);printf(“sumis:%.1f\n,sum);}例:输入5名学生的学号及成绩,求成绩最好的学生的学号、成绩和所有学生的总成绩。结构体变量的引用2.结构体数组•数组的每个元素都是结构体类型的数据,它们分别包含各个成员项。1、先定义结构体类型,再定义结构体数组structstudent{intnum;floatscore;};structstudentstu[30];2、定义结构体类型的同时定义结构体数组structstudent{intnum;floatscore;}stu[30];3、直接定义结构体数组struct{intnum;floatscore;}stu[30];struct结构体类型标识符{类型标识符1成员名1;类型标识符2成员名2;…………类型标识符n成员名n;}结构体数组={{数组元素0的各个初值},{数组元素1的各个初值},……};structstudent{intnum;charname[20];floatscore;}stu[3]={{10101,LiMing,88},{10102,ZhangJin,92},{10103,WangLin,98.5}};结构体数组的初始化说明:1、初始化时,数组元素的个数可以不指定,系统会根据初值的结构体常量的个数来确定数组元素的个数;structstudent{intnum;charname[20];floatscore;}stu[]={{10101,LiMing,88},{10102,ZhangJin,92},{10103,WangLin,98.5}};2、数组中各个元素的初值用大括号{}括起来,同一数组元素的各个成员变量的初值用逗号分隔。结构体数组应用举例设李红、王建、赵明三名同学某学年考了8门课,要求分别统计出这3名同学该学年的总成绩,并按8门课总成绩的高低排序输出。#includestdio.hstructstudent{charname[20];floatscore;};voidmain(){studentstu[3]={{LiHong,0},{WangJian,0},{ZhaoMing,0}};studenttemp;inti,j;floatx;for(i=1;i=8;i++){printf(\nInputthe%dthcoursescore:\n,i);for(j=0;j3;j++){printf(Name:%-12sScore:,stu[j].name);scanf(%f,&x);stu[j].score+=x;}}for(i=0;i2;i++)for(j=i+1;j3;j++)if(stu[i].scorestu[j].score){temp=stu[i];stu[i]=stu[j];stu[j]=temp;}for(i=0;i3;i++)printf(\nName:%-15sScore:%.1f,stu[i].name,stu[i].score);}课程总成绩3.结构体与指针结构体变量的指针就是该变量所占据的内存段的起始地址。(1)指向结构体变量的指针(2)指向

1 / 46
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功