分支和循环语句 (2/ 2)

1. switch语句

除了if语句外,C语言还提供了switch语句来实现分支结构。

switch语句是一种特殊形式的if...else...结构,用于判断条件有多个结果的情况。它把多重的else if改成更容易使用的,可读性更好的形式。

1.1 语法格式

arduino 复制代码
switch (expression){
    case value1: statemant
    case value2: statemant 
    default: statemant
}

上面代码中,根据表达式expression值的不同,执行相应的case分支。如果找不到对应的分支就会执行default分支

注意:

  • switch后的表达式expression必须是整型表达式
  • case后的值,必须是整型常量表达式
  • 字符类型也被归类为整型家族,因为字符的本质是ASCII码值,这个值是整数。

代码题:输入任意一个整数,计算除以3的余数是多少

思路:任意整数除以3的余数结果只有3种情况,分别是 0,1,2

一个示例代码,输出一个意想不到的结果^_^

arduino 复制代码
#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    switch (n % 3)
    {
    case 0:
        printf("余数是0\n");
    case 1:
        printf("余数是1\n");
    case 2:
        printf("余数是2\n");
    }
    return 0;
}

1.2 switch语句中的break

我们尝试运行该段代码,并在键盘上输入3,它的打印结果是

复制代码
余数是0
余数是1
余数是2

我们会发现3除以3的余数为0,但是打印出来的结果却多出了两行,这是为什么呢?

原因是switch语句也是分支类型的语句,只有在switch语句中使用break才能够跳出switch语句。如果一个case语句的后面没有break语句,代码会继续执行下去。也就是它会执行case等于其他值的情况,直到遇到break语句或者switch语句结束。

比如前面的代码,我们输入3之后,遇到正确结果 cose 0即余数为0的条件,就会打印余数是0,因为没有遇到break语句,所以程序会继续执行cose 1cose 2条件下的值,也就出现了5.2节开头的那一幕。

所以switch语句中的break语句是非常重要的成分,它能够实现真正的分支效果。

下面是针对1.1代码题的修正,参考示例

arduino 复制代码
#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;
}

当然,break语句也不是每个case语句都必须要有的,这就要看具体情况具体分析

下面是一个练习,根据需求写break语句

  • 输入1~7的数字,打印对应的星期几,例如

    输入: 1 输出:星期一

    输入: 2 输出:星期二

    输入: 3 输出:星期三

    输入: 4 输出:星期四

    输入: 5 输出:星期五

    输入: 6 输出:星期六

    输入: 7 输出:星期天

  • 输入1~7的数字,打印对应的是工作日,还是休息日,例如

    输入1~5,输出的是"工作日"

    输入6~7,输出的就是"休息日"

我将在本文的末尾加入参考的示例代码

1.3 switch语句中的default

在使用switch语句的时候,我们经常会遇到一种情况,比如,switch后的表达式中的值无法匹配代码中的case语句的时候,这时候会出现无法处理的情况,此时我们需要加入default子句。

switch语句的语法格式

arduino 复制代码
switch (expression){
    case value1: statemant
    case value2: statemant 
    default: statemant
}

switch后面的expression的结果不是value1,也不是value2时,就会执行default子句。

就比如我们前面做的打印星期几的练习,如果输入的day的值不是1~7的值,我们需要给出如下提示:输入错误,请输入1~7范围的整数。参考代码如下

arduino 复制代码
int main()
{
    int day = 0;
    scanf("%d", &day);
    switch (day)
    {
    case 1:
        printf("星期一");
        break;
    case 2:
        printf("星期二");
        break;
    case 3:
        printf("星期三");
        break;
    case 4:
        printf("星期四");
        break;
    case 5:
        printf("星期五");
        break;
    case 6:
        printf("星期六");
        break;
    case 7:
        printf("星期天");
        break;
    default:
        printf("输入错误,请输入1~7范围的整数");
    }
    return 0;
}

1.4 switch语句中的case和default的顺序问题

