《C++的流程控制语句讲义42853.pptx》由会员分享,可在线阅读,更多相关《C++的流程控制语句讲义42853.pptx(64页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第5章章 C+的流程控制语句的流程控制语句5.1 5.1 C+C+语言的语句和程序结构语言的语句和程序结构5.2 5.2 选择结构语句选择结构语句5.3 5.3 循环结构语句循环结构语句5.4 5.4 转向语句转向语句5.5 5.5 程序举例程序举例5.6 5.6 程序调试方法简介程序调试方法简介作业:作业:4 47,9,10(1),19(2),207,9,10(1),19(2),205.1 5.1 C+C+语言的语句和程序结构语言的语句和程序结构一个一个C+C+源程序:由若干个源程序文件组成。源程序:由若干个源程序文件组成。一个源程序文件:由编译预处理命令、全局类型一个源程序文件:由编译预
2、处理命令、全局类型定义、全局变量定义、函数定义等组成。定义、全局变量定义、函数定义等组成。一个函数:包括函数首部和函数体。函数体包含一个函数:包括函数首部和函数体。函数体包含局部类型定义、局部变量定义、函数原型声明、局部类型定义、局部变量定义、函数原型声明、编译预处理命令、若干个语句等。编译预处理命令、若干个语句等。C+语句的分类语句的分类说明语句:完成数据类型和变量的定义。说明语句:完成数据类型和变量的定义。控制语句:改变程序执行顺序的语句,包括:条件、控制语句:改变程序执行顺序的语句,包括:条件、循环、开关、转向、返回语句。循环、开关、转向、返回语句。函数调用语句:在函数调用后加分号构成。
3、如:函数调用语句:在函数调用后加分号构成。如:sin(x);sin(x);表达式语句:在表达式后加分号构成。如:表达式语句:在表达式后加分号构成。如:i=i+1;i=i+1;空语句:仅由一个分号所构成,不执行任何动作。空语句:仅由一个分号所构成,不执行任何动作。复合语句复合语句(也称块语句也称块语句):用花括号:用花括号把一个或多个语把一个或多个语句括起来后构成的语句。作为一个语句处理。句括起来后构成的语句。作为一个语句处理。5.2 5.2 选择结选择结构构语语句句选择语句也称分支语句:根据给定条件,选择语句也称分支语句:根据给定条件,选择执行两个或两个以上分支程序段中的选择执行两个或两个以上
4、分支程序段中的某一个。某一个。C+C+语言的选择语句:语言的选择语句:条件条件语语句句:ifif。有三种形式。有三种形式。开关开关语语句句:switchswitch。条件语句条件语句格式格式1 1:if(if()S S 其中,其中,是任何是任何C+C+表达表达式,通常为算术表达式、关系式,通常为算术表达式、关系表达式、逻辑表达式或逗号表表达式、逻辑表达式或逗号表达式;达式;S S是一个单一语句,包括是一个单一语句,包括复合语句和空语句。作为判断复合语句和空语句。作为判断条件的条件的 必须用括号括必须用括号括起来。起来。格式格式2 2:if(if()S1 else S2S1 else S2例例5
5、.1 5.1 从键盘上输入三个整数,输出三个数中的最大数。从键盘上输入三个整数,输出三个数中的最大数。分析:先读入三个数,求出前两个数中的大数,再求出该大数与分析:先读入三个数,求出前两个数中的大数,再求出该大数与第三个数之间的最大数。第三个数之间的最大数。#includeincludevoid main(void)void main(void)int a,b,c,t;int a,b,c,t;cout coutabc;cinabc;if(ab)t=a;else t=b;/A if(ab)t=a;else t=b;/A cout coutc)couttn;else coutcc)couttn;e
6、lse coutcn;/C A A、B B、C C三行可用下列语句替代:三行可用下列语句替代:t=a;t=a;if(tb)t=b;if(tb)t=b;if(tc)t=c;if(tc)t=c;coutncoutn最大数是最大数是tendl;tendl;例例5.2 5.2 求求axax2 2+bx+c=0+bx+c=0的根。的根。a a、b b、c c从键盘输入,从键盘输入,aa0 0。分析:当输入分析:当输入a a、b b、c c的值后,若的值后,若b b2 2-4ac0-4ac0-4ac0,则方程有两个不同的实根;若,则方程有两个不同的实根;若b b2 2-4ac=O4ac=O,则方程有两个相
7、等的实根。,则方程有两个相等的实根。#includeinclude#include#includevoid main(void)void main(void)float a,b,c,delta;float a,b,c,delta;cout coutabc;cinabc;delta=b*b-4*a*c;delta=b*b-4*a*c;if(delta=0)/if(delta=0)/使用复合语句使用复合语句 delta=sqrt(delta);delta=sqrt(delta);if(delta)if(delta)cout cout方程有两个不同的实根:方程有两个不同的实根:;coutnx1=(-
8、b+delta)/2/a;coutnx1=(-b+delta)/2/a;couttx2=(-b-delta)/2/an;couttx2=(-b-delta)/2/an;else else cout cout方程有两个相等的实根:方程有两个相等的实根:x1=x2=x1=x2=-b/2/an;-b/2/an;else cout else cout方程没有实根方程没有实根!n;n;条件语句条件语句格式格式3 3:if(if()1)S1S1 else if(else if()2)S2S2 else if.else if.else Sn else Sn注意,当出现如下形式的嵌套条件语句时:注意,当出现如
9、下形式的嵌套条件语句时:if(e1)if(e2)S1 else S2if(e1)if(e2)S1 else S2 C+C+规定:规定:elseelse与其前面最近的还没有配对的与其前面最近的还没有配对的ifif进行进行配对。这样,上面的条件语句中配对。这样,上面的条件语句中elseelse与第二个与第二个ifif配对。配对。若希望若希望elseelse与第一个与第一个ifif配对,则可用配对,则可用改变:改变:if(e1)if(e2)S1 else S2if(e1)if(e2)S1 else S2例例5.3 5.3 输入三角形的三边,判断其为何种三角形。输入三角形的三边,判断其为何种三角形。#
10、includeincludevoid main(void)void main(void)int a,b,c;int a,b,c;cout coutabc;cinabc;if(a+b=c|b+c=a|a+c=b)if(a+b=c|b+c=a|a+c=b)cout cout不能组成三角形!不能组成三角形!n;n;else if(a=b&b=c)else if(a=b&b=c)cout cout等边三角形等边三角形 n;n;else if(a=b|b=c|c=a)else if(a=b|b=c|c=a)cout cout等腰三角形等腰三角形 n;n;else if(a*a+b*b=c*c|b*b+c
11、*c=a*a|a*a+c*c=b*b)else if(a*a+b*b=c*c|b*b+c*c=a*a|a*a+c*c=b*b)cout cout直角三角形直角三角形 n;n;else else cout cout普通三角形普通三角形 n;n;开关语句:开关语句:switchswitch格式:格式:switch(switch()case case:;1;break;break;case case:;2;break;break;case case:;break;n;break;default:default:值只能是字符型或整型值只能是字符型或整型可选项可选项defaultdefault分支可放在
12、开关语句中分支可放在开关语句中的任何位置,通常为开关语句的任何位置,通常为开关语句的最后一个分支。的最后一个分支。应加空格,否则被认为是语句应加空格,否则被认为是语句标号,如标号,如case9,并不出现语并不出现语法错,这类错误较难查找。法错,这类错误较难查找。的值必须互不相同的值必须互不相同开关语句:开关语句:switchswitch执行过程:执行过程:先求先求 的值,再依次与的值,再依次与casecase后面的后面的 比较,若与某一比较,若与某一 的值相等,则转去执的值相等,则转去执行该行该casecase后边的语句序列,一直执行下去,直至遇到后边的语句序列,一直执行下去,直至遇到brea
13、kbreak语句或开关语句的右花括号为止。否则,若有语句或开关语句的右花括号为止。否则,若有defaultdefault分支,则执行该分支后边的语句序列,否则什分支,则执行该分支后边的语句序列,否则什么也不执行。么也不执行。与与ifif语句相比:语句相比:任一开关任一开关语语句均可用条件句均可用条件语语句来句来实现实现,但反之不然。,但反之不然。原因是开关原因是开关语语句限定表达式的取句限定表达式的取值类值类型,而条件型,而条件语语句句中的条件表达式可取任意中的条件表达式可取任意类类型的型的值值。开关开关语语句句结结构清晰,易理解。构清晰,易理解。例例5.4 5.4 输入一个字符,判断它是元音
14、字母还是空白符。输入一个字符,判断它是元音字母还是空白符。#includeincludevoid main(void)void main(void)char c;char c;cin.get(c);cin.get(c);switch(c)switch(c)case a:case A:case e:case E:case a:case A:case e:case E:case i:case I:case o:case O:case i:case I:case o:case O:case u:case U:case u:case U:cout cout这是元音字母这是元音字母 n;break;n;
15、break;case :case n:case t:case :case n:case t:cout cout这是空白符这是空白符 n;break;n;break;default:cout default:cout这是其它字符这是其它字符 n;n;请画程序流程图请画程序流程图用用if语句改写本例语句改写本例若若defaultdefault分支及其语句前移到第一个分支,分支及其语句前移到第一个分支,则如何修改程序而保持功能不变?则如何修改程序而保持功能不变?当省略当省略casecase后面的语句序列时,则可后面的语句序列时,则可实现多个入口,执行同一语句序列。实现多个入口,执行同一语句序列。5.
16、3 5.3 循循环结环结构构语语句句循环:某条件成立时,重复执行的操作。循环:某条件成立时,重复执行的操作。问题:计算问题:计算1+2+3+1001+2+3+100。分析:编程时不可能依次列出分析:编程时不可能依次列出1 1100100个数。设个数。设 变量变量sumsum累计和值累计和值,初值为初值为1 1;变量变量i i 存放当前待累计的数,初值为存放当前待累计的数,初值为2 2。算法:算法:s1.s1.给变量给变量sumsum赋初值赋初值1,1,i i赋初值赋初值2 2;s2.s2.令令sum=sum+i,i=i+1sum=sum+i,i=i+1;s3.s3.若若i=100i=100,则
17、转则转s2s2;s4.s4.输出输出sumsum的值。的值。s2s2和和s3s3是重复执行的操作。是重复执行的操作。whilewhile、dowhiledowhile和和forfor语语句实现循环,并把这三个语句实现循环,并把这三个语句称为循环结构语句。句称为循环结构语句。while语句语句格式:格式:while(while()S S 其中,表达式是任何表达其中,表达式是任何表达式;语句式;语句S S是任一语句,是任一语句,称为循环体。称为循环体。执行过程:先计算表达式执行过程:先计算表达式的值,若表达式的值不等的值,若表达式的值不等于于0 0,则执行语句,则执行语句S S,再计再计算表达式的
18、值,重复以上算表达式的值,重复以上过程,直到表达式的值等过程,直到表达式的值等于于0 0为止。为止。特点:先判断后执行,特点:先判断后执行,故循环体有可能一次也故循环体有可能一次也不执行。不执行。例例5.6 5.6 用用whilewhile语句求语句求1+2+3+1001+2+3+100的值。的值。#includeincludevoid main(void)void main(void)int i=2,/int i=2,/待求和的当前项待求和的当前项 s=1;/s=1;/当前项前所有项的累加和当前项前所有项的累加和 while(i=100)while(i=100)s+=i;i+;s+=i;i+
19、;cout1+2+3+100=sn;cout1+2+3+100=sn;必须明确所用变量的含义及初值必须明确所用变量的含义及初值或:或:while(i=100)while(i=100)s+=i,i+;s+=i,i+;或:或:while(i=100)while(i=100)s+=i+;s+=i+;此处无须使此处无须使用复合语句用复合语句此处必须使用复合语句此处必须使用复合语句在循环体或表达式内,应有改变在循环体或表达式内,应有改变表达式的值的成分,否则,会产表达式的值的成分,否则,会产生无休止的循环生无休止的循环(称死循环称死循环)。dowhiledowhile语语句句格式:格式:dodo 语句语
20、句 while(while(););语句为任一语句,是循环语句为任一语句,是循环体;表达式是任一表达式。体;表达式是任一表达式。执行过程:先执行语句,执行过程:先执行语句,后判断表达式的值;若表后判断表达式的值;若表达式的值不为达式的值不为0 0,则继续,则继续执行循环体,直到表达式执行循环体,直到表达式的值为的值为0 0时为止。时为止。特点:先执行后判断,特点:先执行后判断,故循环体至少执行一次。故循环体至少执行一次。例例5.7 5.7 用用dowhiledowhile语句求语句求1+2+1001+2+100。#includeincludevoid main(void)void main(v
21、oid)int i=2,/int i=2,/待求和的当前项待求和的当前项 s=1;/s=1;/当前项前所有项的累加和当前项前所有项的累加和 dodo s+=i+;s+=i+;while(i=100);while(i=100);cout1+2+3+100=sn;cout1+2+3+100=sn;在循环体或表达式内,应有改变在循环体或表达式内,应有改变表达式的值的成分,否则,会产表达式的值的成分,否则,会产生无休止的循环生无休止的循环(称死循环称死循环)。分号不能忘!分号不能忘!forfor语语句句格式:格式:for(for(;)3)语句语句 表达式表达式1 13 3是任何表达式;语句是任一语句,
22、为循环体。是任何表达式;语句是任一语句,为循环体。特点:先判断后执行,循特点:先判断后执行,循环体有可能一次也不执行。环体有可能一次也不执行。执行过程:执行过程:计算表达式计算表达式1 1;若表达式若表达式2 2的值为的值为0 0,则执,则执行行,否则转,否则转;执行语句,计算表达式执行语句,计算表达式3 3,转,转;结束循环。结束循环。例例5.8 5.8 用用forfor语句求语句求1+2+1001+2+100。#includeincludevoid main(void)void main(void)int i,/int i,/待求和的当前项待求和的当前项 s;/s;/当前项前所有项的累加和
23、当前项前所有项的累加和 for(i=2,s=1;i=100;i+)for(i=2,s=1;i=100;i+)s+=i;s+=i;cout1+2+3+100=sendl;cout1+2+3+100=s100)break;if(i100)break;三三个个表表达达式式可可分分别别省省和和同同时时省省,但但两两个个分分号号不可省,三个表达式的不可省,三个表达式的作用不能省作用不能省:i=2,s=1;i=2,s=1;for(;i=100;)s+=i+;for(;i=100;)s+=i+;从循环的组成要素上讲,从循环的组成要素上讲,forfor语句的常用形式应为:语句的常用形式应为:for(for(循
24、环变量初始化循环变量初始化;循环结束条件循环结束条件;循环变量更新循环变量更新)循环体语句循环体语句例例5.9 5.9 输入一行字符,并按输入的顺序输出该行字符。输入一行字符,并按输入的顺序输出该行字符。#includeincludevoid main(void)void main(void)char c;char c;cout“cout“输入一行字符串:输入一行字符串:n;n;for(cin.get(c);c!=n;cin.get(c)for(cin.get(c);c!=n;cin.get(c)coutc;coutc;/依次输出字符依次输出字符 coutc;/coutc;/输出最后一个字符,
25、即结束条件输出最后一个字符,即结束条件nn 依次读取字符依次读取字符直到读取的是换行符为止直到读取的是换行符为止三种循三种循环语环语句的比句的比较较forfor和和whilewhile语句都是先判断循环条件,循环体可能一语句都是先判断循环条件,循环体可能一次也不执行。而次也不执行。而dowhiledowhile语句是先执行循环体,后判语句是先执行循环体,后判断循环条件,所以循环体至少要执行一次。因此对于断循环条件,所以循环体至少要执行一次。因此对于至少要执行一次重复结构的程序段,建议使用至少要执行一次重复结构的程序段,建议使用dowhiledowhile语句,而对于其他的重复结构的程序段,可语
26、句,而对于其他的重复结构的程序段,可使用使用forfor或或whilewhile语句。语句。由于由于forfor语句有三个表达式,可分别用于循环变量初始语句有三个表达式,可分别用于循环变量初始化、循环结束条件和循环控制变量的更新,所以用得化、循环结束条件和循环控制变量的更新,所以用得最多的是最多的是forfor语句,其次是语句,其次是whilewhile语句,而语句,而dowhiledowhile语语句相对于前两种语句用得少一些。句相对于前两种语句用得少一些。合理使用循合理使用循环语环语句句合理使用循环语句,可优化程序结构,精简程序。例合理使用循环语句,可优化程序结构,精简程序。例如,例如,例
27、5.9 5.9 再用再用whilewhile和和dowhiledowhile语句实现:语句实现:#includeincludevoid main(void)void main(void)char c;char c;cout“cout“输入字符串:输入字符串:n;n;cin.get(c);cin.get(c);while(c!=n)while(c!=n)coutc;coutc;cin.get(c);cin.get(c);coutc;coutc;#include#includevoid main(void)void main(void)char c;char c;cout“cout“输入字符串:输
28、入字符串:n;n;do do cin.get(c);cin.get(c);coutc;coutc;while(c!=n);while(c!=n);从例从例5.95.9的三个程序可见,本例用的三个程序可见,本例用dowhiledowhile语句时,语句时,程序最简,其次为程序最简,其次为forfor语句,再次为语句,再次为whilewhile语句。语句。循循环环的嵌套及其的嵌套及其应应用用循环的嵌套:循环的内嵌语句也可以是循环语句。循环的嵌套:循环的内嵌语句也可以是循环语句。例例5.10 5.10 输出输出10001000以内所有完数。以内所有完数。“完数完数”是指与其是指与其因子之和相等的数。
29、例如因子之和相等的数。例如6=16=12 23 3,即,即6 6是完数。输是完数。输出完数按如下形式,例如,对于完数出完数按如下形式,例如,对于完数6 6,应显示:,应显示:6=1+2+3 6=1+2+3分析:分析:sumsum保存一个数的因子和;保存一个数的因子和;ii10001000以内的一个数,初值为以内的一个数,初值为2 2,终值为,终值为10001000;j ij i的试探因子,取值从的试探因子,取值从1 1到到i/2i/2。因因1 1是是i i的因子,的因子,故直接作为故直接作为sumsum的初值,的初值,j j的初值为的初值为2 2。若。若i%ji%j为为0 0,则说,则说明明j
30、 j是是i i的因子,则的因子,则sum+=jsum+=j。#include#includevoid main(void)void main(void)int i,/1000 int i,/1000以内的一个数以内的一个数 j,/ij,/i的试探因子的试探因子 sum;/isum;/i的因子和的因子和 for(i=2;i=1000;i+)for(i=2;i=1000;i+)/外层外层forfor语句语句 for(sum=1,j=2;j=i/2;j+)for(sum=1,j=2;j=i/2;j+)/内层内层forfor语句语句 if(i%j=0)sum+=j;if(i%j=0)sum+=j;if
31、(sum=i)/i if(sum=i)/i是完数,按指定格式输出是完数,按指定格式输出 couti=1”;couti=1”;for(j=2;j=i/2;j+)/for(j=2;j=i/2;j+)/因未存因未存i i的因子,需再求的因子,需再求 if(i%j=0)cout+j;if(i%j=0)cout+j;coutendl;coutendl;5.4 5.4 转转向向语语句句gotogoto语句是一条非常简单的无条件转向语句,它可以语句是一条非常简单的无条件转向语句,它可以将程序的执行流程转到程序中的任何位置,通常是从将程序的执行流程转到程序中的任何位置,通常是从它所在的地方转移到带有标号的语句
32、处。它所在的地方转移到带有标号的语句处。gotogoto语句与条件语句组合,可形成当型和直到型循环。语句与条件语句组合,可形成当型和直到型循环。滥用滥用gotogoto语句,会导致程序流程过于复杂,降低程序语句,会导致程序流程过于复杂,降低程序的可读性、可维护性等。的可读性、可维护性等。软件危机爆发后,软件危机爆发后,gotogoto语句一度成为争论的焦点。语句一度成为争论的焦点。结构化程序设计为了保持程序结构的结构化程序设计为了保持程序结构的 单入口、单出口单入口、单出口 特性,严格限制直接使用特性,严格限制直接使用gotogoto语句,但考虑到有时不语句,但考虑到有时不得不改变程序执行的流
33、程,得不改变程序执行的流程,C+C+语言提供了功能受到限语言提供了功能受到限制的转向语句制的转向语句breakbreak和和continuecontinue来替代来替代gotogoto语句。语句。break语句语句格式:格式:break;break;该语句只用在该语句只用在switchswitch或循环语句中。或循环语句中。用在开关语句用在开关语句switchswitch中的某个分支语句中,其作用是中的某个分支语句中,其作用是结束开关语句的执行,并把控制转移到该开关语句之结束开关语句的执行,并把控制转移到该开关语句之后的第一个语句执行。后的第一个语句执行。用在循环语句的循环体中,当执行到用在循
34、环语句的循环体中,当执行到breakbreak语句时,直语句时,直接结束该循环语句的执行,把控制转移到紧跟该循环接结束该循环语句的执行,把控制转移到紧跟该循环语句之后的语句执行。语句之后的语句执行。例例5.11 5.11 判别所输入的一个大于判别所输入的一个大于1 1的正整数是否是素数。的正整数是否是素数。#includeinclude#include#includevoid main(void)void main(void)int x,i,j;/x int x,i,j;/x存放所输入的正整数存放所输入的正整数 coutcoutx;cinx;for(i=2,j=(int)sqrt(x);for
35、(i=2,j=(int)sqrt(x);i=jij)coutxj)coutx是素数!是素数!n;n;else coutx else coutxjij:说明说明x x没没有大于有大于2 2和小于和小于自身的因子,自身的因子,即即x x是素数。是素数。x%i=0 x%i=0:说明说明x x不可能是素数,不可能是素数,此时此时i i肯定小于肯定小于等于等于j j。根据根据i i与与j j的关系来确定是何种情况结束的关系来确定是何种情况结束forfor循环的。循环的。特别关注:当循环语句存在特别关注:当循环语句存在多个结束出口时,通常会在多个结束出口时,通常会在该循环结束后,对不同结束该循环结束后,对
36、不同结束出口作出不同的处理,因此,出口作出不同的处理,因此,正确区分不同结束出口是非正确区分不同结束出口是非常重要的。常重要的。问题:例问题:例5.11程序中的程序中的for语语句句 能否不用能否不用break语句?若语句?若能,如何修改能,如何修改for语句?语句?continuecontinue语语句句格式:格式:continue;continue;只用在循环语句的循环体中,作用是结束本次循环的只用在循环语句的循环体中,作用是结束本次循环的循环体,提前进入下一次循环。对于循环体,提前进入下一次循环。对于whilewhile和和dowhiledowhile循环来说,若遇到循环来说,若遇到co
37、ntinuecontinue,则跳到循环,则跳到循环 的位置;而对于的位置;而对于forfor循环来说,则跳到循环来说,则跳到forfor循环循环的的 3处。处。与与breakbreak语句的区别:语句的区别:breakbreak是结束循环;是结束循环;continuecontinue是是结束本次循环,提前进入下一次循环。结束本次循环,提前进入下一次循环。例例5.12 5.12 输入两个大于输入两个大于1 1的正整数并输出。若输入有误,的正整数并输出。若输入有误,则给出提示并允许重新输入,直到输入正确为止。则给出提示并允许重新输入,直到输入正确为止。分析:分析:检查输入数据很重要。例如在例检查
38、输入数据很重要。例如在例5.115.11中,若运行时输中,若运行时输入整数入整数1 1,程序输出也是,程序输出也是11是素数是素数!。程序运行时,难。程序运行时,难免输入出错,应允许用户重新输入,直到输入正确为免输入出错,应允许用户重新输入,直到输入正确为止,除非特殊场合,如用户身份验证等。止,除非特殊场合,如用户身份验证等。为了便于输入出错时重新输入,程序使用为了便于输入出错时重新输入,程序使用dowhiledowhile循环,并设置一个输入出错标志循环,并设置一个输入出错标志errorerror,用作输出不同用作输出不同提示信息的依据和循环结束条件。提示信息的依据和循环结束条件。#incl
39、udeincludevoid main(void)void main(void)int x,y,/x int x,y,/x、y y分别存放所输入的正整数分别存放所输入的正整数 error=0;/error=0;/输入出错标志。为输入出错标志。为1 1时出错,为时出错,为0 0时正常时正常 coutcout输入两个大于输入两个大于1 1的正整数?的正整数?;dodo if(error)if(error)coutnn coutx;cinx;if(x2)error=1;if(xy;ciny;if(y2)error=1;if(y2)error=1;while(error);/error while(e
40、rror);/error为为1 1表示输入出错,需要重新输入表示输入出错,需要重新输入 coutnncoutnn输入的两个数为输入的两个数为x,yendl;x,yendl;gotogoto语语句句简简介介*标号标号 label:Slabel:S S S是任一语句,包括空语句;是任一语句,包括空语句;labellabel为语句标号,简称为语句标号,简称为标号,采用标识符。标号无需定义,可直接使用。为标号,采用标识符。标号无需定义,可直接使用。gotogoto语句语句 goto label;goto label;其中,其中,labellabel是语句标号,当执行到该语句时,无条件是语句标号,当执行
41、到该语句时,无条件地将控制转移到标有该标号的语句处执行。地将控制转移到标有该标号的语句处执行。*gotogoto语语句的主要用途句的主要用途从循环体内转移到循环体外:但可用从循环体内转移到循环体外:但可用breakbreak或或continuecontinue替代。替代。从多层循环的内层跳到外层循环外:但这种用法不符从多层循环的内层跳到外层循环外:但这种用法不符合结构化编程原则,不提倡使用。合结构化编程原则,不提倡使用。不允许从循环语句的外面转移到循环语句的里面。不允许从循环语句的外面转移到循环语句的里面。与与ifif语句构成循环:如例语句构成循环:如例5.135.13所示。但可由所示。但可由
42、whilewhile、dowhiledowhile和和forfor取代,因此也不提倡这样使用。取代,因此也不提倡这样使用。例例5.13 5.13 用用gotogoto和和ifif构成循环,求构成循环,求1+2+1001+2+100的值。的值。#includeincludevoid main(void)void main(void)int i=2,/int i=2,/待求和的当前项待求和的当前项 s=1;/s=1;/当前项前的所有项的累加和当前项前的所有项的累加和lplp:if(i=100)/goto:if(i=100)/goto语句和语句和ifif语句构成语句构成whilewhile型循环型循
43、环 s+=i+;s+=i+;goto lpgoto lp;cout1+2+3+100=sn;cout1+2+3+100=sn;lp:s+=i+;/dowhilelp:s+=i+;/dowhile型循环型循环 if(i=100)goto lp;if(i=100)goto lp;exit()exit()函数函数exit()exit()函数是函数是stdlib.hstdlib.h库中的函数,原型为:库中的函数,原型为:void exit(int status);void exit(int status);执行该函数时,将终止当前程序的执行并将控制返还执行该函数时,将终止当前程序的执行并将控制返还操作
44、系统。但终止前,系统要做必要的收尾工作,如操作系统。但终止前,系统要做必要的收尾工作,如关闭该程序打开的文件,写完缓冲输出的内容,释放关闭该程序打开的文件,写完缓冲输出的内容,释放变量占用内存变量占用内存(不含堆内存不含堆内存)等。等。statusstatus为终止程序的为终止程序的原因,原因,0 0表示正常退出,非表示正常退出,非0 0表示异常退出。表示异常退出。5.5 5.5 程序程序举举例例例例5.14 5.14 编程计算编程计算1!+2!+10!1!+2!+10!。分析:每项都是计算阶乘,可用循环结构处理。分析:每项都是计算阶乘,可用循环结构处理。#includeincludevoid
45、 main(void)void main(void)int i,/int i,/取值从取值从1 11010,初值为初值为2 2 p,/p,/保存保存i!i!,初值为初值为1 1 s;/s;/前前i i个阶乘和,初值为个阶乘和,初值为1 1 for(i=2,p=1,s=1;i=10;i+)for(i=2,p=1,s=1;i=10;i+)p*=i;s+=p;p*=i;s+=p;cout1!+2!+3!+10!=sn;cout1!+2!+3!+10!=sn;程序运行结果:1!+2!+3!+10!=4037913循环程序设计要点:循环程序设计要点:找出重复计算规律;找出重复计算规律;合理安排计算,提高
46、合理安排计算,提高计算效率。计算效率。如计算如计算i!i!不不是每次从头开始计算,是每次从头开始计算,而是利用而是利用(i-1)!(i-1)!(保存保存在在p p中中)再乘再乘i i所得。所得。n!n!的溢出问题及处理的溢出问题及处理用用doubledouble或或long doublelong double型变量存放阶乘值。对于某型变量存放阶乘值。对于某些些C+C+系统,可用系统,可用8 8字节整型,如字节整型,如VC+VC+的的_ _int64int64。自编大整数运算程序:例如使用字符型数组实现。自编大整数运算程序:例如使用字符型数组实现。近似方法:当阶乘值大于等于近似方法:当阶乘值大于
47、等于1010时,就除以时,就除以1010,使指,使指数加数加1 1。最后将尾数和指数分别输出。最后将尾数和指数分别输出。#includeincludevoid main(void)void main(void)int i,e;/e int i,e;/e保存阶乘的指数,初值为保存阶乘的指数,初值为0 0 double p;/double p;/保存阶乘的尾数,初值为保存阶乘的尾数,初值为1 1 for(i=2,p=1,e=0;i=1000000;i+)for(i=2,p=1,e=0;i=10)while(p=10)/阶乘阶乘p p反复除以反复除以1010,分离指数,分离指数 p/=10.0;e+
48、;p/=10.0;e+;cout1000000!=peeendl;cout1000000!=peeendl;程序运行结果:程序运行结果:1000000!=8.263931000000!=8.26393e5565708e5565708例例5.15 5.15 编写程序,利用以下公式计算编写程序,利用以下公式计算的近似值,的近似值,直到最后一项的绝对值小于直到最后一项的绝对值小于1010-8-8为止。为止。分析:本题属于求和问题,可用循环语句解决分析:本题属于求和问题,可用循环语句解决。主要特点:主要特点:所算的项数是未知,循环的结束条件是最后一项的所算的项数是未知,循环的结束条件是最后一项的绝对值
49、小于绝对值小于1010-8-8。每个计算项的符号正负相间,每一项的分母比前一每个计算项的符号正负相间,每一项的分母比前一项增加项增加2 2。要求计算到最后一项的绝对值小于要求计算到最后一项的绝对值小于1010-8-8,即有效位数,即有效位数超过超过7 7位,已超出位,已超出floatfloat型的精度范围,应使用型的精度范围,应使用doubledouble型。型。#include#include#include#include#include#includevoid main()void main()double pi=0,/4 double pi=0,/4的前的前n n项的和,初值为项的和,
50、初值为0 0 t=1,/4 t=1,/4的当前项的值,初值为的当前项的值,初值为1 1 n=1;/n n=1;/n表示分母表示分母 int s=-1;/sint s=-1;/s表示符号表示符号 while(fabs(t)=1E-8)while(fabs(t)=1E-8)pi+=t;n+=2;s=-s;t=-s/n;pi+=t;n+=2;s=-s;t=-s/n;coutsetiosflags(ios:fixed)coutsetiosflags(ios:fixed)setprecision(8)pi*4endl;setprecision(8)pi*4endl;程序运行结果:3.14159263 例