《[工学]第3章_程序设计初步.ppt》由会员分享,可在线阅读,更多相关《[工学]第3章_程序设计初步.ppt(149页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1工学第3章_程序设计初步 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望23.1 面向过程的程序设计和算法 面向过程的程序设计方法不仅要求程序设计者考虑要“做什么”,还要解决“怎么做”的问题。3.1.1 算法的概念一个面向过程的程序应包括以下两方面内容:1)对数据的描述,即数据结构。在C+语言中,最基本的数据结构就是C+提供的基本数据类型。2)对数据处理的描述,即计算机算法。算法是为解决一个问题而采取的方法和步骤,是程序的灵魂。程序=算法+数据结构3算法什么是算
2、法?算法就是为解决某个问题而采取的一系列步骤。算法要解决什么问题?算法必须具体地指出在执行时每一步应当怎样做,例如程序中应该出现什么语句?语句的顺序如何安排?程序中的操作语句,就是算法的具体体现。广义地说,为解决一个问题而采取的方法和步骤,就称为“算法”。如太极拳的算法、一首歌曲的乐谱。计算机算法可分为两大类别:v数值算法:用于求数值解。如求方程的根。v非数值算法:用于事务管理领域。如排序。4把大象放冰箱里的算法,分几步?53.1.2 算法的表示1.自然语言v例如,用自然语言表示“把大象放冰箱”的算法2.伪代码v用介于自然语言和计算机语言之间的文字和符号来描述算法。详见P46的例子。v特点l没
3、有固定、严格的语法规则l不用图形符号,因此书写方便、容易修改l便于向计算机语言算法过渡。v广泛应用于国外的计算机教材和专业编程人员的实际编程中。3.用计算机语言表示算法:即程序。64.流程图:用图的形式表示算法,比较直观,但修改算法时很不方便。流程图包括传统流程图传统流程图和结构化流程图(N-S流程图)。v传统流程图使用的符号:7v传统流程图的例子:理解它的含义开始从键盘输入数据a输出a结束a0?输出-aYN8v结构化流程图(N-S流程图):l传统流程图由一些特定意义的图形、流程线及简要的文字说明构成,它能清晰明确地表示程序的运行过程。l在使用过程中,人们发现流程线不一定是必需的,随着结构化程
4、序设计方法的出现,1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形式,这种流程图完全去掉了流程线,算法的每一步都用一个矩形框来描述,把一个个矩形框按执行的次序连接起来就是一个完整的算法描述。这种流程图同两位学者名字的第一个字母来命名,称为N-S流程图。l只要求掌握一种流程图,传统流程图更好理解。93.2 C+程序和语句一个程序包含一个或多个程序单位(每个程序单位构成一个程序文件,如图3.1所示)。每一个程序单位由以下几个部分组成:1)预处理命令。如#include命令和#define命令。2)声明部分。例如对数据类型和函数的声明,以及对变量的定义。3)函数。包
5、括函数首部和函数体,在函数体中可以包含若干声明语句和执行语句。v注意:每个程序(project)必须有一个(而且只能有一个)main函数,可以包含其他函数。10C+程序结构11#include/预处理命令using namespace std;/在函数之外的声明部分int a=3;/在函数之外的声明部分int main()/函数首部float b;/函数内的声明部分b=4.5;/执行语句couta0)cout x;else cout-x;142)函数和流对象调用语句:l一次函数调用加上一个分号就构成了一个函数调用语句,如:sort(x,y,z);/假设已定义了sort函数,它有3个参数l输入输
6、出流的使用也构成一条语句,如:cout x endl;3)表达式语句l任何一个表达式的最后加一个分号都可以成为一个语句,如:i=i+1/赋值表达式i=i+1;/赋值语句l函数调用语句也可以认为是一个表达式语句153.空语句v只有一个分号的语句,它什么也不做。v有时用来做被转向点,或循环语句中的循环体。4.复合语句v用 把一些语句括起来成为复合语句v注意:在复合语句中定义的局部变量的作用范围仅限于该复合语句。#include/预处理命令using namespace std;/在函数之外的声明部分int main()/函数首部int a=5;cout 0)cout0 endl;含义:先进行赋值运
7、算(将b的值赋给a),然后判断a是否大于0,如大于0,执行cout 0 endl;173.4 C+的输入与输出C与C+的输入输出C和C+都没有专门的输入输出语句,分别是由函数和流对象来实现的。在C语言中,输入和输出是通过调用scanf和printf函数来实现的,C+中保留了这2个函数。在C+中,输入和输出是通过调用输入输出流库中的流对象cin和cout实现的。也就是说输入输出不是C+本身定义的,而是在编译系统提供的I/O库中定义的。因此在使用到cin和cout的程序文件里,必须包含iostream头文件。18输入输出流“流”是指来自设备或传给设备的一个数据流cout是输出流对象的名字,是流提取
8、运算符,作用是从默认的输入设备(一般为键盘)的输入流中提取若干字节送到计算机内存中指定的变量。19说明:有关流对象cin、cout和流运算符的定义等信息是存放在C+的输入输出流库中的,因此如果在程序中使用cin、cout和流运算符,就必须使用预处理命令把头文件iostream包含到本文件中:#include 为了叙述方便,常常把由cin和流提取运算符“”实现输入的语句称为输入语句或cin语句,把由cout和流插入运算符“变量1变量2变量n;cout表达式1表达式2表达式n;cout语句的一般格式为cin语句的一般格式为理解流对象理解流对象理解流对象理解流对象:在定义流对象时,系统会在内存中开辟
9、一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout语句中的endl(或n,ends,flush)为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。输出流中的数据在系统默认的设备(一般为显示器)输出。21一个不大贴切的比喻缓冲区、缓冲器在计算机软硬件里是一个很重要的概念。使用cout进行输出的一个比喻:做生意,攒钱,不可能赚了100,就去银行存一次;要么攒够了10000,去银行存一次(对应于缓冲区满的情况);要么攒了一个月,去银行存一次(对应于cout语句中的遇到endl等就将缓冲区中已有的数据一起输出)。输出完,
10、要清空缓冲区。(把攒的钱存入银行以后,又从0开始攒钱了)22cout This is/末尾无分号 a simple C+program.endl;/(2)最后有分号cout This is a simple C+program.endl;/(1)一个cout语句可以分写成若干行。如:可以写成(以下各行是同一个C+语句),注意与P26比较 coutcout This isa C+program.endl;功能上等效(不推荐使用)语法上等效(是同一个C+语句)cout This is a simple C+program.endl;/(3)23cout This is;/语句末尾有分号cout a
11、 simple C+;cout program.;coutendl;也可写成多个cout语句,以上3种情况的输出均为couta,b,c;/错误,不能一次插入多项couta+b+c;/正确,这是一个表达式,作为一项注意,不能用一个插入运算符“c1c2ab;在用cin输入时,系统也会根据变量的类型从输入流中提取相应长度的字节。如有:如果输入系统会提取第一个字符1给字符变量c1,取第二个字符2给字符变量c2,再取34给整数变量a,最后取56.78给实型变量b。cin1234 56.78253.4.2 在输入流与输出流中使用控制符在输入输出流中使用控制符,可以达到一些特殊的效果,如在输出实数时规定字段
12、宽度,只保留两位小数,数据向左或向右对齐等。C+提供了在输入输出流中使用的控制符(有的书中称为操纵符),见表3.1。如果使用了控制符,在程序单位的开头除了要加iostream头文件外,还要加iomanip头文件。26double a=123.456789012345;对a赋初值(1)couta;输出:123.457 (2)coutsetprecision(9)a;输出:123.456789 (3)coutsetprecision(6);恢复默认格式(精度为6)(4)cout setiosflags(ios:fixed)a;输出:123.456789(书上漏掉了)(5)coutsetiosfla
13、gs(ios:fixed)setprecision(8)a;输出:123.45678901(6)coutsetiosflags(ios:scientific)a;输出:1.234568e+02(7)coutsetiosflags(ios:scientific)setprecision(4)a;输出:1.2346e+02说明:说明:说明:说明:第(1)行按默认格式输出(以十进制小数形式输出,全部有效数字为6位)。第(2)行指定输出9位有效数字。第(3)行恢复默认格式,精度为6。第(4)行要求以固定小数位输出,默认输出6位小数。第(5)行指定输出8位小数。第(6)行指定按指数形式输出,默认给出6位
14、小数(第7位四舍五入)。第(7)行以指数形式输出,指定4位小数。注意:在保留精度时要进行四舍五入。双精度数输出的例子:27#include#include using namespace std;int main()double a=123.456789012345;/对a赋初值cout a endl;/输出:123.457(四舍五入)cout setprecision(9)a endl;/输出:123.456789cout setprecision(6);/恢复默认格式(精度为6)cout setiosflags(ios:fixed)a endl;/输出:123.456789cout set
15、precision(8)a endl;/输出:123.45678901cout resetiosflags(ios:fixed);/在按scientific输出之前如果使用了fixed,一定要先取消fixed,/否则无法按科学计数法形式输出。cout setiosflags(ios:scientific)a endl;/输出:1.234568e+02(四舍五入)cout setiosflags(ios:scientific)setprecision(4)a endl;/输出:1.2346e+02(四舍五入)return 0;28关于格式控制时有效数字的说明(在第13章还会详细讲述,初学者不必拘
16、泥细节,这些细节也没有什么意义,只是初学者在对输出的有效数字位数感到困惑时,可以查阅这些说明)除表3.1列出的控制符外,还有一个特殊的控制符(P425,表13.3):resetiosflags(),用于终止已设置的输出格式状态,在括号中应指定要取消的格式控制符,比如:cout resetiosflags(ios:scientific);可以取消科学计数法显示浮点数。在使用setiosflags(ios:scientific)按科学计数法输出浮点数之前如果使用了setiosflags(ios:fixed),一定要先用resetioflags(ios:fixed)取消fixed,否则无法按科学计数
17、法形式输出。对于6位有效数字,有小数点后6位有效数字与全部6位有效数字之分。那么到底在什么情况下是指小数点后的有效数字,在什么情况下是指全部有效数字呢?29全部有效数字的情形:1)默认情况下(是指在此之前没有设置过fixed和scientific),输出6位有效数字,是指按固定小数形式输出全部6位有效数字,包括小数部分和整数部分,进行四舍五入(如果整数部分超过6位,则默认以科学计数法输出,也是全部6位有效数字)。当然如果同时用setprecision(n)指定了有效数字的位数,则全部有效数字的位数为n。2)如果在输出前用resetiosflags()取消最近设置过的fixed或scientif
18、ic格式,这时有效数字是指全部有效数字。如果没有用setprecision(n)指定有效数字的位数,则默认为6位,反之是n位。3)使用scientific输出完后,没有用resetiosflags()取消scientific,紧接着按fixed输出,也是指全部有效数字。4)但是在使用fixed输出完后,没有用resetiosflags()取消fixed,紧接着按scientific输出,无法按科学计数法形式输出,这时仍然是按固定小数点形式输出,而且也是指全部有效数字。30小数点后有效数字的情形:1)第一次设置fixed格式,则按固定小数形式输出,这时有效数字是指小数点后的有效数字;如果没有用s
19、etprecision(n)指定有效数字的位数,则默认为6位,反之是n位。2)第一次设置scientific格式,则按科学计数法形式输出,这时有效数字是指小数点后的有效数字;如果没有用setprecision(n)指定有效数字的位数,则默认为6位,反之是n位。3)对比前面的第3)点,使用scientific输出完后,用resetiosflags()取消scientific,紧接着用fixed输出,这时有效数字是指小数点后的有效数字。4)对比前面的第4)点,使用fixed输出完后,用resetiosflags()取消fixed,紧接着用scientific输出,这时有效数字是指小数点后的有效数字
20、。31int b=123456;对b赋初值(1)coutb;输出:123456(2)couthexb;输出:1e240(3)coutsetiosflags(ios:uppercase)b;输出:1E240 (4)coutsetw(10)b,b;输出:123456,123456(5)coutsetfill(*)setw(10)b;输出:*123456(6)coutsetiosflags(ios:showpos)b;输出:+123456说明:说明:说明:说明:第(1)行按十进制整数形式输出。第(2)行按十六进制整数形式输出,其中字母e代表十进制中的14。第(3)行按十六进制形式输出,字母e改为大写
21、。第(4)行指定字段宽为10,在123456前留4个空格。紧接着再输出一次b,但由于setw只对其后第一个数据起作用,因此在输出第二个b时setw(10)不起作用,按默认方式输出,前面不留空格。第(5)行在输出时用*代替空格。第(6)行在正数前面加一个+号。整数输出的例子:32#include#include using namespace std;int main()int b=123456;/对b赋初值cout b endl;/输出:123456cout hex b endl;/输出:1e240 cout setiosflags(ios:uppercase)b endl;/输出:1E240
22、 cout dec;/还原成10进制输出cout setw(10)b,b endl;/输出:123456,123456cout setfill(*)setw(10)b endl;/输出:*123456cout setiosflags(ios:showpos)b endl;/输出:+123456return 0;33#include#include using namespace std;int main()double a=123.456,b=3.14159,c=-3214.67;coutsetiosflags(iosfixed)setiosflags(iosright)setprecisio
23、n(2);coutsetw(10)aendl;coutsetw(10)bendl;coutsetw(10)cendl;return 0;如果在多个cout语句中使用相同的setw(n),并使用setiosflags(iosright),可以实现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。例3.1 各行小数点对齐。运行情况如下:运行情况如下:123.46 123.46 3.14 3.14 -3214.67 -3214.67343.4.3 用getchar和putchar函数进行字符的输入与输出除了可以用cin和cout语句输入和输出字符外,C+还保留了C语言中用于输入和输出单个字
24、符的函数,使用很方便。其中最常用的有getchar函数和putchar函数。351.putchar函数(字符输出函数)putchar函数的作用是向终端输出一个字符。例如putchar(c);它输出字符变量的值。#include/或者包含头文件stdio.h:#include using namespace std;int main()char a,b,c;a=B;b=O;c=Y;putchar(a);putchar(b);putchar(c);putchar(n);putchar(66);putchar(79);putchar(89);putchar(10);return 0;运行情况如下:运
25、行情况如下:BOYBOY36用putchar可以输出转义字符putchar(n)输出换行符putchar(66)将66(字母B)作为ASCII码转换为字符输出putchar(10)10是换行符的ASCII码,输出一个换行符putchar(101)输出字符A,八进制的101是A的ASCII码putchar()输出单引号字符putchar(015)八进制的015是十进制的13,代表“回车”,不换行,使输出的当前位置移到本行开头372.getchar函数(字符输入函数)此函数的作用是从终端(或系统隐含指定的输入设备)输入一个字符。getchar函数没有参数,其一般形式为getchar()函数的值就是
26、从输入设备得到的字符。#include using namespace std;int main()char c;c=getchar();putchar(c+32);putchar(n);return 0;运行情况如下:运行情况如下:A a38有关getchar函数的其他使用方法的描述见P5657。393.4.4 用scanf和printf函数进行输入与输出(自学)平时练习可以不用scanf和printf函数进行输入输出,但是二级考试采用的是C语言,所以这两个函数还是要掌握的。在C语言中是用printf函数进行输出,用scanf函数进行输入的。C+保留了C语言的这一用法。scanf函数一般格式
27、是:scanf(格式控制,输出表列)printf函数的一般格式是:printf(格式控制,输出表列)scanf、printf函数的缺点:必须指定输出和输入数据的类型和格式,烦琐复杂,而且容易出错。40例3.4 用scanf和printf函数进行输入和输出。#include using namespace std;int main()int a;float b;char c;/注意在变量名前要加地址运算符&scanf(%d%c%f,&a,&c,&b);printf(a=%d,b=%f,c=%cn,a,b,c);/提问:请写出这两条语句的提问:请写出这两条语句的提问:请写出这两条语句的提问:请写出
28、这两条语句的C+C+形式。形式。形式。形式。return 0;运行情况如下:运行情况如下:12 A 67.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-4ac0。根
29、据公式求x1,x2的算法。它可以编写出以下C+程序:/例3.5#include#include /由于程序要用到数学函数sqrt,故应包含头文件cmathusing namespace std;int main()float a,b,c,x1,x2;cinabc;x1=(-b+sqrtsqrt(b*b-4*a*c)/(2*a);x2=(-b-sqrtsqrt(b*b-4*a*c)/(2*a);cout x1=x1endl;cout x2=x2endl;return 0;运行情况如下:运行情况如下:4.5 8.8 2.4 x1=-0.327612x2=-1.6279443开始输入a,b,c计算x
30、1,x2输出x1,x2结束把大象放冰箱里的算法也是顺序结构的,它没有判断能否把大象放进冰箱。(纯属搞笑)44选择结构(分支结构)的引入例3.5是假设b2-4ac0,如果事先不知道b2-4ac是不是大于0,那么在程序中就必须判断b2-4ac是大于等于0,还是小于0,分别求出2个实根、输出“无实数解”信息。流程图如下:开始输入a,b,c计算x1,x2输出x1,x2结束b2-4ac0?输出“无实数解”YN选择结构中的条件判断要通过关系运算来实现,多个条件要通过逻辑运算来连接。453.6 关系运算与逻辑运算选择结构中的条件判断要通过关系运算来实现,多个条件要通过逻辑运算来连接。所以先看看关系运算和逻辑
31、运算C+提供if语句来实现这种条件选择。如if(amount1000)tax=0.95;else tax=0.9;pay=amount*tax;流程可以用图3.4表示。463.6.1 关系运算和关系表达式关系运算实际上就是比较运算,将2个数据进行比较,得到判断的结果(真或假)。C+的关系运算符有(注意“=”与“=”的区别):(小于)(大于)=(大于或等于)=(等于)!=(不等于)优先级相同(高)优先级相同(低)47关系运算符的优先级:1)前4种关系运算符(,)的优先级别相同,后两种也相同。前4种高于后两种。例如,“”优先于“”。而“”与“a+b等效于 c(a+b)ab=c等效于(ab)=ca=
32、bc等效于a=(bc等效于a=(bc)算术运算符 (高)关系运算符赋值运算符 (低)48关系表达式v用关系运算符将两个表达式连接起来的式子,称为关系表达式。v关系表达式的一般形式可以表示为:表达式表达式表达式表达式 关系运算符关系运算符关系运算符关系运算符 表达式表达式表达式表达式v其中的“表达式”可以是算术表达式或关系表达式、逻辑表达式、赋值表达式、字符表达式。例如,下面都是合法的关系表达式:ab,a+bb+c,(a=3)(b=5),ab)(b=0”的值为“真”。在C和C+中都用数值1代表“真”,用0代表“假”。v关系表达式的例子见P60。493.6.2 逻辑常量和逻辑变量C语言没有提供逻辑
33、型数据,关系表达式的值(真或假)分别用数值1和0代表。C+增加了逻辑型数据。逻辑型常量(或称布尔常量):只有两个,即false(假)和true(真)。逻辑型变量(或称布尔变量)要用类型标识符bool来定义,它的值只能是true和false之一,如:bool found,flag=false;found=true;注意:在编译系统处理逻辑型数据时,将false处理为0,将true处理为1,而不是将false和true这两个英文单词存放到内存单元中。逻辑型变量在内存中占1个字节。50逻辑型数据与数值型数据逻辑型数值型与char型数据类似,既然在内存中是用一个字节来存储逻辑型数据,并且0表示fals
34、e,1表示true,因此逻辑型数据可以与数值型数据进行算术运算。例如假设变量btemp是逻辑型变量,它的值为false,那么:int a=2+btemp+false;/赋值后a的值为多少?总之:如果在同一个表达式中同时有逻辑型数据和数值型数据,则按如下方式进行处理(可以在图2.7中加上bool型数据,应该加在哪里?应该加在哪里?应该加在哪里?应该加在哪里?):例子:bool flag=true;int a=2+flag;int b=aflag;51数值型逻辑型如果将一个非零的数值型数据(包括整型和浮点型的常量、变量)赋值给逻辑型变量,则按“真”处理。0按false处理。如:bool flag=
35、25;另外,在条件判断中,只要表达式的值非0,就认为是true的,0认为是false的,如:int a=5;int b=6;if(a-b)cout Hello endl;if(a)cout Hi endl;if(a=b-1)cout nice to meet u!b)&(xy)可写成 ab&xy(a=b)|(x=y)可写成 a=b|x=y(!a)|(ab)可写成!a|ab!(高)算术运算符关系运算符&和|赋值运算符 (低)55运算符优先级的把握原则原则C+提供了多达几十种运算符,各种运算符的优先级级别不一样,很繁琐,怎么把握运算符的优先级?掌握常见运算符的优先级大致顺序;如果不能确定运算符优先
36、级的顺序,可以使用括号明确明确明确明确程序设计者的意图。例如:v如果要表示“a5或者a5|b3”时不能确定逻辑运算符“|”和关系运算符“”的优先级顺序,则可以加上括号,表示成“(a5)|(by)cout x y)cout x endl;else cout 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-4ac0?输出“无实数解”YN63/例3.5#include#include using n
37、amespace std;int main()float a,b,c,x1,x2;cinabc;x1=(-b+sqrt(b*b-4*a*c)/(2*a);x2=(-b-sqrt(b*b-4*a*c)/(2*a);coutx1=x1endl;coutx2=x2endl;return 0;?/练习1#include#include using namespace std;int main()float a,b,c,x1,x2;cinabc;float delta=b*b-4*a*c;?return 0;64/练习1#include#include using namespace std;int m
38、ain()float a,b,c,x1,x2;cinabc;float delta=b*b-4*a*c;if(delta=0.0)x1=(-b+sqrt(delta)/(2*a);x2=(-b-sqrt(delta)/(2*a);cout x1=x1endl;cout x2=x2endl;else cout 无实数解 500)cost=0.15;else if(number300)cost=0.10;else if(number100)cost=0.075;else if(number50)cost=0.05;else cost=0;66说明:1)3种形式的if语句都是由一个入口进来,经过对“
39、表达式”的判断,分别执行相应的语句,最后归到一个共同的出口。这种形式的程序结构称为选择结构选择结构选择结构选择结构。2)3种形式的if语句中在if后面都有一个用括号括起来的表达式,它是程序编写者要求程序判断的“条件”,一一一一般般般般是逻辑表达式或关系表达式(但实际上可以是任何合法的C+表达式,因为表达式都是有一个确定的值,只要它的值非0,就认为是true,否则认为是false)。673)第2、第3种形式的if语句中,在每个else前面有一分号,整个语句结束处有一分号。但是它们都属于同一都属于同一都属于同一都属于同一个个个个if if语句语句语句语句,是在if语句中嵌套了其他语句(其中else
40、是if语句中的子句,不能作为独立的语句单独使用,必须与if配对使用)。如:if(x0)cout x endl;elsecout-x 0)cout x endl;elsecout-x c&b+ca&c+ab)/复合语句开始s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c);cout area endl;/复合语句结束else cout it is not a trilateral!endl;/if语句结束/请问这个if语句实现什么功能?在复合语句中定义的变量,只在复合语句中有效。如例3.669例3.6 求三角形的面积#include#include /使用数学函数
41、时要包含头文件cmath#include /使用I/O流控制符要包含头文件iomanipusing namespace std;int main()double a,b,c;coutabc;if(a+bc&b+ca&c+ab)/复合语句开始double s,area;/在复合语句内定义变量s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c);/指定输出的数包含4位小数coutsetiosflags(ios:fixed)setprecision(4);cout area=areaendl;/复合语句结束else cout it is not a trilateral
42、!year;if(year%4=0)if(year%100=0)if(year%400=0)cout year is a leap year!endl;else cout year is not a leap year!endl;else cout year is a leap year!endl;else cout year is not a leap year!b)max=a;else max=b;max=(ab)?a:b;条件表达式。含义:如果(ab)为真,则条件表达式的值为a,否则条件表达式的值为b。78条件运算符(?:):要求有3个操作数,称为三目运算符三目运算符三目运算符三目运算符
43、,是C+中唯一唯一唯一唯一的一个三目运算符。条件的一般形式为表达式表达式表达式表达式1?1?表达式表达式表达式表达式2 2 表达式表达式表达式表达式3 3条件运算符的执行顺序是:先求解表达式1,若为非0(真)则求解表达式2,此时表达式的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。例如:max=(ab)?a:b;的执行结果是将条件表达式的值赋给max。也就是将a和b二者中的大者赋给max。条件运算符优先优先优先优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给max。79例3.7 输入一个字符,判别它是否
44、为大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。#include using namespace std;int main()char ch;cinch;/判别ch是否大写字母,是则转换ch=(ch=A&ch=Z)?(ch+32):ch;coutchendl;return 0;条件表达式在这个例子中要注意:1.表达字符型数据介于2个字母之间的表示方法;2.大小写字母在ASCII码表里的关系。问题二:问题二:问题二:问题二:这个条件表达式语句如果要用if语句来表达,该怎么写?803.9 多分支选择结构与switch语句if语句的第三种形式可以实现多分支,但要进行
45、多次条件判断。switch语句是多分支选择语句,用来实现多分支选择结构。多分支选择结构的例子:v学生成绩分类(90分以上为A等,8089分为B等,7079分为C等,等等)v折扣的例子:购物5000元以上8折,20004999为8.5折,10001999为9折,1000元以下为9.5折。81switch结构的一般形式如下:switchswitch(表达式)(表达式)(表达式)(表达式)casecase 常量表达式常量表达式常量表达式常量表达式1 1:语句:语句:语句:语句1 1 casecase 常量表达式常量表达式常量表达式常量表达式2 2:语句:语句:语句:语句2 2 .casecase 常
46、量表达式常量表达式常量表达式常量表达式n n:语句:语句:语句:语句n n defaultdefault:语句:语句:语句:语句n+1n+1 例子:按照考试成绩的等级打印出百分制分数段switch(grade)case A:cout 85100n;case B:cout 7084n;case C:cout 6069n;case D:cout 60n;default :cout errorn;grade是char型变量82说明1)switch后面括号内的“表达式”,允许为任何类型,但它的值必须是整型,不能是浮点型它的值必须是整型,不能是浮点型它的值必须是整型,不能是浮点型它的值必须是整型,不能是
47、浮点型。2)当switch表达式的值与某一个case子句中的常量表达式的值相匹配时,就执行此case子句中的内嵌语句,若所有的case子句中的常量表达式的值都不能与switch表达式的值匹配,就执行default子句的内嵌语句。3)每一个case表达式的值必须互不相同,否则就会出现互相矛盾的现象(对表达式的同一个值,有两种或多种执行方案)。4)各个case和default的出现次序不影响执行结果。5)5)执行完一个执行完一个执行完一个执行完一个casecase子句后,流程控制转移到下一个子句后,流程控制转移到下一个子句后,流程控制转移到下一个子句后,流程控制转移到下一个casecase子句继续
48、执行子句继续执行子句继续执行子句继续执行。“case常量表达式”只是起语句标号作用,并不是在该处进行条件判断。在执行switch语句时,根据switch表达式的值找到与之匹配的case子句,就从此case子句开始执行下去,不再进行判断。83例子:按照考试成绩的等级打印出百分制分数段switch(grade)case A:cout 85100n;case B:cout 7084n;case C:cout 6069n;case D:cout 60n;default :cout errorn;若grade的值等于A,则将连续输出:851007084606960error显然,这并不是程序员的意图。因
49、此,应该在执行一个应该在执行一个应该在执行一个应该在执行一个casecase子句子句子句子句后,使流程跳出后,使流程跳出后,使流程跳出后,使流程跳出switchswitch结构,即终止结构,即终止结构,即终止结构,即终止switchswitch语句的执行语句的执行语句的执行语句的执行。可以用一个breakbreak语句来达到此目的。将上面的switch结构改写如下:84switch(grade)case A:cout 85100n;break;case B:cout 7084n;break;case C:cout 6069n;break;case D:cout 60n;break;defaul
50、t :cout errorn;break;加了break语句后switch结构的流程图:856)在case子句中虽然包含一个以上执行语句,但可以不必用花括号括起来,会自动顺序执行本case子句中所有的执行语句。7)多个case可以共用一组执行语句,如.case A:case B:case C:cout60n;break;.当grade的值为A、B或C时都执行同一组语句。863.10 编写选择结构的程序例3.8编写程序,判断某一年是否为闰年。思路分析如下:v年份从键盘输入,保存到变量year中,要用到cin语句。v用布尔变量leap表示被测试的年份是否是闰年的信息。利用P63所学的方法判断年份是