[C语言笔记]06、控制流

目录

往期精彩回顾,c语言笔记正在更新中!,敬请期待!

前言

6-1if switch语句

6-1-1if语句

0.if语句的难度与上一章表达式的知识你是否掌握透彻息息相关,因此在学习之前务必好好复习表达式的知识

1.首先介绍什么是语句?

2.什么是控制结构?

3.if语句基本规则介绍

4.if语句的用法举例 

​编辑 5.大括号的省略

6-1-2if else语句

1.首先我们来回顾一下if语句的写法

2.if else语句的语法

 6-1-3else if语句

 1.为什么要有else if语句

2.else if的语法

3.else if的应用 

 6-1-4 嵌套if语句

1.引入

2.格式

 3.应用举例

6-1-5条件运算符

1.引入

2.条件运算符的语法 

 3.条件运算符的应用

 6-1-6 switch语句

1.引入

2.switch语句的语法

3.案例演示 

6-1-7switch语句的一些细节

 1.回顾switch的格式

2.注意事项

6-2循环语句

6-2-1while语句

1.while语句的语法

2.完整代码演示如下

 6-2-1-1利用while语句循环计数

6-2-1-2循环输入

 6-2-2 do while语句

1、do while语句的语法

2、 用do while语句进行从1到n的累加 

3、应用场景

 6-2-3 for语句

1、基本语法

2、利用for进行从1到n的累加 

 6-2-4死循环/无线循环

 1、表示方法:

2、程序运行死循环会怎么样? 

3、死循环的应用

6-3跳转

6-3-1跳转关键字 break

6-3-2跳转关键字 continue

6-3-3跳转关键字goto


 

往期精彩回顾,c语言笔记正在更新中!,敬请期待!

01-03基于vs2022的c语言笔记——软件安装,写程序前的准备,初识c语言-优快云博客

04基于vs2022的c语言笔记——数据类型_vs2022 c语言输入字符串-优快云博客

05-1基于vs2022的c语言笔记——运算符-优快云博客

05-2基于vs2022的c语言笔记——表达式-优快云博客

强烈建议学完01-05再往下学习,难度会小很多

前言

本套笔记是基于英雄哪里出来c语言入门到精通课程整理的笔记

包含代码,代码演示结果,以及便于理解的插图

对于想要c语言入门,嵌入式c语言的入门的朋友来说,这是一套不可多得的教程

此教程分几篇文章发布,初步计划更新到函数,未来时间允许会继续更新

6-1if switch语句

6-1-1if语句

0.if语句的难度与上一章表达式的知识你是否掌握透彻息息相关,因此在学习之前务必好好复习表达式的知识

1.首先介绍什么是语句?

语句就是 表达式;

2.什么是控制结构?

在c语言中

如果语句按顺序依次执行,就是顺序结构,前面我们讲的所有代码都是顺序结构

如果是根据条件的不同来执行语句,使用了if语句或者switch case语句 则是选择结构

如果包含包括`while`循环、`for`循环和`do-while`循环,用于重复执行同一段代码,直到满足特定条件

3.if语句基本规则介绍

if(表达式){
    执行语句;
}
其中表达式可以是任何表达式,我们之前讲过表达式的结果都会变成一个数值
只要这个数值非0,则执行大括号里的语句
如果数值为0,就会跳过这个大括号里的语句

4.if语句的用法举例 

1>0成立,返回值为1,非0,因此执行第一个if语句

1<0不成立,返回值为0,因此不执行第二个if语句

因此只要if后边的小括号里非0,都会执行大括号里的语句

而只要小括号里为0,则不执行大括号里的语句

为什么 上面不写成表达式也可以执行

因为其实是这样的,1!0包含了常量和运算符,可以算成一个表达式

if(1!0){

语句;

}

if(12!0){

语句;

}

所以推而广之,可以写成下面这样,也就是省略了!0,在语法上是可以接受的

if(a){

语句;

}

 5.大括号的省略

