《第02章流程控制语句.ppt》由会员分享,可在线阅读,更多相关《第02章流程控制语句.ppt(68页珍藏版)》请在三一办公上搜索。
1、2.1 操作运算语句2.2 流程控制语句 2.2.1 顺序结构 2.2.2 选择结构 2.2.3 循环结构 2.2.4 循环嵌套 2.2.5 break语句与continue语句 2.2.6 abort()与exit()函数 2.3 程序举例,第二章 流程控制语句,VC+程序的语句按其功能可划分为两类:操作运算语句与流程控制语句。常见的操作运算语句有:空语句、赋值语句、表达式语句、块语句等。1.空语句语法格式为:;空语句不做任何操作运算,只是一种形式上的语句。,2.1 操作运算语句,2.赋值语句语法格式为:变量=表达式;例如:设有 int a,b,c;a=1;b=c=a+2;则a的值为1;b的
2、值为3;c的值为3。注:“=”为赋值运算符,其左边只能是一个变量,不能是常量和表达式。,3.表达式语句 任何一个表达式后面加上一个分号就构成了表达式语句。例如,以下都是表达式语句:a=3+5;a=1,b=2,c=3;4.块语句(又称为复合语句)块语句是由一对花括号 括起来的多个语句组成,在逻辑上它相当于一个语句,可以出现在只允许出现一个语句的位置。语法格式为:语句1;语句2;语句n;例如:t=a;a=b;b=t;注意:一个块语句的右花括号“”之后没有分号。,2.2 流程控制语句,C+的基本的控制结构有三种:顺序结构,选择结构,循环结构。,2.2.1 顺序结构顺序结构就是指按照语句在程序中的先后
3、次序一条一条的从上到下依次执行。,例2-1 从键盘输入一个三位正整数,求出各位数字,并将其逆序逐个输出。,算法:利用整除与求模运算,将三位数中的个、十、百位数字分离。,编程实现:#includevoid main()int n,i,j,k;cinn;i=n/100;/求百位数 j=n/10%10;/求十位数 k=n%10;/求个位数 cout 逆序数码为:ktjtiendl;,调试与运行:输入:123 输出:逆序数码为:3 2 1,学习与实践:若输入的数值是三位小数,怎样分离出各个数码?,2.2.2 选择结构,选择结构通过对给定的条件进行判断,从而决定执行两个或多个分支中的哪一支。VC+程序中
4、提供的选择语句有三类:(1)if 语句(2)ifelse 语句(3)switch 语句,1、if 语句,其语法格式为:if(表达式)语句;语法含义:if后的语句称为内嵌语句,语法上只能是单一语句,可以是块语句,也可以是空语句。“表达式”值有两种情况:0与非0,语法规定以非0表示真,以0表示假。执行if语句时,首先计算表达式的值,若其为真(值为非0),则执行内嵌语句;若为假(值为0),则跳过内嵌语句,执行后继语句。,图2-2 if语句流程图,例2-2 从键盘输入一个整数,若大于0,输出1;若小于等于0,则输出-1。,编程实现:#include void main()int a;couta;if(
5、a 0)/A行 cout1endl;if(a=0)/B行 cout-1endl;,调试与运行:输入:3 输出:1 再运行一次:输入:-5 输出:-1,学习与实践:(1)若将A行改:if(a0);输入的数据-5,输出结果如何?(2)若再将B行删除,分别输入的3与-5,输出结果如何?(3)怎样实现:输入正数、零、负数,分别输出1、0、-1?,今天作业1、怎样实现:输入正数、零、负数,分别输出1、0、-1?2、从键盘输入一个英文字母,判断:如果是大写字母,将它改写为小写字母;如果是小写字母,将它改为大写字母。,例2-3 写程序,判断某一年是否闰年。,算法分析:某年份如果是闰年,则该年份能被400整除
6、,或能被4整除但不能被100整除。,(year%4=0&year%100!=0)|(year%400=0),#include void main(void)int year,leap;coutyear;if(year%4=0,调试与运行:please input a year:20082008 is a leap year.,执行过程:首先计算“表达式”值;如果其值为真,则执行语句1;如果其值为假,则执行语句2。,2、ifelse语句基本格式为:if(表达式)语句1;else 语句2;,图2-3中,条件为真时执行语句1,否则执行语句2。语句1与语句2中,一定执行且只执行其中的一条语句。,2.2
7、.2 选择结构,例2-4 求方程ax2+bx+c=0的解。其中系数a,b,c由键盘输入。算法:根据一元二次方程求解方法。,程序解读:(1)用到求平方根函数sqrt(),必须包含其头文件。(2)作为条件判断的“表达式”可以是变量、常量、关系表达式、逻辑表达式、赋值表达式等。(3)作为内嵌语句1或语句2,同样可以是单句、空语句、块语句和条件语句等。,#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)/if(delta0)cou
8、t方程有两个不同的实根;coutx1=(-b+delta)/2/at;coutx2=(-b-delta)/2/an;else cout方程有两个相同的实根;coutx1=x2=-b/2/an;else cout方程没有实根!n;,3、if语句的嵌套,if语句或ifelse语句中的内嵌语句又可以是if语句或ifelse语句,这样就形成了if语句的嵌套。当多个if语句嵌套时,为了防止出现二义性,VC+语言规定:同一个块中,else总是与其前面的最靠近它的未经配对的if配对。,例:if()if()语句1elseif()语句2else 语句3,例:if()if()语句1elseif()语句2else
9、语句3,当if和else数目不同时,可以加花括号来确定配对关系。,练习:,#include void main(void)int a=0,b=1,c=0,d=20;if(a)d=-10;else if(!b)if(!c)d=15;else d=25;cout“d=”dendl;,输出结果:d=20,3、if语句的嵌套,例2-5 判断输入字符的种类。把字符分为五类:数字、大写字母、小写字母、控制字符(其ASCII的编码小于32)和其他字符。,编程实现:,#include void main(void)char ch;cin.get(ch);if(ch=0,调试与运行:输入:1 输出:这是一个数字
10、字符。再运行一次:输入:a 输出:这是一个小写字符。,程序解读:库函数cin.get(ch)表示逐个读取字符,不管其是空格还是控制字符。编程时,为了防止if语句的嵌套出错,可以用一对大括号将ifelse语句变为块语句。,4、switch语句,switch语句是多分支的选择语句,也称开关语句。语法格式为:switch(表达式)case 常量表达式1:语句序列1;break;case 常量表达式2:语句序列2;break;case 常量表达式n:语句序列n;break;default:语句序列n+1;,switch语句的执行顺序是:,(1)首先对“表达式”进行计算,得到一个整型常量值。(2)然后在
11、case 子句寻找与此值相匹配的常量表达式(3)找到相匹配的常量,则以此作为入口,开始顺序执行入口处后面的语句序列。语句序列中如果遇到break语句,则跳出switch语句,转而执行switch结构后的其他语句;如果没有遇到break语句,则顺序执行后面case子句中的语句序列,直至遇到break语句或执行完所有switch后面的语句。,(4)如果没有找到相匹配的常量表达式。如果有default,则执行default其后的语句序列;如果没有default,则结束switch语句,转而执行switch结构后的其它语句。如图2-5所示。,例2-6 从键盘输入任一整数,根据不同情况,输出结果。对下列
12、程序,当输入分别为2、1、3、7时,输出结果是什么。,#include void main()int n;cinn;switch(n)case 1:coutn+t;case 2:coutn+endl;break;case 3:coutn+t;case 6:coutChinan;break;default:coutGOOD!endl;,输入:2 输出:2,输入:1 输出:1 2,输入:3 输出:3 China,输入:7 输出:GOOD!,(1)在各个分支中的break语句起着退出switch语句的作用。(2)各个case(包括default)语句的出现次序可以任意。(3)switch结构可以嵌套
13、。(4)switch结构可以没有default分支。(5)case 后面表达式的值不能相同。(6)可以使多个case语句共用一组语句序列。,2.2.2 选择结构,程序解读:,#include void main(void)int choice;coutchoice;switch(choice)case 0:cout“您输入的数是零”endl;break;case 1:cout“您输入的数是 壹”endl;break;case 2:cout“您输入的数是 贰”endl;break;default:cout“您输入的数不是有效数字”endl;cout“程序结束!”endl;,调试与运行:输入:0
14、输出:您输入的数是零 程序结束!,5、条件运算符“?:”,格式:表达式1?表达式2:表达式3功能:根据表达式1的值来确定整个表达式的结果,如果其值为真,则以表达式2的值作为结果,否则,以表达式3的值作为结果。例如,求出两个数中的最大值,可以表示为:max=ab?a:b;条件运算符也可以嵌套。例如,求出三个数中的最大值,可以表示为:max=ab?ac?a:c:bc?b:c;,max=ab?(ac?a:c):(bc?b:c);,注意:条件运算符优先级高于赋值运算符,低于关系运算符和算术运算符。条件运算符的结合方向为“自右至左”。“表达式2”和“表达式3”不仅可以是数值表达式,还可以是赋值表达式或函
15、数表达式。条件表达式中,表达式的类型可以与表达式和表达式的类型不同。char ch;ch=(ch=A,练习:,1、int a=2,b=3,c=4;求表达式 max=ab?ac?a:c:bc?b:c;等价于max=ab?(ac?a:c):(bc?b:c);2、int a=1,b=2,c=3,d=4;求表达式ab?a:cd?c:d的值是多少?ab?a:cd?c:d 等价于 ab?a:(cd?c:d),max=4,ab?a:cd?c:d的值是4,int sum,i;sum=0;i=1;/循环变量初始化 while(i=10)/判断条件 sum=sum+i;/循环体 i+;/改变循环变量的值 cout
16、“sum=”sumendl;,int sum,i;i=0;sum=0;i=1;sum+=i;i+;i=2;sum+=i;i+;i=3;sum+=i;i+;i=9;sum+=i;i+;i=10;sum+=i;i+;i=11;共计算了10次。,例:计算1+2+3+10的值,2.2.3 循环结构,VC+提供了三种循环控制语句:while语句,dowhile语句,for语句。三种语句都由相似的三部分组成:进入循环的条件,循环体,退出循环的条件;完成的功能也类似。不同的是三者进入与退出循环的方式不同。如图2-6所示。,1、while 语句,语法格式为:while(条件表达式)循环体;功能:首先对条件表达
17、式进行判断,若判断结果为假(值为0),则跳过循环体,执行while结构后面的语句。若判断结果为真(值为非0),则进入循环体,执行其中的语句。执行完一次循环体语句后,修改循环变量,再对条件表达式进行判断,若判断结果为真,则再执行一次循环体语句,依次类推,直到判断结果为假时,退出while循环语句,转而执行后面的语句。即“先判断后执行”。,注意:(1)如果循环体只包含一个语句,则一对花括号可以省略。(2)仔细定义循环变量的初始值和判断条件的边界值。(3)对条件表达式的计算总是比循环体的执行多一次。这是因为最后一次判断条件为假时不执行循环体。(4)当循环体不实现任何功能时,要使用空语句作为循 环体,
18、表示为:while(条件表达式);(5)循环体中,改变循环变量的值很重要。如果循环变 量的值恒定不变,或者当条件表达式为一常数时,将会 导致无限循环(也即死循环)。,2、do-while 语句,语法格式为:do 循环体;while(条件表达式);功能:当流程到达do后,立即执行循环体,然后再对条件表达式进行判断。若条件表达式的值为真,则重复执行循环体语句,否则退出。即“先执行后判断”。如计算sum=1+2+3+10的值。sum=0;i=1;/循环变量初始化 do sum+=i;i+;/循环体与改变循环变量的值 while(i=10);/判断条件,while和do-while循环的比较(1)#i
19、nclude(2)#include void main(void)void main(void)int sum=0,i;int sum=0,i;cini;cini;while(i=10)do sum=sum+i;sum=sum+i;i+;i+;while(i=10);cout“sum=”sum;cout“sum=”sum;,运行结果:1 sum=55 再运行一次:11sum=0,运行结果:1sum=55 再运行一次:11sum=11,while语句和do-while语句的比较:,说明:(1)当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。否则,二者结果不相同。与whil
20、e语句不同的是:while语句有可能一次都不执行循环体,而dowhile循环至少执行一次,因为直到程序到达循环体的尾部遇到while时,才知道继续条件是什么。(2)为明显区分它们,dowhile循环体即使是一个单语句,习惯上也使用花括号括起来,while(表达式)直接写在花括号“”的后面,并且最后一定要加一个分号。,例2-7:用迭代法求 的近似值。任务:求平方根近似值。算法:(1)求平方根的迭代公式为:要求前后两次求出的根的近似值之差的绝对值 小于10-5。(2)把输入的正数赋给a,并把a/2的值作为x0的初值,根据以上公式就可以求出x1,若|x1-x0|10-5,则x1就是所求的平方根的近似
21、值;否则将x1 赋给 x0,再根据公式求出x1,重复以上过 程,直到|x1-x0|10-5 为止。,编程实现:,#include#include void main(void)float x0,x1,a;couta;if(a1e-5);couta的平方根等于:x1n;,调试与运行:输入:2 输出:1.414,今天作业1、p39页2题、3题、5题。(作业本上),3、for 语句,语法格式为:for(表达式1;表达式2;表达式3)循环体 说明:表达式1称为初始化表达式,一般用于对循环体涉及的变量进行初始化或赋初值;表达式2称为条件表达式,当它的判断条件为真时,就执行循环体语句,否则终止循环,退出f
22、or结构;表达式3称为修正表达式,一般用于在每次循环体执行之后,对循环变量进行修改操作;循环体是当表达式2为真时执行的一组语句序列(循环体)。,for语句执行过程:(1)先执行表达式1;(2)判断表达式2,若为0(假),则结束循环,并转到(5);(3)若表达式2为非0(真),则执行循环体,然后执行表达式3;(4)转回(2);(5)执行for语句下面的一个语句。,a,例如,计算sum=1+2+3+10的for循环结构如下:sum=0;for(i=1;i=10;i+)/初始化,判断条件,修改方式,都在小括号中描述 sum+=i;/循环体相对简洁 使用循环结构时必须注意,如果循环的控制条件永远成立,
23、循环体将永无休止地反复执行,程序就将陷入“死循环”,这显然是应当防止的。,说明:(1)for语句中的“表达式1”可以省略,但应在for语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如 for(;i=10;i+)sum=sum+i;执行时,跳过“求解表达式1”这一步,其他不变。(2)如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。例如:for(i=1;i+)sum=sum+i;表达式1是一个赋值表达式,表达式2空缺。它相当于:int i=1;while(1)sum=sum+1;i+;,(3)表达式3也可以省略,但此时程序设计者应另外设法保
24、证循环能正常结束。如:for(i=1;i=10;)sum=sum+i;i+;(4)可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如:for(;i=10;)while(i=10)sum=sum+i;相当于 sum=sum+i;i+;i+;,在这种情况下,完全等同于while语句。可见for语句比while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。,(5)3个表达式都可省略,如:for(;)语句 相当于 while(1)语句 即不设初值,不判断条件(认为表达式2为真值),循环 变量不增值。无终止地执行循环体。(6)表达式1可以是设置循环变量初值的赋值表达式
25、,也可以是与循环变量无关的其他表达式。如:for(sum=0;i=10;i+)sum=sum+i;表达式3也可以是与循环控制无关的任意表达式。表达式1和表达式3可以是一个表达式,也可以是逗号表达式,中间用逗号间隔。,如:for(sum=0,i=1;i=10;i+)sum=sum+i;或 for(i=0,j=10;i=j;i+,j-)k=i+j;/*表达式1和表达式3都是逗号表达式,各包含两个赋值表达式,即同时设两个初值,使两个变量增值.*/在逗号表达式内按自左至右顺序求解,整个逗号表达式的值为其中最右边的表达式的值。如:for(i=1;i=10;i+,i+)sum=sum+i;相当于 for(
26、i=1;i=10;i=i+2)sum=sum+i;(7)表达式一般是关系表达式(如i=100)或逻辑表达式(如ab&xy),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。,例2-8 打印九九乘法表,编程实现:#include#include void main(void)int i,j;coutn;for(i=1;i10;i+)/A行 for(j=1;j=i;j+)/B行 coutsetw(4)i*j;coutn;/C行,运行结果:1 4 6 9 8 12 1610 15 20 2512 18 24 30 3614 21 28 35 42 4916 24 32 40 48 5
27、6 6418 27 36 45 54 63 72 81,2.2.4 循环嵌套,程序解读:循环可以互相嵌套,但在循环的嵌套中要注意,内层循环应完全在外层循环里面,不允许出现交叉。在嵌套的循环结构中,如用缺口矩形表示每层循环结构时,则图2-8中(a)、(b)是正确的多层循环结构,而(c)是错误的多层循环结构,因为它出现了循环结构的交叉。,几种循环语句的比较:,1、若要对某个条件进行判断,为真或为假分别执行不同的语句,用if语句。2、需要检测的条件很多时,可以用if-else语句。3、若对数字或字符进行检测并且条件较多时,用switch语句。4、若能够确定循环的次数时用for语句。5、若不能确定循环
28、的次数时用while语句。6、若循环体中的语句至少要执行一次,那么用do-while语句。,下列程序的运行结果是:,#include void main(void)for(int i=0;i=3;i+)for(int j=0;j=5;j+)if(i=0|j=0|i=3|j=5)cout“*”;else cout“”;coutendl;,运行结果:*,2.2.5 其它控制语句与函数,在VC+中,还提供了一类跳转语句。这类语句的总体功能是中断当前某段程序的执行,并跳转到程序的其他位置继续执行。常见的跳转语句有三种:break语句、continue语句与goto语句。其中,goto语句不作介绍。,1
29、、break语句,break语句的作用是:结束当前正在执行的循环(for、while、dowhile)或多路分支(switch)程序结构,转而执行这些结构后面的语句。在switch语句中,break用来使流程跳出switch语句,继续执行switch后的语句。在循环语句中,break用来从最近的封闭循环体内跳出。注意:break语句只能用在循环语句与switch语句中。,2、continue语句,continue语句的作用是:结束当前正在执行的这一次循环(for、while、dowhile),接着执行下一次循环。即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。continue语
30、句和break语句的区别是:continue语句只结束本次循环,而不是终止整个循环的执行,它将使循环又一次重新开始。而break语句则是结束本次循环,不再进行条件判断。注意:continue语句只能用在循环语句中。,例2-9 输出1到10之间的不能被3整除的数。,#includevoid main()for(int i=1;i=10;i+)if(i%3=0)continue;/A 行 cout it;coutendl;,调试与运行:输出:1 2 4 5 7 8 10,程序解读:当i被3整除时,执行continue语句,结束本次循环,即跳过cout语句,转去执行i+,进入下一次循环。只有i不能被
31、3整除时,才执行cout函数,输出i。,学习与实践:若将程序A 行continue语句换成break语句,输出如何?,例2-10 求出100以内的所有素数(质数),并按每行五个数据输出。算法:(1)所谓素数,即只能被1和自身整除的数。如2,3,7,11等。(2)判断一个数n是否为素数,可用循环语句实现,循环控制变量i从2变化到n-1,只要有一次n能被i整除,n就不是素数,否则n是素数。,编程实现:,#include#includevoid main()int i,n,count=0;for(n=2;nn-1)coutsetw(4)n;count+;if(count%5=0)coutendl;,
32、调试与运行:2 3 5 7 1113 17 19 23 2931 37 41 43 4753 59 61 67 7173 79 83 89 97,程序解读:,(1)setw()函数是设置输出数据的宽度,使用时必须包含其头文件。#include(2)该程序是由两层循环组成的循环嵌套结构,第一层称为外循环,自for(n=2;n=100;+n)开始到程序末,第二层称为内循环,自for(i=2;i=n-1;+i)开始到coutendl;语句。break语句执行的条件是(n%i=0),即n能被i整除,一旦该条件成立就强行结束内循环。例如当n=9时由于9能被3整除,所以内层循环执行到i=3就强行结束。,2
33、.3 程序举例,例2-12 求出所有的“水仙花数”。“水仙花数”是指一个三位数,其各位数字的立方和恰好等于该数本身。例如 153=1*1*1+5*5*5+3*3*3,所以153是“水仙花数”。,算法:本题可由多种算法实现。算法一:究举出所有三位数,对每一个三位数,分别先求出其百、十、个位上的数字,再求出各个数字的立方和。最后判断其和与这个三位数是否相等。算法二:究举出所有三位数,对每一个三位数,利用循环语句求出这个数的个位数,和个位数的立方和,并不断让该被10整除,直到0为止。最后判断其和与这个三位数是否相等。算法三:利用三重循环嵌套,究举出所有三位数,判断由这三个数组成的三位数与其数字立方和
34、是否相等。,算法一:,#include void main()int i,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;,算法二:,#includevoid main()int i,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;,调试与运行:输出:153370371407,算法三:
35、,#includevoid main()int i,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)cout i*100+j*10+k endl;,例2-13 设计一个程序,求Fibonacci数列的前20项。算法:求Fibonacci数列的计算公式为:f1=1,f2=1,fn=fn-1+fn-2。当n=1 时,第一项的值为1;当n=2时,第二项的值为1;当n.2时,其值为其前二项之和。,编程实现:,#include#include void main(void)long in
36、t f1=1,f2=1,f3;cout setw(12)f1 setw(12)f2;/输出前两项 for(int n=3;n=20;n+)/从3到 20 项的循环体 f3=f1+f2;cout setw(12)f3;/输出新值 f1=f2;f2=f3;/更新f1和f2,注意赋值次序 if(n%4=0)coutn;cout endl;,运行结果:1 1 2 3 5 8 13 2134 55 89 144 377 610 987 1597 2584 4181 6765,2.2.6 abort()与exit()函数,abort()与exit()函数都是VC+提供的库函数,其功能都是中止程序的执行,将
37、控制返回给操作系统。使用时必须加上头文件1、abort()函数使用格式:abort();调用该函数时括号内不能加任何参数。执行此函数时系统不做结束程序前的收尾工作,直接终止程序的执行。2、exit()函数使用格式:exit(表达式);执行此函数时系统要做终止程序执行前的收尾工作。如关闭该程序打开的文件,释放变量所占存储空间等。,练习题,1、编写程序,从键盘任意输入三个整数,按由小到大输出。2、从键盘上输入十个实型数,求出这十个数之和与平均值,用循环语句实现。3、从键盘上输入一个整数n的值,按下式求出y的值,并输出n和y的值。y=1!+2!+3!+n!4、设计一个程序,求出100到1000之间的所有素数。,练习题,5、设计一个程序,输入一个任意整数(1至4位),求出各位数字之和,并统计出位数。6、找出1-999之间全部同构数。同构数是这样组数:它出现在其平方数的右边。如5是25右边的数,25是在25右边的数,故5和25是同构数。7、编写程序,求满足下列两个条件的最小自然数n并将结果显示在屏幕上:n的个位数字是6;将n的个位数字6移到最高位数字之前(如153846称过后为615384),所得的新数恰为n的4倍。,教育改变人生,励志改变命运!,The End!Thank you!,
链接地址:https://www.31ppt.com/p-4873007.html