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}

上述的代码中,我们要注意的点有:

  1. case 和后边的数字之间必须有空格
  2. 每⼀个 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;
}

题⽬解析

  1. 要想得到n的最低位,可以使⽤n%10的运算,得到的余数就是最低位,如:1234%10得到4
  2. 要想去掉n的最低位,找出倒数第⼆位,则使⽤ n=n/10 操作就可以去掉最低位的,如:
    n=1234/10得到123,123相较于1234就去掉了最低位,123%10就得到倒数第⼆位3。
  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之间的素数,并打印在屏幕上
解析:

  1. 要从100-200之间找出素数,⾸先得有100~200之间的数,这⾥可以使⽤循环解决。
  2. 假设要判断i是否为素数,需要拿2—i-1之间的数字去试除i,需要产⽣2~i-1之间的数字,也可以使⽤
    循环解决。
  3. 如果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,等以后有更深的理解后,再酌情使用,不然有可能将系统搞死!!!

总结

分支与循环的讲解就这些,内容不多,但要勤于练习,勤于思考,如有谬误,欢迎评论区指正,下期是一个实战练习,敬请期待,希望点赞关注收藏支持一下,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值