三章序的控制结构

上传人:cl****1 文档编号:593454731 上传时间:2024-09-25 格式:PPT 页数:46 大小:1.33MB
返回 下载 相关 举报
三章序的控制结构_第1页
第1页 / 共46页
三章序的控制结构_第2页
第2页 / 共46页
三章序的控制结构_第3页
第3页 / 共46页
三章序的控制结构_第4页
第4页 / 共46页
三章序的控制结构_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《三章序的控制结构》由会员分享,可在线阅读,更多相关《三章序的控制结构(46页珍藏版)》请在金锄头文库上搜索。

1、1第三章第三章 程序的控制结构程序的控制结构2教学目标l(1) 理理解解控控制制语语句句的的作作用用和和分分类类,掌掌握握相相关关语语句句的的使用方法;使用方法;l(2) 了解使用伪代码或流程图描述算法的方法。了解使用伪代码或流程图描述算法的方法。3基本内容 l3.1 基本控制结构基本控制结构l3.2 选择结构选择结构l3.3 循环结构循环结构43.1 基本控制结构l三大基本程序结构三大基本程序结构: l顺序结构顺序结构:程序是按程序语句或模块在执行流中的顺:程序是按程序语句或模块在执行流中的顺序逐个执行。序逐个执行。 l选择结构选择结构:程序是按设定的条件实现程序执行流的多:程序是按设定的条

2、件实现程序执行流的多路分支。路分支。 l循环结构循环结构:程序是按给定的条件重复地执行指定的程:程序是按给定的条件重复地执行指定的程序段或模块。序段或模块。 l结论:理论上已经证明,用以上三种基本程序结结论:理论上已经证明,用以上三种基本程序结构的构的组合组合可以实现任何复杂的算法。可以实现任何复杂的算法。5三大基本结构示意图l顺序结构顺序结构l选择结构选择结构l循环结构循环结构模块(语句)模块(语句)A A模块(语句)模块(语句)B B条件条件程序模块程序模块1成立成立不成立不成立程序模块程序模块2条件条件程序模块程序模块不成立不成立成立成立(当型循环)(当型循环)程序模块程序模块成立成立不

3、成立不成立条件条件(直到型循环)(直到型循环)6顺序结构的实现r = p;p = q;q = r;7例 3-1 交换两个变量的值#include using namespace std;int main()int a=1, b=2;int tmp;/ 定义一个整型变量作为中间交换之用定义一个整型变量作为中间交换之用cout 交换前:交换前:a= a , b= b endl;tmp = a;a = b;b = tmp;cout 交换后:交换后:a= a , b= b endl;return 0;83.2 选择结构lC/C+语言中实现选择结构的语句形式主要有语言中实现选择结构的语句形式主要有两种:

4、两种:lif语句lswitch语句91. if语句l一路分支:一路分支: if (表达式)表达式) 语句序列语句序列 条件?条件?成立成立不成立不成立语句序列语句序列l两路分支:两路分支: if (表达式)表达式) 语句序列语句序列1 else 语句序列语句序列2条件?条件?语句序列语句序列 1成立成立不成立不成立语句序列语句序列 2语句序列可以是一个语句,也可以是用花括号括起来的复合语句结构语句序列可以是一个语句,也可以是用花括号括起来的复合语句结构10例 3-2:判断成绩是否及格#include using namespace std;int main()int i;couti;if(i=

5、60)cout及格及格endl;elsecout不及格不及格endl;return 0;11例 3-3:求一元二次方程的根#include #include using namespace std;int main()double a, b, c, delta, p, q;cout a b c;if( a=0 ) & ( b=0 ) & ( c=0 )/ 最极端情况最极端情况cout 方程的根可为任意值方程的根可为任意值 endl;else if( a=0 ) & (b != 0) / 转换为一元一次方程情况转换为一元一次方程情况cout x1 = x2 = -c/b = 0)/ 实根情况实根

