10天学会嵌入式技术之C语言-day-4

8.3 循环控制语句

8.3.1 while 循环

(1)基本语法

while(循环条件表达式)
{
     循环体语句
}

说明:
(1)当循环条件表达式成立,就执行循环体语句,直到条件不成立停止循环
(2)为避免死循环,循环条件表达式不能永远成立,且随着循环次数增加,应该越来
越趋向于不成立。

(2)流程图

(3)案例 – 计数循环
实现计数循环要满足:①必须初始化循环变量 ②循环变量比较作为循环条件 ③循环变
量变化。
使用 while 循环实现如下需求:
        1)输出 10 次 "我第 n 天吃了 n 个韭菜馅的包子"。

#include<stdio.h>

int main()
{
	//输出10次“我第n天吃了n个韭菜包子”
	//定义循环体
	int num = 0;

	while (num < 10)
	{
		printf("我第%d天吃了%d个韭菜包子\n", num, num);
		num++;
	}
	printf("循环结束后循环变量的值:%d", num);

	return 0;

}

        2)循环输出数字7~15

#include<stdio.h>

int main()
{
	int n = 7;
	while (n <= 15)
	{
		printf("%d\n", n);
		n++;
	}
	printf("循环结束后循环变量的值:%d", n);

	return 0;
}

        3)倒序输出数字56~43

#include<stdio.h>

int main()
{
	int n = 56;
	while (n >= 43)
	{
		printf("%d\n", n);
		n--;
	}

	printf("循环结束后循环变量的值:%d", n);

	return 0;



}

        4)输出10以内的所有偶数

#include<stdio.h>

int main()
{
/*	int i = 0;
	while(i<=10)
		if (i%2==0)
		{
			printf("%d\n", i);
		}
	i++;
	*/
	int i = 0;
	while (i <= 10)
	{
		printf("%d\n", i);
		i += 2;
	}
	printf("循环结束后循环变量的值:%d", i);

	return 0;


}

        5)计算100内所有数字和

#include<stdio.h>

int main()
{
	int i = 0;
	int sum = 0;

	while (i <= 100)
	{
		sum += i;
		i++;
	}

	printf("100 以内(包括 100)所有数字的和是 %d \n", sum);
	printf("循环结束后循环变量的值:%d", i);

	return 0;
}

        6)计算10以内是所有奇数的乘积

#include<stdio.h>

int main()
{
	int i = 1;
	int product = 1;

	while (i <= 10)
	{
		product *= i;
		i += 2;
	}
	printf("10 以内所有奇数的乘积是 %d \n", product);
	printf("循环结束后循环变量的值:%d", i);

	return 0;
}

(4)案例 不确定循环

不确定循环直到循环表达式不成立之前,不确定循环次数,不需要循环变量。
实现需求:输入 6 位数密码,直到密码匹配成功结束循环。

#include<stdio.h>

int main()
{
	//记录正确密码
	int pwd1 = 123456;
	//定义变量用于获取输入的密码
	int pwd2=0;

	//循环
	while (pwd1 != pwd2)
	{
		printf("请输入6位密码:");
		scanf_s("%d", &pwd2);
	}
	printf("密码正确,欢迎回家!");

	return 0;
}
8.3.2 do...while 循环

(1)基本语法

do
{
    循环体语句;
}while(循环条件表达式);

说明:
        1)do…while 循环是先执行再判断,但只有第一次循环语句的执行没有经过判断,以
后的每一次仍然先经过判断。
        2)注意 while 后面的分号不能省略。

(2)流程图

(3)案例 – 计数循环
使用 do…while 循环实现如下需求:
         1)输出 10 次 "我第 n 天吃了 n 个韭菜馅的包子"

#include<stdio.h>

int main()
{
	int i = 0;

	do
	{
		printf("我第%d 天吃了%d 个韭菜馅的包子 \n", i, i);
		i++;
	} while (i <= 10);
		printf("循环结束后循环变量的值:%i", i);

	return 0;
}

       2)循环输出数字7~15

#include<stdio.h>
int main()
{
	int i = 7;
	do
	{
		printf("%d\n", i);
		i++;
	} while (i <= 15);

	printf("循环结束后循环变量的值:%d", i);
	return 0;

}

        3)倒序输出数字56~43

#include<stdio.h>


int main()
{
	int i = 56;
	do
	{
		printf("%d\n", i);
		i--;
	} while (i >= 43);

	printf("循环结束后循环变量的值:%d", i);
	return 0;

}

        4)输出10以内所有的偶数

