C语言课设唱歌比赛评分系统.docx

上传人:b****8 文档编号:11462162 上传时间:2023-03-01 格式:DOCX 页数:33 大小:190.82KB
下载 相关 举报
C语言课设唱歌比赛评分系统.docx_第1页
第1页 / 共33页
C语言课设唱歌比赛评分系统.docx_第2页
第2页 / 共33页
C语言课设唱歌比赛评分系统.docx_第3页
第3页 / 共33页
C语言课设唱歌比赛评分系统.docx_第4页
第4页 / 共33页
C语言课设唱歌比赛评分系统.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

C语言课设唱歌比赛评分系统.docx

《C语言课设唱歌比赛评分系统.docx》由会员分享,可在线阅读,更多相关《C语言课设唱歌比赛评分系统.docx(33页珍藏版)》请在冰豆网上搜索。

C语言课设唱歌比赛评分系统.docx

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->avenext->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*p1;

if(head==NULL&&tail==NULL)

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小升初

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1