C语言课设唱歌比赛评分系统Word下载.docx
《C语言课设唱歌比赛评分系统Word下载.docx》由会员分享,可在线阅读,更多相关《C语言课设唱歌比赛评分系统Word下载.docx(26页珍藏版)》请在冰豆网上搜索。
![C语言课设唱歌比赛评分系统Word下载.docx](https://file1.bdocx.com/fileroot1/2023-1/9/c124a525-6393-46b3-839c-1a219fb3b57c/c124a525-6393-46b3-839c-1a219fb3b57c1.gif)
该系统是一个分数录入以及评定系统,其使用者被假定为某歌唱比赛的管理人员,系统应该具有安全、稳定、功能齐全的特点。
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<
N-1;
i++)//冒
泡排序法让那个成绩从小到大排列,然后选出最大值是最后一个,最小值是第一个
for(j=0;
j<
N-1-i;
j++)if(p1->
grades[j]>
p1->
grades[j+1]){
t=p1->
grades[j];
grades[j]=p1->
grades[j+1];
grades[j+1]=t;
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"
编号|姓名\n"
while(p1!
=NULL)
%-9d%-6s\n"
p1->
num,p1->
name);
p1=p1->
next;
}
fclose(fp);
printf("
\n\t文件已将保存到\"
参赛选手名单.txt\"
"
3、关于删除算法
实现从系统中删除某位同学的相关信息的算法稍微复杂一些,
其实质是对数组某个或某些元素的删除操作。
对数组元素的删除操作完成后,再将数组写入到文件中,就完整地实现了“删除”。
voiddel()
S_MESSAGE*node;
intcheck=0;
//用来进行判断,是否找到了要删除的信息
longdel_num;
\n请输入要删除的选手的编号:
"
scanf("
%d"
&
del_num);
if(head==NULL&
&
tail==NULL)
\n当前信息记录为空,删除失败!
\n"
else
node=head;
while(node!
if(node->
num==del_num)
node->
num,node->
//在这里找到了要删除的选手信息
check=1;
//找到要删除的信息,赋为真
if(node==head&
head->
next==NULL)
//是头结点,并且只有一个结点
head=NULL;
tail=head;
free(node);
\n删除信息成功
//删除唯一的节点
elseif(node==head&
next!
//删除头节点
head=head->
\n"
//
头节点删除成功
n=n-1;
elseif(node->
=NULL)//删除中间节点{
next=node->
free(node);
中间节点删除成功
elseif(node->
next==NULL)//删除尾节点
{p1->
next=NULL;
tail=p1;
printf("
尾节点删除成功n=n-1;
getchar();
return;
p1=node;
node=node->
next;
if(head!
=NULL&
check==0)
printf("
\n对不起,你要删除的选手信息不存在!
五、个人总结
自从拿到题目到完成整个编程,从理论到实践,在整整一个星期的日子里,
可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,这毕竟独立做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体……通过这次课程设计之后,一定把以前所学过的知识重新温故。
这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在谢老师的辛勤指导下,终于游逆而解。
对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
六、参考文献
(参考的书籍或互联网资源)
[1]谭浩强.C程序设计.北京:
清华大学出版社,2005
[2]网络资源加密程序
七、源程序
/*密码:
123456只有密码输入正确,才能进入plus程序.*/
#include<
stdio.h>
stdlib.h>
conio.h>
string.h>
malloc.h>
#defineLENsizeof(S_MESSAGE)
#defineN7
typedefstructsonger
r
//
定义选手信息链表结构
longnum;
选手编号
charname[20];
选手姓名
floatgrades[N];
选手成绩
doubleave;
平均成绩
structsonger*next;
链表的结点,next是指针
变量,指向结构体变量
}S_MESSAGE;
S_MESSAGE*
head;
定义链表的头指针
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;
tail==NULL){
\n当前信息记录为空\n"
p1=(S_MESSAGE*)malloc(LEN);
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->
ave<
ave)
/*如果前面的节点键值比后面节点的键值小,则交换*/
p2=p1->
//1、排
序后q节点指向p节点,在调整指向之前,我们要保存原p的指向节点地址,即:
p2=p1->
next
next=p2->
//2、顺
着这一步一步往下推,排序后p1->
next要指的是p2->
next,
所以p1->
next=p2->
p2->
next=p1->
//3、p2->
next原是q发出来的指向,排序后q的指向要变为指向p的,而原来p1->
next是指向p的,所以p2->
next=p1->
next=p2;
//4、p1->
next原是指向p的,排序后图16中p1->
next要指向q,原来p1->
next(即p2)是指向q的,所以p1->
next=p2
p=p1->
//5、至
此,完成了相邻两节点的顺序交换
把p1的信息去掉*/
让head指向排序后的第一个
释放p1*/
选手成绩排名信息如下
-|\n"
名|平均成绩|名次\n"
p1=head;
/*
head=head->
节点*/
free(p1);
\n
|
编号|
=NULL){
|||\n"
%-9d%-9s%-9.1lf%-5d\n"
name,p1->
ave,n+1);
n++;
/*print函数
voidprint()
S_MESSAGE*p1=(S_MESSAGE*)malloc(LEN);
intcheck=0,i;
longseeknum;
\n请输入要查找的选手编号:
seeknum);
tail==NULL)
\n对不起,当前记录为空!
\n你要找的选手的成绩如下
---\n"
//在这里找到了要查找的选手成绩
||||||||-
---|||\n"
编号|姓名|成绩|1|2|3|4|5|6|7|平均成绩\n"
num==seeknum)
%-7d%-6s"
N;
i++)
%.1f"
grades[i]);
%-6.2lf\n"
ave);
{p1=p1->
\n对不起,你查看的选手成绩不存在!
/*search函数
voidsearch()
intc;
\n请选择查询内容:
1.选手详细成绩查询2.选手排名查询\n请输入您的选择:
c);
switch(c)
case1:
system("
cls"
print();
break;
case2:
rank();
/*save函数
p1=head;
}
/*update函数
voidupdate()
//用来进行判断,是否找到了要修改的信息longupdatenum;
\n请输入要修改的选手编号:
scanf("
updatenum);
//查找到要修改的选手if(head==NULL&
tail==NULL)
num==updatenum)
\n你要修改的选手信息如下
\n请重新写入此选手信
息:
//从新写入修改项目printf("
\n修改选手编号为:
num);
\n修改选手姓名为:
%s"
return;
!
\n对不起,你要修改的选手信息不存在
/*browse函数
voidbrowse()
\n你要浏览的选手信息如下
/*del函数
*/
//用来进行判断,是否找到了要删除的信息longdel_num;
\n要删除的选手信息
head=head->
//头节点删除成功
删除中间节点
=NULL)//
//中间节点删除成功