[工学]第3章_程序设计初步课件

PPT
  • 阅读 91 次
  • 下载 0 次
  • 页数 149 页
  • 大小 2.208 MB
  • 2022-11-12 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档40.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
[工学]第3章_程序设计初步课件
可在后台配置第一页与第二页中间广告代码
[工学]第3章_程序设计初步课件
可在后台配置第二页与第三页中间广告代码
[工学]第3章_程序设计初步课件
可在后台配置第三页与第四页中间广告代码
[工学]第3章_程序设计初步课件
[工学]第3章_程序设计初步课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 149
  • 收藏
  • 违规举报
  • © 版权认领
下载文档40.00 元 加入VIP免费下载
文本内容

【文档说明】[工学]第3章_程序设计初步课件.ppt,共(149)页,2.208 MB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-2107.html

以下为本文档部分文字说明:

信息学院信息技术教研室第3章程序设计初步23.1面向过程的程序设计和算法面向过程的程序设计方法不仅要求程序设计者考虑要“做什么”,还要解决“怎么做”的问题。3.1.1算法的概念一个面向过程的程序应包括以下

两方面内容:1)对数据的描述,即数据结构。在C++语言中,最基本的数据结构就是C++提供的基本数据类型。2)对数据处理的描述,即计算机算法。算法是为解决一个问题而采取的方法和步骤,是程序的灵魂。程序=算法+数据结构3算

法什么是算法?算法就是为解决某个问题而采取的一系列步骤。算法要解决什么问题?算法必须具体地指出在执行时每一步应当怎样做,例如程序中应该出现什么语句?语句的顺序如何安排?程序中的操作语句,就是算法的具体体现。广义地说,为解决一个问题而采取的方法和步骤,就称为“算法”

。如太极拳的算法、一首歌曲的乐谱。计算机算法可分为两大类别:❖数值算法:用于求数值解。如求方程的根。❖非数值算法:用于事务管理领域。如排序。4把大象放冰箱里的算法,分几步?53.1.2算法的表示1.自然语言❖例如,用自然语言表示“把大象放冰箱”的算法2.

伪代码❖用介于自然语言和计算机语言之间的文字和符号来描述算法。详见P46的例子。❖特点⚫没有固定、严格的语法规则⚫不用图形符号,因此书写方便、容易修改⚫便于向计算机语言算法过渡。❖广泛应用于国外的计算机教材和专业编程人员的实际编程

中。3.用计算机语言表示算法:即程序。64.流程图:用图的形式表示算法,比较直观,但修改算法时很不方便。流程图包括传统流程图和结构化流程图(N-S流程图)。❖传统流程图使用的符号:7❖传统流程图的例子:理解它的含义开始从键盘输入数据a

输出a结束a>0?输出-aYN8❖结构化流程图(N-S流程图):⚫传统流程图由一些特定意义的图形、流程线及简要的文字说明构成,它能清晰明确地表示程序的运行过程。⚫在使用过程中,人们发现流程线不一定是必需的,随着结构化程序设计方法

的出现,1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形式,这种流程图完全去掉了流程线,算法的每一步都用一个矩形框来描述,把一个个矩形框按执行的次序连接起来就是一个完整的算法描述。这种流程图同两位学者名字的第一个字母来命名,称为N-S流程图。⚫只要求掌握

一种流程图,传统流程图更好理解。93.2C++程序和语句§一个程序包含一个或多个程序单位(每个程序单位构成一个程序文件,如图3.1所示)。每一个程序单位由以下几个部分组成:1)预处理命令。如#include命令和#define命令。2)声明部分。例如对数据类型和

函数的声明,以及对变量的定义。3)函数。包括函数首部和函数体,在函数体中可以包含若干声明语句和执行语句。❖注意:每个程序(project)必须有一个(而且只能有一个)main函数,可以包含其他函数。10C++程

序结构11#include<iostream>//预处理命令usingnamespacestd;//在函数之外的声明部分inta=3;//在函数之外的声明部分intmain()//函数首部{floatb;//函

数内的声明部分b=4.5;//执行语句cout<<a<<b;//执行语句return0;//执行语句}全局变量与局部变量如果一个变量在函数之外进行声明,此变量是全局变量,它的有效范围是从该行开始到本程序单位结束。如果一个变量在函数内声明,此变量是

局部变量,它的有效范围是从该行开始到本函数结束。12C++的语句:最小的独立单位。以分号结尾4种语句:1.声明语句❖在C++中,对变量(以及其他对象)的定义被认为是一条语句。❖可以出现在函数中的任何行,当然必须是在使用该变量之前进行声明。inta,b;132.执行语句:完成一定

的操作1)控制语句:控制程序的转向。C++有9种控制语句:①if()~else~(条件语句)②for()~(循环语句)③while()~(循环语句)④do~while()(循环语句)⑤continue(结束本次循环语句)⑥break(中止执行switch或循环语句)⑦switc

h(多分支选择语句)⑧goto(转向语句)⑨return(从函数返回语句)说明:上面9种语句中的括号()表示其中包含一个条件,~表示内嵌的语句。例如以下是if()~else~语句的一个具体例子:if(x>0)cout

<<x;elsecout<<-x;142)函数和流对象调用语句:⚫一次函数调用加上一个分号就构成了一个函数调用语句,如:sort(x,y,z);//假设已定义了sort函数,它有3个参数⚫输入输出流的使用也构成一条语句,如:cout<<x<<endl;3)表达式语句⚫任何一个表

达式的最后加一个分号都可以成为一个语句,如:i=i+1//赋值表达式i=i+1;//赋值语句⚫函数调用语句也可以认为是一个表达式语句153.空语句❖只有一个分号的语句,它什么也不做。❖有时用来做被转向点,或循环语句中的

循环体。4.复合语句❖用{}把一些语句括起来成为复合语句❖注意:在复合语句中定义的局部变量的作用范围仅限于该复合语句。#include<iostream>//预处理命令usingnamespacestd;//在函数之外的声明部分intmain()//函数首部{{inta=

5;}cout<<a;//语法错误,a未定义return0;//执行语句}163.3赋值语句1.C++中的赋值号“=”是一个运算符。2.赋值表达式加上分号就构成了赋值语句,如:i=i+1//赋值表达式i=i+1;/

/赋值语句3.在C++中,赋值表达式可以包含在其他表达式之中,如(理解)下面这条语句:if((a=b)>0)cout<<"a>0"<<endl;含义:先进行赋值运算(将b的值赋给a),然后判断a是否大于0,如大于0,执行cout<<"a>0"<<

endl;173.4C++的输入与输出C与C++的输入输出C和C++都没有专门的输入输出语句,分别是由函数和流对象来实现的。在C语言中,输入和输出是通过调用scanf和printf函数来实现的,C++中保留了这2个函数。在C++中,输入和输出是通过调用输入输出流库中的流对象

cin和cout实现的。也就是说输入输出不是C++本身定义的,而是在编译系统提供的I/O库中定义的。因此在使用到cin和cout的程序文件里,必须包含iostream头文件。18输入输出流“流”是指来自设备或传给设备的一个数据流c

out是输出流对象的名字,<<是流插入运算符,作用是将需要输出的内容插入到输出流中,默认的输出设备是显示器。cin是输入流对象的名字,>>是流提取运算符,作用是从默认的输入设备(一般为键盘)的输入流中提取若干字节送到计算机内存中指定的变量。19说明:有关流对象c

in、cout和流运算符的定义等信息是存放在C++的输入输出流库中的,因此如果在程序中使用cin、cout和流运算符,就必须使用预处理命令把头文件iostream包含到本文件中:#include<iostream>为了叙述方便,常常把由cin和流提取运算符“>>”实现输入的语句称为

输入语句或cin语句,把由cout和流插入运算符“<<”实现输出的语句称为输出语句或cout语句。203.4.1输入流与输出流的基本操作cin>>变量1>>变量2>>……>>变量n;cout<<表达式1<<表达式2<<……<<表达式n;cout语句的一般格式为cin语句的一般格式

为理解流对象:在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout语句中的endl(或'\n',ends,fl

ush)为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。输出流中的数据在系统默认的设备(一般为显示器)输出。21一个不大贴切的比喻§缓冲区、缓冲器在计算机软硬件里是一个很重要的概念。§使用cout进行输

