C語(yǔ)言示例講解do?while循環(huán)語(yǔ)句的用法
1、do while()循環(huán)-先執(zhí)行后判斷
do語(yǔ)句的語(yǔ)法
do
循環(huán)語(yǔ)句;
while(表達(dá)式);
此處的循環(huán)語(yǔ)句可能不是一條語(yǔ)句,而是一段代碼。
示例:利用do while循環(huán)實(shí)現(xiàn)打印1-10
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ",i);
i++;
} while (i <= 10);
return 0;
}
打印結(jié)果為:1 2 3 4 5 6 7 8 9 10
執(zhí)行流程:

2、do while中的break以及continue
#include <stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
break;
printf("%d ",i);
i++;
} while (i <= 10);
return 0;
}
打印結(jié)果為:1 2 3 4
將代碼中的break換成continue的時(shí)候,查看運(yùn)行結(jié)果,可以看到:1 2 3 4 _(4后面的光標(biāo)持續(xù)閃爍),因?yàn)樗鼤?huì)跳過(guò)continue后面的部分,直接來(lái)到while中的判斷部分,判斷是否<=10,滿足條件,又返回回去執(zhí)行do語(yǔ)句,但是它等于5,就會(huì)又跳過(guò)continue后面的語(yǔ)句,又去判斷while里面的條件是否滿足,滿足就又進(jìn)去do語(yǔ)句,等于5跳過(guò)continue后面的語(yǔ)句,如此循環(huán)往復(fù),所以會(huì)出現(xiàn)光標(biāo)閃爍的情況。
do語(yǔ)句的特點(diǎn):循環(huán)至少執(zhí)行一次,使用的場(chǎng)景有限,所以不是經(jīng)常使用。
3、練習(xí)
利用循環(huán)語(yǔ)句(while、for、do while)來(lái)完成下面的練習(xí)。
/練習(xí)一:計(jì)算n的階乘//
自己寫的代碼如下:
利用for循環(huán)語(yǔ)句:
n這個(gè)數(shù)字自己來(lái)鍵入,從1開(kāi)始作乘法,每次乘的數(shù)加一,直到乘到鍵入的數(shù)字n為止,打印此時(shí)的mux值。
int main()
{
int n = 0;
int i = 0;
int mux = 1;
scanf("%d",&n);
for (i = 1; i<n; i++)
{
mux *= (i + 1);
}
printf("mux = %d ",mux);
return 0;
}
運(yùn)行結(jié)果如下:
比如5!=1x2x3x4x5=120,測(cè)試結(jié)果正確。
5
mux = 120
利用while語(yǔ)句實(shí)現(xiàn)
int main()
{
int i = 0;
int n = 0;
int mux = 1;
scanf("%d",&n);
while (i < n)
{
i++;
mux *= i;
}
printf("mux=%d",mux);
return 0;
}
測(cè)試運(yùn)行結(jié)果:
8
mux=40320
利用do while語(yǔ)句
int main()
{
int i = 0;
scanf("%d", &i);
int mux = i;
do
{
mux *= (i-1);
i--;
if (i != 1)
continue;
printf("mux=%d ", mux);
} while ((i -1) != 0);
return 0;
}
測(cè)試結(jié)果如下:
6
mux=720
//練習(xí)二:計(jì)算1!+2!+ …+10!///
這里的第一個(gè)for循環(huán)里面將條件設(shè)置為m<5,意思是求1!+2!+3!+4!的值來(lái)測(cè)試一下
//其實(shí)是循環(huán)嵌套
int main()
{
int m = 0;
int i = 0;
int mux = 1;
int sum = 0;
for (m = 1; m < 5; m++)
{
for (i = 1; i <= m; i++)
{
mux *= i ;
}
//printf("mux = %d\n",mux);
sum += mux;
}
printf("sum = %d",sum);
return 0;
}
運(yùn)行結(jié)果為303

