第3章 结构化程序设计12-07
更新时间:2024-06-08 03:20:01 阅读量: 综合文库 文档下载
- 第3章适应几次就好了推荐度:
- 相关推荐
博学谷——让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
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
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 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 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 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 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 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 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 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 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
正在阅读:
第3章 结构化程序设计12-0706-08
新年许愿02-19
第六章题目及解答04-29
银行卡模拟题07-06
广告人培训资料06-22
浅谈体育课中的安全问题及预防05-10
关于党训班的心得体会范本08-16
来源 - 保险网络 - 保险代理人考试重点内容整理07-05
电机功率因数检测方法05-12
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 结构化
- 程序设计
- 12
- 07
- 新北师大版五年级数学下册第二单元测试题
- ZR-IPJL-2016-05-01 岗位职责说明书(5财务-会计)
- 五年级下册 地方课教案 人与自我 第三课 众心齐泰山移
- 键盘的操作教案
- 助理营销师历年考题及答案
- 海量阅读计划
- 技术标砖混2
- 水利部司局函保监22号文关于开发建设项目水保咨询服务费计
- 饮茶与读书 - 图文
- 河南大学毕业论文 - 企业人事管理系统的设计与实现
- 骆驼祥子练习题及答案
- 大工18秋《电子商务(管理类)》在线作业2
- 八年级下册课后习题 - 图文
- 工伤与人身损害赔偿并存的双重赔偿的法律依据
- 016-客房日常清洁程序
- 基于PLC智能照明控制系统设计 - 图文
- 二数下第1-3单元测试题
- 4章账户与复式记账法 答案
- 破土迁坟移坟安葬礼仪破土礼仪咒语
- Coreldraw认证考试试题