c语言教程 (11).ppt
《c语言教程 (11).ppt》由会员分享,可在线阅读,更多相关《c语言教程 (11).ppt(66页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第十一章第十一章结构体与共用体结构体与共用体江苏大学计算机学院计算机科学系2教学要求、重点与难点教学要求、重点与难点l要求要求、了解结构体类型变量及结构体数组;2、掌握结构指针;3、掌握用指针处理链表;4、了解共用体的概述和枚举类型的说明;5、简单了解用 typedef typedef 定义类型。l重点与难点重点与难点1.结构体及结构体数组的引用;2.用指针处理链表。23内内 容容1结构体类型的定义2定义结构体类型变量的三种方法3结构体变量的引用4 结构体变量的初始化5结构体数组6指向结构体类型数据的指针 7用指针处理链表8 共用体 本章作业 本章小结9 枚举类型3411.1结构体类型的定义结
2、构体类型的定义 在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。显然不能用一个数组来存放这一组数据。如:语言中提供了另一种构造数据类型“结构体”。它相当于其它高级语言中的记录。“结构体”是一种构造类型,它是由若干“成员”组成的 num name sex age score addr 10010 Li Fan M 18 87.5 Beijing4511.1结构体类型的定义结构体类型的定义一、定义一个结构体的一般形式为:struct 结构名 成员表列 ;二、成员类型说明形式为:类型说明符 成
3、员名;因此若有n个成员,其结构体定义形式为:struct 结构名 类型说明符1 成员名1;类型说明符2 成员名2;.类型 说明符n 成员名n;;例如:struct student int num;char name20;char sex;int age;float score;char addr30;注意在括号后的分号是不可少的。5611.2定义结构体类型变量的三种方法定义结构体类型变量的三种方法一、先定义结构体类型,再定义变量名:定义结构体类型的一般形式:struct 结构体名 成员表列;定义结构体变量的一般形式:struct 结构体名 变量名;二、定义结构类型的同时定义结构变量:.定义的一
4、般形式:struct 结构体名 成员表列 变量名表列;三、直接定义结构类型变量 定义的一般形式:struct 成员表列 变量名表列;6711.2定义结构体类型变量的三种方法定义结构体类型变量的三种方法一、先定义结构体类型,再定义变量名:如:struct student int num;char name20;char sex;int age;float score;char addr30;struct student s1,s2;/*变量定义*/?29?1900?值值addrscoreagesexnamenum元素元素654321序号序号结构体变量结构体变量 S1S1,S2 S2 的元素在内存
5、中的排列次序的元素在内存中的排列次序7811.2定义结构体类型变量的三种方法定义结构体类型变量的三种方法二、定义结构类型的同时定义结构变量:.如:struct student int num;char name20;char sex;int age;float score;char addr30;s1,s2;?29?1900?值值addrscoreagesexnamenum元素元素654321序号序号结构体变量结构体变量 S1S1,S2 S2 的元素在内存中的排列次序的元素在内存中的排列次序8911.2定义结构体类型变量的三种方法定义结构体类型变量的三种方法三、直接定义结构类型变量:如:str
6、uct int num;char name20;char sex;int age;float score;char addr30;s1,s2;?29?1900?值值addrscoreagesexnamenum元素元素654321序号序号结构体变量结构体变量 S1S1,S2 S2 的元素在内存中的排列次序的元素在内存中的排列次序91011.2定义结构体类型变量的三种方法定义结构体类型变量的三种方法四、关于结构体类型的说明:1、类型与变量是不同的概念2、结构体成员可象变量一样单独使用3、成员还可以是结构体变量如:struct date int month;int day;int year;4、成员
7、名可以与变量同名struct student int num;char name20;char sex;int age;struct date birthday;char addr30;s1,s2;101111.3结构体类型变量的引用结构体类型变量的引用 只有在对结构体变量赋值或作为参数传递给函数等特殊情况下可以直接对一个结构体变量整体操作。其他情况只能对结构体变量的各个成员分别引用。一、结构体变量成员引用的一般形式:结构体变量名.成员名 如:s1.num 成员变量可以进行各种运算(如普通变量一样),如:+s1.num;二、结构体嵌套引用:.如:s1.birthday.day成员运算符1112
8、11.3结构体类型变量的引用结构体类型变量的引用三、同类型的结构体变量间可相互赋值 如:s1=s2四、可引用结构体变量或成员的地址 如:scanf(%d,&s1.num);printf(“%o”,&s1);/*输出s1的首地址*/结构体变量的地址主要用于函数参数,传递结构体的地址121311.4结构体变量的初始化结构体变量的初始化外部、静态和自动结构体变量可以初始化如:struct student long int num;char name20;char sex;char addr20;s1=99001,Li Lin,M,Bejing;num name sex addr 99001 LiLi
9、n M BeiJing1234结构体变量s1的元素在内存中的排列次序序号元素值131411.4结构体变量的初始化结构体变量的初始化例10-1 输入某班32名学生的学号和考试成绩,求成绩最好的学生的学号和成绩及总成绩。分析:定义结构体,包含两个成员:学号和成绩。main()struct struct_name int num;float score;student,max;int i;float sum;max.score=0;sum=0;结构体变量student和max,用来存放成绩最好的那个学生的信息。变量初始化i 用来控制循环 sum用来存放总成绩定义结构体类型struct_name141
10、511.4结构体变量的初始化结构体变量的初始化for (i=1;imax.score)max=student;sum=sum+student.score;printf(“n%d%f%f”,max.num,max.score,sum);相当于max.num=student.num;max.score=student.score;151611.5结构体数组结构体数组一、结构体数组的定义如:struct student long int num;char name20;char sex;int age;float score;char addr30;struct student stu3;以上定义了
11、一个数组 stu,数组有3个元素,元素类型为struct student。161711.5结构体数组结构体数组二、结构体数组的初始化如:struct student long int num;char name20;char sex;int age;float score;char addr30;stu3=101,Li ping,M,45,80,Beijing,102,Zhang ping,M,30,62.5,Shanghai,103,He fang,F,22,92.5,Tianjin ;171811.5结构体数组结构体数组例10-2三个候选人,每次输入一个得票的候选人的名字,最后输出各人得票
12、结果分析:(1)输入:选票中候选人名;(2)输出:三个候选人的得票数;(3)算法思路:匹配人名,在每个候选人名下写出票数;数据结构设想:用 leader结构数组来存放候选人名及得票数;struct person char name20;int count;leader3=Li,0,Zhang,0,Fun,0;Leader 数组leader0 leader1 leader2name count name count name countLi 0 Zhang 0 Fun 0181911.5结构体数组结构体数组struct person char name20;int count;leader3=L
13、i,0,Zhang,0,Fun,0;main()int j,k;char leader_name20;for (j=1;j=10;j+)scanf(%s,leader_name);for(k=0;k 3;k+)if(strcmp(leader_name,leaderk.name)=0)leaderk.count+;printf (n);for(j=0;j 3;j+)printf(%5s:%dn,leaderj.name,leaderj.count);人名不同第 j 个候选人的姓名及总得票数for(j=0;j 3;j+)得票数增1得票相同for(k=0;k 3;k+)输入一张选票,人名:lead
14、er_namefor(j=1;j=10;j+)192011.5结构体数组结构体数组例10-3设某组有4 个人,填写如下的登记表,除姓名、学号外,还有三科成绩,编程实现对表格的计算,求解出每个人的三科平均成绩,求出四个学生的单科平均分,并按平均成绩由高分到低分输出。Number Name English Mathema Physics Average 1 Liping 78 98 76 2 Wangling 66 90 86 3 Jiangbo 89 70 76 4 Yangming 90 100 67题目要求的问题多,采用模块化编程方式,将问题进行分解如下:1)结构体类型数组的输入。2)求解各
15、学生的三科平均成绩。3)按学生的平均成绩排序。4)按表格要求输出。5)求解组内学生单科平均成绩并输出。6)定义main()函数,调用各子程序。202111.5结构体数组结构体数组第一步,根据具体情况定义结构体类型。struct stu char name20;/*姓名*/long number;/*学号*/float score4;/*数组依次存放English,Mathema,Physics,Average*/;由于该结构体类型会提供给每个子程序使用,是共用的,所以将其定义为外部的结构体类型,放在程序的最前面。212211.5结构体数组结构体数组第二步,定义结构体类型数组的输入模块。void
16、 input(struct stu arr,int n)/*输入结构体类型数组arr的n 个元素*/int i,j;char temp30;for(i=0;in;i+)printf(ninput name,number,English,mathema,physicn);/*打印提示信息*/gets(arri.name);/*输入姓名*/gets(temp);/*输入学号*/arr i.number=atol(temp);for(j=0;j 3;j+)gets(temp);/*输入三科成绩*/arri.scorej=atoi(temp);222311.5结构体数组结构体数组第三步,求解各学生的三
17、科平均成绩。在结构体类型数组中第i 个元素arri的成员score的前三个元素为已知,第四个Average需计算得到。void aver(struct stu arr,int n)int i,j;for(i=0;in;i+)/*n 个学生*/arri.score 3 =0;for(j=0;j 3;j+)arri.score3=arri.score3+arri.scorej;/*求和*/arri.score3=arri.score3/3;/*平均成绩*/232411.5结构体数组结构体数组第四步,按平均成绩排序,排序算法采用冒泡法。void order(struct stu arr,int n)
18、struct stu temp;int i,j,x,y;for(i=0;i n-1;i+)for(j=0;j arrj+1.score3)temp=arrj;/*结构体类型变量不允许以整体输入或输出,但允许相互赋值*/arrj=arrj+1;/*进行交换*/arrj+1=temp;2425第五步,按表格要求输出。void output(arr,n)/*以表格形式输出有n 个元素的结构体类型数组各成员*/struct stu arr;int n;int i,j;printf(*TABLE*n);/*打印表头*/printf(-n);/*输出一条水平线*/printf(|%10s|%8s|%7s|
19、%7s|%7s|%7s|n,Name,Number,English ,Mathema,physics ,average );/*输出效果为:|Name|Number|English|Mathema|Physics|Average|*/printf(-n );11.5结构体数组结构体数组252611.5结构体数组结构体数组for(i=0;in;i+)printf(|%10s|%8ld|,arri.name,arri.number);/*输出姓名、学号*/for(j=0;j 4;j+)printf(%7.2f|,arri.scorej);/*输出三科成绩及三科的平均*/printf(n);prin
20、tf(-n );262711.5结构体数组结构体数组第六步,求解组内学生单科平均成绩并输出。在输出表格的最后一行,输出单科平均成绩及总平均。void out_row(struct stu arr,int n)/*对n 个元素的结构体类型数组求单项平均*/static float row4;/*定义存放单项平均的一维数组*/int i,j;for(i=0;i 4;i+)for(j=0;j n;j+)rowi=rowi+arrj.scorei;/*计算单项总和*/rowi=rowi/n;/*计算单项平均*/printf(|%19c|,);/*按表格形式输出*/for(i=0;i4;i+)print
21、f(%7.2f|,rowi);printf(n-n);272811.5结构体数组结构体数组for(i=0;in;i+)printf(|%10s|%8ld|,arri.name,arri.number);/*输出姓名、学号*/for(j=0;j p-成员名成员名相当于相当于student.student.成员名成员名pstudent313211.6指向结构体类型数据的指针指向结构体类型数据的指针*p.成员名p=&student.score;不能用指向某个结构体变量的指针指向该结构体变量的某个成员。说明:和成员运算符一样,“-”为指向运算符,是运算优先级最高的运算符。由于成员运算符“.”的运算优先
22、级高于运算符“*”,因此(*p).成员名中()不能少。323311.6指向结构体类型数据的指针指向结构体类型数据的指针例10-4#include string.hmain()struct student long int num;char name20;char sex;float score;struct student stu_1,*p;p=&stu_1;stu_1.num=89101;strcpy(stu_1.name,Li Lin);stu_1.sex=M;stu_1.score=89.5;printf (%ld,%s,%c,%f n,(*p).num,(*p).name,(*p).s
23、ex,(*p).score);Pnum name sex score89101 Li Lin M 89.5 stu_1占4字节占4+20+1+4=29字节333411.6指向结构体类型数据的指针指向结构体类型数据的指针二、指向结构体数组的指针 例10-5 struct student long int num;char name20;char sex;int age;struct student stu3=10101,LiLin,M,18,10102,ZhangFun,M,19,10104,Wang Min,F,20;main()struct student*p;printf(No.Name
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c语言教程 11 语言 教程 11
限制150内