目錄
一、計算N的階乘
二、計算1!+2!+......+10!
三、二分查找
四、模擬密碼登錄
五、猜數字游戲
一、計算N的階乘

我們來剖析這段代碼,想要求N的階乘,那么首先就要產生N個數字,產生N個數字我們可以想到用回圈的方式,在這里我們采用while回圈,定義三個整型變數 a n ret,并且將其初始化賦值,在這里不能賦值為0,因為0乘任何數都為0,首先要先輸入N,采用scanf函式輸入N,然后產生N個數字,假設我們求5的階乘,5!=1*2*3*4*5,我們可以理解為5!=4!*5以此往前推4!=3!*4,3!=2!*3,2!=1!*2,所以在while回圈體內部就是,ret=上一次ret的值,乘上調整之后的a,然后a進行一次調整,調整之后判斷是否小于等于n,如果成立再次回圈,直到a=n,
此時ret的值就是(n-1)!*n,也就是n的階乘,最后跳出回圈,輸出最后的ret,
二、計算1!+2!+......+10!

相加到10的階乘數值比較大,我們沒有辦法一下子判斷對錯,所以先用相加到3的階乘判斷一下,
代碼如上,這段程式在計算N的階乘基礎上略加改進,我們逐步剖析,首先要相加到3的階乘,那么就要產生1!,2!,3!我們先定義一個外部的for回圈,n從1開始,判斷部分為n<=3,調整部分n++,當n為1時,1<3為真,進入回圈,回圈體內部還是一個for回圈,a從1開始,a<=n,a++,此時a為1,n也為1判斷部分為真,進入內部for回圈體,之前定義過ret為1,ret = ret*a,可以求得當前ret為1,然后進入調整部分,a++為2,此時n為1,為假,跳出內部回圈,sum初步賦值為0,sum=sum+ret為1,進入外部for回圈的調整部分,n++為2,小于3為真 準備進入內部for回圈,進入前將ret初始化為1,對于此時的內部for回圈,a為1,n為2,ret為1,符合判斷條件,ret=ret*a也就是ret=1*1=1,然后進入調整部分a++為2,此時n也為2符合判斷,再次進入內部for回圈ret=ret*a=1*2=2,再調整a為3,此時n為2,跳出回圈,到了sum+=ret,此時ret為2,sum為1,所以最終sum為1+2為3,
這時該外部for回圈進行調整,n為3,符合判斷,進入內部回圈,ret初始化為1,對于內部for回圈,a=1,1<3成立,進入,ret = ret*a=1,a++,a為2,為真,ret=ret*a=2,調整,a++為3,為真,ret=ret*a=6,調整a,為假,跳出回圈,sum=sum+ret=3+6=9,再次調整n,為假,跳出外部for回圈,輸出sum,
希望大家在書寫這段代碼之后可以用F10來進行除錯,可以更直觀的感受代碼的邏輯,

以上的輸出就是相加到10!求得的數值,
三、二分查找

二分查找在計算機中是一個比較重要的演算法,二分查找也稱為折半查找, 下面通過決議上面的代碼來說明什么是二分查找,
想要在1-10這個有序陣列中快速的找到某個值,比如我們想要找到3,慢一點的方法是一個一個的尋找,如果需要我們在上萬個數字中找到6587呢?顯然一個一個的尋找不是好的辦法,我們可以通過二分查找,先找有序陣列中的一半,看和需要找的值是大還是小,如果大,就把后一半的數字全部拋掉,反之亦然,這樣會大大提高我們的效率,
那么找1-10的數字的時候也可以這樣查找,首先定義1-10的陣列,規定我們要找的數字是3,因為陣列都是通過下標訪問的,所以定義最左邊數字的下標為0,最右邊的下標為,整個陣列大小除以單個陣列元素大小然后減1,然后我們依靠mid來確定陣列,首先用(left+right)/2縮小一半的范圍,然后通過下標arr[mid]判斷和我們需要的數值是否相等,如果這一次找到的值大于我們需要的值,那么說明本次找到的值往右,包括這個值都舍棄,將right變為mid-1,從代碼來看最初mid為4,對應的arr[mid]為5,比我們需要的值偏大,所以從5往右的數字都舍棄,接下來從1 2 3 4這里面挑選 ,
然后再進行一次二分查找,left=0,right =3 mid=(left+right)/2=1 arr[1]=2和我們需要找的值偏小,于是將left改為mid+1 為2,arr[2]為3,那么剩下來就是需要我們從3和4兩個數字中尋找,
此時left=2 right=3 mid=(left+right)/2=2 arr[mid]=arr[2]=3和我們需要尋找的數字一樣,所以輸出找到了,
從上面的解釋來看,我們的一次又一次的查找其實就是一種回圈,我們參考while回圈,只有當left<=right的時候才有意義,當left>right的時候,就說明我們找不到這個數字了,
四、模擬密碼登錄
我們需要能夠模擬用戶輸入密碼,當密碼輸入正確的時候跳出程式,最多輸入三次密碼,第三次密碼錯誤的時候會退出程式,

