個人觀點,如有不同見解,歡迎在評論區留言
題目:
編程統計候選人的得票數。有若干位候選人(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;
}