鱼C论坛

 找回密码
 立即注册
查看: 3648|回复: 4

大家帮我看看这个投票程序,为什么会这样???

[复制链接]
发表于 2013-6-21 15:33:03 | 显示全部楼层 |阅读模式

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

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

x
  1. # include <stdio.h>
  2. # include <string.h>

  3.         struct vote
  4.         {
  5.                 char name[10];
  6.                 int cnt;
  7.         };

  8. int main(void)
  9. {
  10.         struct vote person[2];
  11.         int num1;                                //用于存放创建候选人的个数
  12.         int num2;               //用于存放投票人数
  13.         int i;
  14.         int j;
  15.         char temp[10];
  16.         int cnt;
  17.         char name[10];
  18.         int sign = 1;               //标记

  19.         printf("候选人数:");
  20.         scanf("%d", &num1);
  21.         printf("投票人数:");
  22.         scanf("%d", &num2);
  23.        
  24.         for (i=0; i<num1; ++i)
  25.         {
  26.                 printf("请输入第%d个候选人姓名:", i+1);
  27.                 scanf("%s", person[i].name);
  28.                 person[i].cnt = 0;
  29.         }
  30.         printf("\n");
  31.         printf("候选人:");
  32.         for (i=0; i<num1; ++i)
  33.                 printf("%s ", person[i].name);
  34.         printf("\n");
  35.         printf("\n");
  36.         printf("开始:\n");
  37.         for (i=0; i<num2; ++i)
  38.         {
  39.                 printf("路人%d,你选谁:", i+1);
  40.                 scanf("%s", temp);
  41.                 for (j=0; j<num1; ++j)
  42.                         if (strcmp(temp, person[j].name) == 0)
  43.                                 person[j].cnt++;
  44.         }

  45.         printf("\n");
  46.         printf("得票结果:\n");
  47.         for (i=0; i<num1; ++i)
  48.                 printf("%s\t%d\n", person[i].name, person[i].cnt);            
  49.         for (i=0; i<num1-1; ++i)                                  //排序
  50.                 for (j=0; j<num1-1-i; ++j)
  51.                 {
  52.                         if (person[j].cnt < person[j+1].cnt)
  53.                         {
  54.                                 strcpy(name, person[j].name);
  55.                                 strcpy(person[j].name, person[j+1].name);
  56.                                 strcpy(person[j+1].name, name);
  57.                                 cnt = person[j].cnt;
  58.                                 person[j].cnt = person[j+1].cnt;
  59.                                 person[j+1].cnt = cnt;
  60.                         }
  61.                 }
  62.         printf("得票排行榜:\n");
  63.         for (i=0; i<num1; ++i)
  64.                 printf("%s\t%d\n", person[i].name, person[i].cnt);
  65.         printf("\n");
  66.         for (i=0;i<num1;++i)                              
  67.                 if (person[i].cnt==person[i+1].cnt)
  68.                         ++sign;
  69.         if (1==sign)       //冠军只有一个时              
  70.                 printf("冠军是:%s\t%d", person[0].name, person[0].cnt);
  71.         else
  72.         {
  73.                 if (num1==sign)           //票数相同时
  74.                         printf("该死!为什么都一样!\n");
  75.                 else                       //并列第一时
  76.                 {
  77.                         printf("有%d人并列第一!\n", sign);
  78.                         for (i=0;i<sign;++i)
  79.                                 printf("%s\t%d\n", person[i].name, person[i].cnt);
  80.                 }
  81.         }

  82.         return 0;
  83. }情况如下,虽然不会报错,但是还是出现这个窗口是怎么回事,高手解释解释。。。
复制代码

问题1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-21 15:49:50 | 显示全部楼层
自己顶顶。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-21 16:40:33 | 显示全部楼层
继续努力!

#include <stdio.h>
#include <string.h>
#include<stdlib.h>                                 //杂项说明的头文件

struct vote
{
        char name[10];
        int cnt;
};

int main(void)
{
        struct vote *p;
        int num1;               
        int num2;            
        int i;
        int j;
        char temp[10];
        int cnt;
        char name[10];
        int sign = 1;   

        printf("候选人数:");
        scanf("%d", &num1);

        p = (struct vote *)calloc( num1, sizeof( struct vote ) );     //我觉得这种动态分配比较好,刚才你才定义了person[2] ,内存不足

        printf("投票人数:");
        scanf("%d", &num2);
       
        getchar();                                             //这里不应该吸收掉换行符?加上吧 ……
       
        for (i=0; i<num1; ++i)
        {
                printf("请输入第%d个候选人姓名:", i+1);
                scanf("%s", p[i].name);
                p[i].cnt = 0;
        }
        printf("\n");
        printf("候选人:");
        for (i=0; i<num1; ++i)
                printf("%s ", p[i].name);
        printf("\n");
        printf("\n");
        printf("开始:\n");
        for (i=0; i<num2; ++i)
        {
                printf("路人%d,你选谁:", i+1);
                scanf("%s", temp);
               
                for (j=0; j<num1; ++j)
                        if (strcmp(temp, p[j].name) == 0)
                                p[j].cnt++;
        }
       
        printf("\n");
        printf("得票结果:\n");
        for (i=0; i<num1; ++i)
                printf("%s\t%d\n", p[i].name, p[i].cnt);         
       
        for (i=1; i<num1; ++i)                                 
        {
                for (j=0; j<num1-i; ++j)                           //这个是冒泡法
                {
                        if (p[j].cnt < p[j+1].cnt)
                        {
                                strcpy(name, p[j].name);
                                strcpy(p[j].name, p[j+1].name);
                                strcpy(p[j+1].name, name);
                                cnt = p[j].cnt;
                                p[j].cnt = p[j+1].cnt;
                                p[j+1].cnt = cnt;
                        }
                }
        }
        printf("得票排行榜:\n");
        for (i=0; i<num1; ++i)
                printf("%s\t%d\n", p[i].name, p[i].cnt);
        printf("\n");
        for (i=0;i<num1;++i)                              
        {
                if (p[i].cnt==p[i+1].cnt)
                        ++sign;
        }
        if (1==sign)               
                printf("冠军是:%s\t%d\n\n", p[0].name, p[0].cnt);
        else
        {
                if (num1==sign)      
                        printf("该死!为什么都一样!\n");
                else                  
                {
                        printf("有%d人并列第一!\n", sign);
                        for (i=0;i<sign;++i)
                                printf("%s\t%d\n", p[i].name, p[i].cnt);
                }
        }
       
        return 0;
}
//这个是我的修改 。。{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-21 19:08:22 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-21 22:57:28 | 显示全部楼层

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-22 17:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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