当前位置: 首页 > news >正文

5-流程控制语句

一.顺序结构

这是程序默认的执行方式,从上往下执行

二.分支结构

1.if语句

#include<stdio.h>
int main()
{int a = 11;if (a > 10){printf("a大于10\n");}else{printf("a小于等于10");}int score = 146;if (score >= 140){printf("天才");}else if(score >= 120){printf("学霸");}else if (score >= 100){printf("优秀");}else if (score >= 90){printf("及格");}else{printf("不及格");}return 0;
}

2.switch语句

C语言中的 switch 语句是一个非常有用的控制流语句,用于根据一个表达式的值来执行不同的代码块

格式:

switch (expression) {
case constant1:
// 当 expression 的值等于 constant1 时执行的代码
break;
case constant2:
// 当 expression 的值等于 constant2 时执行的代码
break;
// ... 可以有任意数量的 case 语句
default:
// 当 expression 的值与所有 case 都不匹配时执行的代码
}

#include<stdio.h>
int main()
{int week = 6;switch (week)  // 用小括号中的结果和每个case后面的值进行比较,// 如果相等就执行对应的语句// 如果没有匹配的结果就执行default后的语句// switch后面只能是整型表达式,不能是浮点型表达式// case后面的值必须是常量,不能是变量,不能是范围// break语句表示跳出switch语句块,如果没有break会继续往下执行,直到遇到break或者switch结束// default不是必须的,相当于if-else中的else,可以没有// switch语句可以嵌套使用{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;default:printf("输入错误,没有这个星期\n");break;}return 0;
}

注意点:case穿透

这是switch语句中最重要,最容易出错的概念!

如果没有break语句,程序会从匹配到的case标签开始,一直执行到遇到break或switch语句的结束。这种行为被称为“case穿透”

#include<stdio.h>
int main()
{// case穿透的应用场景:根据月份输出相应的季节int month;printf("请输入月份:");scanf("%d", &month);switch (month){case 3:case 4:case 5:printf("春天\n");break;case 6:case 7:case 8:printf("夏天\n");break;case 9:case 10:case 11:printf("秋天\n");break;case 12:case 1:case 2:printf("冬天\n");break;default:printf("没有这个月份\n");break;}return 0;
}

三.循环结构

1.for语句

语法:

for (初始化; 条件判断; 更新) {
// 循环体
}

#include<stdio.h>
int main()
{// 打印0到10for (int i = 0; i <= 10; i++){printf("%d\n", i);}// 灵活用法 递减循环for (int i = 10; i >= 0; i--){printf("%d\n", i);}/*109876543210*/// 步长为2for (int i = 0; i <= 10; i += 2){printf("%d\n", i);}/*0246810*/// 多个变量printf("多个变量的for循环\n");for (int i = 1, j = 5; i < j; i += 1, j--){printf("i=%d, j=%d\n", i, j);}/*i=1, j=5i=2, j=4*/return 0;
}

#include<stdio.h>
int main()
{// 累加求和int sum = 0;for (int i = 1; i <= 100; i++){sum += i;}printf("1到100的累加和是:%d\n", sum);// 求1到100之间的所有偶数的和int even_sum = 0;for (int j = 1; j <= 100; j++){if (j % 2 == 0){even_sum += j;}}printf("1~100之间的所有偶数的和是:%d\n", even_sum);// 统计满足条件的数字个数:键盘录入两个数字,表示一个范围,统计这个范围内既能被6整除又能被8整除的数字个数int start, end;printf("请输入一个范围的开始值:");scanf("%d", &start);printf("请输入一个范围的结束值:");scanf("%d", &end);int count = 0;for (int k = start; k <= end; k++){ if (k % 6 == 0 && k % 8 == 0){count++;}}printf("%d到%d之间既能被6整除又能被8整除的数字个数是:%d\n", start, end, count);return 0;
}

2.while循环

语法:

while (条件) {
// 循环体
}

#include<stdio.h>
int main()
{int i = 1;while (i <= 10){printf("%d\n", i);i++;}return 0;
}
#include<stdio.h>
int main()
{// 输入一个整数,判断这个整数是否是2的整数次幂int num1;printf("请输入一个整数:");scanf("%d", &num1);int temp = num1;while (temp > 1){if (temp % 2 != 0){printf("%d不是2的整数次幂\n", num1);break;}else{temp = temp / 2;if (temp == 1){printf("%d是2的整数次幂\n", num1);break;}}}return 0;
}

