




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章 C+的流程控制语句,5.1 C+语言的语句和程序结构 5.2 选择结构语句 5.3 循环结构语句 5.4 转向语句 5.5 程序举例 5.6 程序调试方法简介 作业:47,9,10(1),19(2),20,5.1 C+语言的语句和程序结构,一个C+源程序:由若干个源程序文件组成。 一个源程序文件:由编译预处理命令、全局类型定义、全局变量定义、函数定义等组成。 一个函数:包括函数首部和函数体。函数体包含局部类型定义、局部变量定义、函数原型声明、编译预处理命令、若干个语句等。,C+语句的分类,说明语句:完成数据类型和变量的定义。 控制语句:改变程序执行顺序的语句,包括:条件、循环、开关、转
2、向、返回语句。 函数调用语句:在函数调用后加分号构成。如: sin(x); 表达式语句:在表达式后加分号构成。如: i=i+1; 空语句:仅由一个分号所构成,不执行任何动作。 复合语句(也称块语句):用花括号把一个或多个语句括起来后构成的语句。作为一个语句处理。,5.2 选择结构语句,选择语句也称分支语句:根据给定条件,选择执行两个或两个以上分支程序段中的某一个。 C+语言的选择语句: 条件语句:if。有三种形式。 开关语句:switch。,条件语句,格式1: if() S 其中,是任何C+表达式,通常为算术表达式、关系表达式、逻辑表达式或逗号表达式;S是一个单一语句,包括复合语句和空语句。作
3、为判断条件的必须用括号括起来。 格式2: if() S1 else S2,例5.1 从键盘上输入三个整数,输出三个数中的最大数。 分析:先读入三个数,求出前两个数中的大数,再求出该大数与第三个数之间的最大数。 #include void main(void) int a,b,c,t; coutabc; if(ab) t=a; else t=b; /A coutc) couttn;else coutcn;/C ,A、B、C三行可用下列语句替代: t=a; if(tb) t=b; if(tc) t=c; coutn最大数是tendl;,例5.2 求ax2+bx+c=0的根。a、b、c从键盘输入,a
4、0。 分析:当输入a、b、c的值后,若b2-4ac0,则方程有两个不同的实根;若b2-4ac=O,则方程有两个相等的实根。 #include #include void main(void) float a,b,c,delta; coutabc; delta=b*b-4*a*c;,if(delta=0) /使用复合语句 delta=sqrt(delta); if(delta) cout方程有两个不同的实根:; coutnx1=(-b+delta)/2/a; couttx2=(-b-delta)/2/an; else cout方程有两个相等的实根:x1=x2= -b/2/an; else cou
5、t方程没有实根!n; ,条件语句,格式3: if() S1 else if() S2 else if . else Sn 注意,当出现如下形式的嵌套条件语句时: if(e1) if(e2) S1 else S2 C+规定:else与其前面最近的还没有配对的if进行配对。这样,上面的条件语句中else与第二个if配对。若希望else与第一个if配对,则可用改变: if(e1) if(e2) S1 else S2,例5.3 输入三角形的三边,判断其为何种三角形。 #include void main(void) int a,b,c; coutabc; if(a+b=c|b+c=a|a+c=b) c
6、out不能组成三角形!n; else if(a=b ,开关语句: switch,格式: switch() case :; break; case :; break; case :; break; default: ,开关语句: switch,执行过程: 先求的值,再依次与case后面的比较,若与某一的值相等,则转去执行该case后边的语句序列,一直执行下去,直至遇到break语句或开关语句的右花括号为止。否则,若有default分支,则执行该分支后边的语句序列,否则什么也不执行。 与if语句相比: 任一开关语句均可用条件语句来实现,但反之不然。原因是开关语句限定表达式的取值类型,而条件语句中的
7、条件表达式可取任意类型的值。 开关语句结构清晰,易理解。,例5.4 输入一个字符,判断它是元音字母还是空白符。 #include void main(void) char c; cin.get(c); switch(c) case a: case A: case e: case E: case i: case I: case o: case O: case u: case U: cout这是元音字母n; break; case : case n: case t: cout这是空白符n; break; default: cout这是其它字符n; ,请画程序流程图 用if语句改写本例,5.3 循环
8、结构语句,循环:某条件成立时,重复执行的操作。 问题:计算1+2+3+100。 分析:编程时不可能依次列出1100个数。设 变量sum累计和值,初值为1; 变量i 存放当前待累计的数,初值为2。 算法: s1.给变量sum赋初值1,i赋初值2; s2.令sum=sum+i,i=i+1; s3.若i=100,则转s2; s4.输出sum的值。,s2和s3是重复执行的操作。 while、dowhile和for语句实现循环,并把这三个语句称为循环结构语句。,while语句,格式: while() S 其中,表达式是任何表达式;语句S是任一语句,称为循环体。 执行过程:先计算表达式的值,若表达式的值不
9、等于0,则执行语句S,再计算表达式的值,重复以上过程,直到表达式的值等于0为止。,特点:先判断后执行,故循环体有可能一次也不执行。,例5.6 用while语句求1+2+3+100的值。 #include void main(void) int i=2,/待求和的当前项 s=1;/当前项前所有项的累加和 while(i=100) s+=i; i+; cout1+2+3+100=sn; ,必须明确所用变量的含义及初值,或:while(i=100) s+=i,i+; 或:while(i=100) s+=i+;,dowhile语句,格式: do 语句 while(); 语句为任一语句,是循环体;表达式
10、是任一表达式。 执行过程:先执行语句,后判断表达式的值;若表达式的值不为0,则继续执行循环体,直到表达式的值为0时为止。,特点:先执行后判断,故循环体至少执行一次。,例5.7 用dowhile语句求1+2+100。 #include void main(void) int i=2, /待求和的当前项 s=1; /当前项前所有项的累加和 do s+=i+; while(i=100); cout1+2+3+100=sn; ,for语句,格式: for(;) 语句 表达式13是任何表达式;语句是任一语句,为循环体。,特点:先判断后执行,循环体有可能一次也不执行。,执行过程: 计算表达式1; 若表达式
11、2的值为0,则执行,否则转; 执行语句,计算表达式3,转; 结束循环。,例5.8 用for语句求1+2+100。 #include void main(void) int i,/待求和的当前项 s;/当前项前所有项的累加和 for(i=2,s=1;i=100;i+) s+=i; cout1+2+3+100=sendl; ,表达式1通常用于设置循环初值,多为赋值表达式和逗号表达式。,表达式2通常用于循环结束条件的判断,多为关系表达式、逻辑表达式。,表达式3通常用于改变循环的结束条件。,从循环的组成要素上讲,for语句的常用形式应为: for(循环变量初始化;循环结束条件;循环变量更新) 循环体语
12、句 例5.9 输入一行字符,并按输入的顺序输出该行字符。 #include void main(void) char c; cout“输入一行字符串:n; for(cin.get(c);c!=n;cin.get(c) coutc;/依次输出字符 coutc;/输出最后一个字符,即结束条件n ,三种循环语句的比较,for和while语句都是先判断循环条件,循环体可能一次也不执行。而dowhile语句是先执行循环体,后判断循环条件,所以循环体至少要执行一次。因此对于至少要执行一次重复结构的程序段,建议使用dowhile语句,而对于其他的重复结构的程序段,可使用for或while语句。 由于for语
13、句有三个表达式,可分别用于循环变量初始化、循环结束条件和循环控制变量的更新,所以用得最多的是for语句,其次是while语句,而dowhile语句相对于前两种语句用得少一些。,合理使用循环语句,合理使用循环语句,可优化程序结构,精简程序。例如,例5.9 再用while和dowhile语句实现:,#include void main(void) char c; cout“输入字符串:n; cin.get(c); while(c!=n) coutc; cin.get(c); coutc; ,#include void main(void) char c; cout“输入字符串:n; do cin.
14、get(c); coutc; while(c!=n); ,从例5.9的三个程序可见,本例用dowhile语句时,程序最简,其次为for语句,再次为while语句。,循环的嵌套及其应用,循环的嵌套:循环的内嵌语句也可以是循环语句。 例5.10 输出1000以内所有完数。“完数”是指与其因子之和相等的数。例如6=123,即6是完数。输出完数按如下形式,例如,对于完数6,应显示: 6=1+2+3 分析: sum保存一个数的因子和; i1000以内的一个数,初值为2,终值为1000; j i的试探因子,取值从1到i/2。因1是i的因子,故直接作为sum的初值,j的初值为2。若i%j为0,则说明j是i的
15、因子,则sum+=j。,#include void main(void) int i, /1000以内的一个数 j, /i的试探因子 sum;/i的因子和 for(i=2;i=1000;i+) /外层for语句 for(sum=1,j=2;j=i/2;j+)/内层for语句 if(i%j=0) sum+=j; if(sum=i) /i是完数,按指定格式输出 couti=1”; for(j=2;j=i/2;j+) /因未存i的因子,需再求 if(i%j=0) cout+j; coutendl; ,5.4 转向语句,goto语句是一条非常简单的无条件转向语句,它可以将程序的执行流程转到程序中的任何
16、位置,通常是从它所在的地方转移到带有标号的语句处。 goto语句与条件语句组合,可形成当型和直到型循环。 滥用goto语句,会导致程序流程过于复杂,降低程序的可读性、可维护性等。 软件危机爆发后,goto语句一度成为争论的焦点。 结构化程序设计为了保持程序结构的单入口、单出口特性,严格限制直接使用goto语句,但考虑到有时不得不改变程序执行的流程,C+语言提供了功能受到限制的转向语句break和continue来替代goto语句。,break语句,格式: break; 该语句只用在switch或循环语句中。 用在开关语句switch中的某个分支语句中,其作用是结束开关语句的执行,并把控制转移到
17、该开关语句之后的第一个语句执行。 用在循环语句的循环体中,当执行到break语句时,直接结束该循环语句的执行,把控制转移到紧跟该循环语句之后的语句执行。,例5.11 判别所输入的一个大于1的正整数是否是素数。 #include #include void main(void) int x,i,j; /x存放所输入的正整数 coutx; for(i=2,j=(int)sqrt(x);ij) coutx是素数!n; else coutx不是素数!n; ,特别关注:当循环语句存在多个结束出口时,通常会在该循环结束后,对不同结束出口作出不同的处理,因此,正确区分不同结束出口是非常重要的。,问题:例5.
18、11程序中的for语句 能否不用break语句?若能,如何修改for语句?,continue语句,格式: continue; 只用在循环语句的循环体中,作用是结束本次循环的循环体,提前进入下一次循环。对于while和dowhile循环来说,若遇到continue,则跳到循环的位置;而对于for循环来说,则跳到for循环的处。 与break语句的区别:break是结束循环;continue是结束本次循环,提前进入下一次循环。,例5.12 输入两个大于1的正整数并输出。若输入有误,则给出提示并允许重新输入,直到输入正确为止。 分析: 检查输入数据很重要。例如在例5.11中,若运行时输入整数1,程序
19、输出也是1是素数!。程序运行时,难免输入出错,应允许用户重新输入,直到输入正确为止,除非特殊场合,如用户身份验证等。 为了便于输入出错时重新输入,程序使用dowhile循环,并设置一个输入出错标志error,用作输出不同提示信息的依据和循环结束条件。,#include void main(void) int x,y, /x、y分别存放所输入的正整数 error=0;/输入出错标志。为1时出错,为0时正常 coutx; if(xy; if(y2) error=1; while(error); /error为1表示输入出错,需要重新输入 coutnn输入的两个数为x,yendl; ,goto语句简
20、介*,标号 label:S S是任一语句,包括空语句;label为语句标号,简称为标号,采用标识符。标号无需定义,可直接使用。 goto语句 goto label; 其中,label是语句标号,当执行到该语句时,无条件地将控制转移到标有该标号的语句处执行。,*goto语句的主要用途,从循环体内转移到循环体外:但可用break或continue替代。 从多层循环的内层跳到外层循环外:但这种用法不符合结构化编程原则,不提倡使用。 不允许从循环语句的外面转移到循环语句的里面。 与if语句构成循环:如例5.13所示。但可由while、dowhile和for取代,因此也不提倡这样使用。,例5.13 用g
21、oto和if构成循环,求1+2+100的值。 #include void main(void) int i=2, /待求和的当前项 s=1; /当前项前的所有项的累加和 lp: if(i=100)/goto语句和if语句构成while型循环 s+=i+; goto lp; cout1+2+3+100=sn; ,exit()函数,exit( )函数是stdlib.h库中的函数,原型为: void exit(int status); 执行该函数时,将终止当前程序的执行并将控制返还操作系统。但终止前,系统要做必要的收尾工作,如关闭该程序打开的文件,写完缓冲输出的内容,释放变量占用内存(不含堆内存)等
22、。status为终止程序的原因,0表示正常退出,非0表示异常退出。,5.5 程序举例,例5.14 编程计算1!+2!+10!。 分析:每项都是计算阶乘,可用循环结构处理。#include void main(void) int i,/取值从110,初值为2 p,/保存i!,初值为1 s;/前i个阶乘和,初值为1 for(i=2,p=1,s=1;i=10;i+) p*=i; s+=p; cout1!+2!+3!+10!=sn; ,程序运行结果: 1!+2!+3!+10!=4037913,n!的溢出问题及处理,用double或long double型变量存放阶乘值。对于某些C+系统,可用8字节整型
23、,如VC+的_int64。 自编大整数运算程序:例如使用字符型数组实现。 近似方法:当阶乘值大于等于10时,就除以10,使指数加1。最后将尾数和指数分别输出。,#include void main(void) int i,e; /e保存阶乘的指数,初值为0 double p;/保存阶乘的尾数,初值为1 for(i=2,p=1,e=0;i=10)/阶乘p反复除以10,分离指数 p/=10.0; e+; cout1000000!=peeendl; ,程序运行结果: 1000000!=8.26393e5565708,例5.15 编写程序,利用以下公式计算的近似值,直到最后一项的绝对值小于10-8为止
24、。 分析:本题属于求和问题,可用循环语句解决。 主要特点: 所算的项数是未知,循环的结束条件是最后一项的绝对值小于10-8。 每个计算项的符号正负相间,每一项的分母比前一项增加2。 要求计算到最后一项的绝对值小于10-8,即有效位数超过7位,已超出float型的精度范围,应使用double型。,#include #include #include void main() double pi=0,/4的前n项的和,初值为0 t=1, /4的当前项的值,初值为1 n=1; /n表示分母 int s=-1; /s表示符号 while(fabs(t)=1E-8) pi+=t; n+=2; s=-s;
25、t=-s/n; coutsetiosflags(ios:fixed) setprecision(8)pi*4endl; ,程序运行结果: 3.14159263,例5.16 用迭代法求 的近似值。求平方根的迭代公式为: 直到|xn+1-xn|10-8为止。 分析:迭代法是数值近似计算的重要方法之一。 变量a 存放输入的正数 变量x0 代表公式里的xn,初值为a/2 变量x1 代表公式里的xn+1,其值由公式计算 算法: 若|x1-x0|10-8则x1就是所求平方根的近似值; 否则将x1赋给x0,再计算新的x1,重复上述过程。,#include #include #include void mai
26、n(void) double x0,x1,a; couta; while(aa; ,x1=a/2; do x0=x1; x1=(x0+a/x0)/2; while(fabs(x1-x0)1e-8); couta的平方根等于: setiosflags(ios:fixed) setprecision(8)x1n; ,程序运行结果: 输入一个正数:3 3的平方根等于:1.73205081,例5.17 输入一行字符,分别统计数字字符、字母字符和其它字符的个数。 分析:输入任何字符使用cin.get()函数。 源程序: #include void main(void) int digit=0, /统计数
27、字字符的个数 letter=0, /统计字母字符的个数 other=0; /统计其他字符的个数 char c;,cout=0 ,例5.18 用生成伪随机数的库函数rand(),设计一个自动出题程序,能实现两位正整数的四则运算。四则运算的具体类型也由随机数确定。共出10题,每题10分,最后给出总分。注意,减法计算题要保证被减数大于等于减数,除法的结果为商。 分析: 伪随机数库函数rand()的介绍参见3.4.2节。 两位正整数的范围是1099,共90个数,因此,用rand()函数生成的两位正整数可表示为: rand()%90+10 其它说明参见程序中的注释。源程序如下。,源程序: #includ
28、e #include void main(void) int i, /循环变量,用作出题序号 a,b, /随机生成的两个操作数 c, /计算机算出的参考答案 d, /答题者算出的答案 op, /随机生成的运算类型 sum=0; /答题者答题累计所得分数 srand(c); /初始化伪随机数发生器,for(i=0;i10;i+) a=rand()%90+10;b=rand()%90+10;op=rand()%4; switch(op) case 0: couta+b=; c=a+b; break; case 1: if(ab) int t=a; a=b; b=t; couta-b=; c=a-b
29、; break; case 2: couta*b=; c=a*b; break; case 3: couta/b=; c=a/b; ,cind; if(d=c) sum+=10; cout正确,加10分!n; else cout错误,不得分!n; cout“10题中,答对:”sum/10 “题,得分:sumn; ,例5.19 在同一坐标中输出sinx和cosx两条曲线。应注意处理以下问题: 用s代表sinx曲线,用c代表cosx曲线; 当x为某值时,若sinx=cosx,此时只要求输出s; 输出一条轴(x轴),由字符l或!或|构成。 分析: 字符界面:每屏25行,每行80个字符。若显示内容超过
30、25行,则前面显示的内容向前滚动并消失。 坐标系统:为了便于周期性显示正弦和余弦曲线,将显示器的水平方向作为y轴,垂直方向作为x轴。 正弦和余弦函数的取值范围为-1,1,需将其展宽映射到-38,38,再映射到1,77,以便显示。 为了整屏显示正弦和余弦函数的一个周期,从一个周期上等间隔取了24点。,#include #include #define PI 3.1415926 void main(void) int i,sinx,cosx; for(float x=0;x2*PI;x+=PI/12) cosx=39+(int)(38*cos(x); sinx=39+(int)(38*sin(x); for(i=1;i80;i+) /注意输出字符的顺序 if(i=sinx) couts; else if(i=cosx) coutc; else if(i=39) coutl; else cout ; coutn; ,5.6 程序调试方法简介,用分支和循环语句编程,可处理的问题更加广泛。 随着程序复杂性的增加,出错的机会增大
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网络规划设计师考试情景应用试题及答案
- 药品检验的基本流程与标准试题及答案
- 常见卫生管理证书考点分析试题及答案
- 探索育婴师考试案例分析的价值试题及答案
- 孕产妇考试题及答案
- 网络规划设计师考试组织管理与协调试题及答案
- 卫生管理证书考试内容分析试题及答案
- 英语近义词考试题及答案
- 小学说理型试题及答案
- 药物制剂技术发展试题及答案
- 湖南省2025届高三“一起考”大联考(模拟二)语文试题及参考答案
- 2024年中国职工保险互助会陕西办事处招聘笔试真题
- 商业地产项目整体经营方案
- 旅行社代订业务合同模板
- 2025年4月自考13887经济学原理中级押题及答案
- 2025广东广州市花都区恒悦房地产开发有限公司招聘项目用工人员16人笔试参考题库附带答案详解
- 琴行规章制度
- 医疗大数据平台的运营管理策略
- 医院内部控制岗位职责与流程优化
- 2025年中国石油钻采专用设备行业竞争格局及市场发展潜力预测报告
- 公司事故隐患内部报告奖励制度
评论
0/150
提交评论