编程统计候选人的得票数。有若干位候选人(n<=10),候选人姓名从键盘输入(候选人姓名不区分大小写,姓名最长为9个字节),若干位选民,选民每次输入一个得票的候选人的名字(姓名最长为9个字节),若选民输错候选人姓名,则按废票处理。程序自动统计各候选人的得票结果,并按照得票数由高到低的顺序排序。最后输出各选票人得票结果和废票信息。
输入格式:
先输入候选人人数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
结尾无空行
这道题PTA的判定有问题,与devc++运行的实际情况不符,并且最后一个测试点“最多候选人和最长姓名”有时判定为对,有时判定为错。
#include <stdio.h>
#include <string.h>
typedef struct {
char id[10];
int piao;
}xuanming;//在全局构造一个函数
void pai(xuanming *g, int n)//冒泡排序法
{
int i,j,t,N;
char chao[10];//chao用于存储候选人名
for (i = n; i>=0; i--)
{
for (j=i-1; j>=0; j--)
{
if (g[i].piao > g[j].piao)
{
t=g[i].piao;
g[i].piao=g[j].piao;
g[j].piao=t;
strcpy(chao,g[i].id);
strcpy(g[i].id,g[j].id);
strcpy(g[j].id,chao);
}
}
}
for(N=0;N<n;N++)
{
//!!!下面这个输出g[N+1]非常关键,在PTA上是正确的,但在devc++运行时错误的
//!!!在devc++上g[N]是正确的,而g[N+1]是错误的,这里应该是PTA的判定出现问题
//!!!同时提交后最后一项“最多候选人和最长姓名”时错时对,飘忽不定
printf("%s:%d\n",g[N+1].id,g[N+1].piao);
}
}
int main()
{
int n,N,m,M,i,j,p,q=0;//N,M,i,j,作用类似用于for,p,q用于判定
scanf("%d",&n);
xuanming x[n];
for(N=0;N<n;N++)//先读入所有候选人,并且初始化票数
{
scanf("%s",x[N].id);
x[N].piao=0;
}
scanf("%d",&m);
char y[m][10];//读入投入的票
char fei[m][10];//记录废票名字
int feifei[m];//记录废票位置
for(M=0;M<m;M++)feifei[M]=0;
for(M=0;M<m;M++)
{
scanf("%s",y[M]);
for(N=0;N<n;N++)//循环判定选票与候选人名字是否相同
{
if((x[N].id[0]==y[M][0])||x[N].id[0]==y[M][0]+32)
{ p=1;
if(strlen(x[N].id)!=strlen(y[M]))p=0;
for(i=0;i<10;i++)
{
if(x[N].id[i]>='A'&&x[N].id[i]<='Z')//分成两部分方便判定大小写
{
if(x[N].id[i]!=y[M][i]&&x[N].id[i]!=y[M][i]-32)
p=0;
}
if(x[N].id[i]>='a'&&x[N].id[i]<='z')
{
if(x[N].id[i]!=y[M][i]&&x[N].id[i]!=y[M][i]+32)
p=0;
}
}
if(p==1)
{
x[N].piao++;
break;
}
}
if(N!=n-1)continue;//如果循环n-1次后还不break,说明没有结果,是废票。
strcpy(fei[M],y[M]);//记录废票名
feifei[M]=1;//记录废票位置M
q++;//q用来判定是否有废票,用于是否输入invalid vote。
}
}
pai(x,n);//进行一次冒泡排序,并进行输出;
if(q)//此步输出废票
{ printf("\n");
printf("invalid vote:\n");
for(M=0;M<m;M++)
{
if(feifei[M]==1)
{
printf("%s\n",fei[M]);
}
}
}
}