版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学习目标掌握结构体类型和变量的定义及应用掌握共用体类型的定义及应用掌握枚举类型的定义及应用熟悉类型定义typedef的使用反对民族分裂,维护祖国统一案例导入【问题描述】在案例7中,已完成了学生成绩管理系统的结构设计。本章任务是进行数据结构设计,即解决学生成绩信息的存储结构,编写代码实现系统的各功能模快。
【问题分析】
要实现系统的各功能模块,必须确定信息的存储结构。学生的基本信息包括:学号、姓名、3门课程成绩、总成绩等,所以,存储结构的核心是定义学生基本信息的类型。显然,本案例的任务是:(1)定义学生基本信息的结构类型;(2)确定学生成绩信息的存储变量,(3)编写代码实现各模块功能。案例8学生成绩管理系统的实现知识学习【知识准备】本案例中缩涉及的学生基本信息,是不同数据类型但相关的集合体,无法用数组来定义。也不能把它们拆成多个单独的数据项,所以,必需将不同类型但相关的数据组合一个整体,构造一种新的数据类型。要完成上面的任务,必须熟练掌握结构体类型的定义方法,结构体变量、数组的定义、初始化和成员的引用方法等知识点。本章学习内容如下:8.1结构体8.2结构体数组8.3结构体和函数8.4学生成绩管理系统的实现8.5共用体(union)8.6枚举类型8.7类型定义8.8综合应用第二知识空间:内存对齐*8.1结构体8.1.1结构体类型的定义结构体是若干个类型相同或不同数据项的集合。例如,学生的基本信息包含以下数据项:学号(no)、姓名(name)、数学(math)、语文(yw)、英语(eng)和总分(sum)。那么这个类型就应该如图8-1所示。图8-1“学生”类型8.1.1结构体类型的定义定义结构体类型的一般形式:struct结构类型名{类型名成员名1;
类型名成员名2;
…类型名成员名n;};例如,定义如图8-1所示的学生结构体类型:structstudent/*定义学生结构体*/{longno; /*学号*/charname[16];/*姓名*/floatmath; /*数学成绩*/floatyw; /*语文成绩*/floateng; /*英语成绩*/floatsum; /*总分*/};8.1结构体8.1.2结构变量的定义结构体类型定义后,就可以用它来定义相应的结构体变量。定义结构体类型变量有以下两种方法:1.间接定义法——先定义结构体类型,再定义结构体变量定义的一般形式:struct结构类型名变量名;例如,使用§8.1.1定义的结构体类型student来定义学生结构体变量,语句:structstudentstu1;structstudentstu2;8.1.2结构变量的定义2.直接定义法——定义结构体类型时定义变量定义的一般形式为:struct[结构类型名]/*结构类型名可缺省*/{类型名成员名1;类型名成员名2;
…类型名成员名n;}变量名表;structstudent/*定义学生结构体*/{longno;/*学号*/charname[16];/*姓名*/floatmath; /*数学成绩*/floatyw; /*语文成绩*/floateng; /*英语成绩*/floatsum; /*总分*/}stu1,stu2;8.1.3结构体变量的引用1.简单结构变量的引用结构体变量的使用是通过对其每个成员的引用来实现的,一般形式如下:结构体变量名.成员名其中,“.”是结构体的成员运算符,它在所有运算符中优先级最高。例如,在8.1.2中定义的结构体变量stu1,以下就是对其中5个成员的引用。stu1.no=2021001;/*学号赋值*/scanf("%s",); /*输入学生姓名*/scanf("%f",&stu1].math); /*输入数学成绩*/scanf("%f",&stu1.yw); /*输入语文课成绩*/scanf("%f",&stu1.eng); /*输入英语成绩*/8.1.3结构体变量的引用2.同类型结构变量间的引用将一个结构类型的变量,作为一个整体赋给另一个具有相同结构类型的变量。如有定义:structstudentstud1,stud2;假若要把已赋值好stud1的各成员值复制给stud2对应的各成员,则可用赋值语句实现:stud2=stud1;/*将变量stud1的各成员值赋给变量stud1对应的成员*/注意:
结构变量不能作为一个整体进行输入和输出。8.1.3结构体变量的引用【例8.1】结构体变量的引用。intmain(void){structstudentstu1,stu2;/*定义两个结构变量stu1,stu2*/printf("请输入学生1的信息(学号,姓名,数学,语文,英语):\n");scanf("%ld%s%f%f%f",&stu1.no,,&stu1.math,&stu1.yw,&stu1.eng);stu1.sum=stu1.math+stu1.yw+stu1.eng;printf("请输入学生2的信息(学号,姓名,数学,语文,英语):\n");scanf("%ld%s%f%f%f",&stu2.no,,&stu2.math,&stu2.yw,&stu2.eng);stu2.sum=stu2.math+stu2.yw+stu2.eng;printf("总分较高的学生信息是:\n");if(stu1.sum>stu2.sum) printf("%-6ld,%s,%-5.1f,%-5.1f,%-5.1f,%-5.1f\n", stu1.no,,stu1.math,stu1.yw,stu1.eng,stu1.sum);else printf("%-6ld,%s,%-5.1f,%-5.1f,%-5.1f,%-5.1f\n", stu2.no,,stu2.math,stu2.yw,stu2.eng,stu2.sum);return0;}8.1.4结构变量的初始化在定义结构变量的同时,允许对结构变量初始化。例如:structCStudent{ longno;/*学号*/ charname[16];/*姓名*/ intage; /*年龄*/ intscore;/*成绩*/}stu={2013001,"ZhanSan",17,80};8.1.4结构变量的初始化【例8.2】结构变量的初始化。假设学生含有:学号、姓名、年龄和成绩。定义学生的结构类型同时定义变量stu1并初始化;对结构变量stu2,采用先定义结构类型,后定义变量并初始化。最后将存储在两个结构变量的信息输出。运行效果如图8-5所示。图8-5结构变量的初始化8.1.4结构变量的初始化#include<stdio.h>structCStudent{longno;/*学号*/charname[16];/*性别*/intage;/*年龄*/intscore;/*成绩*/}stu1={2025001,"ZhangSa",17,85};/*定义变量stu1并初始化*/intmain(){structCStudentstu2={2025002,"WangWu",16,95};/*定义变量stu2并初始化*/printf("学生1的信息:");printf("%ld,%s,%d,%d\n",stu1.no,,stu1.age,stu1.score);printf("学生2的信息:");printf("%ld,%s,%d,%d\n",stu2.no,,stu2.age,stu2.score);return0;}8.2结构体数组8.2.1结构体数组的定义结构体数组的定义与结构体变量类似,只是结构体变量替换成数组。一般形式如下:struct结构体名{成员列表;}数组名[元素个数];或:struct结构体名数组名[元素个数];例如,定义学生信息的结构体数组,其中包含40名学生的信息,代码如下:structCStudent{ longno;/*学号*/ charname[16];/*性别*/ intage;/*年龄*/ intscore;/*成绩*/};structCStudentstu[40];8.2.2结构体数组的引用结构体数组元素也是通过数组名和下标来引用的,但其元素是结构体类型的数据,因此,对结构体数组元素的引用与对结构体变量的引用一样,也是逐级引用,只能对最低级的成员进行存取和运算。结构体数组的引用的一般形式:数组名[下标].成员名【例8.3】结构体数组的引用。
有N名学生,学生的信息包含:学号、姓名、年龄和成绩,要求从键盘输入N名学生的信息,最后再将N名学生的信息输出。运行效果如图8-7所示。图8-7结构体数组的引用8.2.2结构体数组的引用【例8.3】结构体数组的引用。算法要点:(1)以学生的信息数据项为成员,定义结构类型和相应的结构数组(2)输入每个学生的信息,存储在结构数组中(3)输出结构数组中每个元素的信息。intmain(void){inti;structCStudentstu[N];/*①定义结构体类型数组*/for(i=0;i<N;i++)/*②输入学生的信息,存储在结构数组中*/{printf("请输入第%d名学生的信息:",i+1);scanf("%ld%s%d%d",&stu[i].no,stu[i].name,&stu[i].age,&stu[i].score);}printf("%d名学生的信息如下:\n",i);for(i=0;i<N;i++)/*③输出学生信息*/ printf("%ld,%s,%d,%d\n",stu[i].no,stu[i].name,stu[i].age,stu[i].score);return0;}8.2.3结构体数组的初始化结构数组也可以在定义时进行初始化,其方法是在定义结构数组的之后紧跟等号和初始化数据。一般形式是:struct结构体类型结构数组名[n]={{初值表1},{初值表2},…,{初值表n}};structCStudent{longno; /*学号*/charname[16]; /*性别*/intage;/*年龄*/intscore;/*成绩*/}stu[3]={{2021001,"ZhanSan",17,80},/*定义数组并设置初始值*/ {2021002,"WangWu",19,85}, {2021003,"LiShin",16,75} };8.2.3结构体数组的初始化【例8.4】初始化结构数组,并输出学生信息。#include<stdio.h>structCStudent{longno; /*学号*/charname[16]; /*性别*/intage;/*年龄*/intscore;/*成绩*/};intmain(void){inti;structCStudentstu[]={{2025001,"ZhangSa",17,80},{2025002,"WangWu",19,85},{2025003,"LiSi",16,75},{2025004,"LaoQin",20,60}};for(i=0;i<4;i++){printf("第%d名学生信息:",i+1);printf("%ld,%s,%d,%d\n",stu[i].no,stu[i].name,stu[i].age,stu[i].score);}}8.3结构体和函数8.3.1结构体变量作为函数参数结构变量作为函数参数,与简单变量作为函数参数的处理方式完全相同。采取的是“值传递”方式,形参结构变量中成员值的改变,对实参结构变量不产生任何影响。【例8.5】使用结构体变量作为函数参数。voidfnPrint(structStudents){ printf("%ld,%s,%d,%d\n",s.no,,s.age,s.score);s.no=2025008strcpy(,"wangmi");s.age=25;s.score=100;printf("修改后,在fnPrint()函数中:");printf("%ld,%s,%d,%d\n",s.no,,s.age,s.score);}intmain(void){structStudentstu={2025001,"zhangsa",21,78};fnPrint(stu);printf("%ld,%s,%d,%d\n",stu.no,,stu.age,stu.score);return0;}8.3结构体和函数8.3.2结构体数组作为函数参数
结构体数组作为函数参数,与数组作为函数参数的处理方式完全相同。即采用“地址传递”方式,形参结构变量中各成员值的改变,对相应实参结构变量产生影响。【例8.6】使用结构数组作为函数参数。voidfnDatainput(structStudents[]){inti;for(i=0;i<N;i++){printf("输入学生%d信息:",i+1);scanf("%ld%s%d%d",&s[i].no,s[i].name,&s[i].age,&s[i].score);
}}intmain(){inti,max=0;structStudentstu[N];fnDatainput(stu);printf("%d学生的信息如下:\n",N);for(i=0;i<N;i++)printf("%ld,%s,%d,%d\n",stu[i].no,stu[i].name,stu[i].age,stu[i].score);return0;}8.3结构体和函数8.3.3函数的返回值是结构类型变量结构体变量也可以作为函数的返回值,这时在函数定义时,需要说明返回值的类型为相应的结构类型。如:structStudentfnFuction(){ structStudentp; /*定义结构体变量p … /*省略其它操作语句*/ return(p); /*返回结构体变量p*/}其中,函数名“fnFuction”前面的类型说明符“structStudent”是用于对函数返回值P的类型进行说明的。8.3.3函数的返回值是结构类型变量【例8.7】修改例8.6,将fnDatainput()函数中的输入语句,编一函数用于结构体变量的输入,将其结构体变量返回给主调函数中的结构体变量。
提示:我们只需要把fnDatainput()函数替换为以下两个函数,其余不变structStudentelement_input(){structStudents;scanf("%ld%s%d%d",&s.no,,&s.age,&s.score);returns;}voidfnDatainput(structStudents[]){inti;for(i=0;i<N;i++){ printf("输入学生%d信息:",i+1); s[i]=element_input();}}8.4学生成绩管理系统的实现8.4.1存储结构设计1.确定学生基本信息的类型对学生的基本信息进行处理,首先需要把学生的基本信息,包括学号、姓名、3门课程成绩、总成绩等相关信息录入计算机,保存到相应的变量中,否则计算机无法对这些数据进行处理。在§8.1.1中,定义了学生基本信息类型:structstudent //定义学生基本信息结构体{longnum; //学号
charname[16]; //姓名
floatmath; //数学成绩
floatyw; //语文成绩
floateng; //英语成绩
floatsum; //总分};8.4学生成绩管理系统的实现8.4.2数据入录与浏览1.数据录入模块设计思路:将结构体数组作为函数的形参,已录入的记录总数m定义为全局变量。利用循环结构,交互式提示用户录入记录。同时,定义学号为关键字,程序需对录入的学号进行合法性检查,不能有重复的学号。2.记录浏览模块对函数的形参进行操作,注意到记录的总数由全局变量m保存,按%-8.1f的格式输出记录。3.运行测试编译、连接、运行程序。按数字键1选择“数据录入”菜单,按照系统提示录入若干条记录,如图8-11所示。再按8选择“记录浏览”菜单,系统将显示所有学生信息。如图8-12所示。8.4学生成绩管理系统的实现图8-11数据录入图8-12记录浏览8.4学生成绩管理系统的实现8.4.3记录查询与修改1.记录查询设计思路:输入要查找的学生之学号,以学号为关键字,在结构数组中查找匹配,如果匹配成功,显示该学生的记录;否则 提示未找到等提示信息。运行效果如图8-13所示。图8-13记录查询8.4学生成绩管理系统的实现2.记录修改记录修改就是对指定的学号的学生,修改其它字段的数据。设计思路:输入要修改的学生学号,以学号为关键字,首先查询确认该学生记录的存在性。如果该学号不存在,则提示相应提示信息;否则输入该学生的其它字段数据。运行界面如图8-14所示。图8-14记录修改8.5共用体(union)8.5.1共用体变量的定义有时为了节省存储空间或为了用多种类型访问一个数据等原因,需要使几种不同类型的变量存放到同一段内存单元中。例如,把一个短整型变量i,一个字符变量ch和一个单精度实型变量f放在地址为1000的起始内存单元,如图8-15所示。i,ch,f分别占据2个,1个和4个字节,这种使用不同变量共占同一段内存的结构称为“共用体”类型的结构。图8-15共用体8.5共用体(union)8.5.2共用体变量的引用共用体变量的引用方式与结构变量的引用方式也非常类似。例如,前面定义了共用体变量variable后,则对其成员变量的引用分别为:variable.i;variable.ch;variable.f;C语言最初引入共用体的目的之一是为了节省存储空间,另外一个目的是可以将一种类型的数据不通过显式类型转换而作为另一种类型数据使用。8.6枚举类型8.6.1枚举类型的定义枚举类型的定义形式如下:enum枚举类型名{取值表};enum是定义枚举类型的关键词。花括号中的取值表称为枚举表,每个枚举表项是常量整数,以逗号分隔,系统规定其值依次为0,1,2,3,4,…。8.6枚举类型8.6.2枚举变量的定义1.先定义枚举类型,后定义枚举变量 例如:
enumcolor{red,yellow,blue,green,white,black};/*定义枚举类型*/ enumcolorc;/*定义枚举变量*/
即:c定义为enumcolor型的枚举变量。
2.在定义枚举类型的同时定义枚举变量 例如:
enum[color]{red,yellow,blue,green,white,black}c,b;
即:c、b定义为enumcolor型的枚举变量。此时,枚举类型名color可缺省。8.7类型定义8.7.1定义基本类型的别名定义基本类型别名的形式为:typedef基本类型名别名标识符;例如:typedefintWORD;/*定义WORD为int的别名*/typedeffloatREAL; /*定义REAL为float的别名*/typdefunsignedcharBYTE;/*定义BYTE为unsignedchar的别名*/指定用WORD代表int类型,REAL代表float,BYTE代表unsignedchar。所以,以下两种形式对变量a、b和c的定义是等价的。
(1)inta;floatb;unsignedcharc; (2)WORDa;REALb;BYTEc;8.7类型定义8.7.2定义自定义的数据类型的别名声明自定义类型别名的形式为:typedef自定义类型说明信息别名标识符;例如:typedefstructstudent{ longno; charname[16]; intage,score;}STUDENT;
8.7类型定义8.7.3类型定义的一般步骤类型定义的一般步骤如下:(1)按定义变量的方法,写出定义体;(2)将变量名换成别名;(3)在定义体最前面加上typedef。【例8.1】给unsignedint定义一个别名DWORD。(1)按定义变量的方法,写出定义体:unsignedinta;(2)将变量名换成别名:unsignedintDWORD;(3)在定义体最前面加上typedef:typedefunsignedintDWORD;8.8综合应用案例8-1结构的嵌套
【问题描述】结构成员既可以是基本的数据类型,也可以是数组,同时,还可以是结构变量,换句话说,结构可以嵌套定义。建立N名学生的档案,每个学生的数据包括学号、姓名、入学时间及一门功课的成绩。要求从键盘输入数据,并显示最后的结果。8.8综合应用案例8-1结构的嵌套
【算法设计】(1)定义“入学时间”的结构类型日期的信息,要求包括年、月、日。可以用一个结构描述。structdate{ intyear,month,day;};(2)定义学生档案的结构类型structperson{ longno; charname[16]; structdateent;/*入学时间*/ intscore;};8.8综合应用案例8-1结构的嵌套
【算法设计】(3)structperson的结构如图8-16所示。包括了structdate型结构变量。nonameentscoreyearmonthday8.8综合应用案例8-2排序程序
【问题描述】
高三某班高考单科成绩如表表8-1所示,请将成绩录入电脑并统计总分,然后按总分由高到低输出该班考生信息。表8-1高1203班考生成绩信息考号姓名语文数学英语综合总分2021201NameOne90110701202021242NameTow7710595125………………………………2021240NameForty956098130案例8-2排序程序【算法设计】(1)以学生的信息数据项为成员,定义结构体类型
structstudent/*学生结构体类型*/{ longno;/*考号*/ charname[15];/*姓名*/ intyw,sx,yy,zh;/*4门课的成绩*/ inttotal;/*总成绩*/};
(2)编写学生的信息
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年教室安全事故典型案例
- 2026年教师研修手册期末回首与展望
- 2026年幼儿园国庆节游戏活动
- 2026年教师教学能力提升培训方案设计
- 2026阜阳教师面试题及答案
- 数字电路-寄存器
- 七年级下学期数学教学计划14篇
- 苏教版五年级下册科学重点知识及复习大纲资料
- 兽用生物制品管理制度
- 广东过年上班消防安全指南
- 成都未来科技城发展服务局2026年社会招聘笔试题库附参考答案详解【模拟题】
- 2026年中心血站采血医技岗医疗卫生事业招聘考试笔试试题(含答案)
- 烧结多孔砖生产施工方案及技术措施
- 山东能源定向委培考试题
- 2025广东省风力发电有限公司山西分公司招聘7人笔试历年难易错考点试卷带答案解析
- 无水乙醇在脏器囊肿硬化治疗中合理性应用的专家共识
- 癫痫患者发作急救流程及日常护理建议
- 银行-从年报透析上市银行资产质量
- 山西省长治市2026年重点学校小升初入学分班考试英语考试试题及答案
- 2025年全国青少年信息素养大赛C++算法创意实践挑战赛(小学组-复赛)真题(含答案)
- 2026年河北省工人技师公共基础考试试题及答案
评论
0/150
提交评论