出的一个比喻:做生意,攒钱,不可能赚了100,就去银行存一次;要么攒够了10000,去银行存一次(对应于缓冲区满的情况);要么攒了一个月,去银行存一次(对应于cout语句中的遇到endl等就将缓冲区中已有的数据一起输出)。输出完,要清空缓冲区。(把攒的钱存入银行以后,又从0开始

攒钱了)22cout<<"Thisis"//末尾无分号<<"asimpleC++"<<"program."<<endl;//(2)最后有分号cout<<"ThisisasimpleC++program."<<

endl;//(1)一个cout语句可以分写成若干行。如:可以写成(以下各行是同一个C++语句),注意与P26比较coutcout<<"Thisis\aC++\program."<<endl;功能上等效(不推荐使用)语法上等效(是同一个C++语句)cout<<"Thisis"<<"asimp

leC++"<<"program."<<endl;//(3)23cout<<"Thisis";//语句末尾有分号cout<<"asimpleC++";cout<<"program.";cout<<endl;也可写成多个cout语句,以上3种情况的输出均为c

out<<a,b,c;//错误,不能一次插入多项cout<<a+b+c;//正确,这是一个表达式,作为一项注意,不能用一个插入运算符“<<”插入多个输出项:在用cout输出时,用户不必通知计算机按何种类型输出,系统会自动判

别输出数据的类型,使输出的数据按相应的类型输出。ThisisasimpleC++program.24charc1,c2;inta;floatb;cin>>c1>>c2>>a>>b;在用cin输入时,系

统也会根据变量的类型从输入流中提取相应长度的字节。如有:如果输入系统会提取第一个字符‘1’给字符变量c1,取第二个字符‘2’给字符变量c2,再取34给整数变量a,最后取56.78给实型变量b。cin123456.78↙253.4.2在输入流与输出流中使用控制符在

输入输出流中使用控制符,可以达到一些特殊的效果,如在输出实数时规定字段宽度,只保留两位小数,数据向左或向右对齐等。C++提供了在输入输出流中使用的控制符(有的书中称为操纵符),见表3.1。如果使用了控制符,在程序单位的开头除了要加iostream头文件外,还要加iomanip头文件。26d

oublea=123.456789012345;对a赋初值(1)cout<<a;输出:123.457(2)cout<<setprecision(9)<<a;输出:123.456789(3)cout<<setprecision(6);恢复默认格式(精度

为6)(4)cout<<setiosflags(ios::fixed)<<a;输出:123.456789(书上漏掉了)(5)cout<<setiosflags(ios::fixed)<<setprecision(8)<<a;输出:123.45

678901(6)cout<<setiosflags(ios::scientific)<<a;输出:1.234568e+02(7)cout<<setiosflags(ios::scientific)<<setprecision(4)<<a;输出:1.2346e+02说明:第(1)行按默认

格式输出(以十进制小数形式输出,全部有效数字为6位)。第(2)行指定输出9位有效数字。第(3)行恢复默认格式,精度为6。第(4)行要求以固定小数位输出,默认输出6位小数。第(5)行指定输出8位小数。第(6)行指定按指数形式输出,默认给出6位小数(第7位四舍五入)。第(7)行以指数形式

输出,指定4位小数。注意:在保留精度时要进行四舍五入。双精度数输出的例子:27#include<iostream>#include<iomanip>usingnamespacestd;intmain(){doublea=123.456789012345;//对a赋初值cout<<a<<end

l;//输出:123.457(四舍五入)cout<<setprecision(9)<<a<<endl;//输出:123.456789cout<<setprecision(6);//恢复默认格式(精度为6)co

ut<<setiosflags(ios::fixed)<<a<<endl;//输出:123.456789cout<<setprecision(8)<<a<<endl;//输出:123.45678901cout<<resetiosflags(ios::fixed);//在按scien

tific输出之前如果使用了fixed,一定要先取消fixed,//否则无法按科学计数法形式输出。cout<<setiosflags(ios::scientific)<<a<<endl;//输出:1.

234568e+02(四舍五入)cout<<setiosflags(ios::scientific)<<setprecision(4)<<a<<endl;//输出:1.2346e+02(四舍五入)return0;}28关于格式控制时有效数字的说明(在第13章还会详细讲述,

初学者不必拘泥细节,这些细节也没有什么意义,只是初学者在对输出的有效数字位数感到困惑时,可以查阅这些说明)§除表3.1列出的控制符外,还有一个特殊的控制符(P425,表13.3):resetiosflags()

,用于终止已设置的输出格式状态,在括号中应指定要取消的格式控制符,比如:cout<<resetiosflags(ios::scientific);可以取消科学计数法显示浮点数。§在使用setiosflags(ios::scientific)按科学计数法输出浮点数之前如果使用了setios

flags(ios::fixed),一定要先用resetioflags(ios::fixed)取消fixed,否则无法按科学计数法形式输出。§对于6位有效数字,有小数点后6位有效数字与全部6位有效数字之分。那么到

底在什么情况下是指小数点后的有效数字,在什么情况下是指全部有效数字呢?29§全部有效数字的情形:1)默认情况下(是指在此之前没有设置过fixed和scientific),输出6位有效数字,是指按固定小数形式输出全部

6位有效数字,包括小数部分和整数部分,进行四舍五入(如果整数部分超过6位,则默认以科学计数法输出,也是全部6位有效数字)。当然如果同时用setprecision(n)指定了有效数字的位数,则全部有效数字的位数为n。2)如果在输出前用reseti

osflags()取消最近设置过的fixed或scientific格式,这时有效数字是指全部有效数字。如果没有用setprecision(n)指定有效数字的位数,则默认为6位,反之是n位。3)使用scientific输出完后,没有用resetiosflags()取消scientific,紧接

着按fixed输出,也是指全部有效数字。4)但是在使用fixed输出完后,没有用resetiosflags()取消fixed,紧接着按scientific输出,无法按科学计数法形式输出,这时仍然是按固定小数点形式输出,而且也是指全部有效数字。30§小数点后有效数字的情形:1)第一次设置fixed格

式,则按固定小数形式输出,这时有效数字是指小数点后的有效数字;如果没有用setprecision(n)指定有效数字的位数,则默认为6位,反之是n位。2)第一次设置scientific格式,则按科学计数法形式输出,这时有效数字是指小数点后的有效数字;如果没有用setp

recision(n)指定有效数字的位数,则默认为6位,反之是n位。3)对比前面的第3)点,使用scientific输出完后,用resetiosflags()取消scientific,紧接着用fixed输出,这时有效数字是指小数点后的有效数字。4)对比前面的第4)点,

使用fixed输出完后,用resetiosflags()取消fixed,紧接着用scientific输出,这时有效数字是指小数点后的有效数字。31intb=123456;对b赋初值(1)cout<<b;输出:123456(2)cout<<hex<<b;输出:1e240(

3)cout<<setiosflags(ios::uppercase)<<b;输出:1E240(4)cout<<setw(10)<<b<<‘,’<<b;输出:123456,123456(5)cout<<setfill('*')<<setw(10)<<b;

输出:****123456(6)cout<<setiosflags(ios::showpos)<<b;输出:+123456说明:第(1)行按十进制整数形式输出。第(2)行按十六进制整数形式输出,其中字母e代表十进制中的14。第(3)行按十六进制形式输出,字母e改为大写。第(

4)行指定字段宽为10,在123456前留4个空格。紧接着再输出一次b,但由于setw只对其后第一个数据起作用,因此在输出第二个b时setw(10)不起作用,按默认方式输出,前面不留空格。第(5)行在输出时用‘*’代替空格。第(6)行在正数前面加一个‘+

’号。整数输出的例子:32#include<iostream>#include<iomanip>usingnamespacestd;intmain(){intb=123456;//对b赋初值cout<<b<<endl;/

/输出:123456cout<<hex<<b<<endl;//输出:1e240cout<<setiosflags(ios::uppercase)<<b<<endl;//输出:1E240cout<<dec;//还原成10进制输出cout<<setw(10)<<b<<','<<b