switch语句中case子句和default子句是没有顺序要求的,只要你的顺序能够满足实际需求的就可以

不过我们通常会把default子句放在最后处理。

2. while语句

C语言提供了3种循环语句,while语句就是其中的一种。

2.1 语法格式

while语句与if语句在语法格式上非常相似

scss 复制代码
if (表达式)
    语句;
​
while (表达式)
    语句; // 如果循环体包含更多的语句,可以使用大括号

2.2 while语句的执行流程

首先上来就执行判断表达式,表达式的值为0,循环直接结束;表达式的结果不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断,或者结束循环。

2.3 循环体的练习

在屏幕上打印1~10的值

思路:产生1~10的值

i = 1 // 循环变量

  1. 打印 i
  2. i+1

参考代码,注意方法不止一种

arduino 复制代码
#include <stdio.h>
int main()
{
    int i = 1;
    while (i <= 10)
    {
        printf("%d ", i);
        i++;
    }
    return 0;
}

输入一个整数,逆序打印这个整数的每一位,例如

输入:1234 输出:4 3 2 1

输入:521 输出:1 2 5

思路:

代码参考

arduino 复制代码
#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    while (n)
    {
        printf("%d ", n % 10);
        n = n / 10;
    }
    return 0;
}

3. for循环

3.1 语法格式

for循环是三种循环中使用最多的,其语法格式如下

ini 复制代码
for (表达式1; 表达式2; 表达式3)
    语句;  // 如果循环体想要包含更多的语句,可以加上大括号
  • 表达式1:初始化表达式
  • 表达式2:判断表达式
  • 表达式3:调整

例如,在屏幕上打印1~10的数字,以下是代码参考

arduino 复制代码
#include <stdio.h>
int main()
{
    int i = 0;
    for (i = 1; i <= 10; i++)
    {
        printf("%d ", i);
    }
    return 0;
}

for循环的初始化部分只会被执行一次!

3.2 for循环的执行流程图

3.3 for循环和while循环的对比

for循环和while循环在实际循环的过程中都有初始化,判断,调整三个部分,但是for循环的三个部分非常集中,方便之后的代码维护。在代码较多的时候,while循环相对分散的三个部分,可能不方便维护。

3.4 练习实践

计算1~100之间3的倍数的数字之和,以下是参考代码

ini 复制代码
#include <stdio.h>
int main()
{
    int i = 0;
    int sum = 0;
    // 方法1
    for (i = 1; i <= 100; i++)
    {
        //printf("%d\n", i);
        //判断i是否是3的倍数
        if (i % 3 == 0)
            sum += i;
    }
    printf("%d\n", sum);
​
    // 方法2
    for (i = 3; i <= 100; i += 3)
    {
        sum += i;
    }
    printf("%d\n", sum);
    return 0;
}

4. do-while循环

4.1 语法格式

在循环语句中do-while语句的使用最少,它的语法如下,

arduino 复制代码
do
    语句;
while(表达式);

whilefor这两种循环都是先判断,条件如果满足就进入循环体,执行循环语句。如果不满足就跳出循环;

do-while循环则是先直接进入循环体,执行循环语句,然后再执行while后的判断表达式,表达式为真,就会进行下一次循环,如果表达式为假,则不再继续循环。

do-while的循环体至少被执行一次

例如,使用 do while 在屏幕上打印1~10的数字,以下是代码参考

arduino 复制代码
#include <stdio.h>
int main()
{
    int i = 1;
    do
    {
        printf("%d ", i);
        i++;
    } while (i <= 10);
    return 0;
}

4.2 do-while循环的执行流程图

4.3 练习实践

输入一个正整数,计算这个整数是几位数?

例如

输入:1234 输出:4

输入: 12 输出:2

以下是参考代码,

ini 复制代码
#include<stdio.h>
int main()
{
    int n = 0;
    // 计数器 -- 统计整数的位数
    int count = 0;
    scanf("%d", &n);
    do
    {
        count++; 
        n = n / 10;
    } while (n);
    return 0;
}