如何修正程序呢?在每一次求階乘之前,都應(yīng)該將mux的值置為1.
mux = 1;//在第二個(gè)for語(yǔ)句上面加上這條語(yǔ)句 //意思是在每一次求階乘之前,讓mux的初始值為1
這樣程序就可以運(yùn)行成功,結(jié)果為33。
但是上述代碼的效率不太高,每一次計(jì)算階乘都是從1x1!,1x2!(都是從1開(kāi)始乘,直到乘到m)等開(kāi)始一步一步算,但是我們知道,2!=2x1!,3!=3x2!…,所以有:
//相對(duì)于上一段代碼,這段代碼更高效。
int main()
{
int i = 0;
int mux = 1;
int sum = 0;
for (i = 1; i <= 3; i++)
{
mux *= i ;
sum += mux;
}
printf("sum = %d",sum);
return 0;
}
/ 練習(xí)三:在一個(gè)有序數(shù)組中查找具體的某個(gè)數(shù)字n ///
編寫int binsearch(int x, int v[], int n);功能:在v[0]<=v[1]<=…<=v[n-1]的數(shù)組中查找x
題目的大意是:假如有一組數(shù)字[1 2 3 4 5 6 7 8 9 10],然后從這一組數(shù)字里面找出數(shù)字7.有個(gè)思路就是從頭到尾遍歷,直到找到為止。但是題目里面還有一個(gè)關(guān)鍵詞語(yǔ)“有序”,如果采用從前往后遍歷的方法程序處理效率就太低了。采用什么方法比較合理呢?采用二分查找比較高效一些。

第四步:這個(gè)范圍它的左下標(biāo)是6,右下標(biāo)也是6,左右下標(biāo)的平均值還是6,所以由6所確定的下標(biāo)對(duì)應(yīng)的元素剛好是7,就是所要找的元素。如果這時(shí)候的數(shù)字“7”還不是我們要找的數(shù)字的時(shí)候,那在這個(gè)數(shù)組里就找不到要找的元素了。
按照這種尋找元素的辦法,最壞的情況下找了四次就找到了,而如果從前往后遍歷的話最壞的情況下需要找10次,可見(jiàn)折半查找(二分查找)的效率是很高的。它所需要的查找的次數(shù)為log2n次。
這種方法就在于不斷更新查找范圍的左值和右值。
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int k = 7;//要查找的數(shù)字
//在arr這個(gè)有序數(shù)組中查找k的值
int sz = sizeof(arr) / sizeof(arr[0]);//求出數(shù)組的元素個(gè)數(shù)以此來(lái)確定查找范圍的下標(biāo)右值
int left = 0;
int right = sz - 1;
int mid;
while (left <= right)
{
int mid = (left + right) / 2;//第一次進(jìn)來(lái)的時(shí)候,數(shù)組元素中間值是arr[4]
if (arr[mid] < k)
{
left = mid + 1;//范圍舍去左邊一半,從arr[5]開(kāi)始
}
else if (arr[mid] > k)
{
right = mid - 1;//范圍舍去右半邊,到arr[3]結(jié)束
}
else
{
printf("找到了,下標(biāo)為:%d\n",mid);
break;//找到元素之后就跳出循環(huán)
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
}運(yùn)行結(jié)果為:
找到了,下標(biāo)為:6
如果將k值改為17,再次運(yùn)行程序,運(yùn)行結(jié)果為“找不到”
//練習(xí)四:編寫代碼,展示多個(gè)字符從兩端移動(dòng),向中間匯聚
方法就是先設(shè)置一個(gè)和想要打印的字符串等長(zhǎng)的字符串?dāng)?shù)組,全部寫為*,然后用想要打印的字符串里面的字符去逐步替換數(shù)組2中的*,直到全部完整地將數(shù)組1打印出來(lái)為止。在這個(gè)過(guò)程中,左邊的下標(biāo)作加一操作,右邊的下標(biāo)作減一操作,就實(shí)現(xiàn)了從兩端向中間移動(dòng)的這個(gè)功能。
//比如打印 welcome to xi'an!!!
// *******************
// 每一次打印的時(shí)候都放進(jìn)去一對(duì)字符替換掉**
//第一次打?。簑************!
//第二次打?。簑e**********!!
#include <string.h>
#include <stdio.h>
int main()
{
char arr1[] = "welcome to xi'an!!!";
char arr2[] = "*******************";
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n",arr2);
left++;
right--;
}
return 0;
}運(yùn)行結(jié)果如下:
w*****************!
we***************!!
wel*************!!!
welc***********n!!!
welco*********an!!!
welcom*******'an!!!
welcome*****i'an!!!
welcome ***xi'an!!!
welcome t* xi'an!!!
welcome to xi'an!!!
將代碼中加入睡眠命令以及清空屏幕命令,可以在運(yùn)行結(jié)果窗口看到程序的“動(dòng)態(tài)”執(zhí)行效果。
#include <string.h>
#include <stdio.h>
#include <Windows.h>
int main()
{
char arr1[] = "welcome to xi'an!!!";
char arr2[] = "*******************";
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n",arr2);
Sleep(1000);//1000毫秒,也就是1秒,這樣我們就可以看到它逐步打印的過(guò)程了
system("cls");//清空屏幕
left++;
right--;
}
return 0;
}
///練習(xí)五:編寫代碼實(shí)現(xiàn)模擬用戶登錄情景,并且只能登錄三次(只允許輸入3次密碼),如果密碼正確,則提示登錄成功,如果三次均輸入錯(cuò)誤,則退出程序///
#include <string.h>
#include <stdio.h>
int main()
{
char arr[20] = { 0 };
//假設(shè)正確的密碼是字符串“2022”,如何比較呢
int m = 0;
for (m = 0; m < 3; m++)
{
printf("請(qǐng)輸入密碼:");
scanf("%s", arr);
//if (arr == "2022")//這樣的寫法是錯(cuò)誤的,兩個(gè)字符串比較不能使用==來(lái)比較
//應(yīng)該使用字符串函數(shù)strcmp
if(strcmp(arr,"2022")==0)
{
printf("密碼正確\n");
printf("進(jìn)入系統(tǒng)");
break;
}
else
{
printf("密碼錯(cuò)誤\n");
}
}
if (m == 3)
{
printf("退出系統(tǒng)\n");
}
return 0;
}
運(yùn)行結(jié)果如下:
請(qǐng)輸入密碼:2022
密碼正確
進(jìn)入系統(tǒng)
請(qǐng)輸入密碼:20201
密碼錯(cuò)誤
請(qǐng)輸入密碼:124r
密碼錯(cuò)誤
請(qǐng)輸入密碼:12345
密碼錯(cuò)誤
退出系統(tǒng)
4、猜數(shù)字游戲
寫一個(gè)猜數(shù)字游戲,這個(gè)游戲會(huì)
自動(dòng)產(chǎn)生一個(gè)1-100之間的隨機(jī)數(shù)然后去猜一下這個(gè)數(shù)字
如果猜對(duì)了,就會(huì)輸出恭喜猜對(duì)了
猜錯(cuò)了會(huì)告訴是猜大了還是小了,讓你繼續(xù)猜,直到才對(duì)為止
游戲可以一直玩,除非退出游戲

