第2章程序控制结构.ppt

上传人:sccc 文档编号:5639892 上传时间:2023-08-05 格式:PPT 页数:68 大小:1.47MB
返回 下载 相关 举报
第2章程序控制结构.ppt_第1页
第1页 / 共68页
第2章程序控制结构.ppt_第2页
第2页 / 共68页
第2章程序控制结构.ppt_第3页
第3页 / 共68页
第2章程序控制结构.ppt_第4页
第4页 / 共68页
第2章程序控制结构.ppt_第5页
第5页 / 共68页
点击查看更多>>
资源描述

《第2章程序控制结构.ppt》由会员分享,可在线阅读,更多相关《第2章程序控制结构.ppt(68页珍藏版)》请在三一办公上搜索。

1、1,第2章 程序控制结构2.1 顺序结构 2.2 选择结构 2.3 循环结构 2.4 控制转向语句 2.5 程序实例,2,按照语句出现的先后顺序依次执行。,2.1 顺序结构,3,2.1.1 定义语句,说明语句在C+程序中,一个标识符(变量名、常量名、函数名、对象名等)在使用之前必须先定义,通知编译器为其分配存储空间,或告诉编译器它的存在及其特征。例如:int a=0,b=3;const double pi=3.14159;int sum(int,int);float score 503;,4,2.1.2 表达式语句,形式:;可以进行的操作通常包括赋值操作,复合赋值操作,增量、减量操作,函数调用

2、操作和输入输出操作。例如:,i+;-j;abs(x);coutij;,sum=a+b;a=b=c;i=1,j=2;b*=c;,5,2.1.3 复合语句,形式:作用:当程序中某个位置在语法上只允许一条语句,而在语义上要执行多条语句才能完成某个操作时,需要使用复合语句。,例如:if(x=0)couta;coutb;,6,2.1.4 空语句,形式:;作用:当程序中某个位置在语法上需要一条语句,而在语义上又不 要求执行任何动作时,可放上一条空语句。一般适用于在循环语句中做空循环体例如:,for(m=0;m1000;m+);,7,2.1.5 基本输入输出,在C+中,所有输入输出是通过输入输出流来实现的。

3、在C+中,将数据从一个对象到另一个对象的流动抽象为“流”。在iostream库中包含一个标准输入流对象cin和一个标准输出流对象cout,分别用来实现从键盘读取数据,以及将数据在屏幕上输出。要使用cin和cout,需要在C+程序开头加上如下包含命令:#include/新标准中的头文件名using namespace std;/引入std名字空间中的标识符,8,1.标准输入流cin,cin负责从键盘读取数据,使用提取运算符“”就可以将键盘键入的数据读入到变量中。语法格式:cin变量1变量2变量n;变量可以是任意数据类型,输入时各个数据之间用空格键、Tab键或Enter键分隔。例如:int a,b

4、;cinab;键盘上输入:93,9,键盘,3,键盘,9,2.标准输出流cout,负责将数据输出到屏幕上,使用插入运算符“”就可以将数据显示在屏幕上当前光标所在位置。语法格式:cout表达式1表达式2表达式n;表达式可以是任意类型的,数据输出的格式由系统自动决定。,10,11,12,【例2.1】cout应用示例,#include using namespace std;int main()int m=2,n=8;double pai_1=3.14159265;float pai_2=3.141f;char ch1=A,ch2=B;bool ok=true;coutm=mendl;coutn=ne

5、ndl;coutpai_1=pai_1,pai_2=pai_2endl;coutch1=ch1,ch2=ch2endl;coutok=okendl;cout!ok=!okendl;return 0;,图2.2 cout应用示例,13,【例2.2】使用格式控制符输出数据,#include#include using namespace std;int main()int a=35;double b=12.3456789;cout1234567890123endl;coutdeca hexa octaendl;coutbendl;coutsetprecision(4)bendl;coutsetw(

