目录课程设计评语...................................................................................................... 错误!未定义书签。
目录. (1)1.课程论文题目 (2)2.程序设计思路 (2)3.功能模块图 (3)4.数据结构设计 (3)5.算法设计 (3)6.程序代码 (7)7.程序运行结果 (11)8.编程中遇到的困难及解决方法 (12)9.总结心得及良好建议 (12)10.致谢 (12)1.课程论文题目投票程序[要求]设有代号为‘a’,‘b’,‘c’的三个足球先生候选人,根据投票者在选票上对他们编号的填写顺序分别记分5,3,2。
请编程从键盘上输入投票人数及投票结果,统计他们的得分,并输出哪位当选足球先生。
注意:若同一张票上写有两个相同的代号,则显示“此票无效”,若最终前两名得分相同应显示“重新投票”,否则显示三位候选人得分并输入“祝贺X当选冠军”。
例如:投票人数:5请参加投票的人开始投票:abccabcaa 此票无效cbabca三位候选人得分:a:12b:13c:15祝贺c当选冠军[提示]数据结构可用结构体数组,结构体成员包括代号、得分。
或者采用二维数组,行方向对应一张投票,列方向对应各候选人得分。
2.程序设计思路根据题目要求,首先要输入投票者人数,再输入投票者的选票,而选票不是都有效,若同一张票上写有两个相同的代号,则此票无效,所以要将有效的选票选出来,然后对选票进行统计得分,最终来比较得分,若有得分相同,则重新来选,最后得分最多的获胜,最终成为足球先生。
但是此程序还不够完善,可以增加以下程序,增强其功能:1.记录废票数目,以便废票太多,影响选举公正。
2.若出现a,b,c以外的投票,应当将该票记为无效。
3.若出现最终前两名得分相同,应该还可以运行程序,使其重新投票,重新计票,直至最后选出足球先生。
3.功能模块图输入选票信息:输入对足球先生候选人的选票输出结果:输出最后足球先生的获得者统计选票:对选票进行统计4.数据结构设计要输入投票人数,将其定义为re,选票信息可以用一个p[100][3]的数组来存放,re来控制投票信息数组的行数。
最开始定义一个全局变量m=3,来表示候选者人数。
这样来控制数列数,达到控制输入的目的。
每输入一行,就开始判断是否一张票上写有两个相同代号,或者是出现‘a’,‘b’,‘c’以外的投票结果,如果出现这种情况,就将票作废,并记录作废票数。
定义变量v记录作废票数。
判断完毕后,若出现废票,就将其中的票府赋值为‘0’。
返回投票人数re,留到后续函数使用。
5.算法设计1、主函数:主函数只提供输入、处理和输出部分函数调用:【程序】#include<stdio.h>#include<math.h>int start(char p[][3]); /****输入函数****/void count(int a,char p[][3],int pp[]); /***统计函数***/int result(int a,int b,int c); /***输出函数***/int m; /*****全局变量*****/void main() /*****主函数*****/{int a;m=3;int pp[3]={0,0,0};do{char p[100][3]={{0}};/******p[100][3]赋初值,清空******/a=start(p);count(a,p,pp);/******计算得分******/}while(result(pp[0],pp[1],pp[2]));/*****若m=2循环,直至选出足球先生*****/}2、各功能模块设计(1)输入模块【分析】要输入投票人数,将其定义为re,选票信息可以用一个p[100][3]的数组来存放,re来控制投票信息数组的行数。
最开始定义一个全局变量m=3,来表示候选者人数。
这样来控制数列数,达到控制输入的目的。
每输入一行,就开始判断是否一张票上写有两个相同代号,或者是出现‘a’,‘b’,‘c’以外的投票结果,如果出现这种情况,就将票作废,并记录作废票数。
定义变量v记录作废票数。
判断完毕后,若出现废票,就将其中的票府赋值为‘0’。
返回投票人数re,留到后续函数使用。
【程序】int start(char p[][3]){int re,i,j,v=0;printf("请输入投票人数\n");scanf("%d",&re);/******a为投票人数******/printf("请参加投票的人开始投票\n");getchar();/******输入时以回车结束******/for(i=0;i<re;i++){int flag=0;for(j=0;j<m;j++)scanf("%c",&p[i][j]);getchar();/******输入选举投票******/if(p[i][0]==p[i][1]||p[i][1]==p[i][2]||p[i][0]==p[i][2])flag=1;/******判断一张票上是否写有两个相同代号******/for(j=0;j<m;j++){if(p[i][j]!='a'&&p[i][j]!='b'&&p[i][j]!='c')flag=1;}/******判断是否有a,b,c以外的字母******/if(flag){printf("此票无效\n");v++;for(j=0;j<m;j++)p[i][j]=0;}/******若有以上情况,显示"此票无效",忽略此票,并记录废票数******/}printf("作废票数是%d票\n",v);return re;}(2)统计模块【分析】功能上要求分别统计a,b,c三个人的得分,因而用x,y,z来存放,每一票中分别统计得分,根据投票者在选票上对他们编号的填写顺序分别记分5,3,2,将如果出现废票,直接跳过不计,将最后结果分别放入x,y,z.。
引用主函数中的数组pp[3],将统计的x,y,z分别赋值到pp[0],pp[1],pp[2]中,这样就可以带回主函数中。
【程序】void count(int a,char p[][3],int pp[]){int b=a,i;int x=0,y=0,z=0;/******'a','b','c'分别代表三个候选人x y z分别是他们的得分******/for(i=0;i<a;i++){if(p[i][0]=='a')else if(p[i][1]=='a')x+=3;else if(p[i][2]=='a')x+=2;if(p[i][0]=='b')y+=5;else if(p[i][1]=='b')y+=3;else if(p[i][2]=='b')y+=2;if(p[i][0]=='c')z+=5;else if(p[i][1]=='c')z+=3;else if(p[i][2]=='c')z+=2;if(p[i][0]=='0')continue;}pp[0]=x;pp[1]=y;pp[2]=z;}(3)输出模块【分析】功能上要求比较三位候选人的最后得分,三人得分分别为x,y,z。
定义max,将最高分赋值到max中。
只有一位最高分时,输出三位候选人得分,显示“祝贺某人当选冠军”。
如果有两位最高分,则显示“请重新投票”,接着,令m=2,改变全局变量,只剩下两位候选者,显示三位候选人得分,重新投票统计。
如果两位候选人分数还相同,则再次循环,若不同,则显示两人得分,并显示“祝贺某人当选冠军”。
【程序】int result(int a,int b,int c){int x,y,z,max=0,s=0,l=0;char k;x=a;y=b;z=c;max=x;k='a';if(max<y)max=y;k='b';}if(max<z){max=z;k='c';}if(max==x&&max==y||max==x&&max==z||max==y&&max==z){printf("请重新投票\n");/******若最高票数有两人相同,提示重新投票******/l=1;}if(m==3)printf("三位候选人得分:\n");elseprintf("两位候选人得分:\n");if(l)m=2;if(x>0)printf("a:%d\n",x);if(y>0)printf("b:%d\n",y);if(z>0)printf("c:%d\n",z);if(!l)printf("祝贺%c当选冠军\n",k);/******输出最后结果******/return l;}如果l返回主程序,若l为真值,则代表最后两位候选人分数还相同,主程序的do,while 循环,可以再次统计票数,再次比较得分,直到选出最后的足球先生。
6.程序代码#include<stdio.h>#include<math.h>int start(char p[][3]);void count(int a,char p[][3],int pp[]);int result(int a,int b,int c);int m;void main(){int a;m=3;int pp[3]={0,0,0};do{char p[100][3]={{0}};/******p[100][3]赋初值,清空******/a=start(p);count(a,p,pp);/******计算得分******/}while(result(pp[0],pp[1],pp[2]));}int start(char p[][3]){int re,i,j,v=0;printf("请输入投票人数\n");scanf("%d",&re);/******a为投票人数******/printf("请参加投票的人开始投票\n");getchar();/******输入时以回车结束******/for(i=0;i<re;i++){int flag=0;for(j=0;j<m;j++)scanf("%c",&p[i][j]);getchar();/******输入选举投票******/if(p[i][0]==p[i][1]||p[i][1]==p[i][2]||p[i][0]==p[i][2])flag=1;/******判断一张票上是否写有两个相同代号******/ for(j=0;j<m;j++){if(p[i][j]!='a'&&p[i][j]!='b'&&p[i][j]!='c')flag=1;/******判断是否有a,b,c以外的字母******/if(flag){printf("此票无效\n");v++;for(j=0;j<m;j++)p[i][j]=0;}/******若有以上情况,显示“此票无效”,忽略此票,并记录废票数******/ }printf("作废票数是%d票\n",v);return re;}void count(int a,char p[][3],int pp[]){int b=a,i;int x=0,y=0,z=0;/******'a','b','c'分别代表三个候选人x y z分别是他们的得分******/for(i=0;i<a;i++){if(p[i][0]=='a')x+=5;else if(p[i][1]=='a')x+=3;else if(p[i][2]=='a')x+=2;if(p[i][0]=='b')y+=5;else if(p[i][1]=='b')y+=3;else if(p[i][2]=='b')y+=2;if(p[i][0]=='c')z+=5;else if(p[i][1]=='c')z+=3;else if(p[i][2]=='c')z+=2;if(p[i][0]=='0')continue;}pp[0]=x;pp[1]=y;pp[2]=z;}int result(int a,int b,int c){int x,y,z,max=0,s=0,l=0;char k;x=a;y=b;z=c;max=x;k='a';if(max<y){max=y;k='b';}if(max<z){max=z;k='c';}if(max==x&&max==y||max==x&&max==z||max==y&&max==z) {printf("请重新投票\n");/******若最高票数有两人相同,提示重新投票******/l=1;}if(m==3)printf("三位候选人得分:\n");elseprintf("两位候选人得分:\n");if(l)m=2;if(x>0)printf("a:%d\n",x);if(y>0)printf("b:%d\n",y);if(z>0)printf("c:%d\n",z);if(!l)printf("祝贺%c当选冠军\n",k);/******输出最后结果******/return l;}7.程序运行结果1、主函数运行,输入选票信息3、统计选票,输出结果8.编程中遇到的困难及解决方法在编程的过程中,很容易出现一个问题,就时少大括号“}”的问题。