5. break和continue语句

在执行循环体的过程中,如果出现某些情况,需要提前终止循环的时候,就用到了C语言提供的breakcontinue两个关键字,并将其应用到循环当中

  • break的作用是用于永久的终止循环,只要break被执行,直接就会跳出循环体,继续向后执行
  • continue的作用是跳过本次循环中continue后面的代码,并且在三种循环中也是有所差异

5.1 whlie循环语句中的break和continue语句

  • break举例: 用于终止整个循环

    使用 while 在屏幕上打印1,2,3,4的数字,以下是代码参考

    arduino 复制代码
    #include<stdio.h>
    int main()
    {
        int i = 1;
        while (i <= 10)
        {
            if (i == 5)
                break;
            printf("%d ", i);
            i++;
        }
        return 0;
    }
    // 输出
    // 1 2 3 4
  • continue举例 使用 while 在屏幕上打印1,2,3,4,6,7,8,9,10的数字,以下是代码参考

    arduino 复制代码
    #include<stdio.h>
    int main()
    {
        int i = 0;
        while (i < 10)
        {
            i++;
            if (i == 5)
                continue;
            printf("%d ", i);
        }
        return 0;
    }
    // 1 2 3 4 6 7 8 9 10

5.2 for循环语句中的break和continue语句

  • break举例: 用于终止整个循环

    使用 for 在屏幕上打印1,2,3,4的数字,以下是代码参考

    ini 复制代码
    #include<stdio.h>
    int main()
    {
        int i = 0;
        for (i = 1; i <= 10; i++)
        {
            if (i == 5)
                break;
            printf("%d ", i);
        }
        return 0;
    }
    // 1 2 3 4
  • continue举例 使用 for 在屏幕上打印1,2,3,4,6,7,8,9,10的数字,以下是代码参考

    ini 复制代码
    #include<stdio.h>
    int main()
    {
        int i = 0;
        for (i = 1; i <= 10; i++)
        {
            if (i == 5)
                continue;
            printf("%d ", i);
        }
        return 0;
    }
    // 1 2 3 4 6 7 8 9 10

5.3 do whlie循环语句中的break和continue语句

  • break举例: 用于终止整个循环

    使用 do whlie 在屏幕上打印1,2,3,4的数字,以下是代码参考

    arduino 复制代码
    #include<stdio.h>
    int main()
    {
        int i = 1;
        do
        {
            if (i == 5)
                break;
            printf("%d ", i);
            i++;
        } while (i <= 10);
        return 0;
    }
  • continue举例 使用 do whlie 在屏幕上打印1,2,3,4,6,7,8,9,10的数字,以下是代码参考

    arduino 复制代码
    #include<stdio.h>
    int main()
    {
        int i = 0;
        do
        {
            i++;
            if (i == 5)
                continue;
            printf("%d ", i);
        } while (i < 10);
        return 0;
    }

6. 循环的嵌套

前面介绍的三种循环whliedo whliefor,这三种循环往往会嵌套在一起才能更好的解决问题,下面要介绍的循环嵌套。

6.1 练习

找到100~200之间的素数,并打印在屏幕上。

注:素数又被称为质数,只能被1和本身整除的数字

6.2 题目解析

  1. 要从100~200之间找出素数,首先得有100~200之间的数,这里可以使用循环解决
  2. 假设要判断i是否为素数,需要拿2~(i-1)之间的数字取逐一除以i,需要产生2~(i-1)之间的数字,也可以使用循环解决
  3. 如果2~(i-1)之间有数字能整除i,则i不是素数,如果都不能整除,则i是素数

参考代码