6-1-2if else语句

1.首先我们来回顾一下if语句的写法

你会发现两个if语句的小括号里的表达式是互补的,也就是a要么满足a>=0,要么满足a<0

为了使上述这种小括号内表达式互补的代码简化,就有了if else语句

2.if else语句的语法

 6-1-3else if语句

 1.为什么要有else if语句

所以else if就是为多个相关表达式的连续判断而生的

2.else if的语法

3.else if的应用 

 6-1-4 嵌套if语句

1.引入

你会发现在6-1-3的第三节 else if的应用里,我们并没有设定如果输入的数不在0-100之间时怎么处理,我们默认输入的数是0-100之间的

但是如果要考虑输入的数如果不在0-100之间,要有所显示,已达到让输入的人知道自己输错了的目的

我们就得引入嵌套if语句

2.格式

格式大概是这样,在一个大的if else语句里嵌套一个else if语句

if(a>=0 && a<=100){
    if(a>=90){
    printf();
}else if(a>=80){
    printf();
}else if(a>=70){
    printf();
}else if(a>=60){
    printf();
}else{
    printf();
}
}
else{
    printf("Error\n");
}

 3.应用举例

假设题目是这样的

一次考试的总分是100分

同学输入自己的成绩从而获得A,B,C,D,E四个等级的评分

输入不在100分范围内的成绩则显示Error

规定

[90-100]  为等级A

[80-89]    为等级B

[70-79]    为等级C

[60-69]    为等级D

60分以下 为等级E

6-1-5条件运算符

1.引入

2.条件运算符的语法 

#include <stdio.h>
int main() {
	int a = 3, b = 4;
	int x = -1;
	/*
	if (a > b) {
		x = a;//如果a>b把a的值赋值给x     x = a为表达式1
	}
	else {
		x = b;//如果a<=b,则把b的值赋值给x x = b为表达式2
	}
	/*
	/*
	条件运算符是三元运算符
	条件运算符的语法
	条件表达式(也就是上面的a>b)?表达式1:表达式2
	含义是判断条件表达式是否成立(返回值是否为1)
	如果成立 则执行表达式1 
	如果不成立则执行表达式2
	*/
	/*
	既然条件运算符是运算符,那么其目的就是参与构成表达式
	比如说上面的if语句可以简化为如下表达式
	x = (a > b ?  a : b);
	含义是如果a>b成立则把a的值赋值给x
	如果a>b不成立,即a<=b,则把b的值赋值给x
	
	*/
	x = (a > b ? a : b);
	printf("%d\n", x);

	return 0;
}

 3.条件运算符的应用

 6-1-6 switch语句

1.引入

switch语句是用于把所有的选择都列出来,根据不同的条件,任选其一

比如输入day 1-7(对应上面所说的条件),电脑输出显示星期一到星期天中的一个(对应上面所说的所有的选择)

2.switch语句的语法

switch(表达式){
    case 常量表达式1,:
    执行语句1;
    break;
    case 常量表达式2
    执行语句2;
    break;
    ...
    default:
    执行语句n;
}

3.案例演示 

#define	_CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int day;
	printf("请输入数字1-7中的一个:");
	scanf("%d", &day);
	switch (day) {
	case 1:
		printf("星期一\n");
		break;
//如果输入数字1,则执行上面的这个printf语句,然后执行break,整个switch语句就算执行完了
//然后执行整个switch语句后面的代码
	case 2://注意是冒号!!!
		printf("星期二\n");
		break;
	case 3:
		printf("星期三\n");
		break;
	case 4:
		printf("星期四\n");
		break;
	case 5:
		printf("星期五\n");
		break;
	case 6:
		printf("星期六\n");
		break;
	case 7:
		printf("星期天\n");
		break;
	default:
		printf("输入错误,请输入数字1-7\n");
//如果输入的数没有一个case是满足的,则执行default冒号后面的控制语句
	}

	return 0;
}

