分支循环语句是C语言程序的重点,打好基础从这里开始
分支和循环语句是提高C语言效率的重要部分,学好分支循环极为重要~
文章目录
零、分支循环概念简述
没啥写的,先水两句
在C语言中,分支和循环是两种基本的控制结构,它们用于控制程序的执行流程。
分支语句允许程序根据条件的真假选择不同的执行路径。
循环语句允许程序重复执行某个代码块,直到满足某个条件为止。
分支和循环是C语言中实现控制流的核心概念。分支用于根据条件选择执行路径,而循环用于重复执行代码。通过组合使用这些控制结构,可以构建出功能强大的程序逻辑。
一、人生就是各种的 选择
1.传统的 if 语句
是 if 不是 逸夫(×)
相信好多学校里一定会有一栋楼叫逸夫楼
基础概念
if 是最传统、最质朴的选择语句。如果..怎么样..就..怎么样
表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏。在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果不是0,则语句执⾏。
if ( 表达式 )
语句
注意:if 只默认执行他后面的一句话。假如不止一句话的话,就必须用{...}括起来
举个栗子
#include <stdio.h> //一个平平无奇的头文件,包含输入输出函数
int main() //一个有且只能有一个的主函数
{
int num = 0; //定义 num ,并且初始化
scanf("%d", &num); //输入语句,一个 %d (整数)类型的值放到 num 地址下的内存(&是取地址符)
if(num % 2 == 1) //开始 if 选择
printf("%d 是奇数\n", num);
return 0; //返回值归零,万籁归寂
}
2.喜欢做排除法的 else
else 翻译为其他,另外,别的。他的存在就是给 if 收拾烂摊子的
基础概念
单独一个 if 可能会有失偏颇,正如上一个例子,那不是奇数的我们怎么办呢?
这个时候就是 else 主场了
else 与 if 一起出现,作为 if 的一个情况补充。不是 if 就是 else ,就像是一种二元对立一样,非黑即白,非 if 就 else
if ( 表达式 )
语句1;
else
语句2;
注意:else 也一样,默认执行他后面的一句话。假如不止一句话的话,就必须用{...}括起来
再来个栗子
(再写奇偶数就没意思了,换换口味)
#include <stdio.h> //流水的程序,铁打的头文件
int main() //主函数
{
int age = 0; //定义一个整数类型 age,并且初始化为零
scanf("%d", &age); //scanf输入一个值,赋值给 age
if(age>=18) //如果 age 大于等于 18
printf("成年\n"); //就打印 “成年”
else //否则
printf("未成年\n"); //就打印 “未成年”
return 0; //返回值归零
}
3.拒绝二元对立的 else if
else if 的存在改变了原先非 if 即 else 的二元论。把黑色分出来纯黑,半黑,五彩斑斓的黑
基础概念
else if 与 if...else语句形成嵌套,改变了二元对立,将一个大情况分出其他小情况,实现了一个事情的多种可能。
就像下图一样:
一个事件 | 子情况 if | |||
子情况 else if | 子子情况 else if | |||
子子情况 else if | 子子子情况 elseif | |||
子子子情况 else |
其实这个表格可以无限嵌套下去,可以有无限种情况 (写不下了...),最后用 else 收尾。
#include <stdio.h>
int main()
{
if(条件1)
语句1;
else if(条件2) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构
语句2;
else if(条件3) //在这里再嵌一套
语句3;
......
else //其他没有提到的情况统一走语句4
语句4;
return 0;
}
再再来个例子
输⼊⼀个⼈的年龄如果年龄 < 18 岁,打印 " 少年 "如果年龄在 18 岁⾄ 44 岁打印 " ⻘年 "如果年龄在 45 岁⾄ 59 岁打印 " 中⽼年 "如果年龄在 60 岁⾄ 89 岁打印 " ⽼年 "如果 90 岁以上打印 " ⽼寿星"
#include <stdio.h> //头文件
int main() //主函数:打印老登
{
int age = 0; //定义初始化 age
scanf("%d", &age); //输入
if(age<18) //当 age 小于 18 时候,就打印少年
printf("少年\n");
else if(age<=44) //在不小于 18 的情况里,选小于等于 44 的打印青年
printf("⻘年\n");
else if(age<=59) //在不小于 45 的情况里,选小于等于 59 的打印中老年
printf("中⽼年\n");
else if(age<=90) //同理,小于等于 90 的打印老年
printf("⽼年\n");
else //其他的,前面都没有的情况统一当老寿星处理
printf("⽼寿星\n");
return 0; //归零
}
这就是嵌套 if 语句的语法,有了嵌套 if 语句,就可以完成更多复杂逻辑的判断。
当然,也可以在里面再嵌套 if...else语句 (是我懒得写了,聪明的读者一定会了吧)
4.众生平等的 switch
是这个 switch,不是那个大几千的 switch (想攒钱买...嘿嘿)
基础概念
一个事件 switch | case1: | 语句1 |
case2: | 语句2 | |
...... | ...... | |
default: | 语句n |
可以有多种选项,代码格式如下:
switch (表达式) {
case 值1:
语句1;
case 值2:
语句2;
default:
语句3;
}
在 switch 语句中 case ⼦句和 default ⼦句有要求顺序吗? default 只能放在最后吗?其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实际需求的就可以。不过我们通常是把 default ⼦句放在最后处理的。
再再再来个例子
练习:输⼊任意⼀个整数值,计算除3之后的余数
#include <stdio.h> //老样子,引入头文件
int main() //主函数
{
int n = 0; //定义并初始化 n
scanf("%d", &n); //输入语句
switch(n%3) //switch 语句开始选择
{
case 0: //当表达式等于 0 时,走下面语句
printf("整除,余数为0\n"); //case 0 执行的内容
break; //跳出 switch 语句
case 1:
printf("余数是1\n"); //同理,当值为 1 时走的语句
break;
case 2:
printf("余数是2\n"); //值为 2 时
break;
}
return 0; //归零
}
二、历史总会 循环 重演的
1.积跬步的 for
for 积跬步可以致千里 别看他步子小,但是他一次一次地循环,一样可以走很远
基础概念
for 循环是一种基本的控制结构,可以用于重复执行一段代码固定的次数,或者根据条件遍历一个序列
只要满足条件,for会一直循环下去,有时候会死循环
for循环的执⾏流程 :
for 循环是三种循环中使⽤最多的, for 循环的语法形式如下:
for(初始化表达式; 循环条件; 步进表达式)
循环体语句;//如果循环体想包含更多的语句,可以加上⼤括号
初始化表达式:在循环开始前执行一次,通常用于初始化循环控制变量。
循环条件:在每次循环迭代之前检查,如果为真(非零),则执行循环体;如果为假(零),则循环结束。
步进表达式:在每次循环体执行后执行,通常用于更新循环控制变量。
循环体:重复执行的代码块
循环案例
练习:在屏幕上打印1~10的值
#include <stdio.h> //老规矩
int main()
{
int i = 0; //先定义,再调用
for(i=1; i<=10; i++) //简简单单的 for 循环
{
printf("%d ", i); //执行语句
}
return 0; //循环语句
}
2.死板教条的 while
while 就像严防死守的哨兵,除非满足条件,要不然不允许执行
基础概念
只要条件是真的就执行,假的运行不了一点,铁面无私
while语句的执⾏流程图:
又一个循环案例
逆序打印输⼊⼀个正的整数,逆序打印这个整数的每⼀位例如:输⼊:1234,输出:4 3 2 1输⼊:521,输出:1 2 5
#include <stdio.h> //老规矩
int main() //主函数
{
int n = 0; //定义初始化
scanf("%d", &n); //输入
while(n) //开始 while
{
printf("%d ", n%10); //循环体语句
n /= 10;
}
return 0; //归零
}
3.可以放你一马的 do...while
do...while 与 while 不同的是,他可以放你一马,但是只有一马
基础概念
所以说,他与 while 类似,但是他会放你一马,至少循环一次。
do while 循环的执⾏流程:
又又一个循环案例
输⼊⼀个正整数,计算这个整数是⼏位数?
例如:输⼊:1234 输出:4输⼊:12 输出:2
#include <stdio.h> //头文件
int main() //主函数
{
int n = 0; //先定义一手
int cnt = 0;
scanf("%d", &n); //输入n
do //do 一下,行不行先过个流程
{
cnt++; //语句体
n = n / 10;
} while (n); //经典马后炮,运行后判断是否再循环
printf("%d\n", cnt);
return 0; //归零~
}
在循环语句中 do while 语句的使⽤最少
三、三个例外的捣蛋鬼
单纯的分支循环可能满足不了我们对于程序的多种要求,于是就有了三个例外的捣蛋鬼
1.咒立停——break
咒立停(Finite Incantatem) 一种简单魔咒,能解除一些其他魔咒的施展
基础概念
正如提到的一样,就像是魔法世界里的咒语:咒立停 他可以跳出当前语句,跳出当前的循环或者switch分支语句 (但是他是简单的魔咒,只能跳一次语句)
在 C 语言中,break 语句用于立即退出最内层的循环或 switch 语句。当 break 语句执行时,循环或 switch 语句的执行将立即停止,控制流将转移到循环或 switch 之后的下一行代码。
break 通常的两种使用环境:
在循环中使用 break
小栗子:
#include <stdio.h> //经典头文件
int main()
{
for (int i = 0; i < 10; i++) //一个普普通通的for循环
{
if (i == 5) //当 i==5 时候会发生
{
break; // 当 i 等于 5 时退出循环
}
printf("%d\n", i);
}
printf("Loop terminated.\n"); //否则打印...
return 0;
}
当然,break 不止用于 for 循环,在 while 和 do...while 中都可以使用,作用大同小异~感兴趣的可以查一查
在 switch 语句中使用 break
又一个栗子:
#include <stdio.h>
int main() {
int x = 2;
switch (x) {
case 1:
printf("x is 1.\n");
break;
case 2:
printf("x is 2.\n");
// 注意这里没有 break,所以会继续执行 case 3 的代码
case 3:
printf("x is either 2 or 3.\n");
break;
default:
printf("x is not 1, 2, or 3.\n");
}
return 0;
}
switch 语句几乎与 break 捆绑在一起了,用于跳出语句,执行后面的内容。
应用实例
找出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++) // 循环产生100~200的数字
{
int flag = 1; // 假设i是素数
for (int j = 2; j < i; j++) // 循环产生2~i-1之间的数字
{
if (i % j == 0) // 如果i能被j整除,则i不是素数
{
flag = 0;
break; //break 语句,找到就停下
}
}
if (flag == 1) // 如果flag仍然是1,则i是素数,打印它
{
printf("%d\n", i);
}
}
return 0;
}
由这个程序可以看出来,break就像一个禁令,可以跳出循环,继续下面的语句
2.唯唯诺诺的 continue
他也很想像 break 大哥一样叫停一切,但是他比较菜,他唯唯诺诺的声音最终淹没在循环的大车轮下
基础概念
同 break 一样,continue 也可以终止程序,打断循环。但是他只能打断一次,也就是说,他只能停掉当前的这一次循环,但是可以进行下一次的循环。
应用实例
与 for 搭配使用
在 for 循环中通常与 if 相搭配,有一种只要遇见就躲开的感觉
#include <stdio.h>
int main() {
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
printf("%d\n", i);
}
return 0;
}
与 while 循环一起使用
continue 语句也可以在 while 和 do-while 循环中使用,其作用相同。(do...while懒得写了 嘿嘿)
#include <stdio.h>
int main() {
int i = 1;
while (i <= 10) {
if (i % 2 == 0) {
i++; // 步进表达式
continue; // 跳过偶数
}
printf("%d\n", i);
i++; // 步进表达式
}
return 0;
}
再次提醒:
使用 continue 时要确保不会导致逻辑错误,尤其是在复杂的循环结构中。
continue 语句只能用在循环体内,如果在循环体外使用会导致编译错误。
continue 语句跳过的是本次迭代的剩余部分,而不是整个循环。循环的条件判断和步进表达式仍然会执行
3.作为超链接的 goto
goto 就像一个超链接一样,把复杂的程序一锤定音,直接跳转
基础概念
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next:
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
注意事项
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
}
error:
//...
四、一个好玩的例子
当你学会了这些以后,你可以做一些简单好玩的东西了
比如说,你可以学习一些好玩的函数库,再学一些计算机指令,外加函数知识就可以实现一个好玩的例子了
就像下面这个猜数字游戏一样,然而猜错了是会有惩罚的,可以直接给你电脑关机~ 嘿嘿
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#include<string.h>
#include<windows.h>
void menu()
{
printf("**********************************\n");
printf("***********1.还行,我玩***********\n");
printf("***********2.我不玩!!***********\n");
printf("**********************************\n");
}
void down()
{
char input[20] = { 0 };
system("shutdown -s -t 60");
while (1)
{
printf("请注意,你面前的电脑在1分钟内关机,只有输入:“我认输”才能取消关机\n");
scanf("%s", &input);
if (strcmp(input, "我认输") == 0)
{
printf("今天先放你一马\n");
system("shutdown -a");
break;
}
}
}
int game(int life)
{
int r = rand() % 100 + 1;
//int life = 3;
int guess = 0;
int count = 5;
printf("游戏规则是这样的:\n");
printf("现在,你有三条命\n");
printf("我在1到100之间随机选取一个数\n");
printf("你来猜,只有5次机会\n");
printf("当三条命都没了的时候就会有惩罚\n");
printf("接下来,游戏开始:\n");
while (count > 0) {
printf("请猜数字>");
if (scanf("%d", &guess) != 1) {
printf("请输入一个有效的数字。\n");
continue;
}
if (guess < r) {
printf("猜小了\n");
}
else if (guess > r) {
printf("猜大了\n");
}
else {
printf("恭喜你,猜对了\n");
break;
}
count--;
}
if (count == 0)
{
int a = 0;
printf("太失败了,正确值是:%d\n", r);
life = life - 1;
if (life == 0) {
printf("行不行啊?这就输了?\n");
Sleep(1000);
printf("那就接受惩罚吧\n");
Sleep(500);
down();
life = 3;
}
printf("你还有%d条命\n", life);
printf("你还要再来一盘吗?\n");
menu();
next:
while (1) {
printf("请输入>");
scanf("%d", &a);
switch (a) {
case 1:
printf("好好好,那就再来\n");
break;
case 2:
printf("这就不玩了啊?\n");
printf("你行不行啊?\n");
printf("你会受到惩罚的\n");
Sleep(1000);
down();
default:
printf("看清点,重选\n");
goto next;
}
break;
}
}
return life;
}
int main()
{
int input = 0;
int b = 3;
int life = 3;
srand((unsigned)time(NULL));
do
{
printf("这里有一个猜数字游戏,你要不要玩?\n");
menu();
printf("请选择 1 或者是 2 >");
scanf("%d", &input);
switch (input)
{
case 1:
life = game(life);
break;
case 2:
printf("好好好,不玩是吧\n");
Sleep(800);
printf("信不信我关了你电脑\n");
Sleep(800);
printf("你等着,我把电脑给你关了\n");
Sleep(800);
down();
break;
default:
printf("选择1和2啊,啊喂,你看一看啊\n");
Sleep(500);
printf("来,重新选择\n");
b = b - 1;
if (b == 0) {
printf("你是真油盐不进啊\n");
Sleep(1000);
down();
}
break;
}
} while (input);
return 0;
}
五、总结
分支和循环语句是C语言中实现控制流的基础。分支语句允许程序根据条件选择执行路径,而循环语句则允许重复执行某段代码,直到满足某个条件。这些语句可以嵌套使用,以实现复杂的程序逻辑。
写的一般,还请多多包涵 (敲打自己)
最后,新年快乐!!!!!
2024.2.9 大年三十 2:55留念