6、情况cout x1 = p+q endl x2 = p-q endl;else/ 存在共轭复根情况存在共轭复根情况cout x1 = p + q i endl;cout x2 = p - q iendl;return 0;122. switch语句l多路(开关)选择语句多路(开关)选择语句 : switch (表达式表达式) case 数值数值1: 语句序列语句序列1; case 数值数值2: 语句序列语句序列2; case 数值数值3: 语句序列语句序列3; default: 语句序列语句序列n; 13实现真正的多路选择l在每一个在每一个case模块的最后加上一个模块的最后加上一个break

7、语句语句14例3.2 百分制化为优秀、良好、中等、及格和不及格的五级制成绩l算法分析:算法分析:l取一个百分成绩经过运算得到取一个百分成绩经过运算得到5级制成绩。构造什么级制成绩。构造什么样的表达式呢?样的表达式呢? “百分成绩百分成绩/10 =” ?l共有共有5个分数档,选择分支大于个分数档,选择分支大于2,因此用多路开关语,因此用多路开关语句句switch。l计算结果应该是唯一的。转换后应从计算结果应该是唯一的。转换后应从switch中中break出来。出来。15#include using namespace std;int main()int grade;coutgrade;switc

8、h (grade/10)/ 根据转换值进行分支选择根据转换值进行分支选择case 10:case 9:cout优秀优秀endl;break;case 8:cout良好良好endl;break;case 7: cout中等中等endl;break;case 6:cout及格及格endl;break;default:cout不及格不及格endl;return 0;163.3 循环结构lC/C+语言中实现循环结构的语句形式主要有语言中实现循环结构的语句形式主要有三种:三种:lwhile语句语句ldo-while语句语句lfor语句语句17while语句|do-while语句l当型循环当型循环 whi

9、le (表达式)表达式) 语句序列语句序列 l直到型循环直到型循环 do 语句序列语句序列 while (表达式)表达式);循循环环体体循循环环体体条件?条件?语句序列语句序列成立成立不成立不成立语句序列语句序列不成立不成立成立成立条件?条件?18例 3-4:使用while语句计算1+2+3+100#include using namespace std;int main()int i=1, sum=0;/ 循环初始条件循环初始条件while(i=100)sum=sum+i;/ 累加求和累加求和i+;/ 改变循环条件改变循环条件cout 1+2+3+100=sumendl;return 0;1

10、9例 3-5:使用do-while语句计算1+2+3+100#include using namespace std;int main()int i=1, sum=0;/ 循环初始条件循环初始条件dosum=sum+i;/ 累加求和累加求和i+;/ 改变循环条件改变循环条件while(i=100);cout 1+2+3+100=sumendl;return 0;20for语句语句lfor语句用来实现计数循环语句用来实现计数循环:for (表达式表达式1; 表达式表达式2; 表达式表达式3) 语句语句1; 语句语句2; 语句语句n;21例 3-6:使用for语句计算1+2+3+100#inclu

11、de using namespace std;int main()int sum=0;for(int i=1; i=100; i+) sum=sum+i;/ 累加求和累加求和cout 1+2+3+100=sumendl;return 0;22例 3-7:制作乘法表-多重循环结构(循环的嵌套)#include using namespace std;int main()int i, j;for(i=1; i10; i+)for(j=1; j=i; j+)cout j * i =i*j t;cout endl;return 0;23九九乘法表输出九九乘法表输出1*1=11*2=2 2*2=41*3

12、=3 2*3=6 3*3=91*4=4 2*4=8 3*4=12 4*4=161*5=5 2*5=10 3*5=15 4*5=20 5*5=251*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=361*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=491*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=641*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=8124扩展阅读l3.4 其他控制转移语句其他控制转移语

