模块9结构体和其他构造类型电子课件 C语言程序设计案例教程.pptx
《模块9结构体和其他构造类型电子课件 C语言程序设计案例教程.pptx》由会员分享,可在线阅读,更多相关《模块9结构体和其他构造类型电子课件 C语言程序设计案例教程.pptx(98页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、模块9 结构体和其他构造类型假设学生成绩表如表7-1所示。编写一个C程序,以结构体数组类型存储表71中学生的信息。循环计算每位学生所有课程的总分成绩,并按总分成绩由大到小排序,打印学生名次、姓名、总分。大致步骤如下。(1)定义学生成绩单结构类型。(2)在程序入口初始化学生成绩并计算每位学生的总分。(3)利用选择法按学生的总分进行排序。(4)循环打印排序后的名次、姓名、总分。如果学生人数很多,输入至内存变量的数据,当程序结束时就丢失了,希望长期保存数据怎么办(参考模块10中的内容)?任务描述模块9 结构体和其他构造类型(1)能够用结构体数据类型表述客观事物。(2)能够定义和赋值结构体数据类型的变
2、量。(3)能够熟练运用结构体数组。(4)能够掌握结构体的基本概念,为数据结构中动态链接的物理存储结构打好基础。(5)培养数据处理的逻辑思维能力。任务目标模块9 结构体和其他构造类型#include#define N 3#define M 6typedef struct studentchar name12;float scoreM,sum;ST;void input(ST s)源代码展示模块9 结构体和其他构造类型int i,j;float total;for(i=0;iN;i+)total=0;printf(请输入第%d位同学的姓名:,i+1);scanf(%s,si.name);print
3、f(请输入该同学%d门课成绩:,M);for(j=0;jM;j+)源代码展示模块9 结构体和其他构造类型scanf(%f,&si.scorej);total+=si.scorej;si.sum=total;void sort(ST s)int i,j,k;源代码展示模块9 结构体和其他构造类型ST t;for(i=0;iN;i+)k=i;for(j=i+1;jsk.sum)k=j;if(i!=k)t=si;si=sk;sk=t;源代码展示模块9 结构体和其他构造类型main()int i;ST stdN;input(std);printf(n原始数据:n);printf(编号 姓 名 总分n)
4、;for(i=0;iN;i+)源代码展示模块9 结构体和其他构造类型 printf(%4d%10s%8.1fn,i+1,stdi.name,stdi.sum);sort(std);printf(n排序后:n);printf(名次 姓 名 总分n);for(i=0;iN;i+)printf(%4d%10s%8.1fn,i+1,stdi.name,stdi.sum);源代码展示模块9 结构体和其他构造类型程序运行结果如图9-1所示。运行结果模块9 结构体和其他构造类型本程序定义了一个结构体类型struct student,用typedef命名为ST;函数input用来实现学生信息的输入并计算总分成
5、绩,借助s数组参数传递数据;函数sort完成结构数组的排序,排序中交换数据时,结构体变量直接交换数据(注意临时变量t的类型定义)。在主函数中,调用函数input,输出排序前的结果,再调用sort函数排序,输出排序后的结果。模块6中学习了一种十分有用的数据结构数组,但数组只能用来存放一组相同类型的数据。在实际应用中,一组数据通常是由不同类型的数据组成的。例如,在成绩管理系统中,学生的信息包括学号、姓名、性别、年龄、高等数学、大学英语、计算机文化基础等数据项,各数据项的数据类型不尽相同。为此,C语言提供了结构体数据类型,它可以把多个数据项组合起来,作为一个整体数据进行处理。本模块将依次介绍在C语言
6、中可由用户构造的3种数据类型:结构体(struct)、共用体(union)和用户定义类型(typedef)。程序分析9.1 结构体变量结构体是一种构造类型(自定义类型),除了结构体变量需要定义后才能使用外,结构体类型本身也需要定义。结构体由若干成员组成,每个成员可以是一个基本的数据类型,也可以是一个已经定义的构造类型。9.1.1 结构体类型的定义结构体类型一般由用户根据需要自己定义,定义格式如下。struct 结构体类型名类型名1结构体成员名表1;类型名2结构体成员名表2;类型名n结构体成员名表n;需要说明如下几点。(1)结构体类型的命名应该遵循标识符规定。(2)结构体有若干数据成员,分别属于
7、各自的数据类型,结构体成员名9.1.1 结构体类型的定义同样遵循标识符规定,名字可以与程序中其他变量或标识符同名。(3)使用结构体类型时,“struct 结构体类型名”作为一个整体,表示名字为“结构体类型名”的结构体类型。(4)结构体类型的成员可以是基本数据类型,也可以是其他已经定义的结构体类型,即结构体嵌套。结构体成员的类型不能是正在定义的结构体类型,但可以是正在定义的结构体类型的指针。例如,定义关于学生信息的结构体类型。struct dateint year,month,day;9.1.1 结构体类型的定义struct studentchar num10;char name12;char
8、sex;struct date birthday;char addr30;float score4;上面指定了一个新的结构体类型struct student。struct student是一个类型名,它和系统提供的标准类型(如int等)一样具有相同的地位和作用。9.1.1 结构体类型的定义不要忽略最后的分号。struct student是结构体类型名,struct是关键词,在定义和使用时均不能省略。该结构体类型由6个成员组成,分别属于不同的数据类型,其中成员birthday是struct date类型。9.1.2 结构体变量的定义声明了结构体类型后,还不能使用,因为声明的只是一种数据类型,必须
9、定义变量才能使用。可以用以下3种方式定义结构体的变量。(1)先声明结构体类型再定义变量。例如:struct student/*结构体类型声明*/char num10;char name12;char sex;char addr30;float score4;9.1.2 结构体变量的定义struct student stud1,stud2;/*结构体变量定义*/(2)在声明结构体类型的同时定义变量。例如:struct studentchar num10;char name12;char sex;char addr30;float score4;stud1,stud2;(3)紧跟无名结构体类型声明
10、后直接定义变量。例如:9.1.2 结构体变量的定义struct char num10;char name12;char sex;char addr30;float score4;stud1,stud2;需要注意如下几点。结构体类型、结构体变量是不同的概念。一般先定义一个结构体类型,然后定义变量为该类型的变量。9.1.2 结构体变量的定义赋值、存取或运算只能对结构体变量,不能对结构体类型。结构体类型名只能表示一个结构形式,编译系统并不对它分配内存空间,只对结构体变量分配内存空间。各成员占据连续空间的不同地址,所占内存大小等于各成员所占内存之和。9.1.3结构体变量的初始化和一般的变量一样,结构体
11、变量也可以在定义的同时赋初值。但是变量后面的一组数据应该用“”括起来,其顺序也应该与结构体中的成员顺序保持一致。例如:struct studentchar name12;char sex;float score;char addr30;std=Li xue,F,580.8,Yantai;9.1.4结构体变量的引用在使用结构体时,不仅要对结构体整体进行操作,更多的是要访问结构体中的某个成员。引用结构体变量中成员的格式如下。结构体变量名.成员名例如,std.name表示std变量中的name成员,std.score表示std变量中的score成员。可以对变量的成员赋值。例如:std.score=9
12、0.6;但成员若是字符数组则不能用赋值语句,只能用strcpy()来实现。例如:strcpy(std.name,”lili”);需要说明如下几点。(1)如果成员本身又是结构体类型,则要用若干成员运算符,一级一级9.1.4结构体变量的引用地找到最低的一级成员。只能对最低的成员进行赋值或、存取和运算。例如:stud1.birthday.yearstud1.birthday.monthstud1.birthday.day(2)同一种类型的结构体变量之间可以赋值(整体赋值、成员逐个依次赋值)。例如:stud2=stud1;(3)不允许将一个结构体变量整体输入/输出。【例9-1】编写程序,计算某学生的平
13、均分。程序代码如下。9.1.4结构体变量的引用#include#include string.hstruct stuchar num10;float s3;main()float ave;struct stu li;9.1.4结构体变量的引用strcpy(li.num,2018001);li.s0=78;li.s1=92;li.s2=89;ave=(li.s0+li.s1+li.s2)/3;printf(学号 成绩1 成绩2 成绩3 平均分n);printf(%s%8.1f%8.1f%8.1f%8.1fn,li.num,li.s0,li.s1,li.s2,ave);程序运行结果如下。学号成绩1
14、成绩2成绩3平均分201800178.092.089.086.39.2 结构体数组与指针一个结构体变量中可以存放学号、姓名、成绩等信息,如果有10个学生的数据需要处理,显然应该采用数组,这就是结构体数组。结构体数组与之前介绍的数值型数组的不同之处在于每个数组元素都是一个结构体类型的数据,它们又分别包括各个成员项。9.2.1 结构体数组结构体数组是指数组元素的类型为结构体类型的数组。C语言允许使用结构体数组存放一类对象的数据。1.结构体数组的定义定义结构体数组的语法格式如下。struct 结构体类型名 结构体数组名常量表达式例如:struct studentchar name12;char se
15、x;float score;9.2.1 结构体数组char addr30;struct student std3;2.结构体数组的初始化与其他类型的数组一样,对结构体数组可以初始化。例如:struct studentchar name12;char sex;float score;char addr30;9.2.1 结构体数组;struct student std3=WangGang,M,650.0,jinan,SunYan,F,620.8,weihai,PengChao,M,723.0,yantai;3.结构体数组元素的引用引用结构体数组元素的方法如下。结构体数组名下标.成员名若要修改上面结
16、构体数组初始化中std1的score为680.0,则使用语句:std1.score=680.0;【例9-2】编写程序,求3名学生的平均分并输出。9.2.1 结构体数组程序代码如下。#include#include struct stulchar num10;float s3,ave;main()struct stul student3;9.2.1 结构体数组float sum;int i,j;for(i=0;i3;i+)printf(请输入第%d位学生的学号:,i+1);gets(studenti.num);/*输入学号*/sum=0;printf(请输入学号%s的3门课成绩:,student
17、i.num);for(j=0;j3;j+)scanf(%f,&studenti.sj);/*输入成绩*/9.2.1 结构体数组sum+=studenti.sj;/*结构体类型的成员变量累加*/studenti.ave=sum/3;fflush(stdin);/*清空缓冲区,stdin表示标准输入*/for(i=0;i成员名。(2)(*结构体指针变量名).成员名。“-”称为结构指针运算符,“.”称为成员运算符。若有以下定义和语句:struct keyint count;char word8;struct key a=12,abc,*p=&a;则引用结构变量a中的count域可以使用以下3种等价形
18、式。9.2.2 结构体指针变量(1)a.count。(2)p-count。(3)(*p).count。3.结构体指针变量与数组前面已经介绍过,可以使用指向数组的指针来访问数组元素。同样,对结构体数组也可以使用指针变量来访问结构数组中的元素。【例9-3】用指针访问结构体变量及结构体数组。程序代码如下。#include main()9.2.2 结构体指针变量struct studentchar num10;char name12;char sex;int age;float score;struct student stu3=“201702”,Wang,F,20,483,“201703”,Liu,
19、M,19,503,“201704”,Song,M,19,471.5;9.2.2 结构体指针变量struct student student1=“201701”,Zhang,F,19,496.5,*p,*q;int i;p=&student1;printf(%s,%c,%5.1fn,student1.name,(*p).sex,p-score);/*访问结构体变量*/q=stu;for(i=0;iname,q-sex,q-score);程序运行结果如下。Zhang,F,496.5Wang,F,483.0Liu,M,503.0Song,M,471.59.3函数之间结构体类型的数据传递结构体变量、结
20、构体指针变量都可以像其他数据类型一样作为函数的参数,也可以将函数定义为结构体类型或结构体指针类型(返回值为结构体、结构体指针类型)。9.3.1结构体变量作为实参用结构体变量作为实参时,采取的是值传递方式,将结构体变量所占的内存单元内容全部顺序传递给形参。形参也必须是同类型的结构体变量。在函数调用期间形参也要占用内存单元,这种传递方式在空间和时间上开销较大。另外,由于采用值传递方式,如果在被调函数中改变了形参的值,该值也不会返回主调函数,这往往造成使用上的不便。【例9-4】编写程序,计算某学生的平均成绩,要求调用函数完成并使用结构体变量作为实参。程序代码如下。#include struct st
21、udent9.3.1结构体变量作为实参char num10;float s3;float ave;void average(struct student s)/*形参为与实参相同类型的结构变量*/s.ave=(s.s0+s.s1+s.s2)/3;printf(%s的平均分是:%.1fn,s.num,s.ave);main()9.3.1结构体变量作为实参struct student stu=2018001,60,75,80;average(stu);/*结构体变量作为实参*/printf(%s的平均分是:%.1fn,stu.num,stu.ave);程序运行结果如下。2018001的平均分是:7
22、1.72018001的平均分是:0.0由【例9-4】得出以下结论。(1)当实参是结构体变量时,形参应与实参是相同类型的结构题变量。函数调用时实参各成员的值一一对应传到形参各成员中。(2)分析程序运行结果不难看出,实参和形参之间的数据传递是单向的,9.3.1结构体变量作为实参形参的改变不能影响实参的值。在被调函数average中经过计算后,成员ave原来的值被71.7取代,但该形参的改变不影响实参,所以在主函数中输出实参的ave的值为0.0。9.3.2 结构体变量指针作为实参用指向结构体变量的指针作为实参,将结构体变量的地址传给形参。【例9-5】编写程序,计算某学生的平均成绩,要求调用函数完成并
23、使用结构体变量的地址作为实参。程序代码如下。#include struct studentchar num10;float s3;float ave;9.3.2 结构体变量指针作为实参void average(struct student*p)p-ave=(p-s0+p-s1+p-s2)/3;main()struct student stu=2018001,60,75,80;average(&stu);printf(%s的平均分是:%.1fn,stu.num,stu.ave);程序运行结果如下。9.3.2 结构体变量指针作为实参2018001的平均分是:71.7由【例9-5】得出以下结论。(1
24、)当实参是结构体变量的地址时,形参应与实参是相同类型的结构体指针变量。函数调用时,实参的地址值传给形参中的指针变量。系统只需为形参指针开辟一个存储单元存放实参结构体变量的地址,而不必另建立一个结构体变量。这样可以减少系统操作所需的时间,提高程序的执行效率。(2)在被调函数中可以通过引用形参的指针变量和访问主调函数中的结构体变量,即可以通过函数的调用,有效地修改实参结构体中成员的值。9.3.3 结构体数组作为参数与普通数组一样,结构数组名也可以作为实参,但是因为数组名本身是一个地址值,所以,用结构体数组名作为参数时,实参与形参都应用结构体数组名或结构体指针。【例9-6】编写程序,计算N个学生的平
25、均成绩,要求调用函数完成并使用结构体数组作为实参。程序代码如下。#include#define N 3struct studentchar num10;9.3.3 结构体数组作为参数float s3,ave;void average(struct student p)int i;for(i=0;iN;i+)pi.ave=(pi.s0+pi.s1+pi.s2)/3;main()int i;9.3.3 结构体数组作为参数struct student stuN=201801,60,75,80,201802,85,90,80,201803,88,75,90;average(stu);for(i=0;i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模块9结构体和其他构造类型电子课件 C语言程序设计案例教程 模块 结构 其他 构造 类型 电子 课件 语言程序设计 案例 教程
限制150内