07-流程控制
一、流程控制
- 顺序结构:默认的流程结构。按照书写顺序执行每一条语句。
- 选择结构:对给定的条件进行判断,再根据判断结果来决定执行哪一段代码。
-
循环结构:在给定条件成立的情况下,反复执行某一段代码。
流程控制
二、选择结构-if
1.简单使用
if (表达式) 语句1;
if(count>50) 开班; 上课;
if(表达式) 语句1; else 语句2;
if(count>50) 开班; else 不开班;
if(表达式) { }
if(count>50) {开班; 布置课室;} else {}
{ }的作用域
if -else if-else
if(a==0) else if (a>0) else
-
特点:只有一个括号会被执行
-
复合条件
-
上课时间的取值范围(9~12 || 14 ~17)
-
陷阱
if(a!=0) { a不是0;} else {a是0;}
if (a); { }
if (a=0)
a == 0;
if (10) int a = 9;
2.习题
1>输入一个整数day代表星期几,根据day的值输出对应的星期几,比如day==1,就输出“星期一”
2>输入一个整数month代表月份,根据月份输出对应的季节。
春季:3、4、5
夏季:6、7、8
秋季:9、10、11
冬季:12、1、2
3>输入一个整数score代表分数,根据分数输出等级(A-E)(用两种方式)
A:90~100
B:80~89
C:70~79
D:60~69
E:0~60
三、选择结构-switch
1.简单使用
switch(表达式) { case 数值1: break; … default: break;}
- 举例
int a = 10;
switch (a) {
case 0:
printf("这是一个0");
break;
case 5:
printf("这是一个5");
break;
case 10:
printf("这是一个10");
break;
default:
printf("什么也不是");
break;
}
- 简述break的作用
- 在case中定义变量
2.if和switch的对比
- 很多情况可以互换
- if用得比较多,比较灵活,switch只能某个单值
3.习题
用switch替代if实现if中的习题
四、循环结构-while
1.简单使用
连续printf(“俯卧撑”)20次;
while(表达式) { }
continue:输出5次休息一下
break的使用:某次的时候停止循环
2.特点
只有条件成立才会执行循环体
3.陷阱
while(条件);
五、循环结构-do while
- 特点:一定会执行一次循环体
- while和do while循环对比
int i=0;
while(i<0){
i++;
}
int i=0;
do{
i++;
} while(i<0);
六、循环结构-for
1.简单实用
- 运行过程
- 初始化语句等可以是多句(把printf放到for的括号中)
2.for循环嵌套
好友列表1
好友1
好友2
好友列表2
好友1
好友2
好友列表3
好友1
好友2
3.陷阱
1>死循环 for(;;);
2>for循环体内部变量的作用域
3>作用域混淆
for (int i = 0; i<5; i++) int a = 10;
4.while循环和for循环的比较
- 可以互换
- for循环的变量可以及时回收
七、break和continue
1.break
- 使用场合:switch\循环结构
- 循环嵌套下的break
2.continue
- 使用场合:循环结构
- 循环嵌套下的continue
八、总结
一、选择结构
1.if
1> 结构
if (条件) {
} else if (条件2) {
} else if (条件3) {
} else {
}
2> 特点
* 同一时刻,只有一个大括号里面的代码会被执行
2.switch
1> 结构
switch (数值) {
case 数值1:
break;
case 数值2:
break;
case 数值3:
break;
default:
break;
}
2> 特点
1> 默认情况下,只有一个case后面的代码会被执行
2> 如果一个case后面没有break,而且这个case成立,就会按顺序执行后面所有case中的语句,直到遇到break为止
3> 如果要在case后面定义一个新的变量,必须用大括号{}包住
二、循环结构
1.while
1> 特点:如果一开始条件不成立,永远不会执行循环体
2.do while
1> 特点:不管条件是否成立,至少会执行一次循环体
3.for
4.选择
1> 一般优先使用for循环
2> 然后再考虑while
3> 最后再考虑do while
九、程序实现
01- if
void if_practice(void) {
/*
1.if的第1种结构
if(条件) {
语句1;
语句2;
......
}
2.if的第2种结构
if(条件1) {
语句1;
语句2;
......
} else {
}
3.if的第3种结构
if(条件1) {
语句1;
语句2;
......
} else if (条件2) {
} else if(条件3) {
} else if(条件4) {
} else
{
}
4.if的第4种结构
if (条件)
语句1;
*/
int a = -10;
if (a>1)
printf("A\n");
printf("B\n");
}
02-if使用注意
void note_if_usage(void) {
/*
if (0) {
printf("A\n");
} else {
printf("B\n");
}
*/
/*
int a = 1044343;
比较大小时,常量值放左边,变量放右边
//if (a = 0)
if (0 == a) {
printf("a等于0\n");
} else {
printf("a不等于0\n");
}
*/
/*
int a = 10;
// 注意赋值运算符,不要写成两个=
a = 15;
printf("%d\n", a);
*/
/* if语句后面不要写;
if ( 5>6 );
{
printf("A\n");
}
*/
/*
if (10 > 6) {
int a = 5;
}
printf("%d\n", a);
*/
/*
// 下面的代码是错误的:作用域不明确
if (10 > 6)
int a = 5;
// 如果要在if后面的语句中定义新的变量,必须用大括号{}
//printf("%d\n", a);
*/
/*
书写格式
int a = 10;
if (a>10) {
} else if (a>5) {
} else {
}
if () {
} else if ()
{
} else {
}
*/
}
03-if练习
void if_practice_practice(void) {
/*
输入一个整数score代表分数,根据分数输出等级(A-E)(用两种方式)
A:90~100
B:80~89
C:70~79
D:60~69
E:0~60
*/
// 1.提示输入
printf("请输入分数值:\n");
// 2.接收输入
int score;
scanf("%d", &score);
// 3.判断等级 (性能最高)
if (score >= 90 && score <= 100) { // [90, 100]
printf("A\n");
} else if (score >= 80) { // [80, 89]
printf("B\n");
} else if (score >= 70) { // [70, 79]
printf("C\n");
} else if (score >= 60) { // [60, 69]
printf("D\n");
} else { // (-∞, 59]
printf("E\n");
}
/* 性能中等
if (score >= 90 && score <= 100) { // [90, 100]
printf("A\n");
} else if (score >= 80 && score <= 89) { // [80, 89]
printf("B\n");
} else if (score >= 70 && score <= 79) { // [70, 79]
printf("C\n");
} else if (score >= 60 && score <= 69) { // [60, 69]
printf("D\n");
} else { // (-∞, 59]
printf("E\n");
}
*/
/* 性能最差
if (score >= 90 && score <= 100) { // [90, 100]
printf("A\n");
}
if (score >= 80 && score <= 89) { // [80, 89]
printf("B\n");
}
if (score >= 70 && score <= 79) { // [70, 79]
printf("C\n");
}
if (score >= 60 && score <= 69) { // [60, 69]
printf("D\n");
}
if (score <= 59) { // (-∞, 59]
printf("E\n");
}
*/
}
04-switch
void switch_practice(void) {
/*
if (条件) {
}
switch (数值) {
case 数值1:
语句1;
break;
case 数值2:
语句2;
break;
default :
语句3;
break;
}
*/
//int a = 10;
// break:退出整个switch语句
// 如果case后面没有break,就会执行后面所有case中的语句,直到遇到break为止
/*
int b = 10;
switch (a) {
case 10:
printf("A\n");
b++;
case 5:
printf("B\n");
b++;
case 0:
printf("C\n");
b++;
break;
default:
printf("D\n");
break;
}
printf("b的值是%d\n", b);*/
char c = '+';
int a = 10;
int b = 20;
// 如果要在case后面定义新的变量,必须用大括号{}包住
switch (c) {
case '+':
{
int sum = a + b;
printf("和是%d\n", sum);
break;
}
case '-':
{
int minus = a - b;
printf("差是%d\n", minus);
break;
}
}
}
05-switch练习
void switch_practice_practice(void) {
/*
输入一个整数score代表分数,根据分数输出等级(A-E)(用两种方式)
A:90~100 score/10 == 9、10
B:80~89 score/10 == 8
C:70~79 score/10 == 7
D:60~69 score/10 == 6
E:0~60
*/
int score = 100;
switch (score/10) {
case 10: // 100
case 9: // 90+
printf("A\n");
break;
case 8: // 80+
printf("B\n");
break;
case 7: // 70+
printf("C\n");
break;
case 6: // 60+
printf("D\n");
break;
default:
printf("E\n");
break;
}
/*
if和switch
1> if语句能完成的功能,switch并不一定能完成
int a = 10;
if (a>100) {
}
2> 在有些情况下,if语句和switch语句可以互换
3> switch能完成的功能,if语句都能完成
*/
}
06-while
void while_practice(void) {
/*
if (条件) {
}
while (条件) {
循环体
}
运行原理
1.如果一开始条件就不成立,永远不会执行循环体
2.如果条件成立,就会执行一次循环体,执行完毕,再次判断条件是否成立......
break
直接结束整个while循环
continue
结束当前的循环体,进入下一次循环体的执行
*/
// 1.先确定需要重复执行的操作
// 2.再确定约束条件
// 定义一个变量记录做的次数
int count = 0;
/*
while (count < 50) {
++count;
if (count%10 != 0) {
printf("执行第%d次循环操作\n", count);
}
}
*/
/*
while (count < 50) {
++count;
if (count%10 == 0) {
// 直接结束这一次循环体,进入下一次循环
continue;
}
printf("执行第%d次循环操作\n", count);
}
*/
while (count < 50) {
++count;
printf("执行第%d次循环操作\n", count);
if (count == 20) {
break;
}
}
}
07-while练习_01
int while_practice_01(void) {
// 提示用户输入一个正整数n,计算1+2+3+…+n的和
// 1.提示输入
printf("请输入一个正整数:\n");
// 2.接收输入
// 定义变量保存用户输入的整数
int n;
scanf("%d", &n);
if (n <= 0) {
printf("非法输入\n");
return 0;
}
// 3.计算
// (1 + n) * n / 2;
// 定义变量保存和
int sum = 0;
int number = 0; // 默认被加的数值
while (number < n) {
number++;
sum += number; // 累加
}
printf("%d\n", sum);
return 0;
}
08-while练习_02
int while_practice_02(void) {
// 提示用户输入一个正整数n,计算1+2+3+…+n的和
// 定义变量保存用户输入的整数
int n = 0; // 一定要初始化
while (n <= 0) {
// 1.提示输入
printf("请输入一个正整数:\n");
// 2.接收输入
scanf("%d", &n);
}
// 3.计算
// (1 + n) * n / 2;
// 定义变量保存和
int sum = 0;
int number = 0; // 默认被加的数值
while (number < n) {
number++;
sum += number; // 累加
}
printf("%d\n", sum);
return 0;
}
09-while练习_03
void while_practice_03(void) {
// 计算1~100中所有3的倍数的个数
// 记录3的倍数的个数
int count = 0;
// 记录当前检查的数值
int number = 0;
while (number < 100) {
number++;
// 说明number是3的倍数
if (number%3 == 0) {
count++;
}
}
printf("1~100内3的倍数的个数:%d\n", count);
}
10-while注意点
void while_attention(void) {
/*
while (10) {
printf("哈哈哈哈\n");
}
*/
/*
int a = 10;
// while (a > 0); 死循环
while (a>0) {
a--;
printf("哈哈哈\n");
}
*/
// 最简单的死循环
//while(1);
}
11-do-while
void do_while_practice(void) {
/*
while (条件) {
}
do {
} while(条件);
while和do-while的区别
1.很多情况下,while和do while可以互换
2.while特点:如果一开始的条件不成立,永远不会执行循环体
do while特点:不管一开始的条件是否成立,至少会执行一次循环体
3.最好使用while
*/
int i = 0;
/*
while (i<0) {
i++;
}
*/
do {
i++;
} while (i < 0);
printf("i = %d\n", i);
}
12-for
void for_practice(void) {
/*
for (语句1; 条件; 语句2) {
循环体
}
语句1:初始化语句
语句2:增量语句(执行完循环体后再执行的语句)
1.for一开始就会执行一次语句1(整个for循环只会执行一次)
2.判断条件是否成立,如果条件成立,就会执行一次循环体,然后就会执行语句2,再次判断条件是否成立
*/
/*
"做俯卧撑"50次
*/
/*
int count = 0;
for ( ; count < 50; ) {
printf("做俯卧撑\n");
count++;
}
*/
/*
for (int count = 0; count < 50; ) {
printf("做俯卧撑\n");
count++;
}
*/
/*
for (int count = 0; count < 50; count++) {
printf("做俯卧撑\n");
}
*/
/*
for (int count = 0; count < 50; printf("做俯卧撑\n"),printf("哈哈哈\n"),count++) {
}
*/
}
13-for使用注意
void for_usage_note(void) {
/* 不要随便在for()后面写分号
for (int i=0; i<5; i++);
{
printf("哈哈\n");
}
*/
/* 错误:变量a的作用域不明确
如果要在循环体中定义新的变量,必须用大括号{}包住
for (int i=0; i<5; i++)
int a = 10;
*/
/* 错误
for (int i = 0; i < 10; i++, a++)
{
// a只能用在循环体{}中
int a = 10;
}
*/
/*
int a = 10;
for (int i=0, a= 9; i<5; i++) {
//int i = 10;
int a = 11;
printf("a = %d\n", a);
}
*/
// 最简单的利用for循环实现死循环
// for(;;);
}
14-for循环嵌套
void for_loops_nested(void) {
/*
好友列表1
好友1
好友2
好友列表2
好友1
好友2
好友列表3
好友1
好友2
*/
for (int i = 1; i <= 4; i++) {
//printf("好友列表%d\n", i + 1);
printf("好友列表%d\n", i);
/*
printf(" 好友1\n");
printf(" 好友2\n");
printf(" 好友3\n");
printf(" 好友4\n");
printf(" 好友5\n");*/
for (int j = 1; j <= 7; j++) {
printf(" 好友%d\n", j);
}
}
}
15-for循环嵌套练习
void for_loops_nested_practice(void) {
/*
提示用户输入一个正整数n,如果n=5,就输出下列图形,其他n值以此类推
*****
****
***
**
*
*/
// 1.定义一个变量存储用户输入的值
int n = 0; // 一定要初始化
// 2.判断n值合不合理
while (n <= 0) {
// 2.1 提示用户输入正整数
printf("请输入一个正整数:\n");
// 2.2 接收输入的数据
scanf("%d", &n);
}
// 3.输出图形
for (int i = 0; i < n; i++) { // 有多少行
//printf("*****\n");
for (int j = 0; j < n-i; j++) { // 每一行有多少个
printf("*");
}
printf("\n");
}
}
16-输出九九乘法表
void output_multiplication_table(void) {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
printf("%d * %d = %2d ", i, j, i * j);
}
printf("\n");
}
}
17-break和continue
void break_and_continue(void) {
/*
break:
1.使用场合
1> switch语句:退出整个switch语句
2> 循环结构:退出整个循环语句
* while
* do while
* for
2.注意点
只对最近的循环结构有效
continue:
1.使用场合
循环结构:结束当前这次的循环体,进入下一次循环体
* while
* do while
* for
2.注意点
只对最近的循环结构有效
*/
/*
for (int i = 0; i < 5; i++) {
// printf("%d\n", i);
if (i % 2) {
// i为奇数:1、3
printf("奇数:%d\n", i);
continue;
}
}
*/
/*
for (int i = 0; i < 5; i++) {
printf("哈哈哈\n");
continue;
printf("哈哈哈23\n");
}
*/
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
if (j == 1) {
break;
}
printf("A\n");
}
break;
printf("B\n");
}
}
18-提示用户输入一个正整数n,利用while循环计算并输出:1-2+3-4+5-6+7…+n的和
void while_loop_to_calculate_and_output(void) {
// 1.定义变量存储用户输入的整数
int n = 0;
// 2.判断n是否为正整数
while (n <= 0) {
// 2.1 提示输入
printf("输入一个正整数:\n");
// 2.2 让用户输入
scanf("%d", &n);
}
// 3.计算阶乘
int sum = 0; // 存储计算结果
int current = 0; // 当前要累加的数值
while (current < n) {
current++;
// 如果是偶数,就减
if (current % 2 == 0) {
sum -= current;
} else { // 如果是奇数,就加
sum += current;
}
}
// 4.输出结果
printf("%d\n", sum);
}
19-提示用户输入一个正整数n,计算并输出n的阶乘结果:123…n
void calculate_and_output_n_factorial_results(void) {
// 1.定义变量存储用户输入的整数
int n = 0;
// 2.判断n是否为正整数
while (n <= 0) {
// 2.1 提示输入
printf("输入一个正整数:\n");
// 2.2 让用户输入
scanf("%d", &n);
}
// 3.计算阶乘
int result = 1; // 存储计算结果
int current = 1; // 当前的乘数
while (current <= n) {
result *= current; // 累乘每次的乘数
current++; // 乘完一次就++
}
// 4.输出阶乘结果
printf("%d! = %d\n", n, result);
}
20-提示用户输入一个正整数n,如果n是5,就输出下列图形,其他n值以此类推
/*
*
**
***
****
*****
*/
void following_graph_is_output(void) {
// 1.定义变量存储用户输入的整数
int n = 0;
// 2.判断n是否为正整数
while (n <= 0) {
// 2.1 提示输入
printf("输入一个正整数:\n");
// 2.2 让用户输入
scanf("%d", &n);
}
// 3.输出一条分隔线(跟用户的输入隔开)
printf("-----------------\n");
// 4.输出*
for (int row = 1; row <= n; row++) { // 有多少行
for (int col = 1; col <= row; col++) { // 每行多少个(每行的个数跟行号一样)
printf("*");
}
// 输完一行后换行
printf("\n");
}
}
21-提示用户输入一个小于10的正整数n,如果n是5,就输出下列图形,其他n值以此类推
/*
1
22
333
4444
55555
*/
void positive_integer_n_less_than_10_1(void) {
// 1.定义变量存储用户输入的整数
int n = 0;
// 2.判断n是否为1~9的正整数
while (n <= 0 || n >= 10) {
// 2.1 提示输入
printf("输入一个1~9的正整数:\n");
// 2.2 让用户输入
scanf("%d", &n);
}
// 3.输出一条分隔线(跟用户的输入隔开)
printf("-----------------\n");
// 4.输出
for (int row = 1; row<=n; row++) { // 有多少行
for (int col = 1; col<=row; col++) { // 每行多少个
printf("%d", row); // 输出行号
}
printf("\n");
}
}
22-提示用户输入一个小于10的正整数n,如果n是5,就输出下列图形,其他n值以此类推
/*
54321
5432
543
54
5
*/
void positive_integer_n_less_than_10_2(void) {
// 1.定义变量存储用户输入的整数
int n = 0;
// 2.判断n是否为1~9的正整数
while (n <= 0 || n >= 10) {
// 2.1 提示输入
printf("输入一个1~9的正整数:\n");
// 2.2 让用户输入
scanf("%d", &n);
}
// 3.输出一条分隔线(跟用户的输入隔开)
printf("-----------------\n");
// 4.输出
for (int row = 1; row <= n; row++) { // 有多少行
for (int col = n; col >= row; col--) { // 每行多少个
printf("%d", col);
}
printf("\n");
}
}
23-编写一个函数int pieAdd(int n),计算1!+2!+3!+……+n!的值(n >= 1)。
// 比如pieAdd(3)的返回值是1! + 2! + 3! = 1 + 1*2 + 1*2*3 = 9
// 声明函数
int pieAdd(int n);
void function_int_pie_add(void) {
int result = pieAdd(3);
printf("%d\n", result);
}
// 定义函数
int pieAdd(int n) {
/*
解题思路:先计算出每个数字的阶乘,再把所有的阶乘加起来
*/
// 1.如果传入的n值不合理,直接返回0
if (n < 1) return 0;
// 2.定义一个变量,用来记录每次阶乘相加的结果
int sum = 0;
for (int i = 1; i <= n; i++) { // 一共有多少个数字
// 3.定义一个变量,记录当前数字对应的阶乘
int multi = 1;
for (int j = 1; j <= i; j++) {
multi *= j;
}
// 4.累加每次的阶乘
sum += multi;
}
return sum;
}