莫问流年 发表于 2014-5-8 20:27:20

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 19:32:29

本帖最后由 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语言了,所以就当练练手。楼主帮你修改好了,你原来里面没有判断相同票数的功能。
而且我这代码还可以再优化呢, 这编程 还真是不能太长时间不写, 要不然真的会生疏的

jonng 发表于 2014-5-9 21:45:28

楼主还可以再加点功能如:相同票数再投票;还有输入错误名字提示修改或者弃票。这样就更完善了。:loveliness:

莫问流年 发表于 2014-5-10 10:52:36

谢谢啊,我是新手,编个小程序都这么爱出错

莫问流年 发表于 2014-5-10 17:49:22

jonng 发表于 2014-5-9 21:45 static/image/common/back.gif
楼主还可以再加点功能如:相同票数再投票;还有输入错误名字提示修改或者弃票。这样就更完善了。:lovelines ...

为什么程序里面的if-else if-else总是执行else部分,是因为名字后面回车的原因吗?

jonng 发表于 2014-5-10 20:51:24

莫问流年 发表于 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调式一下,看就可以看到他是怎么运行的。

莫问流年 发表于 2014-5-10 20:57:02

不管怎么投票,我的运行结果总是10个人弃权,孙悟空获胜。不知道怎么回事呢。以前用的codeblocks调试,前天换成VS2013还不太会调试

莫问流年 发表于 2014-5-10 22:04:59

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:10:58

本帖最后由 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:25:34

本帖最后由 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]
查看完整版本: C语言投票系统作业,为什么不能达到预期的效果啊