什么是流程控制
概念:程序代码执行的顺序
流程控制的分类
一、顺序执行
程序举例
-
交换两个数
t=a;
a=b;
b=t; -
后两位四舍五入
原数乘100
加上0.5
取整
除以100输出例如将2.437—>2.44
double x; x=x*100; x=x+0.5; x=(int)x; //x的接受类型任然是double类型 x=x/100; //x=2.44
二、选择执行
1.概念
某些代码可能执行,也可能不执行,有选择的执行某些代码
2.分类
2.1 if语句
-
if最简单的用法
格式:
if(表达式) 语句
功能:如果表达式为真,执行语句,反之不执行
if的范围问题:
1. if(表达式) 语句A; 语句B; 只控制A的执行或不执行,无法控制语句B一定会执行 2. if(表达式) { 语句A; 语句B; } if都控制
-
if…else…用法
是一个语句if(表达式){ A; } else{ B; }
-
if…else if…else…用法
一个语句if(1) 成立执行A A; else if(2) 1不成立,2成立执行B B; else 1,2都不成立,执行C C;
-
if语句的嵌套
if() if() 语句1; else() 语句2; else if() 语句3; else 语句4; 注:if与else的配对关系,else总是与它上面的最近的未佩对的if配对 如果if与else的数目不一样,为实现程序设计者的思想,可以加花括号来确定配对关系 if() { if() 语句1; } else 语句2; 这里的else就与第一个if进行配对了
-
举例
-
90<=score<=100
写法是错误的
因为:90<=score逻辑值永远为1或0,那么1或0永远小于100,所以执行的结果永远为真(1)
正确的写法:90<=score&&score<=100 -
两个变量值得互换
例:int a=3; int b=5; 方法:加一个另外变量 int t; a,b互换如下 t=a; a=b; b=t;
-
对三个变量的值进行排序
编写代码完成:a最大,b中间,c最小 方法:定义一个中间变量t
if(a<b) { t=a; a=b; b=t; } if(a<c) { t=a; a=b; b=t; } if(b<c) { t=b; b=a; a=t; }
-
-
if的常见问题
-
空语句问题
if(3>2); 等价于 if(3>2) ; 这是一个空语句
-
错误示范
if(表达式1); 有一个空语句 A; 第二个语句 else else无法与第一个if语句匹配 B;
-
语句执行问题
if(表达式1) A; else if(表达式2) B; else C; 即使表达式1和2都成立也只会执行A语句
-
语句逻辑上有漏洞(虽然不会出错)
if(表达式1) A; else if(表达式2) B; else if(表达式3) C;
-
不合法语句
if(表达式1) A; else(表达式2) 这样写法不正确:要么去掉(表达式2);要么在else后加if B;
-
2.2 switch语句
-
一般形式:
switch(控制表达式) { case常量表达式1: 语句1; break; case常量表达式2: 语句2; break; case常量表达式3: 语句3; break; ....... default: 语句n; break; }
-
举例
scanf("%d",&val); switch(val) { case 1: printf("一层开\n"); break; case 2: printf("二层开\n"); break; default : printf("没有这一层\n"); break; } 当break去掉后,输入1 将输出:一层开和二层开 因为:case1和case2都是程序的入口,先找到入口后再自上而下执行,不再进行判断。
#include<stdio.h> int main(void){ char grade; scanf("%c", &grade); printf("Your score:"); switch(grade){ case 'A': printf("85-100\n"); break; case 'B': printf("70-84\n"); break; case 'C': printf("60-69\n"); break; default:printf("data error\n"); } return 0; } ------------------ C Your score:60-69
case后面的称为标签:常量表达式
只能是:枚举常量、数值常量、字符、常变量、宏名
三、循环执行
1.定义
某些代码会被重复执行
2.分类
2.1 for语句
-
一般形式为:
for(表达式1;表达式2;表达式3){ 语句 } 表达式1:设置初始条件,只执行一次。可以是0,1个或者多个变量设置初值 表达式2:循环条件表达式,判定是否继续循环。在每次执行循环体前先执行此表达式,决定是否继续执行循环体 表达式3:作为循环的调整。执行完循环体之后才进行的
注:for语句中的表达式可以部分或者全部省略,但是两个;不能省略。
- 表达式2是一个逻辑表达式,当表达式2为假就跳出for循环
#include <stdio.h> int main(void) { int a=-1,b=2; for(; a++,b--; ) printf("%d %d",a, b); } 程序的输出结果为:-1 1 0 0 注:for循环每次判断表达式a++,b--的值,这是逗号表达式,首先计算a++,再计算b--, 整个表达式的值是b--的值,若逗号表达式值不为0,则执行for循环
-
执行过程
for(i=1; i<4; ++i) 表达式(1,2,3) sum = sum + i; 表达式 4 printf("sum=%d\n", sum); 先执行1,在执行2(2成立的话),执行4,再执行3, 3执行完表示一次循环结束。
i=1,1<=4 成立 sum=1,i=2 第一次循环结束 i=2,2<=4 成立 sum=1+2=3,i=3 第二次循环结束 i=3,3<=4 成立 sum=1+2+3=6, 第三次循环成立 i=4,4<=4 成立 sun=1+2+3+4=10,i=5 第四次循环成立 i=5,5<=4 不成立 执行下一个语句 i的最终值是5
-
多个for循环的嵌套使用
for(1;2;3) for(4;5;6) A; B; 先执行:1->2(成立)->4->5(成立)->A->6 一次循环结束 例如: 内部:6->5(成立)->A->6->5(不成立) 外部:->3->2(成立)->4->5(成立)->A->6 ->5(不成立)->3->2(不成立)->B 结束
2.2 while语句
-
一般形式
while(表达式) { 循环体 }
-
执行顺序
while(表达式) 语句; 表达式成立执行下面语句,语句就是循环体,循环体只能是一个语句,可以是一个简单的语句,还可以是复合语句。
-
举例
求回文数 int main(void) { int val; int m; int sum=0; scanf("%d",&val); m=val; while(m); { sum=sum*10+m%10; m=m/10; } if(sum==m) printf("YES\n"); } ``` 整数求逆 对一个整数做%10得到它的个位数 对一个整数做/10,去掉它的个位数
2.3 do…while语句
-
一般形式:
do { 循环体语句 }while(表达式); 先执行循环体里面的语句,然后判断表达式是否成立,如果表达式成立继续执行循环体语句 do...while并不等价于for,也不等价于while 主要用于人机交互 例如: char ch; do { ... ... printf("想继续吗?(Y/N)"); scanf("%c",&ch); }while('Y'==ch||'y'==ch);
2.4 break语句和continue语句
-
break语句作用:使流程跳到循环体之外,接着执行循环体下面的语句
1. 如果用于循环是用来终止循环的 2. 如果用于switch则用来终止switch break不能直接用于if,除非if属于循环内部的一个字句
举例: for(i=1;i<3;++i) { if(3>2) break; 终止for循环,一次也不输出哈哈 printf("哈哈\n"); } 注:在多层循环中break只能终止距离它最近的循环
-
continue语句的作用
用于跳过本次循环余下的语句,转去判断是否需要执行下次循环
例: for(1;2;3) { A; B; continue; 执行完本语句后会执行语句3,C,D会被跳过去 C; D; } while(表达式) { A; B; continue; C,D会被跳过去,继续判断表达式是否成立 C; D; }
3. 几种循环语句的比较
-
for循环与while循环的相互比较
for( ;条件; ) == while(条件)for(1;2;3) A; 等价于 1; while(2) { A; 3; }
例子:
for(i=1;i<101;++i) { sum=sum+i; } 等价于 i=1; while(i<101) { sum=sum+i; ++i; }
-
for while do…while使用时刻
如果有固定次数使用for
如果必须执行一次用do…while
其他情况用while -
while和do…while,为了使循环正常结束,应在循环体中包含使循环趋于结束的语句i++,i—
-
while、do while、for都可以使用break和continue语句结束循环
如何看懂一个程序
分三步:
-
流程
知道程序的流程是如何运行的
-
每个语句的功能
-
试数