C语言程序设计课件第2章 程序控制结构_第1页
C语言程序设计课件第2章 程序控制结构_第2页
C语言程序设计课件第2章 程序控制结构_第3页
C语言程序设计课件第2章 程序控制结构_第4页
C语言程序设计课件第2章 程序控制结构_第5页
已阅读5页,还剩63页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、值操作,复合赋值操作,增量、减量操作,函数调用操作和输入输出操作。例如:i+;-j;abs(x);coutij;sum=a+b;a=b=c;i=1,j=2;b*=c;4编辑课件2.1.3 复合语句形式: 作用:当程序中某个位置在语法上只允许一条语句,而在语义上要执行多条语句才能完成某个操作时,需要使用复合语句。例如:if(x=0) couta; coutb; 5编辑课件2.1.4 空语句形式: ; 作用: 当程序中某个位置在语法上需要一条语句,而在语义上又不 要求执行任何动作时,可放上一条空语句。一般适用于在循环语句中做空循环体例如: for (m = 0; m1000; m+) ;6编辑课件

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

4、意数据类型,输入时各个数据之间用空格键、Tab键或Enter键分隔。 例如:int a,b;cinab;键盘上输入:93a9键盘b3键盘8编辑课件2. 标准输出流cout负责将数据输出到屏幕上,使用插入运算符“”就可以将数据显示在屏幕上当前光标所在位置。语法格式: cout表达式1表达式2表达式n; 表达式可以是任意类型的,数据输出的格式由系统自动决定。9编辑课件表2.1 常用格式控制符格式控制符说 明示 例语 句结 果endl输出换行符cout120endl240;120240dec十进制表示coutdec120;120hex十六进制表示couthex120;78oct八进制表示coutoc

5、t120;170setw(int n)设置数据输出的宽度coutxsetw(3)y;x y(中间有2个空格)10编辑课件表2.1 常用格式控制符格式控制符说 明示 例语 句结 果setfill(char c)设置填充字符coutsetfill()setw(6)120;120setprecision(int n)设置浮点数的精度(有效数字位数或小数位数)coutsetprecision(5)12.3456;12.346setiosflags(ios:fixed)定点格式输出coutsetiosflags(ios:fixed) 12.3456789;12.345679setiosflags(ios

6、:scientific)指数格式输出coutsetiosflags(ios:scientific) 12.3456789;1.234568e+00111编辑课件【例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=nendl;coutpai_1=pai_1 , pai_2=pai_2endl;coutch1=ch1 , ch2=ch2en

7、dl;coutok=okendl;cout!ok=!okendl; return 0;图2.2 cout应用示例12编辑课件【例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(10)bendl; coutsetw(10)setfill(#)bendl;coutsetiosflag

8、s(ios:scientific)bendl; coutsetprecision(3)bendl;coutsetprecision(2)bb,则将a、b交换,否则不交换。两数交换可采用借助于第三个变量间接交换的方法 if(ab)t=a;a=b;b=t;16编辑课件#include using namespace std;int main()int a,b,t;cout请输入两个整数a,b:ab; 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; 17编辑课件2if- else语句(双分支)

9、 if(表达式) 语句1 else 语句2true表达式语句1false语句2图2.7 双分支if语句流程图18编辑课件【例2.4】输入一个年份,判断是否为闰年。分析 闰年的年份可以被4整除而不能被100整除,或者能被400整除。 #include using namespace std;int main()int year;coutyear;if(year%4=0 & year%100 !=0)|(year%400=0) coutyear年是闰年endl;else coutyear年不是闰年endl; return 0;19编辑课件3if- else if 语句(多分支)if(表达式1) 语

10、句1 else if(表达式2) 语句2 else if (表达式n) 语句n else 语句n+1falsefalsefalsetruetrue表达式1表达式2表达式n语句n语句n+1语句2语句1true20编辑课件【例2.5】根据x的值,计算分段函数y的值。y的计算公式为:21编辑课件#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

11、);couty=y0) if(y0) coutx与y均大于0; else coutx大于0,y小于等于0;注意:如何使之与第一个if配对?24编辑课件【例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;25编辑课件2.2.2 switch语句switch (

12、表达式) case 常量表达式1: 语句1 case 常量表达式2: 语句2 case 常量表达式n: 语句n default: 语句序列n+1 注意:表达式只能是整型、字符型或枚举型注意:常量表达式1n的值必须各不相同。26编辑课件有无无false有无falsetrue计算表达式的值常量表达式1语句1break常量表达式2语句2break无有false常量表达式ntrue语句nbreakdefault语句n+1true有图2.12 switch语句执行流程27编辑课件【例2.7】将输入的百分制成绩按以下规定转换成相应的等级: 成 绩 等级10090 优秀 8980 良好 7970 中等 69

13、60 及格 590 不及格 28编辑课件#include using namespace std;int main()float score;coutscore;if(score=0 & score=100)switch(int(score)/10) case 10: case 9: coutscore分:优秀endl;break; case 8: coutscore分:良好endl;break; case 7: coutscore分:中等endl;break; case 6: coutscore分:及格endl;break; default:coutscore“分:不及格”endl; els

14、e cout输入数据有误!endl; return 0;共用同一个语句组 思考:若省去break语句,情况会怎样? 29编辑课件2.3 循环结构按照给定规则重复地执行程序中的语句 2.3.1 while 语句while (表达式) 语句falsetrue表达式语句图2.14 while语句流程图循环条件,其值为true(非0)、false(0)循环体30编辑课件【例2.8】求 1+2+3+100#include using namespace std;int main()int i(1),sum(0); /定义变量,初始化while(i=100) /构造循环 sum+=i; / 循环体,多次执

