# c语言—15 循环语句do while()

## 1、do while()循环-------先执行后判断

do语句的语法

``````do
循环语句;
while(表达式);
``````

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

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

`do语句的特点：循环至少执行一次，使用的场景有限，所以不是经常使用。`

## 3、练习

/练习一：计算n的阶乘//

n这个数字自己来键入，从1开始作乘法，每次乘的数加一，直到乘到键入的数字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
mux = 120
``````

``````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
``````

``````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!///

``````//其实是循环嵌套
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 = %dn",mux);
sum += mux;
}
printf("sum = %d",sum);
return 0;
}
``````

``````mux = 1;//在第二个for语句上面加上这条语句
//意思是在每一次求阶乘之前，让mux的初始值为1
``````

``````//相对于上一段代码，这段代码更高效。
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;
}
``````

/ 练习三：在一个有序数组中查找具体的某个数字n ///

``````int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int k = 7;//要查找的数字
//在arr这个有序数组中查找k的值
int sz = sizeof(arr) / sizeof(arr[0]);//求出数组的元素个数以此来确定查找范围的下标右值
int left = 0;
int right = sz - 1;
int mid;
while (left <= right)
{
int mid = (left + right) / 2;//第一次进来的时候，数组元素中间值是arr[4]
if (arr[mid] < k)
{
left = mid + 1;//范围舍去左边一半，从arr[5]开始
}
else if (arr[mid] > k)
{
right = mid - 1;//范围舍去右半边，到arr[3]结束
}
else
{
printf("找到了，下标为:%dn",mid);
break;//找到元素之后就跳出循环
}
}
if (left > right)
{
printf("找不到n");
}
return 0;
}
``````

``````找到了，下标为:6
``````

//练习四：编写代码，展示多个字符从两端移动，向中间汇聚

``````//比如打印 welcome to xi'an!!!
//         *******************
// 每一次打印的时候都放进去一对字符替换掉**
//第一次打印：w************！
//第二次打印：we**********!!
#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("%sn",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!!!
``````

``````#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("%sn",arr2);
Sleep(1000);//1000毫秒，也就是1秒，这样我们就可以看到它逐步打印的过程了
system("cls");//清空屏幕
left++;
right--;
}

return 0;
}
``````

///练习五：编写代码实现模拟用户登录情景，并且只能登录三次（只允许输入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")//这样的写法是错误的，两个字符串比较不能使用==来比较
//应该使用字符串函数strcmp
if(strcmp(arr,"2022")==0)
{

printf("密码正确n");
printf("进入系统");
break;
}
else
{
printf("密码错误n");
}

}
if (m == 3)
{
printf("退出系统n");
}
return 0;
}
``````

``````请输入密码：2022

``````
``````请输入密码：20201

``````

## 4、猜数字游戏

• 自动产生一个1-100之间的随机数
• 然后去猜一下这个数字
如果猜对了，就会输出恭喜猜对了
猜错了会告诉是猜大了还是小了，让你继续猜，直到才对为止
• 游戏可以一直玩，除非退出游戏

`int random = rand()%100 +1;//%100的余数是0-99，再+1就是1-100`

## 来吧，展示。代码如下：

``````#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
{
printf("***********************n");
printf("***********************n");
printf("******  1.play  *******n");
printf("********0.exit*********n");
printf("***********************n");
printf("***********************n");
}

void game()
{
//猜数字游戏，将猜数字的功能封装到这个game函数里面去
//先生成随机数，用rand函数，它需要的头文件是stdlib.h
//srand(100);
//srand((unsigned int)time(NULL));
//时间---时间戳，时间转换出来的一个数字
//（此时的时间相较于计算机的起始时间之间的差值，换算成以秒为单位的数字）
//用time函数(需要包含头文件time.h)来获取时间戳,time函数的返回类型是time_t,而time_t是64位的整型
//srand需要的是unsigned int 类型，那就将time的类型强制转换一下
//int random = rand();
//查询资料，可以发现rand函数返回了一个0-32767之间的数字
//但是这个数字不够随机 要在调用rand之前使用srand功能去设置随机数的生成器
int random = rand() % 100 + 1;//%100的余数是0-99，再+1就是1-100
printf("%dn", random);
int guess = 0;
while (1)
{
printf("猜数字：");
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
{
printf("请选择：");
scanf("%d", &input);
switch (input)
{
case 1:
//printf("猜数字n");
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入错误，请重新选择");
break;
}
} while (input);
return 0;
}
``````

THE END