#include<stdio.h>

int main()
{
	int i = 0;
	do
	{
		printf("%d\n", i); 
		i += 2;
	} while (i<=10);
	printf("循环结束后循环变量的值:%d", i);
	return 0;

}

        5)计算100以内所有数字的和

#include<stdio.h>

int main()
{

	int sum = 0;
	int i = 1;
	do
	{
		sum += i;
		i++;
	} while (i<=100);

	printf("100 以内(包括 100)所有数字的和是 %d \n", sum);
	
	printf("循环结束后循环变量的值:%d", i);
	
	return 0;
}

        6)计算10以内所有奇数的乘积

#include<stdio.h>
 
int main()
{

	int product = 1;
	int i = 1;
	do
	{
		product *= i;
		i += 2;
	} while (i<=10);

	printf("10 以内所有奇数的乘积是 %d \n", product);
	printf("循环结束后循环变量的值:%d", i);

	return 0;

}

        6)案例 – 不确定循环
实现需求:输入 6 位数密码,直到密码匹配成功结束循环。

#include<stdio.h>

int main()
{

	int pwd1 = 123456;
	int pwd2 = 0;

	do
	{
		printf("请输入6位密码\n");
		scanf_s("%d", &pwd2);
		printf("请输入正确密码\n");
	} while (pwd1!=pwd2);

	printf("欢迎回家!\n");

	return 0;

}

(5)while 和 do while 的区别

#include<stdio.h>
int main()
{
	//while 循环一次也不会执行
	int n = 10;
	while (n > 10)
	{
		printf("%d\n", n);
		n++;
	}
	//do while 陷入死循环
	n = 10;
	do
	{
		printf("%d\n", n);
			n++;
	} while (n>10);
	return 0;

}
8.3.3 for循环

(1)基本语法

for (循环变量初始化; 循环条件表达式; 循环变量变化)
{
    循环语句;
}

说明:
(1)循环变量初化只执行一次,且循环开始前就执行。
(2)循环条件表达式每次循环都执行,同 while 循环一样,每次先判断后执行循环体
语句。
(3)循环标记变量变化每次循环都执行,在大括号中循环体语句之后执行。

     2)流程图

3)案例  使用 for 循环实现如下需求:
        1)输出 10 次 "我第 n 天吃了 n 个韭菜馅的包子"。

#include<stdio.h>

int main()
{
//输出10次“我第 n 天吃了 n 个韭菜馅的包子”

	for (int i = 0; i < 10; i++)
	{
		printf("我第%d 天吃了%d 个韭菜馅的包子 \n", i, i);
	}
	return 0;
}

        2)循换输出7~15

#include<stdio.h>
int main()
{
	for (int i = 7; i <= 15; i++)
	{
		printf("%d\n", i);
	}

	return 0;

}

        3)倒序输出数字56~43

#include<stdio.h>
int main()
{
	for (int i = 56; i >=43 ; i--)
	{
		printf("%d\n", i);
	}
	return 0;
}

        4)输出 10(包括 10)以内所有的偶数

#include<stdio.h>

int main()
{
	for (int i = 0; i <= 10; i += 2)
	{
		printf("%d\n", i);
	}

	return 0;
}

5)计算 100 以内(包括 100)所有数字的和

#include<stdio.h>
int main()
{
	int sum = 0;
	for (int i = 0; i <=100; i++)
	{
		sum +=i;
	}
	printf("100 以内(包括 100)所有数字的和是 %d \n", sum);
	
	return 0;
}

6)计算10以内所有奇数的乘积

#include<stdio.h>
int main()
{
	int product = 1;
	for ( int i = 1; i <=10; i+=2)
	{
		product *= i;
	}
	printf("10 以内所有奇数的乘积是 %d \n", product);
	return 0;
}

7)案例 – 不确定循环
实现需求:输入 6 位数密码,直到密码匹配成功结束循环。

#include<stdio.h>
int main()
{
	int pwd1 = 123456;
	int pwd2 = 0;

	for (; pwd1!= pwd2; )
	{
		printf("请输入 6 位数密码:\n");
		scanf_s("%d", &pwd2);
	}
	printf("密码正确,欢迎回家!");
	return 0;
}

        8)案例 特殊结构的for循环

