C语言课设唱歌比赛评分系统.docx
- 文档编号:12188514
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:33
- 大小:191.50KB
C语言课设唱歌比赛评分系统.docx
《C语言课设唱歌比赛评分系统.docx》由会员分享,可在线阅读,更多相关《C语言课设唱歌比赛评分系统.docx(33页珍藏版)》请在冰豆网上搜索。
C语言课设唱歌比赛评分系统
沈阳航空航天大学
课程设计
学号____________
班级____________
姓名____________
指导教师____________
年月日
沈阳航空航天大学
课程设计任务书
学院:
专业:
班级:
学号:
题目:
唱歌比赛评委评分系统
一、课程设计时间
二、课程设计内容
参加唱歌比赛3位选手的名称和出场顺序存放在文件file22.txt中;评委共有7个。
每当一个选手表演之后,7个评委都分别评分(0~10分),而选手的最终得分计算规则为:
去掉7个评分的最高和最低分,取剩下5个评分的平均值。
程序最后打印出3位选手的成绩。
三、课程设计要求
程序质量:
✧贯彻结构化的程序设计思想。
✧用户界面友好,功能明确,操作方便。
✧用户界面中的菜单至少应包括“读取并显示选手名单”、“表演与评分”、“打印最后成绩”、“退出”4项。
✧代码应适当缩进,并给出必要的注释,以增强程序的可读性。
课程设计说明书:
✧课程结束后,上交课程设计说明书和源程序。
课程设计说明书的内容参见提供的模板。
四、指导教师和学生签字
指导教师:
________学生签名:
________
五、成绩
六、教师评语
一、需求分析
根据任务书给定的“课程设计内容”和“课程设计要求”作如下的需求分析。
该系统是一个分数录入以及评定系统,其使用者被假定为某歌唱比赛的管理人员,系统应该具有安全、稳定、功能齐全的特点。
1.安全性分析
系统管理的数据涉及到参赛的所有选手,为防止他人恶意修改,所以在进入评分系统前有密码程序,只有掌握了正确的密码才能进入程序进行各项操作。
2.稳定性分析
指系统比较健壮,只要是用户的合理操作,系统都应给出合理正确的回应,而不是出现令用户感到意外的系统错误或系统崩溃。
3.主要功能分析
(1)密码程序:
在程序尾端设置好密码,只有掌握密码的管理员才能进入程序进行成绩录入,修改等操作,避免信息被他人修改,造成比赛不公
(2)菜单:
有一个功能强大又清晰明了的菜单能极大程度方便管理员的操作
(3)数据输入:
在每个输入前都有详细分类和提示,简单明了,根据提示输入参赛选手号数,姓名,各个评委打分成绩
(4)数据保存:
对于输入的数据,或被修改的数据应该保存到某个磁盘文件中,实现永久存储。
运用了指针函数后便可实现该功能。
将输入的选手信息存储到自动生成的文件中,以便于程序自动读取或人工阅读
(5)成绩排名:
利用冒泡程序对数组进行排序,删除一个最高与最低然后进行讲剩下的值平均,得出选手最终得分,再根据分数高低排名
(6)数据查询:
用户输入查询条件,系统规则地在界面显示查询结果,不光可以输入号数,查询到该选手信息,每位评委打分;还可以选择排名查询,显示的数据全面。
二、设计分析
主要有9个功能模块,每个模块对应一个C语言自定义函数。
这些函数原型及其功能简述如下:
1、程序总体结构图(传统流程图或N-S框图)
2、主要功能模块框图(传统流程图或N-S框图)
(1)密码程序plus()
不正确
正确
(2)参赛选手信息录入creat()
Printf参赛选手号数
Printf姓名
Printf7位评委打分
是否继续输入
是
否
重新执行开头
返回主菜单
(3)浏览选手数据browse()
(4)查询选手成绩search()
(5)删除函数del()
(6)查询选手信息print()
(7)菜单函数menu()
(8)修改函数update()
(9)指针函数rank()
(10)保存函数save()
三、主要界面截图
图1进入程序输入密码界面
图2程序主界面
图3选手信息录入
图4选手信息浏览
图5单个选手成绩查询
图6选手排名查询
图7选手信息修改
图8选手信息删除
图9程序退出
四、技术要点
1、冒泡程序应用
运用冒泡程序对各个参赛选手排序,并去除头与尾即最高分和最低分,将剩下的评委得分运算得出选手最终平均分,然后再排序,便能得出选手名次。
for(i=0;i for(j=0;j if(p1->grades[j]>p1->grades[j+1]) { t=p1->grades[j]; p1->grades[j]=p1->grades[j+1]; p1->grades[j+1]=t; } p1->ave=(p1->ave-(p1->grades[0]+p1->grades[9]))/8;//去掉一个最高分,去掉一个这一低分,得出最后的平均分 2、文件操作 包括了文件的写入和读取两个方面。 运用指针程序文件的写入操作,用于保存录入的数据,也用于保存所修改的数据。 例如下段程序。 voidsave()//将数据保存到文件 { FILE*fp; S_MESSAGE*p1;//=(S_MESSAGE*)malloc(LEN); p1=head; fp=fopen("参赛选手名单.txt","w"); fprintf(fp,"--------|--------\n"); fprintf(fp,"编号|姓名\n"); while(p1! =NULL) { fprintf(fp,"--------|--------\n"); fprintf(fp,"%-9d%-6s\n",p1->num,p1->name); p1=p1->next; } fprintf(fp,"--------|--------\n"); fclose(fp); printf("\n\t文件已将保存到\"参赛选手名单.txt\""); } 3、关于删除算法 实现从系统中删除某位同学的相关信息的算法稍微复杂一些,其实质是对数组某个或某些元素的删除操作。 对数组元素的删除操作完成后,再将数组写入到文件中,就完整地实现了“删除”。 voiddel() { S_MESSAGE*node;//=(S_MESSAGE*)malloc(LEN); S_MESSAGE*p1; intcheck=0;//用来进行判断,是否找到了要删除的信息 longdel_num; printf("\n请输入要删除的选手的编号: "); scanf("%d",&del_num); if(head==NULL&&tail==NULL) { printf("\n当前信息记录为空,删除失败! \n"); } else { node=head; p1=head; while(node! =NULL) { if(node->num==del_num) { printf("\n--------要删除的选手信息--------\n"); printf("--------|--------\n"); printf("编号|姓名\n"); printf("--------|--------\n"); printf("%-9d%-6s\n",node->num,node->name);//在这里找到了要删除的选手信息 printf("--------|--------\n"); check=1;//找到要删除的信息,赋为真 if(node==head&&head->next==NULL)//是头结点,并且只有一个结点 { head=NULL; tail=head; free(node); printf("\n--------删除信息成功--------\n");//删除唯一的节点 } elseif(node==head&&head->next! =NULL)//删除头节点 { node=head; head=head->next; free(node); printf("\n--------删除信息成功--------\n");//头节点删除成功 n=n-1; } elseif(node->next! =NULL)//删除中间节点 { p1->next=node->next; free(node); printf("\n--------删除信息成功--------\n");//中间节点删除成功 n=n-1; } elseif(node->next==NULL)//删除尾节点 { p1->next=NULL; tail=p1; free(node); printf("\n--------删除信息成功--------\n");//尾节点删除成功 n=n-1; } getchar(); return; } else { p1=node; node=node->next; } } } if(head! =NULL&&check==0) { printf("\n对不起,你要删除的选手信息不存在! \n"); } getchar(); 五、个人总结 自从拿到题目到完成整个编程,从理论到实践,在整整一个星期的日子里,可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。 通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。 在设计的过程中遇到问题,这毕竟独立做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体……通过这次课程设计之后,一定把以前所学过的知识重新温故。 这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在谢老师的辛勤指导下,终于游逆而解。 对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢! 六、参考文献 (参考的书籍或互联网资源) [1]谭浩强.C程序设计.北京: 清华大学出版社,2005 [2]网络资源加密程序 七、源程序 /*密码: 123456只有密码输入正确,才能进入plus程序.*/ #include #include #include #include #include #defineLENsizeof(S_MESSAGE) #defineN7 typedefstructsonger//定义选手信息链表结构 { longnum;//选手编号 charname[20];//选手姓名 floatgrades[N];//选手成绩 doubleave;//平均成绩 structsonger*next;//链表的结点,next是指针变量,指向结构体变量 }S_MESSAGE; S_MESSAGE*head;//定义链表的头指针 S_MESSAGE*tail;//定义链表的尾指针 intn=0;//n为全局变量,用于统计结点的个数 voidcreat();//建立单向动态链表。 此函数带回一个指向链表头的指针,用于参赛选手的录入 voiddel();//用于删除结点,用于参赛选手的删除 voidsearch();//参赛选手成绩的查询 voidprint();//用于输出链表 voidrank();//按个人平均成绩从高到低的顺序进行排序 voidupdate();//参赛选手的修改 voidmenu();//操作系统菜单界面 voidmenu_select();//菜单选择界面 voidbrowse();//选手信息浏览 voidsave();//选手信息保存 voidquit();//退出系统界面 /*------------------------------------rank函数-----------------------------------------*/ voidrank() { S_MESSAGE*p1,*p2,*endpt,*p;//*endpt/*控制循环比较*/*p/*临时指针变量*/ n=0; p1=head; if(head==NULL&&tail==NULL) { printf("\n--------当前信息记录为空--------\n"); } else { p1=(S_MESSAGE*)malloc(LEN); p1->next=head;/*注意理解: 我们增加一个节点,放在第一个节点的前面,主要是为了便于比较。 因为第一个节点没有前驱,我们不能交换地址。 */ head=p1;/*让head指向p1节点,排序完成后,我们再把p1节点释放掉*/ for(endpt=NULL;endpt! =head;endpt=p)/*结合第6点理解*/ { for(p=p1=head;p1->next->next! =endpt;p1=p1->next) { if(p1->next->ave { p2=p1->next->next;//1、排序后q节点指向p节点,在调整指向之前,我们要保存原p的指向节点地址,即: p2=p1->next->next p1->next->next=p2->next;//2、顺着这一步一步往下推,排序后p1->next->next要指的是p2->next,所以p1->next->next=p2->next p2->next=p1->next;//3、p2->next原是q发出来的指向,排序后q的指向要变为指向p的,而原来p1->next是指向p的,所以p2->next=p1->next p1->next=p2;//4、p1->next原是指向p的,排序后图16中p1->next要指向q,原来p1->next->next(即p2)是指向q的,所以p1->next=p2 p=p1->next->next;//5、至此,完成了相邻两节点的顺序交换 } } } p1=head;/*把p1的信息去掉*/ head=head->next;/*让head指向排序后的第一个节点*/ free(p1);/*释放p1*/ printf("\n-----------选手成绩排名信息如下---------\n"); printf("--------|--------|--------|--------\n"); printf("编号|姓名|平均成绩|名次\n"); p1=head; while(p1! =NULL) { printf("--------|--------|--------|--------\n"); printf("%-9d%-9s%-9.1lf%-5d\n",p1->num,p1->name,p1->ave,n+1); n++; p1=p1->next; } printf("--------|--------|--------|--------\n"); } getchar(); } /*------------------------------------print函数-----------------------------------------*/ voidprint() { S_MESSAGE*p1=(S_MESSAGE*)malloc(LEN); intcheck=0,i; longseeknum; printf("\n请输入要查找的选手编号: "); scanf("%d",&seeknum); if(head==NULL&&tail==NULL) { printf("\n对不起,当前记录为空! \n"); } else { p1=head; printf("\n-----------你要找的选手的成绩如下---------\n");//在这里找到了要查找的选手成绩 printf("------|------|-----|----|----|----|----|----|----|----|----------|--------\n"); printf("编号|姓名|成绩|1|2|3|4|5|6|7|平均成绩\n"); printf("------|------|-----|----|----|----|----|----|----|----|----------|--------\n"); while(p1! =NULL) { if(p1->num==seeknum) { printf("%-7d%-6s",p1->num,p1->name); printf(""); for(i=0;i { printf("%.1f",p1->grades[i]); } printf("%-6.2lf\n",p1->ave); check=1; getchar(); return; } else { p1=p1->next; } } } if(head! =NULL&&check==0) { printf("\n对不起,你查看的选手成绩不存在! \n"); } getchar(); } /*---------------------------search函数-------------------------------*/ voidsearch() { intc; printf("\n请选择查询内容: \n"); printf("1.选手详细成绩查询2.选手排名查询\n请输入您的选择: "); scanf("%d",&c); switch(c) { case1: system("cls");print();break; case2: system("cls");rank();break; } } /*-------------------------------save函数------------------------------*/ voidsave()//将数据保存到文件 { FILE*fp; S_MESSAGE*p1;//=(S_MESSAGE*)malloc(LEN); p1=head; fp=fopen("参赛选手名单.txt","w"); fprintf(fp,"--------|--------\n"); fprintf(fp,"编号|姓名\n"); while(p1! =NULL) { fprintf(fp,"--------|--------\n"); fprintf(fp,"%-9d%-6s\n",p1->num,p1->name); p1=p1->next; } fprintf(fp,"--------|--------\n"); fclose(fp); printf("\n\t文件已将保存到\"参赛选手名单.txt\""); } /*------------------------update函数--------------------------*/ voidupdate() { S_MESSAGE*p1;//=(S_MESSAGE*)malloc(LEN); intcheck=0;//用来进行判断,是否找到了要修改的信息 longupdatenum; printf("\n请输入要修改的选手编号: "); scanf("%d",&updatenum);//查找到要修改的选手 if(head==NULL&&tail==NULL) { printf("\n--------当前信息记录为空--------\n"); } else { p1=head; while(p1! =NULL) { if(p1->num==updatenum) { printf("\n-----------你要修改的选手信息如下---------\n"); printf("--------|--------\n"); printf("编号|姓名\n"); printf("--------|--------\n"); printf("%-9d%-6s\n",p1->num,p1->name); printf("--------|--------\n"); printf("\n-----------请重新写入此选手信息: ---------\n"); check=1;//从新写入修改项目 printf("\n修改选手编号为: "); scanf("%d",&p1->num); printf("\n修改选手姓名为: "); scanf("%s",p1->name); return; } else { p1=p1->next; } } } if(head! =NULL&&check==0) { printf("\n对不起,你要修改的选手信息不存在! \n"); } getchar(); } /*----------------------browse函数-----------------------------*/ voidbrowse() { S_MESSAGE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 唱歌 比赛 评分 系统