控制流程语句 顺序结构 从上往下依次执行,是程序的默认的执行过程
分支结构 程序在执行的过程中出现了岔路
if语句 作用:如果满足条件,才可以执行指定的代码(判断)
格式1
细节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 (表达式){ case 值1 : 语句体1 ; break ; case 值2 : 语句体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 () { 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); 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更合适
简单循环算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> int main () { int n = 1 ; int count = 0 ; while (n < 88444300 ) { n *= 2 ; count++; } 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 (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); } 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 () { int countA = 0 ; for (int j = 2 ;j <= 100 ;j++){ int count = 0 ; 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 () { 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 ; }