南京邮电大学 通达学院
2019/2020学年第1学期 《Windows编程》课程大作业报告
课题代号(单选)□课题1 □课题2 □课题3 □课题4 课题名称:_____________________________________________________ 小组成员人数(单选)□1人 □2人 □3人 □4人
学号___________________姓名________________________
课题完成时间:___________________________________
================以下部分为教师填写区,请勿填写================= 成绩评定:
软件基本功能_______ 软件提高功能______ 软件部分成绩________ 文档结构___________ 文档撰写__________ 文档部分成绩________
总成绩_____________
备注__________________________________________________________
运动会分数统计
一、 课题内容和要求
课题名称:运动会分数统计
内容和要求:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20)。
1 / 31
二、需求分析
可以输入各个项目的前三名或前五名的成绩;能统计各学校总分;可以按学校编号、学校总分、男女团体总分排序输出;可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
实现以下几个功能: 1. 添加学生 2. 统计信息
3. 按学校编号查询学校某个项目的情况
4. 可以按项目编号查询取得前三或前五名的学校 5. 显示学校信息 6. 显示项目信息
7. 删除保存在本地的文件 8. 保存数据文件
9. 显示所有项目的名次信息 10.
退出系统
2
三、概要设计
项目信息表结构
typedef struct xm_table{ int item;// 项目编号 char name[20];//项目名称 int count; //该项目得分人的数量 }XM_TABLE;
学生信息表结构 struct STUDENT{ char name[20]; int score; int range; int item; int sex; };
参赛学校信息结构
typedef struct SchoolStruct {
int count;
//计算实际运动员个数 //学校编号
//姓名 //得分成绩 //得分名次 //得分项目 //性别
int serial;
char Name[20];//学校名称 int menscore; //男子团体总分 int womenscore;//女子团体总分 int totalscore; //团体总分 int jifeng;
//学校积分
//参赛运动员
struct STUDENT students[10];
struct SchoolStruct *next; //下一个参赛学校
3
}SCHOOLSTRUCT; 统计信息结构
typedef struct TongJi {
int fs;//分数
SCHOOLSTRUCT *psch;//学校地址 struct STUDENT *pstu;//学生信息地址 }TONGJI;
4
1. 添加学生功能
开始 输入学校编号 Y 继续选择学校 返回主菜单或继续选择学校 该学校人数已满? N 返回主菜单 输入学生姓名 输入项目编号 输入输入项目成绩 Y 继续添加学生? N 结束 5
2.统计信息功能
开始 显示统计菜单 输入菜单编号 调用相应的函数执行 结束 6
3. 按学校编号查询学校某个项目的情况
开始 输入学校编号 输入项目编号 根据输入的学校编号和项目编号查找出对应的信息 输出信息 结束 7
4.可以按项目编号查询取得前三或前五名的学校
开始 调用函数刷新排序计算结果 输入项目编号 根据输入的项目编号找到统计的信息 输出相应的信息 结束 8
5.显示学校信息
开始 输出所有学校编号,名称,参赛人数 结束 9
6.显示项目
开始 输出所有项目编号,名称,参赛人数 结束 10
7.删除文件
开始 N 存在数据文件 Y 是否删除 N Y 执行删除 结束 11
8.保存文件
开始 执行保存操作 提示保存成功 结束 12
9.显示项目名次
开始 调用函数刷新排序计算结果 输出排序的结果 结束 13
10.退出系统
开始 显示退出界面 结束 14
四、详细设计
程序分为10个大模块:添加学生,统计信息,按学校编号查询学校某个项目的情况,可以按项目编号查询取得前三或前五名的学校,显示学校信息,显示项目信息,删除文件,保存文件,显示项目名次,退出系统。
同时还有3个小模块:初始化数据,排序计算,设置参数。
15
计算名次函数
思路:遍历学校链表,找出各项目的前3名或前5名,最后对每个项目的前几名降序排序 void MingCi() {
int i,j,z,k1,k2,min,max; TONGJI temp; SCHOOLSTRUCT *p;
tj=calloc(5*(M+N),sizeof(TONGJI)); //初始化tj for(i=0;i for(p=h->next;p!=NULL;p=p->next) { for(i=0;i k1=xm[p->students[i].item-1].count;//该项目的得分人数,3或5 k2=p->students[i].item-1;//该项目编号-1 //找出现有项目中分数最小的 min=0; for(j=1;j 16 tj[i*5+j].fs=0; tj[i*5+j].pstu=NULL; tj[i*5+j].psch=NULL; if(tj[k2*5+j].fs } } } { } tj[k2*5+min].fs=p->students[i].score; tj[k2*5+min].pstu=&p->students[i]; tj[k2*5+min].psch=p; //tj降序排序 for(i=0;i for(j=0;j for(z=j+1;z max=z; if(max!=j) { } temp=tj[i*5+max]; tj[i*5+max]=tj[i*5+j]; tj[i*5+j]=temp; 17 排序计算函数 思路:先将各项目名次确定,再计算各学校总积分,男女团体总分。 void Sort() { int i,j,k1; SCHOOLSTRUCT *p; int jf3[3]={5,3,2},jf5[5]={7,5,3,2,1}; //将名次写入学生参赛信息 MingCi(); for(i=0;i p->menscore=p->womenscore=p->totalscore=p->jifeng=0; for(i=0;i if(p->students[i].sex)//男生 p->menscore += p->students[i].score; k1=xm[i].count; for(j=0;j tj[i*5+j].pstu->range=j+1; else//女生 p->womenscore += p->students[i].score; p->totalscore = p->menscore + p->womenscore ;//团体总分 //学校积分 if(p->students[i].range) 18 { if(xm[p->students[i].item-1].count==3) {p->jifeng+=jf3[p->students[i].range-1];} else {p->jifeng+=jf5[p->students[i].range-1];} } } } } 19 五、测试数据及其结果分析 开始界面 菜单界面 20 添加学生 统计信息菜单 21 按学校编号排序输出 按学校总分排序输出 22 按男子团体总分排序输出 按女子团体总分排序输出 23 按男女团体总分排序输出 按学校查项目情况 24 查询结果 按项目查找前几名 25 查询结果 参赛学校信息 26 所有项目信息 删除文件 27 所有项目名次信息 退出界面 28 六、调试过程中的问题 (1)刚开始碰到输入一个字符后,按下的回车键会被下一个待输入的字符接收,导致程序混乱。后来通过在输入字符后加fflush(stdin)来刷新缓冲。 (2)进行输入姓名等字符串时,若长度超过字符串数组长度,会出现错误。后来通过读取一个字符,就对其进行判断,并对输入的字符个数进行监控,超过字符串数组长度时,对接收的字符不响应。 (3)刚开始设计的保存函数,总是出错,后来发现保存完一个后,没有关闭文件指针。加了fclose(fp)函数后,问题就解决了。 29 七、大作业报告总结 通过本次的课程程序设计,应用VC++6.0软件进行程序的调试验证,把学习过的C语言知识进行了实践,对知识还进行了进一步的掌握,同时加深了对VC++6.0软件的熟练程度。 30 因篇幅问题不能全部显示,请点此查看更多更全内容