程序控制结构讲义课件_第1页
程序控制结构讲义课件_第2页
程序控制结构讲义课件_第3页
程序控制结构讲义课件_第4页
程序控制结构讲义课件_第5页
已阅读5页,还剩145页未读 继续免费阅读

下载本文档

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

文档简介

第2章程序控制结构

2.1顺序结构

2.2选择结构

2.3循环结构

2.4控制转向语句

2.5程序实例

1第2章程序控制结构

2.1顺序结构

2.2按照语句出现的先后顺序依次执行。2.1顺序结构

语句1语句2图2.1顺序结构流程图2按照语句出现的先后顺序依次执行。2.1顺序结构语句12.1.1定义语句说明语句在C++程序中,一个标识符(变量名、常量名、函数名、对象名等)在使用之前必须先定义,通知编译器为其分配存储空间,或告诉编译器它的存在及其特征。例如:inta=0,b=3;constdoublepi=3.14159; intsum(int,int); floatscore[50][3]; 32.1.1定义语句说明语句32.1.2表达式语句形式:<表达式>;可以进行的操作通常包括赋值操作,复合赋值操作,增量、减量操作,函数调用操作和输入输出操作。例如: i++; --j; abs(x);cout<<a+b; cin>>i>>j;sum=a+b; a=b=c; i=1,j=2; b*=c; 42.1.2表达式语句形式:<表达式>;i++; s2.1.3复合语句形式: {<语句1><语句2>……<语句n>}作用:当程序中某个位置在语法上只允许一条语句,而在语义上要执行多条语句才能完成某个操作时,需要使用复合语句。例如:if(x==0){cout<<a;cout<<b;}52.1.3复合语句形式:例如:52.1.4空语句形式:;

作用:当程序中某个位置在语法上需要一条语句,而在语义上又不要求执行任何动作时,可放上一条空语句。一般适用于在循环语句中做空循环体例如:for(m=0;m<1000;m++);62.1.4空语句形式:;输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出提供专门的语句结构。输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的。C++的输出和输入是用“流”(stream)的方式实现的。图3.2和图3.3表示C++通过流进行输入输出的过程。2.1.5基本输入输出7输入和输出并不是C++语言中的正式组成成分。C和C++本身都图3.2图3.388有关流对象cin、cout和流运算符的定义等信息是存放在C++的输入输出流库中的,因此如果在程序中使用cin、cout和流运算符,就必须使用预处理命令把头文件stream包含到本文件中:#include<iostream>尽管cin和cout不是C++本身提供的语句,但是在不致混淆的情况下,为了叙述方便,常常把由cin和流提取运算符“>>”实现输入的语句称为输入语句或cin语句,把由cout和流插入运算符“<<”实现输出的语句称为输出语句或cout语句。根据C++的语法,凡是能实现某种操作而且最后以分号结束的都是语句。9有关流对象cin、cout和流运算符的定义等信息是存放在C+在C++中,所有输入输出是通过输入输出流来实现的。在C++中,将数据从一个对象到另一个对象的流动抽象为“流”。在iostream库中包含一个标准输入流对象cin和一个标准输出流对象cout,分别用来实现从键盘读取数据,以及将数据在屏幕上输出。要使用cin和cout,需要在C++程序开头加上如下包含命令:#include<iostream>//新标准中的头文件名usingnamespacestd;//引入std名字空间中的标识符10在C++中,所有输入输出是通过输入输出流来实现的。101.标准输入流cincin负责从键盘读取数据,使用提取运算符“>>”就可以将键盘键入的数据读入到变量中。语法格式:

cin>>变量1>>变量2>>…>>变量n;变量可以是任意数据类型,输入时各个数据之间用空格键、Tab键或Enter键分隔。例如:inta,b;cin>>a>>b;键盘上输入:93↙a9键盘b3键盘111.标准输入流cincin负责从键盘读取数据,使用提取运算2.标准输出流cout负责将数据输出到屏幕上,使用插入运算符“<<”就可以将数据显示在屏幕上当前光标所在位置。语法格式:

cout<<表达式1<<表达式2<<…<<表达式n;表达式可以是任意类型的,数据输出的格式由系统自动决定。122.标准输出流cout负责将数据输出到屏幕上,使用插入运算表2.1常用格式控制符格式控制符说明示例语句结果endl输出换行符cout<<120<<endl<<240;120240dec十进制表示cout<<dec<<120;120hex十六进制表示cout<<hex<<120;78oct八进制表示cout<<oct<<120;170setw(intn)设置数据输出的宽度cout<<'x'<<setw(3)<<'y';xy(中间有2个空格)13表2.1常用格式控制符格式控制符说明示例语表2.1常用格式控制符格式控制符说明示例语句结果setfill(charc)设置填充字符cout<<setfill('')<<setw(6)<<120;120setprecision(intn)设置浮点数的精度(有效数字位数或小数位数)cout<<setprecision(5)<<12.3456;12.346setiosflags(ios::fixed)定点格式输出cout<<setiosflags(ios::fixed)<<12.3456789;12.345679setiosflags(ios::scientific)指数格式输出cout<<setiosflags(ios::scientific)<<12.3456789;1.234568e+001浮点型默认精度为614表2.1常用格式控制符格式控制符说明示例语【例2.1】cout应用示例#include<iostream>usingnamespacestd;intmain(){ intm=2,n=8; doublepai_1=3.14159265; floatpai_2=3.141f; charch1='A',ch2='B'; boolok=true; cout<<"m="<<m<<endl; cout<<"n="<<n<<endl; cout<<"pai_1="<<pai_1<<",pai_2="<<pai_2<<endl; cout<<"ch1="<<ch1<<",ch2="<<ch2<<endl; cout<<"ok="<<ok<<endl; cout<<"!ok="<<!ok<<endl;return0;}图2.2cout应用示例15【例2.1】cout应用示例#include<iostr【例2.2】使用格式控制符输出数据#include<iostream>#include<iomanip>usingnamespacestd;intmain(){ inta=35; doubleb=12.3456789;

