第三章流程控制语句.ppt
- 文档编号:18628073
- 上传时间:2023-08-21
- 格式:PPT
- 页数:75
- 大小:788KB
第三章流程控制语句.ppt
《第三章流程控制语句.ppt》由会员分享,可在线阅读,更多相关《第三章流程控制语句.ppt(75页珍藏版)》请在冰点文库上搜索。
第3章流程控制语句,一个C+程序可由若干个源程序文件组成,一个源程序文件可由若干个函数组成,一个函数可由若干条语句组成。
C+语句按功能分为:
操作运算语句:
用于描述计算机要执行操作运算的语句和流程控制语句:
控制操作运算执行顺序的语句。
本章主要内容:
C+的控制语句、程序基本结构,以及使用基本结构实现简单编程。
3.1程序的基本控制结构程序的控制结构:
控制程序中语句执行的顺序。
3种基本控制结构:
顺序结构、选择结构和循环结构。
3.1.1语句C+语言的基本语句有声明语句、表达式语句、空语句、复合语句等。
在C+语言中使用分号表示一条语句结束。
1声明语句声明语句是指对某种类型的变量、函数原型、结构、类等的说明。
例如:
inta=2;/声明一个变量voidfun(intx,floaty);/声明一个函数,2表达式语句在表达式后加上分号,就构成了一条表达式语句。
它的作用是执行表达式的计算。
例如:
a=a*2;/算术表达式语句a+;/后置自增表达式语句3空语句仅由分号组成的语句称为空语句,它不执行任何动作,通常用在需要语句但又没有任务工作要做的地方。
4复合语句复合语句又称块语句,是用一对花括号将一条或多条语句括起来组成的。
例如:
charch=3;coutchn;说明:
在复合语句中声明的变量,只能在复合语句内部有效。
复合语句被看成是单条语句,视作一个整体,用在需要用多条语句描述某问题,但语法上只能是一条语句的地方。
3.1.2顺序结构顺序结构是指程序执行时,按语句块编写顺序依次执行的结构。
如变量声明语句、赋值语句、函数调用语句等都属于顺序结构。
说明:
顺序结构中A和B整体上顺序执行,A和B既可以是单一的语句,也可以是由多个语句构成的语句块。
3.2选择结构选择结构又称分支结构,是指根据给定的条件进行判断,由判断结果再决定执行哪一步操作。
C+语言中的2类进行选择语句:
if语句和switch语句。
3.2.1if语句if语句的语法格式为:
if(表达式)语句块;语法规则:
如果表达式为真,则执行语句块;否则跳过此语句块,执行if结构下面的其它语句块。
【例3-1】编程求一个整数的绝对值。
#includevoidmain()inta;cina;if(a0)a=-a;coutaendl;,3.2.2if.else语句ifelse语句又称双分支选择结构,其语法格式为:
if(表达式)语句块A;else语句块B;语法规则:
如果表达式为真,则执行语句块A,否则执行语句块B。
【例3-2】用if.else语句编程求一个整数的绝对值。
#includevoidmain()inta;cina;if(a0)cout-a;elsecouta;coutendl;,3.2.3switch语句switch语句也称多分支选择语句,或称开关语句。
其语法格式为:
switch(表达式)case常量表达式1:
语句序列1;break;case常量表达式2:
语句序列2;break;case常量表达式n:
语句序列n;break;default:
语句序列n+1;,它的含义为:
先计算表达式的值并与各case后面的常量表达式的值比较,如果与第i(1in)个常量表达式相等,则执行语句序列i,直到遇到break语句,跳出switch结构,继续向下执行程序。
如果不与任何一个常量表达式相等,则执行语句序列n+1后跳出switch结构,继续向下执行程序。
图3-5switch语句流程图,在switch语句中,表达式的值只能是整型、字符型或枚举类型。
Case后面的常量表达式只能是整型数据、字符型数据或枚举类型数据,且每个常量表达式的值必须互不相同。
【例3-3】编写程序,根据输入的学生成绩,给出相应的等级。
假设90分以上为A,8089分为B,7079分为C,6069分为D,60分以下为E。
程序设计程序设计中出现多种分类的情形时,既可以使用嵌套的ifelse语句,也可以使用switch语句编写。
设用score变量表示学生成绩,由于switch语句不能表示数值的范围,因而需要作一定的处理,将取值范围转换成确定的取值,这里利用整数运算的特性,取score/10。
#includevoidmain()floatscore;/书上用的是int类型cinscore;switch(int(score)/10)case10:
case9:
coutAn;break;case8:
coutBn;break;case7:
coutCn;break;case6:
coutDn;break;default:
coutEn;,说明:
switch结构中的break语句不是必须的,它的作用是结束switch结构。
如果某个case下的语句中不包括break语句,则将继续执行switch结构的下一条语句,不需要进行新条件的判断。
switch结构中的default可以放在switch中的任何位置,且可以省略。
【例3-4】设grade表示学生成绩,根据输入值分析下列程序的输出结果。
#includevoidmain()intgrade;cingrade;switch(grade/10)case9:
case8:
case7:
case6:
cout通过n;break;default:
cout不通过n;,程序执行结果:
若输入大于等于60的整数,则输出“通过”,否则输出“不通过”。
3.2.4条件语句的嵌套根据求解问题的需要,编程时在if语句中可以嵌套if语句,还可以嵌套switch语句。
同样switch语句中也可以嵌套if语句,称为条件语句的嵌套。
【例3-5】从键盘输出一个字符,判断其类型。
假设字符分为控制字符(ASCII码小于32的字符)、大写字母、小写字母、数字字符和其他字符5类。
程序设计:
字符的输入:
为了包括如空格、换行符等字符,使用cin.get()函数读入输入一个字符由于字符在内存中以ASCII码的形式存储,故对于输入的字符,故以字符的ASCII码值判断字符类型。
例如:
若其ASCII码值大于等于字符A的ASCII码值,且小于等于字符Z的ASCII码值,则该字符为大写字母。
多条件选择时,每一情形之间的排他性以及所有情形的合一性。
#includevoidmain()charc;cin.get(c);if(c=A,注意:
在ifelse语句中,只能在if后面加条件,切不可加到else后面。
每个else必须跟唯一一个if配对,配对的方法是与在它上方离它最近,且没有配对过的if配对。
【例3-6】编写程序完成两个数的四则运算。
程序设计本题需要按输入的运算符确定具体的四则运算,是多选择问题,所以采用switch语句实现。
但对于除法运算中分母不能为0,故需要用条件语句进行判断。
#includevoidmain()floata,b;charch;coutachb;,switch(ch)case+:
couta+b=a+bn;break;case-:
couta-b=a-bn;break;case*:
couta*b=a*bn;break;case/:
if(b=0)cout分母不能为零!
n;elsecouta/b=a/bn;break;default:
cout表达式错误!
n;,3.3循环结构程序设计中常常需要重复执行一些语句,直到满足某条件为止,这种重复执行的过程称为循环。
C+中的3种循环语句:
while语句、dowhile语句和for语句。
3.3.1while语句while语句又称为当型循环,其语法格式为:
while(表达式)循环体;语法规则:
当表达式的值为真时,执行循环体,直至表达式的值是假为止。
说明:
表达式可以是任何合法的表达式,也可以是空表达式,称为循环控制条件,空表达式表示条件恒成立;循环体可以是一条语句、复合语句,也可以是空语句。
【例3-7】编写程序,求s=1+2+100的值。
程序设计设置一个变量如i,初始值为1,使其不断增加来控制循环次数,该变量称为循环变量,用ivoidmain()inti=1,s=0;while(i=100)/As+=i;i+;/改变循环变量coutsendl;,设计循环结构时的注意事项:
在执行程序的循环过程中,若循环无法终止,就形成了死循环或称无限循环。
例如,如果将上述程序A语句中的条件改为i=100,由于条件永远成立,因此是死循环。
注意循环的初始条件:
不同的初始条件可能导致循环体执行不同的循环次数和循环终止时循环变量的终止值的不同。
3.3.2dowhile语句dowhile语句又称直到型循环,其语法格式为:
do循环体;while(表达式);首先执行循环体,然后计算表达式的值,当表达式的值为真时执行循环体,直至表达式的值是假为止。
【例3-8】用dowhile语句编写程序,求s=1+2+100的值。
程序设计改用dowhile语句,即先做循环体,再判断循环条件,也即循环体至少做一次,此时需仔细考虑循环的边界条件。
#includevoidmain()inti=1,s=0;dos+=i;i+;while(i=100);coutsendl;,本例中循环体是一个由2条语句组成的复合语句,也可以改为一条语句:
dos+=i+;while(i=100);问题:
如果将自增语句改成前置,或放到循环条件上本程序又应该如何写呢?
如果修改变量i和s的初始值,程序该作怎样的修改?
3.3.3for语句for语句也是一种常用的循环语句,其语法格式为:
for(表达式1;表达式2;表达式3)循环体;for语句的执行过程:
步骤1:
执行表达式1;步骤2:
判断表达式2的值,若为真则执行循环体,转步骤3;否则循环结束,转步骤4;步骤3:
执行表达式3,转步骤2;步骤4:
执行for语句后面的语句。
在for语句中,3个表达式都可以是任何合法的表达式,也可以是空表达式,表达式1和表达式3空表示不做任何操作,表达式2空表示条件恒成立。
【例3-9】用for语句编写程序,求s=1+2+100的值。
程序设计实际上,3种循环语句的使用是可以相互转换的,在使用时要注意各变量初始值情况的变化,并且注意每种语句的语法格式,必须严格按照语法格式来写。
#includevoidmain()inti,s=0;for(i=1;i=100;i+)s+=i;coutsendl;,#includevoidmain()inti=1,s=0;for(;i=100;)s+=i;i+;coutsendl;,3.3.4循环语句的嵌套一个循环语句中可以包含另一个循环语句,也可以包含选择语句,称为循环语句的嵌套,也称为多重循环。
同样,选择语句中也可以包含循环语句。
【例3-10】编程计算s=1!
+2!
+10!
的值。
程序设计本题中,首先对每个循环变量i(1i10)要计算i!
,这里可通过循环变量j从1到i作乘法运算得到,然后才能求和,故需要双重循环。
#includevoidmain()inti,j,t,s=0;for(i=1;i=10;i+)/外层循环开始t=1;/Afor(j=1;j=i;j+)/内层循环开始t=t*j;/内层循环结束s+=t;/外层循环结束coutsendl;,3.3.5控制执行顺序的语句控制执行顺序的语句通常与循环语句一起使用,常用的有break、continue和goto语句。
1break语句break语句的语法格式为:
break;break语句的两种使用场景:
用于switch语句中时表示跳出switch结构;用于循环语句中时,表示跳出循环结构,接着继续执行循环体后面的语句。
【例3-11】编写程序,判断一个整数是否为素数。
算法思想:
判断整数n是否为素数时,用n分别除以数2n-1(或用n分别除以数2n/2,或分别用n除以数2),若都不能整除,则n是素数,否则n不是素数。
本例使用n分别除以数2n-1来判断。
#includevoidmain()intn,k=1;coutn;for(inti=2;i=n-1;i+)if(n%i=0)k=0;break;if(k)coutn是素数!
n;elsecoutn不是素数!
n;,程序解读:
(1)break语句执行的条件是(n%i=0),即n一旦能被i整除就结束循环,此时i=n-1。
(2)若n一直没有被i整除,虽然没有执行break,但当条件i=n-1不满足时,同样会结束循环。
此时k的值没有改变,仍为1。
(3)循环结束后,只要判断k是否为1就能确定n是否为素数。
(4)编程技巧说明:
变量k为标记变量;变量k用于标记整数n能否被2至n-1中的某个整数所整除。
本程序中也可以不使用变量k,直接判断n是否为素数。
主要代码如下:
for(inti=2;in-1)coutn是素数!
n;elsecoutn不是素数!
n;,2continue语句continue语句的语法格式为:
continue;说明:
continue语句只能用在循环语句中;continue语句的作用:
跳过continue后面的语句,结束本次循环,继续开始下一次循环。
【例3-12】编程求2100间的非素数。
程序设计对2100间的每一个数,逐个判断是否为素数,若是则跳过该数判断下一个数,否则输出。
这里分别用i除以数2i/2来判断i是否为素数。
#includevoidmain()inti,j,k=0;/变量k为计数器,用来存放素数的个数for(i=2;ii/2)/i是素数continue;/结束这一次循环k+;coutit;coutn;cout共有k个非素数.n;,3goto语句(略,编程时不要用)goto语句又称无条件转向语句,其语法格式为:
gotolabel;label:
语句;它的作用是将程序控制转移到label标号指定的语句处继续执行。
标号是由用户自定义的一个标识符。
在这里,goto语句与标号label必须在同一个函数中。
由于goto语句会破坏程序的结构,使得程序层次不清且不易阅读,故一般不主张使用。
3.3.6exit()和abort()函数exit()函数与abort()都是C+的库函数,其功能都是终止程序的执行,将控制返回给操作系统。
使用它们要包含头文件stdlib.h。
1exit()函数exit()函数的语法格式为:
exit(表达式);这里,表达式的值只能是整型数。
若表达式的值为零,为正常结束函数,此时系统会首先完成释放变量所占的存储空间,结束应用程序等工作后再结束函数;否则为非正常结束函数。
2abort()函数abort()函数的语法格式为:
abort();调用该函数时,括号内不能有任何参数。
在执行该函数时,系统不做结束程序前的收尾工作,直接终止程序的执行。
3.4程序举例【例3-13】编写程序,求方程ax2+bx+c=0的解。
程序设计从键盘输入方程系数a、b、c,利用条件语句,由求根公式判断方程解的情况。
#include#includevoidmain(void)floata,b,c,delta;coutabc;delta=b*b-4*a*c;,if(delta=0)delta=sqrt(delta);if(delta)/即delta0的情形cout方程有两个不同的实根;coutx1=(-b+delta)/2/at;coutx2=(-b-delta)/2/an;else/即delta=0的情形cout方程有两个相同的实根;coutx1=x2=-b/2/an;elsecout方程没有实根!
n;,【例3-14】求出所有的“水仙花数”。
程序设计所谓“水仙花数”是指一个3位数,其各位数字的立方和恰好等于该数本身。
例如153=1*1*1+5*5*5+3*3*3,所以153是“水仙花数”。
本题可由多种算法实现。
方法1:
穷举出所有3位数,对每一个3位数,分别先求出其百、十、个位上的数字,再求出各个数字的立方和。
最后判断其和与这个3位数是否相等。
方法2:
穷举出所有3位数,对每一个3位数,利用循环语句求出这个数的个位数,和个位数的立方和,并不断让该数被10整除,直到0为止。
最后判断其和与这个3位数是否相等。
方法3:
利用3重循环嵌套,穷举出所有3位数,判断由这3个数组成的3位数与其数字立方和是否相等。
方法1:
分解三位数的每一位#includevoidmain()inti,a,b,c;for(i=100;i=999;i+)a=i/100;/a是数i的百位数b=i/10-a*10;/b是数i的十位数c=i-b*10-a*100;/c是数i的个位数if(i=a*a*a+b*b*b+c*c*c)coutabcendl;,方法2:
降位法,每次只对其个位数进行操作#includevoidmain()inti,n,k,s;for(i=100;i=999;i+)s=0;n=i;while(n)k=n%10;n/=10;s+=k*k*k;if(i=s)coutiendl;,算法思想:
将“水仙花数”问题归结为求个位数及个位数的立方和,可以通过不断让该数被10整除,直到0为止来实现。
实现方法:
在循环语句中,求出该数的个位数后,该数除以10,把该数原十位数字降到个位上去,依此类推,直到该数为0。
方法3:
利用穷举法构造所有符合条件的三位数#includevoidmain()inti,j,k;for(i=1;i=9;i+)for(j=0;j=9;j+)for(k=0;k=9;k+)if(i*100+j*10+k=i*i*i+j*j*j+k*k*k)couti*100+j*10+kendl;,【例3-15】设计一个程序,求Fibonacci数列的前20项。
程序设计Fibonacci数列是指满足:
f1=1,f2=1,fn=fn-1+fn-2(n3)的数列。
本题可重复使用3个变量f1、f2和f3,从第3项至第20项,用循环语句由f3=f1+f2逐项计算出每一项。
#include#includevoidmain(void)longintf1=1,f2=1,f3;coutsetw(12)f1setw(12)f2;/输出前两项for(intn=3;n=20;n+)/从3到20项的循环体f3=f1+f2;coutsetw(12)f3;/输出新值f1=f2;f2=f3;/更新f1和f2,注意赋值次序if(n%4=0)coutn;/每行输出4个数coutendl;,重要程序设计思想:
值的存储:
程序运行过程中需要使用的值通过变量加以存储;变量值的迭代更新:
每次循环时参与运算的值发生变化,为使得下次计算时可用,应该逐次更新对应变量的值。
【例3-16】利用迭代法求平方根的近似值,要求前后两次求出的根的近似值之差的绝对值小于10-5。
迭代公式为:
算法思想:
定义变量x0和x1,a的平方根的估计通过迭代方式进行;设x1=a/2作为a的平方根的初始估计值;每次迭代估计时以上一次的估计值作为本次估计的初始值,即x1=x0,接着按照公式x1=(x0+a/x0)/2计算a的平方根的本次估计值,从而更新x1的值;也就是说,在每次估计时x0用于存储初始值,x1用于存储估计值;以|x1-x0|作为循环结束判定条件,若|x1-x0|则循环停止,否则,重复执行步骤3,其中为用户选择的估计精度。
#include#includevoidmain(void)floatx0,x1,a;couta;if(a1e-5);couta的平方根等于:
x1n;,【例3-17】用公式:
求的近似值,要求最后一项的绝对值不大于10-6。
算法思想:
先由公式,用循环语句求出满足精度要求的/4值,然后再计算的值。
每次迭代以更新分子和分母的方式思想新出现的那项的构造,分子的规律变化规律正负号交替变化,若intk=1,可使用语句k*=-1实现更新;分母的变化规律为等差数列,可以通过语句den+=2实现更新。
当满足精度要求时循环终止;否则重复步骤2.,#include#includevoidmain(void)doublepi=0,fac=1,den=1;intk=1;while(fabs(fac)1e-6)pi+=fac;den+=2;/更新分母k*=-1;/更新分子fac=k/den;pi*=4;cout的值为:
piendl;,2023/8/21,64,1、执行下列程序段后,变量i的值是:
inti=10;switch(i)case9:
i+=1;case10:
i+=1;case11:
i+=1;default:
i+=1;A、11B、12C、13D、14,习题,答案:
i=13,2023/8/21,65,2、关于下面程序段的正确说法是:
intn=0,s=0;while(!
n!
=0)s+=+n;coutsendl;A、执行结果是0B、执行结果是1C、程序执行无限次D、控制表达式非法。
答案:
B,2023/8/21,66,3、关于下面程序段的正确说法是:
intn=0;while(n+=2);coutn;A、执行结果是0B、执行结果是2C、执行结果是4D、程序段有语法错误,答案:
C,2023/8/21,67,4、已知:
inti=5;下面do-while循环语句的循环次数是:
docouti-endl;i-;while(i!
=0);A、0B、1C、5D、无限,答案:
D,第一行输出:
5第二行输出:
3第三行输出:
1,2023/8/21,68,5、下面程序的输出结果是:
#includevoidmain()for(inti=1;i5;i+)if(i%2)cout”*”;elsecontinue;cout”#”;cout”$”endl;,A、*#*#*#$B、#*#*#*$C、*#*#$D、#*#*$,答案:
C,2023/8/21,69,6、下列程序的输出结果是:
#includevoidmain()inti,j,k,s;for(i=1;i50;i+=5)s=0;j=i;k=i+3;dos+=i+,j+;while(jk);couti=its=sendl;,程序输出为i=57s=150,2023/8/21,70,6、编写程序求出200300之间的数,且满足条件:
它们个位、十位和百位上的3个数字之和为12,3个数字的积为42。
(程序中b是这个数十位上的数字),分析:
因为求得的这个数在200300之间,且必须满足:
个位、十位和百位上的3个数字之和为12,故这些数的百位数一定是2,假定其十位数用b(0=b=9)表示,则其个位数可以表示为(12-2-b)所以这个三位数可以表示为:
2*100+b*10+12-2-b个位、十位和百位上的3个数字的积为422*b*(12-2-b)=42,2023/8/21,71,#includevoidmain()intb;cout”endl;for(b=0;b=9;b+)if(2*b*(12-2-b)=42)cout(2*100+b*10+12-2-b)”;coutendl;coutendl;,2023/8/21,72,2023/8/21,73,7、有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问几天以后能卖完。
#includevoidmain()intday,x1,x2;day=0;x1=1020;while(x1)x2=x1/2-2;x1=x2;day+;coutday=dayendl;,2023/8/21,74,8、求两个数的最大公约数,#includevoidmain()intx,y;cinxy;for(inti=x;i0;i-)if(x%i=0,本章结束谢谢!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三 流程 控制 语句
![提示](https://static.bingdoc.com/images/bang_tan.gif)