要解決這種問(wèn)題,應(yīng)該在調(diào)用rand函數(shù)之前調(diào)用srand函數(shù),這樣一來(lái)再次運(yùn)行程序的時(shí)候就發(fā)現(xiàn)第一次執(zhí)行的隨機(jī)數(shù)字是365而不是41了,但是再多執(zhí)行幾次,發(fā)現(xiàn)每次的值都是365,這就也不對(duì)了。

這就要求srand處的參數(shù)就是隨機(jī)的,是一直在發(fā)生變化的值,否則生成的隨機(jī)數(shù)也會(huì)是定值。時(shí)間是一直在發(fā)生變化的,就可以把時(shí)間放進(jìn)srand函數(shù)里面,這個(gè)地方傳進(jìn)去的實(shí)際上是時(shí)間戳。一番設(shè)置之后,發(fā)現(xiàn)雖然比較不一樣了,但是它們之間離得很近,甚至選擇的“1/0”數(shù)字太快的時(shí)候,它們甚至有可能生成的隨機(jī)值還是一樣的。因?yàn)閟rand確實(shí)應(yīng)該在rand之前調(diào)用,但是隨機(jī)數(shù)起點(diǎn)的設(shè)置只需要調(diào)用一次就可以了,不用開(kāi)始一次游戲game函數(shù)調(diào)用并設(shè)置一次。在整個(gè)工程里面設(shè)置一次就行了,把它放進(jìn)主函數(shù)里面就行。

修正過(guò)的:(生成的數(shù)字很隨機(jī)了)srand((unsigned int)time(NULL));(放在main函數(shù)里面)

想要生成1-100之間的隨機(jī)數(shù),可以將rand函數(shù)%100,0-32767的數(shù)字對(duì)100進(jìn)行取余之后的結(jié)果是0-99,然后加一,范圍就是1-100了
int random = rand()%100 +1;//%100的余數(shù)是0-99,再+1就是1-100