1:cout<<"1234567890123"<<endl;

2:cout<<dec<<a<<‘’<<hex<<a<<‘’<<oct<<a<<endl;//352343

3:cout<<b<<endl;//12.3457

4:cout<<setprecision(4)<<b<<endl;//

12.35

5:cout<<setw(10)<<b<<endl;//

12.35

6:cout<<setw(10)<<setfill('#')<<b<<endl;//

#####12.35

7:cout<<setiosflags(ios::scientific)<<b<<endl;//

1.2346e+001

8:cout<<setprecision(3)<<b<<endl;//1.235e+001

9:cout<<setprecision(2)<<b<<endl;//1.23e+001 return0;}16【例2.2】使用格式控制符输出数据#include<io2.2选择结构按照给定条件有选择地执行程序中的语句C++中:if语句:实现n分支,要求n个表达式。switch语句:实现多分支,只用1个表达式。172.2选择结构按照给定条件有选择地执行程序中的语句172.2.1if语句1.if语句(单分支)语法格式:

if(表达式)语句说明:(1)表达式是任意的数值、字符、关系、逻辑表达式,它表示条件,以true(非0)表示真,false(0)表示假。表达式必须用圆括号括起来。(2)内嵌语句,可以是单条语句,或复合语句。执行顺序182.2.1if语句1.if语句(单分支)执行顺序18bat73773【例2.3】输入两个整数a和b,按从小到大的顺序输出这两个数。分析若a>b,则将a、b交换,否则不交换。两数交换可采用借助于第三个变量间接交换的方法if(a>b) {t=a;a=b;b=t;}19bat73773【例2.3】输入两个整数a和b,按从小到大的#include<iostream>usingnamespacestd;intmain(){ inta,b,t; cout<<"请输入两个整数a,b:"<<endl; cin>>a>>b; if(a>b) {t=a;a=b;b=t;} cout<<a<<'<'<<b<<endl;return0;}{a=a+b;b=a-b;a=a-b;}20#include<iostream>{a=a+b;b=a-2.if-else语句(双分支)if(表达式)语句1else语句2true表达式语句1false语句2图2.7双分支if语句流程图212.if-else语句(双分支)if(表达式)true表【例2.4】输入一个年份,判断是否为闰年。分析闰年的年份可以被4整除而不能被100整除,或者能被400整除。#include<iostream>usingnamespacestd;intmain(){ intyear; cout<<"请输入年份:"; cin>>year;

if((year%4==0&&year%100!=0)||(year%400==0))

cout<<year<<"年是闰年"<<endl; else

cout<<year<<"年不是闰年"<<endl;return0;}22【例2.4】输入一个年份,判断是否为闰年。分析闰年的年份可3.if-elseif语句(多分支)if(表达式1)语句1elseif(表达式2)语句2……elseif(表达式n)语句nelse语句n+1falsefalse…falsetruetrue表达式1

表达式2表达式n语句n语句n+1语句2语句1true233.if-elseif语句(多分支)if(表达式1)f【例2.5】根据x的值,计算分段函数y的值。y的计算公式为:24【例2.5】根据x的值,计算分段函数y的值。y的计算公式为:#include<iostream>#include<cmath>usingnamespacestd;intmain(){ doublex,y; cout<<"请输入x:"; cin>>x;

if(x<0) y=fabs(x); elseif(x<10) y=exp(x)*sin(x); elseif(x<20) y=pow(x,3); else y=(3+2*x)*log(x); cout<<"y="<<y<<endl;return0;}图2.10计算分段函数25#include<iostream>图2.10计算分段函4.if语句的嵌套形式if或else后面的内嵌语句本身又是一个if语句例如:if(表达式1)

if(表达式2)语句1else语句2else

if(表达式3)语句3else语句4264.if语句的嵌套形式if或else后面的内嵌语句本身又是一(1)为了增强程序的可读性,建议采用锯齿型的书写形式。(2)if语句嵌套时,else子句总是与在它前面、距它最近、且尚未匹配的if配对。(3)为明确匹配关系,避免匹配错误,建议将内嵌的if语句一律用“{}”括起来。if(x>0)

