在编程世界中,控制流结构是实现逻辑控制和重复执行的基础。而C语言中的分支和循环结构,为程序员提供了强大的工具来控制程序的执行路径和重复运行特定代码块的能力。本文将深入探讨C语言中的分支和循环结构,揭示它们的原理和常见用例,以帮助读者更好地理解和运用这些重要的控制结构。
1.分支结构
分支结构可用于根据条件选择不同的执行路径。在C语言中,最常见的分支结构是if-else语句和switch语句。
(一)if语句
-if
if基本语法如下
if(表达式)
语句;
若表达式成立,则执行下列语句,表达式不成立(为假),则语句不成立(在c语言中,0为假,非0为真)
if-else语句
if-else语句根据条件的真假,选择性地执行不同的代码块。它的基本语法如下:
if ()
{
// 如果条件为真,执行这里的代码
}
else {
// 如果条件为假,执行这里的代码
}
if-else语句对条件进行判断,如果条件为真,则执行if代码块中的语句;如果条件为假,则执行else代码块中的语句。它可以用于处理二选一的情况。
例如:判断一个数是否为奇数,可写如下代码
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);//输入要判断的数字
if (num % 2 == 0)//如果num % 2不为零,则num % 2 == 0为假,则执行else里语句
printf("%d是偶数",num);
else
printf("%d是奇数",num);
return 0;
}
-嵌套if
在if-else语句中,else可以和另一个if连用,构成多重判断
例如:0-6岁为婴幼儿;7-12岁为少儿;13-17岁为青少年;18-45岁为青年;46-69岁为中年;69岁以上为老年,给定一个年龄判断属于哪什么年龄阶段,代码可如下
#include<stdio.h>
int main()
{
int num = 0;//年龄
scanf("%d", &num);
//输入年龄后开始判断
if (num >= 0 && num <= 6)
{
printf("婴幼儿");
}
else if (num >= 7 && num <= 12)
{
printf("少儿");
}
else if (num >= 13 && num <= 17)
{
printf("青少年");
}
else if (num >= 18 && num <= 45)
{
printf("青年");
}
else if (num >= 46 && num <= 69)
{
printf("中年");
}
else
{
printf("老年");
}
return 0;
}
除此之外,在if语句里也可嵌套另外if语句,如下
if(语句)
{
if(语句)
}
else
又或者如下:
if(语句)
{
if(语句)
{
}
else
}
else
注意:此处有一个else悬空问题,如果有多个if和else,else总是和最近的if配对,我们写代码时常将else对应if相对齐,写代码养成一个良好的代码习惯对阅读有着很大的作用。
(二)switch语句
switch语句通过将表达式与一系列可能的常量值进行匹配,选择性地执行匹配到的代码块。它的基本语法如下:
```
switch (表达式) {
case constant1:
// 如果表达式等于constant1,执行这里的代码
break;
case constant2:
// 如果表达式等于constant2,执行这里的代码
break;
default:
// 如果表达式没有匹配到任何常量值,执行这里的代码
break;
}
switch语句根据表达式的值,依次比较每个case后面的常量值。如果表达式等于某个常量值,就执行对应的代码块。如果没有匹配到任何常量值,则执行default代码块。
注意:(1)switch后的表达式必须是整形表达式 (2)case后的值,必须是整形常量表达式
(3)case和后面的数字之间必须有空格 (4)每一个case语句中的代码执行完后必须用break,才能跳出switch语句。
针对第四点,我们看如下代码
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n%2)
{
case 0:
{
printf("偶数");
break;
}
case 1:
{
printf("奇数");
break;
}
}
}
其运行结果如下:
而当printf后没有break时,即:
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n%2)
{
case 0:
{
printf("偶数");
}
case 1:
{
printf("奇数");
}
}
}
其运行结果为:
每一个case语句中的代码执行完后必须用break,才能跳出switch语句。
我们也可运用这一特性来进行代码编写,如下:
练习: 输入1-7的数字,输入1-5是”工作日“,输入6-7是”休息日“
其代码如下写
#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;
}
}
return 0;
}
其运行结果为
当然,肯定会有同学想到,如果我输入1-7以外的数字要怎么办呢,这时我们就可以在里面加入default子句,当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("输入错误");
break;
}
}
return 0;
}
其结果如下:
switch与default并没有顺序要求,只要你顺序满足实际需求就行,不过我们通常将default子句放在最后处理的
2. 循环结构
循环结构允许程序重复执行特定的代码块。在C语言中,最常用的循环结构是for循环、while循环和do-while循环。
-(一) for循环
for循环通过设置初始条件、判断条件和更新条件来控制循环的执行次数。它的基本语法如下:
for (表达式1; 表达式2,表达式3)
//表达式1用于循环变量初始化
//表达式二用于循环变量结束判断
//表达式3用于循环变量调整(也就是自增或者自减)
{
// 在条件为真的情况下,重复执行这里的代码
}
```
for循环首先进行初始化操作,然后每次循环前都会检查条件是否为真。如果条件为真,则执行循环体中的代码,然后执行更新操作。这个过程会重复进行,直到条件不再为真。
-(二) while循环:
while循环根据条件的真假来重复执行代码块。它的基本语法如下:
while (condition)
{
// 在条件为真的情况下,重复执行这里的代码
}
while循环在每次循环前都会检查条件是否为真。只要条件为真,就会执行循环体中的代码,然后再次检查条件。如果条件为假,则跳出循环。
-(三) do-while循环:
do-while循环也是根据条件的真假来重复执行代码块,但它是先执行一次循环体,然后再检查条件。它的基本语法如下:
```
do {
// 先执行这里的代码
} while (condition);
相对于while与for循环,do-while循环至少会执行一次循环体中的代码,然后再检查条件。只要条件为真,就会继续执行循环体,并重复这个过程。即do-while至少会执行一次。
-(三)break与continue
在循环过程中,我们可能会有特殊情况导致需要提前退出循环或者跳过本次循环进入下一次循环,这时我们就可以用break和continue两个关键字来实现。
break的作用是用于永久终止循环,只要break被执行,直接就会跳出循环,继续往后执行。
continue作用是跳过本次循环continue后面的代码,在for循环和while循环中有所差异。即跳过之后循环任然进行。
以下为continue在while与for中的区别:
我们可以看到,while循环i自加到5时开始了coutinue回到while判断的死循环,故只打印了1234,
而for循环中continue回到for中判断与自加都进行,因此打印1234678910,。这也是while与for中continue区别。
-(四)go to语句
goto语句与跳转符号是c语言中一种非常特别的语法,go to 可以实现在同一函数内跳转到设置好的标号处。
实例如下;
#include<stdio.h>
int main()
{
printf("今天星期五\n");
goto no;
printf("我真开心\n");
no:
printf("今天可以吃火锅");
return 0;
}
在一定情境下,goto语句可以起到简化代码的作用,但goto语法使用不当,就会导致goto语句在函数内乱跳,打乱程序执行流程,所以我的建议是能不用尽量不要使用
下列是goto语句的一个妙用
for(表达式)
{
for(表达式)
{
for(表达式)
{
if(表达式)
goto right;
}
}
}
right:
表达式;
一般我们跳出循环是使用break,但是一个break只能跳出一层for循环,这时候我们可以使用goto语句快速跳出多层循环,达到简化代码的目的。
-(三)猜数字小游戏
根据我们所学的知识,我们可以写一个猜数字的小游戏了
游戏要求:
1电脑自动生成1-100的随机数,玩家猜数字,猜数字过程中,根据猜数字的大小给出大了或小了的反馈,直至猜对,游戏结束。
要实现此游戏包括这几个过程:
1.系统生成随机数
2.菜单
3玩家游戏
1.生成随机数
生成随机数可以用rand函数与srand函数来实现,可参考如下以下博主链接:
c语言如何生成随机数以及设置随机数的范围。(超详细)_c语言设置随机数-CSDN博客
即 srand((unsigned int)time(NULL));
rand()生成随机数
2.菜单
为了后期更改,我们可以将菜单单独写一个函数在主函数中引用,即代码如下:
void menu()
{
printf("********************************\n");
printf("******** 1. play***************\n");
printf("******** 0. exit *************\n");
printf("********************************\n");
}
3.玩家游戏
同上,我们可以将游戏部分用函数封装,然后在主函数调用就行,其代码如下:
void game()
{
int s = rand() % 100 + 1;//生成1-100随机数
int guess = 0;//猜的数字
while (1)
{
printf("猜数字>: ");
scanf("%d", &guess);
if (guess < s)
{
printf("猜小了\n");
}
else if (guess > s)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
此为最开始写法,还可以完善,我们想象一下,游戏有输有赢,如果按照这种写法,那我们就有无限机会尝试,就失去了游戏意义,那我们现在就可以给他加上机会限制,代码优化如下:
void game()
{
int s = rand() % 100 + 1;//生成1-100随机数
int guess = 0;//猜的数字
int count = 5;//初始5次机会
while (count)
{
printf("\n你还有%d次机会\n");
printf("猜数字>: ");
scanf("%d", &guess);
if (guess < s)
{
printf("猜小了\n");
}
else if (guess > s)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
count--;//输入一次机会减少一次,用自减实现
}
if (count == 0)
{
printf("你失败了,正确值是:%d\n", s);//当机会次数用完时,输出正确答案
}
}
将这几部分结合起来,其完整代码如下:
#include<stdio.h>
#include<time.h>
void menu()
{
printf("********************************\n");
printf("******** 1. play *************\n");
printf("******** 0. exit *************\n");
printf("********************************\n");
}
void game()
{
int s = rand() % 100 + 1;//生成1-100随机数
int guess = 0;//猜的数字
int count = 5;//初始5次机会
while (count)
{
printf("\n你还有%d次机会\n",count);
printf("猜数字>: ");
scanf("%d", &guess);
if (guess < s)
{
printf("猜小了\n");
}
else if (guess > s)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
count--;//输入一次机会减少一次,用自减实现
}
if (count == 0)
{
printf("你失败了,正确值是:%d\n", s);//当机会次数用完时,输出正确答案
}
}
int main()
{
int input = 0;//主函数游戏开始选择
srand((unsigned int)time(NULL));
do//用do循环至少循环一次,即游戏至少进行一次
{
menu();
printf("请选择:>: ");
scanf("%d", &input);
switch (input)//根据菜单选择是否进行游戏
{
case 1:
{
game();
break;
}
case 0:
{
printf("游戏结束\n");
break;
}
default:
{
printf("输入错误,重新选择\n");
break;
}
}
} while (input);
return 0;
}
这时一个简易的猜数字游戏就完成了。
结论:
分支和循环是C语言中非常重要的控制流结构。通过合理地使用分支结构和循环结构,程序员可以根据条件选择不同的执行路径,并重复执行特定的代码块。这些结构提供了编写灵活且功能强大的程序的基础。希望本文的探索能帮助读者更好地理解和运用C语言中的分支与循环结构。
好啦,今天的分享就到这吧,喜欢的小伙伴可以点赞加关注支持下博主,你们的支持也是我学习的动力,文中有什么问题以及代码可以优化的地方也欢迎各位小伙伴纠正哦~~~