#include<stdio.h>
int main()
{/*世界最高峰是珠穆朗玛峰,海拔8848米。即88480000毫米。假设有一张足够大的值,厚度为0.1毫米,问折叠多次是可以达到珠穆朗玛峰的高度?*/int height = 88480000;int paper_thickness = 1; //单位0.1毫米int fold_times = 0;while (paper_thickness < height){paper_thickness *= 2;fold_times++;}printf("折叠%d次可以达到珠穆朗玛峰的高度\n", fold_times);return 0;
}

#include<stdio.h>
int main()
{// 输入一个整数,将其反向输出/*123  -->  321123 / 1 % 10 = 3123 / 10 % 10 = 2123 / 100 % 10 = 1*/int num;int length = 0;printf("请输入一个整数:");scanf("%d", &num);for (int i = num; i > 0; i /= 10){length++;}printf("%d\n", length);int reversed_num = 0;int j = 1;while (num / j % 10 > 0){/*	reversed_num += (num / j % 10) * 10**length;j *= 10;length--;*/int factor = 1;for (int k = 1; k < length; k++){factor *= 10;}reversed_num += (num / j % 10) * factor;j *= 10;length--;// 方法二//reversed_num = reversed_num * 10 + num / j % 10;//j *= 10;}printf("%d\n", reversed_num);return 0;
}

#include<stdio.h>
int main()
{// 逆序输出一个整数另外一种方法int num;int reversed_num = 0;scanf("%d", &num);/*123123 % 10 = 3    0*10+3 = 3123 / 10 = 12   12 % 10 = 2    3*10 + 2 = 3212 / 10 = 1     1 % 10 = 1    31 *10 +1 = 3211 / 10 = 0 结束*/while (num > 0){reversed_num = reversed_num * 10 + num % 10;num /= 10;}printf("%d\n", reversed_num);return 0;
}
#include<stdio.h>
int main()
{// 输入一个非负整数,计算并返回这个数字的算术平方根;结果只保留整数部分,小数部分将被舍去int n;int factor = 0; // 如果这里不对factor初始化,可能会报错,在第28行会有警告使用未初始化的内容factorscanf("%d", &n);for (int i = 0; i <= n; i++){if (i * i < n){continue;}else{if (i * i == n){factor = i;break;}else{factor = i - 1;break;}}}printf("%d\n", factor);return 0;
}
#include<stdio.h>
int main()
{// 判断一个整数是否是回文数int n;int reversed_n = 0;scanf("%d", &n);int temp = n;while (temp > 0){reversed_n = reversed_n * 10 + temp % 10;temp= temp / 10;}//printf("%d\n", reversed_n);/*printf("%d\n", n);printf("%d\n", n == temp);*/if (reversed_n == n){printf("YES\n");}else{printf("NO\n");}return 0;
}

#include<stdio.h>
int main()
{// 有两个正整数,被除数dividend和除数divisor,将两数相除,要求不使用乘法、除法和mod运算符,返回被除数除以除数得到的商和余数int dividend;int divisor;int quotient = 1; // 商int remainder; //余数printf("请输入被除数和除数:");scanf("%d %d", &dividend, &divisor);int temp = divisor;while (temp < dividend){temp += divisor;quotient++;	}if (temp == dividend){remainder = 0;}else{quotient--;remainder = dividend - temp + divisor;}printf("%d除以%d的商为%d,余数为%d", dividend, divisor, quotient, remainder);return 0;
}

四.do while 语句

语法:

do {
// 循环体 - 要重复执行的代码
} while (条件);

注意while(条件) 后面的分号 ; 不能省略!

执行流程:

  1. 先执行循环体内的代码

  2. 再判断while中的条件是否为真

  3. 如果条件为真,返回第1步继续执行

  4. 如果条件为假,退出循环

五.for循环、do while 和while循环的区别

循环类型特点适用场景
for初始化、条件、更新都在一行循环次数已知
while先判断后执行循环次数未知,依赖条件
do-while先执行后判断,至少执行一次输入验证、菜单系统
控制语句作用
break立即退出整个循环
continue跳过本次循环剩余代码



七.无限循环

