C指針原理(38)-C快速入門
1-500以內的隨機整數=隨機整數%499+1
可借助stdlib.h中定義的srand函數來生成公式右邊所需要的隨機數,該函數需要一個數值做為產生隨機數的種子(也就是這個函數的唯一個參數),通常使用當前時間值作為參數,當前時間值可以通過time函數(以0做為參數調用,該函數在time.h中定義)。
比如下面代碼產生2個隨機整數:
#include?<stdio.h> #include?<stdlib.h> #include?<time.h> int?main() { ????srand((int)time(0)); ????printf("第一個隨機數:%d?第二個隨機數:%d\n",rand()%499+1,rand()%499+1); }
dp@dp:~/cquick?%?gcc?a.c?-o?mytest
dp@dp:~/cquick?%?./mytest
第一個隨機數:429?第二個隨機數:44
可將上面代碼組合成本程序的第一個自定義函數getnumber,供main函數調用。最後代碼如下:
#include?<stdio.h> #include?<stdlib.h> #include?<time.h> int?getnumber(){ ????????srand((int)time(0)); ????????return?rand()%499+1; } int?main(){ ????????int?mynum; ????????int?ispass=0; ????????while(1){ ????????printf("你好,請輸入一個數字:"); ????????scanf("%d",&mynum); ????????if?(mynum>500?||mynum<1){ ????????????????printf("數字僅限於1-500之間,請重新運行本程序!\n"); ????????} ????????else{ ????????????????printf("\n你輸入的數字是:%d\n",mynum); ????????????????break; ????????} ????????} ????????printf("number:%d\n",getnumber()); }
dp@dp:~/cquick?%?gcc?guessnum.c?-o?myguess
dp@dp:~/cquick?%?./myguess
你好,請輸入一個數字:55
你輸入的數字是:55
number:109
程序最後一個printf語句取得要猜的隨機整數後,輸出到屏幕,這只是測試(遊戲中可不能把結果告訴玩家,接下來,將對這個程序繼續完善,將去掉這個printf語句)。
(5)反復接受玩家輸入,只到數字猜中為止
C程序通過else?if語句塊可實現一組條件語句塊擁有多個不同的條件語句,它的使用形如:
if?(條件1){
.........
}
else?if(條件2){
..........
}
Else?if(條件3){
.........
}
......
......
Else?if(條件n){
.........
}
Else{
.........
}
實現這一步的功能使用了這個語句塊結構。?
#include?<stdio.h>
#include?<stdlib.h>
#include?<time.h>
int?getnumber(){
???? srand((int)time(0));
????????return?rand()%499+1;
}
int?main(){
int?mynum;
int?ispass=0;
int?guessnum=getnumber();
while?(1){
while(1){
printf("你好,請輸入一個數字:");
????????scanf("%d",&mynum);
if?(mynum>500?||mynum<1){
printf("數字僅限於1-500之間\n");
}
else{
printf("\n你輸入的數字是:%d\n",mynum);
break;
}
}
if?(mynum>guessnum){
printf("數字大了!\n");
}
????????else?if(mynum<guessnum){
printf("數字小了!\n");
}
else{
printf("祝賀您,您猜中了!\n");
break;
}
}
}
dp@dp:~/cquick?%?gcc?guessnum.c?-o?myguess
dp@dp:~/cquick?%?./myguess
你好,請輸入一個數字:55
你輸入的數字是:55
數字小了!
你好,請輸入一個數字:280
你輸入的數字是:280
數字小了!
你好,請輸入一個數字:350
你輸入的數字是:350
數字小了!
你好,請輸入一個數字:400
你輸入的數字是:400
數字小了!
你好,請輸入一個數字:488
你輸入的數字是:488
數字大了!
你好,請輸入一個數字:420
你輸入的數字是:420
數字小了!
你好,請輸入一個數字:450
你輸入的數字是:450
數字大了!
你好,請輸入一個數字:440
你輸入的數字是:440
數字大了!
你好,請輸入一個數字:430
你輸入的數字是:430
祝賀您,您猜中了!
(6)自動猜數算法
能不能讓電腦程序擁有智能,讓程序來猜數字呢?肯定可以,通過一定的算法就能實現。什麽是算法?
算法在中國古代文獻中稱為“術”,最早出現在《周髀算經》、《九章算術》。特別是《九章算術》,給出四則運算、最大公約數、最小公倍數、開平方根、開立方根、求素數的埃拉托斯特尼篩法,線性方程組求解的算法。三國代的劉徽給出求圓周率的算法:劉徽割圓術。
歐幾裏得算法被人們認為是史上第一個算法。第一次編寫程序是Ada?Byron於1842年為巴貝奇分析機編寫求解解伯努利微分方程的程序,因此Ada?Byron被大多數人認為是世界上第一位程序員。
算法的核心是創建問題抽象的模型和明確求解目標,之後可以根據具體的問題選擇不同的模式和方法完成算法的設計。
為了能讓程序實現自動猜數,必須假設一個前提:程序不知道要猜的數字,也就是說這個算法中只能與要猜的數字進行比較,而不能直接“知道”要猜的數字值。可將算法設計如下:
第一步,設數字範圍R為1-500。
第二步,取範圍R以內的中間值A,把A作為程序模仿人類猜測出的數字。
第三步,將猜測的數字A與被猜的結果B比較
(1)如果A>B,則將R的上限設為A,回到第二步。
(2)如果A<B,則R的下限設為A?,回到第二步。
(3)如果A=B,則退出程序,提示猜中數字,進入第四步。
第四步,在屏幕上輸出A和B,並提示猜中數字。
根據上面的算法來編寫以下程序:
#include?<stdio.h>
#include?<stdlib.h>
#include?<time.h>
//code:[email protected]
//date:2014-01-23
//未與作者書面聯系,請勿將本程序用於任何用途
int?getnumber(){
????????srand((int)time(0));
????????return?rand()%499+1;
}
int?main(){
????????int?mynum;
????????int?ispass=0;
????????int?guessnum=getnumber();
????????int?myrange[2]={1,500};
????????while?(1){
????????mynum=(myrange[0]+myrange[1])/2;
????????if?(mynum>guessnum){
????????????????printf("程序猜的數字為%d,數字大了!\n",mynum);
????????????????myrange[1]=mynum;
????????}
????????else?if(mynum<guessnum){
????????????????printf("程序猜的數字為%d,數字小了!\n",mynum);
????????????????myrange[0]=mynum;
????????}
????????else{
????????????????printf("程序猜的數字為%d,?被猜的數字為%d,猜中了!\n",mynum,guessnum);
????????????????break;
????????}?
????????}
}?
運行後,結果為:
dp@dp:~/cquick?%?gcc?guessnum.c?-o?myguess
dp@dp:~/cquick?%?./myguess
程序猜的數字為250,數字大了!
程序猜的數字為125,數字小了!
程序猜的數字為187,數字大了!
程序猜的數字為156,數字小了!
程序猜的數字為171,數字大了!
程序猜的數字為163,數字小了!
程序猜的數字為167,?被猜的數字為167,猜中了!
dp@dp:~/cquick?%?
C指針原理(38)-C快速入門