一、什么是流程控制
程序代码执行的顺序
二、流程控制的分类
(一)顺序执行
(二)选择执行
1.定义:
某些代码可能执行,也可能不执行,有选择的执行某些代码
2.分类:
(1)if(比switch重要的多)
《1》if最简单的用法
①格式:if(表达式) 语句;
②功能:如果表达式为真,执行语句;表达式为假,不执行语句
/*
时间:2020年1月
编辑人:pinkowonote
功能:\
目的:if最简单的用法
*/
# include <stdio.h>
int main(void)
{
/*表达式逻辑值为1(代表真)语句执行,
表达式逻辑值为0(代表假)语句不执行*/
if (3>2)
printf("AAAA\n");
if (3)
printf("BBBB\n");
if (0)
printf("CCCC\n");
if (0 == 0)
printf("DDDD\n");
return 0;
}
/*
在VS_2013中输出结果是:
------------------------
AAAA
BBBB
DDDD
------------------------
*/
《2》if的范围问题(重要)
●没有大括号,if范围就是离自己最近的那一条语句
①格式1:
if(表达式)
语句A;
语句B;
●if默认只能控制A的执行或不执行,无法控制B的执行或不执行,B一定会执行。
/*
时间:2020年1月
编辑人:pinkowonote
功能:\
目的:if的范围问题
*/
# include <stdio.h>
int main(void)
{
/*都会输出,没有大括号,if范围就是离自己最近的
那一条语句*/
/*无论第二个语句是否属于if,都会输出【因为表达式为真
且第一个语句执行完一定会顺序执行第二个语句】*/
if (3>2)
printf("AAAA\n");
printf("BBBB\n");
/*根据执行结果可知第二个语句不属于if*/
if (1>2)
printf("CCCC\n");
printf("DDDD\n");
return 0;
}
/*
在VS_2013中输出结果是:
-------------------------------
AAAA
BBBB
DDDD
-------------------------------
总结:if默认是只能控制一个语句的执行或不执行
*/
②格式2:
if(表达式)
{
语句A;
语句B;
}
●if默认只能控制一个语句的执行或不执行,如果想控制多个语句的执行或不执行,就必须把这些语句用{ }括起来。
/*
时间:2020年1月
编辑人:pinkowonote
功能:\
目的:if的范围问题
*/
# include <stdio.h>
int main(void)
{
if (3 > 2)
{
printf("AAAA\n");
printf("BBBB\n");
}
printf("FFFF\n");
if (1 > 2)
{
printf("CCCC\n");
printf("DDDD\n");
}
printf("EEEE\n");
return 0;
}
/*
在VS_2013中输出结果是:
------------------------
AAAA
BBBB
FFFF
EEEE
------------------------
*/
《3》if……else……的用法
●scanf等类似的函数已经不太安全,要想保证程序的安全性,建议以后采用_s结尾的安全版本——>scanf_s
/*
时间:2020年1月
编辑人:pinkowonote
功能:\
目的:if…… else……的用法
*/
# include <stdio.h>
int main(void)
{
int i, j;
printf("请用户输入i,j的值,中间用空格隔开:");
/*error C4996: 'scanf': This function or
variable may be unsafe. Consider using
scanf_s instead. To disable deprecation,
use _CRT_SECURE_NO_WARNINGS. See online
help for details.*/
/*scanf等类似的函数已经不太安全,要想保证
程序的安全性,建议以后采用_s结尾的安全版本
——>scanf_s*/
scanf_s("%d %d",&i,&j);
if (i > j)
printf("i大于j\n");
else
printf("i小于j\n");
return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
请用户输入i,j的值,中间用空格隔开:
9 2
i大于j
--------------------------------
结论:2009年郝斌老师说明
文件名为:if……else……
或者是文件名内有“.”,需要在文件名后缀加.c
否则文件会出现问题
*/
/*
时间:2020年1月
编辑人:pinkowonote
功能:\
目的:if…… else……的用法
*/
# include <stdio.h>
int main(void)
{
/*if……else……第一个语句*/
/*if不含有大括号只能控制离它最近的一条语句*/
if (3 > 2)
printf("AAAA\n");
/*否则,除if情况之外的所有情况*/
/*else不含有大括号只能控制离它最近的一条语句*/
else
printf("BBBB\n");
/*第二个语句*/
printf("CCCC\n");
return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
AAAA
CCCC
--------------------------------
*/
●输出暂停用pause:system(pause);
●alt + F4关闭
《4》if……else if……else……的用法
①格式:
if(1)
语句A;
else if(2)
语句B;
else if(3)
语句C;(能执行语句C,说明1、2都不成立,3成立。顺序执行,不管语句C后面是否成立都不执行)
else
语句D;
/*
时间:2020年1月
编辑人:pinkowonote
功能:\
目的:if……else if……else……的用法
*/
# include <stdio.h>
int main(void)
{
double delta = -1;
if (delta > 0)
printf("有两个解\n");
/*printf("哈哈\n");添加了这个语句后出错*/
//否则,除if情况之外的所有情况
else if (delta == 0)
printf("有一个解\n");
else
printf("无解!\n");
return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
无解!
--------------------------------
*/
《5》C语言对真假的处理
非零是真
零是假
真用1表示
假用0表示
《6》if举例——求分数的等级
100~90优秀
90~80良好
80~60及格
60~0不及格
/*
时间:2020年1月
编辑人:pinkowonote
功能:\
目的:if举例——求分数的等级
*/
# include <stdio.h>
int main(void)
{
float score;
printf("请输入您的考试成绩:");
scanf_s("%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 /*不需要再输入(score < 0),因为else包含之前
表达式之外的所有情况!*/
printf("您输入的成绩过低,请不要过于自卑!\n");
return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
请输入您的考试成绩:65
及格
--------------------------------
*/
《7》if的常见问题解析——对任意三个数字进行排序
/*
时间:2020年1月
编辑人:pinkowonote
功能:程序 = 算法 + 语言
编写代码完成:a最大值,b中间值,c最小值
目的:if的常见问题解析——对任意三个数字进行排序
*/
# include <stdio.h>
int main(void)
{
int a, b, c;
/*临时变量:temporary adj. 暂时的,临时的
(temporary variable临时变量)*/
int t;
/*平均数: average number */
double avg = (a + b + c) / 3;
printf("请输入三个整数,中间以空格分隔数字:");
/*郝斌老师逗号之后加了空格,应该是为了代码
规范性吧!*/
/*这里%d之间就算没有空格,输入时也可以加空格*/
/*这里一定要记住加上取地址符!*/
scanf_s("%d%d%d",&a, &b, &c);
/*【算法1】:若a > b,a与c比较:a > c则输出a;
a < c则输出c否则,b与c比较:b > c则输出b;
b < c则输出c
缺点:如果变量过多,计算量很大*/
/*这种比大小也就是排序问题:a和b比较,
哪个变量值大就放在第1个;
a和c比较,哪个变量值大就放在第1个,假设a最大。
b再和c比较,哪个变量值大就放在第2个,……*/
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("由【算法1】可得:%d %d %d\n", a, b, c);
/*【算法2】:取a、b、c的平均值avg,将a、b、c分别
和avg比较*/
/*未完成*/
if (a < avg && b < avg)
{
}
if (a < avg && c < avg)
{
}
if (b < avg && c < avg)
{
}
return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
--------------------------------
*/
《8》if的常见问题解析——if空语句问题
①格式1:
if(3 >2)
等价于
if(3 > 2)
; //这是一个空语句
/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:if的常见问题解析——if空语句问题
*/
# include <stdio.h>
int main(void)
{
/*if(3 > 2)之后加一个分号“;”,这就是空语句
(分号之前回车空格无所谓)*/
/*if(表达式)中表达式成立可以执行空语句;
表达式不成立就不执行空语句*/
/*有了分号后,if后执行的就只有空语句,
printf(AAAA)和printf(BBBB)都不属于if了,
A和B都是直接输出*/
if (3 > 2)//;
printf("AAAA\n");
printf("BBBB\n");
return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
AAAA
BBBB
--------------------------------
*/
②格式2:
if(表达式1);
A;
else
B;
/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:if的常见问题解析——if空语句问题
*/
# include <stdio.h>
int main(void)
{
/*加上分号有错误:error C2181: 没有匹配
if 的非法 else*/
if (1 > 2)//;
printf("哈哈哈哈哈哈哈哈!\n");
else
printf("嘿嘿!窝窝头,一块钱四个!\n");
return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
嘿嘿!窝窝头,一块钱四个!
--------------------------------
*/
《9》if的常见问题解析——if表达式成立时的输出语句问题
①格式1:
if(表达式1)
A;
else if(表达式2)
B;
else if(表达式3)
C;
else
D;
/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:if的常见问题解析——if表达式成立时的输出语句问题
*/
# 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;
}
/*
在VS_2013中输出结果是:
--------------------------------
AAAA
--------------------------------
if(表达式1)
A;
else if(表达式2)
B;
else if(表达式3)
C;
else
D;
总结:即便表达式1和表达式2都成立,也只会执行A语句
*/
②格式2:
if(表达式1)
A;
else if(表达式2)
B;
else if(表达式3)
C;
这样写不会出错但是逻辑上有漏洞!
100~90优秀
90~80良好
80~60及格
60~0不及格
/*
时间:2020年1月
编辑人:pinkowonote
功能:\
目的:if举例——求分数的等级
*/
# include <stdio.h>
int main(void)
{
float score;
printf("请输入您的考试成绩:");
scanf_s("%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");
return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
请输入您的考试成绩:-9
--------------------------------
总结:没有错误,但屏幕上没有反映,
证明没有else(表达式);这条语句
不会出错但是逻辑上有漏洞!
*/
③格式3:
if(表达式1)
A;
else if(表达式2)
B;
else if(表达式3)
C;
●这样写是不对的,就像在 《6》if举例——求分数的等级 中写的代码一样:else包含了上述表达式之外的所有情况,不需要再在写else后写表达式!
●else要么把(表达式4)去掉,要么在else后加if。既然写了表达式,就要在else后加if
else(表达式4)
D;
④格式4:
if(表达式1)
A;
else if(表达式2)
B;
else if(表达式3)
C;
●等价于
else
(表达式4);
D;
逻辑上不通
else (表达式4);
D;
/*
时间:2020年1月
编辑人:pinkowonote
功能:
目的:if的常见问题解析——if表达式成立时的输出语句问题
*/
# include <stdio.h>
int main(void)
{
if (3 > 2)
printf("AAAA\n");
else if(2 > 5)
printf("BBBB\n");
/*无实际意义,但是语法不会出错,逻辑上是错误的*/
else(5 > 10);
printf("CCCC\n");
/*等价于
else
(5 > 10);
printf("CCCC\n");
逻辑上不通*/
return 0;
}
/*
在VS_2013中输出结果是:
--------------------------------
AAAA
CCCC
--------------------------------
*/
(2)switch
(三)循环执行
1.定义:
2.分类:
(1)for
(2)while
break
Continue