1. 程式人生 > >C指標原理(38)-C快速入門

C指標原理(38)-C快速入門

為增加遊戲的趣味性,待猜的數字可使用一個產生1-500以內的隨機整數,可按以下方式計算這個整數(%為取餘操作):

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);

}

[email protected]:~/cquick % gcc a.c -o mytest

[email protected]:~/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());

}

[email protected]:~/cquick % gcc guessnum.c -o myguess

[email protected]:~/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;

}

}

}

[email protected]:~/cquick % gcc guessnum.c -o myguess

[email protected]:~/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;

        } 

        }

} 

執行後,結果為:

[email protected]:~/cquick % gcc guessnum.c -o myguess

[email protected]:~/cquick % ./myguess

程式猜的數字為250,數字大了!

程式猜的數字為125,數字小了!

程式猜的數字為187,數字大了!

程式猜的數字為156,數字小了!

程式猜的數字為171,數字大了!

程式猜的數字為163,數字小了!

程式猜的數字為167, 被猜的數字為167,猜中了!

[email protected]:~/cquick %