6、10)bendl;coutsetw(10)setfill(#)bendl;coutsetiosflags(ios:scientific)bendl;coutsetprecision(3)bendl;coutsetprecision(2)bendl;return 0;,14,2.2 选择结构,按照给定条件有选择地执行程序中的语句 C+中:if语句:实现n分支,要求n个表达式。switch语句:实现多分支,只用1个表达式。,15,2.2.1 if语句,1if语句(单分支)语法格式:if(表达式)语句说明:(1)表达式是任意的数值、字符、关系、逻辑表达式,它表示条件,以true(非0)表示真,fal

7、se(0)表示假。表达式必须用圆括号括起来。(2)内嵌语句,可以是单条语句,或复合语句。,执行顺序,16,7,3,7,7,3,【例2.3】输入两个整数a和b,按从小到大的顺序输出这两个数。,分析 若ab,则将a、b交换,否则不交换。两数交换可采用借助于第三个变量间接交换的方法,if(ab)t=a;a=b;b=t;,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=a+b;b=a-b;a=a-b;,18,2if

8、-else语句(双分支),if(表达式)语句1 else 语句2,19,【例2.4】输入一个年份,判断是否为闰年。,分析 闰年的年份可以被4整除而不能被100整除,或者能被400整除。,#include using namespace std;int main()int year;coutyear;if(year%4=0,20,3if-else if 语句(多分支),if(表达式1)语句1 else if(表达式2)语句2 else if(表达式n)语句n else 语句n+1,21,【例2.5】根据x的值,计算分段函数y的值。y的计算公式为:,22,#include#include usin

9、g namespace std;int main()double x,y;coutx;if(x0)y=fabs(x);else if(x10)y=exp(x)*sin(x);else if(x20)y=pow(x,3);else y=(3+2*x)*log(x);couty=yendl;return 0;,图2.10 计算分段函数,23,4if语句的嵌套形式,if或else后面的内嵌语句本身又是一个if语句 例如:,if(表达式1)if(表达式2)语句1 else 语句2else if(表达式3)语句3 else 语句4,24,(1)为了增强程序的可读性,建议采用锯齿型的书写形式。(2)if语

10、句嵌套时,else子句总是与在它前面、距它最近、且尚未匹配的if配对。(3)为明确匹配关系,避免匹配错误,建议将内嵌的if语句一律用“”括起来。,if(x0)if(y0)coutx与y均大于0;else coutx大于0,y小于等于0;,注意:,如何使之与第一个if配对?,25,【例2.6】从键盘上输入两个字符,比较其大小,输出大于、等于和小于的判断结果。,#include using namespace std;int main()char ch1,ch2;coutch1ch2;if(ch1!=ch2)if(ch1ch2)coutch1大于ch2endl;else coutch1小于ch2e

11、ndl;elsecoutch1等于ch2endl;return 0;,26,2.2.2 switch语句,switch(表达式)case 常量表达式1:语句1 case 常量表达式2:语句2 case 常量表达式n:语句n default:语句序列n+1,注意:表达式只能是整型、字符型或枚举型,27,28,【例2.7】将输入的百分制成绩按以下规定转换成相应的等级:,成 绩 等级10090 优秀 8980 良好 7970 中等 6960 及格 590 不及格,29,#include using namespace std;int main()float score;coutscore;if(sc

12、ore=0,共用同一个语句组,思考:若省去break语句,情况会怎样?,30,2.3 循环结构,按照给定规则重复地执行程序中的语句,2.3.1 while 语句,while(表达式)语句,循环条件,其值为true(非0)、false(0),循环体,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,

13、真,真,100,真,101,真,5050,假,sum5050,1,2,3,3,6,4,100,5050,101,循环结束!,实际上是将i不停地累加到一起,32,【例2.9】求出满足不等式的最小n值:,#include using namespace std;int main()int i=0;double s=0;while(s5)s+=double(1)/+i;coutn=iendl;return 0;,33,2.3.2 do-while语句,do 语句while(表达式);,34,【例2.10】求自然数1100之和,要求用do-while语句实现。,#include using names

14、pace std;int main()int i(1),sum(0);dosum+=i;i+;while(i=100);coutsum=sumendl;return 0;,int i(1),sum(0);while(i=100)sum+=i;i+;,循环体和条件表达式都相同,35,while(12)cout2);/输出一行文字信息,注意:dowhile首先执行循环体,然后再判断表达式,至少执行一次循环体。当第一次循环表达式的值为真时,while与dowhile的结果完全一样,否则结果不相同。,36,【例2.11】输入一个自然数,将该数的每一位数字按反序输出。例如:输入12345,输出54321