15、行 i+; coutsum=sumendl; return 0;循环条件初值循环次数1234.99100101sumi0112真33真64真105真真100真101真5050假sum50500sum1i1233641005050101循环结束!实际上是将i不停地累加到一起31编辑课件【例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;32编辑课件2.3.2 do-while语句do 语句whil

16、e (表达式);falsetrue表达式语句图2.15 do-while语句流程图33编辑课件【例2.10】 求自然数1100之和,要求用do-while语句实现。#include using namespace std;int main()int i(1),sum(0); dosum+=i; i+;while(i=100); coutsum=sumendl; return 0; int i(1),sum(0); while(i2) cout”I like C+!”endl; / 相当于一个空操作语句do cout”I like C+!”2); / 输出一行文字信息注意: dowhile首先执

17、行循环体,然后再判断表达式,至少执行一次循环体。当第一次循环表达式的值为真时,while与dowhile的结果完全一样,否则结果不相同。35编辑课件【例2.11】输入一个自然数,将该数的每一位数字按反序输出。例如:输入12345,输出54321。#include using namespace std;void main()unsigned long int num,digital;coutnum;dodigital=num%10; num/=10;cout0);coutendl;36编辑课件for(表达式1;表达式2;表达式3 ) 表达式2执行非00退出循环表达式1表达式3表达式1;whil

18、e(表达式2) ; 表达式3;2.3.3 for 语句37编辑课件【例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.13】 一个小球从100米高处落下,每次落地后反弹回原高度的一半,再落下。求它在第10次落地时共经过多少米?第10次反弹多高?分析:第1次落地后反弹高度为h=100/2第2次落地时经过的米数为s=100+h*2第2次落地后反弹高度为h=h/2第3次落地

19、时经过的米数为s=s+h*239编辑课件#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编辑课件注意:for语句中的三个表达式可以部分省略或全部省略,但;不能省略,若省略表达式2,则表示循环条件为真。for( ;i=100) brea

20、k ; / break语句用于跳出循环 int sum=0;for(int i=1; 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;42编辑课件2.3.4 多重循环循环嵌套:循环体内包含另一个完整的循环结构。三种循环语句皆可以相互嵌套 。for() while() do while();43编辑课件【例2.14】 编程显示输出九九乘法表 图2.19 九九乘法表运行

21、界面44编辑课件truefalsei=1i=9 ?truefalsej=1j=9 ?显示i*j表达式j+i+#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;45编辑课件图2.21 下三角的九九乘法表图2.22 上三角的九九乘法表思考:打印上三角或下三角程序如何改动?46编辑课件注意:(1)内循环控制变量与外循环控制变量不能同名。(2)外循环必须完全包含

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

23、 #include using namespace std;const int M=20;int main()int i,n,sum=0;cout请输入若干个正整数(输入负数就结束输入):endl;for(i=0;in;if(n0) break; / 当输入负数时,就退出循环sum+=n;cout 输入的正整数之和为:sumendl; return 0;49编辑课件2.4.2 continue 语句格式: continue;功能:只用在循环体中,用来结束该次循环。在循环体中遇到continue语句时,本次循环结束,回到循环条件判断是否执行下一次循环。50编辑课件在while和do-while循

24、环结构中,continue语句将使执行流程直接跳转到循环条件的判定部分,然后决定循环是否继续进行。在for循环结构中,当遇到continue时,执行流程将跳过循环体中余下的语句,而转去执行for语句中的表达式3,然后根据表达式2进行循环条件的判定以决定是否继续执行for循环体。51编辑课件while(i=100) break; coutsumendl;while(i=100) continue; break和continue语句的区别52编辑课件【例 2.16】 输出100以内能够被7整除的所有整数。#include #include using namespace std;int main(

25、)for(int i=1;i=100;i+)if(i%7!=0) continue; /如果i不能被7整除,则退出本次循环coutsetw(5)i;coutendl; return 0;思考:(1)将continue改为break,则输出有什么变化?(2)不采用continue语句,用其它方法如何实现?53编辑课件2.4.3 goto语句goto 标号;标号: 语句;标号语句将流程转到标号所指定的标号语句处。54编辑课件【例 2.17】利用goto语句实现计算前100个自然数之和并输出结果#include using namespace std;int main()int i=1,sum=0;

26、loop: sum+=i; i+; if(i=100) goto loop; coutsum=sumn(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; 56编辑课件#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;57编

27、辑课件【例 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之间的数整

28、除。(3)在退出循环以后,如果是因为找到了一个能整除m的数而通过break退出循环的,则i=sqrt(m) ;反之,如果是正常退出循环的,则i=sqrt(m)+1。因此,在循环结束后,只要判断i是否大于sqrt(m),若是,则表明m是素数,输出该素数。(4)要判断多个素数是否为素数,需要使用双重循环。外循环每循环一次提供一个数,由内循环通过多次除法判断其是否为素数。58编辑课件#include #include using namespace std;int main()cout3100之间的素数是:endl; for(int m=3;m100;m+=2) int k=int(sqrt(m);

29、for(int i=2;ik) coutmt;coutendl; return 0;59编辑课件【例 2.20】 输入x,计算sin(x)。计算公式为:当第n项的绝对值小于10-6时结束。分析:关键是找部分级数和的通项:60编辑课件int n=1;double x,t,sinx(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)=

30、sin(x)endl; 61编辑课件【例 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 ; 62编辑课件方法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 ;63编辑课件【例 2.22】 用“枚举法”求解百元买百鸡

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论