第2章程序控制结构NEW课件.ppt
1,第2章 程序控制结构2.1 顺序结构 2.2 选择结构 2.3 循环结构 2.4 控制转向语句 2.5 程序实例,1第2章 程序控制结构2.1 顺序结构 2.2,2,按照语句出现的先后顺序依次执行。,2.1 顺序结构,2按照语句出现的先后顺序依次执行。2.1 顺序结构 语句,3,2.1.1 定义语句,在C+程序中,一个标识符(变量名、常量名、函数名、对象名等)在使用之前必须先定义。定义语句是在给出其特征同时,并通知编译器为其分配存储空间,而说明语句仅告诉编译器它的存在及其特征。例如:int x=1,y=2;/定义语句const double PI=3.14159;/定义语句float score303;/定义语句,32.1.1 定义语句 在C+程序中,一个标,4,2.1.2 表达式语句,形式:;可以进行的操作通常包括赋值操作,复合赋值操作,增量、减量操作,函数调用操作和输入输出操作。例如:,n+;-m;abs(x);cinxy;coutx+y;,s=x+y;m=n=t;a=10,b=20;z*=w;,42.1.2 表达式语句形式:;n+;,5,2.1.3 复合语句,形式:作用:当程序中某个位置在语法上只允许一条语句,而在语义上要执行多条语句才能完成某个操作时,需要使用复合语句。,例如:if(x=0)couta;coutb;,52.1.3 复合语句形式:例如:,6,2.1.4 空语句,形式:;作用:当程序中某个位置在语法上需要一条语句,而在语义上又不 要求执行任何动作时,可放上一条空语句。一般适用于在循环语句中做空循环体例如:,for(m=0;m1000;m+);,62.1.4 空语句形式:;,7,2.1.5 基本输入输出,在C+中,所有输入输出是通过输入输出流来实现的。在C+中,将数据从一个对象到另一个对象的流动抽象为“流”。在iostream库中包含一个标准输入流对象cin和一个标准输出流对象cout,分别用来实现从键盘读取数据,以及将数据在屏幕上输出。要使用cin和cout,需要在C+程序开头加上如下包含命令:#include/新标准中的头文件名using namespace std;/引入std名字空间中的标识符,72.1.5 基本输入输出在C+中,所有输入输出是通过输,8,1.标准输入流cin,cin负责从键盘读取数据,使用提取运算符“”就可以将键盘键入的数据读入到变量中。语法格式:cin变量1变量2变量n;变量可以是任意数据类型,输入时各个数据之间用空格键、Tab键或Enter键分隔。例如:int x,y;cinxy;键盘上输入:58,5,键盘,8,键盘,81.标准输入流cincin负责从键盘读取数据,使用提取运,9,2.标准输出流cout,负责将数据输出到屏幕上,使用插入运算符“”就可以将数据显示在屏幕上当前光标所在位置。语法格式:cout表达式1表达式2表达式n;表达式可以是任意类型的,数据输出的格式由系统自动决定。,92.标准输出流cout负责将数据输出到屏幕上,使用插入运,10,10,11,11,12,【例2.1】cout应用示例,#include using namespace std;int main()int x=12,y=83;double pai_1=3.14159265;float pai_2=3.141f;char ch1=a,ch2=b;bool ok=true;coutx=xendl;couty=yendl;coutpai_1=pai_1,pai_2=pai_2endl;coutch1=ch1,ch2=ch2endl;coutok=okendl;cout!ok=!okendl;return 0;,x=12y=83pai_1=3.14159,pai_2=3.141ch1=a,ch2=bok=1!ok=0,12【例2.1】cout应用示例#include ios,13,【例2.2】使用格式控制符输出数据,#include#include using namespace std;int main()int a=35;double b=21.3456789;cout1234567890123endl;coutdeca hexa octaendl;coutbendl;coutsetprecision(4)bendl;coutsetw(10)bendl;coutsetw(10)setfill(*)bendl;coutsetiosflags(ios:scientific)bendl;coutsetprecision(3)bendl;coutsetprecision(2)bendl;return 0;,123456789012335 23 4321.345721.35 21.35*21.352.1346e+0012.135e+0012.13e+001,13【例2.2】使用格式控制符输出数据#include,14,2.2 选择结构,按照给定条件有选择地执行程序中的语句 C+中:if语句:实现n分支,要求n个表达式。switch语句:实现多分支,只用1个表达式。,142.2 选择结构按照给定条件有选择地执行程序中的语句,15,2.2.1 if语句,1if语句(单分支)语法格式:if(表达式)语句说明:(1)表达式是任意的数值、字符、关系、逻辑表达式,它表示条件,以true(非0)表示真,false(0)表示假。表达式必须用圆括号括起来。(2)内嵌语句,可以是单条语句,或复合语句。,执行顺序,152.2.1 if语句1if语句(单分支)执行顺序,16,7,3,7,7,3,【例2.3】输入两个整数a和b,按从小到大的顺序输出这两个数。,分析 若ab,则将a、b交换,否则不交换。两数交换可采用借助于第三个变量间接交换的方法,if(ab)t=a;a=b;b=t;,16bat73773【例2.3】输入两个整数a和b,按从小到,17,#include using namespace std;int main()int a,b,t;coutab;if(ab)t=a;a=b;b=t;coutabendl;return 0;,a=a+b;b=a-b;a=a-b;,请输入两个整数a,b:85 404085,a=ab;b=ab;a=ab;,17#include a=a+b;b=,18,2if-else语句(双分支),if(表达式)语句1 else 语句2,182if-else语句(双分支)if(表达式)tru,19,【例2.4】输入一个年份,判断是否为闰年。,分析 闰年的年份可以被4整除而不能被100整除,或者能被400整除。,#include using namespace std;int main()int year;coutyear;if(year%4=0,19【例2.4】输入一个年份,判断是否为闰年。分析 闰年的年,20,3if-else if 语句(多分支),if(表达式1)语句1 else if(表达式2)语句2 else if(表达式n)语句n else 语句n+1,203if-else if 语句(多分支)if(表达式1,21,【例2.5】根据x的值,计算分段函数y的值。y的计算公式为:,21【例2.5】根据x的值,计算分段函数y的值。y的计算公式,22,#include#include using namespace std;int main()double x,y;coutx;if(x0)y=fabs(x);else if(x15)y=exp(x)*cos(x);else if(x30)y=pow(x,5);else y=(7+9*x)*log(x);couty=yendl;return 0;,请输入x:-5y=5请输入x:10y=-18481.8请输入x:27y=1.43489e+007请输入x:38y=1269.52,单位:弧度,22#include 请输入x:-5单位,23,4if语句的嵌套形式,if或else后面的内嵌语句本身又是一个if语句 例如:,if(表达式1)if(表达式2)语句1 else 语句2else if(表达式3)语句3 else 语句4,234if语句的嵌套形式if或else后面的内嵌语句本身又,24,(1)为了增强程序的可读性,建议采用锯齿型的书写形式。(2)if语句嵌套时,else子句总是与在它前面、距它最近、且尚未匹配的if配对。(3)为明确匹配关系,避免匹配错误,建议将内嵌的if语句一律用“”括起来。,if(x0)if(y0)coutx与y均大于0;else coutx大于0,y小于等于0;,注意:,如何使之与第一个if配对?,24(1)为了增强程序的可读性,建议采用锯齿型的书写形式。,25,【例2.6】从键盘上输入两个字符,比较其大小,输出大于、等于和小于的判断结果。,#include using namespace std;int main()char ch1,ch2;coutch1ch2;if(ch1!=ch2)if(ch1ch2)coutch1大于ch2endl;else coutch1小于ch2endl;elsecoutch1等于ch2endl;return 0;,请输入两个字符:h dh大于d请输入两个字符:X YX小于Y请输入两个字符:&等于&,25【例2.6】从键盘上输入两个字符,比较其大小,输出大于、,26,2.2.2 switch语句,switch(表达式)case 常量表达式1:语句组1 case 常量表达式2:语句组2 case 常量表达式n:语句组n default:语句组n+1,注意:表达式只能是整型、字符型或枚举型,262.2.2 switch语句switch(表达式)注,27,27有无无false有无falsetrue计算表达式的值常量,28,【例2.7】将输入的百分制成绩按以下规定转换成相应的等级:,成 绩 等级10090 优秀 8980 良好 7970 中等 6960 及格 590 不及格,28【例2.7】将输入的百分制成绩按以下规定转换成相应的等级,29,#include using namespace std;int main()float score;coutscore;if(score=0,共用同一个语句组,思考:若省去break语句,情况会怎样?,29#include 共用同一个语句组,30,2.3 循环结构,按照给定规则重复地执行程序中的语句,2.3.1 while 语句,while(表达式)语句,循环体,当型循环,302.3 循环结构按照给定规则重复地执行程序中的语句 2,31,【例2.8】求 1+2+3+100,#include using namespace std;int main()int i(1),sum(0);/定义变量,初始化while(i=100)/构造循环 sum+=i;/循环体,多次执行 i+;/循环变量coutsum=sumendl;return 0;,0,1,1,2,真,3,3,真,6,4,真,10,5,真,真,100,真,101,真,5050,假,sum5050,1,2,3,3,6,4,100,5050,101,循环结束!,实际上是将i不停地累加到一起,31【例2.8】求 1+2+3+100#include,32,【例2.9】求出满足不等式的最小n值:,#include using namespace std;int main()int i=0;double s=0;while(s8)s+=double(1)/+i;/i-循环变量 coutn=iendl;return 0;,8,32【例2.9】求出满足不等式的最小n值:#include,33,2.3.2 do-while语句,do 语句while(表达式);,直到型循环,332.3.2 do-while语句dofalsetrue,34,【例2.10】求自然数1100之和,要求用do-while语句实现。,#include using namespace std;int main()int i(1),sum(0);dosum+=i;i+;/i-循环变量while(i=100);coutsum=sumendl;return 0;,int i(1),sum(0);while(i=100)sum+=i;i+;,循环体和条件表达式都相同,34【例2.10】求自然数1100之和,要求用do-wh,35,while(12)cout2);/输出一行文字信息,注意:dowhile首先执行循环体,然后再判断表达式,至少执行一次循环体。当第一次循环表达式的值为真时,while与dowhile的结果完全一样,否则结果不相同。,35while(12)注意:,36,【例2.11】输入一个自然数,将该数的每一位数字按反序输出。例如:输入12345,输出54321。,#include using namespace std;void main()unsigned long int num,dgt;coutnum;cout0);coutendl;,36【例2.11】输入一个自然数,将该数的每一位数字按反序输,37,for(表达式1;表达式2;表达式3),表达式2,执行,非0,0,退出循环,表达式1,表达式3,表达式1;while(表达式2);表达式3;,2.3.3 for 语句,计数型循环,37for(表达式1;表达式2;表达式3)表达式2执行语,38,【例2.12】求自然数1100之和,要求用for语句实现。,#include using namespace std;int main()int i,sum(0);for(i=1;i=100;i+)sum+=i;coutsum=sumendl;return 0;,38【例2.12】求自然数1100之和,要求用for语句实,39,【例2.13自学】一个小球从100米高处落下,每次落地后反弹回原高度的一半,再落下。求它在第10次落地时共经过多少米?第10次反弹多高?,分析:第1次落地后反弹高度为h=100/2第2次落地时经过的米数为s=100+h*2第2次落地后反弹高度为h=h/2第3次落地时经过的米数为s=s+h*2,39【例2.13自学】一个小球从100米高处落下,每次落地,40,#include#include using namespace std;int main()float s=100.0,h=s/2;for(int i=2;i=10;i+)s=s+h*2;h=h/2;coutsetiosflags(ios:fixed)setprecision(3);cout第10次落地时,共经过s米;反弹的高度是h米endl;return 0;,思考 该小球反弹多少次才能静止下来?,40#include 思考 该小球反弹,41,注意:,for语句中的三个表达式可以部分省略或全部省略,但;不能省略,若省略表达式2,则表示循环条件为真。,for(;i=100;i+)/省略表达式1,注意其后的分号不能省 sum+=i;,int sum=0;for(int i=1;i+)/省略表达式2,注意其后的分号同样不能省 sum+=i;if(i=100)break;/break语句用于跳出循环,int sum=0;for(int i=1;i=100;)/省略表达式3 sum+=i+;/在循环体中对循环变量i递增,41注意:for语句中的三个表达式可以部分省略或全部省略,但,42,int i=1,sum=0;for(;)sum+=i+;if(i100)break;,三个表达式都可以是任何类型的C+表达式。int i,sum;for(i=1,sum=0;i=100;sum+=i,i+);,表达式1可以是变量定义语句,即循环控制变量可在其中定义。int sum=0;for(int i=1;i=100;i+)sum+=i;,42int i=1,sum=0;三个表达式都可以是任何类型,43,2.3.4 多重循环,循环嵌套:循环体内包含另一个完整的循环结构。三种循环语句皆可以相互嵌套。,for()while()do while();,432.3.4 多重循环循环嵌套:循环体内包含另一个完整的,44,【例2.14】编程显示输出九九乘法表,图2.19 九九乘法表运行界面,44【例2.14】编程显示输出九九乘法表 图2.19,45,#include using namespace std;int main()coutttt九 九 乘 法 表endl;coutttt-endl;for(int i=1;i=9;i+)for(int j=1;j=9;j+)coutij=i*jt;coutendl;return 0;,外层:外循环 内层:内循环,45truefalsei=1i=9?truefalsej,46,图2.21 下三角的九九乘法表,图2.22 上三角的九九乘法表,思考:打印上三角或下三角程序如何改动?,46图2.21 下三角的九九乘法表图2.22 上三角的九,47,注意:,(1)内循环控制变量与外循环控制变量不能同名。(2)外循环必须完全包含内循环,不能交叉。(3)若循环体内有if语句,或if语句内有循环语句,也不能交叉。(4)利用goto语句可以从循环体内转向循环体外,但绝对不允许从循环体外转入循环体内。(5)当嵌套使用各种循环语句时,特别需要严格按照缩进规则来书写程序。有时还应适当配以注释,以保持清晰易辩的结构特征。,47注意:(1)内循环控制变量与外循环控制变量不能同名。(,48,2.4 控制转向语句,2.4.1 break语句,仅可用于以下两种情况:(1)用于switch语句中,保证多分支情况的正确运行(2)用于循环语句中,以便在某一适当时刻及位置终止执行循环体中的语句,并使流程控制退出该循环控制结构,转去执行该循环语句的下一条语句。,482.4 控制转向语句2.4.1 break语句仅可用,49,【例 2.15】break语句应用示例。已知圆的半径为不大于10的正整数,要求输出所有不大于100的圆面积值。,#include using namespace std;const float PI=3.14159;int main()int r;float area;cout100)break;/如果面积大于100,则跳出循环 cout圆半径=r,面积=areaendl;return 0;,49【例 2.15】break语句应用示例。已知圆的半径为,50,2.4.2 continue 语句,格式:continue;功能:只用在循环体中,用来提前结束该次循环而进入下一轮循环。在循环体中遇到continue语句时,本次循环结束,回到循环条件判断是否执行下一次循环。,502.4.2 continue 语句格式:,51,在while和do-while循环结构中,continue语句将使执行流程直接跳转到循环条件的判定部分,然后决定循环是否继续进行。在for循环结构中,当遇到continue时,执行流程将跳过循环体中余下的语句,而转去执行for语句中的表达式3,然后根据表达式2进行循环条件的判定以决定是否继续执行for循环体。,51在while和do-while循环结构中,continu,52,while(i=100)break;coutsumendl;,while(i=100)continue;,break和continue语句的区别,52while(i=100)while(i=100)br,53,例2.16】continue语句应用示例。请写出下列程序的运行结果。,#include using namespace std;int main()int i,s;for(i=1,s=0;i=10;+i)if(i%2=0)continue;if(i%10=7)break;s+=i;couts=s;return 0;,s=9,该程序的功能:求出110所有奇数的和且当遇到某数除以10的余数为7时提前结束求和。,53例2.16】continue语句应用示例。请写出下列程序,54,2.4.3 goto语句,goto 标号;标号:语句;,标号语句,将流程转到标号所指定的标号语句处。,542.4.3 goto语句goto 标号;标号语句将流程,55,【例2.17】利用goto语句实现求一个自然数的阶乘并输出结果。#include using namespace std;int main()int i=1,m,s=1;coutm;loop:s*=i;+i;if(i=m)goto loop;couts=sendl;return 0;,55【例2.17】利用goto语句实现求一个自然数的阶乘并输,56,说明:(1)如果不加限制地使用goto语句转来转去,则会破坏程序自上而下的执行顺序而降低程序的可读性,不符合结构化程序设计的思想。因此应尽量避免使用goto语句;(2)特殊场合使用goto将简化程序表达。,int i,j,k;for(i=1;i10;+i)for(j=1;j10;+j)for(k=1;k10;+k)if(i*j*k=125)goto End;End:couti*j*k=125n;,56说明:int i,j,k;,57,2.5 程序实例,【例 2.18】输入两个正整数,求最大公约数和最小公倍数。,算法思想:(1)对于已知两数m,n,使得mn(2)m除以n得余数r(3)若r=0,则n为最大公约数,结束;否则执行(4)(4)mn,n r,再重复执行(2),m n r12 5 2 5 2 1 2 1 0,辗转相除法while(r=m%n)!=0)m=n;n=r;coutn;,572.5 程序实例【例 2.18】输入两个正整数,求最,58,#include using namespace std;int main()int m,n,r,t;coutmn;t=m*n;if(mn)r=m;m=n;n=r;while(r=m%n)!=0)m=n;n=r;cout最大公约数:nendl;cout最小公倍数:t/nendl;/=原两数乘积/最大公约数 return 0;,58#include,59,【例2.19】顺序输出3100之间的所有素数,并计算输出素数之和。,分析:(1)素数:一个大于1的除了它自身和1以外,不能被其它任何正整数所整除的整数。判别某数m是否为素数,最简单的方法是:用i=2,3,m-1逐个除,只要有一个能整除,m就不是素数,可以用break提前结束循环;若都不能整除,则m是素数。(2)如果m不是素数,则必然能被分解为两个因子a和b,并且其中之一必然小于等于 sqrt(m),另一个必然大于等于sqrt(m)。所以要判断m是否为素数,可简化为判断它能否被2至sqrt(m)之间的数整除即可。因为若m不能被2至sqrt(m)之间的数整除,则必然也不能被sqrt(m)至m-1之间的数整除。(3)在退出循环以后,如果是因为找到了一个能整除m的数而通过break退出循环的,则i=sqrt(m);反之,如果是正常退出循环的,则i=sqrt(m)+1。因此,在循环结束后,只要判断i是否大于sqrt(m),若是,则表明m是素数,输出该素数。(4)要判断多个素数是否为素数,需要使用双重循环。外循环每循环一次提供一个数,由内循环通过多次除法判断其是否为素数。,59【例2.19】顺序输出3100之间的所有素数,并计算输,60,#include#include using namespace std;int main()coutk)coutmt;s+=m;cout”n3100之间的素数之和=”s;coutendl;return 0;,60#include,61,【例 2.20】输入x,计算sin(x)。计算公式为:,当第n项的绝对值小于10-6时结束。,分析:关键是找部分级数和的通项:,61【例 2.20】输入x,计算sin(x)。计算公式为:,62,int n=1;double x,t,sinx(0);/变量t保存每一项的值;给sinx变量赋初值0coutx;t=x;/将求和式的第一项值x赋给twhile(fabs(t)=1E-6)sinx+=t;t=-t*x*x/(n+1)*(n+2);n+=2;cout编程求得的sin(x)=sinxendl;cout调用标准函数求得的sin(x)=sin(x)endl;,62,63,【例 2.21】求“水仙花数”。所谓“水仙花数”是指一个三位正整数,其各位数字的立方和等于该数本身。例如:153=13+53+33。,方法1:利用三重循环编写程序因为“水仙花数”是三位整数,所以取值范围为100999。外循环变量i控制百位数字从1变化到9中层循环变量j控制十位数字从0变化到9内循环变量k控制个位数字从0变化到9。,int i,j,k,n;cout水仙花数:;for(i=1;i=9;i+)for(j=0;j=9;j+)for(k=0;k=9;k+)m=i*i*i+j*j*j+k*k*k;n=100*i+10*j+k;if(m=n)coutm;,63【例 2.21】求“水仙花数”。所谓“水仙花数”是指一,64,方法2:不使用循环嵌套,只用1个for语句编写程序。,int main()int i,j,k,n;cout水仙花数:;for(n=100;n1000;n+)i=n/100;/i为百位数字 j=n/10-i*10;/j为十位数字 k=n%10;/k为个位数字 if(i*i*i+j*j*j+k*k*k=n)coutn;,64方法2:不使用循环嵌套,只用1个for语句编写程序。,65,【例 2.22自学】用“枚举法”求解百元买百鸡问题。假定公鸡5元1只,母鸡3元1只,小鸡1元3只,现在有100元钱要买100只鸡,且需包含公鸡、母鸡和小鸡,编程列出所有可能的购鸡方案。,分析 设公鸡、母鸡、小鸡各为x、y、z只,可列出方程:,采用试凑法(也称为穷举法或枚举法)来实现,即将可能出现的各种情况一一罗列测试,判断是否满足条件,采用循环结构来实现。,65【例 2.22自学】用“枚举法”求解百元买百鸡问题。假,66,#include using namespace std;int main()int x,y,z;cout公鸡数t母鸡数t小鸡数tendl;for(x=1;x=19;x+)/公鸡最多买(100-3-1/3)/5只for(y=1;y=31;y+)/母鸡最多买(100-5-1/3)/3只 z=100-x-y;if(5*x+3*y+z/3.0=100)coutxtytzendl;return 0;,66#include,实验2:选择、循环程序设计,题目(作业):P63-2,3,7要求:(1)实验前编号程序,上机调试、改进、运行。(2)只提交.CPP程序,共提交3个源程序,其它文件不得提交(3)为便于作业管理,文件命名规定如下:,.CPP,班次,学号,题号,07120103.cpp7班12号第1章03题,章次,实验2:选择、循环程序设计题目(作业):P63-2,3,7,