一、流程控制
1、什么是流程控制
程序代码执行的顺序
2、流程控制的分类
- 顺序
定义:某些代码可能执行,也可能不执行,有选择的执行某些代码
分类:if 、 switch - 选择
- 循环
二、顺序
三、选择
if
-
if最简单的用法
格式:
if(表达式)
语句;
功能:如果表达式为真,执行语句;如果表达式为假,语句不执行。
-
if的范围问题
a. if 默认只能控制其后的一个语句。例如if只能控制A执行与否,而B一定会执行。
if(表达式)
语句A;
语句B;
b. 用花括号括起来可控制括号内的语句。例如if可控制A和B执行与否。
if(表达式){
语句A;
语句B;
}
由此可见:if默认只能控制一个语句的执行与否,若要控制多个语句就需要括起来。
-
if…else的用法
-
if…else if…else的用法
-
C语言对真假的处理
非零就是真,零就是假
真用1表示, 假用0表示 -
if举例
int i = 3;
int j = 4;
int temp;
temp = j;
j = i;
i=temp;
printf("i=%d,j=%d",i,j);
int a,b,c;
int t;
printf("请输入三个数(中间以空格分割):");
scanf("%d %d %d",&a,&b,&c);
if(a<b){
t=a;
a=b;
b=t;
}
if(a<c){
t=a;
a=c;
c=t;
}
if(b<c){
t=b;
b=c;
c=t;
}
printf("%d>%d>%d",a,b,c);
对三个数字排序
- if的常见问题解析
(1)空语句问题:在if()后直接加分号。即if控制一个空语句,无实际含义
(2)else必须有对应的if,不能以else开头
(3)if…else if…else按顺序执行,只执行第一个正确的
(4)else可选可不选,且else不带(表达式),但是else if要带(表达式)
(5)else(表达式); 语法不会出错但逻辑是错误的
if(3>2);//;表示结束,导致else没有对应的if
printf("aa");
else
printf("bb");//error
switch
int val;
printf("请输入您要进入的楼层:");
scanf("%d",&val);
switch(val){
case 1:
printf("1层开!\n");
case 2:
printf("2层开!\n");
break;
case 3:
printf("3层开!\n");
break;
case 4:
printf("4层开!\n");
break;
default:
printf("楼层不存在");
break;
}
//输入1,输出1层开!2层开!
case,default只是switch的入口,一旦从某个入口进入后,其他的条件都被屏蔽掉,将按顺序执行到break跳出循环。
switch是选择不是循环,如果在switch中出现了break语句,该语句的功能只是退出switch语句去执行它下面的语句。在switch中出现continue是错误的。除非switch本身就是for或while循环的一部分。
四、循环
1、定义
某些代码会被重复执行
2、分类
for循环:
-
1.格式
-
2.执行顺序:
单个for循环的使用:
执行顺序:第一轮:1243(3结束代表这次循环结束)
第二轮:243
第三轮:243
…
最后一轮:2多个for循环的嵌套使用:
第一轮大循环:1,2,4,5,
内部小循环: A,6,5,A,6,5,A…5(不成立),3(内部循环完毕,第一轮大循环结束)
第二轮大循环:2,4,5,
内部小循环: A,6,5,A,6,5,A…5,3(内部循环完毕,第二轮循环结束)
…
2不成立:结束for循环,执行B
- 3.范围:
默认执行其后一个语句,多个语句需要大括号
- 4.例子:
1-10的奇数之和
int i;
int sum=0;
for(i=1;i<=10;i+=2){
sum+=i;
}
printf("%d\n",sum);//25
printf("%d",i);//11
for和if的嵌套使用例子:
int i;
int j=0;
int o=0;
int sumj=0;
int sumo=0;
float avg;
for(i=1;i<=10;i++)
{
if(i%2==1){
sumj=sumj+i;
j+=1;
}
else{
sumo=sumo+i;
o+=1;
}
}
//avg=1.0*sumj/j;
printf("1-10的奇数个数为:%d,奇数和为:%d,奇数平均值为:%d\n",j,sumj,sumj/j);
printf("1-10的偶数个数为:%d,偶数和为:%d\n",o,sumo);
1+1/2+1/3…1/100
int i;
float sum=0;
for(i=1;i<=100;++i){
sum=sum+1/(float)i;//或sum=sum+1.0/i;
}
printf("%f",sum);
试数:
浮点数存储带来的问题
while
- 执行顺序
格式:
- 与for的相互比较
for和while可以相互转换
但for的逻辑性更强,更不容易出错,推荐多使用for
- 举例
从键盘输入一个数字,如果该数字是回文数,则返回yes,否则返回no(回文数:正着写和倒着写都一样的数字)
int val;//存放待判断的数字
int m;
int sum=0;
printf("请输入您需要判断的数字:");
scanf("%d",&val);
m=val;
while(m){
sum=sum*10+m%10;
m /=10;
}
if(sum==val)
printf("yes!");
else
printf("no!");
- 什么时候用while,什么时候用for
do…while
主要用于人机交互
do…while 和while、for不能相互转换
原因是do…while至少执行一次。但while、for当表达式为假时不执行。
一元二次方程
double a,b,c;
double delta;
double x1,x2;
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):");
scanf(" %c",&ch);// %c前面必须加一个空格
}while('y'==ch||'Y'==ch);
3、break 和continue
- break
break如果用于循环是用来终止循环
break如果用于switch,则是用于终止switch
break不能直接用于if,除非if属于循环内部的一个子句
for(i=0;i<3;++i){
if(3>2)
break;//break 虽然是 if 内部的语句 ,但 break 终止的却是外部的 for 循环
printf("ee\n");//什么也没输出。
}
在多层循环中,break只能终止距离他最近的for循环
int i,j;
for(i=0;i<2;i++){
for(j=1;j<4;++j)
break;//break只能终止距离他最近的for循环
printf("同志们好\n");//同志们好!同志们好!
}
在多层switch嵌套中,终止距离他最近的switch
int x=1,y=0,a=0,b=0;
switch(x){//第一个switch
case 1:
switch(y){//第二个switch
case 0:
a++;
break;//终止第二个
case 1:
b++;
break;//终止第二个
}
b=100;
break;//终止第一个
case 2:
a++;
b++;
break;//终止第一个
}
printf("a=%d,b=%d",a,b);//a=1,b=100
- continue
用于跳过本次循环余下的语句,转去判断是否需要执行下次循环。
for(1;2;3)
{
A;
B;
continue;//如果执行该语句,则执行完该语句后,会执行语句3,C和D都不执行
C;
D;
}
while(表达式)
{
A;
B;
continue;// 如果执行该语句,则执行完该语句后,会执行表达式,C和D都不执行。如果要执行for中的语句3,则需要将其放在continue前。
C;
D;
}
几个例子:
int i=0,s=0;
do{
if(i%2){
i++;
continue;//跳过i++,s+=i,执行while(i<5)
}
i++;
s+=i;
}while(i<5);
printf("%d\n",s);//9
int a=1,b;
for(b=1;b<=10;b++){
if(a<=8)
break;//跳到printf("")
if(1==a%2){
a+=5;
continue;//跳到for,执行b++
}
a-=3;
}
printf("b=%d\n",b);//1