鱼C论坛

 找回密码
 立即注册
查看: 2584|回复: 9

C语言投票系统作业,为什么不能达到预期的效果啊

[复制链接]
发表于 2014-5-8 20:27:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 莫问流年 于 2014-5-8 20:29 编辑

#include <stdio.h>
#include <string.h>
#define VOTERS 10
struct candidate
{
char name[30];
}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[30];
printf("*************欢迎进入良好公民评选投票系统**************\n");
printf("候选人有:刘德华,张国立,张三丰,孙悟空\n");
for (i = 1; i <= VOTERS; i++)
{
  printf("第 %d 人投票,请写下你支持的候选人名字: ", i);
  scanf_s("%s", votes);
  if (!strcmp(votes, cand[0].name))
  {
   a++;
  }
  else if (!strcmp(votes, cand[1].name))
  {
   b++;
  }
  else if (!strcmp(votes, cand[2].name))
  {
   c++;
  }
  else if (!strcmp(votes, cand[3].name))
  {
   d++;
  }
  else
  {
   e++;
  }
  fflush(stdin);//votes[0] = 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[0].name);
}
else if (max(a, b, c, d) == b)
{
  printf("\n本次投票的获胜者是:\t%s", cand[1].name);
}
else if (max(a, b, c, d) == c)
{
  printf("\n本次投票的获胜者是:\t%s", cand[2].name);
}
else
{
  printf("\n本次投票的获胜者是:\t%s", cand[3].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;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-5-9 19:32:29 | 显示全部楼层
本帖最后由 jonng 于 2014-5-9 21:42 编辑
  1. #include "stdafx.h"
  2. #include <string.h>
  3. #define VOTERS 10
  4. int max();
  5. int too();
  6. struct candidate
  7. { char name[10];
  8.   int no;
  9. }cand[]={{"刘德华",0} , {"张国立",0} ,  {"张三丰",0} ,  {"孙悟空",0} };  
  10. int main(int argc, char* argv[])
  11. { int i,j,k=0,e=0;
  12. char name[10];
  13. for(i=0;i<VOTERS;i++)
  14. { printf("第 %d 人投票,请写下你支持的候选人名字: ", i+1);
  15.    scanf("%s",name);
  16.     if (!strcmp(name, cand[0].name))
  17.           cand[0].no++;
  18. else if(!strcmp(name, cand[1].name))
  19.   cand[1].no++;
  20. else if(!strcmp(name, cand[2].name))
  21.   cand[2].no++;
  22. else if(!strcmp(name, cand[3].name))
  23.   cand[3].no++;
  24. else
  25.   e++;
  26. }
  27. printf("共%d人参与投票,其中%d人因投票有误视为弃权,投票的最终结果为:\n", VOTERS, e);
  28. for(i=0;i<4;i++)
  29. { printf("%s同学的得票数为:\t%d\n",cand.name,cand.no);
  30. }
  31.    k=too();//返回相同票数的后一位。
  32.    i=max();//求最大票数
  33.    if(k!=0)
  34.    {   printf("本次投票出现2个或以上票数相同:\n");
  35.       for(j=0;j<4;j++)
  36.    {  if(cand[j].no==i)
  37.     printf("相同票数:\t%s\n",cand[j].name);
  38.    }
  39.    }
  40.    else
  41.    { for(j=0;j<4;j++)
  42.    {    if(cand[j].no==i)
  43.           printf("\n本次投票的获胜者是:%s\n", cand[j].name);
  44.    }
  45.    }
  46. return 0;
  47. }
  48. int too()
  49. { int i,j,k=0;
  50. for(i=0;i<4;i++)//判断是否有同票数。
  51.   { for(j=i+1;j<4;j++)
  52.     if(cand.no==cand[j].no)
  53.                  k=j;
  54.   }
  55. return k;
  56. }
  57. int max()
  58. {
  59. int i,max1;
  60. for(i=0;i<4;i++)//判断最高票
  61. {  if(max1<cand.no)
  62.         max1=cand.no;
  63. }
  64. return max1;
  65. }
复制代码

本来是不想写的,但由于太久没写C语言了,所以就当练练手。楼主帮你修改好了,你原来里面没有判断相同票数的功能。
而且我这代码还可以再优化呢, 这编程 还真是不能太长时间不写, 要不然真的会生疏的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-9 21:45:28 | 显示全部楼层
楼主还可以再加点功能如:相同票数再投票;还有输入错误名字提示修改或者弃票。这样就更完善了。:loveliness:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-10 10:52:36 | 显示全部楼层
谢谢啊,我是新手,编个小程序都这么爱出错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-10 17:49:22 | 显示全部楼层

为什么程序里面的if-else if-else总是执行else部分,是因为名字后面回车的原因吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-10 20:51:24 | 显示全部楼层
莫问流年 发表于 2014-5-10 17:49
为什么程序里面的if-else if-else总是执行else部分,是因为名字后面回车的原因吗?

16.   if (!strcmp(name, cand[0].name)) //如果name 等于 刘德华   

17.          cand[0].no++;      //刘德华加1;

18. else if(!strcmp(name, cand[1].name))  //如果name 等于 张国立

19.  cand[1].no++; // 张国立加1

20. else if(!strcmp(name, cand[2].name)) //如果name 等于 张三丰

21.  cand[2].no++;   //张三丰加1

22. else if(!strcmp(name, cand[3].name))// 如果name 等于 孙悟空

23.  cand[3].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调式一下,看就可以看到他是怎么运行的。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-10 20:57:02 | 显示全部楼层
不管怎么投票,我的运行结果总是10个人弃权,孙悟空获胜。不知道怎么回事呢。以前用的codeblocks调试,前天换成VS2013还不太会调试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-10 22:04:59 | 显示全部楼层
jonng 发表于 2014-5-10 20:51
16.   if (!strcmp(name, cand[0].name)) //如果name 等于 刘德华   

17.          cand[0].no++;    ...

不管怎么投票,我的运行结果总是10个人弃权,孙悟空获胜。不知道怎么回事呢。以前用的codeblocks调试,前天换成VS2013还不太会调试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-10 22:10:58 | 显示全部楼层
本帖最后由 jonng 于 2014-5-10 22:13 编辑
莫问流年 发表于 2014-5-10 22:04
不管怎么投票,我的运行结果总是10个人弃权,孙悟空获胜。不知道怎么回事呢。以前用的codeblocks调试,前 ...
  1. #include "stdafx.h"
  2. #include <string.h>
  3. #define VOTERS 10
  4. int max();
  5. int too();
  6. struct candidate
  7. { char name[10];
  8.   int no;
  9. }cand[]={{"刘德华",0} , {"张国立",0} ,  {"张三丰",0} ,  {"孙悟空",0} };  
  10. int main(int argc, char* argv[])
  11. { int i,j,k=0,e=0;
  12. char name[10];
  13. for(i=0;i<VOTERS;i++)
  14. { printf("第 %d 人投票,请写下你支持的候选人名字: ", i+1);
  15.    scanf("%s",name);
  16.     if (!strcmp(name, cand[0].name))
  17.           cand[0].no++;
  18.         else if(!strcmp(name, cand[1].name))
  19.          cand[1].no++;
  20.         else if(!strcmp(name, cand[2].name))
  21.          cand[2].no++;
  22.         else if(!strcmp(name, cand[3].name))
  23.          cand[3].no++;
  24.         else
  25.                 e++;
  26. }
  27. printf("共%d人参与投票,其中%d人因投票有误视为弃权,投票的最终结果为:\n", VOTERS, e);
  28. for(i=0;i<4;i++)
  29. { printf("%s同学的得票数为:\t%d\n",cand[i].name,cand[i].no);
  30. }
  31.    k=too();//返回相同票数的后一位。
  32.    i=max();//求最大票数
  33.    if(k!=0)
  34.    {   printf("本次投票出现2个或以上票数相同:\n");
  35.       for(j=0;j<4;j++)
  36.           {  if(cand[j].no==i)
  37.                   printf("相同票数:\t%s\n",cand[j].name);
  38.    }
  39.    }
  40.    else if(i!=0) //这个地方修改成:if(e!=10),应该会更好点
  41.    { for(j=0;j<4;j++)
  42.    {    if(cand[j].no==i)
  43.           printf("\n本次投票的获胜者是:%s\n", cand[j].name);
  44.    }
  45.    }
  46.         return 0;
  47. }
  48. int too()
  49. { int i,j,k=0;
  50.      
  51. for(i=0;i<4;i++)//判断是否有同票数。
  52.          { for(j=i+1;j<4;j++)
  53.                   if(cand[i].no==cand[j].no&&cand[i].no!=0&&cand[j].no!=0)
  54.                  k=j;
  55.   }
  56. return k;
  57. }
  58. int max()
  59. {
  60. int i,max1;
  61. for(i=0;i<4;i++)//判断最高票
  62. {  if(max1<cand[i].no)
  63.         max1=cand[i].no;
  64. }
  65. return max1;
  66. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-10 22:25:34 | 显示全部楼层
本帖最后由 jonng 于 2014-5-10 22:26 编辑

[i][i]
  1. int too()
  2. { int i,j,k=0;
  3.      
  4. for(i=0;i<4;i++)//判断是否有同票数。
  5.          { if(cand.no!=0)
  6.                   break;
  7.     else
  8.       for(j=i+1;j<4;j++)
  9.                   if(cand.no==cand[j].no)
  10.                  k=j;
  11.   }
  12. return k;
  13. }
复制代码

这样效率比上面那个要好,这个我没有编译测试。
[/i][/i]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 01:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表