C语言投票系统作业,为什么不能达到预期的效果啊
本帖最后由 莫问流年 于 2014-5-8 20:29 编辑#include <stdio.h>
#include <string.h>
#define VOTERS 10
struct candidate
{
char name;
}cand[] = { { "刘德华" }, { "张国立" }, { "张三丰" }, { "孙悟空" } };
int max(int a, int b, int c, int d);
void main()
{
int i, a = 0, b = 0, c = 0, d = 0, e = 0;
char votes;
printf("*************欢迎进入良好公民评选投票系统**************\n");
printf("候选人有:刘德华,张国立,张三丰,孙悟空\n");
for (i = 1; i <= VOTERS; i++)
{
printf("第 %d 人投票,请写下你支持的候选人名字: ", i);
scanf_s("%s", votes);
if (!strcmp(votes, cand.name))
{
a++;
}
else if (!strcmp(votes, cand.name))
{
b++;
}
else if (!strcmp(votes, cand.name))
{
c++;
}
else if (!strcmp(votes, cand.name))
{
d++;
}
else
{
e++;
}
fflush(stdin);//votes = 0;
}
printf("共%d人参与投票,其中%d人因投票有误视为弃权,投票的最终结果为:\n", VOTERS, e);
printf("刘德华同学的得票数为:\t%d\n", a);
printf("张国立同学的得票数为:\t%d\n", b);
printf("张三丰同学的得票数为:\t%d\n", c);
printf("孙悟空同学的得票数为:\t%d\n", d);
if (max(a, b, c, d) == a)
{
printf("\n本次投票的获胜者是:\t%s", cand.name);
}
else if (max(a, b, c, d) == b)
{
printf("\n本次投票的获胜者是:\t%s", cand.name);
}
else if (max(a, b, c, d) == c)
{
printf("\n本次投票的获胜者是:\t%s", cand.name);
}
else
{
printf("\n本次投票的获胜者是:\t%s", cand.name);
}
}
int max(int a, int b, int c, int d)
{
int max1, max2, max;
max1 = (a>b) ? a : b;
max2 = (c>d) ? c : d;
max = (max1>max2) ? max1 : max2;
return max;
}
本帖最后由 jonng 于 2014-5-9 21:42 编辑
#include "stdafx.h"
#include <string.h>
#define VOTERS 10
int max();
int too();
struct candidate
{ char name;
int no;
}cand[]={{"刘德华",0} , {"张国立",0} ,{"张三丰",0} ,{"孙悟空",0} };
int main(int argc, char* argv[])
{ int i,j,k=0,e=0;
char name;
for(i=0;i<VOTERS;i++)
{ printf("第 %d 人投票,请写下你支持的候选人名字: ", i+1);
scanf("%s",name);
if (!strcmp(name, cand.name))
cand.no++;
else if(!strcmp(name, cand.name))
cand.no++;
else if(!strcmp(name, cand.name))
cand.no++;
else if(!strcmp(name, cand.name))
cand.no++;
else
e++;
}
printf("共%d人参与投票,其中%d人因投票有误视为弃权,投票的最终结果为:\n", VOTERS, e);
for(i=0;i<4;i++)
{ printf("%s同学的得票数为:\t%d\n",cand.name,cand.no);
}
k=too();//返回相同票数的后一位。
i=max();//求最大票数
if(k!=0)
{ printf("本次投票出现2个或以上票数相同:\n");
for(j=0;j<4;j++)
{if(cand.no==i)
printf("相同票数:\t%s\n",cand.name);
}
}
else
{ for(j=0;j<4;j++)
{ if(cand.no==i)
printf("\n本次投票的获胜者是:%s\n", cand.name);
}
}
return 0;
}
int too()
{ int i,j,k=0;
for(i=0;i<4;i++)//判断是否有同票数。
{ for(j=i+1;j<4;j++)
if(cand.no==cand.no)
k=j;
}
return k;
}
int max()
{
int i,max1;
for(i=0;i<4;i++)//判断最高票
{if(max1<cand.no)
max1=cand.no;
}
return max1;
}
本来是不想写的,但由于太久没写C语言了,所以就当练练手。楼主帮你修改好了,你原来里面没有判断相同票数的功能。
而且我这代码还可以再优化呢, 这编程 还真是不能太长时间不写, 要不然真的会生疏的
楼主还可以再加点功能如:相同票数再投票;还有输入错误名字提示修改或者弃票。这样就更完善了。:loveliness: 谢谢啊,我是新手,编个小程序都这么爱出错 jonng 发表于 2014-5-9 21:45 static/image/common/back.gif
楼主还可以再加点功能如:相同票数再投票;还有输入错误名字提示修改或者弃票。这样就更完善了。:lovelines ...
为什么程序里面的if-else if-else总是执行else部分,是因为名字后面回车的原因吗? 莫问流年 发表于 2014-5-10 17:49 static/image/common/back.gif
为什么程序里面的if-else if-else总是执行else部分,是因为名字后面回车的原因吗?
16. if (!strcmp(name, cand.name)) //如果name 等于 刘德华
17. cand.no++; //刘德华加1;
18. else if(!strcmp(name, cand.name))//如果name 等于 张国立
19.cand.no++; // 张国立加1
20. else if(!strcmp(name, cand.name)) //如果name 等于 张三丰
21.cand.no++; //张三丰加1
22. else if(!strcmp(name, cand.name))// 如果name 等于 孙悟空
23.cand.no++;//孙悟空加1
24. else
25.e++; // 都不相等e加1
这个地方,每一次,只会执行一个++;看注解。
如输入:刘德华 孙悟空,张三丰 张国立
第1次判断:刘德华
第1条判断成立 刘德华加1;从第18行到25行的代码不用运行。
第2次判断: 孙悟空
第1个条件不成立,进入第2个条件也不成立,进入第3个条件也不成立,进入第4个条件成立 孙悟空加1;
第3次判断:张三丰,
第1条件不成立,理入第2介条件也不成立,进入第3个条件 成立,张三丰加1从第22到25行代码不用运行。
第4次判断: 张国立
第1个条件不成立,进入第2个条件 成立, 张国立加1, 从20行到25行的代码不用运行。
如果再不懂,用VC6.0调式一下,看就可以看到他是怎么运行的。
不管怎么投票,我的运行结果总是10个人弃权,孙悟空获胜。不知道怎么回事呢。以前用的codeblocks调试,前天换成VS2013还不太会调试 jonng 发表于 2014-5-10 20:51 static/image/common/back.gif
16. if (!strcmp(name, cand.name)) //如果name 等于 刘德华
17. cand.no++; ...
不管怎么投票,我的运行结果总是10个人弃权,孙悟空获胜。不知道怎么回事呢。以前用的codeblocks调试,前天换成VS2013还不太会调试 本帖最后由 jonng 于 2014-5-10 22:13 编辑
莫问流年 发表于 2014-5-10 22:04 static/image/common/back.gif
不管怎么投票,我的运行结果总是10个人弃权,孙悟空获胜。不知道怎么回事呢。以前用的codeblocks调试,前 ...
#include "stdafx.h"
#include <string.h>
#define VOTERS 10
int max();
int too();
struct candidate
{ char name;
int no;
}cand[]={{"刘德华",0} , {"张国立",0} ,{"张三丰",0} ,{"孙悟空",0} };
int main(int argc, char* argv[])
{ int i,j,k=0,e=0;
char name;
for(i=0;i<VOTERS;i++)
{ printf("第 %d 人投票,请写下你支持的候选人名字: ", i+1);
scanf("%s",name);
if (!strcmp(name, cand.name))
cand.no++;
else if(!strcmp(name, cand.name))
cand.no++;
else if(!strcmp(name, cand.name))
cand.no++;
else if(!strcmp(name, cand.name))
cand.no++;
else
e++;
}
printf("共%d人参与投票,其中%d人因投票有误视为弃权,投票的最终结果为:\n", VOTERS, e);
for(i=0;i<4;i++)
{ printf("%s同学的得票数为:\t%d\n",cand.name,cand.no);
}
k=too();//返回相同票数的后一位。
i=max();//求最大票数
if(k!=0)
{ printf("本次投票出现2个或以上票数相同:\n");
for(j=0;j<4;j++)
{if(cand.no==i)
printf("相同票数:\t%s\n",cand.name);
}
}
else if(i!=0) //这个地方修改成:if(e!=10),应该会更好点
{ for(j=0;j<4;j++)
{ if(cand.no==i)
printf("\n本次投票的获胜者是:%s\n", cand.name);
}
}
return 0;
}
int too()
{ int i,j,k=0;
for(i=0;i<4;i++)//判断是否有同票数。
{ for(j=i+1;j<4;j++)
if(cand.no==cand.no&&cand.no!=0&&cand.no!=0)
k=j;
}
return k;
}
int max()
{
int i,max1;
for(i=0;i<4;i++)//判断最高票
{if(max1<cand.no)
max1=cand.no;
}
return max1;
} 本帖最后由 jonng 于 2014-5-10 22:26 编辑
int too()
{ int i,j,k=0;
for(i=0;i<4;i++)//判断是否有同票数。
{ if(cand.no!=0)
break;
else
for(j=i+1;j<4;j++)
if(cand.no==cand.no)
k=j;
}
return k;
}
这样效率比上面那个要好,这个我没有编译测试。
页:
[1]