第3章程序控制结构.ppt_第1页
第3章程序控制结构.ppt_第2页
第3章程序控制结构.ppt_第3页
第3章程序控制结构.ppt_第4页
第3章程序控制结构.ppt_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三章 程序的控制结构,2,教学目标,(1) 理解控制语句的作用和分类,掌握相关语句的使用方法; (2) 了解使用伪代码或流程图描述算法的方法。,3,/交互式输入a,程序输出 你输入的是a /交互式输入b,程序输出 你输入的是b /交互式输入c,程序输出 你输入的是c /其他输入,输出 你输入的肯定不是a,b,c #include #include using namespace std; int main() char ch; coutch;,4,switch (ch) case a : cout你输入的是a endl; break; case b : cout你输入的是b endl; br

2、eak; case c : cout你输入的是c endl; break; default : cout输入的肯定不是a,b,cendl; break; system(pause); return 0; ,5,基本内容,3.1 基本控制结构 3.2 选择结构 3.3 循环结构,6,3.1 基本控制结构,三大基本程序结构: 顺序结构:程序是按程序语句或模块在执行流中的顺序逐个执行。 选择结构:程序是按设定的条件实现程序执行流的多路分支。 循环结构:程序是按给定的条件重复地执行指定的程序段或模块。 结论:理论上已经证明,用以上三种基本程序结构的组合可以实现任何复杂的算法。,7,三大基本结构示意图,

3、顺序结构 选择结构,循环结构,模块(语句)A,模块(语句)B,条件,程序模块1,成立,不成立,程序模块2,条件,程序模块,不成立,成立,(当型循环),程序模块,成立,不成立,条件,(直到型循环),8,顺序结构的实现,r = p; p = q; q = r;,9,例 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

4、 endl; return 0; ,10,3.2 选择结构,C/C+语言中实现选择结构的语句形式主要有两种: if语句 switch语句,11,1. if语句,一路分支: if (表达式) 语句序列,条件?,成立,不成立,语句序列,两路分支: if (表达式) 语句序列1 else 语句序列2,条件?,语句序列 1,成立,不成立,语句序列 2,语句序列可以是一个语句,也可以是用花括号括起来的复合语句结构,12,例 3-2:判断成绩是否及格,#include using namespace std; int main() int i; couti; if(i=60) cout及格endl; el

5、se cout不及格endl; return 0; ,13,例 3-3:求一元二次方程的根,#include #include using namespace std; int main() double a, b, c, delta, p, q; cout a b c; if( a=0 ) ,14,2. switch语句,多路(开关)选择语句 : switch (表达式) case 数值1: 语句序列1; case 数值2: 语句序列2; case 数值3: 语句序列3; default: 语句序列n; ,15,实现真正的多路选择,在每一个case模块的最后加上一个break语句,16,例3

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

7、k; case 7: cout中等endl; break; case 6: cout及格endl; break; default: cout不及格endl; return 0; ,18,3.3 循环结构,C/C+语言中实现循环结构的语句形式主要有三种: while语句 do-while语句 for语句,19,while语句|do-while语句,当型循环 while (表达式) 语句序列 ,直到型循环 do 语句序列 while (表达式);,循环体,循环体,条件?,语句序列,成立,不成立,语句序列,不成立,成立,条件?,20,例 3-4:使用while语句计算1+2+3+100,#inclu

8、de 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; ,21,例 3-5:使用do-while语句计算1+2+3+100,#include using namespace std; int main() int i=1, sum=0;/ 循环初始条件 do sum=sum+i;/ 累加求和 i+;/ 改变循环条件 while(i=100); cout 1+2+3+100=sumen

9、dl; return 0; ,22,Do while 和while的区别,#include using namespace std; int main() int i=121;/ 不满足while条件 do cout“这个可以输出”endl while(i=100); System(“pause”); return 0; ,23,#include using namespace std; int main() int i=121;/ 不满足while条件 while(i=100) cout“这个不可以输出”endl System(“pause”); return 0; ,Do while 和w

10、hile的区别,24,for语句,for语句用来实现计数循环: for (表达式1; 表达式2; 表达式3) 语句1; 语句2; 语句n; ,25,例 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; ,26,例 3-7:制作乘法表-多重循环结构(循环的嵌套),#include using namespace std; int main() int

11、 i, j; for(i=1; i10; i+) for(j=1; j=i; j+) cout j * i =i*j t; cout endl; return 0; ,27,九九乘法表输出,1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24