<<endl;//输出:123456,123456cout<<setfill('*')<<setw(10)<<b<<endl;//输出:****123456cout<<setiosflags(ios::showpos)<<b<<endl;//输出:+123456return0;}33#inc

lude<iostream>#include<iomanip>usingnamespacestd;intmain(){doublea=123.456,b=3.14159,c=-3214.67;cout<<setiosflags(ios∷fixed)<

<setiosflags(ios∷right)<<setprecision(2);cout<<setw(10)<<a<<endl;cout<<setw(10)<<b<<endl;cout<<setw(10)<<c<<endl;retur

n0;}如果在多个cout语句中使用相同的setw(n),并使用setiosflags(ios∷right),可以实现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。例3.1各行小数点对齐。运

行情况如下:123.463.14-3214.67343.4.3用getchar和putchar函数进行字符的输入与输出除了可以用cin和cout语句输入和输出字符外,C++还保留了C语言中用于输入和输出单个字符的函

数,使用很方便。其中最常用的有getchar函数和putchar函数。351.putchar函数(字符输出函数)putchar函数的作用是向终端输出一个字符。例如putchar(c);它输出字符变量c的值。#include<iostream>//或者包含头文件stdio

.h:#include<stdio.h>usingnamespacestd;intmain(){chara,b,c;a='B';b='O';c='Y';putchar(a);putchar(b);putchar(c);pu

tchar('\n');putchar(66);putchar(79);putchar(89);putchar(10);return0;}运行情况如下:BOYBOY36用putchar可以输出转义字符putchar(‘\n’)输出换行符putchar(66)将66(字母’B’

)作为ASCII码转换为字符输出putchar(10)10是换行符的ASCII码,输出一个换行符putchar(‘\101’)输出字符’A’,八进制的101是’A’的ASCII码putchar(‘\’‘)输出单引号字符’putch

ar(‘\015’)八进制的015是十进制的13,代表“回车”,不换行,使输出的当前位置移到本行开头372.getchar函数(字符输入函数)此函数的作用是从终端(或系统隐含指定的输入设备)输入一个字符。g

etchar函数没有参数,其一般形式为getchar()函数的值就是从输入设备得到的字符。#include<iostream>usingnamespacestd;intmain(){charc;c=getchar();putchar(c+32);putchar

('\n');return0;}运行情况如下:A↙a38有关getchar函数的其他使用方法的描述见P56~57。393.4.4用scanf和printf函数进行输入与输出(自学)平时练习可以不用scanf和printf函数进行输入输出,但是二级考试采用的是C语言,所以这

两个函数还是要掌握的。在C语言中是用printf函数进行输出,用scanf函数进行输入的。C++保留了C语言的这一用法。scanf函数一般格式是:scanf(格式控制,输出表列)printf函数的一般格式是:printf(格式控制,输出表列)scanf、prin

tf函数的缺点:必须指定输出和输入数据的类型和格式,烦琐复杂,而且容易出错。40例3.4用scanf和printf函数进行输入和输出。#include<iostream>usingnamespacestd;intmain(){inta;floatb;charc;//注意在变量名前要加地址运算符&

scanf("%d%c%f",&a,&c,&b);printf("a=%d,b=%f,c=%c\n",a,b,c);//提问:请写出这两条语句的C++形式。return0;}运行情况如下:12A67.98↙(本行为输入,输入的3个数据间以空格相间)a=12,b=

67.980003,c=A(本行为输出)41结构化程序设计的3种基本结构(引入):1966年由Bohra和Jacopini提出顺序结构选择结构(分支结构)循环结构已经证明,由以上基本结构组成的程序能处理任何复杂的问题。423.5顺序结构顺

序结构:从上到下顺序执行各语句,没有分支。例3.5求一元二次方程式ax2+bx+c=0的根。a,b,c的值在运行时由键盘输入,假定它们的值满足b2-4ac≥0。根据公式求x1,x2的算法。它可以编写出以下C++程序://例

3.5#include<iostream>#include<cmath>//由于程序要用到数学函数sqrt,故应包含头文件cmathusingnamespacestd;intmain(){floata,b,c,x1,x2;cin>>a>>b>>c;x1=(-b+sqrt(b

*b-4*a*c))/(2*a);x2=(-b-sqrt(b*b-4*a*c))/(2*a);cout<<"x1="<<x1<<endl;cout<<"x2="<<x2<<endl;return0;}运行情

况如下:4.58.82.4↙x1=-0.327612x2=-1.6279443开始输入a,b,c计算x1,x2输出x1,x2结束把大象放冰箱里的算法也是顺序结构的,它没有判断能否把大象放进冰箱。(纯属搞笑)44选择结构(分支结构)的引入例3.5是假设b2-4ac≥0,如果事先不知道b2-4ac

是不是大于0,那么在程序中就必须判断b2-4ac是大于等于0,还是小于0,分别求出2个实根、输出“无实数解”信息。流程图如下:开始输入a,b,c计算x1,x2输出x1,x2结束b2-4ac≥0?输出“无实数解”YN选择结构中的条件判断要通过关系

运算来实现,多个条件要通过逻辑运算来连接。453.6关系运算与逻辑运算选择结构中的条件判断要通过关系运算来实现,多个条件要通过逻辑运算来连接。所以先看看关系运算和逻辑运算C++提供if语句来实现这种条件选择。如if(amount<1

000)tax=0.95;elsetax=0.9;pay=amount*tax;流程可以用图3.4表示。463.6.1关系运算和关系表达式关系运算实际上就是比较运算,将2个数据进行比较,得到判断的结果(真或假)。C++的关系运算符有(注

意“=”与“==”的区别):①<(小于)②<=(小于或等于)③>(大于)④>=(大于或等于)⑤==(等于)⑥!=(不等于)优先级相同(高)优先级相同(低)47关系运算符的优先级:1)前4种关系运算符(<,<=,>,>=)的优先级别相同,后两种也相同。前4种高于后两种

。例如,“>”优先于“==”。而“>”与“<”优先级相同。2)关系运算符的优先级低于算术运算符。3)关系运算符的优先级高于赋值运算符。例如:c>a+b等效于c>(a+b)a>b==c等效于(a>b)==ca==b<c等效于a==(b<c)a=b>c等

效于a=(b>c)算术运算符(高)关系运算符赋值运算符(低)48关系表达式❖用关系运算符将两个表达式连接起来的式子,称为关系表达式。❖关系表达式的一般形式可以表示为:表达式关系运算符表达式❖其中的“表达式”可以是算术表达式或关系表达式、逻辑表达式、赋值表达式、字符表达式。例如,下面都是合法的关

系表达式:a>b,a+b>b+c,(a==3)>(b==5),'a'<'b',(a>b)>(b<c)❖任何表达式都应该有一个确定的值。算术表达式的值就是算术表达式的结果。赋值表达式的值就是赋予变量的值。❖关系表达式的值是一个逻辑值,即“真”或“假”。例如,关系表达式“5==3”的值为“假”

,“5>=0”的值为“真”。在C和C++中都用数值1代表“真”,用0代表“假”。❖关系表达式的例子见P60。493.6.2逻辑常量和逻辑变量C语言没有提供逻辑型数据,关系表达式的值(真或假)分别用数值1和0代表。C++增加了逻辑型数据。逻辑型常量(或称布尔常量):只有两个,即false(

假)和true(真)。逻辑型变量(或称布尔变量)要用类型标识符bool来定义,它的值只能是true和false之一,如:boolfound,flag=false;found=true;注意:在编译系统处理逻辑型数据时,将fals

e处理为0,将true处理为1,而不是将false和true这两个英文单词存放到内存单元中。逻辑型变量在内存中占1个字节。50逻辑型数据与数值型数据§逻辑型→数值型与char型数据类似,既然在内存中是用一个字节来存储逻辑型数据,并且0表示false,1表示true,因此逻辑型数

据可以与数值型数据进行算术运算。例如假设变量btemp是逻辑型变量,它的值为false,那么:inta=2+btemp+false;//赋值后a的值为多少?总之:如果在同一个表达式中同时有逻辑型数据和数值型数据,则按如下方式进行处理(可以在图2.7中加上