13、句l3.4.1 switch语句(点击见前)l3.4.2 转向语句lbreak语句、continue语句、 goto语句l3.4.3 问号表达式l表达式1 ?表达式2 :表达式325上机指导l3.5 运行错误运行错误l常见的编程错误主要分为两类:常见的编程错误主要分为两类:l(1) 编译、连接错误:编译、连接错误:l 当程序中有语法错误或函数调用出错时就会出现。当程序中有语法错误或函数调用出错时就会出现。可通过可通过+编译和连接程序来改正。编译和连接程序来改正。l(2) 运行错误:运行错误:l 一种是逻辑错误一种是逻辑错误, 即程序的实际运行结果和编程者对即程序的实际运行结果和编程者对程序结果

14、的期望不符程序结果的期望不符;l 另一种仍是程序设计上的错误另一种仍是程序设计上的错误, 但是躲过了编译程序但是躲过了编译程序和连接程序的检查和连接程序的检查, 通常表现为突然死机、自行热启通常表现为突然死机、自行热启动或者输出信息混乱。动或者输出信息混乱。26应用举例l例例3-10计算保险经纪人月薪计算保险经纪人月薪 假定每一名保险经纪人的月工资都由三部分组成:假定每一名保险经纪人的月工资都由三部分组成: 底薪奖金业务提成。底薪奖金业务提成。l1)奖金的颁发方法为:)奖金的颁发方法为:l如果经纪人已经在公司工作如果经纪人已经在公司工作7年以下(含年以下(含7年),奖金为每年年),奖金为每年1

15、0元;元;l如果经纪人已经在公司工作如果经纪人已经在公司工作7年以上,奖金为每年年以上,奖金为每年20元。元。l2)业务提成的颁发方法为:)业务提成的颁发方法为:l如果经纪人该月销售额在如果经纪人该月销售额在9999元以下(含元以下(含9999元),没有提成;元),没有提成;l如果经纪人该月销售额在如果经纪人该月销售额在1000049999元之间,可得到元之间,可得到3的提成;的提成;l如果经纪人该月销售额超过如果经纪人该月销售额超过50000元(含),可得到元(含),可得到5提成。提成。l编程要求:当用户按照屏幕提示分别输入经纪人的底薪、编程要求:当用户按照屏幕提示分别输入经纪人的底薪、工龄

16、以及当月销售额后,程序计算并输出经纪人的月薪。工龄以及当月销售额后,程序计算并输出经纪人的月薪。27#include using namespace std;int main()/声明部分,定义程序中将用到的变量声明部分,定义程序中将用到的变量double baseSalary, bonus, totalSale, additionalBonus, Salary;int serviceYears;coutbaseSalary;coutserviceYears;/计算奖金计算奖金bonusif(serviceYears = 7)bonus=10*serviceYears;elsebonus=20

17、*serviceYears;couttotalSale;/计算提成计算提成additionalBonusif(totalSale 10000)additionalBonus=0;elseif(totalSale 50000)additionalBonus=totalSale*(0.03);elseadditionalBonus=totalSale*(0.05);/计算经纪人的月薪计算经纪人的月薪Salary Salary = baseSalary+ bonus+ additionalBonus;cout该经纪人的月薪为:该经纪人的月薪为:Salaryendl;return 0;28应用举例l例

18、例3-11 编写计算阶乘编写计算阶乘n!的程序。的程序。ln! = n(n-1)(n-2)21#include using namespace std;int main()int n;/ 定义存放输入正整数值的变量定义存放输入正整数值的变量int u = 1; / 定义存放乘法结果的变量定义存放乘法结果的变量u并赋初值并赋初值coutn;for (int i=1; i=n; i+) u = u*i; cout n ! = u endl;return 0;29应用举例l例例3-10 计算自然常数计算自然常数e的值的值30算算 法法 分分 析析l这是个级数计算问题,求这是个级数计算问题,求n+1项