if(y>0)cout<<"x与y均大于0";elsecout<<"x大于0,y小于等于0";注意:如何使之与第一个if配对?27(1)为了增强程序的可读性,建议采用锯齿型的书写形式。if【例2.6】从键盘上输入两个字符,比较其大小,输出大于、等于和小于的判断结果。#include<iostream>usingnamespacestd;intmain(){ charch1,ch2; cout<<"请输入两个字符:"; cin>>ch1>>ch2;

if(ch1!=ch2)

if(ch1>ch2) cout<<ch1<<"大于"<<ch2<<endl; else cout<<ch1<<"小于"<<ch2<<endl; else cout<<ch1<<"等于"<<ch2<<endl;return0;}28【例2.6】从键盘上输入两个字符,比较其大小,输出大于、等于2.2.2switch语句switch(表达式){

case常量表达式1:语句1case常量表达式2:语句2…case常量表达式n:语句n[default:语句序列n+1]}注意:表达式只能是整型、字符型或枚举型注意:常量表达式1~n的值必须各不相同。292.2.2switch语句switch(表达式)注意:有无无false有无falsetrue计算表达式的值常量表达式1语句1break常量表达式2语句2break无有false常量表达式ntrue语句nbreakdefault语句n+1true有图2.12switch语句执行流程30有无无false有无falsetrue计算表达式的值常量表达【例2.7】将输入的百分制成绩按以下规定转换成相应的等级:成绩等级100~90优秀89~80良好79~70中等69~60及格59~0不及格31【例2.7】将输入的百分制成绩按以下规定转换成相应的等级:#include<iostream>usingnamespacestd;intmain(){ floatscore; cout<<"请输入成绩:"; cin>>score; if(score>=0&&score<=100)

switch(int(score)/10) { case10: case9:cout<<score<<"分:优秀"<<endl;break; case8:cout<<score<<"分:良好"<<endl;break; case7:cout<<score<<"分:中等"<<endl;break; case6:cout<<score<<"分:及格"<<endl;break; default:cout<<score<<“分:不及格”<<endl; } else cout<<"输入数据有误!"<<endl;return0;}共用同一个语句组

思考:若省去break语句,情况会怎样?

32#include<iostream>共用同一个语句组思考循环?利用计算机重复处理某些实际问题2.3循环结构33循环?利用计算机重复处理某些实际问题2.3循环结构33循环的引出

示例1

求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+134循环的引出特点:2.工作雷同s=0;100条s=s+ii2.3.1while语句while(表达式)

语句falsetrue表达式语句图2.14while语句流程图循环体执行重复工作的语句循环判断条件352.3.1while语句while(表达式)fa假表达式循环体真求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是循环变量36假表达式循环体真求1+2+3+4+5+...+100=?【例2.8】求1+2+3+……+100#include<iostream>usingnamespacestd;intmain(){ inti(1),sum(0);//定义变量,初始化

while(i<=100)//构造循环

{

sum+=i;

//循环体,多次执行

i++; } cout<<"sum="<<sum<<endl;return0;}sumi第1次初始值0112第2次33...第99次4950100第100次505010137【例2.8】求1+2+3+……+100#include<2.3.2do-while语句do语句while(表达式);falsetrue表达式语句图2.15do-while语句流程图382.3.2do-while语句dofalsetrue表达【例2.10】求自然数1~100之和,要求用do-while语句实现。#include<iostream>usingnamespacestd;intmain(){ inti(1),sum(0);

do {

sum+=i;

i++; }while(i<=100); cout<<"sum="<<sum<<endl;return0;}inti(1),sum(0);while(i<=100)

{

sum+=i;

i++;}循环体和条件表达式都相同39【例2.10】求自然数1~100之和,要求用do-whilwhile(1>2)cout<<”IlikeC++!”<<endl;//相当于一个空操作语句docout<<”IlikeC++!”<<endl;while(1>2);//输出一行文字信息:IlikeC++!注意:当第一次循环表达式的值为真时,while与do-while的结果完全一样,否则结果不相同。若while后面的表达式一开始就是为假时,两种循环结果相同吗?40while(1>2)注意:若while后面的表达式一开始就是【例2.11】输入一个自然数,将该数的每一位数字按反序输出。例如:输入12345,输出54321。#include<iostream>usingnamespacestd;voidmain(){ unsignedlongintnum,digital; cout<<"请输入一个自然数:"; cin>>num;

do {

digital=num%10;

num/=10;

cout<<digital; }while(num>0); cout<<endl;}41【例2.11】输入一个自然数,将该数的每一位数字按反序输出。for(表达式1;表达式2;表达式3

)<语句>表达式2执行<语句>非00退出循环表达式1表达式32.3.3for语句循环变量赋初值循环判断条件改变循环变量42for(表达式1;表达式2;表达式3)表达式2执行<语句>【例2.12】求自然数1~100之和,要求用for语句实现。#include<iostream>usingnamespacestd;intmain(){ inti,sum(0); for(i=1;i<=100;i++)

