c程序评分系统

  • 格式:doc
  • 大小:807.08 KB
  • 文档页数:16

《程序设计基础(C)》课程设计报告评分系统学生姓名学号班级指导教师日期兰州交通大学新能源与动力工程学院评分一、设计目的1、通过本项课程设计,可以培养独立思考、综合运用所学有关相应知识的能力,能更好的巩固《C语言程序设计》课程学习的内容,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!更加了解了c语言的好处和其可用性!同时增加了同学之间的团队合作精神!更加也体会到以后在工作中团队合作的重要性和必要性!2、通过C语言课程设计,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。

为后续各门计算机课程的学习和毕业设计打下坚实基础。

二、设计要求1、评委给每个演讲者评分——输入。

2、输入每位选手的姓名、成绩并有相应的提示语;3、对每一位选手的成绩进行处理(去掉一个最高分,去掉一个最低分,剩余评委的平均分,为防止重分现象平均分取小数点后两位);4、对8位选手的成绩进行排序评名次,并且分出一、二、三等奖分别1、2、2个名额;5、评分结果浏览功能(每位选手的姓名、成绩、名次、一、二、三等奖及所有选手成绩的排序)——输出;6、查询或排序功能。

三、总体设计1.主程序的流程程序先通过宏定义符号常量N(选手数),M(评委数),P(评分选项数)的值分别为8,6,2.这样不仅简单不易出错,而且便于常量的更改,只需改变#include命令行就可以一改全改。

接着定义了评委评分,选手得分和选手姓名的数组以便最终将选手最后得分与姓名对应。

进入程序主体,要想将比赛结果完整的输出,我们必须要让程序在将评委得分与选手姓名输入时自动计算出选手最终得分以及实现名次排序与姓名的一一对应。

为了实现8位选手得分的正确录入,先用for循环嵌套通过评委数量与选手数量控制评分项的完整输入,再用scanf语句对应二维数组a[]使评分与选手结合,在k=N时跳出循环,至此评分录入完毕。

评分录入后还得计算出选手最终得分。

为了去掉一个最高分,一个最低分,程序调用自编函数sort将评分按大小排序,接着调用average 函数去除一个最高分与最低分算出选手最终得分。

最后将选手得分排序。

公布获奖结果时还必须出现选手的姓名。

接着再用一个for循环通过k控制姓名数量,通过scanf函数实现选手姓名的录入,在k<N 是跳出循环,至此选手姓名录入结束。

最终的获奖名次必须与选手姓名一一对应。

调用自编函数arran,通过一维数组num[]与二维数组name[][]将上面的评分与选手姓名一一对应。

最后程序用printf函数和for循环将最后的比赛名次与获奖选手姓名一一对应的完整输出,程序到此结束。

2.程序流程图开 始8=>N6=>M2=>P0=>P0=>ib[i]=0输出第K+1位选手的成绩i+1=>ii<M0=>i0=>j输入a[i][j]b[i]+0[i][j]=>b[i]j < pY YSort(b,m)average[b]=>num[k]i<M输出“请输出选手的姓名\n ”“0=>k输入name[k]i<Narray(num,name)输出“\n\n\n 选手成绩如下\n\n ”0=>i输出name[i]num[i]i<NYY Nr NN输出“选手获奖情况如下\n\n”输出“一等奖”及”name[0]num[0]”输出“二等奖”1=>k输出“name[k],num[k]”k<3输出“三等奖”3=> k输出“name[k],num[k]”K<5结束NYNN Y四、详细设计1.本程序共用了3个函数,分别是函数sort、函数average和函数arran,下面分别对他们进行阐述:①函数sortvoid sort(float array[],int n ){int i,j,k;float t;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(array[j]<array[k])k=j;t=array[k];array[k]=array[i];array[i]=t;}}主要用于对每位参赛选手的成绩进行排序,从大到小排列,此函数用了两个for语句for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(array[j]<array[k])k=j;t=array[k];array[k]=array[i];array[i]=t;},第一个for语句主要用于外层循环即从第一位选手到第八位选手的循环,第二个for语句主要适用于由六位评委产生的那六的分的循环;一个if语句和一个换值语句。

if语句用于数据的比较,如果满足要求,换值语句用于把它们的值交换一下,依次进行下去,从而对每位选手的成绩进行排序。

②函数averagefloat average(float array[M]){void sort(float array[],int n );int i;float aver,sum;sort(array,M);sum=array[1];for(i=2;i<M-1;i++)sum=sum+array[i];aver=sum/(M-2);return(aver);}用了一个数组array、调用了sort函数、用了一个for循环语句,调用了sort函数,每位选手产生的六组数据,成绩放在数组中,用for语句循环从而实现对每位选手的分数进行处理,处理时从第二个加到第五个数,然后除以四,从而实现了去掉一个最高分,去掉一个最低分,求剩余评委的平均分,即是每位选手的最终得分,用此函数实现了对分数的处理。

③函数arranvoid arran(float num[],char name[N][8]){int i,j,max;float temp1;char temp2[8];for(i=0;i<N;i++){max=i;for(j=i;j<N;j++){if(num[max]<num[j])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.程序使用了三个符号常量 #define N 8 #define M 6 #define P 2 ,在下面的程序中多次使用这些常数,在调整选手数、评委数和评委打分项数时,需要改动很多处的数据,不仅麻烦而且很容易出错,使用了符号常量后只需改动一项即可,方便、简单。

4.程序还引用了变量n、i、j、k。

5.程序多次使用for循环语句,如for(i=0;i<M;i++) b[i]=0;printf("请输入第%d位参赛选手的成绩:",k+1);用于循环提示输入低k+1位选手的成绩。

五、源程序清单#include<stdio.h>#include<string.h>#define N 8main(){void sort(float array[],int n);float average(float array[6]);void arran(float num[],char name[N][8]);float b[6];int i,j,k;float a[6][2];float num[N];char name[N][8];for (k=0;k<N;k++){for(i=0;i<6;i++) b[i]=0;printf("请输入第%d位参赛选手的成绩:",k+1); for (i=0;i<6;i++){for(j=0;j<2;j++){scanf("%f",&a[i][j]);b[i]=b[i]+a[i][j];}}sort(b,6);num[k]=average(b);}printf("请输入参赛选手的姓名:\n\n\n");for(k=0;k<N;k++)scanf("%s",name[k]);arran(num,name);printf("\n\n\n参赛选手成绩如下:\n\n");for(i=0;i<N;i++)printf("%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]);}void sort(float array[],int n ){int i,j,k;float t;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(array[j]<array[k])k=j;t=array[k];array[k]=array[i];array[i]=t;}}void arran(float num[],char name[N][8]){int i,j,max;float temp1;char temp2[8];for(i=0;i<N;i++){max=i;for(j=i;j<N;j++){if(num[max]<num[j])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);}}float average(float array[6]){void sort(float array[],int n );int i;float aver,sum;sort(array,6);sum=array[1];for(i=2;i<5;i++)sum=sum+array[i];aver=sum/4;return(aver);}附:运行程序使用说明:运行程序时,当提示:请输入第k+1位选手的成绩时,输入12个小于等于50的数,数与数之间用空格键隔开,每输入12个数据后按下回车键,将进行下一位选手成绩的输入,依次下去,当输完八位参赛选手的成绩后,按下回车键,系统将提示输入参赛选手的姓名,此时从键盘上输入八位参赛选手的姓名(vc++ 6.0支持输汉字的功能),姓名与姓名之间同样用空格键隔开,输完姓名后,按下回车键,将出现运行结果。