《计算机程序设计基础精讲多练CC第3章.ppt》由会员分享,可在线阅读,更多相关《计算机程序设计基础精讲多练CC第3章.ppt(46页珍藏版)》请在三一办公上搜索。
1、第三章 程序的控制结构,3,教学目标,(1)理解控制语句的作用和分类,掌握相关语句的使用方法;(2)了解使用伪代码或流程图描述算法的方法。,4,基本内容,3.1 基本控制结构3.2 选择结构3.3 循环结构,5,3.1 基本控制结构,三大基本程序结构:顺序结构:程序是按程序语句或模块在执行流中的顺序逐个执行。选择结构:程序是按设定的条件实现程序执行流的多路分支。循环结构:程序是按给定的条件重复地执行指定的程序段或模块。结论:理论上已经证明,用以上三种基本程序结构的组合可以实现任何复杂的算法。,6,三大基本结构示意图,顺序结构选择结构,循环结构,模块(语句)A,模块(语句)B,条件,程序模块1,
2、成立,不成立,程序模块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语
3、句,一路分支:if(表达式)语句序列,条件?,成立,不成立,语句序列,两路分支:if(表达式)语句序列1 else 语句序列2,条件?,语句序列 1,成立,不成立,语句序列 2,语句序列可以是一个语句,也可以是用花括号括起来的复合语句结构,11,例 3-2:判断成绩是否及格,#include using namespace std;int main()int i;couti;if(i=60)cout及格endl;elsecout不及格endl;return 0;,12,例 3-3:求一元二次方程的根,#include#include using namespace std;int main()
4、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。计算结果应该是唯一的。
5、转换后应从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语句
6、,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+10
7、0,#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;,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;/累
8、加求和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=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*5=10 3*5=15 4*5=20 5*5=251*6=6 2*6=12 3*6=18 4
9、*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,25,扩展阅读,3.4 其他控制转移语句3.4.1 switch语句(点击见前)3.4.2 转向语句break语句、continue语句、goto语句3.4.3 问号表达式表达式1?表达式2:表达式3,26,上机指导,3.5 运行错误常
10、见的编程错误主要分为两类:(1)编译、连接错误:当程序中有语法错误或函数调用出错时就会出现。可通过+编译和连接程序来改正。(2)运行错误:一种是逻辑错误,即程序的实际运行结果和编程者对程序结果的期望不符;另一种仍是程序设计上的错误,但是躲过了编译程序和连接程序的检查,通常表现为突然死机、自行热启动或者输出信息混乱。,27,应用举例,例3-10计算保险经纪人月薪 假定每一名保险经纪人的月工资都由三部分组成:底薪奖金业务提成。1)奖金的颁发方法为:如果经纪人已经在公司工作7年以下(含7年),奖金为每年10元;如果经纪人已经在公司工作7年以上,奖金为每年20元。2)业务提成的颁发方法为:如果经纪人该
11、月销售额在9999元以下(含9999元),没有提成;如果经纪人该月销售额在1000049999元之间,可得到3的提成;如果经纪人该月销售额超过50000元(含),可得到5提成。编程要求:当用户按照屏幕提示分别输入经纪人的底薪、工龄以及当月销售额后,程序计算并输出经纪人的月薪。,#include using namespace std;int main()/声明部分,定义程序中将用到的变量double baseSalary,bonus,totalSale,additionalBonus,Salary;int serviceYears;coutbaseSalary;coutserviceYears
12、;/计算奖金bonusif(serviceYears totalSale;/计算提成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;,29,应用举例,例3-11编写计算阶乘n!的程
13、序。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的值#includ
14、e 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;,33,应用举例,例 3-13:求水仙花数如果一个三位数的个位数、十位数和百位数的立方和等于该数自身,则称该数为水仙花数。编一程序求出所有的水仙花数。153=13+53+33370=33+73+03371=33+73+13407=43+03+73,算法分析,用穷举法对100999之间的每个数进行验证。验证公式为:hdn=h3+d3+n3如何分解一
15、个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,#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
16、+j3+k3endl;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
17、=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;,38,应用举例,例3-15鸡兔同笼 鸡和兔子关在一个笼子里,已知共有头36个,脚100个,求笼内关了多少只兔子和多少只鸡?分析:每只鸡有两只脚,每只兔子有四只脚,由题意得到如下方程:鸡的数目2兔子数目4100鸡的数目兔子数目36,39,穷举法,对所有可能情况一一测试,从中找出符合条件的(一个或一组)解,或得出无解的结论。算法如下:chicken=0;w
18、hile(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,案例:谁打烂了玻璃?,有四个小孩踢皮球,不小心打烂了玻璃,老师问是谁干的。A说:不是我B说:是CC说:是DD说:他胡说 现已知3个小孩说的是真话,一个小孩是假话。根据这些信息,编程找出打烂玻璃的孩子。,教学设问 如何求解逻辑问题?如何根据案例的
19、问题描述给出对应的数学模型?用什么样的控制结构能够从许多种可能性中找出其中的一种或多种正确的解?,打烂玻璃者为:C,*更多案例见本书配套教材C/C+语言程序设计案例教程 罗建军等编著,清华大学出版社,A说:不是我B说:是CC说:是DD说:他胡说现已知3个人说的是真话,一个人是假话。,数学模型,k!=1k=3k=4k!=4,(k!=1)+(k=3)+(k=4)+(k!=4)=3,设变量k表示打烂玻璃的孩子,按照这4种状态假定,逐一测试4个人的话有几个为真,如果不满3句为真,就否定这一假定,换下一个状态来试,44,#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;,45,进一步思考,考虑更加一般的情况,即本案例出现没有解或有多个解,要为上面的程序增加什么机制,怎么修改程序?如果题目改为有3个小孩说假话,1个小孩说真话,则打烂玻璃的孩子又是谁?,46,学好程序设计语言的唯一途径是 你的编程能力与你在计算机上投入的时间成,结束语,上机练习,正比,