欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言示例講解do?while循環(huán)語句的用法

 更新時間:2022年06月13日 16:08:36   作者:要努力丫!  
在不少實際問題中有許多具有規(guī)律性的重復操作,因此在程序中就需要重復執(zhí)行某些語句。一組被重復執(zhí)行的語句稱之為循環(huán)體,能否繼續(xù)重復,決定循環(huán)的終止條件

1、do while()循環(huán)-先執(zhí)行后判斷

do語句的語法

do
    循環(huán)語句;
while(表達式);

此處的循環(huán)語句可能不是一條語句,而是一段代碼。

示例:利用do while循環(huán)實現(xiàn)打印1-10

#include <stdio.h>
int main()
{
	int i = 1;
	do
	{
		printf("%d ",i);
		i++;
	} while (i <= 10);
	return 0;
}

打印結果為: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;
}

打印結果為:1 2 3 4

將代碼中的break換成continue的時候,查看運行結果,可以看到:1 2 3 4 _(4后面的光標持續(xù)閃爍),因為它會跳過continue后面的部分,直接來到while中的判斷部分,判斷是否<=10,滿足條件,又返回回去執(zhí)行do語句,但是它等于5,就會又跳過continue后面的語句,又去判斷while里面的條件是否滿足,滿足就又進去do語句,等于5跳過continue后面的語句,如此循環(huán)往復,所以會出現(xiàn)光標閃爍的情況。

do語句的特點:循環(huán)至少執(zhí)行一次,使用的場景有限,所以不是經常使用。

3、練習

利用循環(huán)語句(while、for、do while)來完成下面的練習。

/練習一:計算n的階乘//

自己寫的代碼如下:

利用for循環(huán)語句:

n這個數(shù)字自己來鍵入,從1開始作乘法,每次乘的數(shù)加一,直到乘到鍵入的數(shù)字n為止,打印此時的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;
}

運行結果如下:

比如5!=1x2x3x4x5=120,測試結果正確。

5

mux = 120

利用while語句實現(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;
}

測試運行結果:

8

mux=40320

利用do while語句

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

測試結果如下:

6

mux=720

//練習二:計算1!+2!+ …+10!///

這里的第一個for循環(huán)里面將條件設置為m<5,意思是求1!+2!+3!+4!的值來測試一下

//其實是循環(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;
}

運行結果為303

如何修正程序呢?在每一次求階乘之前,都應該將mux的值置為1.

mux = 1;//在第二個for語句上面加上這條語句
//意思是在每一次求階乘之前,讓mux的初始值為1

這樣程序就可以運行成功,結果為33。

但是上述代碼的效率不太高,每一次計算階乘都是從1x1!,1x2!(都是從1開始乘,直到乘到m)等開始一步一步算,但是我們知道,2!=2x1!,3!=3x2!…,所以有:

//相對于上一段代碼,這段代碼更高效。
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;
}

/ 練習三:在一個有序數(shù)組中查找具體的某個數(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.有個思路就是從頭到尾遍歷,直到找到為止。但是題目里面還有一個關鍵詞語“有序”,如果采用從前往后遍歷的方法程序處理效率就太低了。采用什么方法比較合理呢?采用二分查找比較高效一些。

第四步:這個范圍它的左下標是6,右下標也是6,左右下標的平均值還是6,所以由6所確定的下標對應的元素剛好是7,就是所要找的元素。如果這時候的數(shù)字“7”還不是我們要找的數(shù)字的時候,那在這個數(shù)組里就找不到要找的元素了。

按照這種尋找元素的辦法,最壞的情況下找了四次就找到了,而如果從前往后遍歷的話最壞的情況下需要找10次,可見折半查找(二分查找)的效率是很高的。它所需要的查找的次數(shù)為log2n次。

這種方法就在于不斷更新查找范圍的左值和右值。

int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int k = 7;//要查找的數(shù)字
	//在arr這個有序數(shù)組中查找k的值
	int sz = sizeof(arr) / sizeof(arr[0]);//求出數(shù)組的元素個數(shù)以此來確定查找范圍的下標右值
	int left = 0;
	int right = sz - 1;
	int mid;
	while (left <= right)
	{
		int mid = (left + right) / 2;//第一次進來的時候,數(shù)組元素中間值是arr[4]
		if (arr[mid] < k)
		{
			left = mid + 1;//范圍舍去左邊一半,從arr[5]開始
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;//范圍舍去右半邊,到arr[3]結束
		}
		else
		{
			printf("找到了,下標為:%d\n",mid);
			break;//找到元素之后就跳出循環(huán)
		}
	}
	if (left > right)
	{
		printf("找不到\n");
	}
	return 0;
}