bool型数据,应该加在哪里?):例子:boolflag=true;inta=2+flag;intb=a<flag;51§数值型→逻辑型如果将一个非零的数值型数据(包括整型和浮点型的常量、变量)赋值给逻辑型变量,则按“真”处理。0按false处理。如:boolflag=25

;另外,在条件判断中,只要表达式的值非0,就认为是true的,0认为是false的,如:inta=5;intb=6;if(a-b)cout<<"Hello"<<endl;if(a)cout<<"Hi"<<endl;if(a==b-1)cout<<"nicetomeetu!"<

<endl;逻辑型数据数值型数据true为1,false为0非0为true,0为false523.6.3逻辑运算和逻辑表达式(1)逻辑“或”运算:||命题A:成绩X小于60命题B:成绩X大于90A||B:成绩X小于60或大于90如果X=50,则命题A为真,B为假,A||B为真,即1||0=1(2

)逻辑“与”:&&命题A:成绩X大于60命题B:成绩X小于90A&&B:成绩X介于60和90之间如果X=70,则命题A为真,B为真,A&&B为真,即1&&1=1;如果没有逻辑运算的概念,可先看命题之间的逻辑运算:一个命题为真或假,如果令1为真,则0为假。53C++里的逻辑运算

和逻辑表达式多个关系表达式的连接要通过逻辑运算符来实现C++提供了3种逻辑运算符1)&&逻辑与(表示并且)2)||逻辑或(表示或者)3)!逻辑非(求反)双目运算符:要求运算符的2侧各有一个操作数单目运算符:只要求运算符的右侧有1个操作数3种逻辑运算符的真值表如表3.2所示

。❖&&:当且仅当2个操作数都为真的时候,表达式的值才为真,其余情况都为假。❖||:当且仅当2个操作数为假的时候,表达式的值才为假,其余情况都为真。54逻辑运算符的优先级:❖!(非)→&&(与)→||(或),即“!”为三者中最高的。❖逻辑运算符中的“&&”和“

||”低于关系运算符,“!”高于算术运算符。例如:(a>b)&&(x>y)可写成a>b&&x>y(a==b)||(x==y)可写成a==b||x==y(!a)||(a>b)可写成!a||a>b!(高)算术运算符关系运算符&&和||赋值运算符(低)5

5运算符优先级的把握原则§C++提供了多达几十种运算符,各种运算符的优先级级别不一样,很繁琐,怎么把握运算符的优先级?掌握常见运算符的优先级大致顺序;如果不能确定运算符优先级的顺序,可以使用括号明确程序设计者的意图。例如:❖如果要表示“a>5或者a<3”,表示成“a>5||b<3”

时不能确定逻辑运算符“||”和关系运算符“<”、“>”的优先级顺序,则可以加上括号,表示成“(a>5)||(b<3)”肯定不会错,而且符合程序设计者的意图。56逻辑表达式❖将两个表达式(不限定为关系表

达式)用逻辑运算符连接起来就成为一个逻辑表达式。❖逻辑表达式的一般形式可以表示为:表达式逻辑运算符表达式❖逻辑表达式的值是一个逻辑量“真”或“假”。在给出逻辑运算结果时,以数值1代表“真”,以0代表“假”,但在判断一个逻辑量是否为“真”时,采取的标准是:如果其值是0就认为是“

假”,如果其值是非0就认为是“真”。(见下面的例子)57例如:1)若a=4,则!a的值为0。因为a的值为非0,被认作“真”,对它进行“非”运算,得“假”,“假”以0代表。2)若a=4,b=5,则a&&b的值为1。因为a和b均为非0,被认为是“真”。3)a,b值同前,a-b||a+b的值为1。因为

a-b和a+b的值都为非零值。4)a,b值同前,!a||b的值为1。5)4&&0||2的值为1。整型数据参与逻辑运算时,根据整型数据的值是0或非0,把它作为逻辑量假或真,然后参加逻辑运算。58例子:判断一个年份是否是闰年。闰年的条件是符合下面两者之一:①能被4整除,但不能被100整除。②能被1

00整除,又能被400整除。例如2004、2000年是闰年,2005、2100年不是闰年。❖假设用变量year表示年份❖能被4整除:year%4==0❖不能被100整除:year%4!=0(注意优先级)不能被4整除能否被100整除能否被400整除能被100整除,但不能被400整除能被

400整除能被4整除,但不能被100整除能否被4整除59可以用一个逻辑表达式来表示:(year%4==0&&year%100!=0)||year%400==0当给定year为某一整数值时,如果上述表达式值为真(1),则year为闰年;否则year为非闰年。

可以加一个“!”用来判别非闰年:!((year%4==0&&year%100!=0)||year%400==0)若表达式值为真(1),year为非闰年。也可以用下面的逻辑表达式判别非闰年(请对照前面的图来理解):(year%4!=0)||(year%100=

=0&&year%400!=0)603.7选择结构与if语句if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。613.7.1if结构的3种形式1.一个分支,格式如下:if(表达式)语句例如:if(x>y)cout<<x<

<endl;x++;//不属于if结构2.两个分支,格式如下:if(表达式)语句1else语句2例如:if(x>y)cout<<x<<endl;elsecout<<y<<endl;x++;//不属于if结

构练习1:在例3.5的基础上,判断b2-4ac是大于等于0,还是小于0,分别求出2个实根、输出“无实数解”信息。开始输入a,b,c计算x1,x2输出x1,x2结束开始输入a,b,c计算x1,x2输出x1,x2结束b2-4ac≥0?输出“无实数解”YN63//例3.5#

include<iostream>#include<cmath>usingnamespacestd;intmain(){floata,b,c,x1,x2;cin>>a>>b>>c;x1=(-b+sqrt(b*b-4*a*c))/(2*a);x2=(

-b-sqrt(b*b-4*a*c))/(2*a);cout<<"x1="<<x1<<endl;cout<<"x2="<<x2<<endl;return0;}?//练习1#include<iostream>

#include<cmath>usingnamespacestd;intmain(){floata,b,c,x1,x2;cin>>a>>b>>c;floatdelta=b*b-4*a*c;?????return0;}64//练习1#include<iostream>#inclu

de<cmath>usingnamespacestd;intmain(){floata,b,c,x1,x2;cin>>a>>b>>c;floatdelta=b*b-4*a*c;if(delta>=0.0){x1=(-b+sqrt(delta))/(2*a);x2=(-b

-sqrt(delta))/(2*a);cout<<"x1="<<x1<<endl;cout<<"x2="<<x2<<endl;}elsecout<<"无实数解"<<endl;return0;}3.用if语句实现多分支if(表达式1)语句1elseif(表达式2)语句2el

seif(表达式3)语句3…elseif(表达式m)语句melse语句n流程图见图3.6。例如:if(number>500)cost=0.15;elseif(number>300)cost=0.10;elseif(number>100)

cost=0.075;elseif(number>50)cost=0.05;elsecost=0;66说明:1)3种形式的if语句都是由一个入口进来,经过对“表达式”的判断,分别执行相应的语句,最后归到一个共同的出口。这种

形式的程序结构称为选择结构。2)3种形式的if语句中在if后面都有一个用括号括起来的表达式,它是程序编写者要求程序判断的“条件”,一般是逻辑表达式或关系表达式(但实际上可以是任何合法的C++表达式,因

为表达式都是有一个确定的值,只要它的值非0,就认为是true,否则认为是false)。673)第2、第3种形式的if语句中,在每个else前面有一分号,整个语句结束处有一分号。但是它们都属于同一个if语句,是在if语句中嵌套了其他语句(其中else是if语句中的子句,不能作为独立的语

句单独使用,必须与if配对使用)。如:if(x>0)cout<<x<<endl;elsecout<<-x<<endl;if(x>0){cout<<x<<endl;}else{cout<<-x<<endl;}684)在if和else后面可以只含一个内嵌的操作语句(如

上例),也可以有多个操作语句,此时用花括号“{}”将几个语句括起来成为一个复合语句。如:if(a+b>c&&b+c>a&&c+a>b){//复合语句开始s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));cout<<area<<e

ndl;}//复合语句结束elsecout<<"itisnotatrilateral!"<<endl;//if语句结束//请问这个if语句实现什么功能???在复合语句中定义的变量,只在复合语句中有效。如例3.

