【C语言初阶】循环语句 —— dowhile语句

【C语言初阶】循环语句 —— dowhile语句

4 do while 语句

4.1 do while - 流程图

dowhile 语句


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 中的 breakcontinue 语句

4.4.1 break 语句

breakdo 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 语句

continuedo 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增长到 ni ,最终实现 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 的阶乘,那么就可以使用变量 sumi 每次变化后求得的阶乘加起来,最终的到所有阶乘之和 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 值的大小

  str1str2 两个字符串进行比较,该函数开始比较每个字符串的第一个字符

  如果它们彼此相等,则继续下一对比较,直到字符不同或达到空字符

  如果两个字符串相等,则返回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 循环中 breakcontinue 语句的使用方法;最后给出了使用循环结构的常见练习题目。


感谢您的阅读!如有任何错误,欢迎您的批评指正!

  • 39
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值