6-1-7switch语句的一些细节

 1.回顾switch的格式

switch(表达式){
    case 常量表达式1,:
    执行语句1;
    break;
    case 常量表达式2
    执行语句2;
    break;
    ...
    default:
    执行语句n;
}

2.注意事项

1.switch后面小括号里的表达式只能是整型和字符型,不能是浮点型

2.case后面跟的东西的计算结果只能是字符常量或者整型常量,不能是变量

 

3.case的值不允许重复,否则会报错,因为一个case值对应的是一种情况 

4.break表示中断,结束switch语句,某些情况下可以不写

什么情况呢?如下

两个case值对应一种情况时,可以省略一个break,这种情况又叫case穿透

 5.default:所有case列举的情况都不匹配时,执行dafault冒号后面的语句

 

6-2循环语句

6-2-1while语句

1.while语句的语法

首先需要介绍以上四种语句的含义和作用

1、初始化语句:定义变量(一般为i),并进行初始化

如果需要从0开始累加,则使i初始化值为0

如果需要从1开始累加,则使i初始化值为1

根据条件,对i进行初始化

与此同时需要在while语句前提前定义相关变量,或者在i的初始化这一行的下面定义相关变量,做好准备工作

2、条件判断语句:一个表达式,一般用于判断i与n的大小

比如i<=n,则表示只要i<=n成立(表达式计算结果非0),则执行while循环,如果i<=n不成立(表达式计算结果为0),则跳过while循环

3、循环体语句:执行循环操作的核心语句,可以有无数个。

4、条件控制语句:控制循环变量,以防出现循环变量永远满足条件判断语句,从而导致while语句陷入死循环

while语句流程图

 下面进行一个小的实例讲解,比如说你要计算从1加到100的累加和。

我这里前面头文件和#define省略不写,主要体现准备工作还有整个while语句是怎么写的
int n;
printf("请输入一个整数:");//n代表你给电脑限定的累加次数
scanf("%d",&n);
int i=1;//初始化循环变量i
int sum=0;//定义累加和初始值为0
while(i<=n){
    sum=sum+i
/*比如n=3时,i=1<=3成立,执行sum=sum+i sum=0+1=1
  此时i=1<=3成立,执行sum=sum+i sum=1+1=2
  你会发现i永远小于n,条件判断语句永远成立,陷入无限循环
    因此在循环体语句后面还要加条件控制语句
*/
    i++//在这里前缀自增和后缀自增效果一样,因为没有其他运算符的参与,也没有进行赋值操作

}

2.完整代码演示如下

 6-2-1-1利用while语句循环计数

问题:

输入一个数t

有t组数据

每组数据要求输入两个整数a,b

且对两个整数进行加和输出

代码演示

扩展

上面的输入t,执行t次的格式可以优化成如下这样

//前面的格式和上面一样
while(t--){
    //循环体语句
}
怎么理解呢,
1、t--最多只能是0,不能为负数,
因为t--等于0时,while语句的条件判断语句已经不成立,不再执行while语句,因此不会再判断条件判断语句了
2、假设输入t=3
先判断条件判断语句,t--是后缀自减,先用后减
影刺t=3>0进入while循环 然后t-1=2(一次while循环)
t=2>0,进入while循环 然后t-1=1(两次while循环)
t=1>0,进入while循环 然后t-1=0(三次while循环)
t=0,t--先用后减,因此t--先返回0,因此条件判断语句的计算结果为0,while语句不进行
可见以上输入t=3,执行了三次while语句

6-2-1-2循环输入

代码演示

所谓循环输入就是如上情况,不会停一直进行while循环

那么怎么才能让这个程序停呢,那当然是条件判断语句不成立的时候啦

所以我们现在需要来看一下scanf("%d%d", &a, &b) != EOF是什么意思

1、首先有!=关系运算符不等于,所以这个式子是一个关系表达式

