亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言從猜數(shù)字游戲中理解數(shù)據(jù)結構

 更新時間:2022年04月15日 15:15:30   作者:ypandam  
猜數(shù)字是興起于英國的益智類小游戲,起源于20世紀中期,一般由兩個人或多人玩,也可以由一個人和電腦玩。游戲規(guī)則為一方出數(shù)字,一方猜,今天我們來用這個游戲案例理解數(shù)據(jù)結構

1 猜數(shù)字游戲-問題描述

這個游戲一點都不陌生,猜價格是一度很火的綜藝節(jié)目。很多老師也用這個案例作為課堂案例。在這里,我想把重點放到“思維層面上”,即:為什么要這樣寫代碼,就實現(xiàn)了猜數(shù)字游戲的功能。

我們先來說真人版的猜數(shù)字游戲:

A:心里默默出一個數(shù)字(約定一個范圍,假設[1-100]之間),開始猜把

B猜:50

A: 大了

B猜:25

A:小了

B猜:150

A:你違規(guī)了

B猜:30

A:猜對了!正確答案就是30!是否繼續(xù)猜?

B:需要

2 問題分析

從前面的真人版,換成人機版:

現(xiàn)實世界程序模擬實現(xiàn)途徑
A電腦 
心里默默出一個數(shù)字一個變量的值隨機數(shù)/手動在程序里悄悄定義的變量值/其他(總之就是你解決:產(chǎn)生一個數(shù)的方法)
B猜B敲鍵盤scanf掃描鍵盤
A說大了、小了、對了計算機判斷并輸出判斷結果if判斷
A和B之間的繼續(xù)猜重復事件循環(huán)

所謂“天下大事必做于易,天下難事必做于細”,

有了一個對現(xiàn)實問題的一個分析,你還可以把一個問題進行逐層簡化,然后再逐層豐富其功能:

1)猜一次

2)直到猜到為止

3)限定猜的次數(shù),并顯示當前是第幾次猜

4)處理特殊情況:如果你提前猜到了;如果你猜的數(shù)超出了范圍

5)猜更多的數(shù)

6)對游戲計時、一分鐘猜對得越多還可以設關卡

這樣,就會對一個較為綜合的問題,有了一個自己的方案,接下來就可以開始嘗試逐個擊破了。

3 問題解決

3.1 猜一次

用IPO的思維,繼續(xù)分析這種情況,其故事流程是不是這樣的:

// I:輸入

1)計算機:出一個數(shù)

2)用戶: 鍵盤輸一個數(shù)(猜)

3)計算機:獲得這個數(shù)

//處理并輸出

4)計算機:判斷這個數(shù)和自己出的數(shù)的大小關系

5)計算機:根據(jù)不同的關系,告訴你猜大了、小了、對了

6)計算機:告訴你正確答案

根據(jù)輸入與輸出,確定要定義的變量:計算機出的數(shù)、用于猜的數(shù)

程序員要做的:就是把上面的故事流程,用一種編程語言描述出來。

而故事的流程就是:算法;

編程語言描述出來的就是:程序

那么,我們就可以得到以下程序了:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
	int guess,magic;       //magic計算機想的數(shù)
	srand(time(NULL));     //用時間做種子,產(chǎn)生一個隨機數(shù)
	magic = rand()%100+1;    //隨機數(shù)落到1-100之間
	printf("guess a number:\n");     //用戶猜一個數(shù)
	scanf("%d",&guess);
	if(guess>magic)           //計算機判斷,并告訴你猜的情況
		printf("too big!\n");
	else if(guess<magic)
		printf("too small!\n");
	else
		printf("right!\n");
	printf("the right number is %d\n",magic);
	return 0;
}

3.2 直到猜到為止

接著上面的故事。

還要繼續(xù)猜:

1)計算機出的數(shù)是否應該變化? ——顯然,不能變,變了就作弊了

2)用戶還要繼續(xù)猜 —— 那么就還要再敲鍵盤、計算機還要繼續(xù)獲得這個數(shù)(3.1節(jié)代碼:Line9-10)

3)計算機還要繼續(xù)判斷——還要判斷大小關系(3.1節(jié)代碼:Line11-16)

因此,3.1節(jié)代碼Line9-16就應該反復做,循環(huán)體就確定了;