19、累加和;用循环实项累加和;用循环实现。循环终止的条件是现。循环终止的条件是l第第n项项可以写成可以写成 u = u / n,即,即l累加和放在累加和放在e中,可以写成中,可以写成 e = e + ul要设一个计数器要设一个计数器n,每循环一次,每循环一次, n = n + 131/ 例例 3-12:计算常数:计算常数e的值的值#include using namespace std; int main()double e = 1.0;int n= 0; double u = 1.0;don +;u = u/n;e = e+u;while(u=1.0E-6);cout e = e ( n = n

20、 ) endl;return 0;32应用举例l例例 3-13:求水仙花数:求水仙花数l如果一个三位数的个位数、十位数和百位数的立方和如果一个三位数的个位数、十位数和百位数的立方和等于该数自身,则称该数为水仙花数。编一程序求出等于该数自身,则称该数为水仙花数。编一程序求出所有的水仙花数。所有的水仙花数。l153 = 13 + 53 + 33l370 = 33 + 73 + 03l371 = 33 + 73 + 13l407 = 43 + 03 + 7333算法分析l用用穷举法穷举法对对100999之间的每个数进行验证。之间的每个数进行验证。l验证公式为:验证公式为: lhdn= h3 + d3

21、 + n3l如何分解一个如何分解一个3位数的百位、十位和个位?是关键!位数的百位、十位和个位?是关键! 百位百位 = n / 100 整除整除100,丢弃小数,丢弃小数十位十位 = (n / 10 )% 10 整除整除10,得百十位。再对,得百十位。再对10取余数,得十位数取余数,得十位数 个位个位 = n % 10 n对对10取余数,得个位取余数,得个位l例:例: 371 lh = 371/100 = 3ld = (371/10)%10 = 37 % 10 = 7ln = 371 % 10 = 134#include using namespace std; int main()int n,

22、 i, j, k;for(n=100; n=999; n=n+1) i = n/100; / 取出取出n的百位数的百位数 j = (n/10)%10; / 取数取数n的十位数的十位数 k = n%10; / 取出取出n的个位数的个位数 if(n=i*i*i+j*j*j+k*k*k)cout n = i3 + j3 +k3endl;return 0;35应用举例l例例 3-14:计算斐波那契数列:计算斐波那契数列 l一对兔子从出生后第一对兔子从出生后第3个月起每个月都生一对兔子,小个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如所有的兔子长到第三个月后每个月又生一对兔子,假

23、如所有的兔子都不会死,求前兔子都不会死,求前24个月中每月的兔子数。个月中每月的兔子数。lF1 = 1(最初的一对兔子)(最初的一对兔子)lF2 = 1(第(第2个月,最初的一对兔子长成,但尚未生育)个月,最初的一对兔子长成,但尚未生育)lF3 = 2(最初的兔子开始生育)(最初的兔子开始生育)llFn = Fn-1+Fn-2 (兔子数量的通项公式,即每月兔子数等于上(兔子数量的通项公式,即每月兔子数等于上两个月兔子数之和)两个月兔子数之和)l从而形成了如下数列从而形成了如下数列l1,1,2,3,5,8,13,21,34,55,36#include using namespace std;in

24、t main()int f1=1;int f2=1;int i;for(i=1; i=12; i+)coutf1tf2t;f1=f1+f2; / 赋值号左边的赋值号左边的f1代表第代表第3个数,是第个数,是第1、2个数之和个数之和f2=f2+f1; / 赋值号左边的赋值号左边的f2代表第代表第4个数,是第个数,是第2、3个数之和个数之和coutendl;return 0;37应用举例l例例3-15鸡兔同笼鸡兔同笼 l鸡和兔子关在一个笼子里,已知共有头鸡和兔子关在一个笼子里,已知共有头36个,脚个,脚100个,个,求笼内关了多少只兔子和多少只鸡?求笼内关了多少只兔子和多少只鸡?l分析:每只鸡有两