來(lái)吧,展示。代碼如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
void menu()
{
printf("***********************\n");
printf("***********************\n");
printf("****** 1.play *******\n");
printf("********0.exit*********\n");
printf("***********************\n");
printf("***********************\n");
}
void game()
{
//猜數(shù)字游戲,將猜數(shù)字的功能封裝到這個(gè)game函數(shù)里面去
//先生成隨機(jī)數(shù),用rand函數(shù),它需要的頭文件是stdlib.h
//srand(100);
//srand((unsigned int)time(NULL));
//時(shí)間---時(shí)間戳,時(shí)間轉(zhuǎn)換出來(lái)的一個(gè)數(shù)字
//(此時(shí)的時(shí)間相較于計(jì)算機(jī)的起始時(shí)間之間的差值,換算成以秒為單位的數(shù)字)
//用time函數(shù)(需要包含頭文件time.h)來(lái)獲取時(shí)間戳,time函數(shù)的返回類型是time_t,而time_t是64位的整型
//srand需要的是unsigned int 類型,那就將time的類型強(qiáng)制轉(zhuǎn)換一下
//int random = rand();
//查詢資料,可以發(fā)現(xiàn)rand函數(shù)返回了一個(gè)0-32767之間的數(shù)字
//但是這個(gè)數(shù)字不夠隨機(jī) 要在調(diào)用rand之前使用srand功能去設(shè)置隨機(jī)數(shù)的生成器
int random = rand() % 100 + 1;//%100的余數(shù)是0-99,再+1就是1-100
printf("%d\n", random);
int guess = 0;
while (1)
{
printf("猜數(shù)字:");
scanf("%d", &guess);
if (guess < random)
{
printf("猜小了\n");
}
else if (guess > random)
{
printf("猜大了\n");
}
else
{
printf("猜對(duì)了,恭喜\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();//打印菜單
printf("請(qǐng)選擇:");
scanf("%d", &input);
switch (input)
{
case 1:
//printf("猜數(shù)字\n");
game();
break;
case 0:
printf("退出游戲");
break;
default:
printf("輸入錯(cuò)誤,請(qǐng)重新選擇");
break;
}
} while (input);
return 0;
}運(yùn)行結(jié)果如下:

到此這篇關(guān)于C語(yǔ)言示例講解do while循環(huán)語(yǔ)句的用法的文章就介紹到這了,更多相關(guān)C語(yǔ)言do while循環(huán)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
本篇文章是對(duì)在c語(yǔ)言中用棧實(shí)現(xiàn)表達(dá)式求值的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
使用CMake構(gòu)建一個(gè)簡(jiǎn)單的C++項(xiàng)目的實(shí)現(xiàn)
CMake是一個(gè)跨平臺(tái)的自動(dòng)化構(gòu)建工具,可以用于構(gòu)建各種類型的項(xiàng)目,本文主要介紹了使用CMake構(gòu)建一個(gè)簡(jiǎn)單的C++項(xiàng)目,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
QT實(shí)現(xiàn)定時(shí)關(guān)閉消息提示框
這篇文章主要介紹了軟件利用Qt簡(jiǎn)單實(shí)現(xiàn)消息提示框可定時(shí)自動(dòng)關(guān)閉,文中的示例代碼講解詳細(xì),對(duì)我們;了解QT有一定的幫助,感興趣的可以學(xué)習(xí)一下2022-01-01
C語(yǔ)言指針之必須要掌握的指針基礎(chǔ)知識(shí)
這篇文章主要介紹了C語(yǔ)言指針必須要掌握的基礎(chǔ)知識(shí),文中實(shí)例講解的很清晰,有不太懂的同學(xué)可以研究下,希望能夠給你帶來(lái)幫助2021-09-09
C語(yǔ)言新建臨時(shí)文件和臨時(shí)文件名的方法
這篇文章主要介紹了C語(yǔ)言新建臨時(shí)文件和臨時(shí)文件名的方法,分別是mkstemp()函數(shù)和mktemp()函數(shù)的使用,需要的朋友可以參考下2015-08-08
C++中運(yùn)算符 &和&&、|和|| 的詳解及區(qū)別
這篇文章主要介紹了C++中運(yùn)算符 &和&&、|和|| 的詳解及區(qū)別的相關(guān)資料,這里舉例說(shuō)明該如何區(qū)別他們的不同,需要的朋友可以參考下2016-11-11
C++訪問(wèn)Redis的mset 二進(jìn)制數(shù)據(jù)接口封裝方案
這篇文章主要介紹了C++訪問(wèn)Redis的mset 二進(jìn)制數(shù)據(jù)接口封裝方案的相關(guān)資料,需要的朋友可以參考下2015-07-07

