/**************************************************************************** 学校选举投票程序,由于保密的原因,选举决定用计算机进行投票,编写程序, 以便分析数据并产生获胜者。 该大学有4个部,每个部有几个系,由于选举的原因,这四个部门分别记为Region1 Region2,Region3,region4.部门中的每一个系管理其选举过程并且向选举委员会直接汇报 每一个候选人的得票数。选举结果如下表示: candidate_name region# number_of_votes_for_this_candidate 选举委员会想用下面的表格形式来输出结果: -----------------------------Election results--------------------------- Candidate Votes Name Region1 Region2 Region3 Region4 Total ------- ------- ------- ------ ------- ----- Balto 0 0 0 272 272 Doc 25 71 156 97 349 . . . Winner:???,Votes Received:??? Total votes polled:??? 输出中候选人的名字必须按字母大小写进行排序。 对于该程序,假设6位候选人参加学生会主席的竞选。当然可以改进程序并包含任何数目的候选人。 数据由两个文件提供。文件canddata.txt包含了竞选学生会主席的候选人的名单。该文件中候 选人的名字没有以特定的顺序排列。在第二个文件votedata.txt中,每一行包含了如下形式的选举 结果: candidateName regionNumber numberofvotesforthiscandidate votedata.txt文件中的每一行包含了候选人的名字,region号码和候选人在该区得到的选票数。 例如,包含选举数据的输入文件应该如下所示: Donald 1 23 Pluto 2 56 Doc 1 25 pluto 4 23 . . . 第一行显示了Donald在第一区受到了23张选票。 输入 两个文件,一个文件包含候选人的名字,一个包含前面描述的选票数据 输出 选举结果和获胜者。
*************************************************************************************/
#include<iostream> #include<fstream> #include<string> #include<iomanip>
using namespace std;
const int noOfCandidates=6;
const int noOfRegions=4;
void printHeading();
void initialize(int vbRegion[][noOfRegions],int tVotes[],int noOfRows);
void getCandidatesName(ifstream& inp,string cNames[], int noOfRows);
void sortCandidatesName(string cNames[], int noOfRows);
int binSearch(string cNames[],int noOfRows,string name);
void processVotes(ifstream& inp,string cNames[],int vbRegion[][noOfRegions],int noOfRows);
void addRegionsVote(int vbRegion[][noOfRegions],int tVotes[],int noOfRows);
void printResults(string cNames[],int vbRegion[][noOfRegions],int tVotes[],int noOfRows);
int main() { string candidatesName[noOfCandidates]; int votesByRegion[noOfCandidates][noOfRegions]; int totalVotes[noOfCandidates]; ifstream infile;
infile.open("a:candData.txt"); if(!infile) { cout<<"Input file (candDate.txt) does not exit."<<endl; return 1; } getCandidatesName(infile,candidatesName,noOfCandidates); sortCandidatesName(candidatesName,noOfCandidates); infile.close(); infile.open("a:voteData.txt"); if(!infile) { cout<<"Input file (voteData.txt) dose not exit."<<endl; return 1; } initialize(votesByRegion,totalVotes,noOfCandidates); processVotes(infile,candidatesName,votesByRegion,noOfCandidates); addRegionsVote(votesByRegion,totalVotes,noOfCandidates); printHeading(); printResults(candidatesName,votesByRegion,totalVotes,noOfCandidates); return 0;
void initialize(int vbRegion[][noOfRegions],int tVotes[],int noOfRows) { int i,j; for(i=0;i<noOfRows;i++) for(j=0;j<noOfRegions;j++) vbRegion[i][j]=0; for(i=0;i<noOfRows;i++) tVotes[i]=0; } void getCandidatesName(ifstream& inp,string cNames[],int noOfRows) { int i; for(i=0;i<noOfRows;i++) inp>>cNames[i]; } void sortCandidatesName(string cNames[],int noOfRows) { int i,j; int min; for(i=0;i<noOfRows-1;i++) { min=1; for(j=i+1;j<noOfRows;j++) if(cNames[j]<cNames[min]) min=j; cNames[i].swap(cNames[min]); } } int binSearch(string cNames[],int noOfRows,string name) { int first,last,mid; bool found; first=0; last =noOfRows-1; found=false; while(!found && first<=last) { mid=(first +last)/2; if(cNames[mid]==name) found=true; else if(cNames[mid]>name) last=mid-1; else first=mid+1; } if(found) return mid; else return-1; } void processVotes(ifstream& inp,string cNames[],int vbRegion[][noOfRegions],int noOfRows) { string candName; int region; int noOfVotes; int loc; inp>>candName>>region>>noOfVotes; while(inp) { loc=binSearch(cNames,noOfRows,candName); if(loc!=-1) vbRegion[loc][region-1]=vbRegion[loc][region-1]+noOfVotes; inp>>candName>>region>>noOfVotes; } } void addRegionsVote(int vbRegion[][noOfRegions],int tVotes[],int noOfRows) { int i,j; for(i=0;i<noOfRows;i++) for(j=0;j<noOfRegions;j++) tVotes[i]=tVotes[i]+vbRegion[i][j]; } void printHeading() { cout<<"-----------------Election results-------------"<<endl<<endl; cout<<"Candidate Votes"<<endl; cout<<"Name Region1 Region2 Region3 "<<"Region4 Total"<<endl; cout<<"---------- -------- -------- -------- --------"<<"--------"<<endl; }
void printResults(string cNames[],int vbRegion[][noOfRegions],int tVotes[],int noOfRows);
{ int i,j; int largestVotes=0; int winLoc=0; int sumVotes=0; for(i=0;i<noOfRows;i++) { if(largestVotes<tVotes[i]) { largesVotes=tVotes[i]; winLoc=1; } sumVotes=sumVotes+tVotes[i]; cout<<left; cout<<setw(9)<<cNames[i]<<" "; cout<<right; for(j=0;j<noOfRegions;j++) cout<<setw(8)<<vbRegion[i][j]<<" "; cout<<setw(6)<<tVotes[i]<<endl; } cout<<endl<<endl<<"winner:"<<cNames[winLoc]<<", Votes Received:"<<tVotes[winLoc]<<endl<<endl; cout<<"total votes polled:"<<sumVotes<<endl; } }