《C语言课设-唱歌比赛评分系统(30页).doc》由会员分享,可在线阅读,更多相关《C语言课设-唱歌比赛评分系统(30页).doc(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-C语言课设-唱歌比赛评分系统-第 25 页沈 阳 航 空 航 天 大 学 课程设计学 号 _班 级 _姓 名 _指导教师 _年 月 日沈阳航空航天大学课程设计任务书学院: 专业: 班级:学号: 题目:唱歌比赛评委评分系统一、课程设计时间二、课程设计内容参加唱歌比赛3位选手的名称和出场顺序存放在文件file22.txt中;评委共有7个。每当一个选手表演之后,7个评委都分别评分(010分),而选手的最终得分计算规则为:去掉7个评分的最高和最低分,取剩下5个评分的平均值。程序最后打印出3位选手的成绩。三、课程设计要求程序质量: 贯彻结构化的程序设计思想。 用户界面友好,功能明确,操作方便。 用户界
2、面中的菜单至少应包括“读取并显示选手名单”、“表演与评分”、“打印最后成绩”、“退出”4项。 代码应适当缩进,并给出必要的注释,以增强程序的可读性。课程设计说明书: 课程结束后,上交课程设计说明书和源程序。课程设计说明书的内容参见提供的模板。四、指导教师和学生签字指导教师:_ 学生签名:_五、成绩六、教师评语目 录一、需求分析1二、设计分析3三、主要界面截图5四、技术要点6五、个人总结7六、参考文献7七、源程序7一、需求分析根据任务书给定的“课程设计内容”和“课程设计要求”作如下的需求分析。该系统是一个分数录入以及评定系统,其使用者被假定为某歌唱比赛的管理人员,系统应该具有安全、稳定、功能齐全
3、的特点。1. 安全性分析系统管理的数据涉及到参赛的所有选手,为防止他人恶意修改,所以在进入评分系统前有密码程序,只有掌握了正确的密码才能进入程序进行各项操作。2. 稳定性分析指系统比较健壮,只要是用户的合理操作,系统都应给出合理正确的回应,而不是出现令用户感到意外的系统错误或系统崩溃。3. 主要功能分析(1)密码程序:在程序尾端设置好密码,只有掌握密码的管理员才能进入程序进行成绩录入,修改等操作,避免信息被他人修改,造成比赛不公(2)菜单:有一个功能强大又清晰明了的菜单能极大程度方便管理员的操作(3)数据输入:在每个输入前都有详细分类和提示,简单明了,根据提示输入参赛选手号数,姓名,各个评委打
4、分成绩(4)数据保存:对于输入的数据,或被修改的数据应该保存到某个磁盘文件中,实现永久存储。运用了指针函数后便可实现该功能。将输入的选手信息存储到自动生成的文件中,以便于程序自动读取或人工阅读(5)成绩排名:利用冒泡程序对数组进行排序,删除一个最高与最低然后进行讲剩下的值平均,得出选手最终得分,再根据分数高低排名(6)数据查询:用户输入查询条件,系统规则地在界面显示查询结果,不光可以输入号数,查询到该选手信息,每位评委打分;还可以选择排名查询,显示的数据全面。二、设计分析主要有9个功能模块,每个模块对应一个C语言自定义函数。这些函数原型及其功能简述如下:1、程序总体结构图(传统流程图或N-S框
5、图)结束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 选手信息录入图
6、4 选手信息浏览图5 单个选手成绩查询图6 选手排名查询图7 选手信息修改图8 选手信息删除图9 程序退出四、技术要点1、冒泡程序应用运用冒泡程序对各个参赛选手排序,并去除头与尾即最高分和最低分,将剩下的评委得分运算得出选手最终平均分,然后再排序,便能得出选手名次。for(i=0;iN-1;i+) /冒泡排序法让那个成绩从小到大排列,然后选出最大值是最后一个,最小值是第一个for(j=0;jgradesjp1-gradesj+1)t=p1-gradesj;p1-gradesj=p1-gradesj+1;p1-gradesj+1=t;p1-ave=(p1-ave-(p1-grades0+p1-g
7、rades9)/8;/去掉一个最高分,去掉一个这一低分,得出最后的平均分2、文件操作包括了文件的写入和读取两个方面。运用指针程序文件的写入操作,用于保存录入的数据,也用于保存所修改的数据。例如下段程序。void save()/将数据保存到文件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%-6sn,p1
8、-num,p1-name);p1=p1-next;fprintf(fp,-|-n);fclose(fp);printf(nt文件已将保存到参赛选手名单.txt);3、关于删除算法实现从系统中删除某位同学的相关信息的算法稍微复杂一些,其实质是对数组某个或某些元素的删除操作。对数组元素的删除操作完成后,再将数组写入到文件中,就完整地实现了“删除”。void del()S_MESSAGE *node;/=(S_MESSAGE *)malloc(LEN);S_MESSAGE *p1;int check=0; /用来进行判断,是否找到了要删除的信息long del_num;printf(n请输入要删除的
9、选手的编号:);scanf(%d,&del_num);if(head = NULL & tail =NULL)printf(n当前信息记录为空,删除失败!n);elsenode=head;p1=head;while(node != NULL)if(node-num = del_num)printf(n-要删除的选手信息-n);printf(-|-n);printf( 编号 | 姓名 n);printf(-|-n);printf( %-9d%-6sn,node-num,node-name); /在这里找到了要删除的选手信息printf(-|-n);check=1; /找到要删除的信息,赋为真if
10、(node = head & head-next = NULL) /是头结点,并且只有一个结点head=NULL;tail=head;free(node);printf(n-删除信息成功-n); /删除唯一的节点else if(node = head & head-next != NULL) /删除头节点node=head;head=head-next;free(node);printf(n-删除信息成功-n); /头节点删除成功n=n-1;else if(node -next != NULL) /删除中间节点p1-next=node-next;free(node);printf(n-删除信息
11、成功-n); /中间节点删除成功n=n-1;else if(node-next = NULL) /删除尾节点p1-next=NULL;tail=p1;free(node);printf(n-删除信息成功-n); /尾节点删除成功n=n-1;getchar();return;elsep1=node;node=node-next;if(head != NULL & check = 0)printf(n对不起,你要删除的选手信息不存在!n);getchar();五、个人总结 自从拿到题目到完成整个编程,从理论到实践,在整整一个星期的日子里,可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识
12、,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,这毕竟独立做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体通过这次课程设计之后,一定把以前所学过的知识重新温故。这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在谢老师的辛勤指导下,终于游逆而解。对给过我帮助的所有同学和各位指导老师
13、再次表示忠心的感谢!六、参考文献(参考的书籍或互联网资源)1 谭浩强C程序设计北京:清华大学出版社,20052 网络资源加密程序七、源程序/*密码:123456 只有密码输入正确,才能进入plus程序.*/ #include #include #include #include #include #define LEN sizeof(S_MESSAGE)#define N 7typedef struct songer /定义选手信息链表结构long num; /选手编号char name20; /选手姓名float gradesN; /选手成绩double ave; /平均成绩struct s
14、onger * next; /链表的结点,next是指针变量,指向结构体变量S_MESSAGE;S_MESSAGE * head; /定义链表的头指针S_MESSAGE * tail; /定义链表的尾指针int n=0; / n为全局变量,用于统计结点的个数void creat(); /建立单向动态链表。此函数带回一个指向链表头的指针,用于参赛选手的录入void del(); /用于删除结点,用于参赛选手的删除void search(); /参赛选手成绩的查询void print(); /用于输出链表void rank(); /按个人平均成绩从高到低的顺序进行排序void update();
15、/参赛选手的修改void menu(); /操作系统菜单界面void menu_select(); /菜单选择界面void browse(); /选手信息浏览void save(); /选手信息保存void quit(); /退出系统界面/*- rank函数 -*/void rank()S_MESSAGE *p1,*p2,*endpt,*p; / *endpt/*控制循环比较*/ *p/*临时指针变量*/n=0;p1=head;if(head = NULL & tail = NULL)printf(n-当前信息记录为空-n);elsep1 = (S_MESSAGE *)malloc(LEN);
16、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 next-next-ave) /*如果前面的节点键值比后面节点的键值小,则交换*/p2 = p1-next-next; /1、排序后q节点
17、指向p节点,在调整指向之前,我们要保存原p的指向节点地址,即:p2=p1-next-nextp1-next-next = p2-next; /2、顺着这一步一步往下推,排序后p1-next-next要指的是p2-next,所以p1-next-next=p2-nextp2-next = p1-next; /3、p2-next原是q发出来的指向,排序后q的指向要变为指向p的,而原来p1-next是指向p的,所以p2-next=p1-nextp1-next = p2; /4、p1-next原是指向p的,排序后图16中p1-next要指向q,原来p1-next-next(即p2)是指向q的,所以p1-
18、next=p2p = 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%-5dn,p1-num,p1-name,p1-ave,n+1);n+;p1=p1-n
19、ext;printf(-|-|-|-n);getchar();/*- print函数 -*/void print()S_MESSAGE * p1=(S_MESSAGE *)malloc(LEN);int check=0,i;long seeknum;printf(n请输入要查找的选手编号:);scanf(%d,&seeknum);if(head = NULL & tail = NULL )printf(n对不起,当前记录为空!n);elsep1=head;printf(n-你要找的选手的成绩如下-n);/在这里找到了要查找的选手成绩printf(-|-|-|-|-|-|-|-|-|-|-|-n
20、);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;igradesi);printf( %-6.2lfn,p1-ave);check=1;getchar();return;elsep1=p1-next;if(head != NULL & check = 0)printf(n对不起,你查看的选
21、手成绩不存在!n);getchar();/*- search函数-*/void search()int c;printf(n请选择查询内容:n);printf(1.选手详细成绩查询 2.选手排名查询n请输入您的选择:);scanf(%d,&c);switch(c)case 1:system(cls);print();break;case 2:system(cls);rank();break;/*- save函数 -*/void save()/将数据保存到文件FILE *fp;S_MESSAGE *p1;/=(S_MESSAGE *)malloc(LEN);p1=head;fp=fopen(参赛
22、选手名单.txt,w);fprintf(fp,-|-n);fprintf(fp, 编号 | 姓名 n);while(p1 != NULL)fprintf(fp,-|-n);fprintf(fp, %-9d%-6sn,p1-num,p1-name);p1=p1-next;fprintf(fp,-|-n);fclose(fp);printf(nt文件已将保存到参赛选手名单.txt);/*- update函数 -*/void update()S_MESSAGE *p1;/=(S_MESSAGE *)malloc(LEN);int check=0; /用来进行判断,是否找到了要修改的信息long up
23、datenum;printf(n请输入要修改的选手编号:);scanf(%d,&updatenum);/查找到要修改的选手if(head = NULL & tail = NULL)printf(n-当前信息记录为空-n);elsep1=head;while(p1 != NULL)if(p1-num = updatenum) printf(n-你要修改的选手信息如下-n);printf(-|-n);printf( 编号 | 姓名 n);printf(-|-n);printf( %-9d%-6sn,p1-num,p1-name);printf(-|-n);printf(n-请重新写入此选手信息:-
24、n);check=1;/从新写入修改项目printf(n修改选手编号为:);scanf(%d,&p1-num);printf(n修改选手姓名为:);scanf(%s,p1-name);return;elsep1=p1-next;if(head != NULL & check = 0)printf(n对不起,你要修改的选手信息不存在!n);getchar();/*- browse函数 -*/void browse()S_MESSAGE *p1;if(head = NULL & tail = NULL)printf(n-当前信息记录为空-n);elseprintf(n-你要浏览的选手信息如下-n)
25、;printf(-|-n);printf( 编号 | 姓名 n);p1=head;while(p1 != NULL)printf(-|-n);printf( %-9d%-6sn,p1-num,p1-name);p1=p1-next;printf(-|-n);/*- del函数 -*/void del()S_MESSAGE *node;/=(S_MESSAGE *)malloc(LEN);S_MESSAGE *p1;int check=0; /用来进行判断,是否找到了要删除的信息long del_num;printf(n请输入要删除的选手的编号:);scanf(%d,&del_num);if(h
26、ead = NULL & tail =NULL)printf(n当前信息记录为空,删除失败!n);elsenode=head;p1=head;while(node != NULL)if(node-num = del_num) printf(n-要删除的选手信息-n); printf(-|-n); printf( 编号 | 姓名 n); printf(-|-n); printf( %-9d%-6sn,node-num,node-name); /在这里找到了要删除的选手信息printf(-|-n);check=1; /找到要删除的信息,赋为真if(node = head & head-next =
27、 NULL) /是头结点,并且只有一个结点head=NULL;tail=head;free(node);printf(n-删除信息成功-n); /删除唯一的节点else if(node = head & head-next != NULL) /删除头节点node=head;head=head-next;free(node);printf(n-删除信息成功-n); /头节点删除成功n=n-1;else if(node -next != NULL) /删除中间节点p1-next=node-next;free(node);printf(n-删除信息成功-n); /中间节点删除成功n=n-1;else
28、 if(node-next = NULL) /删除尾节点p1-next=NULL;tail=p1;free(node);printf(n-删除信息成功-n); /尾节点删除成功n=n-1;getchar();return;elsep1=node;node=node-next;if(head != NULL & check = 0)printf(n对不起,你要删除的选手信息不存在!n);getchar();/*- creat函数 -*/void creat()int i,j;float t;char c=y;while(c = y | c = Y)S_MESSAGE *p1=(S_MESSAGE
29、 *)malloc(LEN);printf(n请输入要录入的选手信息:n);printf(n选手编号:);scanf(%d,&p1-num);printf(n选手姓名:);scanf(%s,p1-name);printf(n请输入7位评委点评成绩:);p1-ave = 0;for(i=0;igradesi); /runtime errorp1-ave += p1-gradesi;for(i=0;iN-1;i+) /冒泡排序法让那个成绩从小到大排列,然后选出最大值是最后一个,最小值是第一个for(j=0;jgradesjp1-gradesj+1)t=p1-gradesj;p1-gradesj=p
30、1-gradesj+1;p1-gradesj+1=t;p1-ave=(p1-ave-(p1-grades0+p1-grades9)/8;/去掉一个最高分,去掉一个这一低分,得出最后的平均分p1-next=NULL;if(p1=NULL)printf(n内存分配失败n);n=n-1;if(head = NULL & tail = NULL) /当前没有结点,创建第一个结点head=p1;head-next=NULL;tail=head;printf(n-选手信息录入成功-n);else /如果当前还有节点则插入到尾部tail-next=p1;tail=p1;tail-next=NULL;prin
31、tf(n-选手信息录入成功-n);printf(是否继续(Y/N):);getchar();scanf(%c,&c);/*- quit函数 -*/void quit()printf(nnt=感谢您使用歌唱比赛评分系统=nn);/*- menu函数 -*/void menu()printf(nnt* 歌唱比赛评分系统(制作人况思雨)*nn);printf( 1.选手信息浏览 2.选手信息录入 n);printf( 3.选手信息保存 4.选手成绩查询 n);printf( 5.选手信息修改 6.选手信息删除 n);printf( 7.退出系统 n);printf(n * 系统菜单选择界面*n);p
32、rintf(t 请根据您想执行的命令,输入对应功能的数字键n);printf(请输入您的选择:);/*- menu_select函数 -*/void menu_select()char s100;int c;gets(s); /不管用户输入的是数字键或是字母键使用gets都能将输入作为字符串接收while(1) /限定用户输入的数值必须在1-7之间才有效,否则要求重新输入c = atoi(s); /利用atoi()函数将所接收的字符串转换成数值,提供给if语句判断if(c 7)printf(您的输入有误,请重新输入:);gets(s); else break;switch(c)case 1:system(cls); /清屏browse();break;case 2:system(cls);creat();break;case 3:system(cls);save();break;case 4:system(cls);search();break;case 5:system(cls);update();break;case 6:system(cls);del();break;case 7:syst