《程序控制结构讲义cijk.pptx》由会员分享,可在线阅读,更多相关《程序控制结构讲义cijk.pptx(75页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第2章章 程序控制结构程序控制结构2.1 顺序结构顺序结构 2.2 选择结构选择结构 2.3 循环结构循环结构 2.4 控制转向语句控制转向语句 2.5 程序实例程序实例 1v按照语句出现的先后顺序依次执行。按照语句出现的先后顺序依次执行。2.1 顺序结构顺序结构 语句1语句2图2.1 顺序结构流程图22.1.1 定义语句定义语句v说明语句说明语句v在在C+程序中,一个标识符(变量名、常量名、函程序中,一个标识符(变量名、常量名、函数名、对象名等)在使用之前必须先定义,通知编数名、对象名等)在使用之前必须先定义,通知编译器为其分配存储空间,或告诉编译器它的存在及译器为其分配存储空间,或告诉编
2、译器它的存在及其特征。其特征。v例如:例如:int a=0,b=3;const double pi=3.14159;int sum(int,int);float score 503;32.1.2 表达式语句表达式语句v形式:形式:;v可以进行的操作通常包括赋值操作,复合赋值可以进行的操作通常包括赋值操作,复合赋值操作,增量、减量操作,函数调用操作和输入操作,增量、减量操作,函数调用操作和输入输出操作。输出操作。v例如:例如:i+;-j;abs(x);coutij;sum=a+b;a=b=c;i=1,j=2;b*=c;42.1.3 复合语句复合语句v形式:形式:v作用:当程序中某个位置在语法上只
3、允许一条作用:当程序中某个位置在语法上只允许一条语句,而在语义上要执行多条语句才能完成某个语句,而在语义上要执行多条语句才能完成某个操作时,需要使用复合语句。操作时,需要使用复合语句。例如:例如:if(x=0)couta;coutb;52.1.4 空语句空语句v形式:形式:;v作用:作用:当程序中某个位置在语法上需要一当程序中某个位置在语法上需要一条语句,而在语义上又不条语句,而在语义上又不 要求执行任何动要求执行任何动作时,可放上一条空语句。作时,可放上一条空语句。v一般适用于在循环语句中做空循环体一般适用于在循环语句中做空循环体v例如:例如:for(m=0;m1000;m+);6输入和输出
4、并不是输入和输出并不是C+语言中的正式组成成分。语言中的正式组成成分。C和和C+本身都没有为输入和输出提供专门的语句结本身都没有为输入和输出提供专门的语句结构。输入输出不是由构。输入输出不是由C+本身定义的,而是在编译本身定义的,而是在编译系统提供的系统提供的I/O库中定义的。库中定义的。C+的输出和输入是用的输出和输入是用“流流”(stream)的方式实现的方式实现的。图的。图3.2和图和图3.3表示表示C+通过流进行输入输出的通过流进行输入输出的过程。过程。2.1.5 基本输入输出基本输入输出7图3.2图3.38有关流对象有关流对象cin、cout和流运算符的定义等信息是和流运算符的定义等
5、信息是存放在存放在C+的输入输出流库中的,因此如果在程序的输入输出流库中的,因此如果在程序中使用中使用cin、cout和流运算符,就必须使用预处理和流运算符,就必须使用预处理命令把头文件命令把头文件stream包含到本文件中:包含到本文件中:#include 尽管尽管cin和和cout不是不是C+本身提供的语句,但是在本身提供的语句,但是在不致混淆的情况下,为了叙述方便,常常把由不致混淆的情况下,为了叙述方便,常常把由cin和流提取运算符和流提取运算符“”实现输入的语句称为输入语实现输入的语句称为输入语句或句或cin语句,把由语句,把由cout和流插入运算符和流插入运算符“”实实现输出的语句称
6、为输出语句或现输出的语句称为输出语句或cout语句。根据语句。根据C+的语法,凡是能实现某种操作而且最后以分号结束的语法,凡是能实现某种操作而且最后以分号结束的都是语句。的都是语句。9v在在C+中,所有输入输出是通过中,所有输入输出是通过输入输出流输入输出流来实现的。来实现的。v在在C+中,将数据从一个对象到另一个对象的流动抽中,将数据从一个对象到另一个对象的流动抽象为象为“流流”。在。在iostream库中包含一个标准输入流对库中包含一个标准输入流对象象cin和一个标准输出流对象和一个标准输出流对象cout,分别用来实现从,分别用来实现从键盘读取数据,以及将数据在屏幕上输出。键盘读取数据,以
7、及将数据在屏幕上输出。v要使用要使用cin和和cout,需要在,需要在C+程序开头加上如下包程序开头加上如下包含命令:含命令:#include /新标准中的头文件名新标准中的头文件名using namespace std;/引入引入std名字空间中的标识符名字空间中的标识符101.标准输入流标准输入流cinvcin负责从键盘读取数据,使用负责从键盘读取数据,使用提取提取运算符运算符“”就就可以将键盘键入的数据读入到变量中。可以将键盘键入的数据读入到变量中。v语法格式:语法格式:cin变量变量1变量变量2变量变量n;变量可以是任意数据类型,输入时各个数据之间用变量可以是任意数据类型,输入时各个数
8、据之间用空格键、空格键、Tab键或键或Enter键分隔。键分隔。v 例如:例如:int a,b;cinab;键盘上输入:键盘上输入:93 a9键盘键盘b3键盘键盘112.标准输出流标准输出流coutv负责将数据输出到屏幕上,使用负责将数据输出到屏幕上,使用插入插入运算符运算符“”就可以将数据显示在屏幕上当前光标就可以将数据显示在屏幕上当前光标所在位置。所在位置。v语法格式:语法格式:cout表达式表达式1表达式表达式2表达式表达式n;表达式可以是任意类型的,数据输出的格式表达式可以是任意类型的,数据输出的格式由系统自动决定。由系统自动决定。12表表2.1 常用格式控制符常用格式控制符格式控制符
9、格式控制符说说 明明示示 例例语语 句句结结 果果endl输输出出换换行行符符cout120endl240;120240dec十十进进制表制表示示coutdec120;120hex十六十六进进制制表示表示couthex120;78oct八八进进制表制表示示coutoct120;170setw(int n)设设置数据置数据输输出的出的宽宽度度coutxsetw(3)y;x y(中(中间间有有2个个空格)空格)13表表2.1 常用格式控制符常用格式控制符格式控制符格式控制符说说 明明示示 例例语语 句句结结 果果setfill(char c)设设置填充字符置填充字符coutsetfill()set
10、w(6)120;120setprecision(int n)设设置浮点数的置浮点数的精度(有效数精度(有效数字位数或小数字位数或小数位数)位数)coutsetprecision(5)12.3456;12.346setiosflags(ios:fixed)定点格式定点格式输输出出coutsetiosflags(ios:fixed)12.3456789;12.345679setiosflags(ios:scientific)指数格式指数格式输输出出coutsetiosflags(ios:scientific)12.3456789;1.234568e+001浮点型默认精度为浮点型默认精度为614【例
11、【例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=ch2endl;coutok=okendl;cout!ok=!okendl;return 0;图2.2 cout应用示例15【例【例2.2】使用格式控制符输出数据使用格式控
12、制符输出数据#include#include using namespace std;int main()int a=35;double b=12.3456789;1:cout1234567890123endl;2:coutdeca hexa octaendl;/35 23 43 3:coutbendl;/12.3457 4:coutsetprecision(4)bendl;/12.35 5:coutsetw(10)bendl;/12.35 6:coutsetw(10)setfill(#)bendl;/#12.35 7:coutsetiosflags(ios:scientific)bendl;
13、/1.2346e+001 8:coutsetprecision(3)bendl;/1.235e+001 9:coutsetprecision(2)bb,则将,则将a、b交换,否则不交换。两数交交换,否则不交换。两数交换可采用借助于第三个变量间接交换的方法换可采用借助于第三个变量间接交换的方法 if(ab)t=a;a=b;b=t;19#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;202
14、if-else语句(双分支)语句(双分支)if(表达式表达式)语句语句1 else 语句语句2true表达表达式式语句语句1false语句语句2图图2.7 双分支双分支if语句流程图语句流程图21【例【例2.4】输入一个年份,判断是否为闰年。】输入一个年份,判断是否为闰年。v分析分析 闰年的年份可以被闰年的年份可以被4整除而不能被整除而不能被100整除,或整除,或者能被者能被400整除。整除。#include using namespace std;int main()int year;coutyear;if(year%4=0&year%100!=0)|(year%400=0)coutyear
15、年是闰年年是闰年endl;else coutyear年不是闰年年不是闰年endl;return 0;223if-else if 语句(多分支)语句(多分支)if(表达式表达式1)语句语句1 else if(表达式表达式2)语句语句2 else if(表达式表达式n)语句语句n else 语句语句n+1falsefalsefalsetruetrue表达式1表达式2表达式n语句n语句n+1语句2语句1true23【例例2.5】根据x的值,计算分段函数y的值。y的计算公式为:24#include#include using namespace std;int main()double x,y;cou
16、tx;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);couty=y0)if(y0)coutx与与y均大于均大于0;else coutx大于大于0,y小于等于小于等于0;如何使之与如何使之与第一个第一个if配配对?对?27【例【例2.62.6】从键盘上输入两个字符,比较其大小,输出大】从键盘上输入两个字符,比较其大小,输出大于、等于和小于的判断结果。于、等于和小于的判断结果。#include using namespace std;int main()char ch
17、1,ch2;coutch1ch2;if(ch1!=ch2)if(ch1ch2)coutch1大于大于ch2endl;else coutch1小于小于ch2endl;elsecoutch1等于等于ch2endl;return 0;282.2.2 switch语句语句switch(表达式表达式)case 常量表达式常量表达式1:语句语句1 case 常量表达式常量表达式2:语句语句2 case 常量表达式常量表达式n:语句语句n default:语句序列语句序列n+1 注意:表达式只能是整型、注意:表达式只能是整型、字符型或枚举型字符型或枚举型注注意意:常常量量表表达达式式1n的的值值必必须须各各
18、不不相同。相同。29有有无无无无false有有无无falsetrue计算表达式的值计算表达式的值常量表达式常量表达式1语句语句1break常量表达式常量表达式2语句语句2break无无有有false常量表达式常量表达式ntrue语句语句nbreakdefault语句语句n+1true有有图图2.12 switch语句执行流程语句执行流程30【例例2.72.7】将将输输入入的的百百分分制制成成绩绩按按以以下下规规定转换成相应的等级:定转换成相应的等级:成成 绩绩 等级等级10090 优秀优秀 8980 良好良好 7970 中等中等 6960 及格及格 590 不及格不及格 31#include
19、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;else cout输入数据有误输入数据有误!en
20、dl;return 0;共用同一个语句组 思考:若省去思考:若省去break语句,情况语句,情况会怎样?会怎样?32循环?循环?利用计算机重复处理某些实际问题利用计算机重复处理某些实际问题2.3 循环结构循环结构33循环的引出循环的引出 示例示例1 求求 1+2+3+4+5+.+100=1+2+3+4+5+.+100=?特点:特点:1.步骤多步骤多2.工作雷同工作雷同 s=0;s=s+1;s=s+2;s=s+3;.s=s+100;100条条s=s+ii=i+1342.3.1 while 语句语句while(表达式表达式)语句语句falsetrue表达表达式式语句语句图2.14 while语句流
21、程图循环体循环体执行重复工执行重复工作的语句作的语句循环判断条循环判断条件件35假假表达式表达式循环体循环体真真求求 1+2+3+4+5+.+100=?s=0;s=s+1;s=s+2;s=s+3;.s=s+100;i=100s=s+ii=i+1i i是循环变量是循环变量36【例【例2.8】求求 1+2+3+100#include using namespace std;int main()int i(1),sum(0);/定义变量,初始化定义变量,初始化while(i=100)/构造循环构造循环 sum+=i;/循环体,多次执行循环体,多次执行 i+;coutsum=sumendl;retur
22、n 0;sumi第第1 1次次初始值初始值0112第第2 2次次33.第第9999次次4950100第第100100次次5050101372.3.2 do-while语句语句do 语句语句while(表达式表达式);falsetrue表达表达式式语句语句图图2.15 do-while语句流程图语句流程图38【例【例2.10】求自然数求自然数1100之和,要求用之和,要求用do-while语句实现。语句实现。#include using namespace std;int main()int i(1),sum(0);do sum+=i;i+;while(i=100);coutsum=sum2)c
23、out”I like C+!”endl;/相当于一个空操作语句相当于一个空操作语句do cout”I like C+!”2);/输出一行文字信息输出一行文字信息:I like C+!注意:注意:当第一次循环表达式的值当第一次循环表达式的值为真时,为真时,whilewhile与与dodowhilewhile的结果完全一样,否则结的结果完全一样,否则结果不相同。果不相同。若若whilewhile后面的表达式后面的表达式一开始就是为假一开始就是为假时,两时,两种循环结果相同吗?种循环结果相同吗?40【例例2.11】输输入入一一个个自自然然数数,将将该该数数的的每每一一位位数数字按反序输出。例如:输入
24、字按反序输出。例如:输入12345,输出,输出54321。#include using namespace std;void main()unsigned long int num,digital;coutnum;dodigital=num%10;num/=10;cout0);coutendl;41for(for(表达式表达式1;1;表达式表达式2;2;表达式表达式3 3)表达式表达式2执行执行非非00退出退出循环循环表达式表达式1表达式表达式32.3.3 for 语句语句循环变量循环变量赋初值赋初值循环判断循环判断条件条件改变循环改变循环变量变量42【例【例2.12】求自然数】求自然数110
25、0之和,要之和,要求用求用for语句实现。语句实现。#include using namespace std;int main()int i,sum(0);for(i=1;i=100;i+)sum+=i;coutsum=sumendl;return 0;43for(for(表达式表达式1;1;表达式表达式2;2;表达式表达式3 3)表达式表达式1;while(表达式表达式2);表达式表达式3;44【例例2.13】一一个个小小球球从从100米米高高处处落落下下,每每次次落落地地后后反反弹弹回回原原高高度度的的一一半半,再再落落下下。求求它它在在第第10次次落落地地时时共共经经过过多多少少米米?第
26、第10次反弹多高?次反弹多高?v分析:分析:第第1次落地时经过的米数为次落地时经过的米数为s=100第第1次落地后反弹高度为次落地后反弹高度为h=100/2第第2次落地时经过的米数为次落地时经过的米数为s=100+h*2第第2次落地后反弹高度为次落地后反弹高度为h=h/2第第3次落地时经过的米数为次落地时经过的米数为s=s+h*245#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)setpr
27、ecision(3);cout第第10次落地时,共经过次落地时,共经过s米;米;反弹的高反弹的高度是度是h米米endl;return 0;思考思考 该小球反弹多少该小球反弹多少次才能静止下来?次才能静止下来?46注意:注意:for语语句句中中的的三三个个表表达达式式可可以以部部分分省省略略或或全全部部省省略略,但但;不能省略,若省略表达式不能省略,若省略表达式2,则表示循环条件为真。,则表示循环条件为真。for(;i=100)break ;/break语句用于跳出循环语句用于跳出循环 int sum=0;for(int i=1;i100)break;三个表达式都可以是任何类型的三个表达式都可以
28、是任何类型的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;48在屏幕上显示平面图形在屏幕上显示平面图形 *for(j=1;j=2*i-1;j+)cout*;i:行号行号for(i=1;i4;i+)coutendl;*2.3.4 多重循环多重循环4950【例例2.14】编程显示输出九九乘法表 图2.19 九九乘法表运行界面51truefalsei=1i=9?
29、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;52图2.21 下三角的九九乘法表图2.22 上三角的九九乘法表思考:思考:打印上三角或下三角程序如何改动?打印上三角或下三角程序如何改动?53注意:注意:(1)内循环控制变量与外循环控制变量不能同)内循环控制变量与外循环控制变量不能同名。名。(2)外
30、循环必须完全包含内循环,不能交叉。)外循环必须完全包含内循环,不能交叉。(3)若循环体内有)若循环体内有if语句,或语句,或if语句内有循环语句内有循环语句,也不能交叉。语句,也不能交叉。(4)利用)利用goto语句可以从循环体内转向循环语句可以从循环体内转向循环体外,但绝对不允许从循环体外转入循环体内。体外,但绝对不允许从循环体外转入循环体内。(5)当嵌套使用各种循环语句时,特别需要严)当嵌套使用各种循环语句时,特别需要严格按照缩进规则来书写程序。有时还应适当配格按照缩进规则来书写程序。有时还应适当配以注释,以保持清晰易辩的结构特征。以注释,以保持清晰易辩的结构特征。542.4 控制转向语句
31、控制转向语句2.4.1 break语句语句break;用于下列两种情况:用于下列两种情况:1、在开关语句中,其功能是退出开关语句,、在开关语句中,其功能是退出开关语句,执行其后的语句;执行其后的语句;2、在循环体中,其功能是用来退出、在循环体中,其功能是用来退出该重循环该重循环55【例例 2.15】从从键键盘盘上上输输入入若若干干个个正正整整数数,直直到到输输入入负负整整数数为为止止,计计算算并并输输出出显显示示已已输输入入的的正正整整数数之之和和。输输入入的的数不超过数不超过20个。个。#include using namespace std;const int M=20;int main(
32、)int i,n,sum=0;cout请输入若干个正整数(输入负数就结束输入):请输入若干个正整数(输入负数就结束输入):endl;for(i=0;in;if(n0)break;/当输入负数时,就退出循环当输入负数时,就退出循环sum+=n;cout 输入的正整数之和为输入的正整数之和为:sumendl;return 0;562.4.2 continue 语句语句v格式:格式:continue;v功能:只用在循环体中,用来功能:只用在循环体中,用来结束该次循环结束该次循环。在在循循环环体体中中遇遇到到continue语语句句时时,本本次次循循环环结结束束,回回到到循循环环条条件件判判断断是是否
33、否执执行行下下一一次次循循环。环。57v在在while和和do-while循循环环结结构构中中,continue语语句句将将使使执执行行流流程程直直接接跳跳转转到到循循环环条条件件的的判判定部分,然后决定循环是否继续进行。定部分,然后决定循环是否继续进行。v在在for循循环环结结构构中中,当当遇遇到到continue时时,执执行行流流程程将将跳跳过过循循环环体体中中余余下下的的语语句句,而而转转去去执执行行for语语句句中中的的表表达达式式3,然然后后根根据据表表达达式式2进进行行循循环环条条件件的的判判定定以以决决定定是是否否继继续续执执行行for循环体。循环体。5859【例例 2.16】输
34、出100以内能够被7整除的所有整数。#include#include using namespace std;int main()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语句,用语句,用其它方法如何实现?其它方法如何实现?602.4.3 goto语句语句goto 标号标号;标号标号:语句语句;标号语
35、句标号语句将流程转到标号所指将流程转到标号所指定的标号语句处。定的标号语句处。61【例【例 2.17】利用】利用goto语句实现计算前语句实现计算前100个自然个自然数之和并输出结果数之和并输出结果#include using namespace std;int main()int i=1,sum=0;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
36、2 1 063#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;64【例【例 2.19】显示输出显示输出3100之间的所有素数。之间的所有素数。分析:分析:(1 1)素素数数:一一个个大大于于1 1的的除除了了它它自自身身和和1 1以以外外,不不能能被被其其它它任任何何正正整整数数所所整整除除的的整整数数。判判别别某某数数m m是是否否为为素素数数,最最简简单单的的方方法法是是:用用i=2i=2,3 3,
37、m-1m-1逐逐个个除除,只要有一个能整除,m就不是素数,可以用break提前结束循环;若都不能整除,则m是素数。(2 2)如果m不是素数,则必然能被分解为两个因子a和b,并且其中之一必然小于等于 sqrt(m),另一个必然大于等于sqrt(m)。所以要判断m是否为素数,可简化为判断它能能否否被被2 2至至sqrt(m)sqrt(m)之之间间的的数数整整除除即可。因为若m不能被2至sqrt(m)之间的数整除,则必然也不能被sqrt(m)至m-1之间的数整除。(3 3)在退出循环以后,如果是因为找到了一个能整除m的数而通过break退出循环的,则i=sqrt(m);反之,如果是正常退出循环的,则
38、i=sqrt(m)+1。因此,在循环结束后,只要判判断断i i是是否否大大于于sqrt(m)sqrt(m),若是,则表明m是素数,输出该素数。(4)要判断多个数是否为素数,需要使用双重循环。外循环每循环一次提供一个数,由内循环通过多次除法判断其是否为素数。65#include#include using namespace std;int main()cout3100之间的素数是:之间的素数是:endl;for(int m=3;m100;m+=2)int k=int(sqrt(m);for(int i=2;ik)coutmt;coutendl;return 0;66【例【例 2.20 2.20
39、】输入输入x x,计算,计算sin(x)sin(x)。计算公式为:。计算公式为:当第当第n n项的绝对值小于项的绝对值小于1010-6-6时结束。时结束。分析:关键是找部分级数和的分析:关键是找部分级数和的通项通项:67int 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;co
40、ut调用标准函数求得的调用标准函数求得的sin(x)=sin(x)endl;68【例例 2.212.21】求求“水水仙仙花花数数”。所所谓谓“水水仙仙花花数数”是是指指一一个个三三位位正正整整数数,其其各各位位数数字字的的立立方方和和等等于于该该数数本本身身。例如:例如:153=1153=13 3+5+53 3+3+33 3。方法方法1 1:v利用三重循环编写程利用三重循环编写程序序v因为因为“水仙花数水仙花数”是是三位整数,所以取值三位整数,所以取值范围为范围为100999100999。v外循环变量外循环变量i i控制百控制百位数字从位数字从1 1变化到变化到9 9v中层循环变量中层循环变量
41、j j控制控制十位数字从十位数字从0 0变化到变化到9 9v内循环变量内循环变量k k控制个控制个位数字从位数字从0 0变化到变化到9 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;69方法方法2 2:不使用循环嵌套,只用1个for语句编写程序。int main()int i,j,k,n;cout水仙花数:;for(n=100;n1000;n+)i=n/100;/i为百位数字为百位数字 j=n/10
42、-i*10;/j为十位数字为十位数字 k=n%10;/k为个位数字为个位数字 if(i*i*i+j*j*j+k*k*k=n)coutn;70【例例 2.222.22】用用“枚枚举举法法”求求解解百百元元买买百百鸡鸡问问题题。假假定定公公鸡鸡5 5元元1 1只只,母母鸡鸡3 3元元1 1只只,小小鸡鸡1 1元元3 3只只,现现在在有有100100元元钱钱要要买买100100只只鸡鸡,且且需需包包含含公鸡、母鸡和小鸡,编程列出所有可能的购鸡方案。公鸡、母鸡和小鸡,编程列出所有可能的购鸡方案。分析分析v 设公鸡、母鸡、小鸡各为设公鸡、母鸡、小鸡各为x、y、z只,可列出方程:只,可列出方程:采用试凑法
43、采用试凑法(也称为穷举法或枚举法也称为穷举法或枚举法)来实现,即将可能出现来实现,即将可能出现的各种情况一一罗列测试,判断是否满足条件,采用循环结构的各种情况一一罗列测试,判断是否满足条件,采用循环结构来实现。来实现。71#include using namespace std;int main()int x,y,z;cout公鸡数公鸡数t母鸡数母鸡数t小鸡数小鸡数tendl;for(x=1;x=19;x+)/公鸡最多买公鸡最多买(100-3-1/3)/5只只for(y=1;y=31;y+)/母鸡最多买母鸡最多买(100-5-1/3)/3只只 z=100-x-y;if(5*x+3*y+z/3.
44、0=100)coutxtytzendl;return 0;72【例【例2.23】用牛顿迭代法求一元方程用牛顿迭代法求一元方程2x3-4x2+3x-6=0在在x=1.5附近的根,要求精度为附近的根,要求精度为10-6。分分析析:“迭迭代代法法”又又称称为为“递递推推法法”,其其基基本本思思想想是是把把一一个个复复杂杂的的计计算算过过程程转转化化为为简简单单过过程程的的多多次次重重复复,每每次次重重复复都都是是从从旧旧值值的的基础上递推出新值,并由新值代替旧值。基础上递推出新值,并由新值代替旧值。图2.29 牛顿迭代法示意图f(x1)x3y0CBAxx1x2 x4D曲线在曲线在A点的斜率为:点的斜
45、率为:f (x1)=f(x1)/(x1-x2)x2=x1-f(x1)/f (x1)Xn+1=xn-f(xn)/f (xn)输入输入x1值,由公式求出值,由公式求出x2,再由,再由x2从公从公式求出式求出x3,.,直到直到|x x n+1 n+1-xn|10-6 时可视时可视x x n+1 n+1为方程为方程f(x)=0在在X1附近的一个近似根附近的一个近似根。73v在本题中,用在本题中,用f表示表示f(xn),用,用f1表示表示f (xn),得:得:f=2xn3-4xn2+3xn-6=(2(xn-2)xn+3)xn-6f1=6 xn2-8 xn+3 =2(3 xn-4)xn+3v在程序中,用在程序中,用xn表示表示xn,用,用xn1表示表示xn+174#include#include using namespace std;int main()float xn,xn1,f,f1;coutxn1;doxn=xn1;f=(2*(xn-2)*xn+3)*xn-6;f1=2*(3*xn-4)*xn+3;xn1=xn-f/f1;while(fabs(xn1-xn)=1e-6);cout方程的一个根为:方程的一个根为:xn1endl;return 0;75
限制150内