669例3.6求三角形的面积#include<iostream>#include<cmath>//使用数学函数时要包含头文件cmath#include<iomanip>//使用I/O流控制符要包含头文件iomanipusing

namespacestd;intmain(){doublea,b,c;cout<<"pleaseentera,b,c:";cin>>a>>b>>c;if(a+b>c&&b+c>a&&c+a>b){//复合语句开始doubles,area;//在复合语句内定义变量s=(a+b+

c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));//指定输出的数包含4位小数cout<<setiosflags(ios::fixed)<<setprecision(4);cou

t<<"area="<<area<<endl;}//复合语句结束elsecout<<"itisnotatrilateral!"<<endl;return0;}70说明:变量s和area只在复合语句内用得到,因此在复合语句内定义,它的作用范围为从定义变量开始到复合语句结束。如果在

复合语句外使用s和area,则会在编译时出错,系统认为这两个变量未经定义。将某些变量局限在某一范围内,与外界隔离,可以避免在其他地方被误调用。运行情况如下:pleaseentera,b,c:2.453.674.89↙area

=4.3565713.7.2if结构的嵌套在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下:if()if()语句1else语句2elseif()语句3else语句4注意:else总是与它上面最近的、且未配对的if配对。7

2//例子if(表达式1)if(表达式2)语句1elseif(表达式3)语句2else语句3问题一:这段程序中的IF结构是怎样配对的?Answer:程序设计者把第一个else写在与第一个if(外层if)同一列上,希望else与第一个if对应,但实际上else是与第二个if配对,因为它们相距最

近,而且第二个if并未与任何else配对。if(表达式1){if(表达式2)语句1elseif(表达式3)语句2else语句3}73避免IF结构嵌套误用的方法:1.使用VC环境下的快速格式化快捷键(Alt+F8),使得选中文本快速格式化(使得

选中文本按照C++语法理解的规范格式),这样IF结构的嵌套就一目了然了(在VC中演示)。2.使用花括号来明确程序设计者的意图。if(){if()语句1}else{if()语句2else语句3}74intyear;cin>>ye

ar;if(year%4==0){if(year%100==0){if(year%400==0)cout<<year<<"isaleapyear!"<<endl;elsecout<<year<<"isnotaleapyear!"<<endl;}

elsecout<<year<<"isaleapyear!"<<endl;}elsecout<<year<<"isnotaleapyear!"<<endl;§if语句嵌套的例子:判断闰年不能被4整除能否被100整除能

否被400整除能被100整除,但不能被400整除能被400整除能被4整除,但不能被100整除能否被4整除75§流程图:year%4==0?NY输入yearyear不是闰年year%100==0?YNyear%400==0?Yy

ear是闰年year是闰年year不是闰年N76year%4==0?YN输入yearyear不是闰年year%100==0?year%400==0?year是闰年year是闰年year不是闰年NNYY§或:773.8条件运算符与条

件表达式若在if语句中,当被判别的表达式的值为“真”或“假”时,都执行一个赋值语句且给同一个变量赋值时,可以用简单的条件运算符来处理。if(a>b)max=a;elsemax=b;max=(a>b)?a:b;条件表达式。含义

:如果(a>b)为真,则条件表达式的值为a,否则条件表达式的值为b。78条件运算符(?:):要求有3个操作数,称为三目运算符,是C++中唯一的一个三目运算符。条件的一般形式为表达式1?表达式2∶表达式3条

件运算符的执行顺序是:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。例如:max=(a>b)?

a:b;的执行结果是将条件表达式的值赋给max。也就是将a和b二者中的大者赋给max。条件运算符优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给max。79例3.7输入一个字符,判别它是否为大写字母,如果是,将它转换成小写字母;如果不是,不转换。

然后输出最后得到的字符。#include<iostream>usingnamespacestd;intmain(){charch;cin>>ch;//判别ch是否大写字母,是则转换ch=(ch>='A'&&ch<='Z')?(c

h+32):ch;cout<<ch<<endl;return0;}条件表达式在这个例子中要注意:1.表达字符型数据介于2个字母之间的表示方法;2.大小写字母在ASCII码表里的关系。问题二:这个条件表达式语句如果要用if语句来表达,该怎么写?803.9多分支

选择结构与switch语句if语句的第三种形式可以实现多分支,但要进行多次条件判断。switch语句是多分支选择语句,用来实现多分支选择结构。多分支选择结构的例子:❖学生成绩分类(90分以上为‘A’等,80

~89分为‘B’等,70~79分为‘C’等,等等)❖折扣的例子:购物5000元以上8折,2000~4999为8.5折,1000~1999为9折,1000元以下为9.5折。81switch结构的一般形式如下:switch(表达式){case常量表达式1:语句1

case常量表达式2:语句2...case常量表达式n:语句ndefault:语句n+1}例子:按照考试成绩的等级打印出百分制分数段switch(grade){case'A':cout<<"85~100\n";case'

B':cout<<"70~84\n";case'C':cout<<"60~69\n";case'D':cout<<"<60\n";default:cout<<"error\n";}grade是char型变量82说明1)switch后面括号内的“表达式”,允许为任何类

型,但它的值必须是整型,不能是浮点型。2)当switch表达式的值与某一个case子句中的常量表达式的值相匹配时,就执行此case子句中的内嵌语句,若所有的case子句中的常量表达式的值都不能与switch表达式的值匹配,就执行default子句的内嵌语句。3)每一个case表达式

的值必须互不相同,否则就会出现互相矛盾的现象(对表达式的同一个值,有两种或多种执行方案)。4)各个case和default的出现次序不影响执行结果。5)执行完一个case子句后,流程控制转移到下一个case子句继续执行。“case常量表达式”只是起语句标号作用

,并不是在该处进行条件判断。在执行switch语句时,根据switch表达式的值找到与之匹配的case子句,就从此case子句开始执行下去,不再进行判断。83例子:按照考试成绩的等级打印出百分制分数段switch(grade){case'A':cout<<"

85~100\n";case'B':cout<<"70~84\n";case'C':cout<<"60~69\n";case'D':cout<<"<60\n";default:cout<<"error\

n";}若grade的值等于'A',则将连续输出:85~10070~8460~69<60error显然,这并不是程序员的意图。因此,应该在执行一个case子句后,使流程跳出switch结构,即终止switch语句的

执行。可以用一个break语句来达到此目的。将上面的switch结构改写如下:84switch(grade){case'A':cout<<"85~100\n";break;case'B':cout<<"70~84\n";break;case'C':cout<<"60~69\n";break;ca

se'D':cout<<"<60\n";break;default:cout<<"error\n";break;}加了break语句后switch结构的流程图:856)在case子句中虽然包含一个以上执行语句,但可以不必用花括号括起来

,会自动顺序执行本case子句中所有的执行语句。7)多个case可以共用一组执行语句,如...case'A':case'B':case'C':cout<<">60\n";break;...当grade的值为'A'、'B'或'C'时都执行同一组语句。863.10编写选择结构的程序例3.8

编写程序,判断某一年是否为闰年。思路分析如下:❖年份从键盘输入,保存到变量year中,要用到cin语句。❖用布尔变量leap表示被测试的年份是否是闰年的信息。利用P63所学的方法判断年份是否是闰年,若是闰年,则令leap=tu

re(而不是马上输出“是闰年”的信息);若非闰年,则令leap=false。❖最后判断leap是否为真,若是,则输出“闰年”信息。不能被4整除能否被100整除能否被400整除能被100整除,但不能被400整除能被400整除能被4整除,但不能被10

0整除能否被4整除#include<iostream>usingnamespacestd;intmain(){intyear;boolleap;cout<<"pleaseenteryear:";//输出提示cin>>year;//输入年份if(year%4==0)

//年份能被4整除{if(year%100==0)//又能被100整除{if(year%400==0)leap=true;//又能被400整除,是闰年elseleap=false;//非闰年}elseleap=true;//年份能被4整除但不能被100整除肯定是闰年}elseleap=fal

se;//年份不能被4整除肯定不是闰年if(leap)cout<<year<<"is";//若leap为真,就输出年份和“是”elsecout<<year<<"isnot";//leap为假,输出年份和“不是”cout<<"ale

