# 流程控制基本概念
##1.什么是程序结构
- 结构化程序设计(structuredprogramming)是进行以模块功能和处理过程设计为主的详细设计的基本原则。
- 其概念最早由E.W.Dijikstra在1965年提出的,是软件发展的一个重要的里程碑。它的主要观点是采用自顶向下、逐步求精及模块化的程序设计方法;使用三种基本控制结构构造程序,任何程序都可由顺序、选择、循环三种基本控制结构构造。结构化程序设计主要强调的是程序的易读性。
+[点我了解更多](http://baike.baidu.com/link?url=Btsz1Mb-YAYHjAB3EgCauPRoPRmZtDjTdmPSR0eDwJGwlKm7TASMRqgRBfYeXGwuPlDsT9y-t_G7L2_DtiHdca)
##2.程序结构分类
- 默认情况下,程序的运行流程是这样的:运行程序后,系统会按书写从上至下顺序执行程序中的每一行代码, 但是这并不能满足我们所有的开发需求
- 为了方便我们控制程序的运行流程,C语言提供3种流程结构,不同的流程结构可以实现不同的运行流程。这3种流程结构分别是顺序、选择、循环三种基本控制结构构造.
+顺序结构:默认的流程结构。按照书写顺序从上至下执行每一条语句。
+ (http://7xj0kx.com1.z0.glb.clouddn.com/Snip20150514_1.png)
+ (http://7xj0kx.com1.z0.glb.clouddn.com/911.png)
+选择结构:对给定的条件进行判断,再根据判断结果来决定执行哪一段代码。
+![](http://7xj0kx.com1.z0.glb.clouddn.com/Snip20150514_2.png)
+![](http://7xj0kx.com1.z0.glb.clouddn.com/933.png)
+ 循环结构:在给定条件成立的情况下,反复执行某一段代码。
# switch-case语句穿透问题
##1.case的穿透问题
- switch里面的case只要匹配一次其它的都失效,包括default. 正是因为switch的这个特性, 所以可能导致程序出现逻辑错误
- 为了避免上述情况,C语言还提供了一种break语句,专用于跳出switch语句,break语句只有关键字break,没有参数。
+在每一个case语句之后增加 break 语句, 使每一次执行之后均可跳出switch语句,从而避免输出不应有的结果
+有时候也可用巧妙的利用case的穿透问题来简化代码
- 示例
int num;
printf("输入一个1-7之间的数: ");
scanf("%d",&num);
switch (num){
case 1:
printf("玉米炒葡萄\n");
// break;
case 2:
printf("月饼炒辣椒\n");
// break;
case 3:
printf("爆炒妙脆角\n");
// break;
case 4:
printf("番茄炒卤蛋\n");
// break;
case 5:
printf("南瓜炒猪肝\n");
// break;
case 6:
printf("苹果炒西瓜\n");
// break;
case 7:
printf("天地无极\n");
// break;
default:
printf("error\n");
// break;
}
输入1之后的输出结果:
玉米炒葡萄
月饼炒辣椒
爆炒妙脆角
番茄炒卤蛋
南瓜炒猪肝
苹果炒西瓜
天地无极
error
# switch-使用注意事项
##1.switch条件类型
- 表达式的类型(case语句后的值)必须是整型或可以转变为整型的值 (byte、short、char和int类型)。
switch (10.10){ // 报错
case 1:
printf("玉米炒葡萄\n");
break;
default:
printf("error\n");
break;
}
##2.case值的规定
- case的值必须是是整型或可以转变为整型的值
switch (10){
case 1:
printf("玉米炒葡萄\n");
break;
case 'a': // 字符可以转换为整型
printf("玉米炒葡萄\n");
break;
case 10.8: // 报错
printf("玉米炒葡萄\n");
break;
default:
printf("error\n");
break;
}
- case的值1、值2...值n只能为常数或常量,不能为变量。
intnum = 5;
switch (10){
case num: // 变量报错
printf("玉米炒葡萄\n");
break;
default:
printf("error\n");
break;
}
- 如果在case后面定义的变量必须加上大括号
switch (10){
case num:{
int num = 5;
printf("num = %d", num);
break;
}
default:
printf("error\n");
break;
}
- switch中case后面的表达式的值不能相同
switch (10){
case 1:
printf("玉米炒葡萄\n");
break;
case 1: // 和上面相同报错
printf("玉米炒葡萄\n");
break;
default:
printf("error\n");
break;
}
- case语句可以有任意多句,可以不用加括号“{}”
switch (10){
case 1:
printf("玉米炒葡萄1\n");
printf("玉米炒葡萄2\n");
break;
default:
printf("error\n");
break;
}
`##3.default的位置问题
- default可以省略
switch (10){
case 1:
printf("玉米炒葡萄1\n");
break;
}
- default语句可以写在switch语句中的任意位置
switch (10){
default:
printf("error\n");
break;
case 1:
printf("玉米炒葡萄1\n");
break;
}
+ 执行流程:在执行的过程中,如果遇到break语句,则跳出switch语句。如果没有遇到break语句,则一直执行到switch语句的结束。
# if语句和switch语句转换
##1.if语句和switch语句转换
- 利用if实现
要求用户输入一个分数,根据输入的分数输出对应的等级
A 90~100 99/10 = 9 90/10= 9 98/10 = 9 100/10 = 10
B 80~89 89/10 = 8
C 70~79
D 60~69
E 0~59
// 1.提示用户输入学生的分数
printf("请输入一个0~100的分数\n");
// 2.定义变量保存用户输入的分数
int score = -1;
// 3.接收用户输入的分数
scanf("%d", &score);
// 4.判断用户输入的分数输出对应的等级
if (score >= 90 && score <= 100) {
printf("A\n");
}else if (score >= 80 && score <= 89)
{
printf("B\n");
}else if (score >= 70 && score <= 79)
{
printf("C\n");
}else if (score >= 60 && score <= 69)
{
printf("D\n");
}else if (score >= 0 && score <= 59)
{
printf("E\n");
}else{
printf("输入错误!\n");
}
- 利用switch实现
switch (score/10) {
case 10:
case 9:
printf("A\n");
break;
case 8:
printf("B\n");
break;
case 7:
printf("D\n");
break;
case 6:
printf("C\n");
break;
default:
printf("E\n");
break;
}
##2.if语句和switch语句选择
- 分支比较多且无法穷尽或进行大量列举时最好用if
- 如果分支数量不是很多,但是使用if代码代码量比较大的时候,可以选用switch
- 判断用户输入的数是否大于100:
+if实现
int a = -1;
scanf("%d", &a);
if (a > 100) {
printf("大于\n");
}
+ switch实现
//不好实现,但也可以实现
#include <stdio.h>
int main(int argc, constchar * argv[]) {
int a ;
printf("请输入一个数字:\n");
scanf("%d",&a);
switch (a/10) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
printf("小于100\n");
break;
default:
printf("大于100\n");
break;
}
return 0;
}
# zz循环基本概念
##1.循环结构概述
- 循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段, 直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。
- 循环结构简单来说就是:循环是一次又一次的执行相同的代码块
- 显示生活中的循环
- C语言提供了多种循环语句,可以组成各种不同形式的循环结构:
+ goto语句和if语句构成循环;
+ while语句;
+ do-while语句;
+ for语句;
##构成循环结构的几个条件
- 一般来说一个循环需要以下几部分构成:
+ 循环控制条件
* 循环退出的主要依据,来控制循环到底什么时候退出
+ 循环体
* 循环的过程中重复执行的代码段
+ 能够让循环结束的语句(递增、递减、真、假等)
* 能够让循环条件为假的依据,否则退出循环
# while循环注意点
##1.while循环的陷阱
- 任何数值都有真假性
while (1) {//死循环
printf("123\n");
}
printf("123\n"); // 永远执行不到
- 当一个变量与一个常量进行==或 != 的时候,通常把常量写在前面
int num = 3;
while (3 == num) {
printf("num = %d\n",num);
num++;
}
- while 后如果只有一条语句它可以省略大括号
+ 空语句它也是一条语句
+ while小括号后面不可以直接写分号
// while省略大括号的时候条件满足就会执行while后面的第一条语句
while (0)
printf("123\n");
printf("456\n");
- 作用域问题
while (1) {
int a = 10;
}
printf("a = %d\n", a); // 访问不到
while (0)
int a = 10; // 作用域混乱
printf("a = %d\n", a);//出错
- 分号问题
while (1);//空语句
{
printf("123\n");
}
- 最简单的死循环
while (1);
# while练习
##1.提示用户输入一个正整数n, 计算1 + 2 + 3 + ...n的和
分析: 每次都是用上一次的和 加上一个递增的数
1 +2 + 3 + 4 + 5
( 0 + 1)1 + 2
(1 + 2)3 + 3
(1 + 2 + 3) 6 + 4
(1 + 2 + 3 + 4) 10 + 5
// 1.定义变量保存上一次的和
int sum = 0;
// 2.定义变量保存递增的数
int number = 0;
while (number <= 5) {
printf("sum = %d + number =%d\n", sum, number);
sum = sum + number;
number++;
}
printf("sum = %d\n", sum);
实现步骤:
// 1.提示用户输入一个正整数
// 2.定义变量保存用户输入的正整数
// 3.接收用户输入的正整数
// 4.判断用户输入是否合法
// 5.计算结果
// 5.1.定义变量保存上一次的结果
// 5.2.定义变量保存递增的数
// 5.3.利用循环重复执行求和加上递增数
// 6.输出最后的结果
- 累加思想
+ 原理:通过循环的形式进行累加操作,定义变量记录每次变化后的结果
##2.获取1~100之间 7的倍数的个数并打印,并统计个数
分析:
要获取1~100之间7的倍数,应该取出1~100之间的每一个值进行判断,满足就输出并统计
实现:
int count = 1;
int nubmer = 0;
while (count <= 100) {
if (count % 7 == 0) {
printf("count = %d\n",count);
nubmer++;//计数器
}
count++;
}
printf("number = %d\n", nubmer);
- 计数器:
+ 原理:通过循环的形式进行计数操作,通过变量记录每次变化的值
+ 应用场景:当以后要求在什么什么中里面有多少个什么的时候,立刻想到计数器思想
# for循环基本概念
##1.for循环语法格式
- C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。
for(初始化表达式;循环条件表达式;循环后的操作表达式)
{
执行语句;
}
##2.for循环执行流程
- for循环开始时,会先执行初始化表达式,而且在整个循环过程中只执行一次初始化表达式
- 接着判断循环条件表达式,如果条件成立,就会执行循环体中的语句(“循环体”就是for后面大括号{}中的内容)
- 循环体执行完毕后,接下来会执行循环后的操作表达式,然后再次判断条件,重复上述过程,直到条件不成立就结束for循环
# for循环的其他形式
##1.for循环的其他形式
- 表达式省略(三个表达式都可以省略)
+ 如:for(; ;) 语句相当于while(1)语句,即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止地执行循环体。
- 循环控制无关的任意表达式
+ 表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。
for(sum=0,i=1;i<=100;i++)sum=sum+i;
或
for(i=0,j=100;i<=j;i++,j--)k=i+j;
// 表达式1和表达式3都是逗号表达式,各包含两个赋值表达式,即同时设两个初值,使两个变量增值.
在逗号表达式内按从左至右顺序求解,整个逗号表达 式的值为其中最右边的表达式的值
for(i=1;i<=100;i++,i++)sum=sum+i;
相当于
for(i=1;i<=100;i=i+2)sum=sum+i;
##2.for循环的其他形式
- 什么情况下用for
+ 当变量只是用来控制循环的次数的时候用for更节约内存
int i = 0;
while (i < 3) {
printf("i = %d\n", i);
i++;
}
printf("循环结束后 i = %d\n",i);
- 什么情况下用while
+ 当变量在循环结束后还需要使用,就用while
for (int j = 0; j < 3; j++) {
printf("j = %d\n", j);
}
printf("循环结束后 j = %d\n",j);// 不能访问j
- 一般情况下while和for可以互换, 但是如果循环执行完毕之后就不需要使用用于控制循环的增量, 那么用for更好
# break关键字
##1.break关键字
- 使用场合:
+ switch
+ 循环结构
- 注意:
+ **break离开应用范围,存在是没有意义的。**
if(1)
{
break; // 没有意义
}
+ **在多层循环中,一个break语句只向外跳一层**
while(1)
{
while(2)
{
break;// 只对while2有效, 不会影响while1
}
}
>+ 在1990年,AT&T(美国电话电报公司)的电话系统的很长一段瘫痪了,造成60,000人,不能打电话也不能接电话,原因是什么呢?一个使用C语言的程序员,试图使用break来跳出if语句,但是break不是跳出if语句而是跳出整个循环;解决这个bug,让7千万次通话收到干扰,花费超过9个小时。
+ break下面不可以有语句,因为执行不到。
while(2)
{
break;
printf("打我啊!");// 执行不到
}
# continue关键字
##1.continue关键字
- continue语句的作用是跳过循环体中剩余的语句而继续下一次
- 使用场合:
+ 循环结构
- 练习: 把100~200之间的不能被3整除的数输出
for(int i = 100;i<= 200; i++)
{
if(i %3 == 0) continue;
printf("i = %d", i);
}
# dowhile循环基本概念
##1.do-while循环语法格式
do {
语句1;
语句2;
....
}while ( 条件 );
##2.do-while循环执行流程
- do-while语句语义:
+当执行到do-while循环时,首先会执行一遍循环体中的语句(“循环体”就是do后面大括号{}中的内容)。接着判断while中的条件,如果条件成立,就执行循环体中的语句。然后再次判断条件,重复上述过程,直到条件不成立就结束while循环
- while循环特点:
+**do-while循环的特点:不管while中的条件是否成立,循环体中的语句至少会被执行一遍**
- 使用场景
+ 口令校验
# do-while和while对比
##1.do-while和while对比
- while, 先判断再执行
int x = 0;
while (x < 0) {
x++;
}
printf("x = %d\n", x);
输出结果:x = 0
- do-while, 先执行再执行
int y = 0;
do {
y++;
} while (y < 0);
printf("y = %d\n", y);
输出结果:x = 1