【C语言初阶】循环语句 —— dowhile语句
文章目录
4 do while
语句
4.1 do while
- 流程图
4.2 语法结构
//通用形式
do
statement//可以是一条简单句或复合语句
while(expression);//do while循环以分号结尾
//一般书写形式
do
{
循环语句
}while(表达式);
解释说明:
1 程序流执行到 do while
语句,循环体至少执行一次,然后再进行条件表达式的判断。
4.3 简单示例
代码示例:
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);//1 2 3 4 5 6 7 8 9 10
i++;
} while (i <= 10);
return 0;
}
解释说明:
1 do while
语句在循环体执行一次后才进行循环判断,所以整个循环至少执行一次。
4.4 do while
中的 break
和 continue
语句
4.4.1 break
语句
break
在do while
中的使用
代码示例:
#include<stdio.h>
int main()
{
//do while中的break语句
int i = 1;
do
{
if (5 == i)
break;
printf("%d ", i);//1 2 3 4
i++;
} while (i <= 10);
return 0;
}
解释说明:
1 执行 do while
语句,打印循环控制变量 i
的值,直到 i
变成5就执行 break
语句,终止循环。
4.4.2 continue
语句
continue
在do while
中的使用
代码示例:
#include<stdio.h>
int main()
{
//do while中的continue语句
int i = 1;
do
{
if (5 == i)
continue;
printf("%d ", i);//1 2 3 4 ... 死循环
i++;
} while (i <= 10);
return 0;
}
解释说明:
1 当循环控制变量 i
增长到5的时候,执行 continue
语句,程序流跳转到循环判断部分;
但是,循环控制变量 i
没有更新(i++
),这就导致了 i
仍是5,将继续重复执行 continue
语句;程序陷入了死循环。
5 循环结构练习题
5.1 练习1
计算n的阶乘
代码示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
//计算n的阶乘
int n = 0;
int mul = 1;
//输入n
scanf("%d", &n);
//计算n!
int i = 0;
for (i = 1; i <= n; i++)
{
mul *= i;
}
//打印n!
printf("%d的阶乘是:>%d\n", n, mul);
return 0;
}
解释说明:
1 程序执行后,先输入 n
,接着求 n!
,接着打印输出 n!
。
2 该程序中的循环控制变量 i
从1增长到 n
,再使用变量 mul
分别与它们相乘,达到阶乘的效果,最终得到 n!
。
因为在循环体内不能改变循环控制变量 i
,所以不通过 i
自乘获得 n!
;此时需要临时变量 mul
乘以从1增长到 n
的 i
,最终实现 n!
。
5.2 练习2
计算
1!+2!+3!+...+n!
代码示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
//计算 1!+2!+3!+...+n!
int n = 0;
int mul = 1;
int sum = 0;
//输入
scanf("%d", &n);
//计算
方法一
//int i = 0;
//int j = 0;
//for (i = 1; i <= n; i++)
//{
// mul = 1;
// for (j = 1; j <= i; j++)
// {
// mul *= j;
// }
// sum += mul;
//}
//方法二
int i = 0;
for (i = 1; i <= n; i++)
{
mul *= i;
sum += mul;
}
//输出
printf("sum = %d\n", sum);
return 0;
}
解释说明:
1 方法一:循环控制变量 j
控制内层循环执行 i
的阶乘,内层循环每次都是从1开始计算阶乘,内层循环执行后将 i!
(本次阶乘的结果)加起来,然后每次进入内层循环前将 mul
置为1。
2 方法二:每次进入 for
循环,mul
求得的都是此时 i
的阶乘,那么就可以使用变量 sum
将 i
每次变化后求得的阶乘加起来,最终的到所有阶乘之和 1!+2!+3!+...+n!
。
5.3 练习3
在一个有序数组中查找具体的某个数字n
代码示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
//在一个有序数组中查找具体的某个数字n
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);//数组长度
int k = 0;
//输入
scanf("%d", &k);
//查找目标数字
方法一:遍历数组,让数组元素与目标数字进行比较
//int i = 0;
//for (i = 0; i < sz; i++)
//{
// if (arr[i] == k)
// {
// printf("找到了,目标数字在数组中的下标是:>%d\n", i);
// break;
// }
//}
//if (i == sz)
//{
// printf("数组中没有目标数字!\n");
//}
//方法二:二分查找(折半查找)
int left = 0;//左下标
int right = sz - 1;//右下标
int mid = 0;//中间下标
while (left <= right)
{
//mid = (left + right) / 2;//加法数字过大可能会导致溢出
mid = left + (right - left) / 2;//计算中间下标
if (arr[mid] > k)//目标数字可能在mid左侧
{
right = mid - 1;//移动右下标
}
else if (arr[mid] < k)//目标数字可能在mid右侧
{
left = mid + 1;//移动左下标
}
else //目标数字在mid位置
{
printf("找到了,目标数字在数组中的下标是:>%d\n", mid);//打印目标数字出现的下标位置
break;//找到后就退出循环
}
}
if (left > right)//数组中没有目标数字
{
printf("数组中没有目标数字!\n");
}
return 0;
}
解释说明:
1 解法一就是遍历数组,让数组元素与目标数字进行比较,如果相等就输出目标数字所在数组下标位置,否则数组中就没有目标数字。
2 解法二是使用折半查找(二分查找),因为是有序序列,那么就可以利用左右下标和中间下标,每次能查找一半,提高了查找效率。
二分查找图示:
5.4 练习4
编写代码,演示多个字符从两端移动,向中间汇聚
代码示例:
#include<stdio.h>
#include<string.h>//strlen()
#include<Windows.h>//Sleep()
#include<stdlib.h>//system()
int main()
{
//编写代码,演示多个字符从两端移动,向中间汇聚
char arr1[] = "welcome to pokemon.";
char arr2[] = "###################";
int left = 0;
int right = strlen(arr1) - 1;
//int right = sizeof(arr1) / sizeof(arr1[0]) - 2;
//减2表示:1.去除末尾\0 2.下标从0开始,应减去1
printf("%s\n", arr2);
方法一:while实现
//while (left <= right)
//{
// arr2[left] = arr1[left];
// arr2[right] = arr1[right];
// left++;
// right--;
// Sleep(1000);//休眠1000毫秒 -> 1秒
// system("cls");//清屏操作
// printf("%s\n", arr2);
//}
//方法二:for实现
for (; left <= right; left++, right--)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
Sleep(1000);//休眠1000毫秒 -> 1秒
system("cls");//清屏操作
printf("%s\n", arr2);
}
return 0;
}
解释说明:
1 strlen(arr1)
:strlen
函数用来求字符串长度,原理是从给定地址开始向后计数直至遇到字符串结束标志(\0)就停止寻找。
2 Sleep(1000);
:程序会休眠1000毫秒(1秒),字符串打印看起来就会停顿。
3 system("cls");
:清屏操作,给人一种连续地播放效果。
4 使用库函数要包含相应的头文件:
#include<string.h>//strlen()
#include<windows.h>//Sleep()
#include<stdlib.h>//system()
5.5 练习5
编写代码,实现模拟用户登录情景,限定用户只能执行三次登录操作。(只允许输入三次密码,如果输入正确就提示登陆成功;如果三次输入均错误,就退出程序)
代码示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
//模拟用户登录情景,限定用户只能执行三次登录操作
char psw[10];
int i = 0;//限定3次
for (i = 0; i < 3; i++)
{
printf("请输入登录密码:>");
scanf("%s", psw);
//这里假定好密码是:abc123
if (strcmp(psw, "abc123") == 0)
{
printf("登陆成功!\n");
break;
}
else
{
printf("密码错误!\n");
}
}
if (3 == i)//输入三次密码均错误
printf("退出程序!\n");
return 0;
}
解释说明:
解释说明:
1 strcmp(psw, "abc123")
:strcmp(str1,str2)
字符比较函数;
比较的是两个字符串对应位置字符的 ASCII
值的大小;
将 str1
与 str2
两个字符串进行比较,该函数开始比较每个字符串的第一个字符;
如果它们彼此相等,则继续下一对比较,直到字符不同或达到空字符。
如果两个字符串相等,则返回0;如果 str1>str2
则返回 >0
的值;如果 str1<str2
则返回 <0
的值。
5.6 练习6
猜数字游戏
代码示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>//rand()、srand()
#include<time.h>//time()
void menu()
{
printf("************************\n");
printf("******** 1.play ********\n");
printf("******** 0.exit ********\n");
printf("************************\n");
}
void game()
{
//1.生成随机数种子
int random = rand() % 100 + 1;//0+1 ~ 99+1
//2.猜数字
int input = 0;
while (1)
{
printf("请输入猜测的数字:>");
scanf("%d", &input);
if (input > random)
{
printf("猜大了!\n");
}
else if (input < random)
{
printf("猜小了!\n");
}
else
{
printf("恭喜你,猜对了!\n");
break;
}
}
}
int main()
{
//猜数字游戏
//设置随机数生成起点,需要time函数返回一个时间戳
srand((unsigned int)time(NULL));//调用rand函数之前必须调用srand函数设置随机数生成器
int select = 0;
do
{
menu();//菜单界面
printf("请选择:>");
scanf("%d", &select);
switch (select)
{
case 1:
game();//游戏实现
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("选择错误,请重新输入!\n");
break;
}
} while (select);
return 0;
}
解释说明:
1 rand()
:rand
函数用来生成随机数种子,对生成的数字取模就确定了随机数的数字范围。
2 rand
函数的调用
rand()
函数在每次调用前都会查询是否调用过 srand(seed)
,是否给 seed
设定了一个值,如果有那么它会自动调用 srand(seed)
来初始化它的起始值。
若之前没有调用 srand(seed)
,那么系统会自动给 seed
赋初始值,即 srand(1)
自动调用它一次.
3 srand()
:设置随机数生成器。
需要给 srand
传递一个变化的值,比如计算机上的当前时间。
设置时间戳,time
函数可以返回一个时间戳。 time_t time(time_t *timer);
4 srand((unsigned)time(NULL));
:设置随机数生成起点,需要 time
函数返回一个时间戳。
srand
函数的参数类型是 unsigned int
,而 time
函数返回值类型是 time_t(longlong)
,所以就要进行强制类型转换。
总结:
本节介绍了循环结构中的 do while
语句,给出了在 do while
循环中 break
和 continue
语句的使用方法;最后给出了使用循环结构的常见练习题目。
感谢您的阅读!如有任何错误,欢迎您的批评指正!