12、4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*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,28,输出26个英文字母,using namespace std; int main() char ch=a; char ch1; int i; for (i=0;i26;i+) ch1=ch+i; coutch1endl; system(pause); return 0; ,29,扩展阅读,3.4 其他控制转移语句 3.4.1 switch语句(点击见前) 3.4.2 转向语句 break语句、con

13、tinue语句、 goto语句 3.4.3 问号表达式 表达式1 ?表达式2 :表达式3,30,上机指导,3.5 运行错误 常见的编程错误主要分为两类: (1) 编译、连接错误: 当程序中有语法错误或函数调用出错时就会出现。可通过+编译和连接程序来改正。 (2) 运行错误: 一种是逻辑错误, 即程序的实际运行结果和编程者对程序结果的期望不符; 另一种仍是程序设计上的错误, 但是躲过了编译程序和连接程序的检查, 通常表现为突然死机、自行热启动或者输出信息混乱。,31,应用举例,例3-10计算保险经纪人月薪 假定每一名保险经纪人的月工资都由三部分组成: 底薪奖金业务提成。 1)奖金的颁发方法为:

14、如果经纪人已经在公司工作7年以下(含7年),奖金为每年10元; 如果经纪人已经在公司工作7年以上,奖金为每年20元。 2)业务提成的颁发方法为: 如果经纪人该月销售额在9999元以下(含9999元),没有提成; 如果经纪人该月销售额在1000049999元之间,可得到3的提成; 如果经纪人该月销售额超过50000元(含),可得到5提成。 编程要求:当用户按照屏幕提示分别输入经纪人的底薪、工龄以及当月销售额后,程序计算并输出经纪人的月薪。,#include using namespace std; int main() /声明部分,定义程序中将用到的变量 double baseSalary, b

15、onus, totalSale, additionalBonus, Salary; int serviceYears; coutbaseSalary; coutserviceYears; /计算奖金bonus if(serviceYears totalSale; /计算提成additionalBonus if(totalSale 10000) additionalBonus=0; else if(totalSale 50000) additionalBonus=totalSale*(0.03); else additionalBonus=totalSale*(0.05); /计算经纪人的月薪S

16、alary Salary = baseSalary+ bonus+ additionalBonus; cout该经纪人的月薪为:Salaryendl; return 0; ,33,应用举例,例3-11编写计算阶乘n!的程序。 n! = 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; ,34,应用举

17、例,例3-10 计算自然常数e的值,算 法 分 析,这是个级数计算问题,求n+1项累加和;用循环实现。循环终止的条件是 第n项可以写成 u = u / n,即 累加和放在e中,可以写成 e = e + u 要设一个计数器n,每循环一次, n = n + 1,/ 例 3-12:计算常数e的值 #include using namespace std; int main() double e = 1.0; int n= 0; double u = 1.0; do n +; u = u/n; e = e+u; while(u=1.0E-6); cout e = e ( n = n ) endl; r

18、eturn 0; ,37,应用举例,例 3-13:求水仙花数 如果一个三位数的个位数、十位数和百位数的立方和等于该数自身,则称该数为水仙花数。编一程序求出所有的水仙花数。 153 = 13 + 53 + 33 370 = 33 + 73 + 03 371 = 33 + 73 + 13 407 = 43 + 03 + 73,算法分析,用穷举法对100999之间的每个数进行验证。 验证公式为: hdn= h3 + d3 + n3 如何分解一个3位数的百位、十位和个位?是关键! 百位 = n / 100 整除100,丢弃小数 十位 = (n / 10 )% 10 整除10,得百十位。再对10取余数,

19、得十位数 个位 = n % 10 n对10取余数,得个位 例: 371 h = 371/100 = 3 d = (371/10)%10 = 37 % 10 = 7 n = 371 % 10 = 1,#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 = n%10; / 取出n的个位数 if(n=i*i*i+j*j*j+k*k*k) cout n = i3 + j3 +k3endl; ret

20、urn 0; ,40,作业:求出100150内的所有回文数(即正读与反读大小相同的数)。如101,111,121都是回文数。使用while语句。,41,应用举例,例 3-14:计算斐波那契数列 一对兔子从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如所有的兔子都不会死,求前24个月中每月的兔子数。 F1 = 1(最初的一对兔子) F2 = 1(第2个月,最初的一对兔子长成,但尚未生育) F3 = 2(最初的兔子开始生育) Fn = Fn-1+Fn-2 (兔子数量的通项公式,即每月兔子数等于上两个月兔子数之和) 从而形成了如下数列 1,1,2,3,5,8,13,

21、21,34,55,,42,#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; ,43,应用举例,例3-15鸡兔同笼 鸡和兔子关在一个笼子里,已知共有头36个,脚100个,求笼内关了多少只兔子和多少只鸡? 分析:每只鸡有两只脚,每只兔子有四只脚,由题意得到如下方程:

22、鸡的数目2兔子数目4100 鸡的数目兔子数目36,44,穷举法,对所有可能情况一一测试,从中找出符合条件的(一个或一组)解,或得出无解的结论。 算法如下: chicken=0; while(chicken=36) 尝试是否满足两个方程,如是则输出解chicken, rabbit 准备下一轮尝试 chicken+; ,45,#include using namespace std; int main() int rabbit=0; int chicken=0; while(chicken=36) if(100-chicken*2)%4=0) ,46,更容易理解的代码,#include using

23、 namespace std; int main() int chicken=0; while(chicken=36) if(chicken*2+(36-chicken)*4=100) cout鸡的数量是: chicken兔子数量是:36-chickenendl; chicken+; system(pause); return 0; ,47,案例1 三个数的排序,#include using namespace std; int main() int a,b,c,temp; coutabc; if(ba) temp=a; a=b; b=temp; ,48,if(ca) temp=a; a=c;

24、 c=temp; if(cb) temp=b; b=c; c=temp; cout这三个整数从小到大排序结果是:atbtcendl; return 0; ,49,案例2 打印3 个相邻的字母,#include using namespace std; int main() char ch; coutch; cout三个相邻的字母是:;,50,switch(ch) case A: coutZAB; break; case a: coutzab; break; case Z: coutYZA; break;,51,case z: coutyza; break; default: coutchar(

25、ch-1)chchar(ch+1); coutendl; return 0; ,52,案例3 算术四则运算,#include using namespace std; int main() double x, y, z; / 操作数1, 操作数2, 运算结果 char op; / 运算符号 coutxopy; switch(op) case +: z=x+y; break;,53,case -: z=x-y; break; case *: z=x*y; break; case /: z=x/y; break; default : return 1; cout计算结果: xopy=zendl;

