C语言结构体实验
第 3 页 共 6 页
《C 语言程序设计》实验指导书 8
printf("No. Name Chinese Math English\n"); for (i=0; i<sizeof(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 的结构体数组,用于存放成绩表; STUDENT sTranscript[10]; (2)编写函数 InputTranscript,输入学生信息,存放在数组 sTranscript 中; 函数原型:void InputTranscript(STUDENT MyClass[],int num); 函数参数:MyClass 为存放成绩表的数组 num 为学生总人数 (3)编写函数 DisplayTranscriptOne,显示某个学生的信息。 函数原型:void DisplayTranscriptOne(STUDENT MyScore); 函数参数:MyScore 为存放单个学生信息的结构体 (4)编写函数 DisplayTranscriptAll,显示所有学生的信息。 函数原型:void DisplayTranscriptAll(STUDENT *MyClass,int num); 函数参数:MyClass 指向存放学生信息的结构体数组 num 为学生总人数 (5)编写函数 ModifyOne,重新输入数据,修改学生的信息。 函数原型:void ModifyOne(STUDENT *MyInfo); 函数参数:MyInfo 指向存放学生信息的结构体 (6)在 main 函数中,调用 InputTranscript 函数,输入所有学生的信息;获得需 显示信息的学生索引 (从 1 开始, 在数组中的位置) , 并调用 DisplayTranscriptOne, 显示该学生信息;调用 DisplayTranscriptAll ,显示所有学生信息;调用函数 ModifyOne,修改学生索引为 5 的学生信息。 思考: (1)函数 InputTranscript 的参数 MyClass 为存放成绩表的数组,num 表示学生 总数,是否可以将函数原型修改为: void InputTranscript(STUDENT MyClass[]); 并且如题 3 中函数 DisplayTranscript,通过 num=sizeof(MyClass)/sizeof(STUDENT); 获得该信息?为什么?并编写程序验定义、初始化和引用方法; 2. 小结结构体指针结构体数组的三种方法; 3. 总结结构体的应用场合。
第 6 页 共 6 页
《C 语言程序设计》实验指导书 8
图 3 程序运行结果示例二 思考: 字符串可以用字符数组或字符指针来表示。 结构体变量 Student 中表示 “姓 名”的成员应该是字符串,可以用字符数组表示,是否也可以用字符指针表示? 为什么?请同学们改写程序探究一下。
3.用指针访问结构体: 下面的程序段用结构体数组存储班级学生成绩。定义结构体指针变量 pStu, 使用 pStu 变量来引用结构体,显示学生成绩表。学生信息包括:学号、姓名、 语文成绩、数学成绩、英语成绩。 struct student{ int iNum; char cName[16]; float fChineseScore; float fMathScore; float fEnglishScore; }; typedef struct student STUDENT; void DisplayTranscript( ) { STUDENT sTranscript[]={{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; int i;
图 1 运行结果示例一
第 1 页 共 6 页
《C 语言程序设计》实验指导书 8
提示:用 typedef 定义结构体类型,方便程序其他地方使用。
Birthday
地址 成员 字节 地址
Student
成员 字节 地址
MyClass
元素 字节
日 月 年
图2
结构体变量的存储(一)
观察图二中的数据,回答下面问题:
第 5 页 共 6 页
《C 语言程序设计》实验指导书 8
(1) 学生人数为 30 人,学生信息包括学号、姓名、语文、数学、英语、三门 课程的成绩; (2) 录入所有学生信息; (3) 找出总分第 1 名和最后 1 名的情况; (4) 找出各门课程第 1 名和最后 1 名的情况; (5)以三门课程平均成绩从高到低的顺序排序; (6)按平均成绩从高到低的顺序,以表格的形式输出统计结果。 程序编写要求如下: (1)分析程序功能设计要求,按照模块化程序设计的方法,划分各功能模块; (2)分析程序中所涉及的各种数据,并选择适当的数据类型来表示; (3)分析各个模块之间的接口,完成函数原型的设计,说明函数完成的功能、 所需参数和返回值。 (4)用菜单的形式组织各功能模块。
(3) 观察结构体数组元素的存放位置顺序如何?
2.结构体变量的初始化和成员引用: 参照图 3 程序运行结果示例二,编写函数 AssignStruct 将题 1 中各变量采 用下面两种方式进行初始化,并将初始化的结果显示出来: (1)定义时,给变量赋值; (2)通过输入数据,给变量赋值。
第 2 页 共 6 页
《C 语言程序设计》实验指导书 8
实验 8
一、实验目的
【知识点】
结构体的基本应用
1. 掌握结构体变量的定义、初始化和成员引用的正确方法; 2. 理解结构体变量的存储结构; 3.掌握指针变量访问结构体成员的方法; 4. 掌握结构体数组的定义、初始化和引用的正确方法; 5. 掌握指针变量访问结构体数组元素的方法; 6.结构体变量、结构体指针作函数参数或函数返回值。 【技能】 1. 理解“程序=数据结构+算法”的含义,掌握用计算机解决实际问题的分析 方法; 2. 能应用所学知识,选择适当的数据组织方式来处理实际问题。
(1) 结构体变量的大小如何确定?如果将学生“姓名”信息改成 8 个字符,重 新运行程序, 观察结构体变量的大小有何变化?为什么? (参看教材 p35)
表一
结构体变量的存储(二)
变量名
Size
Addr0
Addr1
Addr2
Addr3
Addr4
-
Addr5
-
Birthday Student MyClass (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 个学生的个人信息。
第 4 页 共 6 页
《C 语言程序设计》实验指导书 8
(2)函数 ModifyOne 的参数是指向某个学生信息的结构体指针,是否可以将函 数原型修改为: void ModifyOne (STUDENT MyInfo); 为什么?并编写程序验证。
5. 结构体和结构体指针作函数返回值 按下面的要求修改源程序 eight.c: (1)编写函数 FindTop,返回学生成绩表中总分最高的学生信息。 函数原型:STUDENT FindTop(STUDENT *MyClass,int num); 函数参数:MyClass 指向存放学生信息的结构体数组 num 为学生总人数 返回值:学生成绩表中总分最高的学生信息 (2)编写函数 FindByName,根据“姓名”信息查询,返回学生成绩表中该学 生的信息。 函数原型: STUDENT *FindByName(STUDENT *MyClass,int num,char *pName); 函数参数:MyClass 指向存放学生信息的结构体数组 num 为学生总人数 pName 为要查找的学生信息 返回值:查找成功,返回指向该学生信息的指针 查找失败,返回 NULL (3)利用题 4 中输入的成绩表,在 main 函数中调用 FindTop 函数,并调用函数 DisplayTranscriptOne 显示总分最高的学生信息;输入要查询的学生姓名,调用 FindByName 函数,若查询成功,调用 ModifyOne 函数,修改该学生信息,否则 显示查询失败;调用函数 DisplayTranscriptAll,显示修改后的成绩表。 思考: (1)在函数 FindTop 中,结构体作为函数返回值,往往会增加函数调用时的系 统开销。为了提高效率,可以将函数处理结果转换为学生索引信息返回。 函数原型:int FindTopIndex(STUDENT *MyClass,int num); 函数参数:MyClass 指向存放学生信息的结构体数组 num 为学生总人数 返回值:总分最高的学生索引信息(在成绩表中的位置) 请编写该函数,并验证之。 (2)如何利用 ModifyOne 函数,建立成绩表?请编写程序验证。 6. 综合编程: 通过学习,我们知道对于多组联系紧密的相关信息(如多个学生的多门课程 成绩) ,如果使用结构体数组,数组的一个元素即可存储一个学生的所有信息, 则可简化程序处理,增加程序的可读性。 请使用结构体数组编写程序 eight2.c 完成班级学生成绩统计的工作。 程序功能如下: