鱼C论坛

 找回密码
 立即注册
查看: 2222|回复: 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[10];
  int no;
}cand[]={{"刘德华",0} , {"张国立",0} ,  {"张三丰",0} ,  {"孙悟空",0} };  
int main(int argc, char* argv[])
{ int i,j,k=0,e=0;
 char name[10];
for(i=0;i<VOTERS;i++)
{ printf("第 %d 人投票,请写下你支持的候选人名字: ", i+1);
   scanf("%s",name);
    if (!strcmp(name, cand[0].name))
          cand[0].no++;
 else if(!strcmp(name, cand[1].name))
  cand[1].no++;
 else if(!strcmp(name, cand[2].name))
  cand[2].no++;
 else if(!strcmp(name, cand[3].name))
  cand[3].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[j].no==i)
    printf("相同票数:\t%s\n",cand[j].name);
   }
   }
   else 
   { for(j=0;j<4;j++)
   {    if(cand[j].no==i)
          printf("\n本次投票的获胜者是:%s\n", cand[j].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[j].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语言了,所以就当练练手。楼主帮你修改好了,你原来里面没有判断相同票数的功能。
而且我这代码还可以再优化呢, 这编程 还真是不能太长时间不写, 要不然真的会生疏的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2014-5-10 10:52:36 | 显示全部楼层
谢谢啊,我是新手,编个小程序都这么爱出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

为什么程序里面的if-else if-else总是执行else部分,是因为名字后面回车的原因吗?
想知道小甲鱼最近在做啥?请访问 -> 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调式一下,看就可以看到他是怎么运行的。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-10 20:57:02 | 显示全部楼层
不管怎么投票,我的运行结果总是10个人弃权,孙悟空获胜。不知道怎么回事呢。以前用的codeblocks调试,前天换成VS2013还不太会调试
想知道小甲鱼最近在做啥?请访问 -> 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还不太会调试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-10 22:10:58 | 显示全部楼层
本帖最后由 jonng 于 2014-5-10 22:13 编辑
莫问流年 发表于 2014-5-10 22:04
不管怎么投票,我的运行结果总是10个人弃权,孙悟空获胜。不知道怎么回事呢。以前用的codeblocks调试,前 ...
#include "stdafx.h"
#include <string.h>
#define VOTERS 10
int max();
int too();
struct candidate
{ char name[10];
  int no;
}cand[]={{"刘德华",0} , {"张国立",0} ,  {"张三丰",0} ,  {"孙悟空",0} };  
int main(int argc, char* argv[])
{ int i,j,k=0,e=0;
 char name[10];
for(i=0;i<VOTERS;i++)
{ printf("第 %d 人投票,请写下你支持的候选人名字: ", i+1);
   scanf("%s",name);
    if (!strcmp(name, cand[0].name))
          cand[0].no++;
        else if(!strcmp(name, cand[1].name))
         cand[1].no++;
        else if(!strcmp(name, cand[2].name))
         cand[2].no++;
        else if(!strcmp(name, cand[3].name))
         cand[3].no++;
        else 
                e++;
}
printf("共%d人参与投票,其中%d人因投票有误视为弃权,投票的最终结果为:\n", VOTERS, e);
 for(i=0;i<4;i++)
 { printf("%s同学的得票数为:\t%d\n",cand[i].name,cand[i].no);
 }
   k=too();//返回相同票数的后一位。
   i=max();//求最大票数
   if(k!=0)
   {   printf("本次投票出现2个或以上票数相同:\n");
      for(j=0;j<4;j++)
          {  if(cand[j].no==i)
                  printf("相同票数:\t%s\n",cand[j].name);
   }
   }
   else if(i!=0) //这个地方修改成:if(e!=10),应该会更好点
   { for(j=0;j<4;j++)
   {    if(cand[j].no==i)
          printf("\n本次投票的获胜者是:%s\n", cand[j].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[i].no==cand[j].no&&cand[i].no!=0&&cand[j].no!=0)
                 k=j;
  }
 return k;
}
 int max()
 {
 int i,max1;
 for(i=0;i<4;i++)//判断最高票
 {  if(max1<cand[i].no)
        max1=cand[i].no;
 }
 return max1;
 }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

[i][i]
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[j].no)
                 k=j;
  }
 return k;
}
这样效率比上面那个要好,这个我没有编译测试。
[/i][/i]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 07:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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