C02-程序设计基础提高班(C++)第8周上机任务-结构体
第8周:阅读教材第7章(p201-230),主要内容是结构体与自定义类型,同时也希望将同学们将第3-7章的内容整理一下,完成第8周上机任务,本周任务将增加一些对用结构化程序设计技术解决问题的综合性题目;
实践任务(需要的数据文件score.txt在本文后,自行复制后,用记事本保存为score.txt):
【任务1】结构体数据组score.txt中是一些同学的学号、姓名、C++、高数、英语成绩,定义一个学生成绩的结构体数组,其中的成员包括学号(char num[12])、姓名(name)、三门课的成绩(grade)、总分(score)。
(1)从文件中读出数据,存放到你定义的结构体数组中;
(2)求出每名同学的总分(可以读入过程中“顺便”计算);
(3)按总分排序(降序);
(4)输出排序后的成绩单;
(5)有30名同学可以获得奖学金,规则是总分高者优先,有挂科不能得奖学金(我校就是这样规定的)。请输出得奖学金同学的名单。
(6)选做:统计各门课及总分的平均成绩、最高和最低成绩、标准偏差,并输出。
#include <iostream> #include <fstream> usingnamespace std; struct Student { char num[13]; //尽管都是由数字构成,但看作为字符更合适。12位学号这样定义,便于处理成字符串 char name[10]; //每个汉字占两个字节,中国人的名字,5个汉字够用 int cpp; int math; int english; int grade; }; const intN=180; int main( ) { int i, j, k; Student stu[N]; //定义结构体数组 //下面从文件中读取数据到结构体数组,在读入的过程中计算总分 //对结构体数组进行降序排序 //输出排名后的成绩单 //下面输出得奖学金同学的名单 }
【任务2】将任务1中的各项功能分别设计成自定义函数,重写任务。
【任务3】动态链表
数据依然来自score.txt,在程序中建立一个动态链表:每读入一个同学的数据,计算总分,分配结点的存储空间并赋值,并建立起前后相链的关系。在建立链表的同时,要进行统计,以便于求出所有同学总分的平均成绩。动态链表建立后,从头结点开始,依次输出所有总分高于平均总分且没有挂科的同学的学号、姓名、总分。【任务4】接任务3,链表建立起来后,将总分低于总均总分的节点删除(注意删除后前后链仍然能够连起来,不用的空间也能正常释放)。
【任务5】(揭开关于你生世的秘密)这不是一个唬人的程序,很有用。作者看到小孩儿过百日,想到自己的万日在哪天。编程计算,结果刚过了十几天,那个懊恼啊。第二个万日得再等26年多,第三个万日,谁敢说一定能过上?20岁左右的你,要算清楚了。只要在第(1)问中输入你的生日就行了。时分秒不知?可能妈妈也忘了,输入一个喜欢的、吉利的时间吧。
下面的程序可以在一个main函数中完成,也可以用函数求解,main函数调用即可。定义一个表示时间(包括年、月、日、时、分、秒)的结构体(可以阅读4.4.1小节中time.h中是如何定义这个结构体的),然后完成下面的功能:
(1)输入一个时间(注意各部分数据的取值范围)将输入的时间保存在一个结构体变量中;
(2)输出该日在本年中是第几天(注意闰年问题);
(3)输出这是这一天中的第几秒;
(4)输出这是这一年中的第几秒;(不要认为这个数荒唐,在计算中中需要取随机数时需要一个不会重复的“种子数”,这个秒数是常用的。)
(5)求你输入的时间d天后是哪年哪月哪日,将结果保存在一个结构体变量中输出;(你的万天日期靠这个功能了)
(6)求你输入的时间s秒后是何日何时,将结果保存在一个结构体变量中输出;
【任务6】接任务5,用结构体变量给定两个时间,求(1)相差多少天?(2)相差多少秒?
【任务7】设计一个手机通信录管理系统:设计出模拟手机通信录管理系统,利用结构体数组或动态链表做为存储结构,实现对手机中的通信录进行管理,包括:
(1)增加功能:能录入新数据(一个结点包括:姓名、电话号码、分类(可选项有:A 办公类 B 个人类 C 商务类)、电子邮件)。例如:杨春 13589664454 商务类 chuny@126.com当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通信录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。
(2)查看功能:选择此功能时,列出下列三类选择:A 办公类 B 个人类 C 商务类 ,当选中某类时,显示出此类所有数据中的姓名和电话号码)
(3)拔号功能:能显示出通信录中所有人的姓名,当选中某个姓名时,屏幕上模拟打电话的过程。或者可以直接输入号码,如果该号码在通信录中,拨号过程中要显示他/她的姓名。
(4)修改功能:输入某个人的姓名时,可对此人的相应数据进行修改
(5)删除功能:输入某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号。
(6)进一步拓展:将通信录存储到文件中,在运行程序时,先从文件中读出已有的数据,这时通信录中信息的条数限制可以放宽。
附:score.txt中的数据(复制到记事本中建立文本文件)
刘得意 60 98 75
王锐 63 90 96
何煜中 90 73 82
王磊 87 86 92
冯松 89 98 83
裴培 75 82 91
马骁 62 67 90
马婧 98 84 87
周俊升 57 68 96
贺祺 61 96 72
李桐 93 83 86
高路 63 74 98
冯佳媛 61 79 81
张迪 99 88 80
张里响 85 65 96
王瑞麒 89 83 91
徐金竹 75 89 73
赵媛媛 77 75 66
宋宗杰 94 100 92
张佳玮 61 98 96
王姝 70 91 90
宋媛媛 61 94 92
于莉 55 66 78
于浩 78 84 72
王竞 90 87 67
崔赞 91 67 93
宋静 69 85 73
王磊 71 78 77
方圆 70 79 76
李朋 90 82 97
马佳 60 90 100
张龙 62 100 78
马里 73 95 73
韩明 83 97 88
马立 73 90 83
吴清正 89 97 85
印虹 92 68 75
田苗苗 75 91 71
卫青 66 73 77
冷云 89 88 71
葛志伟 100 79 71
范振光 98 87 89
王芳 71 97 99
杨超 67 73 82
杨梦婕 89 99 67
梁雅宁 55 88 100
王琦 98 95 98
吴玮 69 76 68
杨阔 90 91 98
贾伟林 63 90 86
刘亚新 77 81 95
金昕 92 67 69
董一伟 93 88 80
汤娜 68 85 71
周恒 87 82 69
张笑 86 88 76
文静 93 88 85
杨华鑫 81 81 68
苏明霞 59 79 94
黄京 62 75 96
佟欣 60 79 98
张雯 69 70 93
刘京西 67 78 78
徐嘉琦 90 75 87
魏佳 100 94 80
高举 81 99 91
边里 56 94 87
何佳成 70 75 78
赵旭洋 87 91 94
孙大伟 65 69 98
鲁继森 84 79 75
白涛 57 82 75
蔺剑飞 88 75 79
兰天 83 66 74
王悦 79 82 70
陈世勃 70 92 65
张昊 94 83 96
高清 76 83 84
王欣欣 71 83 78
王欢欢 57 33 66
叶丹 87 80 96
李悦 63 79 97
郭倩 69 94 69
刘盈 99 72 93
杨洁 96 79 87
徐一菡 85 45 62
王蒙 67 97 89
张敏 85 75 89
桂佳 60 73 65
林倩 67 77 80
任盛达 57 86 88
吴佳林 96 65 82
黄金龙 85 90 78
陈美珠 82 72 83
冼丹 100 89 89
唐楠 68 97 77
张扬 77 65 93
宋航彬 80 71 91
薛淇文 89 71 75
刘紫亮 72 98 84