吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4121|回复: 7
收起左侧

[C&C++ 转载] C语言元旦礼物:经典入门问题分析——选举投票

[复制链接]
kyrzy0416 发表于 2018-1-1 19:22
题目:有N个候选人,每个选民只能投一票,要求编写一个模拟10个选民进行投票的程序,先后输入被选人的名字,最后按照选票由高到低输出投票结果。
[C] 纯文本查看 复制代码
#include <stdio.h>
#include <string.h>
#define N 10
struct Person             //声明结构体  
{  
    char name[20];  
    int count;  
}leader[N];   //定义结构体数组  

void Max(Person leader[],int leader_count) //选择法排序 
{
        int i,j;
        Person temp;
        for(i=0;i<N-1;i++)
                for(j=i+1;j<N;j++)
                {
                        if(leader[i].count<leader[j].count)
                        {
                                temp=leader[i];
                                leader[i]=leader[j];
                                leader[j]=temp;
                        }
                } 
}

int main()  
{  
    int i,j,flag,leader_count=0;  
    char leader_name[20];     
    printf("请输入候选人名字:");  
    for(i=0;i<N;i++)  
    {  
        scanf("%s",leader_name);
        for(j=0;j<i;j++)
        {
                if(i==0)
                {
                        strcpy(leader[0].name,leader_name);
                        leader[0].count++;
                        break;
                        }
                        if(strcmp(leader[j].name,leader_name)!=0)
                                flag=1;
                        else if(strcmp(leader[j].name,leader_name)==0)
                        {
                                flag=0;
                                leader[j].count++;
                                break; 
                        }
                }
                if(flag==1&&i>0)
                {
                        strcpy(leader[i].name,leader_name);
                        leader_count++;
                        leader[i].count++;
                }
        }
    
        Max(leader,leader_count) ; 
    printf("\n最终投票结果为:\n");  
    for(i=0;i<leader_count;i++)  
    {  
        printf("%13s:%d\n",leader[i].name,leader[i].count);  
    }  
    
    return 0;  
}  


本题我采用的是结构体数组的写法,具体思路:
先把第一个选民输入的赋值到第一个被选人的数组里面然后直接跳出下面循环,以保证后面的循环能进行,第一个循环是用来循环选民10个,第二个是用来判断前面是否出现过重复被选人,立一个flag,1为无重复,0为有重复,这样做的好处:是在循环有重复的时候不会出现遇到第一个与当前输入的被选人重复后直接跳过的尴尬情况(我曾经出现过这样的思路,不立flag,直接用strcmp比较后遇到第一个与当前输入的被选人不一样后就成立了,之后的结果怎么输入都不对),立完flag后进行判断,而且flag 0要在循环内,flag  1要在循环外,就是因为上面的问题,flag是为了解决循环检测前面是否有重复,所以在循环完前面的被选人无重复后,才进行flag的判断。另外还有一些赋值细节当时做的时候列了提纲,做了两节课2小时,因为本人也是大一新生,刚刚入门,我朋友也用链表做的,觉得对于萌新来说有点难度,所以拿出来仅供参考学习,大佬勿喷

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
ftmovie + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ftmovie 发表于 2018-1-1 19:38
谢谢分享
caidianbian 发表于 2018-1-2 08:40
10096ljr 发表于 2018-1-2 20:46 来自手机
头像被屏蔽
q66212777 发表于 2018-4-18 22:52
提示: 作者被禁止或删除 内容自动屏蔽
50166 发表于 2018-4-19 08:36
谢谢分享
星风随雨 发表于 2018-5-14 13:02
就想问一下,你是通过什么方式学的,我也想学,但是找不到门路,看书就算了,没那个毅力
Nests 发表于 2018-5-14 13:19
星风随雨 发表于 2018-5-14 13:02
就想问一下,你是通过什么方式学的,我也想学,但是找不到门路,看书就算了,没那个毅力

就是要看书啊,这是避不了的。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 15:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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