sum+=i; cout<<"sum="<<sum<<endl;return0;}43【例2.12】求自然数1~100之和,要求用for语句实现。for(表达式1;表达式2;表达式3

)<语句>表达式1;while(表达式2){<语句>;

表达式3;}44for(表达式1;表达式2;表达式3)表达式1;44【例2.13】一个小球从100米高处落下,每次落地后反弹回原高度的一半,再落下。求它在第10次落地时共经过多少米?第10次反弹多高?分析:第1次落地时经过的米数为s=100第1次落地后反弹高度为h=100/2第2次落地时经过的米数为s=100+h*2第2次落地后反弹高度为h=h/2第3次落地时经过的米数为s=s+h*2……45【例2.13】一个小球从100米高处落下,每次落地后反弹回#include<iostream>#include<iomanip>usingnamespacestd;intmain(){ floats=100.0,h=s/2;

for(inti=2;i<=10;i++) {

s=s+h*2;

h=h/2; }cout<<setiosflags(ios::fixed)<<setprecision(3); cout<<"第10次落地时,共经过"<<s<<"米;"<<"反弹的高度是"<<h<<"米"<<endl;return0;}思考该小球反弹多少次才能静止下来?46#include<iostream>思考该小球反弹多少注意:for语句中的三个表达式可以部分省略或全部省略,但;不能省略,若省略表达式2,则表示循环条件为真。for(;i<=100;i++)//省略表达式1,注意其后的分号不能省

sum+=i;intsum=0;for(inti=1;;i++)//省略表达式2,注意其后的分号同样不能省{sum+=i;if(i>=100)break};//break语句用于跳出循环intsum=0;for(inti=1;i<=100;)//省略表达式3sum+=i++; //在循环体中对循环变量i递增47注意:for语句中的三个表达式可以部分省略或全部省略,但;不inti=1,sum=0;for(;;){sum+=i++; if(i>100)break;}三个表达式都可以是任何类型的C++表达式。inti,sum;for(i=1,sum=0;i<=100;sum+=i,i++);表达式1可以是变量定义语句,即循环控制变量可在其中定义。intsum=0;for(inti=1;i<=100;i++)sum+=i;48inti=1,sum=0;三个表达式都可以是任何类型的C在屏幕上显示平面图形****************

for(j=1;j<=2*i-1;j++)cout<<’*’;i:行号for(i=1;i<=4;i++){}cout<<endl;****************2.3.4多重循环49在屏幕上显示平面图形for(j=1;j<=2*i-1循环嵌套:循环体内包含另一个完整的循环结构。三种循环语句皆可以相互嵌套。…for(…){…while(…){…}do{…}while(…);…}50循环嵌套:循环体内包含另一个完整的循环结构。…50【例2.14】编程显示输出九九乘法表图2.19九九乘法表运行界面51【例2.14】编程显示输出九九乘法表图2.19九九truefalsei=1i<=9?truefalsej=1j<=9?显示i*j表达式j++i++#include<iostream>usingnamespacestd;intmain(){cout<<"\t\t\t九九乘法表"<<endl;cout<<"\t\t\t------------------"<<endl;

for(inti=1;i<=9;i++){

for(intj=1;j<=9;j++)

cout<<i<<"×"<<j<<'='<<i*j<<'\t';cout<<endl;}return0;}52truefalsei=1i<=9?truefalsej=1图2.21下三角的九九乘法表图2.22上三角的九九乘法表思考:打印上三角或下三角程序如何改动?53图2.21下三角的九九乘法表图2.22上三角的九九乘注意:(1)内循环控制变量与外循环控制变量不能同名。

(2)外循环必须完全包含内循环,不能交叉。

(3)若循环体内有if语句,或if语句内有循环语句,也不能交叉。

(4)利用goto语句可以从循环体内转向循环体外,但绝对不允许从循环体外转入循环体内。

(5)当嵌套使用各种循环语句时,特别需要严格按照缩进规则来书写程序。有时还应适当配以注释,以保持清晰易辩的结构特征。54注意:(1)内循环控制变量与外循环控制变量不能同名。

(2)2.4控制转向语句2.4.1break语句break;用于下列两种情况:1、在开关语句中,其功能是退出开关语句,执行其后的语句;2、在循环体中,其功能是用来退出该重循环552.4控制转向语句2.4.1break语句break【例2.15】从键盘上输入若干个正整数,直到输入负整数为止,计算并输出显示已输入的正整数之和。输入的数不超过20个。

#include<iostream>usingnamespacestd;constintM=20;intmain(){ inti,n,sum=0; cout<<"请输入若干个正整数(输入负数就结束输入):"<<endl; for(i=0;i<M;i++) { cin>>n;

if(n<0)break;//当输入负数时,就退出循环 sum+=n; } cout<<"输入的正整数之和为:"<<sum<<endl;return0;}56【例2.15】从键盘上输入若干个正整数,直到输入负整数为2.4.2continue语句格式:continue;功能:只用在循环体中,用来结束该次循环。在循环体中遇到continue语句时,本次循环结束,回到循环条件判断是否执行下一次循环。572.4.2continue语句格式:57在while和do-while循环结构中,continue语句将使执行流程直接跳转到循环条件的判定部分,然后决定循环是否继续进行。在for循环结构中,当遇到continue时,执行流程将跳过循环体中余下的语句,而转去执行for语句中的表达式3,然后根据表达式2进行循环条件的判定以决定是否继续执行for循环体。58在while和do-while循环结构中,continue语while(i<=100){

