C语言课设唱歌比赛评分系统.docx
- 文档编号:6735898
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:26
- 大小:103.90KB
C语言课设唱歌比赛评分系统.docx
《C语言课设唱歌比赛评分系统.docx》由会员分享,可在线阅读,更多相关《C语言课设唱歌比赛评分系统.docx(26页珍藏版)》请在冰豆网上搜索。
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框图)
(1)密码程序plus()
输入密码
不正确
(3)
(4)
Printf7位评委打分
是否继续输入
是
否
重新执行开头
返回主菜单
浏览选手数据browse()
查询选手成绩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 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) \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); \n");// \n");// \n");// 头节点删除成功 n=n-1; } elseif(node->next! =NULL)//删除中间节点{ p1->next=node->next;free(node); printf("\n删除信息成功 中间节点删除成功 n=n-1; } elseif(node->next==NULL)//删除尾节点 {p1->next=NULL;tail=p1;free(node);printf("\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 r // 定义选手信息链表结构 { 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指向pl节点,排序 完成后,我们再把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*/ 选手成绩排名信息如下 -|\n"); 名|平均成绩|名次\n"); p1=head;/* head=head->next;/* 节点*/ free(p1);/* printf("\n \n"); printf("| printf("编号| 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) { ! \n"); printf("\n对不起,你要修改的选手信息不存在 } getchar(); } /*browse函数 */ voidbrowse() { S_MESSAGE*p1; if(head==NULL&&tail==NULL) { printf("\n当前信息记录为空\n"); } else { printf("\n你要浏览的选手信息如下 \n"); printf("|\n"); printf("编号|姓名\n"); p1=head; while(p1! =NULL) { printf("|\n"); printf("%-9d%-6s\n",p1->num,p1->name);p1=p1->next; } printf("|\n"); } } /*del函数 */ 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; } else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 唱歌 比赛 评分 系统