C语言课程设计之评分系统.docx
《C语言课程设计之评分系统.docx》由会员分享,可在线阅读,更多相关《C语言课程设计之评分系统.docx(17页珍藏版)》请在冰点文库上搜索。
![C语言课程设计之评分系统.docx](https://file1.bingdoc.com/fileroot1/2023-6/20/6dd9591c-a01e-428d-88c1-18065e2c58a7/6dd9591c-a01e-428d-88c1-18065e2c58a71.gif)
C语言课程设计之评分系统
华中师范大学传媒学院
课程设计
课程名称C语言课程设计
题目__________________
专业__________________
班级__________________
学号__________________
姓名__________________
成绩__________________
指导教师__________________
_______年_______月_______日
课程设计任务书
设计题目:
设计比赛评分系统(给分原则:
满分为10分;裁判给出分数后,去掉一个最高分和一个最低分后的平均分为选手的最后得分(精确到小数点后两位)。
)
设计目的:
1.巩固和加深课堂所学知识;
2.将课本上的理论知识和实际应用有机的结合起来,培养同学们分析和解决实际问题的能力;
3.学会编制结构清晰、风格良好、数据结构选择恰当的C语言程序;
设计任务:
(在规定的时间内完成下列任务)
功能:
1、设参赛人数为为裁判人数为(不少于11的奇数)位,
2、录入参赛人员的资料和得分情况好,统计最后得分,
3、按最后得分结果从高分到低分排序,
4、公布一、二、三等奖的得奖选手名单。
5、此系统能够查询选手的得分情况。
具体要求:
设计报告按统一撰写格式要求,应包含以下内容:
1、题目:
2、设计目的:
2、设计内容:
写出简要的程序功能描述、程序运行条件所需工具软件、输入/输出描述等。
3、程序结构:
①函数定义说明;②用到的库函数(宏)的功能说明、调用关系说明、参数传送方式说明等;③主要算法描述等(各模块功能实现)。
13、设计要求:
①绘制设计系统的结构层次图,各功能实现的算法、绘制结构化流程图。
②程序流程图、源程序(程序必须有简单注释,源程序若太长,可作为附录)③设计输入、输出界面。
(输出)
5、
(1)程序结构设计特点;
(2)设计、调试程序心得、体会或不足。
设计报告:
(一)主程序的流程
程序先通过宏定义符号常量N(选手数),M(评委数),P(评分选项数)的值分别为19,17,13.这样不仅简单不易出错,而且便于常量的更改,只需改变#include命令行就可以一改全改。
接着定义了评委评分,选手得分和选手姓名的数组以便最终将选手最后得分与姓名对应。
进入程序主体,要想将比赛结果完整的输出,我们必须要让程序在将评委得分与选手姓名输入时自动计算出选手最终得分以及实现名次排序与姓名的一一对应。
为了实现19位选手得分的正确录入,先用for循环嵌套通过评委数量与选手数量控制评分项的完整输入,再用scanf语句对应二维数组a[]使评分与选手结合,在k=N时跳出循环,至此评分录入完毕。
评分录入后还得计算出选手最终得分。
为了去掉一个最高分,一个最低分,程序调用自编函数sort将评分按大小排序,接着调用average函数去除一个最高分与最低分算出选手最终得分。
最后将选手得分排序。
公布获奖结果时还必须出现选手的姓名。
接着再用一个for循环通过k控制姓名数量,通过scanf函数实现选手姓名的录入,在k最终的获奖名次必须与选手姓名一一对应。
调用自编函数arran,通过一维数组num[]与二维数组name[][]将上面的评分与选手姓名一一对应。
最后程序用printf函数和for循环将最后的比赛名次与获奖选手姓名一一对应的完整输出,程序到此结束。
(二)各分程序模块之间的调用关系
主程序由三个程序模块构成,分别为自编函数sort,average,arran。
每一个模块用来实现一个特定的功能,由主程序调用其他函数,其他函数也可以互相调用,以减少重复编写程序段的工作量。
在选手评分录入完成后,为了准确计算出选手的最终得分,程序首先调用了average函数。
从六个评委的评分中先通过调用sort函数将评分按大小进行排序,然后去掉一个最低分,去掉一个最高分,用average函数算出平均数aver作为选手得分。
选手姓名录入完成以及选手最终得分名次排序后,还必须将选手得分与选手姓名一一对应,程序在此调用arran函数。
arran函数通过定义一维数组num[]和二维数组name[][]实现了选手得分以及选手姓名的一一对应。
函数调用至此结束。
如:
{inti,j,max;floattemp1;chartemp2[19];
for(i=0;i{max=i;
for(j=i;j{if(num[max]max=j;
}
temp1=num[i];
strcpy(temp2,name[i]);
num[i]=num[max];
strcpy(name[i],name[max]);
num[max]=temp1;
strcpy(name[max],temp2);}
}
首先我们先定义一个整型变量,i,j。
和一个最大的的值max变量,temp1表示分数的高低,然后再定义一个字符型数组temp2[19]。
该数组表示可容纳19个元素。
接下来在利用for语句进行循环来把评分的名次给排列起来,用for语句,当i=0,i《N;i++表示第一次循环max=i,再利用for语句赋予i=j使j《N;j++(for语句循环变量赋予初值,,循环条件,循环变量增值语句)即表示当max为第i次循环时得到这i=j成本,而j《N;j++并且满足if语句这个最大值评分分数小于第j次循环所得分数时,那么这个最高分数便为第J次循环的最大值。
那么此时分数temp1=num[i]然后再利用strcpy函数(它表示字符串复制函数作用是将字符数串2复制到字符数组1中去巴表示名字的定义变量temp2赋予给temp1所表示的分数,也就是说第i次for循环所得到的最高分利用字符串函数strcpy(name[i],name[max])所示的为所获最高分的那个让你的名字赋予给第i个名字,也就是第i个名字所得分数为演讲比赛分数最高。
最后一次循环来排出评分的高低并把相应的名字进行一一对应上去,以此结束了整个编程程序的循环。
运行程序使用说明:
运行程序时,当提示:
请输入第k+1位选手的成绩时,输入12个小于等于50的数,数与数之间用空格键隔开,每输入12个数据后按下回车键,将进行下一位选手成绩的输入,依次下去,当输完八位参赛选手的成绩后,按下回车键,系统将提示输入参赛选手的姓名,此时从键盘上输入八位参赛选手的姓名(vc++17.0支持输汉字的功能),姓名与姓名之间同样用空格键隔开,输完姓名后,按下回车键,将出现运行结果。
四.源程序及系统文件使用说明
源程序如下:
#include
#include
#defineN19
#defineM17
#defineP13
main()
{voidsort(floatarray[],intn);
floataverage(floatarray[M]);
voidarran(floatnum[],charname[N][19]);
floatb[M];inti,j,k;
floata[M][P];
floatnum[N];
charname[N][19];
for(k=0;k{
for(i=0;iprintf("请输入第%d位参赛选手的成绩:
",k+1);
for(i=0;i{for(j=0;j
{scanf("%f",&a[i][j]);
b[i]=b[i]+a[i][j];}
}
sort(b,M);
num[k]=average(b);
}
printf("\n请输入参赛选手的姓名:
\n");
for(k=0;kscanf("%s",name[k]);
arran(num,name);
printf("\n\n\n参赛选手成绩如下:
\n\n");
for(i=0;iprintf("%10s%.3f分\n\n",name[i],num[i]);
printf("本次比赛选手获奖结果如下:
\n\n");
printf("一等奖:
\n%10s%.3f分\n\n二等奖:
\n",name[0],num[0]);
for(k=1;k<3;k++)
printf("%10s%.3f分",name[k],num[k]);
printf("\n\n三等奖:
\n");
for(k=3;k<5;k++)
printf("%10s%.3f分",name[k],num[k]);
printf("\n");
}
voidsort(floatarray[],intn)
{inti,j,k;floatt;
for(i=0;i{k=i;
for(j=i+1;jif(array[j]k=j;
t=array[k];array[k]=array[i];array[i]=t;
}
}
voidarran(floatnum[],charname[N][19])
{inti,j,max;floattemp1;chartemp2[19];
for(i=0;i{max=i;
for(j=i;j{if(num[max]max=j;
}
temp1=num[i];
strcpy(temp2,name[i]);
num[i]=num[max];
strcpy(name[i],name[max]);
num[max]=temp1;
strcpy(name[max],temp2);}
}
floataverage(floatarray[M])
{voidsort(floatarray[],intn);
inti;floataver,sum;
sort(array,M);
sum=array[1];
for(i=2;isum=sum+array[i];
aver=sum/(M-2);
return(aver);
}
1.本程序共用了3个函数,分别是函数sort、函数average和函数arran,下面分别对他们进行阐述:
①函数sort
voidsort(floatarray[],intn)
{inti,j,k;floatt;
for(i=0;i{k=i;
for(j=i+1;jif(array[j]k=j;
t=array[k];array[k]=array[i];array[i]=t;
}
}
主要用于对每位参赛选手的成绩进行排序,从大到小排列,此函数用了两个for语句for(i=0;i{k=i;
for(j=i+1;jif(array[j]k=j;
t=array[k];array[k]=array[i];array[i]=t;
},
第一个for语句主要用于外层循环即从第一位选手到第八位选手的循环,第二个for语句主要适用于由六位评委产生的那六的分的循环;一个if语句和一个换值语句。
if语句用于数据的比较,如果满足要求,换值语句用于把它们的值交换一下,依次进行下去,从而对每位选手的成绩进行排序。
②函数average
floataverage(floatarray[M])
{voidsort(floatarray[],intn);
inti;floataver,sum;
sort(array,M);
sum=array[1];
for(i=2;isum=sum+array[i];
aver=sum/(M-2);
return(aver);
}
用了一个数组array、调用了sort函数、用了一个for循环语句,调用了sort函数,每位选手产生的六组数据,成绩放在数组中,用for语句循环从而实现对每位选手的分数进行处理,处理时从第二个加到第五个数,然后除以四,从而实现了去掉一个最高分,去掉一个最低分,求剩余评委的平均分,即是每位选手的最终得分,用此函数实现了对分数的处理。
③函数arran
voidarran(floatnum[],charname[N][19])
{inti,j,max;floattemp1;chartemp2[19];
for(i=0;i{max=i;
for(j=i;j{if(num[max]max=j;
}
temp1=num[i];
strcpy(temp2,name[i]);
num[i]=num[max];
strcpy(name[i],name[max]);
num[max]=temp1;
strcpy(name[max],temp2);}
}
主要是用于对每位参赛选手的分数进行排序,其姓名也随之调整。
此函数用了一维数组num和二维数组name、用了两个for语句、一个if语句和复制函数strcpy,两个for语句形成了内外两层循环,if语句用于选手成绩的比较,从大到小进行排序,复制函数strcpy把分数和选手的姓名放在一起,当分数在排序的过程中调整的时候,其姓名也随之进行调整。
2.程序引用了一维数组array、b、num和二维数组name、a。
3.程序使用了三个符号常量#defineN19#defineM17#defineP2,在下面的程序中多次使用这些常数,在调整选手数、评委数和评委打分项数时,需要改动很多处的数据,不仅麻烦而且很容易出错,使用了符号常量后只需改动一项即可,方便、简单。
4.程序还引用了变量n、i、j、k。
5.程序多次使用for循环语句,如
for(i=0;iprintf("请输入第%d位参赛选手的成绩:
",k+1);
用于循环提示输入低k+1位选手的成绩。
程序如下:
#include
#include
#defineN19
main()
{voidsort(floatarray[],intn);
floataverage(floatarray[17]);
voidarran(floatnum[],charname[N][19]);
floatb[17];inti,j,k;
floata[17][2];
floatnum[N];
charname[N][19];
for(k=0;k{
for(i=0;i<17;i++)b[i]=0;
printf("请输入第%d位参赛选手的成绩:
",k+1);
for(i=0;i<17;i++)
{for(j=0;j<2;j++)
{scanf("%f",&a[i][j]);
b[i]=b[i]+a[i][j];}
}
sort(b,17);
num[k]=average(b);
}
printf("请输入参赛选手的姓名:
\n\n\n");
for(k=0;kscanf("%s",name[k]);
arran(num,name);
printf("\n\n\n参赛选手成绩如下:
\n\n");
for(i=0;iprintf("%10s%f分\n\n",name[i],num[i]);
printf("本次比赛选手获奖结果如下:
\n\n");
printf("一等奖:
%10s%f分\n\n二等奖:
\n",name[0],num[0]);
for(k=1;k<3;k++)
printf("%10s%f分",name[k],num[k]);
printf("\n三等奖:
\n\n");
for(k=3;k<5;k++)
printf("%10s%f分",name[k],num[k]);}
voidsort(floatarray[],intn)
{inti,j,k;floatt;
for(i=0;i{k=i;
for(j=i+1;jif(array[j]k=j;
t=array[k];array[k]=array[i];array[i]=t;
}
}
voidarran(floatnum[],charname[N][19])
{inti,j,max;floattemp1;chartemp2[19];
for(i=0;i{max=i;
for(j=i;j{if(num[max]max=j;
}
temp1=num[i];
strcpy(temp2,name[i]);
num[i]=num[max];
strcpy(name[i],name[max]);
num[max]=temp1;
strcpy(name[max],temp2);}
}
floataverage(floatarray[17])
{voidsort(floatarray[],intn);
inti;floataver,sum;
sort(array,17);
sum=array[1];
for(i=2;i<5;i++)
sum=sum+array[i];
aver=sum/13;
return(aver);
}
五.实习体会
一周的课程设计已经结束了。
回想学习C语言的过程中,既有快乐又有烦恼。
从领到书的那一刻,我就很郁闷,《C语言程序设计》到底事学什么的,有什么用。
刚开始上课时,还在迷茫这门课程是用来做什么的。
不过,这些感受都是在对这门课程不了解的情况下产生的。
后来慢慢的接触多了,听老师讲的多了,了解多了,渐渐的产生了兴趣。
尤其是学到语句和函数时,上机操作程序,经过编译,调试和运行后,出现界面,当时觉得很好奇,想真正的学好这门课程。
通过半个学期的学习,我掌握了基本知识。
开始编写修改和删除时,很头疼,去向其他人寻求帮助,在别人的帮助和提示下,我编完了修改程序,但编译时老出错,修改后的内容将文本内的信息全部覆盖了。
困难之时,我们组的其他人,帮助了我,完成了修改和删除。
这样的话,整个程序基本上全部完成了,就剩下完善工作了。
我们组写了两个程序,最后,两个程序相互组合,互补,大功告成
虽然设计时完成了,整个程序完成了,还有很多不完善的地方,希望自己以后办事的时候要认真,仔细,考虑周全。
短短的一周课程设计结束了,但是这段时间里,我又学到了更多C知识,如:
对象数组,string类,文件流等,同时我也被提醒以后办事的时候要认真,仔细,考虑周全。
,也看到了团队精神和互帮互助的重要性。
这一点会让我终生受益。
设计者:
日期:
年月日
设计过程中质疑(或答辩)记载:
首次设计出来的程序初稿,出现了很多的问题,程序不能运行,主要问题如下:
数组的初始化不匹配、大括号加的对数不匹配、位置不对、部分语句不能正常循环、输入程序时中西文标点部分、大小写误输等诸多问题50多处。
以及还有以下问题:
1.警告句。
程序中缺少一些警告句,例如:
“是否真的删除(y/n)?
”。
2.重名的情况。
由于考虑的不周全,没有设计遇到重名的情况该怎么处理。
3.选择单一。
我们设计的程序中,只设计了按名字选择,进行操作,忽略了重名的情况。
指导教师评语:
评分:
签名:
年月日
附录:
参考文献
XX文库
C语言设计(第三版)谭浩强清华大学出版社
C语言设计试题汇编(第二版)
搜搜文献
C语言上机指导
指导教师签名:
2011年9月5日
教研室主任(或责任教师)签名:
2011年月日