您好,欢迎访问三七文档
《C语言程序设计》实验指导书8第1页共6页实验8结构体的基本应用一、实验目的【知识点】1.掌握结构体变量的定义、初始化和成员引用的正确方法;2.理解结构体变量的存储结构;3.掌握指针变量访问结构体成员的方法;4.掌握结构体数组的定义、初始化和引用的正确方法;5.掌握指针变量访问结构体数组元素的方法;6.结构体变量、结构体指针作函数参数或函数返回值。【技能】1.理解“程序=数据结构+算法”的含义,掌握用计算机解决实际问题的分析方法;2.能应用所学知识,选择适当的数据组织方式来处理实际问题。二、实验要求1.复习指针、数组的相关概念;2.复习结构体变量的定义、初始化、引用方法;3.复习结构体和函数的关系;4.综合编程题,先分析程序要完成的功能,给出处理流程,再编程实现;5.完成各项实验任务和问题讨论。三、实验内容进入C开发环境,在自己的目录中建立新的项目Project8;然后创建一个新源程序文件名eight1.c,将在本实验中,你所编写的所有代码放入该文件。1.研究结构体变量、结构体数组的存储形式:参看图1所示运行结果,编写函数StudyStructMem,研究结构体变量的存储状况,并把各变量所占内存空间大小size和变量起始地址Addr0,及其成员或数组元素的起始地址Addr1-5填写在图2所示相应位置中。(1)定义一个结构体变量Birthday用来存放一个人的出生日期(年、月、日用short表示);(2)定义一个结构体变量Student用来存放学生的个人信息,包括姓名(10个字符)、学号(长整型)、出生日期、身高、体重)。(3)定义一个结构体数组MyClass用来存放5个学生的个人信息。图1运行结果示例一《C语言程序设计》实验指导书8第2页共6页提示:用typedef定义结构体类型,方便程序其他地方使用。BirthdayStudentMyClass图2结构体变量的存储(一)观察图二中的数据,回答下面问题:(1)结构体变量的大小如何确定?如果将学生“姓名”信息改成8个字符,重新运行程序,观察结构体变量的大小有何变化?为什么?(参看教材p35)表一结构体变量的存储(二)变量名SizeAddr0Addr1Addr2Addr3Addr4Addr5Birthday--StudentMyClass(2)结构体变量成员的存放位置顺序如何?(3)观察结构体数组元素的存放位置顺序如何?2.结构体变量的初始化和成员引用:参照图3程序运行结果示例二,编写函数AssignStruct将题1中各变量采用下面两种方式进行初始化,并将初始化的结果显示出来:(1)定义时,给变量赋值;(2)通过输入数据,给变量赋值。地址成员年月日字节地址成员字节地址元素字节《C语言程序设计》实验指导书8第3页共6页图3程序运行结果示例二思考:字符串可以用字符数组或字符指针来表示。结构体变量Student中表示“姓名”的成员应该是字符串,可以用字符数组表示,是否也可以用字符指针表示?为什么?请同学们改写程序探究一下。3.用指针访问结构体:下面的程序段用结构体数组存储班级学生成绩。定义结构体指针变量pStu,使用pStu变量来引用结构体,显示学生成绩表。学生信息包括:学号、姓名、语文成绩、数学成绩、英语成绩。structstudent{intiNum;charcName[16];floatfChineseScore;floatfMathScore;floatfEnglishScore;};typedefstructstudentSTUDENT;voidDisplayTranscript(){STUDENTsTranscript[]={{1001,张三丰,69.5,61.5,91.5},{1002,李云龙,92.5,67.5,81.5},{1003,郭靖,79.5,67.5,86.5},{1004,苗翠花,83.0,75.5,84.0},{1005,张无忌,65.5,81.5,71.0}};STUDENT*pStu=sTranscript;inti;《C语言程序设计》实验指导书8第4页共6页printf(No.NameChineseMathEnglish\n);for(i=0;isizeof(sTranscript)/sizeof(STUDENT);i++){printf(%4d%s%6.1f%6.1f%6.1f\n,pStu[i].iNum,pStu[i].cName,pStu[i].fChineseScore,pStu[i].fMathScore,pStu[i].fEnglishScore);}}要求:(1)将上面程序段加入源程序eight.c中,运行程序,查看运行结果;(2)编写函数DisplayTranscript1和DisplayTranscript2,分别使用“指针+偏移量”和“指针移动”的方法,访问结构体变量,显示成绩表。4.结构体和结构体指针作函数参数按下面的要求修改源程序eight.c:(1)在main函数中定义大小为10的结构体数组,用于存放成绩表;STUDENTsTranscript[10];(2)编写函数InputTranscript,输入学生信息,存放在数组sTranscript中;函数原型:voidInputTranscript(STUDENTMyClass[],intnum);函数参数:MyClass为存放成绩表的数组num为学生总人数(3)编写函数DisplayTranscriptOne,显示某个学生的信息。函数原型:voidDisplayTranscriptOne(STUDENTMyScore);函数参数:MyScore为存放单个学生信息的结构体(4)编写函数DisplayTranscriptAll,显示所有学生的信息。函数原型:voidDisplayTranscriptAll(STUDENT*MyClass,intnum);函数参数:MyClass指向存放学生信息的结构体数组num为学生总人数(5)编写函数ModifyOne,重新输入数据,修改学生的信息。函数原型:voidModifyOne(STUDENT*MyInfo);函数参数:MyInfo指向存放学生信息的结构体(6)在main函数中,调用InputTranscript函数,输入所有学生的信息;获得需显示信息的学生索引(从1开始,在数组中的位置),并调用DisplayTranscriptOne,显示该学生信息;调用DisplayTranscriptAll,显示所有学生信息;调用函数ModifyOne,修改学生索引为5的学生信息。思考:(1)函数InputTranscript的参数MyClass为存放成绩表的数组,num表示学生总数,是否可以将函数原型修改为:voidInputTranscript(STUDENTMyClass[]);并且如题3中函数DisplayTranscript,通过num=sizeof(MyClass)/sizeof(STUDENT);获得该信息?为什么?并编写程序验证。《C语言程序设计》实验指导书8第5页共6页(2)函数ModifyOne的参数是指向某个学生信息的结构体指针,是否可以将函数原型修改为:voidModifyOne(STUDENTMyInfo);为什么?并编写程序验证。5.结构体和结构体指针作函数返回值按下面的要求修改源程序eight.c:(1)编写函数FindTop,返回学生成绩表中总分最高的学生信息。函数原型:STUDENTFindTop(STUDENT*MyClass,intnum);函数参数:MyClass指向存放学生信息的结构体数组num为学生总人数返回值:学生成绩表中总分最高的学生信息(2)编写函数FindByName,根据“姓名”信息查询,返回学生成绩表中该学生的信息。函数原型:STUDENT*FindByName(STUDENT*MyClass,intnum,char*pName);函数参数:MyClass指向存放学生信息的结构体数组num为学生总人数pName为要查找的学生信息返回值:查找成功,返回指向该学生信息的指针查找失败,返回NULL(3)利用题4中输入的成绩表,在main函数中调用FindTop函数,并调用函数DisplayTranscriptOne显示总分最高的学生信息;输入要查询的学生姓名,调用FindByName函数,若查询成功,调用ModifyOne函数,修改该学生信息,否则显示查询失败;调用函数DisplayTranscriptAll,显示修改后的成绩表。思考:(1)在函数FindTop中,结构体作为函数返回值,往往会增加函数调用时的系统开销。为了提高效率,可以将函数处理结果转换为学生索引信息返回。函数原型:intFindTopIndex(STUDENT*MyClass,intnum);函数参数:MyClass指向存放学生信息的结构体数组num为学生总人数返回值:总分最高的学生索引信息(在成绩表中的位置)请编写该函数,并验证之。(2)如何利用ModifyOne函数,建立成绩表?请编写程序验证。6.综合编程:通过学习,我们知道对于多组联系紧密的相关信息(如多个学生的多门课程成绩),如果使用结构体数组,数组的一个元素即可存储一个学生的所有信息,则可简化程序处理,增加程序的可读性。请使用结构体数组编写程序eight2.c完成班级学生成绩统计的工作。程序功能如下:《C语言程序设计》实验指导书8第6页共6页(1)学生人数为30人,学生信息包括学号、姓名、语文、数学、英语、三门课程的成绩;(2)录入所有学生信息;(3)找出总分第1名和最后1名的情况;(4)找出各门课程第1名和最后1名的情况;(5)以三门课程平均成绩从高到低的顺序排序;(6)按平均成绩从高到低的顺序,以表格的形式输出统计结果。程序编写要求如下:(1)分析程序功能设计要求,按照模块化程序设计的方法,划分各功能模块;(2)分析程序中所涉及的各种数据,并选择适当的数据类型来表示;(3)分析各个模块之间的接口,完成函数原型的设计,说明函数完成的功能、所需参数和返回值。(4)用菜单的形式组织各功能模块。四、问题讨论1.小结结构体和结构体数组的定义、初始化和引用方法;2.小结结构体指针结构体数组的三种方法;3.总结结构体的应用场合。
本文标题:C语言结构体实验
链接地址:https://www.777doc.com/doc-4444892 .html