直到猜到為止: 循環(huán)條件則是magic!=guess

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
	int guess,magic;       
	srand(time(NULL));     
	magic = rand()%100+1;    
	do{       ///用戶和計算機判斷是循環(huán)體
		printf("guess a number:\n");  
		scanf("%d",&guess);
		if(guess>magic)         
			printf("too big!\n");
		else if(guess<magic)
			printf("too small!\n");
		else
			printf("right!\n");
	}while(guess!=magic);  //循環(huán)條件
	printf("the right number is %d\n",magic);
	return 0;
}
}

3.3 限定猜10次

循環(huán)結束條件就變?yōu)椋翰铝?0次結束

那么就需要一個計數(shù)器,每猜一次,計數(shù)器+1, 到10次,循環(huán)結束;

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
	int guess,magic;       
	int count=0;      //計數(shù)器,一次都還沒有猜,初始為0
	srand(time(NULL));     
	magic = rand()%100+1;   
	do{
	    count++;        //猜1次,計數(shù)器加1
		printf("the %dth: guess a number:\n",count);     //顯示第幾次猜    
		scanf("%d",&guess);
		if(guess>magic)           
			printf("too big!\n");
		else if(guess<magic)
			printf("too small!\n");
		else
			printf("right!\n");
	}while(count<=10);   //判斷猜到10次了沒有
	printf("the right number is %d\n",magic);
	return 0;
}

3.4 處理特殊情況

情況1:如果用于猜的范圍超出[1,100],給出提示

顯然,從鍵盤獲得用戶猜的數(shù)(3.3節(jié)代碼Line13)后,就應判斷:

—— a)是否超過了[1,100]的范圍,是,本次不判斷猜的情況,用戶重新猜下一次;

——b)否,則判斷用戶猜的情況。

情況2:如果不到10次就猜到了,提前結束循環(huán);

這就是代碼輸出“right!”的情況(3.3節(jié)代碼Line19),同時加上結束循環(huán)的語句break就ok。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
	int guess,magic;       
	int count=0;      
	srand(time(NULL));     
	magic = rand()%100+1;   
	do{
	    count++;        
		printf("the %dth: guess a number:\n",count);     
		scanf("%d",&guess);
		if(guess>100 ||guess<1)    //處理情況1
		{
			printf("You guess the number should be in the range [1,100]:\n");
			continue;      //跳過本次循環(huán)
		}
		if(guess>magic)           
			printf("too big!\n");
		else if(guess<magic)
			printf("too small!\n");
		else
		{
			printf("right!\n");
			break;             //處理情況2
		}
	}while(count<=10);   
	printf("the right number is %d\n",magic);
	return 0;
}

3.5 猜下一個數(shù)

分析:

1) 上一個數(shù)的猜,已經(jīng)結束;—— 3.4節(jié)代碼中的Line29

2) 詢問用戶,是否繼續(xù)進行游戲; ——輸出一條詢問語句

3) 輸入用戶的意愿; —— scanf輸入

4) 如果是,則繼續(xù)做游戲;否則游戲結束 ——新的循環(huán)是否繼續(xù)的條件

5) 重新給10次猜的機會 ——計數(shù)器清0

6) 計算機再重新想一個數(shù); ——3.4節(jié)代碼中的Line 8-9

7) 繼續(xù)猜; ——3.4節(jié)代碼中的Line 10-29

于是3.4節(jié)代碼的Line8-29是需要繼續(xù)作為新的循環(huán)的循環(huán)體。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
	int guess,magic;       
	int count;
	int reply=0;   //用戶是否繼續(xù)游戲
	do{
		count=0;               //每猜一個新的數(shù),計數(shù)器清0
		srand(time(NULL));      //重新產(chǎn)生一個新的數(shù)來猜 
		magic = rand()%100+1;   
		do{
			count++;        //猜1次,計數(shù)器加1
			printf("the %dth: guess a number:\n",count);         
			scanf("%d",&guess);
			if(guess>100 ||guess<1)
			{
				printf("You guess the number should be in the range [1,100]:\n");
				continue;
			}
			if(guess>magic)           
				printf("too big!\n");
			else if(guess<magic)
				printf("too small!\n");
			else
			{
				printf("right!\n");
				break;
			}
		}while(count<=10);   
		printf("the right number is %d\n",magic);
		printf("Is the game continue? 1(yes) or 0(no):\n"); //詢問是否繼續(xù)游戲
		scanf("%d",&reply);   //獲得用戶的意愿
	}while(reply==1);        //如果意愿是1,則繼續(xù)游戲;否則,整個程序結束
	return 0;
}

