控制流程语句

顺序结构

从上往下依次执行,是程序的默认的执行过程

分支结构

程序在执行的过程中出现了岔路

if语句

作用:如果满足条件,才可以执行指定的代码(判断)

格式1

1
2
3
4
if(关系表达式)
{
语句体;
}

细节1:在C语言当中,如果判断的结果是一个数字,非0表示条件成立,0表示条件不成立

细节2:如果大括号里面的语句体只有一行,那么大括号可以省略不写

格式2

1
2
3
4
5
6
if(关系表达式){
语句体A;
}
else{
语句体B;
}

格式3

1
2
3
4
5
6
7
8
9
10
11
12
if(关系表达A){
语句体A;
}
else if(关系表达式B){
语句体B;
}
else if(关系表达式C){
语句体C;
}
else{
语句体N;
}

switch语句

作用:把所有的选择一一列举出来,根据不同的条件任选其一

1
2
3
4
5
6
7
8
9
10
11
12
switch(表达式){
case1:
语句体1;
break;
case2:
语句体2;
break;
...
default:
语句体n;
break;
}

执行流程:

  • 首先计算表达式的值
  • 依次和case后面的值进行比较,如果有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束
  • 如果所有的case后面的值和表达式的值都不匹配,就会执行default里面的语句体,然后结束整个switch语句

switch语句的更多细节:

  • 表达式:计算结果只能为 字符/整数
  • case: 值只能是 字符/整数 的字面量,不能是变量
  • case:值不能重复
  • break:表示中断,结束的意思,结束switch语句
  • default:所有情况都不匹配,执行该处的内容
  • default可以写在任意的位置,甚至可以省略不写

switch与if使用场景

switch:有限个case进行匹配的情况,10个左右

if:一般是对一个范围进行判断

case穿透

  • 还是根据小括号中的表达式的结果去匹配对应的case
  • 执行对应case里面的代码
  • 如果在执行的过程中,遇到了break,那么直接结束整个switch.但是如果没有遇到break,就会继续执行下面case中的代码,直到遇到break,或者把整个switch中所有的代码全部执行完了,才会结束
  • case穿透只会往下穿,不会回到上面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>

int main() {
int month;
printf("whats the month\n");
scanf("%d", &month);
printf("the month is %d\n", month);
switch(month) {
case 12:
case 1:
case 2:
printf("its winter");
break;
case 3:
case 4:
case 5:
printf("its spring");
break;
case 6:
case 7:
case 8:
printf("its summer");
break;
case 9:
case 10:
case 11:
printf("its autumn");
break;
default:
printf("no such month bitch");
}
return 0;
}

循环结构

循环:重复的执行某项事情

初始化语句+条件判断语句+条件控制语句+循环体语句

初始化语句:循环开始的条件

条件判断语句:循环结束的条件

条件控制语句:控制循环的次数

循环体语句:重复执行的代码

for循环

for(初始化语句;条件判断语句;条件控制语句)

{

循环体语句

}

1
2
3
for(int i = 1;i<=3;i++){
printf("wtf\n");
}

执行流程:

  • 执行初始化语句
  • 执行条件判断语句,看结果是否成立(成立,执行循环体语句;不成立,则结束循环)
  • 执行条件控制语句
  • 回到2继续执行条件判断语句
1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>

int main(){
//求和 1.定义变量用来累加数据 2.获取范围内的数据 3.打印sum
int sum = 0;//记得定义在循环的外面哦
for(int i = 1;i<=5;i++){
sum = i + sum;
}
printf("%d", sum);
return 0;
}

变量的生命周期:变量只在所属的大括号中有效

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>

