C语言选票统计课程设计
《C语言程序设计》课程设计
实习报告
题目:选票统计课程设计
选票统计
这是一个利用计算机实现利用选票对运动员的选拔的选票统计系统,该案例涉及C语言中函数、数组等各方面的知识。
1.题目描述
从100名优秀运动员中评选出10名最佳运动员。具体规则如下。
(1) 运动员号按1、2、3…..顺序编号;
(2)由键盘接受所收到的选票,每张选票至多可写10个不同的编号;
(3)对应名次的运动员编号可以有空缺,但必须用0表示;
(4)若编号超出规定的范围,或编号出现重复,作废选票;
(5)按选票中所列最佳运动员顺序给他们计分,计分标准如下:从第1名至第10名所得分数依次为:15,12,9,7,6,5,4,3,2,1;
(6)按各运动员所得分数高低进行排队,列出前十名最佳运动员排名,格式为:
名次运动员编号合计得分合计得票数
如果得分相同,则得票多者在前,如果得分与票数都相同,则编号小的在前。
2.功能概述
图1 选票统计系统功能模块图
如图1 所示,选票统计系统由3个模块组成。
(1)接收选票。在此系统中,选票可以从键盘上直接输入。选票可以无限次输入,但每张选票只能输入10个数字。接收到的选票传输到检验废票模块。而当要结束投票系统时可输入-1来执行。
(2)检验废票。当选票传输到此模块时,对所得到的选票进行检验,检查一张选票内的号码是否有超出编号范围或者有重复号码。如果有,则这张选票为废票计入。反之,则传输到统计选票模块。
(3)统计选票。当选票传输到此模块时,对所得到的选票进行统计。使相应的运动员的选票数增加,分数也得到相应的增加。另外,当接收完全部选票后,对运动员的分数进行排序。
3.设计思路
此程序为的是实现投票、验票、统票三个过程,属于顺序结
构。顺序结构是程序设计中最基本、最常见的结构。顺序结构始
终按照语句排列的先后顺序从上到下逐条顺序执行。图2为顺序
结构流程图。
由于结构比较简单,所以此系统只需要按照输入选票循环、
检验废票函数、统计选票函数就可以完成。
首先,在主函数之前要先做一些预处理命令,做函数声明。
由于有一些变量作用域需要从开始到程序结束,在这一范围内的
所有函数均需要访问变量,所以要定义全局变量。
图2 顺序结构流程图
(1) 主函数main()
主函数是整个程序的入口,由于使用顺序结构,所以主函数是作为开始和总体控制的重要工具,要调配两个函数的正常运行,才能是程序达到我们所需要的要求。
图3 main 函数执行流程
Main()函数的执行流程如图4所示。进入主函数后首先进入循环输票,通过控制变量k来结束循环。每个投票者输入十个运动员编号,对每张选票上的编号调用check()函数来检查其是否为废票。如果不是废票,则调用count()函数来计票、统票、排序,最后进行输出。
(2)检验废票
这个模块中对每张选票中的运动员编号进行检验。如果编号超出范围,即大于100或小于0,则为废票。另外,如果编号重复也为废票。
图4 Check()函数执行流程
Check()函数的执行流程如图5所示。进入check()函数后对每张选票上的运动员编号进行检查,利用循环检验编号是否超出返回,如果超出则为废票,返回1。反之,返回0。另外,如果编号重复也为废票,返回1,反之,返回0。
(3)统计选票
在这个模块中对每张通过检验的选票进行统计、排序。
Count()函数的执行流程如图6所示。进入count()函数后对每张选票中的运动员编号进行计数,并按照选票中的次序为运动员加上相应的分数,越靠前的运动员加分越多。然后全
部选票投完后,对所有运动员按照得分进行排名,取运动员的得分和其他运动员相比,通过交换信息来实现排序。如果得分相同,则按编号排序。
图5 Count()函数的执行流程
4.源码分析
(1)程序预处理
本系统的运动员得分排序等情况是以表格形式显示,为了方便绘制这些表格,先将表头和表格线做成宏定义,需要打印表格的时候,只要使用printf()函数在适合位置打印这些宏定义即可。在下面的程序中。HEADER2定义了字段名的格式,这样在需要打印输出的时候,只要一条语句printf(HEADER2);就可以打印一行按照规定格式的数据,非常方便。另外,由于需要有变量作用从开始到结束,所以定义全局变量。以及做函数声明。
#include
#define N 100 /*有100个优秀运动员*/
#define HEADER1 "**************************************************\n" #define HEADER2 "| 名次 | 运动员编号 | 合计得分 | 合计得票数 |\n" #define END "********************************************\n"//函数说明int check(void); /*检验选票*/
void count(int ,int); /*统计选票*/
int a[100][3]={0};/*全局定义*/ int vote[10]={0}; /*投票存放数组*/
(2)主函数main()
主函数主要利用循环输入选票,通过控制变量k来结束循环。每个投票者输入十个运动员编号,对每张选票上的编号调用check()函数来检查其是否为废票。如果不是废票,则调用count()函数来计票、统票、排序,最后进行输出。相关代码如下:
void main()
{ int i,j,f,k;
for(i=1;i<=100;i++)/*运动员编号赋值*/
a[i-1][2]=i;for(k=0;k!=1;)/*投票循环*/
{ printf ("please input your choice[0~100]\n");
for(j=0;j<=9;j++)
{ scanf("%d",&vote[j]);
if(vote[j]==-1){k=1;break;}/*接收到"-1"则停止接受投票*/ }f=check(); /*调用检验选票函数,返回控制变量"f"*/ conut(k,f); /*调用统计选票函数*/}
printf("the result is:\n");/*投票结果输出*/printf(HEADER1);
printf(HEADER2);
for(i=0;i<=9;i++)
{ printf("%5d%10d%13d%13d\n",i+1,a[i][2],a[i][0],a[i][1]); }
printf(END);
}
(3)检验废票函数 check()
检验废票函数主要负责对每张选票进行检查,如果选票中的编号超出100或小于0,或者编号重复,则为废票,返回1。反之,不是废票返回0。Check()函数比较简单简短。相关代码如下:
int check() /*检验选票函数*/
{int i,j; for(i=0;i<=9;i++)
{ for(j=i+1;j<=9;j++)
if(vote[i]==vote[j])/*相同票则为废票,返回1*/return 1;
if(vote[i]<0||vote[i]>100)/*超出范围票作废票,返回1*/return 1;
}return 0; /*不是废票则返回0*/
}
(4) 统计选票函数count()
统计选票函数主要负责对通过检验的选票进行计数,排序等。按照选票上的运动员编号增加相应运动员的票数,并按分数要求,按选票上运动员编号的次序为相应运动员加上相应的分数。如果投票结束,则再根据运动员的分数,对运动员进行排序,如果分数相同则按编号大小排序。相关代码如下:
void conut(int x,int y) /*统计选票函数函数*/
{ int i,j;int t,k;
if( y==0) /*根据检验选皮函数返回值决定此票是否需要计入*/
{ for(i=0;i<10;i++)
{ k=vote[i] ;
if(vote[i]==0) continue;
else//如果不是废票则计入
{ a[k-1][1]++; //票数加1
if(i==0) a[k-1][0]=a[k-1][0]+15; //按照选票次序得分加上相应分数
if(i==1) a[k-1][0]=a[k-1][0]+12;
if(i==2) a[k-1][0]=a[k][0]+9;
if(i==3) a[k-1][0]=a[k-1][0]+7;
if(i==4) a[k-1][0]=a[k-1][0]+6;
if(i==5) a[k-1][0]=a[k-1][0]+5;
if(i==6) a[k-1][0]=a[k-1][0]+4;
if(i==7) a[k-1][0]=a[k-1][0]+3;
if(i==8) a[k-1][0]=a[k-1][0]+2;
if(i==9) a[k-1][0]=a[k-1][0]+1;
}
}
}if(x==1)/*根据投票结束控制变量决定是否需要给结果进行排序*/
{ for(j=0;j<10;j++) //进行排序for(i=j+1;i<100;i++) {if(a[j][0] { t=a[j][1];//交换运动员票数a[j][1]=a[i][1]; a[i][1]=t; t=a[j][0];//交换运动分数a[j][0]=a[i][0]; a[i][0]=t; t=a[j][2];//交换运动员编号a[j][2]=a[i][2]; a[i][2]=t;