apyear."<<endl;//闰年return0;}练习:将该if结构改成其他等效的if结构88例3.9运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下:s<250km没有折扣250≤s<5002%折扣500≤s<10005%折扣1000≤s<20008

%折扣2000≤s<300010%折扣3000≤s15%折扣89分析:设每公里每吨货物的运费为p(price的缩写),货物重为w(weight的缩写),距离为s,折扣为d(discount的缩写),则总运费f(freight的缩写)的计算公式为f=w*s*p*(1-d)折扣的规律

如下图所示:折扣的“变化点”都是250的倍数(250,500,1000,2000,3000)。利用这一特点,可以在横轴上加一种坐标c,c的值是s/250。c代表250的倍数。当c<1时,表示s<250,无折

扣;1<=c<2时,折扣d=2%,等等。90#include<iostream>usingnamespacestd;intmain(){intc,s;//s:路程floatp,w,d,f;//p:每公里每吨货物的运费,w:货物重量,d:折

扣,f:总运费cout<<"pleaseenterp,w,s:";cin>>p>>w>>s;if(s>=3000)c=12;elsec=s/250;switch(c){case0:d=0;break;case1:d=2;

break;case2:case3:d=5;break;case4:使用switch语句关键在于如何构造括号内的表达式91case5:case6:case7:d=8;break;case8:case9:case10:case11:d=10;br

eak;case12:d=15;break;}f=p*w*s*(1-d/100.0);cout<<"freight="<<f<<endl;return0;}运行情况如下:pleaseenterp,w,s:100203

00↙freight=58800092如何构造switch语句中的表达式1.首先注意switch语句的格式。switch括号后面的表达式的值必须是整数,case后面的常量表达式的值也必须是整数。假设输入的百分制成绩保存在变量score里。请问:能不能直接把score放到switch后面的括号里?

例子:输入百分制的成绩(范围在0~100之间,允许有1位小数,如72.5分),要求输出对应的五分制成绩,90.0~100分为A,80.0~89.9为B,70.0~79.9为C,60.0~69.9为D,60分以下为E。switch结构的一般形式如下:s

witch(表达式){case常量表达式1:语句1case常量表达式2:语句2...case常量表达式n:语句ndefault:语句n+1}932.其次,要尽量减少switch语句中的case分支。1)即使把score取整,符合switch语句的要求,如果

直接对得到的整数进行判断:100分为A,99分为A,…,1分为E,0分为E。结果有101个case分支,这显然是不现实的。请问:该如何处理?2)请问:是否还能减少case分支,而不影响程序功能?switch((int)score){case100:cout<<‘A’;break;case99

:cout<<‘A’;break;...case1:cout<<‘E’;break;case0:cout<<‘E’;break;}练习题:请完成该程序。943.11循环结构与循环语句循环结构的引入当需要反复执行某一操作的情况,就需要用到循环控制。比如:❖判断一个

自然数N是不是素数,要依次判断从2到sqrt(N)中的每一个数能否整除N(只要找到一个能整除N的数,就不需要再判断下去了)。❖要判断100~200之间素数的个数,就需要对100~200之间的每个数做判断。❖比如求1+2+3+…+100,需要反复累加1~100之间的每个数。C++提供了3种循环:❖

while循环❖do-while循环❖for循环953.11.1While循环while语句的一般形式如下:while(表达式)语句其作用是:当指定的条件为真(表达式为非0)时,执行while语句中的内嵌语

句。其流程图见图3.9。其特点是:先判断表达式,当表达式的值为true时执行语句,执行完再判断,如此…,直到表达式所表示的条件不成立为止。while循环称为当型循环(当条件成立的时候执行循环)。注意:表达式可以是逻辑型常量、变量,关系表达式,逻

辑表达式,实际上这个表达式可以是任何合法的C++表达式,只要表达式的值是非0的,就认为是真,表达式的值为0,则认为是假。96例3.10求1+2+3+…+100。#include<iostream>usingnamespacestd;intm

ain(){inti=1,sum=0;while(i<=100){sum=sum+i;i++;}cout<<"sum="<<sum<<endl;return0;}运行情况如下:sum=5050这个i通常称

为循环变量通常在while条件里判断循环变量是否超过终值。在循环体内修改循环变量。97#include<iostream>usingnamespacestd;intmain(){inti=1,sum=0;while(i<=100)//{

sum=sum+i;//循环体语句i++;//循环体外的语句//}cout<<"sum="<<sum<<endl;return0;}注意:❖循环体如果包含一个以上的语句,应该用花括号括起来,以复合语句形式出现。如果不加花括号,则while语句的范

围只到while后面第一个分号处。❖在循环体中应有使循环趋向于结束的语句。否则就会陷入死循环:循环永不停止地执行。比如:#include<iostream>usingnamespacestd;intmain(){inti=1,sum=0;

while(i<=100){sum=sum+i;}cout<<"sum="<<sum<<endl;return0;}这个条件永远满足,循环体永不停息地执行,进入死循环。98练习2:求A!,用while循环实现(A由键盘输入)。A!=1×2×…×(A-2)×(A-1)×A分析:循环变

量i从1递增到A,用变量F来保存阶乘,只要在每次循环的时候乘以循环变量i,那么循环完毕,F的结果就是1×2×…×(A-2)×(A-1)×A=A!F=F*i;i=i+1;i<=A?NYi=1F=1从键盘输入A99//练习2#include<iostream>us

ingnamespacestd;intmain(){intA;inti=1,F=1;cin>>A;while(i<=A){F=F*i;i++;}cout<<"A!="<<F<<endl;return0;}运行情况如下:5↙(用

户输入)A!=120问题三:在循环体内把循环变量累乘起来,得到A的阶乘。如果在循环体内把循环变量i的终值(也就是A)累乘起来,结果是什么?while(i<=A){F=F*A;i++;}Answer:得到

的结果是AA,如果输入5,得到的结果是3125=55。(是乘以循环变量还是终值,这一点在多重循环里很容易弄混淆)100do-while循环的引入假定开学初家里往你的帐号上存一定金额,每月花费800,每月只在月初取出钱,假定不可以透支。问可以取多少

次?取钱的两种习惯:❖先查看余额,如果余额大于800,则当前可以取钱,重复执行直到余额小于800为止。(while循环)❖先取出800,然后查看余额,如果余额大于800,则重复执行直到余额小于800为止。(do-while循环)1013.11.2do-while循环do-whi

le语句的特点是先执行循环体,然后判断循环条件是否成立。其一般形式为:do语句while(表达式);//注意这里要加分号它是这样执行的:先执行一次指定的语句(即循环体),然后判别表达式,当表达式的值为非零(“真”)时,返回重新执行循环体语句,

如此反复,直到表达式的值等于0为止,此时循环结束。102例3.11用do-while语句求1+2+3+…+100。#include<iostream>usingnamespacestd;intmain(){inti=1,sum=0;do{sum=sum+i;i++;}while(i<=100);

//注意要加分号cout<<"sum="<<sum<<endl;return0;}运行情况如下:sum=5050103练习3:用do-while循环求A!要求画出流程图并写出程序。F=F*i;i=i+1

;i<=A?NYi=1F=1从键盘输入A104//练习3#include<iostream>usingnamespacestd;intmain(){intA;inti=1,F=1;cin>>A;do{F=F*i;i++;}while(i<=A);//注意要

加分号cout<<"A!="<<F<<endl;return0;}运行情况如下:5↙(用户输入)A!=120105while循环与do-while循环对同一个问题可以用while语句处理,也可以用do-while语句处理。do-while语句结构可以转换成

while结构。图3.11可以改画成图3.13的形式,二者完全等价。而图3.13中虚线框部分就是一个while结构。while循环:如果循环条件不成立,循环体不执行。do-while循环:即使循环条件不成立,也

执行一次循环体。1061073.11.3for循环C++中的for语句使用最为广泛和灵活。不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况。它完全可以代替while语句。108for语句的一般格式为:for(表达式1;表达式2;表达式3)语句它的

执行过程如下:1)先求解表达式1。2)求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。3)求解表达式3。4)转回上面第(2)步

