




已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章 程序的控制结构,3,教学目标,(1) 理解控制语句的作用和分类,掌握相关语句的使用方法; (2) 了解使用伪代码或流程图描述算法的方法。,4,基本内容,3.1 基本控制结构 3.2 选择结构 3.3 循环结构,5,3.1 基本控制结构,三大基本程序结构: 顺序结构:程序是按程序语句或模块在执行流中的顺序逐个执行。 选择结构:程序是按设定的条件实现程序执行流的多路分支。 循环结构:程序是按给定的条件重复地执行指定的程序段或模块。 结论:理论上已经证明,用以上三种基本程序结构的组合可以实现任何复杂的算法。,6,三大基本结构示意图,顺序结构 选择结构,循环结构,模块(语句)A,模块(语句)B,条件,程序模块1,成立,不成立,程序模块2,条件,程序模块,不成立,成立,(当型循环),程序模块,成立,不成立,条件,(直到型循环),7,顺序结构的实现,r = p; p = q; q = r;,8,例 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; ,9,3.2 选择结构,C/C+语言中实现选择结构的语句形式主要有两种: if语句 switch语句,10,1. if语句,一路分支: if (表达式) 语句序列,条件?,成立,不成立,语句序列,两路分支: if (表达式) 语句序列1 else 语句序列2,条件?,语句序列 1,成立,不成立,语句序列 2,语句序列可以是一个语句,也可以是用花括号括起来的复合语句结构,11,例 3-2:判断成绩是否及格,#include using namespace std; int main() int i; couti; if(i=60) cout“及格“endl; else cout“不及格“endl; return 0; ,12,例 3-3:求一元二次方程的根,#include #include using namespace std; int main() double a, b, c, delta, p, q; cout a b c; if( a=0 ) ,13,2. switch语句,多路(开关)选择语句 : switch (表达式) case 数值1: 语句序列1; case 数值2: 语句序列2; case 数值3: 语句序列3; default: 语句序列n; ,14,实现真正的多路选择,在每一个case模块的最后加上一个break语句,15,例3.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; break; case 7: cout“中等“endl; break; case 6: cout“及格“endl; break; default: cout“不及格“endl; return 0; ,17,3.3 循环结构,C/C+语言中实现循环结构的语句形式主要有三种: while语句 do-while语句 for语句,18,while语句 | do-while语句,当型循环 while (表达式) 语句序列 ,直到型循环 do 语句序列 while (表达式);,循环体,循环体,条件?,语句序列,成立,不成立,语句序列,不成立,成立,条件?,19,例 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; ,20,例 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=“sumendl; return 0; ,21,for语句,for语句用来实现计数循环: for (表达式1; 表达式2; 表达式3) 语句1; 语句2; 语句n; ,22,例 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; ,23,例 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; ,24,九九乘法表输出,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 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,25,扩展阅读,3.4 其他控制转移语句 3.4.1 switch语句(点击见前) 3.4.2 转向语句 break语句、continue语句、 goto语句 3.4.3 问号表达式 表达式1 ?表达式2 :表达式3,26,上机指导,3.5 运行错误 常见的编程错误主要分为两类: (1) 编译、连接错误: 当程序中有语法错误或函数调用出错时就会出现。可通过+编译和连接程序来改正。 (2) 运行错误: 一种是逻辑错误, 即程序的实际运行结果和编程者对程序结果的期望不符; 另一种仍是程序设计上的错误, 但是躲过了编译程序和连接程序的检查, 通常表现为突然死机、自行热启动或者输出信息混乱。,27,应用举例,例3-10 计算保险经纪人月薪 假定每一名保险经纪人的月工资都由三部分组成: 底薪奖金业务提成。 1)奖金的颁发方法为: 如果经纪人已经在公司工作7年以下(含7年),奖金为每年10元; 如果经纪人已经在公司工作7年以上,奖金为每年20元。 2)业务提成的颁发方法为: 如果经纪人该月销售额在9999元以下(含9999元),没有提成; 如果经纪人该月销售额在1000049999元之间,可得到3的提成; 如果经纪人该月销售额超过50000元(含),可得到5提成。 编程要求:当用户按照屏幕提示分别输入经纪人的底薪、工龄以及当月销售额后,程序计算并输出经纪人的月薪。,#include using namespace std; int main() /声明部分,定义程序中将用到的变量 double baseSalary, bonus, 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); /计算经纪人的月薪Salary Salary = baseSalary+ bonus+ additionalBonus; cout“该经纪人的月薪为:“Salaryendl; return 0; ,29,应用举例,例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; ,30,应用举例,例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; return 0; ,33,应用举例,例 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取余数,得十位数 个位 = 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“ = “i“3 + “j“3 +“k“3“endl; return 0; ,36,应用举例,例 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,,37,#include using namespace std; int main() int f1=1; int f2=1; int i; for(i=1; i=12; i+) coutf1“t“f2“t“; f1=f1+f2; / 赋值号左边的f1代表第3个数,是第1、2个数之和 f2=f2+f1; / 赋值号左边的f2代表第4个数,是第2、3个数之和 coutendl; return 0; ,38,应用举例,例3-15 鸡兔同笼 鸡和兔子关在一个笼子里,已知共有头36个,脚100个,求笼内关了多少只兔子和多少只鸡? 分析:每只鸡有两只脚,每只兔子有四只脚,由题意得到如下方程: 鸡的数目2兔子数目4100 鸡的数目兔子数目36,39,穷举法,对所有可能情况一一测试,从中找出符合条件的(一个或一组)解,或得出无解的结论。 算法如下: chicken=0; while(chicken=36) 尝试是否满足两个方程,如是则输出解chicken, rabbit 准备下一轮尝试 chicken+; ,40,#include using namespace std; int main() int rabbit=0; int chicken=0; while(chicken=36) if(100-chicken*2)%4=0) ,41,案例:谁打烂了玻璃?,有四个小孩踢皮球,不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 粘土砖瓦市场营销策略考核试卷
- 稀有稀土金属压延加工质量控制技术考核试卷
- 民宿的设计与开发
- 空气呼吸器的使用方法
- 耳缘静脉麻醉技术规范
- 外科消毒隔离管理规范
- 慢性疾病防治与管理要点
- 眼睑肿物切除皮瓣设计
- trans-Clopenthixol-E-Clopenthixol-生命科学试剂-MCE
- BMS-309403-Standard-生命科学试剂-MCE
- 专利技术成果转让证明书(7篇)
- 广东省广州市番禺区2020年七年级第二学期期末区统考试卷(含答案)
- 药物研发自动化-全面剖析
- 股权回购合同协议书范本6篇
- 课程思政说课公务员制度讲座情境创设下双线四点的课程思政融入设计
- 2024年卫生管理领军者考试试题及答案
- 饲料行业粉尘防爆
- 预制菜烹饪知识培训课件
- 大规模网络流量分析技术-全面剖析
- 2024年陕西省中考地理试卷【含答案】
- 新版人教版七年级英语下1-6单元复习教案
评论
0/150
提交评论