第3章 结构化程序设计12-07

更新时间:2024-06-08 03:20:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

博学谷——让IT教学更简单,让IT学习更有效

第3章 结构化程序设计

学习目标

? 理解算法的概念

? 能够使用流程图画出顺序、选择、循环三种语句的执行流程 ? 要求熟练使用if、switch语句判断各种选择情况以及嵌套使用 ? 熟练运用while、do-while、for三种循环结构的思想解决实际问题 ? 熟练应用break、continue、goto语句与循环语句的搭配使用

前面的章节一直在介绍C语言的基本语法知识,然而仅仅依靠这些语法知识还不能编写出完整的程序。在程序中,通常需要加入业务逻辑,并根据业务逻辑关系对程序的流程进行控制。本章将针对程序设计的灵魂——算法以及C语言中最基本的三种程序流程进行讲解。

3.1 算法——程序设计的灵魂

3.1.1 算法的概念

假如有一张对称的桌子和无限多大小相同的硬币,有两个人轮流往桌子上放硬币,规定硬币不可以重叠,但可以边贴边放置。最后谁放不下谁就输了。假设让你第一个放置,你如何做才能保证自己肯定赢呢?明确了“做什么”,接下来就是寻求解决办法。首先自己赢的话需要在自己没地方放硬币之前,对方就应该没有地方放硬币了,从这分析可以想到,我们的行为和对方的行为应该有一定的联系性。于是可以得到一个解决办法,首先在桌子中央,放置硬币,接下来等对方放置硬币后,只需要在他的对称位置放就可以了,只要他可以放,那么对称位置一定还有空间,直至他没地方放了,我们就赢了。

这是生活中一个运用智慧解决问题的例子,学习编程也是为了解决问题的。那么程序是什么?程序是为完成一项特定任务而用某种语言编写的一组指令序列。一个程序应当包含以下两方面的内容:

(1)对数据的描述:在程序中指定用到哪些数据以及这些数据的类型和数据的组织形式,这就是数据结构(data structure)。

(2)对数据操作的描述:即操作步骤,也就是算法(algorithm)。 著名计算机科学家沃思(Nikiklaus Wirth)提出了一个程序公式:

程序 = 数据结构 + 算法

其中算法是一个程序的灵魂,直到今天,这个公式对于过程化程序来说依然是适用的。

算法有三种种较为常用的表示方法:伪代码法、N-S结构化流程图和流程图法。在以后的学习中,本书较多地用到了流程图这种描述方法。

1

博学谷——让IT教学更简单,让IT学习更有效

3.1.2 流程图

流程图是描述问题处理步骤的一种常用图形工具,它是由一些图框和流程线组成的。使用流程图描述问题的处理步骤形象直观、便于阅读。画流程图时必须按照功能选用相应的流程图符号,常用的流程图符号如图3-1所示。

起止框输入/输出框判断框处理框

流程线连接点

图3-1 流程图符号

图3-1所示的流程图符号中,列举了四个图框、一个流程线和一个连接点,具体说明如下: ? 起止框用于表示流程的开始或结束;

? 输入/输出框用平行四边形表示,在平行四边形内可以写明输入或输出的内容;

? 判断框用菱形表示,它的作用是对条件进行判断,根据条件是否成立来决定如何执行后续

的操作;

? 处理框用矩形表示,它代表程序中的处理功能,如算术运算和赋值等;

? 流程线用实心单向箭头或直线表示,可以连接不同位置的图框,流程线的标准流向是从左

到右和从上到下,可用直线表示,非标准流向的流程线应使用箭头指示方向; ? 连接点用圆形表示,用于流程图的延续。

通过上面的讲解,读者对流程图符号有了简单的认识,接下来先来看一个简单的流程图,如图3-2所示。

2

博学谷——让IT教学更简单,让IT学习更有效

结束结束输入三个不同变量输入三个不同变量x,y,z x,y,z 的值的值YesYes判断判断x>yx>y是否成立是否成立NoNo判断判断y>zy>z是否成立是否成立判断判断x>zx>z是否成立是否成立YesYes最小数最小数是是zzNoNoYesYes最小数最小数是是yy最小数最小数是是zzNoNo最小数是x输出输出结束结束