2、左边scanf("%d%d", &a, &b)就是我们熟悉的输入两个数,那么它在表达式中需要返回值参与表达式运算,那么它的返回值是多少呢?

1. 输入两个数:返回2。
2. 输入部分正确(如一个数字和一个非数字):返回1。
3. 输入完全无法解析(如两个非数字):返回0。
4. 遇到EOF:返回EOF(-1)

然后需要知道EOF是什么意思?

点击EOF并且按下电脑的F12键

你会发现进入了stdio.h这个标准输入输出头文件里,然后看到了

所以EOF是用define定义的常量,值为-1,是一种结束标志

所以当scanf("%d%d", &a, &b) != EOF不成立,也就是scanf("%d%d", &a, &b)返回值等于EOF等于-1时,那么我们怎么操作能让scanf("%d%d", &a, &b)返回值为-1?

按下键盘的Ctrl+c

 6-2-2 do while语句

1、do while语句的语法

2、 用do while语句进行从1到n的累加 

3、应用场景

do while语句用于明确需要至少执行一次循环体语句的时候

 6-2-3 for语句

1、基本语法

2、利用for进行从1到n的累加 

 6-2-4死循环/无线循环

 1、表示方法:

法1:(最常用!)
while(1){    //条件判断语句为常量1,永远成立(返回值非0嘛),还可以用其他的永远成立的式子表示,最简单的就是1
    //循环体语句
}

法2:
do{
    //循环体语句
}while(1);


法3:(了解即可)
for(;;){       //初始化语句,条件判断语句,条件控制语句都不写
    //循环体语句
}

2、程序运行死循环会怎么样? 

3、死循环的应用

while(1){

    /*

    循环体语句1

    循环体语句2

    ...

    */

}

游戏可以简单理解成就是一个死循环

只有触发一些条件才会退出,也就是下堂课要介绍的跳转结构

那么在这个循环里(大括号里)

循环体语句可以干什么

可以

接收鼠标事件

接收键盘事件

接收逻辑判定

进行画面渲染等等

6-3跳转

6-3-1跳转关键字 break

break是一个关键字,用于跳出循环语句

以下是几种语句中break的用法

6-3-2跳转关键字 continue

continue的作用:跳过本次循环,进行下一次循环

下面我们用一个题目来演示一下continue的作用

题干:

随机输入6个整数

输出其中正整数的和

为什么可以一次性输入多个数?

原因:

虽然在 `for` 循环中调用了 `scanf` 六次,但实际上可以一次性输入六个整数,然后按回车键。`scanf` 会依次读取这些输入值并存储到变量 `x` 中。

具体来说,当输入 `6 -7 9 5 -1 2` 并按回车键时,`scanf` 会按顺序读取这些值:

1. 第一次调用 `scanf` 时,它读取 `6` 并将其存储到 `x` 中。
2. 第二次调用 `scanf` 时,它读取 `-7` 并将其存储到 `x` 中。
3. 依此类推,直到所有六个值都被读取。

`scanf` 会根据输入的格式说明符(`"%d"`)来解析输入流中的整数,并将它们依次存储到指定的变量中。因此,你可以一次性输入多个整数,只要它们之间用空格分隔即可。

6-3-3跳转关键字goto

goto的作用就是跳转到人为定位的标签处

下面以一个题目进行演示

定义两个数,让这两个数的平方和是74

输出这两个数的和分别是多少

显得有点冗杂

可以利用goto直接跳出两个for循环

goto不建议用

原因:

虽然goto可以直接让程序跳转到标记处,从而实现快速的流程控制,

在某些情况下使用goto语句可能会比使用其他的控制结构,比如说嵌套的条件语句和循环更加的高效,

避免了一些不必要的条件判定,和循环的迭代

但是也有缺点,就是可读性差,如果过分的使用goto,会使程序的控制流变得难以理解和跟踪,

程序的逻辑可能会变得非常的混乱,增加了维护的难度

而goto可以用其他语法代替已达到相同的效果

因此不建议使用goto

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值