第2章程序控制结构.ppt

上传人:本田雅阁 文档编号:2252629 上传时间:2019-03-11 格式:PPT 页数:68 大小:1.47MB
返回 下载 相关 举报
第2章程序控制结构.ppt_第1页
第1页 / 共68页
第2章程序控制结构.ppt_第2页
第2页 / 共68页
第2章程序控制结构.ppt_第3页
第3页 / 共68页
亲,该文档总共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

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

4、意数据类型,输入时各个数据之间用空格键、Tab键或Enter键分隔。 例如: int a,b; cinab; 键盘上输入:9 3,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

5、=3.141f; char ch1=A,ch2=B; bool ok=true; cout“m=“mendl; cout“n=“nendl; cout“pai_1=“pai_1“ , pai_2=“pai_2endl; cout“ch1=“ch1“ , ch2=“ch2endl; cout“ok=“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.34567

6、89; cout“1234567890123“endl; 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; ,14,2.2 选择结构,按照给定条件有选择地执行程序中的语句 C+中: if语句:实现n分支,要求n个表达式。 switc

7、h语句:实现多分支,只用1个表达式。,15,2.2.1 if语句,1if语句(单分支) 语法格式: if(表达式) 语句 说明: (1)表达式是任意的数值、字符、关系、逻辑表达式,它表示条件,以true(非0)表示真,false(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

8、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- 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- e

9、lse if 语句(多分支),if(表达式1) 语句1 else if(表达式2) 语句2 else if (表达式n) 语句n else 语句n+1,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(x10) y=exp(x)*sin(x); else if(x20) y=pow(x,3); else y=(3+2*x)*log(x); cout“y=“yendl; return

10、0; ,图2.10 计算分段函数,23,4if语句的嵌套形式,if或else后面的内嵌语句本身又是一个if语句 例如:,if (表达式1) if (表达式2) 语句1 else 语句2 else if (表达式3) 语句3 else 语句4,24,(1) 为了增强程序的可读性,建议采用锯齿型的书写形式。 (2) if语句嵌套时,else子句总是与在它前面、距它最近、且尚未匹配的if配对。 (3)为明确匹配关系,避免匹配错误,建议将内嵌的if语句一律用“ ”括起来。,if(x0) if(y0) cout“x与y均大于0“; else cout“x大于0,y小于等于0“;,注意:,如何使之与第一个

11、if配对?,25,【例2.6】从键盘上输入两个字符,比较其大小,输出大于、等于和小于的判断结果。,#include using namespace std; int main() char ch1,ch2; coutch1ch2; if(ch1!=ch2) if(ch1ch2) coutch1“大于“ch2endl; else coutch1“小于“ch2endl; else coutch1“等于“ch2endl; return 0; ,26,2.2.2 switch语句,switch (表达式) case 常量表达式1: 语句1 case 常量表达式2: 语句2 case 常量表达式n: 语

12、句n default: 语句序列n+1 ,注意:表达式只能是整型、字符型或枚举型,27,28,【例2.7】将输入的百分制成绩按以下规定转换成相应的等级:,成 绩 等级 10090 优秀 8980 良好 7970 中等 6960 及格 590 不及格,29,#include using namespace std; int main() float score; coutscore; if(score=0 ,共用同一个语句组,思考:若省去break语句,情况会怎样?,30,2.3 循环结构,按照给定规则重复地执行程序中的语句,2.3.1 while 语句,while (表达式) 语句,循环条件,

13、其值为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+; cout“sum=“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不停地累加到一起,32,【例2.9】求

14、出满足不等式的最小n值:,#include using namespace std; int main() int i=0; double s=0; while(s5) s+=double(1)/+i; cout“n=“iendl; return 0; ,33,2.3.2 do-while语句,do 语句 while (表达式);,34,【例2.10】 求自然数1100之和,要求用do-while语句实现。,#include using namespace std; int main() int i(1),sum(0); do sum+=i; i+; while(i=100); cout“su

15、m=“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。,#include using namespace std; void main() unsigned lo

16、ng int num,digital; coutnum; do digital=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=1;i=100;i+) sum+=i; cout“sum=“sumend

