1. 程式人生 > 其它 >【PTA】選民投票 (20分)

【PTA】選民投票 (20分)

技術標籤:# C++難題總結c++

程式設計統計候選人的得票數。有若干位候選人(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:

在這裡插入圖片描述

輸入樣例2:

2
liu
yang
5
Liu
liu
YANG
yang
Liu

輸出樣例2:

liu:3
yang:2

一道印象非常深刻的磨了很久的題。
其中,第四個測試點:**段錯誤,是陣列越界。**雖然題目只有10,但是若是寫11,還是不夠,我一氣之下寫了個100,就過了。大E了,又沒有閃。

磨了兩個小時的幾個教訓:
1、一定要寫註釋,標明變數代表什麼,特別是程式碼長的時候。

2、陣列儘量大。

3、一段一段地測試資料。

#include
<iostream>
#include<bits/stdc++.h> bool cmp(int a,int b) { return a>b; } struct vote { char name[100]; int piao; }a[100]; using namespace std; int main() { int n,m; //1 輸入候選人 cin>>n; for(int i=0;i<n;i++) { cin>>a[i].name; } //2 輸入投票 cin>>m; string b,
b_name[100]; int invalid[100];//輸錯名字對應下標; int flag=0,temp=0;//flag是用來判斷是否輸錯名字;temp是輸錯名字的次數。 for(int i=0;i<m;i++) { cin>>b_name[i];//b是投票名; b=b_name[i]; flag=0; for(int j=0;j<n;j++) { if(b==a[j].name) { a[j].piao++; flag++; break; } else { int temp2=0;//temp2用來記錄大小寫調整完後是否完全相同; int len1=b.size(),len2=strlen(a[j].name) ; //cout<<b<<" "<<len1<<a[j].name<<" "<<len2<<endl; if(len1==len2) { for(int k=0;b[k];k++) { if(b[k]==a[j].name[k]) { temp2++; continue; } else { if(islower(b[k])) b[k]=toupper(b[k]); else if(isupper(b[k])) b[k]=tolower(b[k]); if(b[k]==a[j].name[k]) { temp2++; continue; } else break; } } } if(temp2==len2) { flag++; a[j].piao++; } } } if (flag==0) { invalid[temp]=i; temp++; } } //3 輸出結果 int piao1[100],piao2[100];//把票數單獨存一下; for(int i=0;i<n;i++) { piao1[i]=a[i].piao; piao2[i]=a[i].piao; } sort(piao2,piao2+n,cmp);//piao2被從大到小排了 int piao3[100]; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(piao2[i]==piao1[j]) { piao3[i]=j; } } } for(int i=0;i<n;i++) { cout<<a[piao3[i]].name<<":"<<a[piao3[i]].piao; if(i!=n-1) cout<<endl; } if(temp!=0) { cout<<endl<<endl<<"invalid vote:"<<endl; for(int i=0;i<temp;i++) { cout<<b_name[invalid[i]]; if(i!=temp-1) cout<<endl; } } return 0; }