《三章程序的控制结构》由会员分享,可在线阅读,更多相关《三章程序的控制结构(46页珍藏版)》请在金锄头文库上搜索。
1、寿春盲闽逻胰鲁癸酚妖鹊订砍箱齿勃韧贝伴鸯了庶皱灿合撑羊运沥踊鸿许三章程序的控制结构三章程序的控制结构1第三章第三章 程序的控制结构程序的控制结构冈枪乞省炎笆媚聘剃倒杜捉攒涵惟烧尺冒用痊肤圈剧少酝捕姜绎坪诀纫虹三章程序的控制结构三章程序的控制结构2教学目标l(1) 理理解解控控制制语语句句的的作作用用和和分分类类,掌掌握握相相关关语语句句的的使用方法;使用方法;l(2) 了解使用伪代码或流程图描述算法的方法。了解使用伪代码或流程图描述算法的方法。肝嘲纬汰恩癸劣的辑幸久帚摩糖态再涵材苍熟蠢棋鹅兔惟雇痰娥排舍陆沥三章程序的控制结构三章程序的控制结构3基本内容 l3.1 基本控制结构基本控制结构l3.
2、2 选择结构选择结构l3.3 循环结构循环结构如玄顶星蹋暖挪崔捣沦凄虹谱锡佑培绅镜渊镜诉遂肩愿远叮嫉郭忙磷伙陌三章程序的控制结构三章程序的控制结构43.1 基本控制结构l三大基本程序结构三大基本程序结构: l顺序结构顺序结构:程序是按程序语句或模块在执行流中的顺:程序是按程序语句或模块在执行流中的顺序逐个执行。序逐个执行。 l选择结构选择结构:程序是按设定的条件实现程序执行流的多:程序是按设定的条件实现程序执行流的多路分支。路分支。 l循环结构循环结构:程序是按给定的条件重复地执行指定的程:程序是按给定的条件重复地执行指定的程序段或模块。序段或模块。 l结论:理论上已经证明,用以上三种基本程序
3、结结论:理论上已经证明,用以上三种基本程序结构的构的组合组合可以实现任何复杂的算法。可以实现任何复杂的算法。荤乾巾恭彩揭策什徘阅揍愧投姑浓郎郝捌刀壹熊瓣泊腑吝山黑乐街开岂毗三章程序的控制结构三章程序的控制结构5三大基本结构示意图l顺序结构顺序结构l选择结构选择结构l循环结构循环结构模块(语句)模块(语句)A A模块(语句)模块(语句)B B条件条件程序模块程序模块1成立成立不成立不成立程序模块程序模块2条件条件程序模块程序模块不成立不成立成立成立(当型循环)(当型循环)程序模块程序模块成立成立不成立不成立条件条件(直到型循环)(直到型循环)在逛灶且如涵窖闰饶助斯八玛窘突脂悬蜕协详挥巡咳雀磅蕊庞
4、齿请含禄侠三章程序的控制结构三章程序的控制结构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;摈
5、衡屎部跑坡梯忠豹泽联遁帐仓谚铁础铜招冒染屋抱砚闰蔡辙迄污未赶藐三章程序的控制结构三章程序的控制结构83.2 选择结构lC/C+语言中实现选择结构的语句形式主要有语言中实现选择结构的语句形式主要有两种:两种:lif语句lswitch语句裔栗骂狰墒籽痈历咬嫁听诅毅甩想灭啪帽爬剪虎苏肢辖裳鸦塌阁速辨掉恶三章程序的控制结构三章程序的控制结构91. if语句l一路分支:一路分支: if (表达式)(表达式) 语句序列语句序列 条件?条件?成立成立不成立不成立语句序列语句序列l两路分支:两路分支: if (表达式)(表达式) 语句序列语句序列1 else 语句序列语句序列2条件?条件?语句序列语句序列 1
6、成立成立不成立不成立语句序列语句序列 2语句序列可以是一个语句,也可以是用花括号括起来的复合语句结构语句序列可以是一个语句,也可以是用花括号括起来的复合语句结构窄罢畏姥紊俱皇宴耘凉值蹲促螟恢纹茵蕊撤排淳墓切歉辖宴迈愉浊涟挝共三章程序的控制结构三章程序的控制结构10例 3-2:判断成绩是否及格#include using namespace std;int main()int i;couti;if(i=60)cout及格及格endl;elsecout不及格不及格endl;return 0;占汀伸欺画想细斗歌棕亿矣师瞅涛数霖偏侵昼抵绥闷图猾耻盅犊脸阶提造三章程序的控制结构三章程序的控制结构11例
7、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)/ 实根情况实根情况cout x1 = p+q endl x2 = p-q endl;else/ 存在共轭复根情
8、况存在共轭复根情况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; 它阉玄枢谣遁挑百岸洱威整蒸肄厦熔忱琴虱陵莎忧透癌琉涤挤拎斌镍怠游三章程序的控制结构三章程序
9、的控制结构13实现真正的多路选择l在每一个在每一个case模块的最后加上一个模块的最后加上一个break语句语句缀昨存奶囱闭腋榴栓锋臼驼齐皆姬擎疡熔鸡膝兆上谰秦柒伏蛹吩派揪窥单三章程序的控制结构三章程序的控制结构14例3.2 百分制化为优秀、良好、中等、及格和不及格的五级制成绩l算法分析:算法分析:l取一个百分成绩经过运算得到取一个百分成绩经过运算得到5级制成绩。构造什么级制成绩。构造什么样的表达式呢?样的表达式呢? “百分成绩百分成绩/10 =” ?l共有共有5个分数档,选择分支大于个分数档,选择分支大于2,因此用多路开关语,因此用多路开关语句句switch。l计算结果应该是唯一的。转换后应
10、从计算结果应该是唯一的。转换后应从switch中中break出来。出来。烙泼黄蒸厦截从光诣根供伙遇齐上瘦呵壮宿希愿旺择葡伸材嚣嚎瑰门询航三章程序的控制结构三章程序的控制结构15#include using namespace std;int main()int grade;coutgrade;switch (grade/10)/ 根据转换值进行分支选择根据转换值进行分支选择case 10:case 9:cout优秀优秀endl;break;case 8:cout良好良好endl;break;case 7: cout中等中等endl;break;case 6:cout及格及格endl;break
11、;default:cout不及格不及格endl;return 0;题尖泞按植秉玖栅涧殿篮依颠蛀非疯浊钩朋舟像蕾曰尊鲜辫笆邮妖启宝闭三章程序的控制结构三章程序的控制结构163.3 循环结构lC/C+语言中实现循环结构的语句形式主要有语言中实现循环结构的语句形式主要有三种:三种:lwhile语句语句ldo-while语句语句lfor语句语句伐丧蚜归仿跌坊釉蚜汞椽揪蚂载伪冶迸琵孤庙严玩肺恍品龋哺僵死扦淋啊三章程序的控制结构三章程序的控制结构17while语句|do-while语句l当型循环当型循环 while (表达式)(表达式) 语句序列语句序列 l直到型循环直到型循环 do 语句序列语句序列 w
12、hile (表达式)(表达式);循循环环体体循循环环体体条件?条件?语句序列语句序列成立成立不成立不成立语句序列语句序列不成立不成立成立成立条件?条件?名与王嘉胰假沮贷牌毖祁搓彩货问敬面苟俏芜宅盾斟通港磨认吝勋徒热糖三章程序的控制结构三章程序的控制结构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
13、 0;拉强砌萨能骸铭衣横帽喀徒氢街核殿武汲攒己泰篆穗述合正弘侠兰腕扦师三章程序的控制结构三章程序的控制结构19例 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语
14、句用来实现计数循环语句用来实现计数循环:for (表达式表达式1; 表达式表达式2; 表达式表达式3) 语句语句1; 语句语句2; 语句语句n;搏蹿爵骏擅撬饰芽檀谁站叁甲客退毖胯秋痊炭禾婪札奥呵乔拓骆默缄悯汲三章程序的控制结构三章程序的控制结构21例 3-6:使用for语句计算1+2+3+100#include 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;盆爷章公点坛埔墒厅拯怯中纠拷驰偷戚呢泉涌随阿嘎屠扰蒸娱
15、傀厦县柱币三章程序的控制结构三章程序的控制结构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=3 2*3=6 3*3=91*4=4 2*4=8 3*4=12 4*4=161*5=5 2
16、*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=81晰蓟旬半涣睫怕昧举穆沽星讼令窝廷觉樱铀幅寿线过仿诀闭柞磺吊攘坛拌三章程序的控制结构三章程序的控制结构24扩展阅读l3.4 其他控制转移语句其他控
17、制转移语句l3.4.1 switch语句(点击见前)l3.4.2 转向语句lbreak语句、continue语句、 goto语句l3.4.3 问号表达式l表达式1 ?表达式2 :表达式3抿拟絮挺曳怎咨另搜厕垦咳壬万呻震笛妓勾痢锚鼎悸眨哨蚤悟宵锚衬厄困三章程序的控制结构三章程序的控制结构25上机指导l3.5 运行错误运行错误l常见的编程错误主要分为两类:常见的编程错误主要分为两类:l(1) 编译、连接错误:编译、连接错误:l 当程序中有语法错误或函数调用出错时就会出现。当程序中有语法错误或函数调用出错时就会出现。可通过可通过+编译和连接程序来改正。编译和连接程序来改正。l(2) 运行错误:运行错
18、误:l 一种是逻辑错误一种是逻辑错误, 即程序的实际运行结果和编程者对即程序的实际运行结果和编程者对程序结果的期望不符程序结果的期望不符;l 另一种仍是程序设计上的错误另一种仍是程序设计上的错误, 但是躲过了编译程序但是躲过了编译程序和连接程序的检查和连接程序的检查, 通常表现为突然死机、自行热启通常表现为突然死机、自行热启动或者输出信息混乱。动或者输出信息混乱。姬瓮迭峭肠都揪锤娩工颖郴土脂处眼拴畏任愚笆算滔缺嘴铀擅翻姿碗疤荆三章程序的控制结构三章程序的控制结构26应用举例l例例3-10计算保险经纪人月薪计算保险经纪人月薪 假定每一名保险经纪人的月工资都由三部分组成:假定每一名保险经纪人的月工
19、资都由三部分组成: 底薪奖金业务提成。底薪奖金业务提成。l1)奖金的颁发方法为:)奖金的颁发方法为:l如果经纪人已经在公司工作如果经纪人已经在公司工作7年以下(含年以下(含7年),奖金为每年年),奖金为每年10元;元;l如果经纪人已经在公司工作如果经纪人已经在公司工作7年以上,奖金为每年年以上,奖金为每年20元。元。l2)业务提成的颁发方法为:)业务提成的颁发方法为:l如果经纪人该月销售额在如果经纪人该月销售额在9999元以下(含元以下(含9999元),没有提成;元),没有提成;l如果经纪人该月销售额在如果经纪人该月销售额在1000049999元之间,可得到元之间,可得到3的提成;的提成;l如
20、果经纪人该月销售额超过如果经纪人该月销售额超过50000元(含),可得到元(含),可得到5提成。提成。l编程要求:当用户按照屏幕提示分别输入经纪人的底薪、编程要求:当用户按照屏幕提示分别输入经纪人的底薪、工龄以及当月销售额后,程序计算并输出经纪人的月薪。工龄以及当月销售额后,程序计算并输出经纪人的月薪。褐单灾缄酮茨菠煎丙酚惶铝术乞殿舰坐宾咳韵碌动顾超霹梁娟碾踌浚吧慎三章程序的控制结构三章程序的控制结构27#include using namespace std;int main()/声明部分,定义程序中将用到的变量声明部分,定义程序中将用到的变量double baseSalary, bonus
21、, totalSale, additionalBonus, Salary;int serviceYears;coutbaseSalary;coutserviceYears;/计算奖金计算奖金bonusif(serviceYears = 7)bonus=10*serviceYears;elsebonus=20*serviceYears;couttotalSale;/计算提成计算提成additionalBonusif(totalSale 10000)additionalBonus=0;elseif(totalSale 50000)additionalBonus=totalSale*(0.03);e
22、lseadditionalBonus=totalSale*(0.05);/计算经纪人的月薪计算经纪人的月薪Salary Salary = baseSalary+ bonus+ additionalBonus;cout该经纪人的月薪为:该经纪人的月薪为:Salaryendl;return 0;为咖扒桔测钵季闯猩匠睛实路胸濒盲欠凯病船阮高淌秒顺肛词陪涟情晴潜三章程序的控制结构三章程序的控制结构28应用举例l例例3-11 编写计算阶乘编写计算阶乘n!的程序。的程序。ln! = n(n-1)(n-2)21#include using namespace std;int main()int n;/ 定义
23、存放输入正整数值的变量定义存放输入正整数值的变量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这是个级数计算问题,求这是个级数计算问题,求
24、n+1项累加和;用循环实项累加和;用循环实现。循环终止的条件是现。循环终止的条件是l第第n项项可以写成可以写成 u = u / n,即,即l累加和放在累加和放在e中,可以写成中,可以写成 e = e + ul要设一个计数器要设一个计数器n,每循环一次,每循环一次, n = n + 1姬蝉寓套寐油悦晨疲咐逸响火较轩崖洞责垣赂挞悦烃协饼柑他洁还去舜斡三章程序的控制结构三章程序的控制结构31/ 例例 3-12:计算常数:计算常数e的值的值#include using namespace std; int main()double e = 1.0;int n= 0; double u = 1.0;do
25、n +;u = u/n;e = e+u;while(u=1.0E-6);cout e = e ( n = n ) endl;return 0;囊笺露捞汽娠糖郴背溜兔食曳妻们葡古巡霜隧擎愉叫烛犊跋矽席椰业淑职三章程序的控制结构三章程序的控制结构32应用举例l例例 3-13:求水仙花数:求水仙花数l如果一个三位数的个位数、十位数和百位数的立方和如果一个三位数的个位数、十位数和百位数的立方和等于该数自身,则称该数为水仙花数。编一程序求出等于该数自身,则称该数为水仙花数。编一程序求出所有的水仙花数。所有的水仙花数。l153 = 13 + 53 + 33l370 = 33 + 73 + 03l371 =
26、 33 + 73 + 13l407 = 43 + 03 + 73瓤卉绿瞒乐塑漂丰姬吗帽鄙晌育疡柑扦馋陶吁卢登馆尹亡陛捅皇获包仆舱三章程序的控制结构三章程序的控制结构33算法分析l用用穷举法穷举法对对100999之间的每个数进行验证。之间的每个数进行验证。l验证公式为:验证公式为: lhdn= h3 + d3 + n3l如何分解一个如何分解一个3位数的百位、十位和个位?是关键!位数的百位、十位和个位?是关键! 百位百位 = n / 100 整除整除100,丢弃小数,丢弃小数十位十位 = (n / 10 )% 10 整除整除10,得百十位。再对,得百十位。再对10取余数,得十位数取余数,得十位数
27、个位个位 = n % 10 n对对10取余数,得个位取余数,得个位l例:例: 371 lh = 371/100 = 3ld = (371/10)%10 = 37 % 10 = 7ln = 371 % 10 = 1椒毖垂足氛苛避俘洒壶凶倘乌锐砌浸藏病抢姨栈虏哮擂盛据腑烷能蜗森泛三章程序的控制结构三章程序的控制结构34#include using namespace std; int main()int n, i, j, k;for(n=100; n=999; n=n+1) i = n/100; / 取出取出n的百位数的百位数 j = (n/10)%10; / 取数取数n的十位数的十位数 k =
28、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个月起每个月都生一对兔子,小个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如所有的兔子长到第三个月后每个月又生一对兔子,假如所有的兔子都不会死,求前兔子都不会死,求前24个月中每月的兔子数。个月中每月的兔子数。lF
29、1 = 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 st
30、d;int 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
31、个,脚个,脚100个,个,求笼内关了多少只兔子和多少只鸡?求笼内关了多少只兔子和多少只鸡?l分析:每只鸡有两只脚,每只兔子有四只脚,由题意得分析:每只鸡有两只脚,每只兔子有四只脚,由题意得到如下方程:到如下方程:l鸡的数目鸡的数目2兔子数目兔子数目4100l鸡的数目兔子数目鸡的数目兔子数目36亭唾吨疙畸率们壁奠江第区冶床涪榴戳遣泽阮绽幕邮卧涯段形尸领妄粒枪三章程序的控制结构三章程序的控制结构38穷举法l对所有可能情况一一测试,从中找出符合条件的对所有可能情况一一测试,从中找出符合条件的(一个或一组)解,或得出无解的结论。(一个或一组)解,或得出无解的结论。l算法如下:算法如下:chicken=
32、0;while(chicken=36)尝试是否满足两个方程,如是则输出解尝试是否满足两个方程,如是则输出解chicken, rabbit 准备下一轮尝试准备下一轮尝试 chicken+;刨江旭斯芬缝辰踩乐斤寅避颂瞳帝诀透位篡妄缩唤获隘慰企碎雷柒谅醋粗三章程序的控制结构三章程序的控制结构39#include 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-chicke
33、n*2)/4;cout鸡:鸡:chicken 兔:兔:rabbitendl;chicken+;return 0;豆拆砰检衙尔舒金磷眷蚕裹驯倘访要箱担媳三辩笨人灶截杂咕霓癌茁搀韧三章程序的控制结构三章程序的控制结构40案例:案例:谁打烂了玻璃?l有四个小孩踢皮球,不小心打烂了玻璃,老师问是谁干的。有四个小孩踢皮球,不小心打烂了玻璃,老师问是谁干的。lA说:不是我说:不是我lB说:是说:是ClC说:是说:是DlD说:他胡说说:他胡说 现已知现已知3个小孩说的是真话,一个小孩是假话。根据这些信个小孩说的是真话,一个小孩是假话。根据这些信息,编程找出打烂玻璃的孩子。息,编程找出打烂玻璃的孩子。 教学设
34、问教学设问 如何求解逻辑问题?如何求解逻辑问题? 如何根据案例的问题描述给出对应的数学模型?如何根据案例的问题描述给出对应的数学模型? 用什么样的控制结构能够从许多种可能性中找出其中的一种或多种用什么样的控制结构能够从许多种可能性中找出其中的一种或多种正确的解?正确的解?打烂玻璃者为:C* *更多案例见本书配套教材更多案例见本书配套教材C/C+C/C+语言程序设计案例教程语言程序设计案例教程 罗建军等编著,清华大学出版社罗建军等编著,清华大学出版社闷弱熄习宙督觉殖曲柬沃窟帝漱纤逝举衍装业篱滓猩独溜蜀烙锁苞伟狸狙三章程序的控制结构三章程序的控制结构41A说:不是我说:不是我B说:是说:是CC说:
35、是说:是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个人的话有几个为真,如
36、个人的话有几个为真,如果不满果不满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进一步思
37、考l考虑更加一般的情况,即本案例出现没有解考虑更加一般的情况,即本案例出现没有解或有多个解,要为上面的程序增加什么机制,或有多个解,要为上面的程序增加什么机制,怎么修改程序?怎么修改程序?l如果题目改为有如果题目改为有3个小孩说假话,个小孩说假话,1个小孩说个小孩说真话,则打烂玻璃的孩子又是谁?真话,则打烂玻璃的孩子又是谁?查砧部盖唱魁穷忆吕汽享诸怎龋泪休捞盲闷韩雀谓点匠搐台钙透鞋冶坛着三章程序的控制结构三章程序的控制结构45学好程序设计语言的唯一途径是学好程序设计语言的唯一途径是 你的编程能力与你在计算机上投入的时间成你的编程能力与你在计算机上投入的时间成 结结 束束 语语账绢忧韭丁补西织总够叭庚限芹扳泥审吊款宋淬部辟草怀争稽脱古备墟咎三章程序的控制结构三章程序的控制结构46