26、return 0; ,54,案例4 歌唱大赛选手成绩计算,#include using namespace std; int main() double max,min,sum,score; int i; sum=0; max=-1; /设一个最小数 min=9999; /设一个最大数 cout请输入10 个评委的打分:;,55,for(i=1;iscore; sum=sum+score; if(scoremax)max=score; if(scoremin)min=score; cout该选手的最后得分:(sum-max-min)/8)endl; return 0; ,56,案例5 猴子吃桃

27、问题,#include using namespace std; int main() int x=1; for(int day=9; day0; day-) x=(x+1)*2; cout第一天猴子摘的桃子数为:xendl; return 0; ,57,案例6 小学生算术加法测试,#include #include #include using namespace std; int main() int k,total=0,x,y,z; srand( (unsigned)time( NULL ) ); cout*小学生算术加法测试*endlendl;,58,for(k=1; kz; if(x

28、+y=z) cout正确,继续下一题endl; total+=10; ,59,else coutz; if(x+y=z) cout正确,继续下一题endl; else cout又错了,继续下一题endl; coutendl本次测试得分:totalendl; return 0; ,60,案例7 探寻前世今生,#include using namespace std; int main() int birthday, sum, i; coutbirthday; while(birthday = 10) ,61,sum=0; while(birthday 0) i=birthday%10; sum=

29、sum+i; birthday=birthday/10; birthday=sum; ,62,switch(birthday) case 1: cout你上辈子是神仙,恭喜!endl; break; case 2: cout你上辈子是皇帝或国王,曾经的陛下!endl; break; case 3: cout你上辈子是贵族,恭喜!endl; break; case 4: cout你上辈子是读书人,子曾经曰过!endl; break;,63,case 5: cout你上辈子是有钱人,这辈子怎么样?endl; break; case 6: cout你上辈子是穷人,珍惜现在的生活吧!endl; bre

30、ak; case 7: cout你上辈子是非人类,还是很恐怖的!endl; break; case 8: cout你上辈子是演员,好丰富的人生啊!endl; break;,64,case 9: cout你上辈子是出家人,阿弥陀佛!endl; break; default : cout这怎么可能,除非你上辈子是基督,Jesus!endl; return 0; ,65,案例8 搬砖问题,#include using namespace std; int main() int men, women, children; men=0; while(men8) women=0;,66,while(women11) children=36-men-women; if(4*men+3*women+children/2=36) cout男人:men,女

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论