C语言中的流程控制语句
- C语言中常见语句:表达式语句、复合语句、条件语句、开关语句、循环语句、break语句、continue语句、goto语句、空语句。
一、顺序结构
1.1表达式语句
- 表达式后面加上分号;,就构成了表达式语句
- a = b + c ; (赋值表达式后面加上分号,构成赋值语句)
- ++ I ;(自增语句)
1.2复合语句
-
复合语句就是由一对大括号的0~N条语句组成语句。
-
复合语句可以将多条语句复合成为一条语句。
-
eg:
{ int num = 10 ; num = num / 2; printf("%d\n" , num ); }
1.3return语句
- return语句表示结束当前函数的执行,并返回结果。
- main ()中return语句代表程序执行结束
二、分支语句
2.1 if…else语句(分支语句)
-
一般形式:
if (条件表达式) { 分支代码语句; } else { else的分支代码语句; }
-
一个if语句中,if分支只允许存在一个,else…if分支允许存在0~N个,else分支允许存在0个或1个。
- 代码
if (条件1) { 分支1; } else if (条件2) { 分支2; } else if (条件2) { 分支2; } . . . else { else分支; }
- 代码
-
C语言中if语句的每一个分支只允许
-
练习1:
// 输入一个整数,判断其是 // 正偶数、正奇数、负偶数、负奇数 // 中的哪一种 #include <stdio.h> int main (void) { int a; printf("输入一个整数:"); scanf("%d",&a); if(a > 0 && a % 2 == 0) { printf("该数为正偶数\n"); } else if (a > 0 && a % 2 != 0) { printf("该数为正奇数\n"); } else if (a < 0 && a % 2 == 0) { printf("该数为负偶数\n"); } else if (a < 0 && a % 2 != 0) { printf("该数为负奇数\n"); } return 0; }
-
注意
-
if 和 else 如果不加上大括号,只会认为第一条语句是从属于它
- 例子1:注意
int num; scanf("%d", &num); if (num > 0) if (num % 2 == 0) printf("正偶数\n"); else if (num % 2 == 0) printf("负偶数\n"); else printf("负奇数\n"); // -10 无输出 // -11 无输出 // 10 正偶数 // 11 负奇数
- 例子1:注意
-
尽量在每一个分支后面使用符合语句
- 尽量在每一个分支后面使用复合语句
-
-
练习2:
-
代码:
// 输入一个0~100之间的整数表示成绩 // 输出对应评级,成绩一定合法 // [90, 100] 优 // [80, 90) 良 // [60, 80) 中 // [0, 60) 差 int num; scanf("%d", &num); if (num >= 90 && num <= 100) printf("优\n"); else if (num >= 80 && num < 90) printf("良\n"); else if (num >= 60 && num < 80) printf("中\n"); else printf("差\n"); ------------------------------- int num; scanf("%d", &num); if (num >= 90) printf("优\n"); else if (num >= 80) printf("良\n"); else if (num >= 60) printf("中\n"); else printf("差\n");
-
2.2switch 语句(开关语句、多路分支语句)
-
一般形式
代码:switch (表达式) { case 整型字面值1:语句1(语句集合);break; case 整型字面值2:语句2(语句集合);break; ... case 整型字面值n:语句n(语句集合);break; default:语句n+1(语句集合);break; }
-
获取switch中表达式的值,然后根据表达式的值匹配switch中case分支,如果匹配到了则跳转到相应case位置进行执行(从case位置开始逐行往下依次执行每一条可执行语句,如果遇到break则跳出switch语句, 如果没有遇到break,一直往下执行,直到执行完switch中所有语句), 如果没有匹配到则跳转到default 位置执行,如果没有default,则跳出switch语句。
-
break在switch语句中起到隔断不同case分支语句的作用
-
switch****语句判断的是表达式的值,if语句判断的是表达式的真假
-
default****不是必须的,可以根据情况进行省略不写
-
练习:
-
代码:
int num; scanf("%d", &num); num /= 10; switch(num) { case 0: case 1: case 2: case 3: case 4: case 5: printf("差\n"); break; case 6: case 7: printf("中\n"); break; case 8: printf("良\n"); break; case 9: case 10: printf("优\n"); break; }
-
三、循环语句
3.1for循环
-
一般形式
for (初始表达式;条件表达式;循环表达式) { 循环体语句; }
-
执行过程:
1. 执行初始表达式;
2. 判断条件表达式的结果是否为真,若结果为真,执行循环体语句,若结果为假,跳出循环(循环结束);
3. 循环体语句执行完成之后,执行循环表达式,然后跳转到步骤****b; -
练习1:打印0~99的数
int i; for (i=0; i<100; i++) { if (i % 2 == 0) printf("%d\n", i); } for (i=0; i<100; i++) { if (i % 2 != 0) continue; printf("%d\n", i); } for (i=0; i<100; i+=2) { printf("%d\n", i); } for (i=0; i<50; i++) { printf("%d\n", i*2); }
-
练习2:水仙花数
// 打印所有的水仙花数 int i; for (i=100; i<1000; ++i) { int a = i%10; int b = i / 10 % 10; int c = i / 100; if (a*a*a+b*b*b+c*c*c==i) printf("%d\n", i); }
-
练习3:打印32位二进制数(打印内存二进制数)
// 输入一个int范围内的整数, // 输出其内存二进制。 // 例如:输入 1 // 输出 0000 0000 0000 .... 0001 int n, i; scanf("%d", &n); for (i=0; i<32; ++i) { printf("%d", (n>>(31-i))&1); if (i%4==3) printf(" "); }
-
练习4:统计二进制中由多少个1
// 输入一个unsigned int范围内的正整数, // 输出其内存二进制中有多少位是1。 // 例如:输入 10 输出 2 // unsigned int n, i, ans = 0; // scanf("%u", &n); // for (i=0; i<32; ++i) // { // int b = (n>>(31-i))&1; // if (b==1) // ans++; // } // printf("%d\n", ans); unsigned int n, ans; scanf("%u", &n); for (ans=0; n!=0; ans++) { n &= n-1; } printf("%u\n", ans);
-
练习5:求质因子
// 输入一个正整数,输出其质因子 // 90 : 2 3 3 5 int n, i; scanf("%d", &n); for (i=2; n!=1; i++) { if (n % i == 0) { printf("%d ", i); n /= i; i = 1; } }
3.2while循环
-
一般形式:
while (条件) { 循环体语句; }
-
执行过程:判断条件是否成立,条件成立则执行循环,条件不成立则跳出循环。
-
确定循环次数的情况下建议使用for循环,不确定循环次数的情况下使用while循环
-
while(1):条件恒定成立,死循环,跳出方法只能使用break
-
for(;;):for条件为空代表条件恒定成立。死循环,跳出循环只能使用break
-
例子:
//用户输入大于1个正整数,求用户输入所有数的和,输入0表示输入结束。 int n,sum = 0; scanf("%d",&n); while(n != 0) { sum += n; scanf("%d",&n); } printf("%d",sum);
3.3 do…while循环(直到型循环)
-
一般形式
do { 循环体语句; } while(条件);
-
执行过程:先执行循环体,再判断条件,条件为真继续执行循环,条件为假跳出循环
-
do…while循环循环体至少执行1次,for,while循环循环体最少执行0次。
-
do…while循环末尾一定要加上分号;。
-
代码:
//用户输入大于1个正整数,求用户输入所有数的和,输入0表示输入结束。 int n,sum = 0; scanf("%d",&n); do { scanf("%d",&n); sum += n; } while(n!=0); printf("%d",sum); //用户输入大于1个正整数,求用户输入所有数的和,输入-1表示输入结束。 //成立:代码与输入0停止有差别是因为+0与+(-1)有区别 int n,sum = 0; scanf("%d",&n); do { scanf("%d",&n); if(n != -1) sum += n; } while(n!=-1); printf("%d",sum);
提示
- #include <stdlib.h> //C语言标准库
- include<time.h> //C语言时间库
- 旧版本的c语言标准要求所有变量定义语句放在执行语句之前。所以在使用rand()方法时,要放在定义变量语句后面
综合练习
-
综合练习准备:随机数的使用
#include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { int num; //设置随机数种子,保证每次运行随机数不同 srand(time(0)); //rand()方法生成随机数 num = rand()%102; printf(“2021012%d\n”,570 + num); }
-
练习2:打印n以内的质数
// 输入一个正整数n(n>2) // 输出n以内所有的质数 // 质数是指在大于1的自然数中, // 除了1和它本身以外不再有其他 // 因数的自然数。 int n, i, j, flag; scanf("%d", &n); for (i=2; i<=n; ++i) { flag = 1; // flag = 1 是质数 flag = 0 不是质数 for (j=2; j<i; ++j) { if (i % j == 0) { flag = 0; break; } } if (flag == 1) printf("%d ", i); }
-
综合练习:猜数字
#include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { int cmp,usr,I; srand(time(0)); cmp = rand % 101; for (I = 0; i<10;++i) { printf("请输入:"); scanf("%d",&usr); if(usr == cmp) break; else if (usr> cmp) printf("你猜大了!\n"); else printf("你猜小了!\n"); } if (i<6) printf("猜对了,你真聪明!\n"); else printf("没机会了,你真2!\n"); return 0; }