1.使用while(1)   最常用

#include <stdio.h>int main() {while (1) {  // 条件永远为真printf("这是一个无限循环...\n");// 在实际应用中,通常会有退出条件// 例如使用 break 语句char ch;printf("输入q退出:");scanf(" %c", &ch);if (ch == 'q' || ch == 'Q') {break;}}printf("循环已退出\n");return 0;
}

2.使用for(; ; )   经典方法

#include <stdio.h>int main() {for (;;) {  // 所有表达式都为空printf("for循环的无限循环...\n");// 退出条件int num;printf("输入0退出:");scanf("%d", &num);if (num == 0) {break;}}printf("循环已退出\n");return 0;
}

3.使用do while(1)

#include <stdio.h>int main() {do {printf("do-while无限循环...\n");// 退出条件char choice;printf("继续吗?(y/n): ");scanf(" %c", &choice);if (choice == 'n' || choice == 'N') {break;}} while (1);  // 条件永远为真printf("循环已退出\n");return 0;
}

八.跳转控制语句

1.break

break不能单独书写,只能写在switch语句或者循环语句中,表示结束,跳出的意思

2.continue

只能写在循环语句中

表示结束,跳过本次循环,进入下一次循环

九.制表符\t

对齐格式要求狂喜

\t会根据前面字母的个数在后面补空格,让整体的长度达到8或8的倍数;因此最多补8个空格,最少补1个空格

十.跳出多层循环和goto关键字

goto是C语言中的跳转语句,可以直接跳转到程序中指定的标签位置

#include<stdio.h>
int main()
{for (int i = 0; i < 10; i++){if (i == 5)goto label_out;printf("%d\n", i);}
label_out:printf("Jumped to the out label,exited looo at i == 5");return 0;
}
0
1
2
3
4
Jumped to the out label,exited looo at i == 5

注意事项:

  1. 谨慎使用:goto会破坏程序的结构化,使代码难以阅读和维护

  2. 只用于错误处理:最适合用于统一的错误处理和资源清理

  3. 避免创建循环:不要用goto创建循环结构,应该使用for、while等循环语句

  4. 限制跳转范围:goto应该只在同一个函数内跳转,不要跨函数跳转

  5. 向前跳转:尽量只向前跳转,避免向后跳转

  6. 有意义的标签名:使用有意义的标签名,如cleanuperrorexit

记住:能不用goto就不用,如果必须用,要确保代码依然清晰可读

http://www.dtcms.com/a/470206.html

相关文章:

  • Dify实战:调试技巧深度解析
  • Linux下Mysql初始化如,密码如何查找
  • 2025知识管理平台深度测评:从工具进化为智能决策引擎
  • 网站后台开发教程jsp网站缓存在哪
  • 网站页面怎么做的好看百度在西安的公司叫什么
  • Python 打印1-100的素数
  • 创建子进程时的一些细节
  • STM32 EC11旋转编码器扫描读取
  • 如何对抗GPS欺骗式干扰之二:多天线阵列测向的识别原则和应用场景
  • Linux 内核网络调优:单连接大带宽吞吐配置
  • STM32 外设驱动模块【含代码】:XY摇杆模块
  • 商会网站模板河南核酸检测vip
  • 外骨骼手套带来了一种仅用手就能与XR进行交互的更自然的方式
  • 学习随笔-Math
  • Android 权限模型(前台、后台、特殊权限)
  • 成安专业做网站公司注册的流程与步骤
  • 多个编码智能体同时使用会不会混乱?
  • wpf中调用NumericUpDown控件
  • JVM(九)-- 类的生命周期
  • 数字孪生重构智慧园区:众趣科技何以成为 VR 园区领域标杆
  • LeetCode 刷题【113. 路径总和 II】
  • 网站英文联系我们毕设做购物网站系统的原因
  • 当涂城乡建设局的网站wordpress 链接主题
  • 利用ps制作网站的设计江苏省建设工程集团
  • Linux内核架构浅谈9-Linux内核的开源生态:开发者协作与版本迭代机制
  • 【经验总结】AUTOSAR架构下NvM进入无限循环问题分析
  • 春招准备之Git篇
  • 11-py调用js
  • 分析竞争对手网站公司网站建设怎么
  • 2.Xshell效率实战:SSH管理秘籍的技术