/***************************************************
文件名稱:Person.h
作 者:zz
備 注:人的頭文件
創建時間:2012-4-1
修改歷史:2012-4-5
版權聲明:CSDN
***************************************************/
#ifndef _Person_H
#define _Person_H
#include <string>
#include <iostream>
using namespace std;
class Person{
/*******************************************
函數名稱:ostream& operator<<(ostream& ,Person&)
函數功能:輸出運算符重載函數
傳入參數:N/A
返回 值 :N/A
********************************************/
friend ostream& operator<<(ostream& ,Person&);
protected:
//名字
string _name;
//年齡
int _age;
//薪資
double _salary;
//不可修改的id號
const int _id;
//總人數
static int _totalPersons;
public:
/*******************************************
函數名稱:Person(string name="zhangsan",int age=0,int salary=0);
函數功能:帶參構造函數
傳入參數:N/A
返回 值 :N/A
********************************************/
Person(string name="zhangsan",int age=0,double salary=0);
/*******************************************
函數名稱:void setAge(int newAge)
函數功能:_age的set方法
傳入參數:N/A
返回 值 :N/A
********************************************/
void setAge(int newAge);
/*******************************************
函數名稱:void setSalary(int salary)
函數功能:_salary的set方法
傳入參數:N/A
返回 值 :N/A
********************************************/
void setSalary(double salary);
/*******************************************
函數名稱:void setName(int name)
函數功能:_name的set方法
傳入參數:N/A
返回 值 :N/A
********************************************/
void setName(string name);
/*******************************************
函數名稱:string getName();
函數功能:_name的get方法
傳入參數:N/A
返回 值 :N/A
********************************************/
string getName()const;
/*******************************************
函數名稱:int getAge();
函數功能:_age的get方法
傳入參數:N/A
返回 值 :N/A
********************************************/
int getAge()const;
/*******************************************
函數名稱:int getSalary();
函數功能:_salary的get方法
傳入參數:N/A
返回 值 :N/A
********************************************/
double getSalary()const;
/*******************************************
函數名稱:void print();
函數功能:print方法
傳入參數:N/A
返回 值 :N/A
********************************************/
void print()const;
};
#endif
/***************************************************
文件名稱:Person.cpp
作 者:zz
備 注:人的實現文件
創建時間:2012-4-1
修改歷史:2012-4-5
版權聲明:CSDN
***************************************************/
#include "Person.h"
#include <iostream>
#include <string>
using namespace std;
//初始化總人數
int Person::_totalPersons=0;
/*******************************************
函數名稱:Person(string name,int age,int salary)
函數功能:帶參構造函數
傳入參數:N/A
返回 值 :N/A
********************************************/
Person::Person(string name,int age,double salary):
_name(name),_age(age),_salary(salary),_id(_totalPersons ){
_totalPersons++;
}
/*******************************************
函數名稱:void setAge(int newAge)
函數功能:_age的set方法
傳入參數:N/A
返回 值 :N/A
********************************************/
void Person::setAge(int newAge){
_age=newAge;
}
/*******************************************
函數名稱:void setSalary(int salary)
函數功能:_salary的set方法
傳入參數:N/A
返回 值 :N/A
********************************************/
void Person::setSalary(double salary){
_salary=salary;
}
/*******************************************
函數名稱:void print();
函數功能:print方法
傳入參數:N/A
返回 值 :N/A
********************************************/
void Person::print()const{
cout<<"Person name is"<<_name<<endl;
cout<<"Perosn id is"<<_id<<endl;
}
/*******************************************
函數名稱:ostream& operator<<(ostream& ,Person&)
函數功能:輸出運算符重載函數
傳入參數:N/A
返回 值 :N/A
********************************************/
ostream& operator<<(ostream& out ,Person& person){
out<<"Person name:"<<person._name<<endl;
out<<"Person age:"<<person._age<<endl;
out<<"Person salary:"<<person._salary<<endl;
out<<"Person id:"<<person._id<<endl;
return out;
}
/*******************************************
函數名稱:void setName(int name)
函數功能:_name的set方法
傳入參數:N/A
返回 值 :N/A
********************************************/
void Person::setName(string name){
_name= name;
}
/*******************************************
函數名稱:string getName();
函數功能:_name的get方法
傳入參數:N/A
返回 值 :N/A
********************************************/
string Person::getName()const{
return _name;
}
/*******************************************
函數名稱:int getAge();
函數功能:_age的get方法
傳入參數:N/A
返回 值 :N/A
********************************************/
int Person::getAge()const{
return _age;
}
/*******************************************
函數名稱:int getSalary();
函數功能:_salary的get方法
傳入參數:N/A
返回 值 :N/A
********************************************/
double Person::getSalary()const{
return _salary;
}
/***************************************************
文件名稱:Voter.h
作 者:zz
備 注:選舉人的頭文件
創建時間:2012-4-1
修改歷史:2012-4-5
版權聲明:CSDN
***************************************************/
#ifndef _Voter_H
#define _Voter_H
#include "Person.h"
#include <string>
#include <iostream>
using namespace std;
class PersonSet;
class Candidate;
class Voter:public Person{
/*******************************************
函數名稱:friend bool operator==(Voter& a,Voter& b)
函數功能:判斷兩個對象是否相同
傳入參數:N/A
返回 值 :N/A
********************************************/
friend bool operator==(Voter& a,Voter& b);
protected:
int _polingStation;//站台號
public:
static int _totalNumVoters; //參加選舉的人數
/*******************************************
函數名稱:Voter(string name="zhangsan",int age=0,int salary=0,int polingStation=0);
函數功能:帶參構造函數
傳入參數:N/A
返回 值 :N/A
********************************************/
Voter(string name="zhangsan",int age=0,double salary=0,int polingStation=0);
/*******************************************
函數名稱:void Vote( Candidate& aCandidate );
函數功能:開始選舉
傳入參數:N/A
返回 值 :N/A
********************************************/
void Vote( Candidate& aCandidate );
/*******************************************
函數名稱: void set_polingStation(int newPolingStation);
函數功能:_polingStation的set方法
傳入參數:N/A
返回 值 :N/A
********************************************/
void set_polingStation(int newPolingStation);
/*******************************************
函數名稱: int get_PolingStation()const;
函數功能:_polingStation的get方法
傳入參數:N/A
返回 值 :N/A
********************************************/
int get_PolingStation()const;
/*******************************************
函數名稱:void print();
函數功能:print方法
傳入參數:N/A
返回 值 :N/A
********************************************/
void print()const;
/*******************************************
函數名稱:static int Voters();
函數功能:靜態的方法,返回所有選舉人的個數
傳入參數:N/A
返回 值 :N/A
********************************************/
static int Voters();
/*******************************************
函數名稱:Person& SelectCadidate(PersonSet& cadidates);
函數功能:隨機獲取候選人
傳入參數:N/A
返回 值 :N/A
********************************************/
Person& SelectCadidate(PersonSet& cadidates);
};
#endif
/***************************************************
文件名稱:Voter.cpp
作 者:zz
備 注:選舉人的頭文件
創建時間:2012-4-1
修改歷史:2012-4-5
版權聲明:CSDN
***************************************************/
#include "Voter.h"
#include <iostream>
#include <string>
#include "Candidate.h"
#include "PersonSet.h"
#include "Person.h"
using namespace std;
//初始化選舉人的個數
int Voter::_totalNumVoters=0;
/*******************************************
函數名稱: Voter::Voter(string name,int age,int salary,int polingStation)
函數功能:帶參構造函數
傳入參數:N/A
返回 值 :N/A
********************************************/
Voter::Voter(string name,int age,double salary,int polingStation):
Person(name,age,salary),_polingStation(polingStation){
_totalNumVoters++;
}
/*******************************************
函數名稱:void Vote( Candidate& aCandidate );
函數功能:開始選舉
傳入參數:N/A
返回 值 :N/A
********************************************/
void Voter::Vote( Candidate& aCandidate ){
aCandidate.AddVoter(*this);
}
/*******************************************
函數名稱: void set_polingStation(int newPolingStation);
函數功能:_polingStation的set方法
傳入參數:N/A
返回 值 :N/A
********************************************/
void Voter::set_polingStation(int newPolingStation){
_polingStation=newPolingStation;
}
/*******************************************
函數名稱:void print();
函數功能:print方法
傳入參數:N/A
返回 值 :N/A
********************************************/
void Voter::print()const{
cout<<"voter name is:"<<_name<<endl;
cout<<"voter _polingStation id is"<<_polingStation<<endl;
}
/*******************************************
函數名稱:friend bool operator==(Voter& a,Voter& b)
函數功能:判斷兩個對象是否相同
傳入參數:N/A
返回 值 :N/A
********************************************/
bool operator==(Voter& a,Voter& b){
bool flag=false;
if(a._id==b._id){
flag=true;
return flag;
}
return flag;
}
/*******************************************
函數名稱:static int Voters();
函數功能:靜態的方法,返回所有選舉人的個數
傳入參數:N/A
返回 值 :N/A
********************************************/
int Voter::Voters(){
//返回所給候選人投票的人數
return _totalNumVoters;
}
/*******************************************
函數名稱:Person& SelectCadidate(PersonSet& cadidates);
函數功能:隨機獲取候選人
傳入參數:N/A
返回 值 :N/A
********************************************/
Person& Voter::SelectCadidate(PersonSet& candidates){
int x=candidates.size();
int r=rand()%x;
return candidates[r];
}
/*******************************************
函數名稱: int get_PolingStation()const;
函數功能:_polingStation的get方法
傳入參數:N/A
返回 值 :N/A
********************************************/
int Voter::get_PolingStation()const{
return _polingStation;
}
/***************************************************
文件名稱:Candidate.h
作 者:zz
備 注:候選人的頭文件
創建時間:2012-4-1
修改歷史:2012-4-5
版權聲明:CSDN
***************************************************/
#ifndef _Candidate_H
#define _Candidate_H
#include "Person.h"
#include "PersonSet.h"
#include <string>
#include <iostream>
using namespace std;
class PersonSet;
class Voter;
class Candidate:public Person{
/*******************************************
函數名稱:ostream& operator<<(ostream& ,Person&)
函數功能:輸出運算符重載函數
傳入參數:N/A
返回 值 :N/A
********************************************/
friend ostream& operator<<(ostream&,Candidate&);
/*******************************************
函數名稱:bool operator<(Candidate& a,Candidate& b);
函數功能:重載運算符,判斷是否a<b
傳入參數:N/A
返回 值 :N/A
********************************************/
friend bool operator<(Candidate& a,Candidate& b);
protected:
//定義一個PersonSet 對象
PersonSet _votorSet;
double average_age;//平均年齡
double average_salary;//平均薪水
static int _numCandidates;//統計比賽中有多少候選人參加
public:
/*******************************************
函數名稱:PersonSet& Candidate::getPersonSet()
函數功能:PersonSet對象的get方法
傳入參數:N/A
返回 值 :N/A
********************************************/
PersonSet& getPersonSet();
/*******************************************
函數名稱: Candidate(string name="lisi",int age=5,int salary=1222);
函數功能:帶參構造函數
傳入參數:N/A
返回 值 :N/A
********************************************/
Candidate(string name="lisi",int age=5,double salary=0);
/*******************************************
函數名稱: int getVotesNum();
函數功能:當前選舉人所得到的票數
傳入參數:N/A
返回 值 :N/A
********************************************/
int getVotesNum();//得到每個候選人的票數
/*******************************************
函數名稱: void AddVoter(Voter& aVoter);
函數功能:得到選舉人所給的票,記住給當前候選人投票人的信息
傳入參數:N/A
返回 值 :N/A
********************************************/
void AddVoter(Voter& aVoter);
/*******************************************
函數名稱: int getAverageVotersAge();
函數功能:獲取所以給當前候選人投票的所有選舉人的平均年齡
傳入參數:N/A
返回 值 :N/A
********************************************/
double getAverageVotersAge();
/*******************************************
函數名稱: int getAverageVotersSalary();
函數功能:獲取所以給當前候選人投票的所有選舉人的平均薪資
傳入參數:N/A
返回 值 :N/A
********************************************/
double getAverageVotersSalary();
/*******************************************
函數名稱: static int Candidates();
函數功能:獲取所有的候選人個數
傳入參數:N/A
返回 值 :N/A
********************************************/
static int Candidates();
};
#endif
/***************************************************
文件名稱:Candidate.cpp
作 者:zz
備 注:候選人的實現文件
創建時間:2012-4-1
修改歷史:2012-4-5
版權聲明:CSDN
***************************************************/
#include "Candidate.h"
#include "Voter.h"
#include "PersonSet.h"
#include "Person.h"
#include <ostream>
#include <string>
using namespace std;
//初始化 總候選人的個數
int Candidate::_numCandidates=0;
/*******************************************
函數名稱:PersonSet& Candidate::getPersonSet()
函數功能:PersonSet對象的get方法
傳入參數:N/A
返回 值 :N/A
********************************************/
PersonSet& Candidate::getPersonSet(){
return _votorSet;
}
/*******************************************
函數名稱: Candidate(string name="lisi",int age=5,int salary=1222);
函數功能:帶參構造函數
傳入參數:N/A
返回 值 :N/A
********************************************/
Candidate:: Candidate(string name,int age,double salary):Person(name,age,salary)
{
_numCandidates++;
}
/*******************************************
函數名稱: int getVotesNum();
函數功能:當前選舉人所得到的票數
傳入參數:N/A
返回 值 :N/A
********************************************/
int Candidate:: getVotesNum(){
//static int s=0;
int size= (_votorSet).size();
return size;
}
/*******************************************
函數名稱: void AddVoter(Voter& aVoter);
函數功能:得到選舉人所給的票,記住給當前候選人投票人的信息
傳入參數:N/A
返回 值 :N/A
********************************************/
void Candidate:: AddVoter(Voter& aVoter){
(_votorSet).add(aVoter);
}
/*******************************************
函數名稱: int getAverageVotersAge();
函數功能:獲取所以給當前候選人投票的所有選舉人的平均年齡
傳入參數:N/A
返回 值 :N/A
********************************************/
double Candidate:: getAverageVotersAge(){
int sumAge=0;
int sum=Voter::_totalNumVoters;//每位候選人得到的總票數
for(int i=0;i<sum;i++){
//Voter& v = static_cast<Voter&>(_votorSet.nextElement());
//sumAge+=v.nextElement().getAge();
sumAge+=_votorSet.nextElement().getAge();
}
average_age=sumAge/sum;
return average_age;
}
/*******************************************
函數名稱: int getAverageVotersSalary();
函數功能:獲取所以給當前候選人投票的所有選舉人的平均薪資
傳入參數:N/A
返回 值 :N/A
********************************************/
double Candidate:: getAverageVotersSalary(){
double sumSalary=0;
int sum=Voter::_totalNumVoters;//每位候選人得到的總票數
for(int i=0;i<sum;i++){
PersonSet _votorSet;
//Voter& v = static_cast<Voter&>(_votorSet.nextElement());
//sumSalary+=v.getSalary();
sumSalary+=_votorSet.nextElement().getSalary();
}
average_salary = sumSalary/sum;
return average_salary;
}
/*******************************************
函數名稱: static int Candidates();
函數功能:獲取所有的候選人個數
傳入參數:N/A
返回 值 :N/A
********************************************/
//得到參加比賽的候選人的數量
int Candidate:: Candidates()
{
return _numCandidates;
}
/*******************************************
函數名稱:bool operator<(Candidate& a,Candidate& b);
函數功能:重載運算符,判斷是否a<b
傳入參數:N/A
返回 值 :N/A
********************************************/
bool operator<(Candidate& a,Candidate& b){
bool flag=true;
if(a.getVotesNum()>b.getVotesNum()){
flag=false;
}
return flag;
}
/*******************************************
函數名稱:ostream& operator<<(ostream& ,Person&)
函數功能:輸出運算符重載函數 www.2cto.com
傳入參數:N/A
返回 值 :N/A
********************************************/
ostream& operator<<(ostream& out,Candidate& c){
if(c.getVotesNum()==0){
cout<<"There are no voters !!!!"<<endl;
}
out<<c.getName()<<endl;
return out;
}
/***************************************************
文件名稱:PersonSet.h
作 者:zz
備 注:PersonSet的頭文件
創建時間:2012-4-1
修改歷史:2012-4-5
版權聲明:CSDN
***************************************************/
#ifndef _PersonSet_H
#define _PersonSet_H
#include "Person.h"
class Voter;
class Candidate;
class PersonSet{
protected:
//定義Person二級指針
Person** _elements;
//容量的大小
int _capacity;
//實際大小
int _size;
//指向
int _index;
public:
/*******************************************
函數名稱:PersonSet();
函數功能:默認構造函數
傳入參數:N/A
返回 值 :N/A
********************************************/
PersonSet();
// PersonSet(Person& p);
/*******************************************
函數名稱: PersonSet(PersonSet& p);
函數功能:拷貝構造函數
傳入參數:N/A
返回 值 :N/A
********************************************/
PersonSet(const PersonSet& p);
/*******************************************
函數名稱: const PersonSet& operator=(const PersonSet& p);
函數功能:賦值運算符重載
傳入參數:N/A
返回 值 :N/A
********************************************/
const PersonSet& operator=(const PersonSet& p);
/*******************************************
函數名稱: void add(Person& element);
函數功能:添加元素
傳入參數:N/A
返回 值 :N/A
********************************************/
void add(Person& element);
/*******************************************
函數名稱:Person& nextElement();
函數功能:遍歷元素
傳入參數:N/A
返回 值 :N/A
********************************************/
Person& nextElement();
/*******************************************
函數名稱:Person& removeElement();
函數功能:刪除元素,從後向前,依次刪除
傳入參數:N/A
返回 值 :N/A
********************************************/
Person& removeElement();
/*******************************************
函數名稱:Person& removeElement(int index);
函數功能:刪除指定元素
傳入參數:N/A
返回 值 :N/A
********************************************/
Person& removeElement(int index);
/*******************************************
函數名稱:int size();
函數功能:得到實際的個數
傳入參數:N/A
返回 值 :N/A
********************************************/
int size();
/*******************************************
函數名稱: void print();
函數功能:print功能
傳入參數:N/A
返回 值 :N/A
********************************************/
void print()const;
/*******************************************
函數名稱: void reset();
函數功能:重置_index=0
傳入參數:N/A
返回 值 :N/A
********************************************/
void reset();
/*******************************************
函數名稱: ~PersonSet();
函數功能:析構函數
傳入參數:N/A
返回 值 :N/A
********************************************/
~PersonSet();
/*******************************************
函數名稱: Person& operator[](int x);
函數功能:重載下標運算符
傳入參數:N/A
返回 值 :N/A
********************************************/
Person& operator[](int x);
/*******************************************
函數名稱: const Person& operator[](int x)const;
函數功能:重載不可修改的下標運算符
傳入參數:N/A
返回 值 :N/A
********************************************/
const Person& operator[](int x)const;
};
#endif
/***************************************************
文件名稱:PersonSet.cpp
作 者:zz
備 注:PersonSet的實現文件
創建時間:2012-4-1
修改歷史:2012-4-5
版權聲明:CSDN
***************************************************/
#include "PersonSet.h"
using namespace std;
#include <iostream>
#include <string>
#include "Person.h"
/*******************************************
函數名稱:PersonSet();
函數功能:默認構造函數
傳入參數:N/A
返回 值 :N/A
********************************************/
PersonSet::PersonSet(){
_size=0;
_capacity=4;
_index=0;
_elements=new Person*[_capacity];
}
// PersonSet:: PersonSet(Person& p){
// }
/*******************************************
函數名稱: void add(Person& element);
函數功能:添加元素
傳入參數:N/A
返回 值 :N/A
********************************************/
void PersonSet::add(Person& element){
if(_size==_capacity){
Person** temp= _elements;
_elements=new Person*[_capacity*2];
for(int i=0;i<_size;i++){
_elements[i]=temp[i];
}
_capacity*=2;
delete []temp;
}
_elements[_size++]=&element;
}
/*******************************************
函數名稱:Person& nextElement();
函數功能:遍歷元素
傳入參數:N/A
返回 值 :N/A
********************************************/
Person& PersonSet::nextElement(){
if(_index>_size){
_index=0;
}
return *(_elements[_index++]);
}
/*******************************************
函數名稱:Person& removeElement();
函數功能:刪除元素,從後向前,依次刪除
傳入參數:N/A
返回 值 :N/A
********************************************/
Person& PersonSet::removeElement(){
if(_size==0){
cout<<"對象為空,不能刪除!"<<endl;
exit(1);
}
_size--;
Person* p = _elements[_size];
if(_size<_capacity/2){
Person** temp=_elements;
_elements=new Person*[_capacity/2];
for(int i=0;i<_size;i++){
_elements[i]=temp[i];
}
_capacity/=2;
delete [] temp;
}
return *p;
}
/*******************************************
函數名稱:Person& removeElement(int index);
函數功能:刪除指定元素
傳入參數:N/A
返回 值 :N/A
********************************************/
Person& PersonSet::removeElement(int index){
if(index>=_size){
cout<<"輸入有錯!"<<endl;
}
_size--;
Person* p = _elements[index];
if(_size<_capacity/2){
Person** temp=_elements;
_elements=new Person*[_capacity/2];
for(int i=0;i<_size;i++){
_elements[i]=temp[i];
}
_capacity/=2;
delete [] temp;
}
return *p;
}
/*******************************************
函數名稱:int size();
函數功能:得到實際的個數
傳入參數:N/A
返回 值 :N/A
********************************************/
int PersonSet::size(){
return _size;
}
/*******************************************
函數名稱: void print();
函數功能:print功能
傳入參數:N/A
返回 值 :N/A
********************************************/
void PersonSet::print()const{
for(int i=0;i<_size;i++){
(*_elements[i]).print();
printf("\n");
}
}
/*******************************************
函數名稱: void reset();
函數功能:重置_index=0
傳入參數:N/A
返回 值 :N/A
********************************************/
void PersonSet::reset(){
_index=0;
}
/*******************************************
函數名稱: ~PersonSet();
函數功能:析構函數
傳入參數:N/A
返回 值 :N/A
********************************************/
PersonSet::~PersonSet(){
delete [] _elements;
}
/*******************************************
函數名稱: Person& operator[](int x);
函數功能:重載下標運算符
傳入參數:N/A
返回 值 :N/A
********************************************/
Person& PersonSet::operator[](int x){
return *(_elements[x]);
}
/*******************************************
函數名稱: const Person& operator[](int x)const;
函數功能:重載不可修改的下標運算符
傳入參數:N/A
返回 值 :N/A
********************************************/
const Person& PersonSet::operator[](int x)const{
return *(_elements[x]);
}
/*******************************************
函數名稱: PersonSet(PersonSet& p);
函數功能:拷貝構造函數
傳入參數:N/A
返回 值 :N/A
********************************************/
PersonSet::PersonSet(const PersonSet& p){
_capacity=p._capacity;
_size=p._size;
_index=p._index;
_elements=new Person*[_size];
for(int i=0;i<_size;i++){
_elements[i]=p._elements[i];
}
}
/*******************************************
函數名稱: const PersonSet& operator=(const PersonSet& p);
函數功能:賦值運算符重載
傳入參數:N/A
返回 值 :N/A
********************************************/
const PersonSet& PersonSet::operator=(const PersonSet& p){
if(this!=&p){
_capacity=p._capacity;
_size=p._size;
_index=p._index;
delete [] _elements;
_elements=new Person*[_size];
for(int i=0;i<_size;i++)
{
_elements[i]=p._elements[i];
}
}
return *this;
}
Main.cpp
#include <iostream>
using namespace std;
#include "Voter.h"
#include "Candidate.h"
#include "PersonSet.h"
#include "Person.h"
int main(int argc, char *argv[])
{
//創建選舉人
Voter *v1 = new Voter("John", 20, 6000.0,1);
Voter *v2 = new Voter("Frank", 26, 30000.0,2);
Voter *v3 = new Voter("Anna", 20, 199600.0,1);
Voter *v4 = new Voter("James", 67, 9600.0,2);
Voter *v5 = new Voter("Jane", 40, 29600.0,3);
//創建候選人
Candidate *c1 = new Candidate("April", 67, 9600.0 );
Candidate *c2 = new Candidate("May", 40, 29600.0);
Candidate *c3 = new Candidate("June", 40, 29600.0);
srand(time(NULL));
PersonSet voters;
voters.add(*v1);
voters.add(*v2);
voters.add(*v3);
voters.add(*v4);
voters.add(*v5);
PersonSet candidates;
candidates.add(*c1);
candidates.add(*c2);
candidates.add(*c3);
int numVoters = voters.size();
voters.reset();
cout << "number of voters = " << numVoters << "\n";
for(int i = 0; i<numVoters; i++)
{
Voter& voter = static_cast<Voter&>(voters.nextElement());
cout << voter << "\n";
}
voters.reset(); // Set the index zero
cout << "voting = \n";
for(int i = 0; i<numVoters; i++)
{
Voter& v = static_cast<Voter&>(voters.nextElement());
// choose a candidate
Candidate& chosenCandidate = static_cast<Candidate&>(v.SelectCadidate(candidates));
v.Vote(chosenCandidate);
}
/*
for(int a=0;a<candidates.size();a++){
for(int b=++a;b<candidates.size();b++){
Candidate* p,q;
if((p=&static_cast<Candidate&>(candidates[a]))->getVotesNum()==(q=&static_cast<Candidate&>(candidates[b]))){
}
}
}
*/
cout<<"April:"<<c1->getVotesNum()<<endl;
cout<<"May:"<<c2->getVotesNum()<<endl;
cout<<"June:"<<c3->getVotesNum()<<endl;
cout<<"voters.size()="<<voters.size()<<endl;
cout<<"Voter::_totalNumVoters="<<Voter::_totalNumVoters<<endl;
if (voters.size() != Voter::_totalNumVoters)
{
cout <<" Not all voters voted !!!!" << endl ;
}
else
{
cout <<" Success: 100% voted" << endl;
}
Candidate* winner = static_cast<Candidate*>(&candidates[0]);
for ( int i=0; i<candidates.size(); i++ )
{
if ( *winner < *(static_cast<Candidate*>(&candidates[i]) ))
{
winner = static_cast<Candidate*>(&candidates[i]);
}
}
if(winner->getVotesNum() == 2)
{
PersonSet ps;
for(int i = 0 ; i < candidates.size() ; i++)
{
Candidate * p;
if(( p = &static_cast<Candidate&>(candidates[i]))->getVotesNum() == 2)
{
ps.add(*p);
}
}
for(int j=0;j<numVoters;j++){
Voter& v = static_cast<Voter&>(voters.nextElement());
// choose a candidate
Candidate& chosenCandidate = static_cast<Candidate&>(v.SelectCadidate(ps));
v.Vote(chosenCandidate);
}
cout<<"twice Vote:"<<endl;
Candidate* winner = static_cast<Candidate*>(&ps[0]);
for ( int i=0; i<ps.size(); i++ )
{
if ( *winner < *(static_cast<Candidate*>(&ps[i]) ))
{
winner = static_cast<Candidate*>(&ps[i]);
}
}
cout << " the winner is : " << *winner<<endl;
cout<<"winner:"<<winner->getVotesNum()-2<<endl;
}else{
cout << " the winner is : " << *winner<<endl;
}
delete v1;
delete v2;
delete v3;
delete v4;
delete v5;
delete c1;
delete c2;
delete c3;
return 0;
}
linux環境編譯時所用到的文件
makefile 文件
###############################################################################
#
# Generic Makefile for C/C++ Program
#
# Author:
# Date:
# Description:
# The makefile searches in <SRCDIRS> directories for the source files
# with extensions specified in <SOURCE_EXT>, then compiles the sources
# and finally produces the <PROGRAM>, the executable file, by linking
# the objectives.
# Usage:
# $ make compile and link the program.
# $ make objs compile only (no linking. Rarely used).
# $ make clean clean the objectives and dependencies.
# $ make cleanall clean the objectives, dependencies and executable.
# $ make rebuild rebuild the program. The same as make clean && make all.
#==============================================================================
CFLAGS = -g
EXE = a.out
.SUFFIXES = .c .o .cpp
.c.o:
gcc -c $(CFLAGS) $<
.cpp.o:
g++ -c $(CFLAGS) $<
SOURCE = Person.h Person.cpp Voter.h Voter.cpp Candidate.h Candidate.cpp PersonSet.h PersonSet.cpp main.cpp
OBJECTS = ${SOURCE:.cpp=.o}
$(EXE): ${OBJECTS}
g++ $(CFLAGS) -o $@ $(OBJECTS)
all: $(EXE)
clean:
rm $(EXE) *.o
### End of the Makefile ## Suggestions are welcome ## All rights reserved ###
摘自 asdfqwer1314的專欄