break;

}cout<<sum<<endl;while(i<=100){

continue;

}break和continue语句的区别59while(i<=100)while(i<=100)brea【例2.16】输出100以内能够被7整除的所有整数。#include<iostream>#include<iomanip>usingnamespacestd;intmain(){ for(inti=1;i<=100;i++) {

if(i%7!=0)

continue;//如果i不能被7整除,则退出本次循环

cout<<setw(5)<<i; } cout<<endl;return0;}思考:(1)将continue改为break,则输出有什么变化?(2)不采用continue语句,用其它方法如何实现?60【例2.16】输出100以内能够被7整除的所有整数。#i2.4.3goto语句goto标号;标号:语句;标号语句将流程转到标号所指定的标号语句处。612.4.3goto语句goto标号;标号语句将流程转到【例2.17】利用goto语句实现计算前100个自然数之和并输出结果#include<iostream>usingnamespacestd;intmain(){ inti=1,sum=0;

loop:sum+=i; i++; if(i<=100)

gotoloop;

cout<<"sum="<<sum<<endl;return0;}62【例2.17】利用goto语句实现计算前100个自然数之和2.5程序实例【例2.18】输入两个正整数,求最大公约数。算法思想:(1)对于已知两数m,n,使得m>n(2)m除以n得余数r(3)若r=0,则n为最大公约数,结束;否则执行(4)(4)m←n,n←r,再重复执行(2)mnr1252521210辗转相除法while((r=m%n)!=0){m=n;n=r;}cout<<n;632.5程序实例【例2.18】输入两个正整数,求最大公#include<iostream>usingnamespacestd;intmain(){ intm,n,t,r; cout<<"请输入两个正整数:"; cin>>m>>n;

if(m<n){t=m;m=n;n=t;}//使得m>=n

while((r=m%n)!=0)

{ m=n; n=r; } cout<<"最大公约数为:"<<n<<endl;return0;}64#include<iostream>64【例

2.19】显示输出3~100之间的所有素数。分析:(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之间的数整除。(3)在退出循环以后,如果是因为找到了一个能整除m的数而通过break退出循环的,则i<=sqrt(m);反之,如果是正常退出循环的,则i=sqrt(m)+1。因此,在循环结束后,只要判断i是否大于sqrt(m),若是,则表明m是素数,输出该素数。(4)要判断多个数是否为素数,需要使用双重循环。外循环每循环一次提供一个数,由内循环通过多次除法判断其是否为素数。65【例2.19】显示输出3~100之间的所有素数。分析:6#include<iostream>#include<cmath>usingnamespacestd;intmain(){ cout<<"3~100之间的素数是:"<<endl;for(intm=3;m<100;m+=2) { intk=int(sqrt(m));

for(inti=2;i<=k;i++)

if(m%i==0)break;

if(i>k)

cout<<m<<'\t'; } cout<<endl;return0;}66#include<iostream>66【例2.20】输入x,计算sin(x)。计算公式为:当第n项的绝对值小于10-6时结束。分析:关键是找部分级数和的通项:67【例2.20】输入x,计算sin(x)。计算公式为:当第…… intn=1; doublex,t,sinx(0);//变量t保存每一项的值;给sinx变量赋初值0 cout<<"请输入x的值:"; cin>>x;

t=x;//将求和式的第一项值x赋给t

while(fabs(t)>=0.000001) {

sinx+=t;

t=-t*x*x/((n+1)*(n+2));

n+=2; } cout<<"编程求得的sin("<<x<<")="<<sinx<<endl;

cout<<"调用标准函数求得的sin("<<x<<")="<<sin(x)<<endl;

…………68……68【例2.21】求“水仙花数”。所谓“水仙花数”是指一个三位正整数,其各位数字的立方和等于该数本身。

例如:153=13+53+33。方法1:利用三重循环编写程序因为“水仙花数”是三位整数,所以取值范围为100~999。外循环变量i控制百位数字从1变化到9中层循环变量j控制十位数字从0变化到9内循环变量k控制个位数字从0变化到9。……inti,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)

cout<<m<<'';}……69【例2.21】求“水仙花数”。所谓“水仙花数”是指一个三方法2:不使用循环嵌套,只用1个for语句编写程序。…………intmain(){ inti,j,k,n; cout<<"水仙花数:";

for(n=100;n<1000;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)

cout<<n<<''; }…………70方法2:不使用循环嵌套,只用1个for语句编写程序。…………【例2.22】用“枚举法”求解百元买百鸡问题。假定公鸡5元1只,母鸡3元1只,小鸡1元3只,现在有100元钱要买100只鸡,且需包含公鸡、母鸡和小鸡,编程列出所有可能的购鸡方案。分析

