参考:https://blog.csdn.net/weixin_44617968/article/details/117656810
流程控制
控制流程(也称为流程控制)是计算机运算领域的用语,意指在程序运行时,个别的指令(或是陈述、子程序)运行或求值的顺序。不论是在声明式编程语言或是函数编程语言中,都有类似的概念。 从逻辑上,语言是为了模拟实现我们现实生活中的每件事情,通过证明只需要具有 顺序,条件分支,循环 三种流程就可以模拟我们的任何事情。 对于C语言来说,系统会按顺序执行程序中的每一行代码。但仅有顺序执行是不够的,通现实一样,C语言还需要条件分支(选择结果),循环结构。
顺序结构:
按书写顺序从上至下依次执行
代码语言:javascript复制#include <stdio.h>
int main()
{
/*
这是一个计算器的案例,version0.1
输入你的数字,返回数字之和。
*/
// 定义两个变量,用来接收输入的数字
int numOne;
int numTwo;
int numOpera;
int opera;
// 友好提示信息
printf("这是一个计算机的案例n");
printf("输入的格式为 3 5 1,返回值3 5的和为8n");
printf("输入的格式为 3 5 0,返回值3-5的差为-2n");
选择结构
if选择结构
代码语言:javascript复制if(表达式){
语句1;
}else if(表达式2){
语句2;
}else{
表达式3;
}
后续语句;
案例:
代码语言:javascript复制#include <stdio.h>
int main(){
int a;
printf("请输入数字,我们判断大小");
scanf("%d",&a);
// if(a == 10){// 错误写法, 但不会报错
if (10 > a){
printf("a的值小于10n");
}else if(10 == a){
printf("a的值等于10n");
}else{
printf("a的值大于10n");
}
}
基于函数封装的条件选择
代码语言:javascript复制#include <stdio.h>
int main()
{
aCompare10();
}
aCompare10(int a)
{
int a;
printf("请输入数字,我们判断大小");
scanf("%d",&a);
if (10 > a)
{
printf("a的值小于10n");
}
else if(10 == a)
{
printf("a的值等于10n");
}
else
{
printf("a的值大于10n");
}
}
switch选择
代码语言:javascript复制switch(表达式){
case 常量表达式1:
语句1;
break;
case 常量表达式2:
语句2;
break;
case 常量表达式n:
语句n;
break;
default:
语句n 1;
break;
}
案例
代码语言:javascript复制#include <stdio.h>
int main()
{
aSwitch10();
}
aSwitch10()
{
int a;
printf("请输入功能选项,8表示XX,10表示YY,其它为ZZn");
scanf("%d",&a);
switch(a)
{
case 8:
printf("当前选择了8,值为:%d",a);
break;
case 10:
printf("当前选择了10,值为:%d",a);
break;
default:
printf("当前为默认值");
}
}
注意
switch 的表达式及 case 的值 的类型必须是 int ,或者可以被提升为整型的值(char,short) case 的值不能相同 每个 case 要以 break 结尾,否则会出现穿透问题 default 不一定要放在 case 最后,只有等到所有 case 不匹配才会执行。
循环结构
循环条件 成立时,会反复执行 循环体 ,直到条件不成立位置
while循环
代码语言:javascript复制while(循环控制条件) {
循环体中的语句;
能够让循环结束的语句;
....
}
循环控制条件:循环退出的主要依据,来控制循环到底什么时候退出 循环体:循环的过程中重复执行的代码段 循环终止语句(递增、递减、真、假等):能够让循环条件为假的依据,否则退出循环
案例
代码语言:javascript复制#include <stdio.h>
int main()
{
// while循环
whileTest();
}
whileTest()
{
/*
当输入的值为0-18的时候,输出 他还是一个孩子啊
当输入的值为>50的时候,输出 他只是一位老人啊
while(循环控制条件) {
循环体中的语句;
能够让循环结束的语句;
....
}
*/
while(1)
{
int a;
printf("请输入他的年龄n");
scanf("%d",&a);
if(a<=18 && a>0 )
{
printf("他还是一个孩子啊n",a);
}
else if(a>50)
{
printf("他只是一位老人啊n",a);
}
else
{
printf("年轻人就得多努力n",a);
}
}
}
输出为:
案例,带有退出机制
代码语言:javascript复制#include <stdio.h>
int main()
{
int num = 5;
// while循环
whileTest(num);
}
whileTest(int b)
{
/*
当输入的值为0-18的时候,输出 他还是一个孩子啊
当输入的值为>50的时候,输出 他只是一位老人啊
while(循环控制条件) {
循环体中的语句;
能够让循环结束的语句;
....
}
*/
while(b)
{
--b;
printf("当前的b的值为:%d",b);
int a;
printf("请输入他的年龄n");
scanf("%d",&a);
if(a<=18 && a>0 )
{
printf("他还是一个孩子啊n",a);
}
else if(a>50)
{
printf("他只是一位老人啊n",a);
}
else
{
printf("年轻人就得多努力n",a);
}
}
}
输出为:
do while
代码语言:javascript复制do {
循环体中的语句;
能够让循环结束的语句;
....
} while(循环控制条件);
a. 应用场景 do while 与 while
代码语言:javascript复制#include <stdio.h>
int main()
{
int num = 0;
// 当num为0时
// do while循环 至少允许一次
//doWhileTest(num);
// while可能一次也不运行
doWhileTestVSWhile(num);
}
doWhileTest(int b)
{
/*
当输入的值为0-18的时候,输出 他还是一个孩子啊
当输入的值为>50的时候,输出 他只是一位老人啊
do {
循环体中的语句;
能够让循环结束的语句;
....
} while(循环控制条件);
*/
do
{
printf("当前的b的值为:%d",b);
printf("请输入他的年龄n");
int a;
scanf("%d",&a);
if(a < 18 && a >0)
{
printf("他还是一个孩子啊n",a);
}
else if(a > 50 )
{
printf("他是一位老人啊n",a);
}
else
{
printf("年轻人就得多努力n",a);
}
}
while(b);
}
doWhileTestVSWhile(int b)
{
/*
当输入的值为0-18的时候,输出 他还是一个孩子啊
当输入的值为>50的时候,输出 他只是一位老人啊
do {
循环体中的语句;
能够让循环结束的语句;
....
} while(循环控制条件);
*/
while(b)
{
printf("当前的b的值为:%d",b);
printf("请输入他的年龄n");
int a;
scanf("%d",&a);
if(a < 18 && a >0)
{
printf("他还是一个孩子啊n",a);
}
else if(a > 50 )
{
printf("他是一位老人啊n",a);
}
else
{
printf("年轻人就得多努力n",a);
}
}
}
do…while 和 while 的区别
do…while 至少执行一次 while 可能一次都不执行
for循环
代码语言:javascript复制for(初始化表达式;循环条件表达式;循环后的操作表达式) {
循环体中的语句;
}
对比 while 来说, for 更节约内存空间 案例
代码语言:javascript复制#include <stdio.h>
int main()
{
int num = 5;
forTest(5);
}
forTest(int b)
{
/*
for(初始化表达式;循环条件表达式;循环后的操作表达式) {
循环体中的语句;
}
*/
for(int startNum = 0; startNum<b; startNum )
{
printf("当前的startNum的值为:%d",startNum);
printf("请输入他的年龄n");
int age;
scanf("%d",&age);
if(age < 18 && age >0)
{
printf("他还是一个孩子啊n",age);
}
else if(age > 50 )
{
printf("他是一位老人啊n",age);
}
else
{
printf("年轻人就得多努力n",age);
}
}
}
输出为:
案例输出九九乘法表;
代码语言:javascript复制#include <stdio.h>
int main()
{
forTest();
}
forTest()
{
/*
99 乘法表
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
...
for(初始化表达式;循环条件表达式;循环后的操作表达式) {
循环体中的语句;
}
*/
// 遍历1-9 每遍历一次 输出一行
for(int a = 1 ; a <=9; a )
{
//printf("当前a的值为%d n",a);
for(int b =1; b<=a; b )
{
//printf("当前a的值为%d ,b的值为%d ",a,b);
printf("%d*%d=%d t",b,a,a*b);
}
printf("n");
}
}
输出为:
循环优化
在多重循环中,应当将最长的循环放在最内层,最短的循环放在最外层,减少CPU跨循环层切换的次数
举个栗子