2007年5月21日

lottery.cpp

有人要的


// 比對樂透的程式 2007/5/21 18:0-18:59:15

//g++ -pipe -o p6 p6.cpp && p6





#include <iostream>

#include <cstdlib>

using namespace std;



const int debug=1;



const int GROUP_COUNT=6; // 一次幾組號碼

const int MAX_NUMBER=45; // 最大號碼:1~MAX_NUMBER



// 輸入號碼組 & 檢測錯誤函數

int* input_number(){

 int* nA=new int[GROUP_COUNT]; // 輸入號碼 array

 int* p=nA; // just a ptr

 int* r=new int[MAX_NUMBER]; // 為檢查輸入的號碼是否重複用

 const char* err=NULL; // 錯誤發生

 for(int i=0;i<GROUP_COUNT;i++,p++){

  cin>>*p;

  if(*p<1||*p>MAX_NUMBER)err="輸入錯誤號碼!"; // 檢查輸入範圍是否在 1~MAX_NUMBER

  if(r[*p]++>1)err="輸入重複樂透號碼!"; // 註記輸入的號碼並檢查

  if(err){

   cout<<err<<endl;delete r,nA;

   return NULL; // 傳回 NULL 表示錯誤

  }

 }

 delete r;

 int i;

 while(i=cin.get(),i!='\n'){

  if(i!=' '&&i!='\r'&&i!='\t'){

   cout<<"輸入超過 "<< GROUP_COUNT <<" 組號碼或錯誤資料! (error: "<<i<<")"<<endl;

   //return NULL;

  }

 }

 return nA;

}





// inverse sort

int compare_func(const void* a, const void* b){

 return *((int*)b)-*((int*)a);

}





int main(){



 cout << "輸入此回合得獎的 "<< GROUP_COUNT <<" 組號碼:" << endl;

 int goal[MAX_NUMBER]={0};

 {

  int* g=input_number(); // 呼叫輸入號碼組 & 檢測錯誤函數

  if(!g)return 2; // 錯誤發生

  int* p=g;

  for(int i=0;i<GROUP_COUNT;i++){

   goal[*p++]++; // 將中獎的號碼註記於goal,加快檢查速度。例如 goal[2]==1 表示有 2

  }

  delete g;

 }



 int count;

 cout << "輸入總共買了幾組號碼:" << endl;

 cin >> count;

 if(count<1){cout << "錯誤號碼:"<<count<<"!" << endl;return 6;}

 int* OK=new int[count];



 for(int i=0;i<count;i++){

  cout << "輸入你買的 "<< GROUP_COUNT <<" 組樂透號碼:" << endl;

  int* n=input_number(); // 呼叫輸入號碼組 & 檢測錯誤函數

  if(!n)return 8; // 錯誤發生

  for(int j=0;j<GROUP_COUNT;j++){

   OK[i]+=goal[n[j]];

  }

  delete n;

 }



 // 以quick排序法由大到小排序

 qsort(OK,count,sizeof(*OK),compare_func);



 // 輸出結果

 cout << "結果為:" << endl;

 for(int i=0;i<count;i++){

  cout << OK[i] << " ";

 }

 cout << endl;



 delete OK;



 return 0;

}


沒有留言: