选民投票

个人观点,如有不同见解,欢迎在评论区留言

题目:

编程统计候选人的得票数。有若干位候选人(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<<"
invalid vote:
";
		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]!=''||b[i]!=''; i++) {
		if(a[i]!=b[i]&&a[i]!=b[i]+32&&a[i]!=b[i]-32) {
			return 0;
		}
	}
	return 1;
}

原文地址:https://www.cnblogs.com/pluie/p/12810036.html