ini 复制代码
#include<stdio.h>
int main()
{
    int i = 0;
    int count = 0;
    for (i = 100; i <= 200; i++)
    {
        int flag = 1;// 假设i是一个素数
        //printf("%d ", i);
        //每次循环都会产生一个数
        // 判断 i 是否为素数
        // 产生 2~(i-1)之间的数字去尝试除以 i
        int j = 0;
        for (j = 2; j <= i - 1; j++)
        {
            if (i % j == 0)
            {
                flag = 0;
                break;
            }
        }
        // 
        if (flag == 1)
        {
            count++;
            printf("%d ", i);
        }
    }
    // 输出的素数一共有多少个
    printf("\ncount = %d", count);
    return 0;
}

我们现在对上面的代码进行优化,使得其相率增加

思路1 : 由于素数只能够被1和它本身整除,为此,我们可以排除100到200之间的奇数的方法可以是 for (i = 101; i < 200; i += 2)

思路2 : 简化产生 2~(i-1)之间的数字去尝试除以 i,如下图所示,我们可以得出下面的结论

如果要判断i是否为素数,只要拿2~\sqrt i

其中在C语言中的开根号的操作,需要是使用到sqrt-- 开根号的库函数,

main函数之前需要导入头文件 math.h

以下是修改后的参考代码

ini 复制代码
#include<stdio.h>
#include<math.h>
int main()
{
    int i = 0;
    int count = 0;
    for (i = 101; i < 200; i+=2)
    {
        int flag = 1;// 假设i是一个素数
        //printf("%d ", i);
        //每次循环都会产生一个数
        // 判断 i 是否为素数
        // 产生 2~(i-1)之间的数字去尝试除以 i
        int j = 0;
        for (j = 2; j <= sqrt(i); j++)
        {
            if (i % j == 0)
            {
                flag = 0;
                break;
            }
        }
        // 
        if (flag == 1)
        {
            count++;
            printf("%d ", i);
        }
    }
    // 输出的素数一共有多少个
    printf("\ncount = %d", count);
    return 0;
}

7. goto语句

C语言中提供了一种非常特别的语法,就是goto语句和跳转标号,goto语句可以实现在同一个函数内跳转到设置好的的标号。

例如

arduino 复制代码
#include<stdio.h>
int main()
{
    printf("word\n");
    if (1)
    {
        goto end;
        printf("ppt\n");
    }
end:
    printf("end\n");
    return 0;
}

goto语句如果使用不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以尽量不要轻易去使用。但是goto也不是一无是处,在多层循环嵌套的代码中,想要跳出嵌套的方式

  • 可以使用break一层一层的往外跳
  • 可以使用goto语句实现快速跳出循环嵌套中

练习

输入1~7的数字,打印对应的星期几

arduino 复制代码
#include <stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("星期一");
		break;
	case 2:
		printf("星期二");
		break;
	case 3:
		printf("星期三");
		break;
	case 4:
		printf("星期四");
		break;
	case 5:
		printf("星期五");
		break;
	case 6:
		printf("星期六");
		break;
	case 7:
		printf("星期天");
		break;
	}
	return 0;
}

输入1~7的数字,打印对应的是工作日,还是休息日

arduino 复制代码
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日");
		break;
	case 6:
	case 7:
		printf("休息日");
		break;
	}
	return 0;
}
相关推荐
草莓熊Lotso1 小时前
【数据结构初阶】--双向链表(二)
c语言·数据结构·经验分享·链表·刷题
遇见尚硅谷4 小时前
C语言:20250719笔记
c语言·开发语言·数据结构·c++·算法
秋说4 小时前
【PTA数据结构 | C语言版】根据后序和中序遍历输出前序遍历
c语言·数据结构·算法
计算机筱贺5 小时前
408数据结构强化(自用)
c语言·数据结构·算法
C语言小火车6 小时前
【面试题】大厂高压面经实录丨第二期
c语言·开发语言·数据结构·c++·算法
Lum11048 小时前
C语言学习路线
c语言
杜子不疼.9 小时前
C语言—深入理解指针(详)
c语言·开发语言
shdbdndj17 小时前
C语言:预处理
c语言·预处理
屁股割了还要学18 小时前
【C语言进阶】题目练习(2)
c语言·开发语言·c++·学习·算法·青少年编程