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", ÷nd, &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(条件)
后面的分号 ;
不能省略!
执行流程:
先执行循环体内的代码
再判断while中的条件是否为真
如果条件为真,返回第1步继续执行
如果条件为假,退出循环
五.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
注意事项:
谨慎使用:goto会破坏程序的结构化,使代码难以阅读和维护
只用于错误处理:最适合用于统一的错误处理和资源清理
避免创建循环:不要用goto创建循环结构,应该使用for、while等循环语句
限制跳转范围:goto应该只在同一个函数内跳转,不要跨函数跳转
向前跳转:尽量只向前跳转,避免向后跳转
有意义的标签名:使用有意义的标签名,如
cleanup
、error
、exit
等
记住:能不用goto就不用,如果必须用,要确保代码依然清晰可读。