運行結果為:

找到了,下標為:6

如果將k值改為17,再次運行程序,運行結果為“找不到”

//練習四:編寫代碼,展示多個字符從兩端移動,向中間匯聚

方法就是先設置一個和想要打印的字符串等長的字符串數(shù)組,全部寫為*,然后用想要打印的字符串里面的字符去逐步替換數(shù)組2中的*,直到全部完整地將數(shù)組1打印出來為止。在這個過程中,左邊的下標作加一操作,右邊的下標作減一操作,就實現(xiàn)了從兩端向中間移動的這個功能。

//比如打印 welcome to xi'an!!!
//         *******************
// 每一次打印的時候都放進去一對字符替換掉**
//第一次打?。簑************!
//第二次打?。簑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;
}

運行結果如下:

w*****************!
we***************!!
wel*************!!!
welc***********n!!!
welco*********an!!!
welcom*******'an!!!
welcome*****i'an!!!
welcome ***xi'an!!!
welcome t* xi'an!!!
welcome to xi'an!!!

將代碼中加入睡眠命令以及清空屏幕命令,可以在運行結果窗口看到程序的“動態(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秒,這樣我們就可以看到它逐步打印的過程了
		system("cls");//清空屏幕
		left++;
		right--;
	}
	return 0;
}

///練習五:編寫代碼實現(xiàn)模擬用戶登錄情景,并且只能登錄三次(只允許輸入3次密碼),如果密碼正確,則提示登錄成功,如果三次均輸入錯誤,則退出程序///

#include <string.h>
#include <stdio.h>
int main()
{
	char arr[20] = { 0 };
	//假設正確的密碼是字符串“2022”,如何比較呢
	int m = 0;
	for (m = 0; m < 3; m++)
	{
		printf("請輸入密碼:");
		scanf("%s", arr);
		//if (arr == "2022")//這樣的寫法是錯誤的,兩個字符串比較不能使用==來比較
		//應該使用字符串函數(shù)strcmp
		if(strcmp(arr,"2022")==0)
		{
			printf("密碼正確\n");
			printf("進入系統(tǒng)");
			break;
		}
			else
			{
				printf("密碼錯誤\n");
			}
	}
	if (m == 3)
	{
		printf("退出系統(tǒng)\n");
	}
	return 0;
}

運行結果如下:

請輸入密碼:2022
密碼正確
進入系統(tǒng)

請輸入密碼:20201
密碼錯誤
請輸入密碼:124r
密碼錯誤
請輸入密碼:12345
密碼錯誤
退出系統(tǒng)

4、猜數(shù)字游戲

寫一個猜數(shù)字游戲,這個游戲會

自動產生一個1-100之間的隨機數(shù)然后去猜一下這個數(shù)字

如果猜對了,就會輸出恭喜猜對了

猜錯了會告訴是猜大了還是小了,讓你繼續(xù)猜,直到才對為止

游戲可以一直玩,除非退出游戲

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

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

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

想要生成1-100之間的隨機數(shù),可以將rand函數(shù)%100,0-32767的數(shù)字對100進行取余之后的結果是0-99,然后加一,范圍就是1-100了

int random = rand()%100 +1;//%100的余數(shù)是0-99,再+1就是1-100

來吧,展示。代碼如下:

#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ù)字的功能封裝到這個game函數(shù)里面去
	//先生成隨機數(shù),用rand函數(shù),它需要的頭文件是stdlib.h
	//srand(100);
	//srand((unsigned int)time(NULL));
	//時間---時間戳,時間轉換出來的一個數(shù)字
	//(此時的時間相較于計算機的起始時間之間的差值,換算成以秒為單位的數(shù)字)
	//用time函數(shù)(需要包含頭文件time.h)來獲取時間戳,time函數(shù)的返回類型是time_t,而time_t是64位的整型
	//srand需要的是unsigned int 類型,那就將time的類型強制轉換一下
	//int random = rand();
	//查詢資料,可以發(fā)現(xiàn)rand函數(shù)返回了一個0-32767之間的數(shù)字
	//但是這個數(shù)字不夠隨機 要在調用rand之前使用srand功能去設置隨機數(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("猜對了,恭喜\n");
			break;
		}
	}
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();//打印菜單
		printf("請選擇:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			//printf("猜數(shù)字\n");
			game();
			break;
		case 0:
			printf("退出游戲");
			break;
		default:
			printf("輸入錯誤,請重新選擇");
			break;
		}
	} while (input);
	return 0;
}

運行結果如下:

到此這篇關于C語言示例講解do while循環(huán)語句的用法的文章就介紹到這了,更多相關C語言do while循環(huán)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論