《程序控制结构分支循环举例.pptx》由会员分享,可在线阅读,更多相关《程序控制结构分支循环举例.pptx(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、教学目标(1)理解控制语句的作用和分类,掌握相关语句的使用方法;(2)了解使用伪代码或流程图描述算法的方法。1第1页/共44页基本内容 3.1 基本控制结构3.2 选择结构3.3 循环结构2第2页/共44页3.1 基本控制结构三大基本程序结构:顺序结构:程序是按程序语句或模块在执行流中的顺序逐个执行。选择结构:程序是按设定的条件实现程序执行流的多路分支。循环结构:程序是按给定的条件重复地执行指定的程序段或模块。结论:理论上已经证明,用以上三种基本程序结构的组合可以实现任何复杂的算法。3第3页/共44页三大基本结构示意图顺序结构选择结构循环结构4模块(语句)模块(语句)A A模块(语句)模块(语
2、句)B B条件程序模块1成立成立不成立不成立程序模块2条件程序模块不成立不成立成立成立(当型循环)(当型循环)程序模块成立成立不成立不成立条件(直到型循环)(直到型循环)第4页/共44页顺序结构的实现r=p;p=q;q=r;5第5页/共44页例 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;6第6页/共44页3.2 选择结构C
3、+语言中实现选择结构的语句形式主要有两种:if语句switch语句7第7页/共44页1.if语句语句一路分支:if(表达式)语句序列 两路分支:if(表达式)语句序列1 else 语句序列28条件?成立成立不成立不成立语句序列条件?语句序列 1成立成立不成立不成立语句序列 2语句序列可以是一个语句,也可以是用花括号括起来的复合语句结构语句序列可以是一个语句,也可以是用花括号括起来的复合语句结构第8页/共44页例 3-2:判断成绩是否及格#include using namespace std;int main()int i;couti;if(i=60)cout及格endl;elsecout不及
4、格endl;return 0;9第9页/共44页例 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/存在共轭复根情况cout x1=p +q i endl;cout x2=p -q iendl;
5、return 0;10第10页/共44页2.switch语句语句多路(开关)选择语句:switch(表达式)case 数值1:语句序列1;case 数值2:语句序列2;case 数值3:语句序列3;default:语句序列n;11第11页/共44页实现真正的多路选择在每一个case模块的最后加上一个break语句12第12页/共44页例3.2 百分制化为优秀、良好、中等、及格和不及格的五级制成绩算法分析:取一个百分成绩经过运算得到5级制成绩。构造什么样的表达式呢?“百分成绩/10=”?共有5个分数档,选择分支大于2,因此用多路开关语句switch。计算结果应该是唯一的。转换后应从switch中
6、break出来。13第13页/共44页#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;default:cout不及格endl;return 0;第14页/共44页3.3 循环结构C+语言中实现循环结构的语句形式主要有三种:while语句do-while语句for语句
7、15第15页/共44页while语句|do-while语句当型循环 while(表达式)语句序列 直到型循环 do 语句序列 while(表达式);16循循环环体体循循环环体体条件?语句序列成立成立不成立不成立语句序列不成立不成立成立成立条件?第16页/共44页案例:谁打烂了玻璃?有四个小孩踢皮球,不小心打烂了玻璃,老师问是谁干的。A说:不是我B说:是CC说:是DD说:他胡说 现已知3个小孩说的是真话,一个小孩是假话。根据这些信息,编程找出打烂玻璃的孩子。17 教学设问教学设问 如何求解逻辑问题?如何求解逻辑问题?如何根据案例的问题描述给出对应的数学模型?如何根据案例的问题描述给出对应的数学模
8、型?用什么样的控制结构能够从许多种可能性中找出其中的一种或多种用什么样的控制结构能够从许多种可能性中找出其中的一种或多种正确的解?正确的解?打烂玻璃者为:C*更多案例见本书配套教材更多案例见本书配套教材C/C+C/C+语言程序设计案例教程语言程序设计案例教程 罗建军等编著,清华大学出版社罗建军等编著,清华大学出版社第17页/共44页A说:不是我说:不是我B说:是说:是CC说:是说:是DD说:他胡说说:他胡说现已知现已知3个人说的是真话,一个人是假话。个人说的是真话,一个人是假话。数学模型k!=1k=3k=4k!=4(k!=1)+(k=3)+(k=4)+(k!=4)=3设变量设变量k表示打烂玻璃
9、的孩子表示打烂玻璃的孩子第18页/共44页状态状态代号代号A(1)B(2)C(3)D(4)说真话人数说真话人数打烂玻璃打烂玻璃00010打烂玻璃打烂玻璃00200打烂玻璃打烂玻璃03000打烂玻璃打烂玻璃1按照这按照这4 4种状态假定,逐一测试种状态假定,逐一测试4 4个人的话有几个为真,如个人的话有几个为真,如果不满果不满3 3句为真,就否定这一假定,换下一个状态来试句为真,就否定这一假定,换下一个状态来试第19页/共44页#include using namespace std;int main()for(int k=1;k=4;k+)if(k!=1)+(k=3)+(k=4)+(k!=4)
10、=3)cout打烂玻璃者为:char(64+k)endl;return 0;20第20页/共44页进一步思考考虑更加一般的情况,即本案例出现没有解或有多个解,要为上面的程序增加什么机制,怎么修改程序?如果题目改为有3个小孩说假话,1个小孩说真话,则打烂玻璃的孩子又是谁?21第21页/共44页例 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
11、;22第22页/共44页例 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;23第23页/共44页for语句for语句用来实现计数循环:for(表达式1;表达式2;表达式3)语句1;语句2;语句n;24第24页/共44页例 3-6:使用for语句计算1+2+3+100#include using namespace std;in
12、t main()int sum=0;for(int i=1;i=100;i+)sum=sum+i;/累加求和cout 1+2+3+100=sumendl;return 0;25第25页/共44页例 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;26第26页/共44页九九乘法表输出九九乘法表输出1*1=11*2=2 2*2=41*3=3 2*3=6 3*3=91*4=4 2*4
13、=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=8127第27页/共44页扩展阅读3.4 其他控制转移语句3.4.1 switch语句(点击见前)3.
14、4.2 转向语句break语句、continue语句、goto语句3.4.3 问号表达式表达式1?表达式2:表达式328第28页/共44页应用举例例3-10计算保险经纪人月薪 假定每一名保险经纪人的月工资都由三部分组成:底薪奖金业务提成。1)奖金的颁发方法为:如果经纪人已经在公司工作7年以下(含7年),奖金为每年10元;如果经纪人已经在公司工作7年以上,奖金为每年20元。2)业务提成的颁发方法为:如果经纪人该月销售额在9999元以下(含9999元),没有提成;如果经纪人该月销售额在1000049999元之间,可得到3的提成;如果经纪人该月销售额超过50000元(含),可得到5提成。编程要求:当
15、用户按照屏幕提示分别输入经纪人的底薪、工龄以及当月销售额后,程序计算并输出经纪人的月薪。29第29页/共44页#include using namespace std;int main()/声明部分,定义程序中将用到的变量double baseSalary,bonus,totalSale,additionalBonus,Salary;int serviceYears;coutbaseSalary;coutserviceYears;/计算奖金bonusif(serviceYears=7)bonus=10*serviceYears;elsebonus=20*serviceYears;couttot
16、alSale;/计算提成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;第30页/共44页应用举例例3-11编写计算阶乘n!的程序。n!=n(n-1)(n-2)2131#inclu
17、de 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;第31页/共44页应用举例例3-10 计算自然常数e的值32第32页/共44页算 法 分 析这是个级数计算问题,求n+1项累加和;用循环实现。循环终止的条件是第n项可以写成 u=u/n,即累加和放在e中,可以写成 e=e+u要设一个计数器n,每循环一次,n=n+1第33页/共4
18、4页/例 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 )endl;return 0;第34页/共44页应用举例例 3-13:求水仙花数如果一个三位数的个位数、十位数和百位数的立方和等于该数自身,则称该数为水仙花数。编一程序求出所有的水仙花数。153=13+53+33370=33+73+03371=33+73+13407=43+03+7335第35页/共44页算法分析用穷举法对1
19、00999之间的每个数进行验证。验证公式为:hdn=h3+d3+n3如何分解一个3位数的百位、十位和个位?是关键!百位 =n/100 整除100,丢弃小数十位 =(n/10)%10 整除10,得百十位。再对10取余数,得十位数 个位 =n%10 n对10取余数,得个位例:371 h=371/100=3d=(371/10)%10=37%10=7n=371%10=1第36页/共44页#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的十位
20、数 k=n%10;/取出n的个位数 if(n=i*i*i+j*j*j+k*k*k)cout n=i3+j3+k3endl;return 0;第37页/共44页应用举例例 3-14:计算斐波那契数列 一对兔子从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如所有的兔子都不会死,求前24个月中每月的兔子数。F1=1(最初的一对兔子)F2=1(第2个月,最初的一对兔子长成,但尚未生育)F3=2(最初的兔子开始生育)Fn=Fn-1+Fn-2(兔子数量的通项公式,即每月兔子数等于上两个月兔子数之和)从而形成了如下数列1,1,2,3,5,8,13,21,34,55,38第3
21、8页/共44页#include using namespace std;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;39第39页/共44页应用举例例3-15鸡兔同笼 鸡和兔子关在一个笼子里,已知共有头36个,脚100个,求笼内关了多少只兔子和多少只鸡?分析:每只鸡有两只脚,每只兔子有四只脚,由题意得到如下方程:鸡的数目2兔子数目4100鸡的数目兔子
22、数目3640第40页/共44页穷举法对所有可能情况一一测试,从中找出符合条件的(一个或一组)解,或得出无解的结论。算法如下:chicken=0;while(chicken=36)尝试是否满足两个方程,如是则输出解chicken,rabbit 准备下一轮尝试 chicken+;41第41页/共44页#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-chicken*2)/4;cout鸡:chicken 兔:rabbitendl;chicken+;return 0;42第42页/共44页结结束束语语学好程序设计语言的唯一途径是 你的编程能力与你在计算机上投入的时间成 43第43页/共44页44感谢您的观看!第44页/共44页