设公鸡、母鸡、小鸡各为x、y、z只,可列出方程:采用试凑法(也称为穷举法或枚举法)来实现,即将可能出现的各种情况一一罗列测试,判断是否满足条件,采用循环结构来实现。71【例2.22】用“枚举法”求解百元买百鸡问题。假定公鸡5#include<iostream>usingnamespacestd;intmain(){ intx,y,z; cout<<"公鸡数\t"<<"母鸡数\t"<<"小鸡数\t"<<endl; 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.0==100) cout<<x<<'\t'<<y<<'\t'<<z<<endl; }return0;}72#include<iostream>72【例2.23】用牛顿迭代法求一元方程2x3-4x2+3x-6=0在x=1.5附近的根,要求精度为10-6。分析:“迭代法”又称为“递推法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复,每次重复都是从旧值的基础上递推出新值,并由新值代替旧值。图2.29牛顿迭代法示意图f(x1)x3y0CBAxx1x2

x4D曲线在A点的斜率为:f'(x1)=f(x1)/(x1-x2)x2=x1-f(x1)/f'(x1)Xn+1=xn-f(xn)/f'(xn)输入x1值,由公式求出x2,再由x2从公式求出x3,......,直到|xn+1-xn|﹤10-6时可视xn+1为方程f(x)=0在X1附近的一个近似根。73【例2.23】用牛顿迭代法求一元方程2x3-4x2+3x-在本题中,用f表示f(xn),用f1表示f'(xn),得:f=2xn3-4xn2+3xn-6=(2(xn-2)xn+3)xn-6f1=6xn2-8xn+3

=2(3xn-4)xn+3在程序中,用xn表示xn,用xn1表示xn+174在本题中,用f表示f(xn),用f1表示f'(xn),得#include<iostream>#include<cmath>usingnamespacestd;intmain(){ floatxn,xn1,f,f1; cout<<"请输入x的初值:"; cin>>xn1;

do {

xn=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<<"方程的一个根为:"<<xn1<<endl;return0;}75#include<iostream>75第2章程序控制结构

2.1顺序结构

2.2选择结构

2.3循环结构

2.4控制转向语句

2.5程序实例

76第2章程序控制结构

2.1顺序结构

2.2按照语句出现的先后顺序依次执行。2.1顺序结构

语句1语句2图2.1顺序结构流程图77按照语句出现的先后顺序依次执行。2.1顺序结构语句12.1.1定义语句说明语句在C++程序中,一个标识符(变量名、常量名、函数名、对象名等)在使用之前必须先定义,通知编译器为其分配存储空间,或告诉编译器它的存在及其特征。例如:inta=0,b=3;constdoublepi=3.14159; intsum(int,int); floatscore[50][3]; 782.1.1定义语句说明语句32.1.2表达式语句形式:<表达式>;可以进行的操作通常包括赋值操作,复合赋值操作,增量、减量操作,函数调用操作和输入输出操作。例如: i++; --j; abs(x);cout<<a+b; cin>>i>>j;sum=a+b; a=b=c; i=1,j=2; b*=c; 792.1.2表达式语句形式:<表达式>;i++; s2.1.3复合语句形式: {<语句1><语句2>……<语句n>}作用:当程序中某个位置在语法上只允许一条语句,而在语义上要执行多条语句才能完成某个操作时,需要使用复合语句。例如:if(x==0){cout<<a;cout<<b;}802.1.3复合语句形式:例如:52.1.4空语句形式:;

作用:当程序中某个位置在语法上需要一条语句,而在语义上又不要求执行任何动作时,可放上一条空语句。一般适用于在循环语句中做空循环体例如:for(m=0;m<1000;m++);812.1.4空语句形式:;输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出提供专门的语句结构。输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的。C++的输出和输入是用“流”(stream)的方式实现的。图3.2和图3.3表示C++通过流进行输入输出的过程。2.1.5基本输入输出82输入和输出并不是C++语言中的正式组成成分。C和C++本身都图3.2图3.3838有关流对象cin、cout和流运算符的定义等信息是存放在C++的输入输出流库中的,因此如果在程序中使用cin、cout和流运算符,就必须使用预处理命令把头文件stream包含到本文件中:#include<iostream>尽管cin和cout不是C++本身提供的语句,但是在不致混淆的情况下,为了叙述方便,常常把由cin和流提取运算符“>>”实现输入的语句称为输入语句或cin语句,把由cout和流插入运算符“<<”实现输出的语句称为输出语句或cout语句。根据C++的语法,凡是能实现某种操作而且最后以分号结束的都是语句。84有关流对象cin、cout和流运算符的定义等信息是存放在C+在C++中,所有输入输出是通过输入输出流来实现的。在C++中,将数据从一个对象到另一个对象的流动抽象为“流”。在iostream库中包含一个标准输入流对象cin和一个标准输出流对象cout,分别用来实现从键盘读取数据,以及将数据在屏幕上输出。要使用cin和cout,需要在C++程序开头加上如下包含命令:#include<iostream>//新标准中的头文件名usingnamespacestd;//引入std名字空间中的标识符85在C++中,所有输入输出是通过输入输出流来实现的。101.标准输入流cincin负责从键盘读取数据,使用提取运算符“>>”就可以将键盘键入的数据读入到变量中。语法格式:

cin>>变量1>>变量2>>…>>变量n;变量可以是任意数据类型,输入时各个数据之间用空格键、Tab键或Enter键分隔。例如:inta,b;cin>>a>>b;键盘上输入:93↙a9键盘b3键盘861.标准输入流cincin负责从键盘读取数据,使用提取运算2.标准输出流cout负责将数据输出到屏幕上,使用插入运算符“<<”就可以将数据显示在屏幕上当前光标所在位置。语法格式:

cout<<表达式1<<表达式2<<…<<表达式n;表达式可以是任意类型的,数据输出的格式由系统自动决定。872.标准输出流cout负责将数据输出到屏幕上,使用插入运算表2.1常用格式控制符格式控制符说明示例语句结果endl输出换行符cout<<120<<endl<<240;120240dec十进制表示cout<<dec<<120;120hex十六进制表示cout<<hex<<120;78oct八进制表示cout<<oct<<120;170setw(intn)设置数据输出的宽度cout<<'x'<<setw(3)<<'y';xy(中间有2个空格)88表2.1常用格式控制符格式控制符说明示例语表2.1常用格式控制符格式控制符说明示例语句结果setfill(charc)设置填充字符cout<<setfill('')<<setw(6)<<120;120setprecision(intn)设置浮点数的精度(有效数字位数或小数位数)cout<<setprecision(5)<<12.3456;12.346setiosflags(ios::fixed)定点格式输出cout<<setiosflags(ios::fixed)<<12.3456789;12.345679setiosflags(ios::scientific)指数格式输出cout<<setiosflags(ios::scientific)<<12.3456789;1.234568e+001浮点型默认精度为689表2.1常用格式控制符格式控制符说明示例语【例2.1】cout应用示例#include<iostream>usingnamespacestd;intmain(){ intm=2,n=8; doublepai_1=3.14159265; floatpai_2=3.141f; charch1='A',ch2='B'; boolok=true; cout<<"m="<<m<<endl; cout<<"n="<<n<<endl; cout<<"pai_1="<<pai_1<<",pai_2="<<pai_2<<endl; cout<<"ch1="<<ch1<<",ch2="<<ch2<<endl; cout<<"ok="<<ok<<endl; cout<<"!ok="<<!ok<<endl;return0;}图2.2cout应用示例90【例2.1】cout应用示例#include<iostr【例2.2】使用格式控制符输出数据#include<iostream>#include<iomanip>usingnamespacestd;intmain(){ inta=35; doubleb=12.3456789;

1:cout<<"1234567890123"<<endl;

2:cout<<dec<<a<<‘’<<hex<<a<<‘’<<oct<<a<<endl;//352343

3:cout<<b<<endl;//12.3457

4:cout<<setprecision(4)<<b<<endl;//

12.35

5:cout<<setw(10)<<b<<endl;//

12.35

6:cout<<setw(10)<<setfill('#')<<b<<endl;//

#####12.35

7:cout<<setiosflags(ios::scientific)<<b<<endl;//

1.2346e+001

8:cout<<setprecision(3)<<b<<endl;//1.235e+001

9:cout<<setprecision(2)<<b<<endl;//1.23e+001 return0;}91【例2.2】使用格式控制符输出数据#include<io2.2选择结构按照给定条件有选择地执行程序中的语句C++中:if语句:实现n分支,要求n个表达式。switch语句:实现多分支,只用1个表达式。922.2选择结构按照给定条件有选择地执行程序中的语句172.2.1if语句1.if语句(单分支)语法格式:

if(表达式)语句说明:(1)表达式是任意的数值、字符、关系、逻辑表达式,它表示条件,以true(非0)表示真,false(0)表示假。表达式必须用圆括号括起来。(2)内嵌语句,可以是单条语句,或复合语句。执行顺序932.2.1if语句1.if语句(单分支)执行顺序18bat73773【例2.3】输入两个整数a和b,按从小到大的顺序输出这两个数。分析若a>b,则将a、b交换,否则不交换。两数交换可采用借助于第三个变量间接交换的方法if(a>b) {t=a;a=b;b=t;}94bat73773【例2.3】输入两个整数a和b,按从小到大的#include<iostream>usingnamespacestd;intmain(){ inta,b,t; cout<<"请输入两个整数a,b:"<<endl; cin>>a>>b; if(a>b) {t=a;a=b;b=t;} cout<<a<<'<'<<b<<endl;return0;}{a=a+b;b=a-b;a=a-b;}95#include<iostream>{a=a+b;b=a-2.if-else语句(双分支)if(表达式)语句1else语句2true表达式语句1false语句2图2.7双分支if语句流程图962.if-else语句(双分支)if(表达式)true表【例2.4】输入一个年份,判断是否为闰年。分析闰年的年份可以被4整除而不能被100整除,或者能被400整除。#include<iostream>usingnamespacestd;intmain(){ intyear; cout<<"请输入年份:"; cin>>year;

