大赛评分系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《程序设计基础(C语言)》
课程设计说明书
学院:XXXXXXXX
班级: XXXXXX
学号: XXXXXXXXX
姓名: XXX
教师: XXX
日期: 2012年月日
题目名称:大赛评分系统
算法分析:(提示:该部分内容填写课程设计所实现的系统具有哪些功能模块,每个模块能完成的功能及需要考虑的逻辑算法。)
1.该程序功能
(1)在大赛中,有十个评委为参赛的选手打分,分数为1~100分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。
(2)同时对评委评分进行裁判,即在10个评委中找出最公平(即评分最接近平均分)和最不公平(即与平均分的差距最大)的评委。
2.程序实现
程序的要求是根据十个评委对参赛选手的打分情况,求出这个选手的平均成绩和最公平及最不公平的裁判。首先,我先考虑到程序的数据输入,可以用scanf 函数来解决,并将输入的数据存放于数组中。随后对存放在数组中的数据进行排序,这步为执行找出最不公平的裁判提高了效率,只需将排好序的数组的首尾分值与平均值进行比较即可。将排好序的数组中间的八个数求平均值即为此选手的成绩,可见排序法可大大的简化程序。接下来是最后一个任务就是找最公平的裁判,此过程我使用拆半法,先将靠近中间的一个裁判假设为最公平的,再将他前面的裁判与之比较,找出前半部分的最公平的裁判,再将之与后半部分的进行比较,得出最终的最公平的裁判。为了方便管理员更好的使用界面操作,我还设置了每输入完一组数据并得到结果后,或接着输入下组数据或按0跳出界面。
流程设计:
1.分数的输入部分;
2.对分数进行的排序部分;
3.计算平均值的部分;
4.找出最不公平裁判部分;
5.找出最公平裁判部分;
6.数据的输出部
代码设计:
#include
#include
#include
struct test
{
int num;
float s;
}; /*定义结构体类型的变量*/
void main()
{
int i,j,k,bad,good;
float ts,sum=0,aver=0,tm[10]; /*定义一个10元素数组*/
double min;
struct test data[10],*p[10],*temp; /*定义指向结构体数组的指针*/ do
{
sum=0;
aver=0;
printf("请输入10个分数------输入0(退出)\n");
for(i=0;i<10;i++) /*循环结构*/
{
data[i].num=i+1;
scanf("%f",&data[i].s);
/*分数的输入部分*/
if(data[0].s==0)
{
printf(0);
}
/*输入0则退出系统*/
}
for(i=0;i<10;i++)
{
tm[i]=data[i].s;
}
for(i=0;i<10;i++)
{
p[i]=&data[i];
}
for(i=0;i<9;i++)
{
k=i;
for(j=i+1;j<10;j++)
{
if(tm[k] { k=j; } if(k!=i) { ts=tm[i]; tm[i]=tm[k]; tm[k]=ts; temp=p[i]; p[i]=p[k]; p[k]=temp; } /*对输入分值进行排序*/ } } for(i=1;i<9;i++) { sum+=p[i]->s; } aver=sum/8; /*计算平均值的部分*/ printf("\n-----------------\n"); printf("平均分是:%.1f\n",aver); printf("-----------------\n"); (fabs(p[0]->s-aver)>fabs(p[9]->s-aver))?(bad=0):(bad=9); /*通过绝对差值判断与平均值相差最大的裁判*/ min = fabs(p[5]->s-aver); good=5; /*暂定第六个为最公平裁判*/ for(i=4;i>0;i--) { if((fabs(p[i]->s-aver))<=min) { min=fabs(p[i]->s-aver); good=i; } else break; } /*用拆半法先将前半部分与min比较*/ for(i=6;i<9;i++) { if((fabs(p[i]->s-aver))<=min) { min=fabs(p[i]->s-aver); good=i; } else break; } /*用拆半法先将后半部分与min比较*/ printf("最不公平的裁判是%d ,打出的分数是%.1f\n",p[bad]->num,p[bad]->s); /*打印出最不公平裁判和其分数*/ printf("最公平的裁判是%d ,打出的分数是%.1f\n",p[good]->num,p[good]->s); /*打印出最公平裁判和其分数*/ printf("\n----------------------------------\n"); printf("下一位:"); /*打印出下一位*/ }while(1); } 运行结果: