个人观点,如有不同见解,欢迎在评论区留言
题目:
编程统计候选人的得票数。有若干位候选人(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
代码:
#include<iostream>
#include<cstring>
using namespace std;
int strcmp1(char *a,char *b);
struct Node {
char a[10];
int num=0;
};
int main() {
int n,m;
cin>>n;
Node voted[n];
for(int i=0; i<n; i++)
cin>>voted[i].a;
cin>>m;
Node voter[m];
for(int i=0; i<m; i++)
cin>>voter[i].a;
for(int i=0; i<m; i++) { //选票与候选人匹配,若为无效选票,num=-1
int flag=0;
for(int j=0; j<n; j++) {
if(strcmp1(voted[j].a,voter[i].a)) {
voted[j].num++;
flag=1;
break;
}
}
if(!flag)
voter[i].num=-1;
}
int select[n];
for(int i=0; i<n; i++)
select[i]=i;
for(int i=0; i<n; i++) { //对候选人得票数排序,直接排序同时交换字符串和数字,
for(int j=0; j<n-1; j++) { //比较麻烦,所以借助另一个数组实现
if(voted[select[j]].num<voted[select[j+1]].num) {
int temp=select[j];
select[j]=select[j+1];
select[j+1]=temp;
}
}
}
int sum=0;
for(int i=0; i<n; i++) {
cout<<voted[select[i]].a<<":"<<voted[select[i]].num<<endl;
sum+=voted[i].num;
}
if(sum!=m) { //判断是否有无效选票
cout<<"\ninvalid vote:\n";
for(int i=0; i<m; i++) {
if(voter[i].num==-1)
cout<<voter[i].a<<endl;
}
}
}
int strcmp1(char *a,char *b) { //判断选票上名字是否与候选人名字一样,是返回1,否返回0
for(int i=0; a[i]!='\0'||b[i]!='\0'; i++) {
if(a[i]!=b[i]&&a[i]!=b[i]+32&&a[i]!=b[i]-32) {
return 0;
}
}
return 1;
}