#include<stdio.h>
int main()
{
	
	// 标准结构
	for (int i = 1; i < 10; i+=2)
	{
		printf("%d ", i);
	}
	printf("%d", i);


	//循环变量写在外面

	int i = 1;
	for ( ; i < 10; i+=2)
	{
		printf("%d ", i);
	}
	printf("\n\n");

	//循环变量写在外面 循环标记变量变化写在大括号中

	i = 1;
	for(; i < 10; i);
	{
		printf("%d ", i);
		i += 2;
	}
	 printf("\n\n");

	 //使用两个循环标记变量
	 for (int x = 1,y=1; x < 15 &&y<10; x++,y++)
	 {
		 printf("%d %d \n", x, y);
	 }
	 printf("\n\n");


	 //for后面括号中什么都不写,死循环
	 for (;;)
	 {
		 printf("死循环 \n");
	}

	 return 0;
}
8.3.4 多重循环

(1)介绍
        1)将一个循环放在另一个循环体内,就形成了嵌套循环, 其中,for、while、do…while
均可以作为外层循环和内层循环,建议一般使用两层,最多不要超过 3 层,如果嵌套循环过
多,会造成可读性降低。
        2)如果外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m*n 次。
(2)代码示例

#include<stdio.h>
int main()
{
	//输入列数和行数
	int rows, cols;

	printf("请输入行数:");
	scanf_s("%d", &rows);

	printf("请输入列数:");
	scanf_s("%d", &cols);


	//循环

	for (int i = 0; i < rows; i++)
	{

		for (int j = 0; j < cols; j++)
		{
			printf("[%d,%d]", i, j);
		}
		printf("\n");

	}
	return 0;

}

(3)案例:分别打印初以下两种形式的九九乘法表

第一种:

#include<stdio.h>
int main()
{

	for (int i = 1; i <= 9; i++)
	{
		for (int j = 1; j <= i; j++)
		{
			printf("%d*%d=%d\t", j, i, j * i);
		}

		printf("\n");
	}

	return 0;
}

1*1=1
1*2=2   2*2=4
1*3=3   2*3=6   3*3=9
1*4=4   2*4=8   3*4=12  4*4=16
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81

D:\c-code\3-16\x64\Debug\3-16.exe (进程 14864)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. . .

第二种:

#include<stdio.h>
int main()
{
	for (int i = 9; i >=1; i--)
	{
		for (int j = 1; j <= i; j++)
		{
			printf("%d*%d=%d\t", j, i, i * j);
		}
		printf("\n");
	}
	return 0;
}

1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25
1*4=4   2*4=8   3*4=12  4*4=16
1*3=3   2*3=6   3*3=9
1*2=2   2*2=4
1*1=1

D:\c-code\3-16\x64\Debug\3-16.exe (进程 14852)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. . .

8.4 跳转控制语句

8.4.1 break

(1)介绍
break 语句用于终止某个语句块的执行,用在 switch 语句或者循环语句中。
(2)流程图

#include<stdio.h>
int main()
{
	for (int i = 0; i < 10; i++)
	{
		if (i==3)
		{
			break;
		}
		printf("%d\n", i);
	}
	return 0;
}

(4)案例:编写程序,要求输入一个数字,判断该数字是否是质数。

                说明:质数指只能被 1 和自身整除且大于 1 的数字。

#include<stdio.h>
#include<stdbool.h>
int main()
{
	//获取一个数字
	int num;
	printf("请输入一个数字:");
	scanf_s("%2d", &num);

	//定义变量,标记是否为质数
	//大于1的数字先标记其为质数,再通过循环看是否推翻:小于1的数字直接标记为假

	bool isPrime = num > 1 ? 1 : 0;
	//循环判断
	for (int i = 2; i < num/2; i++)
	{
		if (num % 1 == 0)
		{
			isPrime = 0;
			break;
		}

	}
	//输出结果
	if (isPrime)
	{
		printf("%d是质数!", num);
	}
	else
	{
		printf("%d不是质数!",num);
	}
	return 0;
}

8.4.2 continue

(1)介绍
continue 语句用于结束本次循环,继续执行下一次循环。
(2)流程图

(3)案例

#include<stdio.h>

int main()
{

	for (int i = 0; i < 10; i++)
	{
		if(i==3)
		{
			continue;
		}
		printf("%d\n", i);
	}
	return 0;
}

0
1
2
4
5
6
7
8
9

D:\c-code\3-16\x64\Debug\3-16.exe (进程 31780)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. . 

输出100以内的数字,跳过那些7的倍数或者包含7的数字。

#include<stdio.h>

