第3章流程控制C语言教程零基础到大神Word文档下载推荐.docx
《第3章流程控制C语言教程零基础到大神Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《第3章流程控制C语言教程零基础到大神Word文档下载推荐.docx(32页珍藏版)》请在冰点文库上搜索。
C\n"
7printf("
语\n"
8printf("
言\n"
9return0;
10}
运行结果如图3-3所示。
图3-3运行结果
在例3-1的程序中,使用了5个printf()语句,从上往下依次输出“我、爱、C、语、言”。
从运行结果可以看出,程序是按照语句的先后顺序执行的。
因此,可以说明该程序是一个顺序结构的程序。
选择结构语句
在实际生活中经常需要作出一些判断,比如开车来到一个十字路口,这时需要对红绿灯进行判断,如果前面是红灯,就停车等候,如果是绿灯,就通行。
同样,在C语言中也经常需要对一些条件做出判断,从而决定执行哪一段代码,这时就需要使用选择语句。
选择结构语句分为if条件语句和switch条件语句,接下来本小节将对它们进行详细地讲解。
3.1.1if条件语句
if条件语句分为三种语法格式,每一种格式都有其自身的特点,下面分别进行讲解。
1、if语句
if语句是指如果满足某种条件,就进行相应的处理。
例如,小明妈妈跟小明说“如果你考试得了100分,星期天就带你去游乐场玩”。
这句话可以通过下面的一段伪代码来描述。
如果小明考试得了100分
妈妈星期天带小明去游乐场
在上面的伪代码中,“如果”相当于C语言中的关键字if,“小明考试得了100分”是判断条件,需要用()括起来,“妈妈星期天带小明去游乐场”是执行语句,需要放在{}中。
修改后的伪代码如下:
if(小明考试得了100分)
{
}
上面的例子就描述了if语句的用法,在C语言中,if语句的具体语法格式如下:
if(条件语句)
{
代码块
上述语法格式中,判断条件是一个布尔值,当判断条件为true时,{}中的执行语句才会被执行。
if语句的执行流程如图3-4所示。
图3-4if语句流程图
接下来通过一个案例来学习if语句的具体用法,如例3-2所示。
例3-2
11#include<
12intmain()
13{
14//声明变量x
15intx=5;
16//如果x的值小于10则执行if大括号中的代码
17if(x<
10)
18{
19x++;
20}
21printf("
x=%d\n"
x);
22return0;
23}
运行结果如图3-5所示。
图3-5运行结果
例3-2中,定义了一个变量x,其初始值为5。
在if语句的判断条件中判断x的值是否小于10,很明显条件成立,因此{}中的语句会被执行,变量x的值将进行自增。
从图3-5的运行结果可以看出,x的值已由原来的5变成了6。
2、if…else语句
if…else语句是指如果满足某种条件,就进行相应的处理,否则就进行另一种处理。
例如,要判断一个正整数的奇偶,如果该数字能被2整除则是一个偶数,否则该数字就是一个奇数。
if…else语句的具体语法格式如下:
if(判断条件)
执行语句1
……
else
执行语句2
上述语法格式中,判断条件是一个布尔值。
当判断条件为true时,if后面{}中的执行语句1会被执行。
当判断条件为false时,else后面{}中的执行语句2会被执行。
if…else语句的执行流程如图3-6所示。
图3-6if…else语句流程图
接下来通过一个实现奇偶数判断的案例来演示if..else语句的具体用法,如例3-3所示。
例3-3
24#include<
25intmain()
26{
27intnum=19;
28if(num%2==0)
29{
30//判断条件成立,num被2整除
31printf("
num是一个偶数\n"
32}
33else
34{
35printf("
num是一个奇数\n"
36}
37return0;
38}
运行结果如图3-7所示。
图3-7运行结果
例3-3中,变量num的值为19,模以2的结果为1,不等于0,判断条件不成立。
因此会执行else后面{}中的语句,打印“num是一个奇数”。
3、if…elseif…else语句
if…elseif…else语句用于对多个条件进行判断,从而进行多种不同的处理。
例如,对一个学生的考试成绩进行等级的划分,如果分数大于等于80分等级为优,如果分数小于80分大于等于70分等级为良,如果分数小于70分大于等于60分等级为中,否则,等级为差。
if…elseif…else语句的具体语法格式如下:
if(判断条件1)
执行语句1
elseif(判断条件2)
执行语句2
……
elseif(判断条件n)
执行语句n
}
else
执行语句n+1
当判断条件1为true时,if后面{}中的执行语句1会执行。
当判断条件1为false时,会继续执行判断条件2,如果为true则执行语句2,以此类推,如果所有的判断条件都为false,则意味着所有条件均未满足,else后面{}中的执行语句n+1会被执行。
if…elseif…else语句的执行流程如图3-8所示。
图3-8if…elseif…else语句的流程图
接下来通过一个对学生考试成绩进行等级划分的案例来演示if…elseif…else语句的用法,如例3-4所示。
例3-4
39#include<
40intmain()
41{
42intgrade=75;
//定义学生成绩
43if(grade>
=80)
44{
45//满足条件grade>
=80
46printf("
该成绩的等级为优\n"
47}
48elseif(grade>
=70)
49{
50//不满足条件grade>
=80,但满足条件grade>
=70
51printf("
该成绩的等级为良\n"
52}
53elseif(grade>
=60)
54{
55//不满足条件grade>
=70,但满足条件grade>
=60
56printf("
该成绩的等级为中\n"
57}
58else
59{
60//不满足条件grade>
61printf("
该成绩的等级为差\n"
62}
63return0;
64}
运行结果如图3-9所示。
图3-9运行结果
例3-4中,定义了学生成绩grade为75。
它不满足第一个判断条件grade>
=80,会执行第二个判断条件grade>
=70,条件成立,因此会打印“该成绩的等级为良”。
多学一招:
三元运算符
在C语言中有一种特殊的运算叫做三元运算,它和if…else语句类似,具体语法格式如下:
判断条件?
表达式1:
表达式2
三元运算通常用于对某个变量进行赋值,当判断条件成立时,运算结果为表达式1的值,否则结果为表达式2的值。
例如求两个数x、y中的较大者,如果用if…else语句来实现,具体代码如下:
intx=0;
inty=1;
intmax;
if(x>
y)
max=x;
}else
max=y;
上面的代码运行之后,变量max的值为1。
如果if…else语句用三元运算来替换,具体代码如下:
max=x>
y?
x:
y;
3.1.2switch条件语句
switch条件语句也是一种很常用的选择语句,和if条件语句不同,它只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码。
例如,在程序中使用数字1~7来表示星期一到星期天,如果想根据某个输入的数字来输出对应中文格式的星期值,可以通过下面的一段伪代码来描述:
用于表示星期的数字
如果等于1,则输出星期一
如果等于2,则输出星期二
如果等于3,则输出星期三
如果等于4,则输出星期四
如果等于5,则输出星期五
如果等于6,则输出星期六
如果等于7,则输出星期天
如果不是1~7,则输出此数字为非法数字
对于上面一段伪代码的描述,大家可能会立刻想到用刚学过的if…elseif…else语句来实现,但是由于判断条件比较多,实现起来代码过长,不便于阅读。
这时就可以使用C语言中的switch语句来实现这种需求。
在switch语句中switch关键字后面有一个表达式,case关键字后面有目标值,当表达式的值和某个目标值匹配时,会执行对应case下的语句。
接下来通过一段伪代码来描述switch语句的基本语法格式,具体如下:
switch(表达式)
case目标值1:
break;
case目标值2:
case目标值n:
default:
在上面的语法格式中,switch语句将表达式的值与每个case中的目标值进行匹配,如果找到了匹配的值,就会执行相应case后的语句,否则执行default后的语句。
关于switch语句中的break关键字将在后面的小节中做具体介绍,此处,初学者只需要知道break的作用是跳出switch语句即可。
接下来通过一个案例来实现根据数字输出中文格式的星期的功能,如例3-5所示。
例3-5
65#include<
66intmain()
67{
68intweek=5;
69switch(week)
70{
71case1:
72printf("
星期一"
73break;
74case2:
75printf("
星期二"
76break;
77case3:
78printf("
星期三"
79break;
80case4:
81printf("
星期四"
82break;
83case5:
84printf("
星期五"
85break;
86case6:
87printf("
星期六"
88break;
89case7:
90printf("
星期天"
91break;
92default:
93printf("
输入的数字不正确..."
94break;
95}
96return0;
97}
运行结果如图3-10所示。
图3-10运行结果
例3-5中,由于变量week的值为5,整个switch语句判断的结果满足第19行的条件,因此打印“星期五”。
程序中的default语句用于处理和前面的case都不匹配的情况,将第5行代码替换为intweek=8,再次运行程序,输出结果如图3-11所示。
图3-11运行结果
在使用switch语句的过程中,如果多个case条件后面的执行语句是一样的,则该执行语句只需书写一次即可,这是一种简写的方式。
例如,使用数字1~7来表示星期一到星期天,当输入的数字为1、2、3、4、5时视为工作日,否则视为休息日,这时如果需要判断一周中的某一天是否为工作日,就可以采用switch语句的简写方式,具体如例3-6所示。
例3-6
98#include<
99intmain()
100{
101intweek=2;
102switch(week)
103{
104case1:
105case2:
106case3:
107case4:
108case5:
109//当week满足值1、2、3、4、5中任意一个时,处理方式相同
110printf("
今天是工作日\n"
111break;
112case6:
113case7:
114//当week满足值6、7中任意一个时,处理方式相同
115printf("
今天是休息日\n"
116break;
117}
118return0;
119}
运行结果如图3-12所示。
图3-12运行结果
例3-6中,当变量week的值为1、2、3、4、5中任意一个值时,处理方式相同,都会打印“今天是工作日”。
同理,当变量week值为6、7中任意一个值时,打印“今天是休息日”。
循环结构语句
在实际生活中经常会将同一件事情重复做很多次,比如在走路时,会重复使用左右脚,打乒乓球时,会重复挥拍的动作等。
同样在C语言中,也经常需要重复执行同一代码块,这时就需要使用循环语句。
循环语句分为while循环语句、do…while循环语句和for循环语句三种。
接下来,本小节将针对这三种循环语句分别进行详细地讲解。
3.1.3while循环语句
while循环语句和3.3小节讲到的条件判断语句有些相似,都是根据条件判断来决定是否执行大括号内的执行语句。
区别在于,while语句会反复地进行条件判断,只要条件成立,{}内的执行语句就会一直执行,直到条件不成立,while循环结束。
while循环语句的具体语法格式如下:
while(循环条件)
执行语句
………
在上面的语法格式中,{}中的执行语句被称作循环体,循环体是否执行取决于循环条件。
当循环条件为true时,循环体就会被执行。
循环体执行完毕时会继续判断循环条件,如条件仍为true则会继续执行,直到循环条件为false时,整个循环过程才会结束。
while循环的执行流程如图3-13所示。
图3-13while循环的流程图
接下来通过while语句来实现1~4之间自然数的打印,如例3-7所示。
例3-7
120#include<
121intmain()
122{
123intx=1;
//定义变量x,初始值为1
124while(x<
=4)//循环条件
125{
126printf("
x=%d\n"
x);
//条件成立,打印x的值
127x++;
//x进行自增
128}
129return0;
130}
运行结果如图3-14所示。
图3-14while循环
例3-7中,x的初始值为1,在满足循环条件x<
=4的情况下,循环体会重复执行,打印x的值并让x进行自增。
因此打印结果中x的值分别为1、2、3、4。
值得注意的是,例3-7中的第8行代码用于在每次循环时改变变量x的值,直到循环条件不成立,如果没有这行代码,整个循环会进入无限循环的状态,永远不会结束。
3.1.4do-while循环语句
do…while循环语句和while循环语句功能类似,二者的不同之处在于,while语句需要先判断循环条件,然后根据判断结果来决定是否执行大括号中的代码,而do…while循环语句先要执行一次大括号内的代码再判断循环条件,其具体语法格式如下:
do
执行语句
}while(循环条件);
在上面的语法格式中,关键字do后面{}中的执行语句是循环体。
do…while循环语句将循环条件放在了循环体的后面。
这也就意味着,循环体会无条件执行一次,然后再根据循环条件来决定是否继续执行。
do…while循环的执行流程如图3-15所示。
图3-15do…while循环的执行流程
接下来使用do…while循环语句将例3-7进行改写,如例3-8所示。
例3-8
131#include<
132intmain()
133{
134intx=1;
135do
136{
137printf("
138x++;
139}while(x<
=4);
//循环条件
140return0;
141}
运行结果如图3-16所示。
图3-16dowhile实例
例3-8和例3-7的运行结果一致,这说明do…while循环和while循环能实现同样的功能。
然而在程序运行过程中,这两种语句还是有差别的。
如果循环条件在循环语句开始时就不成立,那么while循环的循环体一次都不会执行,而do…while循环的循环体还是会执行一次。
若将例中的循环条件x<
=4改为x<
1,例3-8会打印x=1,而例3-7什么也不会打印。
3.1.5for循环语句
在前面的小节中分别讲解了while循环和do…while循环。
在程序开发中,还经常会使用另一种循环语句,即for循环,它通常用于循环次数已知的情况,其具体语法格式如下:
for(初始化表达式;
循环条件;
操作表达式)
执行语句
………
在上面的语法格式中,for关键字后面()中包括了初始化表达式、循环条件和操作表达式三部分内容,它们之间用“;
”分隔,{}中的执行语句为循环体。
接下来分别用“①”表示初始化表达式、“②”表示循环条件、“③”表示操作表达式、“④”表示循环体,通过序号来具体分析for循环的执行流程。
具体如下:
for(①;
②;
③)
④
第一步,执行①
第二步,执行②,如果判断结果为true,执行第三步,如果判断结果为false,执行第五步
第三步,执行④
第四步,执行③,然后继续执行第二步
第五步,退出循环
接下来通过一个案例对自然数1~4进行求和,如例3-9所示。
例3-9
142#include<
143intmain()
144{
145intsum=0;
//定义变量sum,用于记住累加的和
146for(inti=1;
i<
=4;
i++)//i的值会在1~4之间变化
147{
148sum+=i;
//实现sum与i的累加
149}
150printf("
sum=%d\n"
sum);
//打印累加的和
151return0;
152}
运行结果如图3-17所示。
图3-17运行结果
例3-9中,变量i的初始值为1,在判断条件i<
=4为true的情况下,会执行循环体sum+=i,执行完毕后,会执行操作表达式i++,i的值变为2,然后继续进行条件判断,开始下一次循环,直到i=5时,条件i<
=4为false,结束循环,执行for循环后面的代码,打印“sum=10”。
为了让初学者能熟悉整个for循环的执行过程,现将例3-9运行期间每次循环中变量sum和i的值通过表3-1罗列出来。
表3-1sum和i循环中的值
循环次数
sum
i
第一次
1
第二次
3
2
第三次
6
第四次
10
4
3.1.6循环嵌套
有时为了解决一个较为复杂的问题,需要在一个循环中再定义一个循环,这样的方式被称作循环嵌套。
在C语言中,while、do…while、for循环语句都可以进行嵌套,并且它们之间也可以互相嵌套,这当中最常见的就是在for循环中嵌套for循环,具体语法格式如下:
操作表达式)
for(初始化表达式;
执行语句;
………
}
接下来通过for语句的循环嵌套来实现使用“*”打印直角三角形,如例3-10所示。
例3-10
153#include<
154intmain()
155{
156inti,j;
//定义两个循环变量
157for(i=1;
=9;
i++)//外层循环
158