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 1
和cose 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
// 循环变量
- 打印
i
- 给
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(表达式);
while
和for
这两种循环都是先判断,条件如果满足就进入循环体,执行循环语句。如果不满足就跳出循环;
而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语言提供的break
和continue
两个关键字,并将其应用到循环当中
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. 循环的嵌套
前面介绍的三种循环whlie
,do whlie
,for
,这三种循环往往会嵌套在一起才能更好的解决问题,下面要介绍的循环嵌套。
6.1 练习
找到100~200
之间的素数,并打印在屏幕上。
注:素数又被称为质数,只能被1
和本身整除的数字
6.2 题目解析
- 要从
100~200
之间找出素数,首先得有100~200
之间的数,这里可以使用循环解决 - 假设要判断
i
是否为素数,需要拿2~(i-1)
之间的数字取逐一除以i
,需要产生2~(i-1)
之间的数字,也可以使用循环解决 - 如果
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;
}