int main()
{

	for (int i = 1; i <=100; i++)
	{
		//i%7,判断7的倍数
		//i%10,判断个位上带7的数字
		//i/10,判断十位上带7的数字
		if (1 % 7 == 0 || 1 % 10 == 7 || i / 10 == 7)
		{
			continue;
		}
		printf("%d\n", i);
	}
	return 0;
}
8.4.3 goto语句

(1)介绍
goto 语句是一种跳转语句,它允许程序控制流程在代码中跳转到带有标签(label)的语
句处,标签(label)的名称可以自行设置,需要满足标识符规范。
注意,我们在开发中不建议使用 goto 语句,但我们需要掌握 goto 语句的执行流程,
以能够看懂其他开发者的代码中可能出现的 goto 语句。
(2)基本语法

goto 标签名//跳转到指定的标签(label)处

...
标签名:   //定义一个标签(label)
语句;

(3)流程图

(4)代码示例
使用 goto 语句实现语句跳转。

#include<stdio.h>
int main()
{
	printf("start\n");
	goto label1;//label1是标签名

	printf("ok1\n");
	printf("ok2\n");
label1:
	printf("ok3 \n");
	printf("ok4 \n"); \

	return 0;
}

start
ok3
ok4

D:\c-code\3-16\x64\Debug\3-16.exe (进程 32752)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. . .
 

案例:使用 goto 语句实现循环输出数字1-5,

#include<stdio.h>
int main()
{
	int i = 1;

start:
	if (i<=5)
	{
		printf("%d", i);
		i++;
		goto start;//跳转到start处继续执行
	}
	return 0;
}

课后练习:

(1)实现判断一个整数,属于哪个范围:大于 0;小于 0;等于 0。
(2)判断一个年份是否为闰年。
(3)判断一个整数是否是水仙花数,所谓水仙花数是指一个 3 位数,其各个位上数字
立方和等于其本身,例如:153 = 1*1*1 + 5*5*5 + 3*3*3。
(4)编写程序,根据输入的月份和年份,求出该月的天数(1-12), 就是需要考虑闰
年(2 月份 29)和平年(2 月份 28)。
(5)输入星期几,如果是星期一到星期三,打印:AAA,星期四到星期五,打印:
BBB,星期六到星期日,打印 CCC,如果都不是,提示“输入错误”。
(6)请使用 for、while、do—while 三种形式打印 1000——9999 年内所有的闰年。
(7)输出小写的 a-z 以及大写的 Z—A。
(8)求出 1-1/2+1/3-1/4…..1/100 的和。

每日一测day-4

1.【代码题】请写出下面程序的运行结果

int i;
for(i=0;i<5;i++)
{
      printf("%d",i);
      i++;
}

    printf("\n%d",i);

.【答案】
0 2 4
6
【解析】
(1)在这个程序中,使用了一个 for 循环来迭代 i 的值,然后在循环体内打印 i 的值,接着
将 i 递增,同时,在循环体内部手动将 i 再次递增了一次。
(2)在 for 循环内部,i 从 0 开始,每次递增 2(i++和循环自身的 i++)。因此,for 循环将
执行 3 次(i=0, 2, 4),分别打印 0,2 和 4。
(3)在循环外部,printf("\n%d", i);语句将打印循环结束后的 i 的值,i 最终的值为 6。

2.【代码题】请写出下面程序的运行结果

int sum = 0;
for (int i = 1; i < 5; i++)
{
if (i == 3)
{
continue;
}
sum += i;
}
printf("%d", sum);

【答案】
7
【解析】
(1)当 i 等于 1 时,sum 变为 1。
(2)当 i 等于 2 时,sum 变为 1 + 2 = 3。
(3)当 i 等于 3 时,由于 continue 语句,循环体内的 sum += i;不会执行,所以 sum 保持不
变为 3。
(4)当 i 等于 4 时,sum 变为 3 + 4 = 7。
(5)因此,最终的输出是:7

3.【代码题】以下代码共输出多少次”你好“

for (int i = 1; i <= 3; i++)
{
    for (int j = 1; j <= i; j++)
    {
    printf("你好 ");
    }
}

【答案】
6 次
【解析】
(1)当 i 等于 1 时,内层循环执行一次,输出"尚硅谷"一次。
(2)当 i 等于 2 时,内层循环执行两次,输出"尚硅谷"两次。
(3)当 i 等于 3 时,内层循环执行三次,输出"尚硅谷"三次。
(4)因此,总共输出了 1 + 2 + 3 = 6 次 "尚硅谷"。

4.【编码题】使用 while 循环实现一个死循环

【答案】

while (1)
{

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值