首先,假設我們的密碼是123456,這是一個字串,所以用字符陣列來儲存密碼,因為密碼一共能輸入三次,我們設定一個for回圈,在回圈內部,密碼正確便會跳出回圈,密碼錯誤可以重新輸入,但只能回圈三次,在這里我們用scanf函式的時候,password沒有用取地址符號&,是因為陣列名本來就是地址,在判斷密碼是否正確的時候要注意,字串的判斷不能用password == “123456”這個樣子,我們需要參考庫函式strcmp,strcmp就是用來比較兩個字串是否相等的,

我們通過MSDN搜索strcmp的用法發現,當回傳值小于0時說明字串1小于字串2,當=0時,說明字串1等于字串2,當大于0時說明字串1大于字串2,
所以我們在程式中,如果判斷兩個字串對比后回傳的值等于0,說明兩個字串是一樣的,那么密碼輸入正確,否則就再次回圈,重新輸入,當密碼輸入超過三次時,也就是i == 3,就會跳出回圈,輸出登陸失敗,退出程式,
以上就是這個程式的大致思路,
五、猜數字游戲
我們需要撰寫一個猜數字游戲,要求電腦隨機輸出1-100的數字,并且我們輸入后可以提示數值偏大還是偏小,然后我們可以調整數值,當輸入正確的時候提示我們正確,并且可以多次回圈玩游戲,并且每次游戲內容都不一樣,
首先我們先寫函式的主函式部分,我們如果想要開發一款游戲,肯定要先有選單來告訴我們要做什么,所以不管三七二十一,我們先做,先有一個選單,然后呢,我們又需要多玩幾次游戲,這又是一個回圈,所以采用do while回圈最合適,那么我們在do陳述句部分先設定一個選單,我們用函式封裝的形式先設定一個選單menu(是一個函式),這個函式可以給我們一個界面,這個界面告訴我們輸入1是開始游戲,輸入0是退出游戲,那么我們就需要一個整型變數input,并且用scanf函式使我們能夠輸入0或1,當我們輸入0或1的時候就要有陳述句來對應,在這里我們可以用if陳述句,也可以用switch case陳述句,我們采用switch case 陳述句,當我們輸入1時,就對應選單界面的1,進入游戲,我們在這里也用game來封裝一個函式,輸入0,就會退出程式,當我們輸入非0和1時,會提示我們輸入錯誤,
接下來重點是封裝的game函式,在這個函式中,要求我們能夠隨機生成1-100的數字,并且可以生成很多次,每次生成的數字還不能相同,重點就是生成亂數,我們用庫函式rand

在MSDN中是這樣介紹rand函式的,生成一個偽亂數,

rand函式回傳一個范圍為0到RAND_MAX的偽隨機整數,在呼叫rand之前,使用srand函式為偽亂數生成器設定種子,
srand函式需要不斷的輸入一個變化的值,才能讓rand函式生成隨機值,生活中,時間時不斷變化的,所以我們給srand輸入的那個不斷變化的值就是時間,
任何時間都可以轉化為一個時間戳,時間是不斷變化的,所以時間戳也是不斷變化的,如果我們需要獲取時間戳,那么需要呼叫庫函式time
當我們把rand函式設定好后,存放在r里,然后將r和輸入的數值對比,并得出相應的提示,因為猜數字是一個回圈的程序,所以在while的判斷部分直接設定為1,非0,一直回圈,
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("**********************\n");
printf("********1.play********\n");
printf("********0.exit********\n");
printf("**********************\n");
}
void game()
{
int guess = 0;
int r = rand()%100+1;
while (1)
{
printf("猜數字:>");
scanf("%d", &guess);
if (guess < r)
{
printf("猜小了\n");
}
else if (guess > r)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜對了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請選擇 >");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("選擇錯誤,請重新輸入\n");
break;
}
}
while (input);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/344395.html
標籤:其他
上一篇:2021-11-01
下一篇:小游戲系列——微型整蠱惡作劇
