流程控制
一.什么是流程控制
程序代码执行的顺序
二.流程控制的分类
1.顺序执行
2,选择执行
3.循环执行
阐述:选择执行
定义
某些代码可能执行,也可能不执行,有选择的执行某些代码
分类
if语句
1.if最简单的用法
格式:
if(表达式)
语句
功能:
若表达式真,则执行语句;不成立,不执行。
2.if的范围问题
*if只能默认的控制一个语句的执行或不执行
格式
(1) if(表达式)
语句A;//if控制
语句B;//if不控制
(2)if(表达式)
{
语句A;
语句B;
} //此时if可以控制A,B语句
*由此可见,if只能默认控制一个语句,若想控制多个,必须用{}
3.if…else用法
if(表达式)
语句A;
else
语句B;
4.if…else… if…else…用法
格式:
if(1)
A;
else if(2)
B;
else
C;
举例:
if(delta>0)
printf("2解\n");
printf("哈哈\n");//程序出错
else if(delta=0) //无匹配的if
printf("1解\n");
else if (3)
C;
else
D;
5.if对真假处理score
非零为真,零为假,真1假0
6.if举例
求分数等级
#include<stdio.h>
int main()
{
float score;
printf("请输入成绩:");
scanf("%f",score);
if(score>100)
printf("做梦!\n");
else if(score>=90&&score<=100)//不可写为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("错误!\n");
return 0;
}
互换数字
#include<stdio.h>
int main()
{
int i=3,t;
int j=4;
t=i; /*
i=j; 引入第三变量t
j=t; */
return 0;
}
任意三个数字排序
#include<stdio.h>
{
int a,b,c,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\n",a,b,c);
return 0;
}
程序 = 算法 + 语言 程序=算法+语言 程序=算法+语言
*学习方法:
如何看懂程序
流程 每语句的功能 试数
小算法程序
尝试自己编程 看懂答案 改程序,并知道改后程序不同结果含义
7.if常见问题解析
(1)空语句问题
if(3>2); 等价于 if(3>2)
;
(2) if(表达式);//;错误 if(表达式) //正确
printf A ; A;
(3)if(表达式1)
A;
else if(表达式2)
B;
else if(表达式3)
C;
else
D;
(4) if(表达式1)
A;
else if( 表达式2) 语法无错,但逻辑有误
B;
else if(表达式3)
C;
(5) if(表达式1)
A;
else if(表达式2)
B;
else if(表达式3)
C;
else(表达式4) //要么去掉(表达式4),要么在else后加if
D;
(6)if(表达式1)
A;
else if(表达式2)
B;
else (表达式3);//(表达式3)无实际意义
C;
循环
1.定义
某些代码会被重复执行
2.分类
for
whlie
do…while
*循环的例子
1.求1+2+…+100
#include<stdio.h>
int main()
{
int i,sum=0;
for(i=0;i<=100;++i)
sum=sum+i;
printf("sum=%d\n",sum);
return 0;
}
/*执行顺序:i=0-i<=100-sum=sum+i-++i-i<=100-++i.....
++i标志循环结束 */
2.求1到100的奇数和
#include<stdio.h>
int main()
{
int i,sum=0;
for(i=1;i<100;i+=2)
{
sum=sum+i; //循环了5次
printf("A\n");//验证循环次数,输出了5行A
}
printf("i=%d\n",i);
printf("sum=%d\n",sum);
return 0;
}
*for和if的嵌套使用
(1)求1到100可被3整除的数字之和
#include <stdio.h>
int main()
{
int i,sum=0;
for(i=3;i<=100;++i)
{
if(i%3==0) //若能被3整除
sum=sum+i
} //若}在printf后,则输出结果:sum=3 sum=3 sum=3 sum=9...
printf("sum=%d\n",sum)
return 0;
}
/*运行顺序:i=3,i<=100,if,printf(不成立)/sum=sum+i printf(成立),++i
i<=100,if,sum=sum+i(成立)/printf(不成立),++i */
for循环
1.格式
for(1;2;3)
语句A;
2.执行流程<重点>
单个for循环使用,多个for循环使用
多个for循环的嵌套使用<极其重要!!!>
1.for(1;2;3)
for(4;5;6)
A;
B;
/*
整体有2个语句
执行顺序:1,2,4,5,A,6,5(不成立),3,2(成立)4,5,4,6,...2(不成立),B
1,2,4,5,A,6,5(成立),A,6,5(不成立)...,3,2(成立)4,5,4,6,...2(不成立),B
*/
2.for(1;2;3)
for(4;5;6)
{
A;
B;
}
//整体有1个语句
3.for(7;8;9)
for(1;2;3)
{
A;
B;
for(4;5;6)
C;
}
//整体1个语句
3.for嵌套循环
#include<stdio.h>
int main()
{
int i,j;
for(i=0;i<3;++i)
for(j=2;j<5;++j)
printf("哈哈\n");
printf("嘻嘻\n");
return 0;
}
输出结果:
哈哈
哈哈
哈哈
哈哈
哈哈
哈哈
哈哈
哈哈
哈哈
嘻嘻
#include<stdio.h>
int main()
{
int i,j;
for(i=0;i<3;++i)
printf("呵呵\n");
for(j=2;j<5;++j)
printf("哈哈\n");
printf("嘻嘻\n");
return 0;
}
输出结果:
呵呵
呵呵
呵呵
哈哈
哈哈
哈哈
嘻嘻
#include<stdio.h>
int main()
{
int i,j;
for(i=0;i<3;++i)
{
printf("呵呵\n");
for(j=2;j<5;++j)
{
printf("哈哈\n");
printf("嘻嘻\n");
}
printf("呜呜\n");
}
return 0;
}
输出结果:
呵呵
哈哈
嘻嘻
哈哈
嘻嘻
哈哈
嘻嘻
呜呜
呵呵
哈哈
嘻嘻
哈哈
嘻嘻
哈哈
嘻嘻
呜呜
呵呵
哈哈
嘻嘻
哈哈
嘻嘻
哈哈
嘻嘻
呜呜
while循环
1.执行顺序
格式:
while(表达式)
语句;
2.与for的相互比较
for与while可以相互转换,但for逻辑性更强,更不容易出错,推荐多用for
1;
for(1;2;3) while(2)
A; 等价于 {
A;
3;
}
例题:求1+…+100
*用for实现
#include<stdio.h>
int main()
{
int sum=0;
int i;
for(i=1;i<101;++i;)
{
sum=sum+i;
}
printf("sum=%d\n",sum);
return 0;
}
*用while实现
#include<stdio.h>
int main()
{
int sum=0;
int i;
i=1;
while (i<101)
{
sum=sum+i;
++i;
}
printf("sum=%d\n",sum);
return 0;
}
3.举例
从键盘输入一个数字,若该数字为回文数,则yes,否则no. ( 回文数:123,321…)
#include<stdio.h>
int main()
{
int val; //存放待判断数字
printf("请输入:");
scanf("%d",&val);
m=val;
while(m)
{
sum=sum*10+m%10;
m/=10; //m=1234,m/=10,m=123...
}
if(sum==val)
printf("Yes!\n");
else
printf("No!\n");
return 0;
}
/*
试数:1> m=1234成立
sum=0*10+1234%10=4
m=1234/10=123;
2> m=123成立
sum=4*10+123%10=43
m=123/10=12;
3> m=12成立
sum=43*10+12%10=432
m=12/10=1;
4> m=1成立
sum=432*10+1%10=4321
m=1/10=0
5> m=0不成立
最终sum=4321
*/
4.什么时候while,什么时候for
自己领会
do…while循环
格式:
do
{
......
}while(表达式);
do…while不等价于for,也不等价于while,用于人机交互
举例:
一元二次方程
#include<stdio.h>
#include<math.h>
int main()
{
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(0==delta)
{
x1=x2=(-b)/(2*a);
printf("有唯一解,x1=x2=%lf\n",x1,x2);
}
else
{
printf("无实数解\n");
}
printf("继续(Y/N):");
scanf(" %c,&ch");//%c前面必须加1空格,原因略
}while('y'==ch||'Y'==ch);
return 0;
}
while(表达式)
{
......
}
for(1;2;3)
A;
break用法<重点>
1.注意点
*break如果用于循环用来终止循环
*break如果用于switch,则用于终止switch
*break不能直接用于if,除非if属于for循环内部的一个子句.
举例:
for (i=0;i<3;++i)
{
if(3>2)
break; //break虽然是if内部语句,但break终止的却是外部的for循环
printf("呵呵\n"); //永远不会输出
}
break用于多个for循环
*在多层循环中,break只能终止距离它最近的循环
例子:
#include<stdio.h>
int main ()
{
int i,j;
for(i=0;i<3;++i)
{
for(j=1;j<4;++j)
break; //在多层循环中,break只能终止距离它最近的循环
printf("同志们好\n");
}
}
运行结果:
同志们好
同志们好
同志们好
*在多层switch嵌套中,break只能终止它最近的switch
例子:
#include<stdio.h>
int main()
{
int x=1,y=0,a=0,b=0;
switch(x) //第一个switch
{
case 1;
switch(y) //第二个switch
{
case 0;
a++;
break; //终止第二个switch
case 1;
b++
break; //终止第一个switch
}
b=100
break;
case 2;
a++;
b++;
break;
}
printf("%d %d\n",a,b); //26行
return 0;
}
运行结果:a=1,b=100
continue用法
(用得较少)
用法:
用于跳过本次循环余下语句,转去判断是否需要下次循环
举例:
1.
for(1;2;3)
{
A;
B;
continue; //若执行此语句,则执行完此语句后,会执行语句3,C和D都会被跳过,C和D不会被执行
C;
D;
}
2.
while(表达式)
{
A;
B;
continue;//若执行此语句,则执行完此语句后,会执行表达式,C和D都会被跳过,C和D不会被执行
C;
D;
}
switch 用法介绍
模拟电梯 (重点)
#include<stdio.h>
int main()
{
int val;
printf("请输入楼层:");
scanf("%d",&val);
switch(val)
{
case 1:
printf("1层开\n");
break; //若注释了break,输入1,结果为:1层开,2层开
case 2:
printf("2层开\n");
break;
case 3:
printf("3层开\n");
break;
default:
printf("无楼层\n");
break;
}
return 0;
}
/*
case为程序入口
break为终止switch
*/
switch琐碎知识点
1.switch语句
switch(表达式)
{
case常量表达式1:语句1;
case常量表达式2:语句2;
.......
case常量表达式n: 语句n;
default : 语句n+1;
}
**注:**1.所有常量表达式为便于描述称为标签,这些标签只能是(1)枚举常量(枚举元素)(2)数值常量;
(3)字符常量;(4)常变量;(5)宏名中的一种。注意普通变量,枚举变量不能作为标签使用。
2.switch后的表达式允许为任意类型,但 Vc++中只能为int或char
3.
switch(i)
{
case1:语句1;
case2:语句2;
default : 语句3;
case3: 语句4;
}
*当i1,从case1开始往下一个不落进行,i2,case2开始往下执行,i3,case3,i4,default 开始往下执行,i0,执 行情况同i4.
4.switch是选择不是循环,break作为结束switch的语句。在switch中出现continue不对,除非switch本身就属于for或while循环的一部分。