骤继续执行。5)循环结束,执行for语句下面的一个语句。可以用图3.14来表示for语句的执行过程。109for语句最简单的形式也是最容易理解的格式如下:for(循环变量赋初值;循环条件;循环变量增值)语句for(i=1,sum=0;i<=100;i++)su

m=sum+i;i=1,sum=0;while(i<=100){sum=sum+i;i++;}for语句的使用有许多技巧,如果熟练地掌握和运用for语句,可以使程序精炼简洁。110练习4:用for循环求A!(将练习2的程序修改)//练习2#include<iostream>usingnamesp

acestd;intmain(){intA;cin>>A;inti=1,F=1;//初始化while(i<=A)//循环条件{F=F*i;//循环体i++;//循环变量递增}cout<<"A!="<<F<<endl;return0;}f

or(i=1,F=1;i<=A;i++)F=F*i;问题四:请问这是什么表达式?111说明1)for语句的一般格式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。并且其后的分号不能省。i=1,sum=0;for(;i<=100

;i++)sum=sum+i;2)如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。for(i=1,sum=0;;i++)sum=sum+i;i=1,sum=0;while(1)//永真循环{sum=sum+

i;i++;}1123)表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。比如可以将表达式3放到循环体内。for(i=1,sum=0;i<=100;){sum=sum+i;i++;}4)可

以省略表达式1和表达式3,只有表达式2,即只给循环条件。当然应该在for循环前给循环变量设置初值,在循环体内改变循环变量。i=1;sum=0;for(;i<=100;){sum=sum+i;i++;}i=1;sum=0;while(i<=100){sum=sum+i;i++;}可见for语句比w

hile语句功能强,除了可以给出循环条件外,还可以赋初值、使循环变量自动增值等。1135)3个表达式都可省略。如for(;;)语句;相当于while(1)语句;即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止地执行循

环体。6)表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。如for(sum=0;i<=100;i++)sum=sum+i;同样,表达式3也可以使与循环控制无关的任意表达式。7)表达式2一般是关系表达式(如i<=100)或逻辑表达式(如a<b

&&x<y),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。如下面的例子。114for(i=0;(c=getchar())!='\n';i+=c);功能描述:在表达式2中先从终端(键盘)接收一个字符赋给c

,然后判断此赋值表达式的值是否不等于‘\n’(换行符),如果不等于‘\n’,则执行循环体(在这个例子中,循环体为空)。执行完循环体后再求解表达式3,把c的ASCII值累加起来。for(;(c=getchar())!='\n'

;)cout<<c;思考:试分析这个循环语句是怎么执行的。练习:编程实现,从键盘上输入任意多个字符,按回车键表示结束,对输入的字符,过滤掉非数字字符(即不输出),只输出数字字符。115总结:C++中的for语句比其他语言中的循环语句功能强得多。

可以把循环体和一些与循环控制无关的操作也作为表达式1或表达式3出现,这样程序可以短小简洁。但过分地利用这一特点会使for语句显得杂乱,可读性降低,建议不要把与循环控制无关的内容放到for语句中。1163.11.4几种循环的比较3种循环都可以用来处理同一问题,一般情况下它们可以互

相代替。while和do-while循环,是在while后面指定循环条件的,在循环体中应包含使循环趋于结束的语句(如i++,或i=i+1等)。for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用wh

ile循环能完成的,用for循环都能实现。用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。1173.12循

环的嵌套一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。甚至内嵌的循环中还可以再嵌套循环,这就是多层循环(多重循环)。(1)while(){┆while(){…}}(2)do{┆do{…}while();}while();118(3)for(;;){┆for(;;){…

}}(4)while(){┆do{…}while();}(5)for(;;){┆while(){…}}(6)do{┆for(;;){…}}while();119练习5:要求在屏幕上输出如下图形:********************分析:图形有4行、每行有2、4、6、8列用循环变量来控制

:第i行有2×i个*号行i:1→4,列:j:1→2*i120//练习5,用for循环实现#include<iostream>usingnamespacestd;intmain(){inti,j;for(i=1;i<=4;i++){for(j=1;j<=2*i;j++

)cout<<"*";cout<<endl;}return0;}练习:1.画出上述程序的流程图2.用while循环实现上述程序问题五:cout<<endl;这条语句是包含在哪重循环当中?输出第i行的字符121练习6:P86,第18题求:1!+2!+3!+4!

+…+20!❖注意:20!阶乘太大了,超出了int类型数据的范围。因此要用float型。❖问题六:int和float都是4个字节,为什么float类型数据表示的范围大得多?//求阶乘的代码,循环完毕F=A!for(i=1,F=1;i<=A;i++)

F=F*i;分析:求阶乘的代码已知,是一个for循环,现在要求1!+2!+3!+4!+…+20!,只要在求阶乘循环的外面再套一层循环即可。122//练习6,用for循环实现#include<iostream>usingnamespace

std;intmain(){floatS=0;inti,j;for(i=1;i<=20;i++){floatF=1;for(j=1;j<=i;j++)F=F*j;S=S+F;}cout<<S<<endl;return0;}练习:1.画出上述程序的流程图2.用while循环实现

上述程序注意:这道题可以用一重循环实现,见下一页问题八:1.内循环实现的是F=i!还是F=j!?2.如果这条语句改成:F=F*i;请问内循环实现的是什么运算?F=?问题七:变量F的定义及初始化能不能放在外层循环?123//用一重循环实现,这种方法更简洁#include<iostre

am>usingnamespacestd;intmain(){floatS=0,F=1;inti;for(i=1;i<=20;i++){F=F*i;//求i!,利用i!=(i-1)!*iS=S+F;}cout<<S<<endl;return0;}练习:1.分析这个循环的执行过程12

43.13break语句与continue语句break语句❖break语句用于switch结构:可以使流程跳出switch结构,继续执行switch语句下面的一个语句。❖break语句用于循环体内,其作用为使流程从循环体内跳出循环体,即提前结束循环,接着执行循

环体下面的语句。❖break语句只能用于循环语句和switch语句内,不能单独使用或用于其他语句中。continue语句❖continue用于循环体内,其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接

着进行下一次是否执行循环的判定。125break和continue语句用于循环的区别❖continue语句只结束本次循环,而不是终止整个循环的执行。❖而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。126while(表达式

1){┆if(表达式2)break;┆}while(表达式1){┆if(表达式2)continue;┆}127分析:用级数表示π/4,如下公式,只要用while循环把级数中的每一项加起来,直到该项的绝对值小于10-7为止。要用变量(比如t)来存

储这一项的值,while的条件就是判断t<10-7。3.14编写循环结构的程序例3.12用下面公式求π的近似值。π/4≈1-1/3+1/5-1/7+…直到最后一项的绝对值小于10-7为止。=−−−=111*2

1)1(4nnn1*21)1(1−−−nn1*21−n1*21−n128#include<iostream>#include<iomanip>#include<cmath>usingnamespacestd;intmain(){ints=1;doub

len=1,t=1,pi=0;while((fabs(t))>1e-7){pi=pi+t;n=n+2;s=-s;t=s/n;}pi=pi*4;cout<<"pi="<<setiosflags(ios∷fixed)<<setprecision(6)

<<pi<<endl;return0;}注意:不要把n定义为整型变量,否则在执行“t=s/n;”时,得到t的值为0(原因是两个整数相除)。运行情况如下:pi=3.141592129P86习题22❖猴子吃桃问题⚫问题描述:猴子第1天摘下若干个桃子,当即

吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半另加一个。到第10天早上想再吃时,就只剩下一个桃子了。求第1天共摘了多少个桃子。分析:假设Ai为第i天吃完后剩下的桃子的个数,则有:A0=2(A1+1)A1:第1天后剩下的桃

子数A1=2(A2+1)A2:第1天后剩下的桃子数……A8=2(A9+1)A9:第1天后剩下的桃子数A9=1A0表示第一天共摘下的桃子。要求A0。问题九:需要定义对应从A0到A9的十个变量吗?Answer:不需要,只需要定义x1,x2表示前后两天,然后用循环来实现,实现从第9天递推

到第1天。130#include<iostream>usingnamespacestd;intmain(){intday,x1,x2;day=9;x2=1;while(day>0){x1=(x2+1)*2;//第1天的桃子数是第2天桃子数加1后的2倍x2=x1;d

ay--;}cout<<"total="<<x1<<endl;return0;}运行结果如下:total=1534131例3.13求Fibonacci数列前40个数。这个数列有如下特点:第1、2个数为