if((year%4==0&&year%100!=0)||(year%400==0))

cout<<year<<"年是闰年"<<endl; else

cout<<year<<"年不是闰年"<<endl;return0;}97【例2.4】输入一个年份,判断是否为闰年。分析闰年的年份可3.if-elseif语句(多分支)if(表达式1)语句1elseif(表达式2)语句2……elseif(表达式n)语句nelse语句n+1falsefalse…falsetruetrue表达式1

表达式2表达式n语句n语句n+1语句2语句1true983.if-elseif语句(多分支)if(表达式1)f【例2.5】根据x的值,计算分段函数y的值。y的计算公式为:99【例2.5】根据x的值,计算分段函数y的值。y的计算公式为:#include<iostream>#include<cmath>usingnamespacestd;intmain(){ doublex,y; cout<<"请输入x:"; cin>>x;

if(x<0) y=fabs(x); elseif(x<10) y=exp(x)*sin(x); elseif(x<20) y=pow(x,3); else y=(3+2*x)*log(x); cout<<"y="<<y<<endl;return0;}图2.10计算分段函数100#include<iostream>图2.10计算分段函4.if语句的嵌套形式if或else后面的内嵌语句本身又是一个if语句例如:if(表达式1)

if(表达式2)语句1else语句2else

if(表达式3)语句3else语句41014.if语句的嵌套形式if或else后面的内嵌语句本身又是一(1)为了增强程序的可读性,建议采用锯齿型的书写形式。(2)if语句嵌套时,else子句总是与在它前面、距它最近、且尚未匹配的if配对。(3)为明确匹配关系,避免匹配错误,建议将内嵌的if语句一律用“{}”括起来。if(x>0)

if(y>0)cout<<"x与y均大于0";elsecout<<"x大于0,y小于等于0";注意:如何使之与第一个if配对?102(1)为了增强程序的可读性,建议采用锯齿型的书写形式。if【例2.6】从键盘上输入两个字符,比较其大小,输出大于、等于和小于的判断结果。#include<iostream>usingnamespacestd;intmain(){ charch1,ch2; cout<<"请输入两个字符:"; cin>>ch1>>ch2;

if(ch1!=ch2)

if(ch1>ch2) cout<<ch1<<"大于"<<ch2<<endl; else cout<<ch1<<"小于"<<ch2<<endl; else cout<<ch1<<"等于"<<ch2<<endl;return0;}103【例2.6】从键盘上输入两个字符,比较其大小,输出大于、等于2.2.2switch语句switch(表达式){

case常量表达式1:语句1case常量表达式2:语句2…case常量表达式n:语句n[default:语句序列n+1]}注意:表达式只能是整型、字符型或枚举型注意:常量表达式1~n的值必须各不相同。1042.2.2switch语句switch(表达式)注意:有无无false有无falsetrue计算表达式的值常量表达式1语句1break常量表达式2语句2break无有false常量表达式ntrue语句nbreakdefault语句n+1true有图2.12switch语句执行流程105有无无false有无falsetrue计算表达式的值常量表达【例2.7】将输入的百分制成绩按以下规定转换成相应的等级:成绩等级100~90优秀89~80良好79~70中等69~60及格59~0不及格106【例2.7】将输入的百分制成绩按以下规定转换成相应的等级:#include<iostream>usingnamespacestd;intmain(){ floatscore; cout<<"请输入成绩:"; cin>>score; if(score>=0&&score<=100)

switch(int(score)/10) { case10: case9:cout<<score<<"分:优秀"<<endl;break; case8:cout<<score<<"分:良好"<<endl;break; case7:cout<<score<<"分:中等"<<endl;break; case6:cout<<score<<"分:及格"<<endl;break; default:cout<<score<<“分:不及格”<<endl; } else cout<<"输入数据有误!"<<endl;return0;}共用同一个语句组

思考:若省去break语句,情况会怎样?

107#include<iostream>共用同一个语句组思考循环?利用计算机重复处理某些实际问题2.3循环结构108循环?利用计算机重复处理某些实际问题2.3循环结构33循环的引出

示例1

求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+1109循环的引出特点:2.工作雷同s=0;100条s=s+ii2.3.1while语句while(表达式)

语句falsetrue表达式语句图2.14while语句流程图循环体执行重复工作的语句循环判断条件1102.3.1while语句while(表达式)fa假表达式循环体真求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是循环变量111假表达式循环体真求1+2+3+4+5+...+100=?【例2.8】求1+2+3+……+100#include<iostream>usingnamespacestd;intmain(){ inti(1),sum(0);//定义变量,初始化

while(i<=100)//构造循环

{

sum+=i;

//循环体,多次执行

i++; } cout<<"sum="<<sum<<endl;return0;}sumi第1次初始值0112第2次33...第99次4950100第100次5050101112【例2.8】求1+2+3+……+100#include<2.3.2do-while语句do语句while(表达式);falsetrue表达式语句图2.15

温馨提示

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

评论

0/150

提交评论