25、只脚,每只兔子有四只脚,由题意得分析:每只鸡有两只脚,每只兔子有四只脚,由题意得到如下方程:到如下方程:l鸡的数目鸡的数目2兔子数目兔子数目4100l鸡的数目兔子数目鸡的数目兔子数目3638穷举法l对所有可能情况一一测试,从中找出符合条件的对所有可能情况一一测试,从中找出符合条件的(一个或一组)解,或得出无解的结论。(一个或一组)解,或得出无解的结论。l算法如下:算法如下:chicken=0;while(chicken=36)尝试是否满足两个方程,如是则输出解尝试是否满足两个方程,如是则输出解chicken, rabbit 准备下一轮尝试准备下一轮尝试 chicken+;39#include

26、using namespace std;int main()int rabbit=0;int chicken=0;while(chicken=36)if(100-chicken*2)%4=0)&(chicken+(100-chicken*2)/4)=36)rabbit=(100-chicken*2)/4;cout鸡:鸡:chicken 兔:兔:rabbitendl;chicken+;return 0;40案例:案例:谁打烂了玻璃?l有四个小孩踢皮球,不小心打烂了玻璃,老师问是谁干的。有四个小孩踢皮球,不小心打烂了玻璃,老师问是谁干的。lA说:不是我说:不是我lB说:是说:是ClC说:是说:是D

27、lD说:他胡说说:他胡说 现已知现已知3个小孩说的是真话,一个小孩是假话。根据这些信个小孩说的是真话,一个小孩是假话。根据这些信息,编程找出打烂玻璃的孩子。息,编程找出打烂玻璃的孩子。 教学设问教学设问 如何求解逻辑问题?如何求解逻辑问题? 如何根据案例的问题描述给出对应的数学模型?如何根据案例的问题描述给出对应的数学模型? 用什么样的控制结构能够从许多种可能性中找出其中的一种或多种用什么样的控制结构能够从许多种可能性中找出其中的一种或多种正确的解?正确的解?打烂玻璃者为:C* *更多案例见本书配套教材更多案例见本书配套教材C/C+C/C+语言程序设计案例教程语言程序设计案例教程 罗建军等编著

28、,清华大学出版社罗建军等编著,清华大学出版社41A说:不是我说:不是我B说:是说:是CC说:是说:是DD说:他胡说说:他胡说现已知现已知3个人说的是真话,一个人是假话。个人说的是真话,一个人是假话。数学模型k!=1k=3k=4k!=4(k!=1)+(k=3)+(k=4)+(k!=4)=3设变量设变量k表示打烂玻璃的孩子表示打烂玻璃的孩子42状态状态代号代号A(1)B(2)C(3)D(4)说真话人数说真话人数打烂玻璃打烂玻璃00010打烂玻璃打烂玻璃00200打烂玻璃打烂玻璃03000打烂玻璃打烂玻璃1按照这按照这4 4种状态假定,逐一测试种状态假定,逐一测试4 4个人的话有几个为真,如个人的话

29、有几个为真,如果不满果不满3 3句为真,就否定这一假定,换下一个状态来试句为真,就否定这一假定,换下一个状态来试43#include using namespace std;int main()for(int k=1; k=4; k+)if(k!=1)+(k=3)+(k=4)+(k!=4)=3)cout打烂玻璃者为:打烂玻璃者为:char(64+k)endl;return 0;44进一步思考l考虑更加一般的情况,即本案例出现没有解考虑更加一般的情况,即本案例出现没有解或有多个解,要为上面的程序增加什么机制,或有多个解,要为上面的程序增加什么机制,怎么修改程序?怎么修改程序?l如果题目改为有如果题目改为有3个小孩说假话,个小孩说假话,1个小孩说个小孩说真话,则打烂玻璃的孩子又是谁?真话,则打烂玻璃的孩子又是谁?45学好程序设计语言的唯一途径是学好程序设计语言的唯一途径是 你的编程能力与你在计算机上投入的时间成你的编程能力与你在计算机上投入的时间成 结结 束束 语语46

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号