3程序控制结构.doc
《3程序控制结构.doc》由会员分享,可在线阅读,更多相关《3程序控制结构.doc(32页珍藏版)》请在沃文网上搜索。
1、第三章 程序控制结构第三章 程序控制结构通过第二章的学习,我们已经可以设计简单的C+程序了。之所以说它简单,是因为所举的例程都是按照语句书写的顺序依次执行的。而实际的程序并不都是按我们的设想顺序执行。比如学生成绩管理系统,有时需要根据学生的成绩来决定下一步是否给予奖励,有时又需要用同一种方案重复统计每个学生的总分。从软件设计的角度说,程序的运行过程存在可选性和重复性。这种语句执行的秩序规则称之为程序控制结构。C+作为一种面向对象的高级程序设计语言,同样支持结构化的程序设计,它提供了顺序结构、选择结构和循环结构等三种基本的程序控制结构。从本章开始,我们将通过学习这三种控制结构,逐步进入软件设计的
2、核心算法设计。3.1顺序结构所谓顺序结构,就是按照语句出现的先后顺序依次执行各条语句。在+中,顺序结构主要是由数据输入和输出语句、表达式语句、空语句、复合语句等语句构成。图3.1给出了一个顺序结构的执行流程,整个程序只有一个入口和一个出口。程序执行时,依次执行语句1和语句2。图3.1 顺序结构执行流程图例3.1 在学生管理系统的系统菜单中,包括输入学生成绩、修改学生成绩、删除学生成绩、计算每个学生的总分、计算每个学生的平均分、按学号或姓名查询学生成绩、按班级查询学生成绩、成绩排序、按班级统计学科总分和按班级统计平均分等子菜单,这里只是列出该系统的部分菜单。思路分析:输出菜单就是输出若干选项,供
3、用户选择。因此,可以采用顺序结构,依次输出各个选项(带有编号),具体各个选项的功能实现在以后章节逐步讲解。编写程序如下:#includevoid main()cout 学生管理系统endl;coutendl;cout =endl;coutendl;cout 1.输入学生成绩endl; cout 2.修改学生成绩endl;cout 3.删除学生成绩endl;cout 4.计算每位学生的总分endl;cout 5.计算每位学生的平均分endl;cout 6.按学号或姓名查询学生成绩endl;cout 7.按班级查询学生成绩endl;cout 8.成绩排序endl;cout 9.按班级统计学科总分,
4、平均分等endl;coutendl;程序执行时,依次输出各个菜单项,程序执行后,运行结果如图3.2所示。图3.2 例3.1的运行结果例3.2 输入两个学生的成绩cj1和cj2,交换后输出。思路分析:变量的交换不能直接互相赋值,这样会导致其中一个变量值丢失。实现二个的变量交换有二种方法。方法一:借助第三变量t实现交换。交换过程如图3.3所示。图 3.3 借助中间变量的交换示意图具体程序代码如下:#include iostream.hvoid main()int cj1,cj2,t;cout输入第一个学生的成绩:cj1;cout输入第二个学生的成绩:cj2;cout交换前:endl;cout第一个
5、学生的成绩为:cj1endl;cout第二个学生的成绩为:cj2endl;t=cj1; cj1=cj2;cj2=t; cout交换后:endl;cout第一个学生的成绩为:cj1endl;cout第二个学生的成绩为:cj2endl;方法二:不使用第三个变量实现交换。#include iostream.hvoid main()int cj1,cj2;cout请输入两个学生的成绩:endl;cout第一个学生的成绩为:cj1;cout第二个学生的成绩为:cj2;cout交换:endl;cout第一个学生的成绩为:cj1endl; cout第二个学生的成绩为:cj2endl; cj1=cj1+cj2
6、; cj2=cj1-cj2; cj1=cj1-cj2; cout交换后:endl;cout第一个学生的成绩为:cj1endl;cout第二个学生的成绩为:cj2endl;对比分析:第一种方法使用了附加的一个内存单元,增加了空间开销;而第二种方法通过简单的加、减运算来实现,增加了时间开销。二种方法的效果是相同的。例3.3 输入一个三位整数x,输出各个位的数字,比如输入123,输出1 2 3。分析:本题主要是考察取整运算符“/”和求余运算符“%”的使用。具体步骤为:用100整除x得到百位数,用10求余x得到个位数,用100求余x得到中间数y,然后再用10整除y得到个位数。#include iost
7、ream.hvoid main()int x,a,b,c;coutx;a=x/100; /百位数c=x%10; /个位数y=x%100;b=y/10; /十位数cout百分位数:aendl;cout十分位数:bendl;cout个位数:cendl;提示:(1)该题目可以有多种解法,比如求解十位数的时候,可以先用10整除x得到由百位数、十位数组成的两位数,然后再用10求余这个二位数就得到十位数。(2)该题目的算法可以用于同类其它问题的求解。例如,水仙花数的求解。所谓水仙花数是指一个三位数,它的每位数字的立方之和等于该数。例如,因为153=13+53+33,所以153是水仙花数。该题目可以取出各个
8、位的数字,然后计算判断就可以了。大家自己编写求水仙花的程序。思考:如果是任意多位数该如何实现呢?3.2选择结构所谓选择结构,即对给定的条件进行测试判断,并根据结果选择不同的操作。构成选择结构的语句称为条件语句。3.2.1 if语句if语句有三种基本形式:单分支if、双分支if语句以及多分支if语句。1单分支if语句单分支if语句的一般形式如下:if (表达式)语句;“表达式”是给定的条件,if语句首先计算“表达式”的值,如果结果为非0,则“语句”被执行,否则不执行。“语句”可以是简单语句,也可以是复合语句或其它结构语句。执行流程如图3.4所示。图3.4单分支if语句执行流程例如当两个数相除的时
9、候,我们需要检查分母是否为0:if (count != 0)average = sum / count;当多个语句依赖于同一个条件时,必须用一对花括号将它们括起来,使之相当于一个语句,我们称之为复合语句:if (count != 0) average = sum / count;cout average;例3.4 输入两个学生的成绩,输出其最大值。分析:定义变量cj1、cj2分别用于保存两个学生的成绩。再定义第三变量max用于保存最大值。先把第一个学生的成绩cj1的值赋给max,然后比较max和cj2的值,如果cj2比max大,则将max的值更新为cj2的值。此法俗称擂台法。编写程序如下:#i
10、nclude iostream.hvoid main() int cj1,cj2,max; cout第一个学生的成绩为:cj1; cout第二个学生的成绩为:cj2; max=cj1; if(cj2max)max=cj2; cout最高成绩为:maxc)& (a+bc)& (a+bc)s=(a+b+c)/2.0;area=sqrt(s*(s-a) *(s-b) *(s-c) ;cout”area=”areaendl;else cout”不能构成三角形。”c)& (a+bc)& (a+bc)的值,若为真,则按顺序执行花括号内的三个语句;否则,输出字符串“不能构成三角形。”。例3.4中是使用单分支
11、if语句结构实现的,这里我们可以用双分支if语句直接输出最高成绩。程序如下:#include iostream.hvoid main()int cj1,cj2;coutcj1cj2;if(cj1cj2)cout最高成绩为:cj1endl;elsecout最高成绩为:cj2endl;例3.5 计算下面的分段函数。分析:y的取值有两种情况,主要由x的值决定。对此可以使用双分支的if语句,实现程序的二选一执行流程。由此编写程序如下:#include void main()double x,y;coutx;if (x=0)y=1;elsey=-1;coutyendl;下面看一个实例。在“学生成绩管理系
12、统”中,需要输入学生的性别“ST_Sex”信息。由于性别是bool型变量,不能直接输入或输出,必须经过适当的转换:cout temp_Sex;if(temp_Sex = =1)ST_Sex =true;else if(temp_Sex = =0)ST_Sex =false; (3) if_else if语句(多分支)现实生活中的各种条件是很复杂的,在一定的条件下,又需要满足其它的条件才能确定相应的动作。为此,C+提供了if语句的嵌套功能,即一个if语句能够出现在另一个if语句或if-else语句里。这种形式的if语句的执行流程如图3.6所示。图3.6多分支if语句执行流程需要说明的是,不管有多
13、少分支,程序执行一个分支后,就不再执行其余的分支。如果有多个分支的条件都为true时,也仅执行第一个匹配的语句。因此,要在编写程序时要注意各表达式的书写次序。例如:if (ch = 0 & ch = A & ch = a & ch = 0 & ch = A & ch = a & ch 0,则有两个不等的实根;否则,有两个共轭复根。根据上述各种情况,可以采用嵌套的if语句对各种情况做判断。具体代码请读者自行编写、调试。3.2.2 switch语句在实际的工程应用中往往会遇到很多多分支选择的情况,这当然可以使用多分支if语句来解决。但+还提供了专门处理多分支结构的语句switch语句,该语句根据一
14、个表达式的不同取值决定程序的走向。采用这个语句会使程序的结构更加清晰、明了。switch语句的一般形式如下:switch (表达式)case常量表达式1:语句;.case常量表达式n:语句;default:语句;switch语句的执行过程是这样的:首先计算“表达式”的值,然后,其结果值依次与每一个常量表达式的值进行匹配。如果匹配成功,则执行该常量表达式后的语句系列。当遇到break时,则立即结束switch语句的执行,否则,顺序执行到花括号中的最后一条语句。default情形是可选的,如果没有常量表达式的值与“表达式”的值匹配,则执行default后的语句系列。需要注意的是,“表达式”的值的类
15、型必须是字符型或整型。switch语句的执行流程如图3.7所示。图3.7switch多分支语句执行流程例如,switch (operator)case +: result = operand1 + operand2;break;case -: result = operand1 - operand2;break;case *: result = operand1 * operand2;break;case /: result = operand1 / operand2;break;default: cout unknown operator: ch n;break;从上例我们可以看到:swit
16、ch语句中的每一个case的结尾通常有一个break语句,它停止switch语句的继续执行,而转向该switch语句的下一个语句。但是,我们有时也有意不加break语句。例如,我们修改上面的例子,以允许x作为乘法运算符,则可将上面的程序修改为:switch (operator) case +: result = operand1 + operand2;break;case -: result = operand1 - operand2;break;case x:case *: result = operand1 * operand2;break;case /: result = operand
17、1 / operand2;break;default: cout unknown operator: ch n;break;因为case x没有break语句,所以case x与case *执行相同的语句系列,也就是说,把x扩展成为乘法运算符了。很显然,switch语句可以写成if-else语句的形式。例如,上面的语句,我们可以写为:if (operator = +)result = operand1 + operand2;else if (operator = -)result = operand1 - operand2;else if (operator = x | operator =
18、*)result = operand1 * operand2;else if (operator = /)result = operand1 / operand2;elsecout unknown operator: ch n;但是,使用switch语句比用if-else语句简洁得多,可读性也好得多。遇到多分支选择的情形,我们应当尽量选用switch语句,避免采用嵌套较深的if-else语句。下面用switch语句重做例3.6。#include void main() int x; coutx;switch(x/10) case 10: case 9: cout优endl; break; ca
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
10 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序控制 结构