图3-2 求三个数中的最小值

图3-2表示的是一个求三个数中的最小值的流程图,下面针对该流程图中的执行顺序进行说明,具体如下:

第1步:程序开始;

第2步:进入输入/输出框,输入三个变量值x,y,z;

第3步:进入判断框,判断x>y是否成立,如果是成立,则进入左边的判断框,继续判断y>z

是否成立;否则进入右边的判断框,判断x>z是否成立;

第4步:进入下一层判断框。如果进入的是左边的判断框,判断y>z是否成立,如果成立,则进入左边的处理框,得出最小值是z;如果不成立,则进入右边的处理框,得出最小值为y。 如果进入的是右边的判断框,则判断x>z是否成立,如果成立,则进入左边的处理框, 得出最小值是z;如果不成立,则进入右边的处理框,得出最小值是x。 第5步:进入输出框,输出结果; 第6步:进入结束框,程序运行结束。

学习画流程图可以有效的进行结构化程序设计,基本的流程结构有3种,即顺序结构、选择结构和循环结构。它们可以编写各种复杂程序。在接下来的小节中,将分别讲解这3种基本流程结构,而流程图可以更好的理解和学习这些流程结构语句。

3.2 C语言的基本语句

经过图3-2的流程分析,理清了思路,那么编程就是信手拈来,但是,再简单的程序也得一句一句的写出。如果把写程序和写小说类比,变量常量等可以看成是字和词,函数可以看成是一个段落,运算符等可以看作是字词的组合方式(规则),那么,字词组成的句子就是小说的最小独立单元,表达了一定的意思,同样,程序的最小独立单元也是“语句”,每个语句表达出完整的意义。小说中有感叹句、疑问句等。同样,程序中也有各种各样的语句。C语言的语句类型如图3-3所示。

3

博学谷——让IT教学更简单,让IT学习更有效

图3-3 C语言的语句类型

接下来针对图3-3中的几个语句作简单介绍,具体如下:

? 表达式语句:在各种表达式的后面加上一个分号,就构成了表达式语句;如a = 5;就是一

个赋值表达式语句。

? 空语句:仅有一个分号构成的语句就是空语句。

? 流程控制语句:在程序中完成特定的控制功能的语句就是流程控制语句。其分类如图3-3。 ? 块语句:用一对{}括起来的若干语句称为块语句,也叫作复合语句。

在这些语句中,最重要的是流程控制语句,它是编写程序要掌握的最基本也最重要的语句类型。 接下来的几个小节就陆续学习这几种流程控制语句。

3.3 顺序结构语句

前面章节讲解的程序都有一个共同的特点,即程序中的所有语句都是从上到下逐条执行的,这样的程序结构称为顺序结构。顺序结构是程序开发中最常见的一种结构,它可以包含多种语句,如变量的定义语句、输入输出语句、赋值语句等。顺序结构流程图如图3-4所示。

处理语句1处理语句2处理语句3

图3-4 顺序语句流程图

顺序结构语句中,语句从上至下一句一句的执行,是最简单的一种结构语句。接下来通过 打印“我爱C语言”这句话为例来讲解顺序结构语句,如例3-1所示。

例3-1

1 #include 2 void main() 3 { 4 5 6

