C面向对象程序第3章.ppt
C+面向过程程序设计,授课老师:李晓平,第3章 程序结构和流程控制语句,本章要点3.1 程序的三种基本结构和语句 3.2 分支语句 3.3 循环语句 3.4 控制程序执行顺序的语句 3.5 程序设计举例,3.1程序的基本结构和语句,3.1.1程序的基本结构 1.顺序结构顺序结构程序的执行顺序就是程序的书写顺序,是三种程序结构中最简单的程序结构,也是最基本的结构其他结构完成后最终要回归至顺序结构上继续执行,直到程序结束。其程序的书写格式为:S1;S2;Sn;该程序的执行顺序是:S1,S2,Sn。,图3-1(a)为顺序结构流程图,图3-1(b)为其N-S流程图。,2.分支结构,在两种可能的操作中按一定条件选取一个执行的结构称为分支结构。图3-2(a)为分支结构流程图,图3-2(b)为其N-S流程图。,3.循环结构,被重复执行的语句或复合语句称为循环体。每重复执行一次,都必须做出是否继续重复或是停止的决定,这个决定所依据的条件称为循环控制条件或循环控制表达式,其中关键性的变量又称为循环控制变量。图3-3(a)为循环结构流程图,图3-3(b)为其N-S流程图。,3.2 选择结构,思考:编程实现从键盘上输入一个数?编程实现从键盘上输入一个数,判断其正负,是正数则输出“正数”。结论:在程序中如果需要根据判断条件才能确定做什么时我们要用到选择结构,3.2.1选择结构中if语句,3.2.1 if 语句if 语句是专门用来实现选择型结构的语句。if 语句有3种形式.1.单分支语句语句格式:if(表达式)语句执行过程:当表达式的值为非0(真)时,执行语句,否则不执行语句。说明:(1)表达式必须用“()”括起来;(2)语句只能是单个语句或复合语句,图3-5 单分支语句流程图,【例3-1】编写一个if语句的简单程序,#include stdafx.h#include stdio.h#include iostream.hvoid main()int x;coutx;if(x0)cout此数为正整数。,2.双分支语句,语句格式:if()else,【例3-2】编写一个判断闰年的程序。,#include stdafx.h#include stdio.h#include iostream.hvoid main()int year;coutyear;if(year%4=0 程序执行后输出结果如下:请输入一个年份:2006 2006年不是闰年。,3.多分支语句,多分支语句的格式为:if()else if()else if()else,4、if语句的嵌套,在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下:If(条件)if(条件)语句1;else 语句2;Else if(条件)语句3;else 语句4;注意:else总是与离它最近的没有配对的if配对。也可以加括号确定配对关系。,知识点总结,If 语句中条件必须用括号括起来,而必须是一个关系表达式或逻辑表达式If语句与else必须配对当要执行的语句是多条时要用大括号括起形成复合语句,习题巩固,例题巩固分析此程序的结果是否正确?如不正确该如何改写程序1:#includeVoid main()int x,y;cinx;If(x0)y=-1;Else if(x=0)y=0;Else y=1;Coutxy;,例题巩固分析此程序的结果是否正确?如不正确该如何改写#includeVoid main()int x,y;cinx;if(x=0)if(x0)y=1;else y=0;Else y=-1;,例题巩固分析此程序的结果是否正确?如不正确该如何改写#includeVoid main()int x,y;cinx;Y=-1;if(x!=0)if(x0)y=1;else y=0;,例题巩固分析此程序的结果是否正确?如不正确该如何改写#includeVoid main()int x,y;cinx;y=0;if(x=0)if(x0)y=1;else y=-1;,3.2.2 switch语句,1.switch语句switch语句是多分支选择语句。switch语句的语法形式如下:switch(表达式)case常量表达式1:语句1 break;case常量表达式2:语句2 break;case常量表达式n:语句n break;default:语句n+1,实例程序:,当情况变量i为1时,输出字符串case 1,为2时输出字符串case 2等,当情况不是1或2或3时,输出字符串default#include stdafx.h#include stdio.h#include iostream.hvoid main()int i;couti;switch(i)case 1:coutcase 1endl;break;case 2:coutcase 2endl;break;case 3:coutcase 3endl;break;default:coutdefaultendl;getchar();,知识点总结:,(1)switch后面括号内的表达式只能是整型表达式或字符型表达式。与其对应,case之后的常量表达式也应为整型常量表达式或字符型常量表达式;(2)每个case后面的常量表达式的值必须互不相同;(3)各个case和default的出现次序不影响执行结果;(4)一个case后可以包含多个语句,并且这多个语句不必用花括号括起来,程序会自动顺序执行该case后面的所有语句;一个case后面也可以没有任何语句。,2.break语句在switch语句中的作用,当在switchcase语句中使用break语句时,会引起程序流程由switch结构体退出。控制转向switch结构末尾的第一条语句。如果没有使用break语句,控制转向下一个case语句,执行switch结构中其余的语句。,switch语句的嵌套使用,#include stdafx.h#include stdio.h#include iostream.hvoid main()int a,b;type whattobuy;flowercolor color;couta;switch(a)case 0:,coutb;switch(b)case 0:coutred flowerendl;break;case 1:coutblue flowerendl;break;case 2:coutwhite flowerendl;break;,case 3:coutblack flowerendl;4:coutgreen flowerendl;break;default:coutSorry,which color?endl;break;default:coutSorry,what do you want?endl;getchar();,运行结果,选择结构习题,输入两个运算量及一个运算符,输出运算结果。这相当于计算器计算,1、某运输公司的运费标准如下:(1)当运输距离s=300 公里时:货重w=6时,按92%收费;(2)当运输距离s=6时,按94%收费;写程序前,设p为每吨每公里的运费,s,w,p为输入数据(均为整数)cost(输出)为向用户收取的费用。2、输入两个正整数a,b。b最大不超过三位数,a不大于31。使a在左,b在右,拼接成一个新的数c。例如:a2,b16,则c216;若a18,b476,则c18476。3、任意输入三个数代表三角形的三边长,看这三边能否组成三角形。,3.3循环语句,思考:如何实现在屏幕上输出1个星型符号?如何实现在屏幕上输出5个星型符号?如何实现在屏幕上输出100个星型符号?结论:当重复执行相同语句时,要进行循环。,3.3.1 while循环语句,while()循环语句又称为前判循环语句或while()循环语句。while()语句的一般格式:while(条件表达式)循环体语句;while循环由4个部分组成:(1)循环变量初始化(2)继续条件(3)循环体(4)改变循环变量的值,例:求1+2+3+100,i=1;循环变量初始化while(i=10)继续条件循环体sum=sum+i;i+;改变循环变量的值,用while语句求累加和:S=1+2+2+4+n,程序流程图,程序代码,#include stdafx.h#include stdio.h#include iostream.hvoid main()int i,n,sum;coutn;sum=0;i=1;while(i=n)sum=sum+i;i+;coutsum=sumendl;getchar();,程序执行后提示:,Please input an integer:100sum=5050,知识点总结:,(1)while语句是先判断表达式in是否成立,若条件成立,则将sum加i后赋给sum及i增加1;若条件不成立,则不执行相应语句,退出循环。(2)当表达式的值一开始不成立,语句一次也不执行。如当输入n为0时,in不成立,语句sum=sum+i;和i+;一次也不执行。(3)在循环体中应有能不断修改循环条件的语句,最终能使循环结束,否则会形成“死循环”。如i+;语句,使i不断加1,直到大于n为止。,例题巩固编写检验一个正整数n是否为素数的程序,分析:素数就是除了1和其本身之外,不能被其他数整除的数。要检验一个正整数n是否是素数,可以用2到n-1对n进行模除取余运算,如果余数为零则表明该数被某个数整除了,不是素数;否则表明该数是素数。如果一个正整数n不是素数,除了输出“这个数不是个素数!”的提示字符串外,还应用break语句从循环体内退出。在循环语句的后继语句还要判定循环控制变量i是否与n相等,如果相等,表示n是个素数,输出“这个数是个素数!”的字符串;否则不是素数,而是中途从循环体内退出来的。,程序代码,#include stdafx.h#include stdio.h#include iostream.hvoid main()int n,i=1;coutn;while(+in)if(n%i=0)cout这个数不是个素数!endl;break;if(i=n)cout这个数是个素数!endl;getchar();,3.3.2 do-while语句,1.do-while循环语句其一般格式:do循环体语句;while(表达式);,2.do-while循环语句的执行过程,do-while循环语句的执行过程:(1)先执行循环体。在循环体内应有对循环控制变量进行修改的操作。(2)检测循环控制表达式的值。若其值为非零(真),则再一次执行循环体,否则退出循环,控制流程转向do-while语句的后继语句继续执行。,例题巩固:1、输入一个非负数,将各位数字反转后输出,#include stdafx.h#include stdio.h#include iostream.hvoid main()int n,x;coutn;cout此数反转后为:endl;dox=n%10;coutx;n/=10;while(n!=0);coutendl;getchar();,2、求一个由键盘输人的整数的阶乘程序,分析:2!=1*2;3!=1*2*3;n!=1*2*3*(n-1)*n。求一个由键盘给定数的阶乘就是以给定n作为循环控制变量,达到计算阶乘的目的。,程序代码,#include stdafx.h#include stdio.h#include iostream.hvoid main()int i=1,f=1,n;coutn;do f=f*i;i=i+1;while(i=n);coutn!=fendl;getchar();,3.3.3 for语句,1.for循环语句for语句的一般格式:for(表达式1;表达式2;表达式3)循环体语句;其中:for是for循环语句的关键字;表达式1通常是赋值语句,可以实现对多个变量(用逗号运算符分隔成逗号运算表达式)进行赋初值;表达式2通常是关系表达式或逻辑表达式,它在每次循环之前,用于对循环控制条件的检测,表达式2为非零时执行循环体,否则退出循环,执行该循环语句的后继语句;表达式3是一般表达式用于循环控制条件变量的修改。循环体语句是for循环语句的循环体,可以是单个语句,也可以是复合语句。,2.for语句的执行过程,for语句的执行过程:(1)先对表达式1进行计算。一般是赋值。(2)检测表达式2。如果循环控制条件表达式值为真,则执行循环体,否则退出循环。(3)表达式3一般不在循环体内,而在for后的括号内,每次执行完循环体就转入对表达式3的修改操作;接着对表达式2进行检测以决定是否继续进行循环。,例:使用for循环求1100之间的质数,#include stdafx.h#include stdio.h#include iostream.hvoid main()int i,j,k,flag;for(i=2;i=100;i+)flag=1;k=i/2;for(j=2;j=k;j+)if(i%j=0)flag=0;break;if(flag)couti;coutendl;getchar();,3.3.4 三种循环语句的比较,(1)while语句和for语句都是先判断循环条件表达式的值,后执行循环体语句:而do-while语句是先执行循环体语句,后判断循环条件表达式的值。(2)while语句、do-while语句和for语句都是循环条件表达式为真时重复执行循环体语句,循环条件表达式为假时结束循环。(3)当第一次执行while语句或for语句时,循环条件表达式就是假,则一次也不执行循环体语句:而当第一次执行do-while语句时,循环条件表达式就是假,也要执行一次循环体语句。也就是说,do-while语句至少执行一次循环体,而while语句和for语句有可能一次也不执行循环体。(4)while语句和for语句用来构成“当型”循环结构:do-while语句用来构成“直到型”循环结构。(5)在循环体语句至少执行一次的情况下,三种循环语句构成的循环结构可以相互转换。实际上,用得最多的是for语句,其次是while语句,而do-while语句相对于前两种语句则用得较少。,while和do-While循环语句的比较,#include stdafx.h#include stdio.h#include iostream.hvoid main()int sum=0,k;coutk;while(kSum=5511Sum=0,#include stdafx.h#include stdio.h#include iostream.hvoid main()int sum=0,k;coutk;dosum+=k;k+;while(kSum=5511Sum=11,3.3.5循环语句的嵌套,循环语句中又包含有循环语句的结构称为循环语句的嵌套。循环语句的嵌套又称多重循环。当一个循环语句的循环体中只含一层循环语句时,称双重循环;若第二层循环语句的循环体中还包含一层循环语句时,称三重循环等。三种循环语句可以互相嵌套。,编写程序,按下列格式输出九九乘法表,1 2 3 4 5 6 7 8 91 12 2 43 3 6 94 4 8 12 165 5 10 15 20 256 6 12 18 24 30 367 7 14 21 28 35 42 498 8 16 24 32 40 48 56 649 9 18 27 36 45 54 63 72 81,分析及流程图,分析:用双循环完成,外层用for语句构成循环,用于控制共输出九行;内层也用for语句构成循环,用于控制每行的输出。程序流程图如图所示。,程序代码,#include stdafx.h#include stdio.h#include iostream.hvoid main()int i,j;cout*t;for(i=1;i=9;i+)coutit;/输出标题行*1 2 3 4.9coutendl;for(i=1;i=9;i+)/外循环控制第一个乘数i从19coutit;for(j=1;ji+1;j+)/内循环控制第二个乘数j从1icouti*jt;/计算并输出每一项i*jcoutendl;/输出完一行后换行getchar();,程序运行结果,编写一程序输出一个菱形图案,#include stdafx.h#include stdio.h#include iostream.hvoid main()int i,j,n=4;for(i=1;i=n;i+)/输出前4行for(j=1;j=20;j+)cout;/图案左侧空20列for(j=1;j=8-2*i;j+)cout;for(j=1;j=4*i-3;j+)cout*;coutendl;,for(i=1;i=n-1;i+)/输出后3行for(j=1;j=20;j+)cout;/图案左侧空20列for(j=1;j=2*i;j+)cout;for(j=1;j=13-4*i;j+)cout*;coutendl;getchar();,运行结果,3.4流程控制语句,3.4.1 break语句break语句是一种具有特殊功能的无条件转移语句,其一般形式是:break;其中,break是关键字,其后的分号是系统要求的。break语句由两个用途:一是可以使流程跳出switch结构,继续执行switch语句下面的语句。二是用在循环语句中,当在循环体执行过程中遇到break语句时,终止循环的执行,中途退出循环,转去执行循环体后的语句。,编程将从键盘上输入的若干个正数求和,遇到负数则终止程序,并且输入的数不超过10个。,#include stdafx.h#include stdio.h#include iostream.hvoid main()int i,num,sum;sum=0;coutnum;if(num0)break;sum+=num;coutsum=sumendl;getchar();,程序执行结果如下:2 4 5-2Sum=11,3.4.2 continue语句,continue语句又称为继续语句,其一般形式是:continue;continue是其关键字,后边的分号是系统要求的。继续语句也是一种具有特殊功能的无条件转移语句。continue语句功能:使循环体内的控制流程转移到包含它的while()、for()、do-while语句的下个循环周期,并根据循环控制表达式的值决定是否再进行循环。也就是说,在循环语句的循环体中,如果执行到continue语句,则跳过循环体中位于continue语句下边的其他语句,将流程转移到下一轮循环周期。,continue语句在三种循环语句中的作用:,while()for(;)do continue;continue;continue;while();,Continue语句应用举例,#include stdafx.h#include stdio.h#include iostream.hvoid main()char c;while(c!=q)/按下q则退出coutc;if(c=c)/当按下c,返回到循环体的开始处continue;coutThe letter is:c;coutendl;getchar();,程序运行界面,3.4.3语句标号和goto语句,1.语句标号其一般形式为::例如:label_1:begin2.goto语句C+语言中的goto语句又称为无条件转移语句,其一般形式是:goto语句标号;,找到满足乘积为50的两个小于10的整数后即输出该数,#include stdafx.h#include stdio.h#include iostream.hvoid main()int i,j;for(i=1;i=10;i+)for(j=1;j=10;j+)if(i*j=50)goto End;End:couti*j=50endl;getchar();程序执行结果如下:5*10=50,3.4.4流程控制函数,exit()函数和abort()函数都是C+的库函数,其功能都是终止程序的执行,将控制返回给操作系统。通常,exit()函数用于正常终止程序的执行,而abort()函数用于异常终止程序的执行。显然,执行到两个函数中的任一个时,都将改变程序的执行次序。当使用这两个函数中的任一个函数时,都应包含头文件stdlib.h。1.exit()函数exit()函数的格式为:exit;,循环结构习题,求两个正整数的最大公约数,3.5程序设计举例,3.5.1选择结构语句应用示例分支语句用于实现分支结构程序设计。能够用分支结构程序解决的常见问题有:比较数的大小、找出若干数中最大值与最小值、分段函数、解一元二次方程、判断闰年、多分支问题。分支语句有if语句和switch语句。1.if 语句if语句又有单选、双选与多选if语句,格式分别为:单选if语句 双选if语句 多选if语句if()if()if()else else if else,把键盘上输入的整数按从大到小的次序输出,#include stdafx.h#include stdio.h#include iostream.hvoid main()int a,b,c,temp;coutabc;if(ab)temp=a;a=b;b=temp;if(ac)temp=a;a=c;c=temp;if(bc)temp=b;b=c;c=temp;couta b cendl;getchar();,程序执行结果及C+程序设计的一般步骤,程序执行结果如下:3 7 47 4 3由上例可知,C+程序设计的一般步骤为:进行数学分析建立求解数学模型;根据数学模型确定程序框架及所用语句;根据数学模型确定所要定义的变量及其数据类型;给变量输入数据;编写计算程序,执行程序得到运算结果;输出运算结果。,从键盘上输入一个学生的三门功课的考试成绩,计算其平均成绩。当平均成绩大于等于90分时,输出优秀;在8089分时输出良好;在7079分时输出中等;在6069分时输出及格;在平均成绩不及格时输出不及格,并提示每门还差多少分才能达到及格分数线。,#include stdafx.h#include stdio.h#include iostream.hvoid main()int p1,p2,p3,sum,ave,corr,need;coutp1p2p3;sum=p1+p2+p3;ave=sum/3;corr=2*(sum%3)-3;,if(corr=0)ave+;cout该学生三门功课考试成绩的平均值是:aveendl;cout该学生的分数等级是:;switch(ave/10)case 9:cout优秀endl;break;case 8:cout良好endl;break;case 7:cout中等endl;break;case 6:cout及格endl;break;default:cout不及格endl;need=60-ave;cout每门还差need分才能达到及格线endl;getchar();,3.5.2循环结构语句应用示例,循环语句用于实现循环结构程序设计。循环语句有while语句、do-while语句和for语句。三种语句的格式如下:while语句 do-while语句 for语句while()do for(;);while();,1.while语句,用do-while循环编程求1+2+3+.+50之和。#include stdafx.h#include stdio.h#include iostream.hvoid main()int i=0,s=0;do s+=i;i+;while(i=50);couts=sendl;getchar();,2.do-while语句,s=-+-+,用累加和的方法求s值,直到最后一项|0.00001为止。#include stdafx.h#include stdio.h#include iostream.hvoid main()int i,t1=1;float s=1.0,t=1,p;i=1;dot=t*i;t1=(-1)*t1;p=t1/t;s=s+p;i+;while(1/t0.00001);couts=sendl;getchar();,程序执行后输出:s=0.367879,3.for语句,验证哥德巴赫猜想。分析:(1)哥德巴赫猜想:任意大于等于6的偶数都可以分解成两个素数之和。(2)编写一个C+语言程序对这一猜想进行验证,而不是证明。(3)对于任意给定的大于6的偶数,先确定一个值较小的素数,再用已确定的素数去减这个偶数,验证其差是否为素数。若其差是素数,即得到了可以分解成两个素数之和的结果;若其差不是素数,应取另一个次小的素数,再验证其差是否是素数,依次类推直到得到验证为止。由于素数属于奇数范畴,所以取奇数作为验证素数的待验证数。,程序代码,#include stdafx.h#include stdio.h#include iostream.hvoid main()int i,j,n,m,f1,f2;coutm;for(i=3;im/2;i+=2)f1=f2=0;for(j=2;ji;j+)if(i%j=0)f1=1;break;,if(f1=1)continue;n=m-i;for(j=2;jn;j+)if(n%j=0)f2=1;break;if(f2=1)continue;else break;cout大于等于6的正偶数m可以分解为两个素数i+n之和endl;getchar();,分析:,有一个等式(A(B3+C)2=8DE9,其中A不等于1。编写一个程序求出上述等式成立时A,B,C,D,E的值。由(A(B3+C)2=8DE9可知,只有93的平方的千位是8,个位是9,即93*93=8649,由此得知D=6,E=4。由A(B3+C)=93,又由于A1,只有A=3。由3(B3+C)=3*31,得知B3+C=31,所以只有C=8,B=2。即求得A=3,B=2,C=8,D=6,E=4。上述求值是用推理的方法得到的,而用计算机求A,B,C,D,E的值,可以用“凑”的方法,即用五层循环,不断改变每层循环控制变量的值,若在对应的A,B,C,D,E的值符合等式要求时,将其输出即可。,程序代码,#include stdafx.h#include stdio.h#include iostream.hvoid main()int a,b,c,d,e,j,k;cout(A(B3+C)*(A(B3+C)=8DE9 等式成立时 A,B,C,D,E的值:endl;for(a=2;a10;a+)for(b=1;b10;b+)for(c=1;c10;c+)for(d=0;d10;d+)for(e=0;e10;e+)k=(a*(b*10+3+c)*(a*(b*10+3+c);j=8*1000+d*100+e*10+9;if(j=k)goto to;to:couta=a,b=b,c=c,d=d,e=eendl;getchar();,执行结果与说明,程序的执行结果是:(A(B3+C)*(A(B3+C)=8DE9 等式成立时 A,B,C,D,E的值:a=3,b=2,c=8,d=6,e=4说明:上述程序中,用goto语句从五层循环的最内层退出循环体。当然也可以用break语句从循环体内退出,但是要设一个标志,如f,在最内层判断k=j成立时设置标志,用break语句退出最内层循环,以后逐层判断逐层退出。这样退出是很麻烦的,由此可以看出用goto语句在多层循环体内退出的简洁性。,本章小结,1if语句和switch语句都能够处理分支问题,但if语句的适应范围更广,所有能够用switch处理的问题都能够转换为if语句,反过来则不一定行。2任一种需要重复进行的循环问题,都可以采用for、while、do-while等循环结构进行处理,但可能不进入循环体执行就离开循环时则只能采用do循环。3计算机最擅长做循环处理,所以要针对要解决的问题,分析出有规律的进行简单操作的步骤,特别要注意确定好各种变量的初值和进行循环的次数。4break语句只能使用在switch语句和各种循环语句中,当执行到它时就使执行过程离开所在的语句,自动转向到所在的语句的后面。注意,break只能自动跳转一层分支或循环。,5continue语句只能使用在各种循环语句中,它被执行时就自动结束一次循环体的整个执行过程,或者说,从它开始到循环体结束之间的语句都被忽略,接着进行下一次的循环过程。6return语句是函数调用过程的返回语句,执行它时就立即结束所在函数的执行过程,自动返回到原调用语句的位置继续向下执行。7对于一个void函数,在函数体中可以不出现return语句,当该函数执行到函数体最后的右花括号时将自动返回到原来位置。8按照结构化程序设计的要求,所有处理过程都要组织成顺序、分支和循环这三种结构,本章所学的内容就是实现后两种结构的语句,而顺序结构是通过复合语句把先后按序执行的一组语句组合起来实现的。,本章小结,