题目:有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小时,因为本人也是大一新生,刚刚入门,我朋友也用链表做的,觉得对于萌新来说有点难度,所以拿出来仅供参考学习,大佬勿喷
|