17、l; 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; coutsetiosflags(ios:f

18、ixed)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(

19、int i=1; 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() wh

20、ile() do while(); ,44,【例2.14】 编程显示输出九九乘法表,图2.19 九九乘法表运行界面,45,#include using namespace std; int main() cout“ttt九 九 乘 法 表“endl; cout“ttt-“endl; for(int i=1;i=9;i+) for(int j=1;j=9;j+) couti“j=i*jt; coutendl; return 0; ,46,图2.21 下三角的九九乘法表,图2.22 上三角的九九乘法表,思考:打印上三角或下三角程序如何改动?,47,注意:,(1)内循环控制变量与外循环控制变量不能同

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

22、输入的正整数之和。输入的数不超过20个。,#include using namespace std; const 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循环结构中,c

23、ontinue语句将使执行流程直接跳转到循环条件的判定部分,然后决定循环是否继续进行。 在for循环结构中,当遇到continue时,执行流程将跳过循环体中余下的语句,而转去执行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() fo

24、r(int i=1;i=100;i+) if(i%7!=0) continue; /如果i不能被7整除,则退出本次循环 coutsetw(5)i; coutendl; return 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

25、,sum=0; loop: sum+=i; i+; if(i=100) goto loop; cout“sum=“sumendl; return 0; ,56,2.5 程序实例,【例 2.18】 输入两个正整数,求最大公约数。,算法思想: (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;

26、coutmn; if(m=n while(r=m%n)!=0) m=n; n=r; cout“最大公约数为: “nendl; return 0; ,58,【例 2.19】 显示输出3100之间的所有素数。,分析: (1)素数:一个大于1的除了它自身和1以外,不能被其它任何正整数所整除的整数。判别某数m是否为素数,最简单的方法是:用i=2,3,m-1逐个除,只要有一个能整除,m就不是素数,可以用break提前结束循环;若都不能整除,则m是素数。 (2)如果m不是素数,则必然能被分解为两个因子a和b,并且其中之一必然小于等于 sqrt(m) ,另一个必然大于等于sqrt(m) 。所以要判断m是否为

27、素数,可简化为判断它能否被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,#include #include using namespace

28、 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(0); / 变量t保存每一项的值;给sinx变量赋初值0 coutx; t=x; / 将求和式的第一项值x赋给t while(fabs(t)=0.000001) sinx+=t; t=-t*x*x/(n+1)*(n+2); n+=2; cout“编程求得的sin(“x“)=“sinxendl; co

29、ut“调用标准函数求得的sin(“x“)=“sin(x)endl; ,62,【例 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+

30、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*k=n) coutn ; ,64,【例 2.22】 用“枚举法”求解百元买百鸡问题。假定公鸡5元1只,母鸡3元1只,小鸡1元3只,现在有100元钱要买100只鸡,且需包含公鸡、母鸡和小鸡,编程

31、列出所有可能的购鸡方案。,分析 设公鸡、母鸡、小鸡各为x、y、z只,可列出方程:,采用试凑法(也称为穷举法或枚举法)来实现,即将可能出现的各种情况一一罗列测试,判断是否满足条件,采用循环结构来实现。,65,#include using namespace std; int main() int x,y,z; cout“公鸡数t“母鸡数t“小鸡数t“endl; 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) coutxtytze

32、ndl; 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值,由公式求出x2,再由x2从公式求出x3,直到 | x n+1- xn | 10-6 时可视x n+1为方程f(x)=0在X1附近的一个近似根

33、。,67,在本题中,用f表示f(xn),用f1表示f (xn),得: f=2xn3-4xn2+3xn-6 =(2 (xn-2) xn +3) xn -6 f1=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; do xn=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备18001539号-1