1、1。从第3个数开始,每个数是其前面两个数之和。即F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn-2(n≥3)这是一个有趣的古典数学问题:有一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假设

所有兔子都不死,问每个月的兔子总数为多少?可以从书中表3.4看出兔子数的规律。分析:循环次数是已知的(40个数),用for循环来实现。132§方法一:每次递推1个数#include<iostream>#include

<iomanip>usingnamespacestd;intmain(){//f1,f2分别代表Fibonacci数列中前后两个数longf1,f2;longt;//临时变量inti;//循环变量f1=f2=1;cout<<setw(1

2)<<f1<<endl;cout<<setw(12)<<f2<<endl;for(i=3;i<=40;i++){t=f2;//先把f2保存起来f2=f1+f2;//f2是新的一项f1=t;//此时的f1是上一次的f

2cout<<setw(12)<<f2<<endl;}return0;}112358132134…f1f2f1f2f1f2133#include<iostream>#include<iomanip>usingnamespacestd;in

tmain(){longf1,f2;inti;f1=f2=1;for(i=1;i<=20;i++){//设备输出字段宽度为12,每次输出两个数cout<<setw(12)<<f1<<setw(12)<<f2;//每输出完4个数后换行,使每行输出4个数if(i%2==0)cout<<endl;

f1=f1+f2;//左边的f1代表第3个数,是第1、2个数之和f2=f2+f1;//左边的f2代表第4个数,是第2、3个数之和}return0;}§方法二:每次递推2个数(书上的代码)112358132134…f1f2f1f

2f1f2134运行结果为:112358132134558914423337761098715972584418167651094617711286574636875025121393196418317811514229832040134

62692178309352457857022997922746514930352241578173908816963245986102334155问题十:如果要左对齐该怎么办?135练习7:求2→200之间的完数。循环嵌套的例子完数的定义:若该数

除本身之外的所有因子之和等于该数,则为完数。如:1+2+3=6,6为完数;1+2+4≠8,8不是完数。分析一:判断m=200是否为完数1.根据完数的定义,要找出200的所有因子(本身除外),因此对从1到m-1的每个自然数i,都要判断i是否能

整除m,如果能整除m,则i是m的因子,把它累加起来。2.最后把累加到的m的因子之和跟m比较,如果相等,则m是完数,输出m,否则不输出。136§判断m=200是否为完数的流程图m是完数,输出m结束m=200i=1,S

=0i=i+1i<m?YNS==m?Ym能被i整除?YN把i累加到s开始N137分析二:求2→200之间的完数1.对2~200之间的每个数m,要求出m的所有因子(本身除外),然后累加这些因子,然后判断因子和是否等于m本身,如果相等,

则m是一个完数。需使用双重循环2.内层循环:累加m因子,循环变量i从1递增到m-1,对每个i,判断i是否能整除m,如果能整除,i就是m的一个因子,把i累加起来。3.外层循环:判断2~200之间的每个数m。138双重循环§求2→200之间的完数的流程图i=1S=0m<=200?NYi=i

+1m=2i<m?NYS==m?Y输出mm能被i整除?YNm=m+1结束S=S+iN139#include<iostream>usingnamespacestd;intmain(){intm,i;//判别m是否为完数,m由2变化到

200,增量为1for(m=2;m<=200;m=m+1){intS=0;//累加m的因子for(i=1;i<m;i++){if(m%i==0)//把m的因子累加起来S=S+i;}if(S==m)cout<<m<<endl;//输

出完数m}return0;}运行情况如下:628140例3.14找出100~200间的全部素数。循环嵌套的例子判断m是否为素数的算法:让m被2~sqrt(m)除,如果m不能被2~sqrt(m)之中的任何一个正数整除,就可以确定m是素数。(为什么只要判断

到sqrt(m)即可?)课堂练习:要求写出该算法的流程图为了记录m是否为素数,可以用一个布尔变量prime来表示。在循环开始时先设prime为真,变量i从2递增到sqrt(m),判断m是否能被i整除,如果能整除,

就表示m不是素数(还需要继续判断吗?),此时设置prime为假。最后根据prime是否为真,决定是否输出m。141结束m=200prime=truek=sqrt(m),i=2i=i+1i<=k?YNPrime为true?Y输出mm能被i整除?YNprime为

false开始结束m=200k=sqrt(m),i=2i=i+1i<=k?YNi>k?Y输出mm能被i整除?YN开始判断m=200是否为素数的两种方法:1.使用状态变量2.不使用状态变量142#include<iostream>usingnam

espacestd;intmain(){intm;cin>>m;inti,k;boolprime=true;k=(int)sqrt(m);for(i=2;i<=k;i++){if(m%i==0){prime=false;br

eak;}}if(prime)cout<<m<<endl;return0;}结束m=200prime=truek=sqrt(m),i=2i=i+1i<=k?YNPrime为true?Y输出mm能被i整除?YNPrime为false开始

§使用状态变量判断m是否为素数143结束m=200k=sqrt(m),i=2i=i+1i<=k?YNi>k?Y输出mm能被i整除?YN开始#include<iostream>usingnamespacestd;intmain(){intm;cin>>m;inti,k;k=(int)s

qrt(m);for(i=2;i<=k;i++){if(m%i==0)break;}if(i>k)cout<<m<<endl;return0;}§不使用状态变量判断m是否为素数144prime=truek=sqrt(m),

i=2m<=200?NYi=i+1m=101i<=k?YNPrime为true?Y输出mm能被i整除?YNm=m+2结束prime=false双重循环找出100~200间的全部素数的流程图145#include<iostream>#i

nclude<cmath>#include<iomanip>usingnamespacestd;intmain(){intm,k,i,n=0;boolprime;//定义布尔变量prime//判别m是否为素数,m由101变化到200,增量为2for(m=

101;m<=200;m=m+2){//循环开始时设prime为真,即先认为m为素数prime=true;k=int(sqrt(m));//用k代表根号m的整数部分146//此循环作用是将m被2~根号m除,检查是否能整除for(i=2;i<=k;i++){if(m%i

==0)//如果能整除,表示m不是素数{prime=false;//使prime变为假break;//终止执行本循环}}if(prime)//如果m为素数{cout<<setw(5)<<m;//输出素数m,字段宽度为5n=n+1;//n用来累计输出素数的个数

}if(n%10==0)cout<<endl;//输出10个数后换行}cout<<endl;return0;}运行情况如下:101103107109113127131137139149151157163167

173179181191193197199147例3.15译密码。为使电文保密,往往按一定规律将电文转换成密码,收报人再按约定的规律将其译回原文。例如,可以按以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。见图3.20。字母

按上述规律转换,非字母字符不变。如″Wonderful!″转换为″Asrhivjyp!″。输入一行字符,要求输出其相应的密码。分析:译码过程,原来的字符的ASCII码要加4,但对w、x、y、z(包括大小写)这4个字母要作专门的处理,使的他们变为大小写的a、b、c、d。148#includ

e<iostream>usingnamespacestd;intmain(){charc;while((c=getchar())!='\n'){if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){c=c+4;if(c>'Z'&&c<='Z'+4||c>'z')c=c-

26;}cout<<c;}cout<<endl;return0;}运行情况如下:IamgoingtoBeijing!↙MeqksmrkxsFimnmrk!149while语句中括号内的表达式有3个作用:①从键盘读入一个字符,这是用getchar函数实现的;②将读入的字符赋给字符变

量c;③判别这个字符是否为'\n'(即换行符)。如果是换行符就执行while语句中的复合语句(即花括号内的语句),对输入的非换行符的字符进行转换处理。c>'Z'&&c<='Z'+4||c>'z'(c>'Z'&&c<='Z'+4)||c>'z'大写字母超出了'Z'的范围小写字母超出了'z'的范

围问题十一:c<='Z'+4这个条件能不能去掉?

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?