15、。,#include using namespace std;void main()unsigned long int num,digital;coutnum;dodigital=num%10;num/=10;cout0);coutendl;,37,for(表达式1;表达式2;表达式3),表达式2,执行,非0,0,退出循环,表达式1,表达式3,表达式1;while(表达式2);表达式3;,2.3.3 for 语句,38,【例2.12】求自然数1100之和,要求用for语句实现。,#include using namespace std;int main()int i,sum(0);for(i=

16、1;i=100;i+)sum+=i;coutsum=sumendl;return 0;,39,【例2.13】一个小球从100米高处落下,每次落地后反弹回原高度的一半,再落下。求它在第10次落地时共经过多少米?第10次反弹多高?,分析:第1次落地后反弹高度为h=100/2第2次落地时经过的米数为s=100+h*2第2次落地后反弹高度为h=h/2第3次落地时经过的米数为s=s+h*2,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;cout

17、setiosflags(ios:fixed)setprecision(3);cout第10次落地时,共经过s米;反弹的高度是h米endl;return 0;,思考 该小球反弹多少次才能静止下来?,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

18、;i=100;)/省略表达式3 sum+=i+;/在循环体中对循环变量i递增,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;,43,2.3.4 多重循环,循环嵌套:循环体内包含另一个完整的循环结构。三种循环语句皆可以相互嵌套。,for()while()do while();,44,【例2.14】编

19、程显示输出九九乘法表,图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;,46,图2.21 下三角的九九乘法表,图2.22 上三角的九九乘法表,思考:打印上三角或下三角程序如何改动?,47,注意:,(1)内循环控制变量与外循环控制变量不能同名。(2)外循环必须完全包含内循环,不能交叉。(3)若循环体内有if语句,或if语句内有循

20、环语句,也不能交叉。(4)利用goto语句可以从循环体内转向循环体外,但绝对不允许从循环体外转入循环体内。(5)当嵌套使用各种循环语句时,特别需要严格按照缩进规则来书写程序。有时还应适当配以注释,以保持清晰易辩的结构特征。,48,2.4 控制转向语句,2.4.1 break语句,break;用于下列两种情况:1、在开关语句中,其功能是退出开关语句,执行其后的语句;2、在循环体中,其功能是用来退出该重循环,49,【例 2.15】从键盘上输入若干个正整数,直到输入负整数为止,计算并输出显示已输入的正整数之和。输入的数不超过20个。,#include using namespace std;cons

21、t int M=20;int main()int i,n,sum=0;coutn;if(n0)break;/当输入负数时,就退出循环sum+=n;cout 输入的正整数之和为:sumendl;return 0;,50,2.4.2 continue 语句,格式:continue;功能:只用在循环体中,用来结束该次循环。在循环体中遇到continue语句时,本次循环结束,回到循环条件判断是否执行下一次循环。,51,在while和do-while循环结构中,continue语句将使执行流程直接跳转到循环条件的判定部分,然后决定循环是否继续进行。在for循环结构中,当遇到continue时,执行流程将

22、跳过循环体中余下的语句,而转去执行for语句中的表达式3,然后根据表达式2进行循环条件的判定以决定是否继续执行for循环体。,52,while(i=100)break;coutsumendl;,while(i=100)continue;,break和continue语句的区别,53,【例 2.16】输出100以内能够被7整除的所有整数。,#include#include using namespace std;int main()for(int i=1;i=100;i+)if(i%7!=0)continue;/如果i不能被7整除,则退出本次循环coutsetw(5)i;coutendl;ret

23、urn 0;,思考:(1)将continue改为break,则输出有什么变化?(2)不采用continue语句,用其它方法如何实现?,54,2.4.3 goto语句,goto 标号;标号:语句;,标号语句,将流程转到标号所指定的标号语句处。,55,【例 2.17】利用goto语句实现计算前100个自然数之和并输出结果,#include using namespace std;int main()int i=1,sum=0;loop:sum+=i;i+;if(i=100)goto loop;coutsum=sumendl;return 0;,56,2.5 程序实例,【例 2.18】输入两个正整数

