目录
题目
输入格式:
先输入候选人人数n和n名候选人姓名,再输入选民人数m和m位选民的选票。
输出格式:
先根据选票结果由高到低输出各候选人得票结果,再根据废票情况输出废票信息(换行后,输出提示信息“invalid vote:”,再输出废票信息)。
输入样例1:
3
zhang
li
wang
9
Wang
Zhang
zhuang
LI
Liao
ZHANG
WANG
Wang
wang
输出样例1:
wang:4
zhang:2
li:1
invalid vote:
zhuang
Liao
输入样例2:
2
liu
yang
5
Liu
liu
YANG
yang
Liu
输出样例2:
liu:3
yang:2
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
题目分析
这道题目可以说是对字符串和结构体的综合考察了,每个小点写起来其实不难,但是要把它们整合起来的确还是有点难度的,要注意数组大小、标志处理、字符串的排序等等,反正Void是错了几十次才码出来。。。。
C语言代码
#include<stdio.h>
#include<string.h>
struct a//候选人
{
char name[20];//候选人姓名,数组大小一定要把控好,不然废票数组会报错
int cnt;//候选人票数统计
}a[10];
int main()
{
//int i,j,k;多循环建议是不要把循环变量声明为全局
int n;
int m;
scanf("%d",&n);
char shuru[20];//输入数组
//开始候选人的输入
for(int i=0;i<n;i++)
{
scanf("%s",shuru);
for(int j=0;shuru[j]!='\0';j++)
{
if(shuru[j]>='A'&&shuru[j]<='Z')//大小写的转化
{
shuru[j]+=32;
}
strcpy(a[i].name,shuru);
//测试点//printf("%s\n",a[i].name);
a[i].cnt=0;//输入要完整,不要忘记票数初始化
}
}
//开始整理票数
scanf("%d",&m);
int flag=0;//标志:用来判断是否为废票
int inva=0;//废票地址变量
char invalid[m][20];//废票数组
char c[20];
//票数的统计
for(int i=0;i<m;i++)
{
scanf("%s",shuru);
strcpy(c,shuru);
for(int j=0;shuru[j]!='\0';j++)
{
if(shuru[j]>='A'&&shuru[j]<='Z')//大小写的转化
{
shuru[j]+=32;
}
}
//测试点//printf("%s\n",shuru);
for(int j=0;j<n;j++)
{
if(strcmp(a[j].name,shuru)==0)//字符串的比较
{
a[j].cnt++;
flag=1;
}
}
if(flag==0)
{
strcpy(invalid[inva],c);//废票存储
inva++;
}
flag=0;//标志符的还原
}
/*
for(int i=0;i<n;i++)
{
printf("%s\n",a[i].name);//测试点:检测排序是否出现问题
}
*/
struct a turn;//交换体
//开始排序
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)//冒泡排序
{
if(a[i].cnt<a[j].cnt)
{
turn=a[i];//这里要注意不能交换位置,别问我怎么知道
a[i]=a[j];
a[j]=turn;
}
}
/*
for(int i=0;i<n;i++)
{
printf("%s\n",a[i].name);//测试点
}
*/
//开始输出
for(int i=0;i<n;i++)
{
printf("%s:%d\n",a[i].name,a[i].cnt);
}
if(inva!=0)
{
printf("\ninvalid vote:\n");
for(int i=0;i<inva;i++)
{
printf("%s\n",invalid[i]);
}
}
return 0;
}
运行截图