小結:

程序其實就是用計算機的語言,描述你要解決的問題。

所以,對初學者來說,學好程序有如下點:

1)學會把現(xiàn)實問題和計算機世界做一個抽象,如上面的表格

2)把一個大的問題逐層簡化

3)從小問題入手,層進式解決問題

當然,分析問題是整個過程的重點,切勿拿著個問題,就想著代碼怎么寫,算法才是程序的靈魂。

同學們還可以在上面代碼的基礎上,讓這個游戲的功能更加豐富,繼續(xù)加油吧!

到此這篇關于C語言從猜數(shù)字游戲中理解數(shù)據(jù)結構的文章就介紹到這了,更多相關C語言 數(shù)據(jù)結構內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 二維指針動態(tài)分配內存連續(xù)問題深入分析

    二維指針動態(tài)分配內存連續(xù)問題深入分析

    當我們定義一個二維指針時,如果需要存儲相應的數(shù)據(jù),就需要我們動態(tài)的分配內存,這時,有一點是需要注意的,分配內存的方法不同,內存的連續(xù)性也是不相同的
    2013-07-07
  • C++基于隨機數(shù)實現(xiàn)福彩雙色球的方法示例

    C++基于隨機數(shù)實現(xiàn)福彩雙色球的方法示例

    這篇文章主要介紹了C++基于隨機數(shù)實現(xiàn)福彩雙色球的方法,結合完整實例形式分析了C++隨機數(shù)算法的實現(xiàn)與使用技巧,需要的朋友可以參考下
    2017-06-06
  • 使用C語言順序表數(shù)據(jù)結構實現(xiàn)棧的代碼示例

    使用C語言順序表數(shù)據(jù)結構實現(xiàn)棧的代碼示例

    這篇文章主要給大家介紹了如何使用C語言順序表數(shù)據(jù)結構實現(xiàn)棧,文章通過代碼示例介紹的非常詳細,對大家的學習或工作有一定的參考價值,需要的朋友可以參考下
    2023-09-09
  • 基于Qt編寫全能播放組件的示例代碼

    基于Qt編寫全能播放組件的示例代碼

    這篇文章主要為大家詳細介紹了如何基于Qt編寫全能播放組件,可以支持ffmpeg2/3/4/5/6/Qt4/5/6,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-06-06
  • c語言中用位運算實現(xiàn)加法技巧介紹

    c語言中用位運算實現(xiàn)加法技巧介紹

    用位運算實現(xiàn)加法也就是計算機用二進制進行運算,32位的CPU只能表示32位內的數(shù),這里先用1位數(shù)的加法來進行,需要的朋友可以參考下
    2012-11-11
  • Qt5實現(xiàn)文本編輯器(附詳細代碼)

    Qt5實現(xiàn)文本編輯器(附詳細代碼)

    QT是一個跨平臺的GUI開發(fā)框架,我使用的QT5 C++版本的,本文主要介紹了Qt5實現(xiàn)文本編輯器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++中char*轉換為LPCWSTR的解決方案

    C++中char*轉換為LPCWSTR的解決方案

    最近在學習C++,遇到了一個char*轉換為LPCWSTR的問題,通過查找資料終于解決了,所以下面這篇文章主要介紹了C++中char*轉LPCWSTR的解決方案,文中通過詳細的示例代碼介紹的很詳細,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • c語言多進程tcp服務器示例

    c語言多進程tcp服務器示例

    這篇文章主要介紹了c語言多進程tcp服務器示例,多進程socket,epoll實現(xiàn)IO復用,需要的朋友可以參考下
    2014-03-03
  • C語言中單鏈表(不帶頭結點)基本操作的實現(xiàn)詳解

    C語言中單鏈表(不帶頭結點)基本操作的實現(xiàn)詳解

    鏈表是一種物理存儲結構上非連續(xù)、非順序的存儲結構,數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序實現(xiàn)的。本文主要和大家聊聊C語言中單鏈表(不帶頭結點)的基本操作,感興趣的小伙伴可以了解一下
    2022-11-11
  • typedef_struct與struct之間的區(qū)別

    typedef_struct與struct之間的區(qū)別

    本篇文章主要是對typedef struct與struct之間的區(qū)別進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12

最新評論