系列连载
- 【python / C / C++】
参考
- 《C语言程序设计(第四版)谭浩强》
- 【C语言】C语言视频教程
- 《郝斌 C 语言自学教程》
文章目录
- 1 什么是流程控制
- 2 流程控制的分类
- 2.1 顺序执行
- 2.2 选择执行
- 2.3 循环执行
- 2.3.1 for
- 2.3.2 while
- 2.3.3 do...while
- 2.3.4 switch
- 2.3.5 break
- 2.3.6 continue
1 什么是流程控制
程序代码的执行顺序
2 流程控制的分类
2.1 顺序执行
2.2 选择执行
1)定义
某些代码可能执行,也可能不执行,有选择的执行某些代码
2)分类
if
1、if 最简单的用法
格式:
if(表达式)
语句
功能:如果表达式为真,执行语句;表达式为假,语句不执行
2、if 的范围问题
3、if…else… 的用法
4、if…else if…else…的用法
5、C 语言对真假的处理
非零是真 – 1
零就是假 – 0
6、if 举例–求分数的等级
#include<stdio.h>
int main(void)
{
float score;
printf("请输入你的考试成绩:\n");
scanf("%f", &score);
if (score > 100)
printf("这是做梦!\n");
else if (score >= 90 && score <= 100)
printf("优秀!\n");
else if (score >= 80 && score <90)
printf("良好!\n");
else if (score >= 60 && score <80)
printf("及格!\n");
else if (score >= 0 && score < 60)
printf("不及格,继续努力!\n");
else
printf("输入的分数小于0!\n");
return 0;
}
从左到右运行,90 <= score
的结果为 1
或者 0
,一定小于 100,最终无法判断 score 是否在 90 到 100 范围内
7、if 的常见问题解析
else 开头报错
#include<stdio.h>
int main(void)
{
if (3 > 2)
printf("AAAA!\n");
else if (3>1)
printf("BBBB!\n");
else
printf("CCCC!\n");
return 0;
}
output
AAAA!
没有 else
2.3 循环执行
定义:
- 某些代码会被重复执行
分类
2.3.1 for
求 1~10 之间所有奇数的和
#include<stdio.h>
int main(void)
{
int sum = 0;
for (int i = 1; i <= 10; i += 2)
{
printf("i = %d\n", i);
sum += i;
}
printf("sum = %d\n", sum);
return 0;
}
output
i = 1
i = 3
i = 5
i = 7
i = 9
sum = 25
eg 求 1~100 所有数倒数的和
#include<stdio.h>
int main(void)
{
float sum = 0;
for (int i = 1; i <= 100; ++i)
{
sum += 1.0/i;
}
printf("sum = %f\n", sum);
return 0;
}
看一个比较神奇的例子
#include<stdio.h>
int main(void)
{
float a = 0.1, b = 0.2;
float c = a + b;
if (c == 0.3)
printf("a = %f, b = %f, c = %f\n", a, b, c);
else
printf("c = %f \n", c);
return 0;
}
调试的时候发现
参考 c语言如何把一个浮点变量精确到2位小数_浮点数比较的精度问题
2.3.2 while
1)执行顺序
2)与 for 的相互比较
3) 举例
从键盘输入一个数字,如果该数字是回文数,则返回 True,否则返回 False
#include<stdio.h>
int main(void)
{
int num;
int sum = 0;
printf("请输入一个整数:\n");
scanf("%d", &num);
int value = num;
while (num){
sum = sum * 10 + num % 10;
num /= 10;
}
if (sum == value){
printf("True!\n");
}
else{
printf("False!\n");
}
return 0;
}
斐波拉系数列
#include<stdio.h>
int main(void)
{
// 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368.
int num;
int f1 = 1;
int f2 = 1;
int f3;
printf("请输入你想查看的项:\n");
scanf("%d", &num);
if (num == 1 || num == 2){
f3 = 1;
}
else{
while (num >= 3){
f3 = f1 + f2;
f1 = f2;
f2 = f3;
num -= 1;
}
}
printf("结果为:%d\n",f3);
return 0;
}
4)什么时候用 while,什么时候用 for
没法说,用多了自然而然就知道了
2.3.3 do…while
主要用于人机交互
举例,一元二次方程
#include<stdio.h>
#include<math.h>
int main(void)
{
double delta;
double x1, x2;
double a, b, c;
char ch;
do{
printf("请输入一元二次方程的三个系数:\n");
printf("a=");
scanf("%lf", &a);
printf("b=");
scanf("%lf", &b);
printf("c=");
scanf("%lf", &c);
delta = b*b - 4 * a*c;
if (delta > 0){
x1 = (-b + sqrt(delta)) / (2 * a);
x2 = (-b - sqrt(delta)) / (2 * a);
printf("方程有两个不同的解,x1=%lf, x2=%lf\n", x1, x2);
}
else if (delta == 0){
x1 = x2 = -b / (2 * a);
printf("方程有唯一解,x1=x2=%lf\n", x1);
}
else{
printf("方程无解\n");
}
printf("继续输入一元二次方程系数吗?(Y/N)\n");
scanf(" %c", &ch); // 这里 " %c" 空格非常重要
} while ('Y' == ch || 'y' == ch);
}
输出
2.3.4 switch
case 相当于入口
举例坐电梯
#include<stdio.h>
#include<math.h>
int main(void)
{
int floor;
printf("请输入你想要到达的层数:\n");
scanf("%d", &floor);
switch (floor){
case 1:
printf("您已到达一层!\n");
break;
case 2:
printf("您已到达二层!\n");
break;
default:
printf("你选择的楼层还在建设中!\n");
case 3:
printf("您已到达三层!\n");
break;
}
return 0;
}
输出
请输入你想要到达的层数:
-1
你选择的楼层还在建设中!
您已到达三层!
哈哈哈,出现不在 case 中的会从 default
入口进,但是如果没有 break,就会导致上述结果(default 后面的语句继续执行)
2.3.5 break
-
break 如果用于循环是用来终止循环
-
break 如果用于 switch,则是用于终止 switch
-
break 不能直接用于 if,除非 if 属于循环内部的一个子句
-
在多层循环中,break 只能终止距离它最近的那个循环
-
在多层 switch 嵌套中,break 只能终止它最近的 switch
2.3.6 continue
- 用于跳过本次循环余下的语句,转去判断是否需要执行下次循环