目录
2.4 switch 语句中的 case 和 default 的顺序问题
6.1 while 循环中的 break 和 continue
6.3 do while 循环中的 break 和 continue
C语言中的分支和循环结构在程序设计中占据着核心地位,它们为程序员提供了强大的控制流灵活性,我们一定要熟练掌握。
C语言是可以实现顺序结构、选择结构、循环结构的结构化程序设计语言,可以使用if、switch实现分支结构,使用for、while、do while实现循环结构。
1. if 语句
1.1 if
if 语句的语法形式如下:
1 if (表达式)
2 语句
表达式为真,则语句执行,表达式为假,则语句不执行
举例:输入一个整数,判断是否为奇数
#include<stdio.h>
int main()
{
int num = 0;
scanf_s("%d", &num);
if (num % 2 != 0)
printf("%d 是奇数\n", num);
return 0;
}
1.2 else
if else 语句的语法形式如下:
1 if (表达式)
2 语句 1
3 else
4 语句 2
举例:输入一个整数,判断是否为奇数。
#include<stdio.h>
int main()
{
int num = 0;
scanf_s("%d", &num);
if (num % 2 != 0)
printf("%d 是奇数\n", num);
else
printf("%d 是偶数\n", num);
return 0;
}
1.3 分支中包含多条语句
默认在 if 和 else 语句中都只控制一条语句。
举例:判断一个人是否可以考驾照
#include<stdio.h>
int main()
{
int age = 0;
scanf_s("%d", &age);
if (age >= 18)
printf("已成年\n");
printf("可以考驾照了!");
return 0;
}
以上代码中,无论输入的年龄为多少,“ 可以考驾照了!”这句话都会打印在屏幕上,因为 if 语句只能控制一条语句,如果要 if 语句同时控制2条语句,就要使用{ }将代码括起来,else 后也可以跟大括号。
改进:
#include<stdio.h>
int main()
{
int age = 0;
scanf_s("%d", &age);
if (age >= 18)
{
printf("已成年\n");
printf("可以考驾照了!");
}
else
{
printf("未成年\n");
printf("不可以考驾照!");
}
return 0;
}
1.4 嵌套 if
在 if else 语句中,else 可以与另一个 if 语句连用,构成多重判断。
举例:输入一个整数,判断其是正数、负数还是零
#include<stdio.h>
int main()
{
int num = 0;
scanf_s("%d", &num);
if (num == 0)
printf("输入的数字是0\n");
else if (num > 0)//这里的if相当于嵌套在else语句中,形成了嵌套结构
printf("输入的数字是正数\n");
else
printf("输入的数字是负数\n");
return 0;
}
复杂逻辑判断举例:通过年龄判断一个人正处于什么阶段
#include<stdio.h>
int main()
{
int age = 0;
scanf_s("%d", &age);
if (age < 18)
{
printf("少年\n");
}
else
{
if (age <= 44)
{
printf("青年\n");
}
else
{
if (age <= 59)
{
printf("中老年\n");
}
else
{
printf("老年\n");
}
}
}
return 0;
}
1.5 悬空 else 问题
如果有多个 if 和 else ,else 总是与最接近的 if 匹配。只要带上大括号,代码的逻辑就会更加清晰,可读性会更高。
1.6 练习题——闰年的判断
题目:输入一个年份 year,判断 year 是否为闰年
闰年判断规则:
1.能被4整除并且不能被100整除是闰年
2.能被400整除
#include<stdio.h>
//法一:
int main()
{
int year = 0;
scanf_s("%d", &year);
if (year % 4 == 0 && year % 100 != 0)
printf("是闰年\n");
else if (year % 400 == 0)
printf("是闰年\n");
return 0;
}
//法二:
int main()
{
int year = 0;
scanf_s("%d", &year);
if (year % 4 == 0 && year % 100 != 0)||(year % 400 == 0)
printf("是闰年\n");
return 0;
}
2. switch 语句
除了 if 语句,C语言还提供了 switch 语句来实现分支结构
switch 语句是一种特殊的 if...else 结构,用于判断条件有多个结果的情况。它把多重的 else if 该车更易用、可读性更好的形式。
语法形式如下:
1 switch (expression) {
2 case value1:statement
3 case value1:statement
4 default: statement
5 }
以上代码中,根据表达式expression不同的值,执行相应的case分支。如果找不到对应的值,就执行 default 分支
注意:
- switch后的expression必须是整型表达式
- case后的值,必须是整型常量表达式
2.1 if 语句和 switch 语句的对比
举例:输入任意一个整数值,计算除3后的余数
使用 if 语句如下:
#include<stdio.h>
int main()
{
int n=0;
scanf("%d", &n);
if (n % 3 == 0)
printf("整数,余数为0\n");
else if (n % 3 == 1)
printf("余数是1\n");
else
printf("余数是2\n");
return 0;
}
使用 switch 语句如下:
#include<stdio.h>
int main()
{
int n=0;
scanf("%d", &n);
switch (n % 3)
{
case 0:(冒号)
printf("整数,余数为0\n");
break;
case 1:
printf("整数,余数为1\n");
break;
case 2:
printf("整数,余数为2\n");
break;
}
return 0;
}
总结以上代码,注意:
- case和后面的数字之间必须有空格
- 每一个case语句中的代码执行完成后,需要加上break才能跳出这个switch语句
2.2 switch语句中的break
switch语句有分支效果,只有在switch语句中使用break才能跳出switch语句,若某个case语句后没有break语句,代码会继续往下执行,直到遇到break语句或者switch语句结束。
所以在 switch 语句中 break 语句非常重要,能实现真正的分支效果。当然,它的位置根据实际情况而定。
举例:输入1~7的数字,判断是工作日还是休息日
#include<stdio.h>
int main()
{
int day = 0;
printf("请输入1-7的数字用于判断");
scanf_s("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
}
2.3 switch 语句中的 default
在使用 switch 语句时,可能遇到 switch 后的表达式中的值无法匹配代码中的 case 语句,这时,要不不做处理,要不在 switch 语句中加入 default 子句。
1 switch (expression) {
2 case value 1: statement
3 case value 2: statement
4 default: statement
5 }
switch 后边的 expression 的结果不是 value1,也不是 value2 的时候,就会执行 default 子句。
举例:判断今天是工作日还是休息日,输入错误时要显示
#include<stdio.h>
int main()
{
int day = 0;
printf("请输入1-7的数字用于判断");
scanf_s("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
2.4 switch 语句中的 case 和 default 的顺序问题
在switch 语句中,case 语句和 default 语句没有顺序要求,满足实际需求即可,不过通常把 default子句放在最后处理。
3. while 循环
3.1 if 和 while 的对比
1 if(表达式)
2 语句;
3 while(表达式)
4 语句;//如果循环体想包含更多语句,可以加上大括号
举例:
#include<stdio.h>
//代码一:
int main()
{
if (1)
printf("hello world!");//if后条件满足,打印一次hello world!
return 0;
}
#include<stdio.h>
//代码二:
int main()
{
while(1)
printf("hello world!");//while后条件满足,死循环打印hello world!
return 0;
}
3.2 while 语句的执行流程
首先执行判断表达式,表达式的值是0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断是否进行下一次判断。
3.3 while 循环的实践
举例:在屏幕上打印1~10的值
#include<stdio.h>
int main()
{
int i;
while (i <= 10)
{
printf("%d", i);
i = i + 1;
}
return 0;
}
3.4 练习题——输入一个正数,逆序打印这个整数的每一位
解析:
1.可以使用n%10得到n的最低位,得到的余数就是最低位,如:1234%10=4
2.可以使用n/10去掉n的最低位,找出倒数第二位,如:1234/10=123,123%10=3
3.循环1和2步骤,在n变成0之前,可以得到所有位。
#include<stdio.h>
int main()
{
int n = 0;
scanf_s("%d", &n);
while (n)
{
printf("%d", n % 10);
n /= 10;
}
return 0;
}
4. for 循环
4.1 语法形式
for 循环氏三种循环中使用最多的,for 循环语法形式如下:
1 for(表达式1;表达式2;表达式3)
2 语句;//如果循环想包含更多语句,可以加上大括号
表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整
注意:for 循环的初始化、判断、循环三个表达式都可以省略,但是判断部分省略表示判断部分恒为真
4.2 for循环的执行流程
首先执行表达式1,初始化循环变量,接着执行表达式2的判断部分,表达式2的结果为0,则循环结束;表达式2的结果!=0,则执行循环语句,循环语句执行完后再执行表达式2,调整循环变量,然后回到表达式2,判断表达式2结果是否为0,决定循环是否继续。
4.3 for循环的实践
举例:在屏幕上打印1~10的值
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d", i);
}
return 0;
}
4.4 while循环和for循环的对比
for和while在实现循环的过程中都有初始化、判断、调整三个部分,但是for循环的这三个部分非常集中,便于代码维护,如果代码较多的时候while循环的三个部分就比较分数,所以形式上for循环要更优一些。
4.5 练习题
题目:计算1~100之间3的倍数的数字之和
#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;
}
5.do while 循环
5.1 语法形式
在循环语句中do while语句的使用最少,语法如下:
1 do
2 语句;
3 while(表达式);//循环至少执行一次
while 和 for 这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;但do while 循环是先进入循环体,执行循环语句,然后再执行 while 后的判断表达式,表达式为真,就进行下一次,表达式为假,不在继续循环。
5.2 do while 循环的执行流程
在 do while 循环中先执行图上的“语句”,执行完语句,再执行“判断表达式”,判断表达式的结果是!=0,则继续循环,执行循环语句;判断表达式的结果==0,则循环结束。
所以在 do while 语句中循环体至少执行一次,这时 do while 循环特殊的地方。
5.3 do while 循环实例
题目:在屏幕上打印1~10的值
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d", i);
i = i + 1;
} while (i <= 10);
return 0;
}
一般 do while 使用在循环体至少被执行一次的场景下,所以少一些。
5.4 练习——输入一个正整数,计算这个整数是几位数
#include<stdio.h>
int main()
{
int n = 0;
scanf_s("%d", &n);
int cnt = 0;
do
{
cnt++;
n = n / 10;
} while (n);//n=0就跳出循环
printf("%d\n", cnt);
return 0;
}
这里并非必须使用 do while 语句,但是这个代码比较适合do while 循环,因为n即使是0,也是1位数,要统计位数。
6.break 和 continue 语句
在循环执行的过程中,若某些状况发生时需要提前终止循环,这种情况很常见。C语言提供了 break 和 continue 两个关键字用于循环。
- break的作用是永久终止循环,只要break被执行,直接跳出循环,继续往后执行。
- continue的作用是跳过本次循环continue后边的代码,在for循环和while循环中有所差异
6.1 while 循环中的 break 和 continue
6.1.1 break 举例——打印数字
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;//当i等于5后,就执行break,循环就终止了
printf("%d", i);
i = i + 1;
}
return 0;
}
执行结果为:1 2 3 4
此处,break 的作用是永久终止循环,只要 break 被执行,break 外的第一层循环就终止了。
所以在循环中,想在某种条件下终止循环,可以使用 break 达到效果。
6.1.2 continue 举例
continue 是继续的意思,在循环中的作用是跳过本次循环中的 continue 后的代码,继续执行下一次循环的判断。
将上一个例子中的 break 换成 continue 举例:
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
//当i等于5后,就执行continue,直接跳过continue后面的代码,去循环的判断地方
//这里跳过了i=i+1,所以i一直为5,程序陷入死循环
printf("%d", i);
i = i + 1;
}
return 0;
}
通过以上可以总结出continue可以使程序跳过某一次循环continue后的代码,直接到循环判断部分,进下一次循环,如果循环调整在continue后的话,可能会造成死循环。
6.2 for循环中的break和continue
6.2.1 break 举例
同 while 循环中的 break , for 循环中的 break 也用于终止循环,不管循环需要多少次,只要执行到break ,循环就彻底终止。
#include<stdio.h>
int main()
{
int i = 1;
for(i=1;i<=10;i++)
{
if (i == 5)
break;
printf("%d", i);
}
return 0;
}
运行结果:1 2 3 4
6.2.2 continue 举例
将上一个例子中的 break 换成 continue 举例:
#include<stdio.h>
int main()
{
int i = 1;
for(i=1;i<=10;i++)
{
if (i == 5)
continue;//这里continue跳过了后边的打印,来到了i++的部分
printf("%d", i);
}
return 0;
}
运行结果:1 2 3 4 6 7 8 9 10
通过以上可以总结出 for 循环中 continue 的作用是跳过本次循环中 continue 后的代码,直接到循环的调整部分。当某个条件发生时,本次循环无需再执行后续某些操作时,可以使用 continue 实现。
6.3 do while 循环中的 break 和 continue
do while 循环中的 break 和 continue 的作用和 while 循环中几乎一模一样,请看相关代码:
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
break;
printf("%d", i);
i = i + 1;
} while (i <= 10);
return 0;
}
运行结果:1 2 3 4
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
continue;
printf("%d", i);
i = i + 1;
} while (i <= 10);
return 0;
}
运行结果:1 2 3 4_程序陷入死循环
7.循环的嵌套
前面提到的三种循环 while,do while , for , 这三种循环往往会嵌套在一起才能更好的解决问题,成为循环嵌套。
题目练习——找出100~200之间的素数,并打印在屏幕上:
题目解析:
- 首先得到100~200之间的数,可以使用循环解决问题。
- 假设判断i是否为素数,需要拿 2~( i-1) 之间的数字去试除 i , 产生2~( i-1 )之间的数字,也可用循环。
- 若2~( i-1)之间有数字能整除 i ,则 i 不是素数,若不能整除,则 i 是素数。
以上是基本解题思路,但是具体编写程序时还可以优化,提高效率。
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
for (i = 101; i <= 200; i += 2)//优化:素数不可能是偶数,所以从101开始,每次+2
{
int j = 0;
int flag = 1;//假设i是素数
for (j = 2; j<=sqrt(i); j++)//优化
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
printf("%d ", i);
}
return 0;
}
* goto 语句
C语言提供了一种特别的语法,就是goto语句和跳转标号,goto语句可以实现在同一个函数内跳转到设置好的标号处。
例如:
#include<stdio.h>
int main()
{
printf("hello\n");
goto next;
printf("world\n");
next:
printf("跳过world的打印\n");
return 0;
}
goto语句如果使用不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以尽量不去使用;但是goto语句并非一无是处,在多层循环的代码中,若想快速跳出,使用goto语句就很方便。
1 for(...)
2 {
3 for(...)
4 {
5 for(...)
6 {
7 if (disaster)
8 goto error;
9 }
10 }
11 }
12
13 error:
14 //...
本来 for 循环想提前退出得使用 break ,一个 break 只能跳出一层 for 循环,如果3层循环嵌套就得使用3个break才能跳出循环,所以在这种情况下使用goto语句就会更快捷。
总结
以上就是要讲的内容,本文仅仅简要介绍了C语言分支和循环结构的知识及应用。这些结构不仅为程序员提供了编程的灵活性,而且对于构建清晰、高效的程序流程至关重要。例如,使用嵌套的分支和循环可以解决更复杂的问题,如图形渲染、算法优化等。此外,分支和循环的高级应用,如循环嵌套、分支嵌套、循环套分支和分支套循环等,进一步扩展了它们的功能和实用性。
总之,分支和循环结构是C语言的核心组成部分,对程序的逻辑和控制流起到了关键作用。深入理解和掌握这些结构对于编写高效、健壮的C语言程序至关重要。希望以上内容可以帮助到您!