前言
学习了前面的基础内容后,我们就可以进入C语言的重要部分——分支与循环,从这一部分开始,就要勤于练习,才能有成效,本篇为知识讲解,下篇为实战演练,可根据目录跳转哦。
C语言超详细讲解——分支与循环【知识讲解篇】
正文
C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构,我们之后所有的代码都可以拆分为这三种结构。总的来说,可以使用if、switch实现分支结构,使用for、while、do while实现循环结构。
1 if语句
1.1 if
if语句的语法形式:
> if (表达式)
> 语句
表达式成立(为真,非0),则语句执行;表达式不成立(为假,0),则语句不执行。

举例
判断一个数为奇数,我们知道奇数被除2余1,所以代码可以这样写
#include <stdio.h>
int main()
{
int num = 0;//初始化
scanf("%d", &num);
if(num % 2 == 1 )
printf("%d是奇数\n", num);
return 0;
}
1.2 else
else是与if搭配使用
if…else…语句语法形式:
if (表达式)
语句1
else
语句2
这样我们可以将判断奇偶的代码补充完整
#include<stdio.h>
int main() {
int num=0;
scanf("%d",&num);
if(num%2 ==1)
printf("%d是奇数\n",num);
else
printf("%d是偶数\n",num);
return 0;
}
自己在VS中练习一下
练习:用年龄判断一个人成年了吗?
#include<stdio.h>
int main()
{
int age=0;
scanf("%d",&age);
if(age>=18)
printf("成年了\n");
else
printf("未成年\n");
return 0;
}
1.3 分支中包含多条语句
默认if和else语句只控制一条语句,若要控制多条语句,需使用{}将代码括起来(程序块或复合语句)。
#include <stdio.h>
int main() {
int age = 0;
scanf("%d", &age);
if(age >= 18)
{
printf("成年了\n");
printf("可以谈恋爱了\n");
}
return 0;
}
如果不用{},if包含第一条语句,无论是否age >= 18,都会执行printf(“可以谈恋爱了\n”);
1.4 嵌套if
在if else语句中,else可与另一个if语句连用,构成多重判断。
例:判断输入整数是0,还是正数或者负数(自己思考一下)
#include<stdio.h>
int main()
{
int num=0;
scanf("%d",&num);
if(num==0)
printf("输入的数字是0\n");
else if(num>0)
printf("输入的数字是正数\n");
else
printf("输入的数字是负数\n");
return 0;
}
练习:根据年龄打印不同阶段。
// 方法1
#include <stdio.h>
int main() {
int age=0;
scanf("%d", &age);
if(age<18)
printf("少年\n");
else if(age<=44)
printf("青年\n");
else if(age<=59)
printf("中老年\n");
else if(age<=89)
printf("老年\n");
else
printf("老寿星\n");
return 0;
}
这个问题中是不是if,else很多很麻烦,别急,等会有更简单的switch
1.5 悬空else问题
有时候遇到一些不注意代码缩进的同学,if嵌套写的乱七八糟,
#include <stdio.h>
int main() {
int a = 0;
int b = 3;
if (a == 0)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
请问
else
printf(“haha\n”);
匹配的if是哪一个?
这时候记得:else总是跟最接近的if匹配。
最好这么写
#include <stdio.h>
int main() {
int a = 0;
int b = 3;
if (a == 0)
{
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
1.6 综合小练习:闰年的判断
闰年判断规则:能被4整除并且不能被100整除是闰年;能被400整除是闰年。
#include <stdio.h>
int main() {
int year = 0;
scanf("%d", &year);
if(year%4==0 && year%100!=0)
printf("是闰年\n");
else if(year%400==0)
printf("是闰年\n");
else
printf("不是闰年\n");
return 0;
}
2. switch语句
switch语句是一种特殊形式的if…else结构,用于判断条件有多个结果的情况。
switch (expression) {
case value1: statement;
case value2: statement;
...
default: statement;
}
switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执⾏default ⼦句。
2.1 if语句和switch语句的对比
// 使用if语句计算除3之后的余数
#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
每个case语句中的代码执行完成后,需要加上break,才能跳出这个switch语句,否则代码会继续往下执行。
// 输入1~7的数字,打印对应的星期几
#include<stdio.h>
int main() {
int day=0;
scanf("%d", &day);
switch(day) {
case 1:
printf("星期一\n");
break;
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;
}
return 0;
}
switch 语句中 break 语句是⾮常重要的,能实现真正的分⽀效果。当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。
2.3 switch语句中的default
当switch后的表达式的值无法匹配代码中的case语句时,可加入default子句进行处理。
#include <stdio.h>
int main() {
int day=0;
scanf("%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循环
C语⾔提供了3种循环语句, while 就是其中⼀种,接下来就介绍⼀下 while 语句。
while 语句的语法结构和 if 语句⾮常相似。
3.1 if和while的对比
if(表达式)
语句;
while(表达式)
语句;//如果循环体想包含更多的语句,可以加上⼤括号
if语句条件满足时执行一次语句,while语句条件满足时可实现循环效果。
// if语句示例
#include <stdio.h>
int main() {
if(1)
printf("hehe\n");
return 0;
}
//代码2
#include <stdio.h>
int main()
{
while(1)
printf("hehe\n"); //while后边的条件满⾜,死循环的打印hehe
return 0;
}
这就是他们的区别,while语句是可以实现循环效果的。
(运行结果知道后记得关掉黑框(DOS)死循环占用内存)
3.2 while语句的执行流程
先判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断是否进行下一次循环。
3.3 while循环的实践
// 在屏幕上打印1~10的值
#include <stdio.h>
int main() {
int i = 1;
while(i<=10) {
printf("%d ", i);
i = i+1; //i++;
}
return 0;
}
题⽬解析
- 要想得到n的最低位,可以使⽤n%10的运算,得到的余数就是最低位,如:1234%10得到4
- 要想去掉n的最低位,找出倒数第⼆位,则使⽤ n=n/10 操作就可以去掉最低位的,如:
n=1234/10得到123,123相较于1234就去掉了最低位,123%10就得到倒数第⼆位3。 - 循环1和2两个步骤,在n变成0之前,就能到所有的位。
3.4 练习
输入一个正的整数,逆序打印这个整数的每一位。
#include <stdio.h>
int main() {
int n = 0;
scanf("%d",&n);
while(n) {
printf("%d ", n%10);
n /= 10;
}
return 0;
}
4. for循环
4.1 语法形式
for(表达式1; 表达式2; 表达式3)
语句
表达式1用于循环变量的初始化,表达式2用于循环结束条件的判断,表达式3用于循环变量的调整。
4.2 for循环的执行流程
首先执行表达式1初始化循环变量,接着执行表达式2的判断部分,若表达式2的结果为0,则循环结束;若不为0则执行循环语句,循环语句执行完后,执行表达式3调整循环变量,然后再去判断表达式2,决定循环是否继续。
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=1;i<=100;i++) {
if(i%3==0)
sum+=i;
}
printf("%d\n",sum);
return 0;
}
5. do-while循环
5.1 语法形式
do
语句;
while(表达式);
while和for循环先判断条件再执行循环语句,do while循环先执行循环体,再执行while后的判断表达式。
5.2 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;
}
5.4 练习
输入一个正整数,计算这个整数是几位数。
#include <stdio.h>
int main()
{
int n=0;
scanf("%d",&n);
int cnt=0;
do {
cnt++;
n=n/10;
}while(n);
printf("%d\n",cnt);
return 0;
}
6. break和continue语句
break用于永久终止循环,continue用于跳过本次循环中continue后边的代码。
6.1 while循环中的break和continue
// break举例
#include <stdio.h>
int main()
{
int i=1;
while(i<=10) {
if(i==5)
break;
printf("%d",i);
i =i+1;
}
return 0;
}

continute举例
#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
// break举例
#include<stdio.h>
int main()
{
int i=1;
for(i=1;i<=10;i++) {
if(i==5)
break;
printf("%d",i);
}
return 0;
}

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;
}
7. 循环的嵌套
三种循环(while、do while、for)往往会嵌套在一起解决问题。
例 :找出100~200之间的素数,并打印在屏幕上
解析:
- 要从100-200之间找出素数,⾸先得有100~200之间的数,这⾥可以使⽤循环解决。
- 假设要判断i是否为素数,需要拿2—i-1之间的数字去试除i,需要产⽣2~i-1之间的数字,也可以使⽤
循环解决。 - 如果2~i-1之间有数字能整除i,则i不是素数,如果都不能整除,则i是素数。
#include <stdio.h>
int main()
{
int i=0;
for(i=100;i<=200;i++) {
int j=0;
int flag=1;
for(j=2;j<i;j++) {
if(i%j==0) {
flag=0;
break;
}
}
if(flag ==1)
printf("%d ",i);
}
return 0;
}
8. goto语句
goto语句可以实现在同一个函数内跳转到设置好的标号处。
#include<stdio.h>
int main() {
goto next;//next为标号
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return0;
}
注意:这儿只是介绍,新手暂时不要使用goto,等以后有更深的理解后,再酌情使用,不然有可能将系统搞死!!!
总结
分支与循环的讲解就这些,内容不多,但要勤于练习,勤于思考,如有谬误,欢迎评论区指正,下期是一个实战练习,敬请期待,希望点赞关注收藏支持一下,谢谢。
1305

被折叠的 条评论
为什么被折叠?



