问题描述 :
学生会主席投票选举工作正在举行。本次投票将采用电脑统计选票的方式,当投票选举正式开始后,同学们将排队一 一走到电脑前,投上自己神圣的一票:在电脑前输入一个姓名,然后输入回车表示确认。
投票结束后显示得票最高的同学姓名,该同学将当选为新一届学生会主席。
请编程统计投票。
输入说明 :
输入包含多行,每行是一个由英文字母组成的字符串,表示一个姓名,首尾以及中间都不包含空格。
参加投票学生的人数不超过100人,每个学生姓名字符串的长度小于20。
由于学生投票时输入的姓名有大写有小写,你在统计时不区分大小写,即"Liming"和"liming"是同一个人。
输出说明 :
输出为一个字符串——当选为学生会主席的学生姓名以及他的票数,中间用一个空格分隔。
输入保证没有两个人并列票数最高。
输出的英文字母全部用小写。
输入范例 :
limin
LIMING
liming
wangshan
huyou
LiMing
输出范例:
liming 3
总结
1.与90题不同在于不知道有多少人参与投票(while循环来解决),不知道被投的有哪些(结构数组里面的元素是动态的)。
2.思路:结构数组初始化,名字为空,票数为0----->不断输入一个名字–> 转化成小写字母---->如果是第一次输入,结构数组记录下来,如果不是,则在结构数组中进行比较,查看本次输入与结构数组中是否有相同名字的—>若有,结构数组当前票数加1,跳出比较,若没有则直接将名字赋值给结构数组(也就是说之前没人选过他)。
要记录这是被投的第几个人!!
3.字符串循环输入while(gets(name)),只能有gets 按下CRTL+Z 即可结束
#include<stdio.h>
#include<string.h>
#include<ctype.h>
typedef struct stu{
char name[21];
int num;
}STUDENT;
int main(){
STUDENT stu[101];
STUDENT max;
char name[21];
int i,j,len,b,flag;
for(i=0;i<101;i++){ //赋初值名字为空值,票数为0
strcpy(stu[i].name," ");
stu[i].num=0;
}
i=-1;
while(gets(name)){
i++; //保存姓名并进行统计票数
b=i;
flag=1;
len=strlen(name);
for(j=0;j<len;j++){ //统一将姓名换成小写
if(isupper(name[j]))
name[j]+=32;
}
if(i==0){ //第一次输入时
strcpy(stu[i].name,name);
stu[i].num++;
} //若不是第一次
else{
for(j=0;j<i;j++){ //循环比较是否“选过”这个人
if(strcmp(name,stu[j].name)==0){//若有人选过他
stu[j].num++;//票数加1,跳出比较,标志位记为0
i=b-1;
flag=0;
break;
}
}
if(flag){之前没有选过这个人
strcpy(stu[i].name,name);
stu[i].num++;
}
}
}
#if(0)
测试为了输出结构数组中的人以及相应的票数
for(j=0;j<=i;j++){
printf("%s %d\n",stu[j].name,stu[j].num);
}
#endif
//找出票数最多的
max=stu[0];
for(j=1;j<=i;j++){
if(max.num<stu[j].num)
max=stu[j];
}
printf("%s %d\n",max.name,max.num);
return 0;
}