-
Notifications
You must be signed in to change notification settings - Fork 0
/
lottofix.cpp
76 lines (74 loc) · 4.09 KB
/
lottofix.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream> //宣告標頭檔 <iostream>
#include <iomanip> //宣告標頭檔 <iomanip>
#include <ctime> //宣告標頭檔 <ctime>
#include <cstdlib> //宣告標頭檔 <cstdlib>
using namespace std; //宣告名稱空間 std
int keyagain(int key,int *input){ //資料驗證函式_是否重複輸入(驗證項數上限 6項 )
for (int i=0;i<6;i++) if (key==*(input+i)) return 1; //重複執行 若有重複數字則回傳 1
return 0; //無重複則回傳 0
}
void lotto_check(int *input,int *balls,int spe,int &a,int &b){ //樂透對獎函式
a=0; //將a用於普通獎號中獎數計算 初始化為0
b=0; //將b用於特別獎號中獎數計算 初始化為0
for(int i=0;i<6;i++){ //for迴圈 載入自選獎號
for(int j=0;j<6;j++){ //for迴圈 核對開出獎號
if(*(input+i)==*(balls+j)) a++; //如果 自選獎號=開出獎號(普通) 則a+1
}
}
for(int i=0;i<6;i++){ //for迴圈 載入自選獎號
if(*(input+i)==spe) b++; //如果 自選獎號=開出獎號(特別) 則b+1
}
if(a==6) cout<<"---------------------------------頭獎!-----------------------------------------"; //輸出頭獎情形
else if(a==5 and b==1) cout<<"---------------------------------貳獎!-----------------------------------------"; //輸出貳獎情形
else if(a==5) cout<<"----------------------------參獎!-----------------------------------------"; //輸出參獎情形
else if(a==4 and b==1) cout<<"---------------------------------肆獎!-----------------------------------------"; //輸出肆獎情形
else if(a==4) cout<<"---------------------------------伍獎!-----------------------------------------"; //輸出伍獎情形
else if(a==3 and b==1) cout<<"---------------------------------陸獎!-----------------------------------------"; //輸出陸獎情形
else if(a==2 and b==1) cout<<"---------------------------------柒獎!-----------------------------------------"; //輸出柒獎情形
else if(a==3) cout<<"---------------------------------普獎!-----------------------------------------"; //輸出普獎情形
else cout<<"你沒中獎!"; //輸出沒中獎情形
}
int main(){ //主程式
int ra[50],*random=ra,*balls=random+1,*spe=balls+6,i,j,temp,key,in[6]={0,0,0,0,0,0},*input=in,a=0,b=0,c=0; //宣告變數、陣列、指標
system("color 0F"); //為方便使用者閱讀 將命令列介面色彩設定為 黑底白字
cout<<"大樂透模擬遊戲"<<endl<<"請依序輸入六個號碼,必須是1~49的數字,且不可重複。"<<endl; //輸出說明文字
j=0; //將j用於數字計數 初始化為0
while(*(input+5)==0){ //在第6個數字被輸入完畢前重複執行
cout<<"第"<<j+1<<"個數字:"; //顯示目前輸入項目
cin>>key; //鍵入值存入key
if(key<1 or key>49) cout<<"輸入的數字超出1~49的範圍,請重新輸入!"<<endl; //資料驗證:key範圍1~49?
else if (keyagain(key,input)) cout<<"已經輸入過這個數字,請重新輸入!"<<endl; //資料驗證:key是否重複輸入?
else{ //若資料驗證全數通過
*(input+j)=key; //將輸入值存入記憶體(input+j)
j++; //跳至下一個數
}
}
for(i=1;i<50;i++) *(random+i)=i; //亂數陣列初始化為1~49 (開獎用)
do{ //重複執行開獎程序
srand((unsigned int)time(NULL)); //初始化隨機亂數種子
for(i=1;i<50;i++){ //洗牌演算法
int ram=rand()%49+1; //取一隨機亂數ram介於1~49
temp=*(random+ram); //將 亂數陣列第ram項 存至 暫存變數 (交換步驟1)
*(random+ram)=*(random+i); //將 亂數陣列第i項 存至 亂數陣列第ram項 (交換步驟2)
*(random+i)=temp; //將 暫存變數 存回 亂數陣列第i項 (交換完成)
}
cout<<endl<<"本期你選的數字為:"; //輸出自選獎號說明文字
for(i=0;i<6;i++) cout<<setw(4)<<*(input+i); //輸出自選獎號
for(i=0;i<6;i++){ //氣泡排序法
for(j=0;j<5;j++){ //重複執行與他人比較
if(*(balls+j)>*(balls+j+1)){ //如果balls第j項比j+1項大 執行交換
temp=*(balls+j); //將 開出獎號第j項 存入 暫存變數 (交換步驟1)
*(balls+j)=*(balls+j+1); //將 開出獎號第j項 存入 開出獎號第j+1項 (交換步驟2)
*(balls+j+1)=temp; //將 暫存變數 存回 亂數陣列第i+1項 (交換完成)
}
}
}
cout<<endl<<"本期開出中獎號碼:"; //輸出開獎說明文字
for(i=0;i<6;i++) cout<<setw(4)<<*(balls+i); //輸出普通獎號
cout<<" 特別號:"<<*spe<<endl; //輸出特別號
lotto_check(input,balls,*spe,a,b); //進行對獎
cout<<endl<<"是否繼續開獎(1)是(2)否:"; //詢問是否繼續開獎
cin>>c; //鍵入值存入c
}while(c==1); //當c=1時重複執行開獎程序
system("pause"); //暫停程式
}