从0开始学c语言-12-循环执行语句(3)do……while()语句+练习

本人0基础开始学编程,我能学会的,你也一定可以,学会多少写多少。

下载安装请从官网入手,社区版本即可,这里主要使用的软件是VS2019,图标如下。

   上一篇:从0开始学c语言-12-循环执行语句(2)for语句_阿秋的阿秋不是阿秋的博客-CSDN博客

控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成, C 语 言有九种控制语句,可以分为以下三类:
        1. 条件判断语句也叫分支语句: if 语句、 switch 语句;
        2. 循环执行语句: do while 语句、 while 语句、 for 语句;
        3. 转向语句: break 语句、 goto 语句、 continue 语句、 return 语句。

目录

do……while()语句

语法结构

执行流程​编辑​编辑

 代码演示

break和continue

练习

1.算出n的阶乘

2. 计算 1!+2!+3!+……+10!

3. 在一个有序数组中查找具体的某个数字n。(讲解二分查找)

4. 编写代码,演示多个字符从两端移动,向中间汇聚。

5. 编写代码实现模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。


do……while()语句

这语句的特点就是至少执行一次,是先执行后判断是否循环的。

语法结构

do
    循环语句;
while(表达式);  //注意这个分号

执行流程

 代码演示

int main()
{
	int i = 1;
	do
	{
		printf("%d\n", i);
		i++;
	} while (i < 10);
	return 0;
}

上面这段代码可以打印1-9的数字,我们改动一下

 这样你就会知道啥叫先执行的魅力了~

break和continue

 break依旧是直接跳出循环,continue跳过它之后的语句来到判断部分。

练习

1.算出n的阶乘

思路:例如求5!

首先5!=5*4*3*2*1

为了能够输出+1的数字相乘,我们需要使用循环语句。

循环条件有三个部分

初始化部分、判断部分、调整部分

初始化部分:应该是从1开始,因为所有阶乘都有1

判断部分:我们需要从1乘到5,也就是说我们需要设置一个变量,让它小于等于5

调整部分:+1

循环语句中便是每次循环的数字相乘了,但是我们还需要一个变量来储存这个相乘的结果。

那么算下来有三个变量

1、阶乘的变量

2、循环条件的变量

3、结果的变量

那代码就会是这样

int main()
{
	int a = 0;  //循环变量
	int n = 0;  //求n的阶乘
	int c = 1;  //从1开始乘
	scanf("%d", &n);  //输入n
	for (a = 1; a <= n; a++)
	{
		c *= a;  //c是局部变量,上一次循环的值会保留
	}
	printf("%d\n", c);
	return 0;
}

2. 计算 1!+2!+3!+……+10!

我们上面已经算出了任意一个数的阶乘,那么接下来就需要让它们加起来而已!

这个思路很宽广,大家自己想想,我就不带着想了。

一开始我写的比较复杂

int main()
{
	int a = 1;    
	int n = 2;   //条件需要变量
	int c = 1;   //每个阶乘的结果
	int he = 0;  //相加的结果
	while (n < 12)
	{
		for (; a < n; a++)  //因为是大循环中的小循环,所以没进行初始值的设定
                            //否则每次小循环的结果都一样
		{
			c *= a;
			he += c;
		}
		n++;
	}
	printf("%d\n", he);
	return 0;
}

 然后又写了这个

int main()
{
	int a = 0;
	int n = 0;
	int c = 0;   //阶乘结果
	int he = 0;  //相加结果
	for(n=1;n<=10;n++)
	{
		c = 1; //初始化,试试去掉的效果
		for(a=1; a <= n; a++)
		{
			c *= a;	
		}
		he += c;
	}
	printf("%d\n", c);
	printf("%d\n", he);
	return 0;
}

c=1很重要,需要每次置1才能让小循环正确输出阶乘的结果。

大循环输出10个数并加起来每个小循环后的阶乘,小循环进行阶乘。

然后,又写了这个

int main()
{
	int n = 0;
	int c = 1;
	int he = 0;
	for (n = 1; n <= 10; n++)
	{
		c *= n;  //10的阶乘等于10*9的阶乘
		he += c;
	}
	printf("%d\n", he);
	return 0;
}

每次循环后的c都是n的阶乘,这种写法更加简洁一些。

简单来说就是n的阶乘=n*(n-1)的阶乘,而这种写法的原理就是这个。

3. 在一个有序数组中查找具体的某个数字n。(讲解二分查找)

利用数组的下标来寻找数字,我们使用二分法来提高查找效率。

二分法就是从中间去找,去不断和你要查找的数字对比,进而不断缩小范围。

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int left = 0; //左下标
	int right = sizeof(arr) / sizeof(arr[0]) - 1; //右下标
	int key = 7;  //要寻找的值
	int mid = 0;  //中间值
	while (left <= right)
	{
		mid = (left + right) / 2;
		if (arr[mid] > key)
		{
			right = mid - 1;
		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else
			break;
	}
	if (left <= right)
		printf("找到了,下标是%d\n", mid);
	else
		printf("找不到\n");
    return 0;
}

4. 编写代码,演示多个字符从两端移动,向中间汇聚。

这玩意对小白来说很难自己独立敲出来,看代码理解吧。

#include <windows.h>
#include <string.h>
#include <stdio.h>
int main()
{
	char aqiu1[] = "victory and peace";
	char aqiu2[] = "*****************"; //给两个可以交换元素的数组
	int left = 0;
	int right = strlen(aqiu2) - 1; //字符串长度-1
//定义了左右下标
	while (left <= right) //一直到左右下标互换后跳出循环
	{
		aqiu2[left] = aqiu1[left];
		aqiu2[right] = aqiu1[right];
		printf("%s\n", aqiu2);
		Sleep(500);  //单位是毫秒,s要大写,要用新的头文件,睡眠半秒
		system("cls"); //清空屏幕
		left++;
		right--;
	}
	printf("%s\n", aqiu2);
	return 0;
}

 如果不清空屏幕,那么每次输出都会换行,打印出来的效果很不美观。

5. 编写代码实现模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。

#include <windows.h>
#include <string.h>
#include <stdio.h>
int main()
{
	printf("请输入密码\n");
	char password1[20] = { 0 };
	char password2[20] = { 0 };
	int time = 0;
	scanf("%s", password1);
	Sleep(1000);
	for (time = 1; time <= 3; time++)
	{
		/*char password2[20] = { 0 };*/  //我想加上初始化来着,看来scanf每次都是新取的密码
		printf("请再次输入确认密码\n");
		scanf("%s", password2);
		/*if (password1==password2)*/  //这样写不行
		//两个字符串比较,应该用strcmp,引用string头文件,比较的是两个字符串的ASCII码
		/*if (strcmp(password1, "123") == 0)*/  //假设密码123,这么写也可
		if (strcmp(password1, password2) == 0)
		{
			printf("密码正确");
			return 0;
		}
		else
			printf("密码错误,亲\n");
	}
	printf("超过最大次数,请明天再来");	
	return 0;
}

strcmp比较的是对应字符的ASCII码值,
if(password1 == password2)这种写法是比较两个字符串首字符的地址。
比较地址是没有意义的,因为地址会变,哪怕储存的内容相同。

下一篇:从0开始学c语言-过渡-练习之猜随机数字游戏、求最大公约数_阿秋的阿秋不是阿秋的博客-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值