文章目录
第3讲:分支和循环(上)
C语言:结构化的程序设计语言
- 顺序结构
- 选择结构:if语句、switch语句
- 循环结构:while循环、for循环、do-while循环
1. if 语句
1.1 if
语法形式:
if (表达式)
语句
表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。
在C语言中,0为假,非0表示真
1.2 else
语法形式:
if ( 表达式 )
语句1
else
语句2
1.3 分支中可以包含多条语句
默认在 if 和 else 语句中默认都只控制⼀条语句
解决办法:使用 {} 将代码括起来,可以同时控制多条语句
1.4 嵌套 if
在 if else 语句中, else 可以与另⼀个 if 语句连用,构成多重判断。
例如:
if(num==0)
printf("输入的数字是0");
else if(num>0)
printf("输入的数字是正数");
else
printf("输入的数字是负数");
if(num>0)
{
if(num%2 == 0)
printf("偶数\n");
else
printf("奇数\n");
}
else
{
printf("⾮正数\n");
}
-
判断语句不能写18<=age<=40,应写成
age>=18 && age<=40
1.5 悬空else问题
else 总是跟最接近的 if 匹配
2. 关系操作符
用于比较的表达式,称为 “关系表达式”,里面使用的运算符就称为“关系运算符”,如下:
- > 大于运算符
- < 小于运算符
- >= 大于等于运算符
- <= 小于等于运算符
- == 相等运算符
- != 不相等运算符
3. 条件操作符
也称三目操作符,需要接受三个操作数,形式:
exp1 ? exp2 :exp3
计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果 exp1 为假, exp3 计算,计算的结果是整个表达式的结果。
4. 逻辑操作符:&& , || , !
- ! :逻辑取反运算符(改变单个表达式的真假)。
- && :逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
- || :逻辑或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。
4.1 逻辑取反运算符 !
a | !a |
---|---|
非0 | 0 |
0 | 1 |
如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真
4.2 逻辑与运算符
a | b | a&&b |
---|---|---|
非0 | 非0 | 1 |
非0 | 1 | 0 |
0 | 非0 | 0 |
0 | 0 | 0 |
&& 就是与运算符,也是并且的意思, && 是⼀个双目操作符,使用的方式是 a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。
4.3 逻辑或运算符
a | b | a||b |
---|---|---|
非0 | 非0 | 1 |
非0 | 0 | 1 |
0 | 非0 | 1 |
0 | 0 | 0 |
|| 就是或运算符,也就是或者的意思, || 也是⼀个双目操作符,使用的方式是 a || b , ||两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
4.4 练习:闰年的判断
输入一个年份year,判断year是否是闰年
闰年判断的规则:
-
能被4整除并且不能被100整除是闰年
-
能被400整除是闰年
4.5 短路
5. switch语句
switch 语句是一种特殊形式的 if…else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式。
switch(expression){
case value1:statement
case value1:statement
...
default:statement
}
上面代码中,根据表达式 expression 不同的值,执行相应的 case 分支。如果找不到对应的值,就执行 default 分支。
5.1 if语句和switch语句的对比
5.2 switch语句中的break
5.3 switch语句中的default
5.2 switch语句中的case和default的顺序问题
case语句和default语句没有顺序要求
通常是把 default 子句放在最后处理的
6. while循环
while(表达式)
语句;
如果循环体包含多个语句,加上大括号
6.1 if和while的对比
区别:while语句是可以实现循环效果的
6.2 while语句的执行流程
首先上来就是执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。
6.3 while循环的实践
练习:在屏幕上打印 1~10 的值
int i = 1;
while(i<=10)
{
printf("%d ", i);
i++;
}
6.4 练习
-
题目:输入一个正的整数,逆序打印这个整数的每一位
例如:输入:1234,输出:4 3 2 1;输入:521,输出:1 2 5
-
解析:数n%10取余得到的就是最低位;n/10除10可以去掉最低位
-
实现:
int n = 0; scanf("%d",&n); while(n) { printf("%d",n%10); n /= 10; }
调试:
7. for循环
三种循环中使用最多的
7.1 语法形式
for(表达式1;表达式2;表达式)
语句;
表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整
7.2 for循环的执行流程
7.3 for循环的实践
练习:在屏幕上打印1~10的值
int i = 0;
for(i=1;i<=10;i++)
{
printf("%d ", i);
}
7.4 while循环和for循环的对比
for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部分非常集中,便于代码的维护,而如果代码较多的时候 while 循环的三个部分就比较分散,所以从形式上 for 循环要更优一些。
7.5 练习
例:计算1~100之间3的倍数的数字之和
分析:
- 产生1-100之间的数字 for()
- 找出3的倍数 if()
- 求和 +=
代码:
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
for(i=1; i<=100; i++)
{
if(i % 3 == 0)
sum += i;
}
printf("%d\n", sum);
return 0;
}
优化:
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
for(i=3; i<=100; i+=3)
{
sum += i;
}
printf("%d\n", sum);
return 0;
}
8. do-while 循环
在循环语句中 do while 语句的使用最少
8.1 语法形式
do
语句;
while(表达式);
while 和 for 这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;
而 do while 循环则是先直接进入循环体,执行循环语句,然后再执行 while 后的判断表达式,表达式为真,就会进进行下一次,表达式为假,则不再继续循环。
8.2 do while循环的执行流程
8.3 do while循环的实例
例:在屏幕上打印1~10的值
int i = 1;
do
{
printf("%d ", i);
i = i + 1;
}while(i<=10);
8.4 练习
输入一个正整数,计算这个整数是几位数?
int n = 0;
scanf("%d", &n);
int cnt = 0;
do
{
cnt++;
n = n / 10;
} while (n);
printf("%d\n", cnt);
9. break和continue语句
- break 的作用是用于永久的终止循环
- continue 的作用是跳过本次循环中 continue 后边的代码
9.1 while循环中的break和continue
9.1.1 break举例
while(i<=10)
{
if(i == 5)
break;//当i等于5后,就执⾏break,循环就终⽌了
printf("%d ", i);
i = i+1;
}
打印了1,2,3,4后,当i等于5的时候,循环在 break 的地方终止,不再打印,不再循环。
9.1.2 continue举例
while(i<=10)
{
if(i == 5)
continue;
printf("%d ", i);
i = i+1;
}
跳过了i = i+1,所以i⼀直为5,程序陷入和死循环
9.2 for循环中的break和continue
9.2.1 break 举例
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ", i);
}
输出:1 2 3 4
9.2.2 continue举例
for(i=1; i<=10; i++)
{
if(i == 5)
continue;
printf("%d ", i);
}
输出:1 2 3 4 6 7 8 9 10
9.3 do-while循环中的break和continue
9.3.1 break 举例
do
{
if(i == 5)
break;
printf("%d ", i);
i = i + 1;
}while(i<=10);
输出:1 2 3 4
9.3.2 continue举例
do
{
if(i == 5)
continue;
printf("%d ", i);
i = i + 1;
}while(i<=10);
跳过了i = i+1,所以i⼀直为5,程序陷入和死循环
10. 循环的嵌套
10.1 练习
找出100~200之间的素数,并打印在屏幕上。
注:素数又称质数,只能被1和本身整除的数字。
10.2 题目解析
1.产生100-200之间的数字
for(i=100;i<=200;i++)
2.判断是否是质数
10.3 参考代码
int i = 0;
//循环产⽣100~200的数字
for(i=100; i<=200; i++)
{
//判断i是否为素数
//循环产⽣2~i-1之间的数字
int j = 0;
int flag = 1;//假设i是素数
for(j=2; j<i; j++)
{
if(i % j == 0)
{
flag = 0; //是素数
break;
}
}
if(flag == 1)
printf("%d ", i);
}
11. goto语句
goto 语句可以实现在同⼀个函数内跳转到设置好的标号处
printf("hehe");
goto next;
printf("heihei");
next:
printf("haha")
goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以我们的建议是能不用尽量不去使用。
嵌套循环中goto语句可以直接跳出循环,不用使用多个break。
-
使用goto语句写一个关机程序
system("shutdown -s -t 60"); //system是一个库函数,这个函数是执行系统命令的