24、,求最大公约数。,算法思想:(1)对于已知两数m,n,使得mn(2)m除以n得余数r(3)若r=0,则n为最大公约数,结束;否则执行(4)(4)mn,n r,再重复执行(2),辗转相除法while(r=m%n)!=0)m=n;n=r;coutn;,57,#include using namespace std;int main()int m,n,t,r;coutmn;if(m=nwhile(r=m%n)!=0)m=n;n=r;cout最大公约数为:nendl;return 0;,58,【例 2.19】显示输出3100之间的所有素数。,分析:(1)素数:一个大于1的除了它自身和1以外,不能被其它

25、任何正整数所整除的整数。判别某数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);反之,如果是

26、正常退出循环的,则i=sqrt(m)+1。因此,在循环结束后,只要判断i是否大于sqrt(m),若是,则表明m是素数,输出该素数。(4)要判断多个素数是否为素数,需要使用双重循环。外循环每循环一次提供一个数,由内循环通过多次除法判断其是否为素数。,59,#include#include using namespace std;int main()coutk)coutmt;coutendl;return 0;,60,【例 2.20】输入x,计算sin(x)。计算公式为:,当第n项的绝对值小于10-6时结束。,分析:关键是找部分级数和的通项:,61,int n=1;double x,t,sinx(

27、0);/变量t保存每一项的值;给sinx变量赋初值0coutx;t=x;/将求和式的第一项值x赋给twhile(fabs(t)=0.000001)sinx+=t;t=-t*x*x/(n+1)*(n+2);n+=2;cout编程求得的sin(x)=sinxendl;cout调用标准函数求得的sin(x)=sin(x)endl;,62,【例 2.21】求“水仙花数”。所谓“水仙花数”是指一个三位正整数,其各位数字的立方和等于该数本身。例如:153=13+53+33。,方法1:利用三重循环编写程序因为“水仙花数”是三位整数,所以取值范围为100999。外循环变量i控制百位数字从1变化到9中层循环变量

28、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:不使用循环嵌套,只用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*

29、k=n)coutn;,64,【例 2.22】用“枚举法”求解百元买百鸡问题。假定公鸡5元1只,母鸡3元1只,小鸡1元3只,现在有100元钱要买100只鸡,且需包含公鸡、母鸡和小鸡,编程列出所有可能的购鸡方案。,分析 设公鸡、母鸡、小鸡各为x、y、z只,可列出方程:,采用试凑法(也称为穷举法或枚举法)来实现,即将可能出现的各种情况一一罗列测试,判断是否满足条件,采用循环结构来实现。,65,#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

30、只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,【例2.23】用牛顿迭代法求一元方程2x3-4x2+3x-6=0在x=1.5附近的根,要求精度为10-6。,分析:“迭代法”又称为“递推法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复,每次重复都是从旧值的基础上递推出新值,并由新值代替旧值。,曲线在A点的斜率为:f(x1)=f(x1)/(x1-x2),x2=x1-f(x1)/f(x1),Xn+1=xn-f(xn)/f(xn),输入x1值,由

31、公式求出x2,再由x2从公式求出x3,.,直到|x n+1-xn|10-6 时可视x n+1为方程f(x)=0在X1附近的一个近似根。,67,在本题中,用f表示f(xn),用f1表示f(xn),得:f=2xn3-4xn2+3xn-6=(2(xn-2)xn+3)xn-6f1=6 xn2-8 xn+3=2(3 xn-4)xn+3在程序中,用xn表示xn,用xn1表示xn+1,68,#include#include using namespace std;int main()float xn,xn1,f,f1;coutxn1;doxn=xn1;f=(2*(xn-2)*xn+3)*xn-6;f1=2*(3*xn-4)*xn+3;xn1=xn-f/f1;while(fabs(xn1-xn)=1e-6);cout方程的一个根为:xn1endl;return 0;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号