printf(\我\\n\printf(\爱\\n\printf(\

4

博学谷——让IT教学更简单,让IT学习更有效

7 8 9 }

printf(\语\\n\printf(\言\\n\

运行结果如图3-5所示。

图3-5 运行结果

在例3-1中,使用了5个printf()语句,从上往下依次输出字符“我、爱、C、语、言”。从运行结果可以看出,程序是按照语句的先后顺序依次执行的,这就是一个顺序结构的程序。

3.4 选择结构语句

在实际生活中做什么事情都不是一帆风顺的,经常需要对一些情况做出判断,比如开车来到一个十字路口,这时需要对红绿灯进行判断,如果前面是红灯,就停车等候,如果是绿灯,就通行。同样,在C语言中也经常需要对一些条件做出判断,从而决定执行哪一段代码,这时就需要使用选择结构语句。选择结构语句又可分为if条件语句和switch条件语句,本节将对它们进行详细地讲解。

3.4.1 if条件语句

if条件语句有三种语法格式,每一种格式都有其自身的特点,我们分别来学习。 1、if语句——单分支结构

if语句是指如果满足某种条件,就进行相应的处理。例如,小明妈妈跟小明说“如果你考试得了100分,星期天就带你去游乐场玩”,这句话可以通过下面的一段伪代码来描述。

如果小明考试得了100分 妈妈星期天带小明去游乐场

在上面的伪代码中,“如果”相当于C语言中的关键字if,“小明考试得了100分”是判断条件,需要用()括起来,“妈妈星期天带小明去游乐场”是执行语句,需要放在{}中。修改后的伪代码如下:

if (小明考试得了100分) {

妈妈星期天带小明去游乐场 }

上面的例子描述了if语句的用法,在C语言中,if语句的具体语法格式如下:

if (判断条件) { }

代码块

上述语法格式中,判断条件的值只能是0或非0,若判断条件的值为0,按“假”处理,若判断

5

博学谷——让IT教学更简单,让IT学习更有效

条件的值为非0,按“真”处理,执行{}中的语句。if语句的执行流程如图3-6所示。

开始 判断条件真执行语句假结束

图3-6 if语句流程图

接下来用if语句来比较两个数的大小,求出较大的值,如例3-2所示。 例3-2

1 #include 2 void main() 3 { 4 5 6 7 8 9 }

int x = 11, y = 22; int max = x; if (x < y)

max = y;

printf(\

运行结果如图3-7所示。

图3-7 运行结果

例3-2定义了两个变量x,y的值,并且定义最大值标识max,将x的值赋给max。然后判断x

2、if…else语句——双分支结构

if…else语句是指如果满足某种条件,就进行相应的处理,否则就进行另一种处理。例如,要判断一个正整数的奇偶,如果该数字能被2整除则是一个偶数,否则该数字就是一个奇数。if…else语句的具体语法格式如下:

if (判断条件) {

执行语句1 } else {

执行语句2

6

……

博学谷——让IT教学更简单,让IT学习更有效

}

……

上述语法格式中,判断条件的值只能是0或非0,若判断条件的值为非0,按“真”处理,if后面{}中的执行语句1会被执行,若判断条件的值为0,按“假”处理,else后面{}中的执行语句2会被执行。if…else语句的执行流程如图3-8所示。

开始判断条件真执行语句 1假执行语句 2结束

图3-8 if…else语句流程图

例3-2实现了两个数值比较大小,那么现在用if…else实现图3-2所描述的流程,三个数比较大小,求出最小值。如例3-3所示。

例3-3

1 #include 2 void main() 3 { 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 }

int x = 10, y = 20, z = 30; if (x > y) { } else { }

if (x > z)

printf(\最小值是%d\\n\else

printf(\最小值是%d\\n\if (y > z)

printf(\最小值是%d\\n\printf(\最小值是%d\\n\else

运行结果如图3-9所示。

7

博学谷——让IT教学更简单,让IT学习更有效

图3-9 运行结果

如图3-9所示,运行结果为10。通过if…else条件判断,求出了三个数中的最小值。 3、if…else if…else语句——多分支结构

if…else if…else语句用于对多个条件进行判断,从而进行多种不同的处理。例如,对一个学生的考试成绩进行等级的划分,如果分数大于等于80分等级为优,如果分数小于80分大于等于70分等级为良,如果分数小于70分大于等于60分等级为中,否则,等级为差。if…else if…else语句的具体语法格式如下:

if (判断条件1) { }

else if (判断条件2) { } ……

else if (判断条件n) { } else { }

执行语句n+1 执行语句n 执行语句2 执行语句1

上述语法格式中,判断条件的值只能是0或非0。若判断条件的值为非0,按“真”处理,if后面{}中的执行语句1会被执行,若判断条件的值为0,按“假”处理,继续执行判断条件2,如果判断条件2的值为非0,则执行语句2,以此类推,如果所有判断条件的值都为0,意味着所有条件都不满足,else后面{}中的执行语句n+1会被执行。if…else if…else语句的执行流程如图3-10所示。

开始真判断条件1假判断条件2假判断条件3真执行语句3真执行语句2执行语句1假??真判断条件n假执行语句n+1执行语句n结束

8

博学谷——让IT教学更简单,让IT学习更有效

图3-10 if…else if…else语句的流程图

接下来用if…else if…else语句对学生考试成绩进行等级划分,如例3-4所示。 例3-4

1 #include 2 void main() 3 { 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 }

int grade = 75; //定义学生成绩 if (grade >= 80) { }

else if (grade >= 70) { }

else if (grade >= 60) { } else { }

//不满足条件 grade >= 60 printf(\该成绩的等级为差\\n\

//不满足条件 grade >= 70 ,但满足条件 grade >= 60 printf(\该成绩的等级为中\\n\

//不满足条件 grade >= 80 ,但满足条件 grade >= 70 printf(\该成绩的等级为良\\n\//满足条件 grade >=80

printf(\该成绩的等级为优\\n\

运行结果如图3-11所示。

图3-11 运行结果

例3-4中,定义了学生成绩grade为75,由于它不满足第一个判断条件grade>=80,会执行第二个判断条件grade>=70,条件成立,因此会打印“该成绩的等级为良”。

3.4.2 if语句的嵌套

在一个if语句中还可以包含一个或多个if语句,这称为if语句的嵌套。其一般形式可表示如下:

if (判断条件1) {

if (判断条件2) {

执行语句1

9

博学谷——让IT教学更简单,让IT学习更有效

} else { }

if (判断条件3) { } else { }

执行语句4 执行语句3 } else { }

执行语句2

或者

if (判断条件1) { }

if (判断条件2) { }

else if (判断条件3) { } else { }

执行语句3 执行语句2 执行语句1

在上述语法格式中,需要注意的是,嵌套内的if语句可能又是if-else类型的,这将会出现多个if和else重叠的情况,为避免歧义,C语言规定,else总是与它前面最近的没有配对的if语句配对。

if语句嵌套的流程图如图3-12所示。

10

博学谷——让IT教学更简单,让IT学习更有效

开始 判断条件1真真假 判断条件2执行语句1假执行语句2真??假??真判断条件n假执行语句n执行语句n+1结束

图3-12 if语句嵌套流程图

为了让初学者更好的理解if语句的嵌套使用,接下来通过一个案例来学习。如例3-5所示。 例3-5

1 void main() 2 { 3 4 5 6 7 8 9 10 11 12 13 14 15 }

int a, b;

printf(\请输入a,b的值\\n\

scanf(\函数从键盘输入数据 if (a != b) { } else

printf(\if (a > b)

printf(\printf(\

else

运行结果如图3-13所示。

图3-13 运行结果

11

博学谷——让IT教学更简单,让IT学习更有效

在例3-5中,实现了从键盘输入两个数,并比较其大小的功能。第6行中,,如果判断条件a!=b

不成立,就执行else下的代码打印a=b;如果a!=b成立,就执行第6行处if下的代码;第8行中,如果判断条件a>b成立,就打印a>b,否则打印a

3.4.3 switch条件语句

switch 条件语句也是一种很常用的选择语句,和if条件语句不同,它只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码。例如,在程序中使用数字1~7来表示星期一到星期天,如果想根据某个输入的数字来输出对应中文格式的星期值,可以通过下面的一段伪代码来描述:

用于表示星期的数字

如果等于1,则输出星期一 如果等于2,则输出星期二 如果等于3,则输出星期三 如果等于4,则输出星期四 如果等于5,则输出星期五 如果等于6,则输出星期六 如果等于7,则输出星期天

如果不是1~7,则输出此数字为非法数字

对于上面一段伪代码的描述,大家可能会立刻想到用刚学过的if…else if…else语句来实现,但是由于判断条件比较多,实现起来代码过长,不便于阅读。这时就可以使用C语言中的switch语句来实现这种需求。在switch语句中,switch关键字后面有一个表达式,case关键字后面有目标值,当表达式的值和某个目标值匹配时,会执行对应case下的语句。接下来通过一段伪代码来描述switch语句的基本语法格式,具体如下:

switch (表达式) { }

case 目标值1:

执行语句1 break;

case 目标值2: ……

case 目标值n:

执行语句n break; 执行语句2 break;

default:

执行语句n+1 break;

在上面的语法格式中,switch语句将表达式的值与每个case中的目标值进行匹配,如果找到了匹配的值,就会执行相应case后的语句,否则执行default后的语句。关于switch语句中的break关键字将在后面的小节中做具体介绍,此处,读者只需要知道break的作用是跳出switch语句即可。

switch语句的流程图如图3-14所示。

12

博学谷——让IT教学更简单,让IT学习更有效

开始值1值2??值n执行语句1执行语句2执行语句n结束

图3-14 switch语句流程图

接下来通过switch语句来实现根据数字输出中文格式的星期,如例3-6所示。 例3-6

1 #include 2 void main() 3 { 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

int week = 5; switch (week) { case 1:

printf(\星期一\break;

case 2:

printf(\星期二\break;

case 3:

printf(\星期三\break;

case 4:

printf(\星期四\break;

case 5:

printf(\星期五\break;

case 6:

printf(\星期六\break;

case 7:

printf(\星期天\break;

default: }

printf(\输入的数字不正确...\break;

13

博学谷——让IT教学更简单,让IT学习更有效

32 }

运行结果如图3-15所示。

图3-15 运行结果

例3-6中,由于变量week的值为5,整个switch语句判断的结果满足第19行的条件,因此打印“星期五”。程序中的default语句用于处理和前面的case都不匹配的情况,将第4行代码替换为int week = 8,再次运行程序,输出结果如图3-16所示。

图3-16 运行结果

在使用switch语句的过程中,如果多个case条件后面的执行语句是一样的,则该执行语句只需书写一次即可,这是一种简写的方式。例如,使用数字1~7来表示星期一到星期天,当输入的数字为1、2、3、4、5时视为工作日,否则视为休息日,这时如果需要判断一周中的某一天是否为工作日,就可以采用switch语句的简写方式,具体如例3-7所示。

例3-7

1 #include 2 void main() 3 { 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

int week = 2; switch (week) { case 1: case 2: case 3: case 4: case 5:

//当 week 满足值 1、2、3、4、5 中任意一个时,处理方式相同 printf(\今天是工作日\\n\break;

case 6: case 7:

//当 week 满足值 6、7 中任意一个时,处理方式相同 printf(\今天是休息日\\n\break;

20 default:

21 printf(\输入数字不正确\ 22 23 24 }

}

break;

运行结果如图3-17所示。

14

博学谷——让IT教学更简单,让IT学习更有效

图3-17 运行结果

例3-7中,当变量week的值为1、2、3、4、5中任意一个值时,处理方式相同,都会打印“今天是工作日”。同理,当变量week值为6、7中任意一个值时,打印“今天是休息日”。

3.4.4 if语句与switch语句的异同

上一小节中例3-6和例3-7是用switch语句实现的,其实也可以用if语句来实现。既然if语句和switch语句都用于选择条件下,那么它们又有什么不同呢,本节就来为大家总结一下。

? switch结构语句只进行相等与否的判断;而if结构语句还可以进行大小范围上的判断。 ? switch无法处理浮点数,只能进行整数的判断,case标签值必须是常量;而if语句则可以

对浮点数进行判断。

如果纯粹是数字或字符的判断,最好是使用switch,因为它只会在一开始的switch括号中取出变量值一次,然后将这个值和下面所设定的case比较,但如果使用if,每次遇到条件式时,都要取出变量值,效率的差异就在这儿。当然并不是if结构语句就没有switch好,在遇到复合条件时,switch就帮不上忙了,由于无法在switch结构语句中组合复杂的条件语句,这时就得使用if了。

在实际程序开发中,具体如何来使用if和switch语句根据实际情况而定,尽量做到物尽其用,不要因为switch语句的效率高就一味的使用,也不要因为if语句常用就不应用switch语句。要根据实际的情况,具体问题具体分析,使用最适合的条件语句。从可读性和程序效率多方面综合考虑,适当搭配两种结构,方能写出高质量的代码。

3.5 循环结构语句

在实际生活中经常会将同一件事情重复做很多次,比如走路会重复使用左右脚,打乒乓球会重复挥拍的动作等。同样在C语言中,也经常需要重复执行同一代码块,这时就需要使用循环语句。循环语句分为while循环语句、do…while循环语句和for循环语句三种。本节将针对这三种循环语句分别进行详细地讲解。

3.5.1 while循环语句

while循环语句和3.3小节讲到的条件判断语句有些相似,都是根据判断条件来决定是否执行大括号内的执行语句。区别在于,while语句会反复地进行条件判断,只要条件成立,{}内的执行语句就会一直执行,直到条件不成立,while循环才会结束。while循环语句的具体语法格式如下:

while (循环条件) { }

执行语句 ………

在上面的语法格式中,{}中的执行语句被称作循环体,循环体是否执行取决于循环条件。当循环条件的值非0时,循环体就会被执行。循环体执行完毕时会继续判断循环条件,直到循环条件的

15

博学谷——让IT教学更简单,让IT学习更有效

开始i <= 9假假j <= i真真printf(“i*j=i*j”);

图3-25 九九乘法表流程图

由于嵌套循环程序比较复杂,下面分步骤进行详细地讲解,具体如下: 第一步,在第4行代码中定义了两个循环变量i和j,其中i为外层循环变量,j为内层循环变量。 第二步,在第5行代码中将i初始化为1,条件i <= 9为真,即一共打印9行。程序将首次进入

外层循环的循环体。

第三步,在第7行代码中将j初始化为1,由于此时i的值为1,条件j <= i为真,程序将首次

进入内层循环的循环体,打印第一行的数值相乘结果:1*1 = 1。

第四步,执行第7行代码中内层循环的操作表达式j++,将j的值自增为2。

第五步,执行第7行代码中的判断条件j<=i,判断结果为假,内层循环结束。执行后面的代码,

打印换行符。

第六步,执行第5行代码中外层循环的操作表达式i++,将i的值自增为2。

第七步,执行第5行代码中的判断条件i<=9,判断结果为真,程序将进入外层循环的循环体,

继续执行内层循环。

第八步,由于i的值为2,内层循环会执行两次,即在第2行打印两列相乘结果:2*1=2 2*2 =4。

在内层循环结束时会打印换行符。

第九步,以此类推,在第3行会打印3列相乘结果,逐行递增,直到i的值为10时,外层循环

的判断条件i <= 9结果为假,外层循环结束,整个程序也就结束了。

除了用for循环来实现乘法表,读者也可以尝试用while和do…while()循环来实现。这里就不再 赘述。

结束3.5.5 跳转语句(break、continue、goto)

跳转语句用于实现循环执行过程中程序流程的跳转,在C语言中,跳转语句有break语句、goto语句和continue语句。接下来分别进行详细地讲解。

1、break语句

在switch条件语句和循环语句中都可以使用break语句。当它出现在switch条件语句中时,作用是终止某个case并跳出switch结构。当它出现在循环语句中,作用是跳出当前循环语句,执行后面的代码。接下来通过一个具体的案例来演示break语句如何跳出当前循环,如例3-12所示。

例3-12

1 #include 2 void main() 3 { 4

int x = 1; //定义变量x,初始值为1

21

博学谷——让IT教学更简单,让IT学习更有效

5 6 7 8 9 10 11 12 13 14 }

while (x <= 4) //循环条件 { }

printf(\条件成立,打印x的值 if (x == 3) { }

x++; //x进行自增

break;

运行结果如图3-26所示。

图3-26 运行结果

例3-12中,通过while循环打印x的值,当x的值为3时使用break语句跳出循环。因此打印结果中并没有出现“x=4”。需要注意的是,break语句不能用于循环语句和switch语句之外的任何其他语句。

2、continue语句

在循环语句中,如果希望立即终止本次循环,并执行下一次循环,此时就需要使用continue语句。求1~100之内的奇数之和就可以使用continue语句来实现,如例3-13所示。

例3-13

1 #include 2 void main() 3 { 4 5 6 7 8 9 10 11 12 13 14 }

int sum = 0; //定义变量sum,用于记住和 for (int i = 1; i <= 100; i++) { }

printf(\

if (i % 2 == 0) //如果i是一个偶数,执行if语句中的代码 { }

sum += i; //实现sum和i的累加

continue; //结束本次循环

运行结果如图3-27所示。

图3-27 运行结果

22

博学谷——让IT教学更简单,让IT学习更有效

例3-13使用for循环让变量i的值在1~100之间循环,在循环过程中,当i的值为偶数时,将执行continue语句结束本次循环,进入下一次循环。当i的值为奇数时,sum和i进行累加,最终得到1~100之间所有奇数的和,打印“sum = 2500”。 注意:break与continue的区别

? break终止当前循环,执行循环体外的第一条语句;而continue是终止本次循环,继续执行

下一次循环。

? break语句可以用于switch语句,而continue不可以。 3、goto语句

当break语句出现在嵌套循环中的内层循环时,它只能跳出内层循环,如果想要跳出外层循环则需要对外层循环添加标记,然后使用goto语句。通过一个案例来演示如何使用goto语句,如例3-14所示。

例3-14

1 #include 2 #include 3 int main() 4 { 5 6 7 8 9 10 11 12 13 14 15 16 17

int i, j; //定义两个循环变量 for (i = 1; i <= 9; i++) //外层循环 { }

for (j = 1; j <= i; j++) //内层循环 { }

printf(\换行

if (i > 4) //判断i的值是否大于4 { }

printf(\输出*

goto end; //跳至标识为end的语句

18 end: system(\让运行结果界面暂停,system()包含在stdlib.h头文件中 19 return 0; 20 }

运行结果如图3-28所示。

图3-28 运行结果

例3-14中,在system()语句前面增加了标记“end”。当i>4时,使用“goto end;”语句跳出外层循环。因此程序只打印了4行“*”。

需要注意的是,结构化程序设计方法主张限制使用goto语句,goto语句可以跳转到指定的任意语句,滥用该语句将使程序流程无规律、可读性差。

23

博学谷——让IT教学更简单,让IT学习更有效

3.6 进阶案例(一)——打印水仙花数

学完了C语言程序设计的流程,接下来通过一个打印水仙花数的案例来加深对C语言流程控制程序的理解。所谓的水仙花数是指一个n位数(n ≥ 3),它的每个位上的数字n次幂之和等于本身。例如,3位数153是水仙花,各位数字的立方和13+53+33=153。

例3-15

1 #include 2 void main() 3 {

4 int num; 5 6 7 8 9 10 11 12 13 14 15 }

int a, b, c;

for (num = 100; num < 1000; num++) { }

a = num % 10; //num的个位数字 b = num / 10 % 10; //num的十位数字 c = num / 100; //num的百位数字

if (num == (a*a*a + b*b*b + c*c*c))

printf(\

运行结果如图3-29所示。

图3-29 运行结果

例3-15中,水仙花数是一个三位数,所以要遍历100-1000之间的数,要求这个三位数的每个数字的立方和,则先要求出其每个位上的数字,第7、8、9行代码分别求出了其个、十、百位上的数字,第11行代码判断三个数字的立方和是否与原来的数相等,相等则打印,不相等则进行下一次循环。

3.7 进阶案例(二)——查找100以内的素数

打印完水仙花后,接下来紧追一步打印出1-100之间的所有素数。所谓素数,是只能被1和它本身整除的数。代码示例如例3-16所示。

例3-16

1 void main() 2 { 3 4

int num = 2; //num从2开始 int i, j = 1;

24

博学谷——让IT教学更简单,让IT学习更有效

5 6 7 8 9 10 11 12 13 14 15 16 17 19 20 21 22 24

}

}

if (count % 5 == 0) //每5个换一行

printf(\

if (num == i) //如果跳出内层循环后,num == i成立,即2-num之间的数都不能整除num {

printf(\则num就是一个素数,就打印出来

while (num < 100) //遍历1-100之间的数 {

for (i = 2; i < num; i++) //用2-num之间的所有数去除num { }

if (num % i == 0) //如果模等于0,也就是能被整除 { }

break; //就跳出这层循环,执行num++

18 count++; //记录素数的个数

23 num++; //num++不要忘记

25 printf(\之间的素数一共有%d个\\n\ 26 27 }

system(\让运行结果界面暂停

运行结果如图3-30所示。

图3-30 运行结果

如图3-41所示,1-100之间一共有25个素数。素数只能被1和它本身整除,则在求素数时,要用num与2-num之间的所有数相除,如果没有能整除num的数,则num就是一个素数。

例3-15与例3-16中结合了循环、选择语句之间的嵌套。关于这几种结构语句的使用,读者要多加练习,熟练掌握。

3.8 本章小结

本章首先讲解了程序的运行流程图,然后讲解了C语言中最基本的三种流程控制语句,包括顺序结构语句、选择结构语句和循环语句。通过本章的学习,读者应该能够熟练的运用if判断语句、switch判断语句、while循环语句、do-while循环语句以及for循环语句。掌握本章的内容就能够编写逻辑比较复杂的C语言程序并且有助于后面章节的学习。

25

博学谷——让IT教学更简单,让IT学习更有效

在学习本章知识的过程中,初学者可能会遇到各种各样的问题,例如“if语句怎么嵌套”、“switch语句和循环语句怎么跳出”、“如何调试程序”等。针对上述问题初学者可以扫描右侧二维码关注问答精灵,让问答精灵帮你解决学习中的困难。

3.9 习题

一、填空题 1、通常情况下使用______语句来跳出当前循环。

2、程序中的语句由上往下依次执行的是______结构语句。

3、for关键字后面()中包括了三部分内容,分别是初始化表达式、______和操作表达式 4、if条件语句分为三种语法格式,分别是______、______和______。 5、假设int x = 2,三元表达式 x>0?x+1:5 的运算结果是______。 二、判断题

1、程序的运行流程图中,处理框用平行四边形来表示。 2、break语句只能用于循环语句中。

3、do…while循环语句中的循环体至少会执行一次。 4、while循环中不能再定义另一个循环。

5、switch条件语句中,default语句可用于处理和前面的case都不匹配的值。 三、选择题

1、以下选项中,哪个不属于switch语句的关键字?

A、break B、case C、for D、default 2、下列语句哪些属于循环语句?(多选)

A、for语句 B、if语句 C、while语句 D、switch语句 3、以下选项中哪些描述是正确的?(多选)

A、循环语句必须要有终止条件否则不能编译

B、break关键字用于跳出当前循环

C、continue用于终止本次循环,执行下一次循环 D、switch条件语句中可以使用break 4、以下程序片段运行结束后,输出结果是?

for (int i = 1; i<7; i++)

26

博学谷——让IT教学更简单,让IT学习更有效

{

if (i % 3 == 0)

break;

{ }

printf(\}

A、123456 B、1245 C、123 D、12 5、请先阅读下面的代码

int x = 1; int y = 2; if (x % 2 == 0) { } else { }

printf(\

y--; y++;

上面一段程序运行结束时,变量y的值为下列哪一项? A、1 B、2 C、3 D、4

四、简答题

1、请说出你知道的跳转语句,并分别说明它们之间的区别。 2、请说明while循环与for循环的异同。 五、编程题

1、请编写程序,实现对奇数和偶数的判断。

提示:

1) 定义一个int类型的变量x,该变量的值为5。

2) 使用if…else语句对x进行判断,如果是奇数就输出“x是奇数”,否则输出“x是偶数”。

2、请编写程序,实现对“1+3+5+7+…+99”的求和功能。

提示:

1)使用循环语句实现自然数1~99的遍历。

2)在遍历过程中,判断当前遍历的数是否为奇数,如果是就累加,否则不加。

27

本文来源:https://www.bwwdw.com/article/kvt6.html

Top