




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+大学基础教程,第3章 C+控制语句 本章学习: C+的控制语句和程序基本结构 使用基本结构实现算法,3.1 算法的基本控制结构,2020/7/10,-3-,3.1 算法的基本控制结构,流程图 开始/结束 执行 判断 联系,2020/7/10,-4-,例:计算y=x2,开始,定义x,y,输入x,计算y=x*x,输出y,结束,void main() int x,y; cinx; y=x*x; couty; ,coutx;,cout“y=”yendl;,void main() int x,y; coutx; y=x*x; cout“y=”yendl; ,顺序结构,2020/7/10,-5-,例:
2、 找两个数中的最大值。,开始,定义x,y,输入x,y,xy?,y,输出x,结束,n,输出y,#include void main() int x,y; cinxy; if(xy) coutx; else couty; ,选择结构,2020/7/10,-6-,例:计算y=sin(x)在一个周期内的八个等间隔抽样点值。即xi=2i/8, i=0,1,7,开始,定义变量i,x,y; 定义常量PI2;,i=0,i8,x=PI2*i/8; y=sin(x);,i+;,y,结束,n,#include #include using namespace std; void main() int i; floa
3、t x,y; const float PI2=2*3.14; for(i=0;i8;i+) x=PI2*i/8; cout(y=sin(x)endl; ,循环结构,2020/7/10,-7-,3.1 算法的基本控制结构,程序的三种基本控制结构 (1)顺序结构 (2)选择结构 (3)循环结构,2020/7/10,-8-,3.1 算法的基本控制结构,流程控制语句 选择语句:if.else、switch 循环语句:while、for 、do.while 转向语句:break、continue,2020/7/10,-9-,3.2 if选择语句,2020/7/10,-10-,3.2 if选择语句,if_
4、else 1、没有else分支 2、双分支 3、多分支 4、if 语句的嵌套,2020/7/10,-11-,3.2 if选择语句,1、没有else分支 例如:比较x和y的大小,如果x大则输出x的值,if (表达式) 语句;,if ( xy ) coutxendl;,3.2 if选择语句,2、双分支 例如:比较x,y的大小,将较大的数输出,if (表达式) 语句1; else 语句2;,if ( xy ) coutxendl; else coutyendl;,2020/7/10,-13-,3.2 if选择语句,3、多分支,if (表达式1) 语句1; else if (表达式2) 语句2; el
5、se if (表达式3) 语句3; else 语句n;,例子:输出学生的成绩,#include using namespace std; void main() int x; cinx; if(x=90) cout=80) cout=60) cout“合格”endl; else cout“不及格”endl; ,2020/7/10,-15-,注意: 1. 如果if-else语句中的语句1或语句2不是单条语句,则必须采用复合语句形式;否则,计算机只执行其中第一条语句,出现程序运行时的逻辑错误。 程序的逻辑错误,指的是编译器检查不出来的错误,也即编译时不出错,只在程序运行时才会出现。 2. 一般在i
6、f-else(和任何控制结构)中加上大括号,可以避免不慎疏忽,特别是if或else后边的选择体语句多于一条时。,2020/7/10,-16-,3.2 if选择语句,4、if 语句的嵌套,if (表达式1) if (表达式2) 语句1 else 语句2 else if (表达式3) 语句3 else 语句4,2020/7/10,-17-,注意: (1) 使用嵌套if结构时,应该注意if与else的对应关系。 从最内层开始,else总是与其前面最近的(未曾匹配的)if匹配。 如果外层if的内嵌if语句没有对应的else分支,应该把内嵌if语句放入加花括号里,成为复合语句。例如下面的代码:,2020
7、/7/10,-18-,if ( ) if ( ) 语句1; else if ( ) 语句2; else 语句3;,if ( ) if ( ) 语句1; else if ( ) 语句2; else 语句3;,if ( ) if ( ) 语句1; else if ( ) 语句2; else 语句3;,2020/7/10,-19-,(2) 编写嵌套if语句结构,最好给外层if和else的选择体加上大括号,使结构清晰,增强代码的可读性。 (3) 在嵌套if结构和多选择的if结构中,测试条件为真可能性较大的操作应放在if结构的开头,以便尽早满足测试条件,结束if结构的执行,提高程序运行速度。,3.3 s
8、witch选择语句,3.3 switch选择语句,switch (表达式) case 常量表达式1: 语句1 break; case 常量表达式2: 语句2 break; case 常量表达式n: 语句n break; default:语句n+1 ,2020/7/10,-22-,例3.4 假设某个盒子里有红色、黄色、蓝色、绿色和白色球若干,每次从中取出一个球,并记录(输出)球的颜色。使用随机数产生函数rand模拟随机取球过程,设数字1,2,3,4,5分别表示上述五种球的颜色。数字0使模拟取球过程结束。统计出每种球出现的次数。,/功能:模拟取球程序 #include #include #incl
9、ude using namespace std; void main() int count1(0), count2(0), count3(0), count4(0), count5(0); srand( (unsigned)time( NULL ) ); int color=rand()%6;,while(color) switch(color) case 1: coutred ball endl; count1+; break; case 2: coutyellow ballendl; count2+; break;,case 3: coutblue ball endl; count3+;
10、 break; case 4: coutgreen ballendl; count4+; break; case 5: coutwhite ballendl; count5+; break;,default: coutInvalid command endl; color=rand()%6; coutcount of each color balls(red, yellow,blue,green,and white): count1,count2,count3,count4 ,count5endl; ,2020/7/10,-27-,注意: (1) switch语句中表达式的值可以是字符型、整型
11、,也可以是枚举型。通常这个表达式仅仅是个变量。 (2)case 的常量表达式可以是字符型、整型或枚举型,通常,也只是一个常量。各个case的常量表达式的值应该互不相同,否则,相同的值造成矛盾的语句标识。各个case的先后顺序不影响执行结果,由编程者合理安排。,2020/7/10,-28-,(3)break语句本不是switch语句原有的,但由于各个“case 常量表达式”只起语句标号的作用,并不进行条件判断,switch语句每当找到匹配的常量表达式,则从此标号开始执行下去,不再进行判断,即将此后的其它case下的语句也都执行。这显然不是我们希望的。因此,在每个case的执行语句结束处,应该加上
12、break语句。,(4)几个case可以共用一组执行语句。例如,输入考试成绩grade,输出是否通过: switch(grade/10) case 9: case 8: case 7: case 6: cout”pass”; break; default cout”fail”; break; ,2020/7/10,-30-,(5) 在switch语句中应该提供default情况,可以提醒编程者需要处理异常条件;而且习惯上default被放在switch结构的最后。,2020/7/10,-31-,switch语句和多分支if语句都能实现多分支的选择问题。但switch语句只能处理测试表达式与ca
13、se常量表达式值相等的情况,即要求表达式的值只能取整型、字符型和枚举型; 多分支的if语句可以处理测试表达式为任何c+允许类型的问题。 尽管如此,只要问题类型合适,switch语句通常比多分支的if语句的执行效率高,因为前者直接执行匹配的语句,而后者要逐一比较至测试表达式为真。故合理安排多分支的if语句各分支的顺序,有利于提高程序运行速度,特别是当选择语句内嵌于循环结构中时。,3.4 循环语句,2020/7/10,-33-,3.4 循环语句,三种基本语法 1、 while 语句 2、 dowhile 语句 3、 for 语句,2020/7/10,-34-,3.4 循环语句,主要包括3个部分:
14、1、循环控制条件: 判断循环操作是否进行的条件; 2、循环体: 重复进行的操作; 3、循环控制变量: 记录循环体执行的次数,或控制循环的结束条件。,2020/7/10,-35-,3.4 循环语句,while循环语句,while(表达式) 循环体语句;,2020/7/10,-36-,/功能:计算1n个整数平方和的均值。 #include using namespace std void main() int k=1,sum=0,n; coutn;,2020/7/10,-37-,while(k0) /防止被0除 mean=sum/n; else mean=0; cout mean = mean e
15、ndl; ,2020/7/10,-38-,利用循环结构实现迭代求和时,表示和的变量的初值必须赋为0。另外还要注意执行除法操作之前,检验除数是否为0,以增强程序的稳健性。,2020/7/10,-39-,注意: (1)循环体如果多于一句,必须采用复合语句形式,否则只有循环体的第一句能够被执行,其它循环体语句不能被执行。 (2)一般while语句的循环控制变量在while语句前被赋值,并在循环体内被修改,使循环语句能够正常结束。循环结构的循环体中应该有使循环趋于结束的语句(修改循环控制变量的语句)。 如果while语句的条件一开始就不满足,则其循环体语句就会一次也不执行。所以,我们在选择循环语句要清
16、楚这一点。,2020/7/10,-40-,3.4 循环语句,do.while循环语句,do 循环体语句; while(表达式);,2020/7/10,-41-,/功能:计算1n个整数平方和的均值。 #include using namespace std; void main() int k(1), n, sum(0),mean; coutn;,2020/7/10,-42-,do sum=sum+k*k; k+; while(k0) mean=sum/n; else mean=0; cout mean = mean endl; ,2020/7/10,-43-,注意: (1)如果循环体语句多于一
17、条,必须采用用复合语句形式。 (2)循环体中要包含修改循环控制变量的语句,保证循环是有限循环。 (3)do-while循环是先执行循环体语句,后判断表达式真假。所以循环体至少要执行一次。 (4)while语句和do-while语句都能处理重复操作问题,如前面的求均值()问题。但while语句的循环体有可能一次也不执行,所以,在选择使用循环语句时,要合理利用它们各自的特点。,2020/7/10,-44-,3.4 循环语句,for循环语句 循环结构 1、表达式1 循环变量初始化; 2、表达式2 循环控制条件; 3、表达式3 循环变量的变化;,for (表达式1; 表达式2; 表达式3) 循环体;,
18、2020/7/10,-45-,#include using namespace std; void main() int k, n, sum(0),mean; coutn; for(k=1;k0) mean=sum/n; else mean=0; coutmeanendl; ,/计算1到10的阶乘。 #include using namespace std; void main() int n; unsigned long factorial(1); for(n=1; n=10;n+) factorial*=n; coutn!=factorialendl; ,例3.10 计算1到10的阶乘。,
19、2020/7/10,-47-,如果一个变量表示若干数的乘积,而且这个乘积是利用循环过程迭代计算的,则表示乘积的变量的初值要在循环开始前赋为确定值,具体值要根据题目而定(一般为1,如本题),防止表示乘积的变量为随机数或0,这是常用的编程技巧。,2020/7/10,-48-,3.4 循环语句,1、for: 最适合循环次数固定,循环规律非常明显程序。 2、while: 使用最多最频繁的循环结构,具有普适性。 3、do_while: 最适合至少循环一次的循环结构。,2020/7/10,-49-,3.4.4 转向语句,1、break语句 2、continue语句,2020/7/10,-50-,3.4.4
20、 转向语句break,用途: 常用在while、do-while、for和switch语句中,用来跳出循环或switch语句。,例1:判断输出结果?,#include using namespace std; void main() int sum=0; for (int i=1;i10;i+) if (i % 3=0) break; sum+=i; coutsumendl; ,分析 i sum 1 1 2 3 3 跳出,2020/7/10,-52-,3.4.4 转向语句continue,用途 用于循环语句中,结束本次循环,进行下一次循环;即跳过循环体中尚未执行的部分。,例1:判断输出结果?,
21、#include using namespace std; void main() int sum=0; for (int i=1;i10;i+) if (i % 3=0) continue; sum+=i; coutsumendl; ,分析 i sum 1 1 2 3 3 3 7 12 12 19 27 27 跳出,3.5 循环嵌套,3.5 循环嵌套,编程输出国际象棋棋盘 #include using namespace std; void main() for (int i=0;i8;i+) for (int j=0;j8;j+) if (i+j)%2=0) cout; else cout
22、 ; coutn; , ,此字符来源于Word中的特殊字符,2020/7/10,北京邮电大学电信工程学院计算机技术中心,-56-,思考,题目: 使用For循环输出如下图形: * * * * * * *,#include using namespace std; void main() for (int i=1;ii; j-) cout ; for (j=1; j=i; j+) cout*; coutendl; ,3.6 应用举例,2020/7/10,-59-,3.6 应用举例1,题目 任意输入一个整数,按位翻转输出。例如输入124,输出421。,#include using namespace
23、 std; void main() int i, n, result=0; coutn; cout按位翻转的结果为:; while (n!=0) i =n % 10; result=result*10+i; n /= 10; coutresultendl; ,输入124,输出421,2020/7/10,-61-,3.6 应用举例2,题目 一球从100米高度落下,每次落地后反弹回原高度的一半,再落下。编程求解它在第n次落地时,共经过多少米?,#include using namespace std; void main() double height=100; double sum=height
24、; for (int i=1;i10;i+) sum+=height; height/=2; coutsumendl; ,2020/7/10,-63-,例3.17 编写程序,计算方程ax2+bx+c=0的解。 分析:根据方程的系数取值,存在下面几种情况: (1) a=0, 不是二次方程; (2) b2-4ac=0, 有两个相等的实根; (3) b2-4ac0, 有两个不等的实根; (4) b2-4ac0, 有两个共轭复根. 所以,程序中将使用选择结构分别实现各种情况。,3.6 应用举例,2020/7/10,-64-,伪码: 开始 定义变量a,b,c,disk,x1,x2 输入方程系数a,b,c
25、 if a=0 输出不是二次方程 else 计算二次方程的根 结束,/细化伪码 开始 定义变量a,b,c,disk,x1,x2 输入方程系数a,b,c if a=0 输出不是二次方程,else 计算 disk=b2-4ac if disk=0 x1=x2=-b/(2a) 输出x1,x2 else if disk0 输出x1,x2 else 输出x1,x2 结束,/功能:计算方程ax2+bx+c=0的解 #include #include using namespace std; void main() ,void main() float a,b,c,disc,x1,x2,realpart,i
26、magpart; coutabc; coutThe equationendl; if(fabs(a)=1e-6) coutis not quadraticendl; else ,else disc=b*b-4*a*c; if(fabs(disc)1e-6) else ,if(fabs(disc)=1e-6) x1=-b/(2*a); couthas two equal roos:x1endl; ,else if (disc1e-6) x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); couthas distinct real roots:x1,
27、x2endl; ,else realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); couthas complex roots:endl; coutrealpart+imagpartiendl; coutrealpart-imagpartiendl; ,/功能:计算方程ax2+bx+c=0的解 #include #include using namespace std; void main() float a,b,c,disc,x1,x2,realpart,imagpart; coutabc; coutThe equationendl; if(fabs(a
28、)=1e-6) coutis not quadraticendl;,else disc=b*b-4*a*c; if(fabs(disc)1e-6) x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); couthas distinct real roots:x1,x2endl; ,else realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); couthas complex roots:endl; coutrealpart+imagpartiendl; coutrealpart-imagpartiendl;
29、,2020/7/10,-72-,实际编程中,我们可以从分析问题开始,用伪码帮助记录我们的分析结果,随着问题分析的不断深入,伪码被进一步细化,最后它能较详细地表示出解决问题的算法,我们便可基于伪码编写程序代码。当然,我们还可以采用流程图等其它工具辅助设计程序,记录流程。,2020/7/10,-73-,例 3.18 口袋中有红、黄、蓝、白、黑五种颜色的球若干个。每次从口袋中取出3个不同颜色的球,问有多少种取法。,3.6 应用举例,2020/7/10,-74-,分析:球只能是五种颜色之一。设取出的球为i、j、k,根据题意,i、j、k分别可以有五种取值,且ijk。采用穷举法,逐个检验每一种可能的组合,
30、从中找出符合要求的组合并输出。,2020/7/10,-75-,开始 定义五种颜色常量red(0),yellow(1),blue(2),white(3),black(4); 定义变量print; 定义变量n,loop,i,j,k; 初始化n(0),2020/7/10,-76-,for循环,第一个球的颜色i从red至black for循环,第二个球的颜色j从red至black for循环,第三个球的颜色k从red至black if代表三个球颜色的i,j,k的值不同,得到一种可行的取法, n+; for循环,分别输出三个球的颜色,共执行三次。 用switch语句将i,j,k的值分别赋给打印变量pri
31、nt 用switch语句,根据print的值,打印不同的颜色名称。 结束,/功能:模拟取球过程,找出三个球颜色不同的可能取法的数目。 #include using namespace std; void main() const red(0),yellow(1),blue(2),white(3),black(4); /五种颜色 short print; /打印球的颜色 short n, loop, i, j, k; n=0; for(i=red;i=black;i+) . couttotal:nendl; ,for(i=red;i=black;i+) for(j=red;j=black;j+)
32、 if(i!=j) /前两个球不同 for(k=red;k=black;k+) ,if(k!=i) ,switch(loop)/没有这步,下面字符串输出要写三遍。 case 1: print=i; break; case 2: print=j; break; case 3: print=k; break; default: break; ,switch(print) case red: cout red; break; case yellow: cout yellow; break; case blue: cout blue; break; case white: cout white; br
33、eak; case black: cout black; break; default: break; ,/功能:模拟取球过程,找出三个球颜色不同的可能取法的数目。 #include using namespace std; void main() const red(0),yellow(1),blue(2),white(3),black(4); /五种颜色 short print; /打印球的颜色 short n, loop, i, j, k; n=0;,for(i=red;i=black;i+) for(j=red;j=black;j+) if(i!=j) /前两个球不同 for(k=re
34、d;k=black;k+) if(k!=i),for(loop=1;loop=3;loop+) switch(loop)/没有这步,下面字符串输出要写三遍。 case 1: print=i; break; case 2: print=j; break; case 3: print=k; break; default: break; ,switch(print) case red: cout red; break; case yellow: cout yellow; break; case blue: cout blue; break; case white: cout white; break;,case b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国联合办公行业发展分析及发展趋势预测与投资风险研究报告
- 2025年航空机载测试设备项目可行性研究报告
- 2025-2030中国线圈和电缆加热器行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国纳米银行业市场运行分析及发展趋势与投资战略研究报告
- 2025-2030中国纯素食蛋白粉行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国粮油加工机械行业市场需求分析及发展趋势与投资价值研究报告
- 2025-2030中国科技食品行业发展前景及发展策略与投资风险研究报告
- 2025-2030中国碳水化合物阻滞剂补充剂行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国石膏装饰板行业发展分析及投资前景预测研究报告
- 2025-2030中国真皮面部填充剂行业市场发展趋势与前景展望战略分析研究报告
- 常见恶性心律失常的护理
- 浙江省杭州市金丽衢十二校2024-2025学年高三下学期(3月)第二次联考数学试题 含解析
- 2025年1月浙江省高考物理试卷(含答案)
- 天然气站租赁合同
- 2024年贵州贵州乌江煤层气勘探开发有限公司招聘笔试真题
- (一模)2025年广州市普通高中毕业班综合测试(一)生物试卷
- 第二季度营销计划与执行方案
- 【公开课】同一直线上二力的合成+课件+2024-2025学年+人教版(2024)初中物理八年级下册+
- DL∕T 5161.8-2018 电气装置安装工程质量检验及评定规程 第8部分:盘、柜及二次回路接线施工质量检验
- (正式版)HGT 22820-2024 化工安全仪表系统工程设计规范
- (2024年)桥梁施工质量控制要点
评论
0/150
提交评论