int main(){
//对偶数和进行求和
int sum = 0;
for(int i = 1;i<=100;i++){
//判断,只有偶数才进行求和
if(i % 2 == 0) {
sum = sum + i;
}
}
printf("%d", sum);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>

int main() {
int a;
int b;
printf("choose 2 numbers to define a scale\n");
scanf("%d %d", &a,&b);
//判断a b大小关系确认范围
if(a == b) {
printf("fuck you\n");
}
int min = a < b ? a : b;
int max = a > b ? a : b;
printf("you chose from %d to %d\n",min,max);
//定义变量计算个数,统计思想
int count = 0;
for(int i = min;i<=max;i++) {
if(i % 6 == 0 && i % 8 ==0) {
count++;
}
}
printf("there are %d numbers for ya\n",count);
return 0;
}

while循环

1
2
3
4
5
int i = 1;
while(i<=3){
printf("fuck you\n");
i++;
}

执行流程与for循环类似

for与while对比

语法层面

  • for循环中,控制循环的变量,因为归属for循环的语法结构中,在for循环结束后,就不能再次被访问到了
  • while循环中,控制循环的变量,对于while来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用

区别

  • for循环中,知道循环的次数或者循环的范围
  • while循环中,不知道循环的次数和范围,只知道循环的结束条件

举例1:累加求和1~100 for

举例2:循环读取文件中的内容 while

一次循环只能读取一个字母或者汉字,因此while更合适

简单循环算法

  • 考虑循环的过程 寻找实现办法

  • 使用更大的数据类型:如果可能,使用 long double 代替 double 来提高精度。

  • 调整终止条件:在循环条件中加入一个小的容差值,例如 while (n < 8844430 + 1e-6),以确保即使存在轻微的误差,循环也能正确地终止。
  • 使用整数逻辑:如果问题允许,使用整数逻辑来避免浮点数精度问题。例如,使用 int 类型和 10 的幂次来表示毫米数,但这需要更多的编码工作来处理大数运算。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int main() {
/*
* 世界上最高的峰 珠穆朗玛峰(8844.43m = 8844430 mm)
* 假如一张纸足够大 厚度0.1mm
* 折多少次 可以折成这个高度
*/
int n = 1; // 纸张的初始厚度,以1/10毫米为单位
int count = 0;
while (n < 88444300) {
n *= 2; // 纸张厚度翻倍
count++; // 每次折叠都增加计数
}
// 修正输出语句,直接输出n的值
printf("zui hou zhi de gao du shi %d \n", n);
printf("zhe le %d ci\n", count); // 输出折叠次数
return 0;
}

do…while循环

1
2
3
4
5
初始化语句;
do{
循环体语句;
条件控制语句;
}while(条件判断语句);

先执行再判断,循环体至少执行一次

循环高级

无限循环

1
2
3
4
5
6
7
8
9
for( ; ; ){
printf("lol\n");
}
while(1){
printf("lol\n");
}
do{
printf("lol\n");
}while(1);

跳转控制语句

跳转控制语句:在循环的过程中,跳到其他语句上执行

break

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

1
2
3
4
5
6
7
8
//利用for循环在100中获取数字
for(int i = 1; i <=100;i++){
//判断是否符合条件
if(i % 3 == 0 && i % 5 ==0){
print("%d\n", i);
break;
}
}

continue

结束本次循环,继续下次循环

1
2
3
4
5
6
for(int i = 1;i <=5; i++){
if(i==3){
continue;//跳过第三次循环进入第四次循环
}
printf("%d\n", i)
}

循环嵌套

eg.打印99乘法表

1
2
3
4
5
6
7
8
for(int i = 1;i <= 9; i++){
for(int j = 1; j <=i; j++){
printf("%d * %d = %d\t",j,i,i*j);
//其中\t表示制表打印,可自动对齐
//制表符 长度可变的大空格
}
printf("\n");
}

\t:制表符 长度可变的大空格

会根据前面字母的个数 在后面补空格, 让整体的长度达到8或者8的倍数,最少补一个,最多补八个

作用:打印表格数据时,可以对齐

eg.统计质数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<stdio.h>

int main(){
//获取小于等于整数n的质数数量
/*
* 1.判读是否为质数
* 2.添加范围
* 3.统计
* */
//定义变量统计
int countA = 0;
for(int j = 2;j <= 100;j++){
int count = 0;
//统计在这个范围内有多少个数字能被number整除,判断是否为质数
for(int i = 2;i < j;i++){
if(j % i == 0){
count++;
//后面的其他数字没必要判断了
break;
}
}
if(count == 0){
countA++;
}
}
printf("%d\n",countA);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main(){
//累加1的1次方,2的2次方...10的10次方
long long res = 0;//定义变量记录数据
for(int i = 1;i <= 10; i++){
long long pow = 1;
for(int j = 1; j <= i;j++){
pow = pow * i;
}
//内循环结束之后,就表示每一个单独的选项,已经有结果了
//累加目的,每一个选项结果单独相加
res = res + pow;
}
printf("%lld",res);
return 0;
}