程序设计教程语言描述_第1页
程序设计教程语言描述_第2页
程序设计教程语言描述_第3页
程序设计教程语言描述_第4页
程序设计教程语言描述_第5页
已阅读5页,还剩194页未读 继续免费阅读

下载本文档

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

文档简介

前言作为计算机软件的主要表现形式,计算机程序不同于其它程序(如:音乐会程序子程序、递归、类/对象、继承、类属、输入/输出以及异常处理等。虽然本介绍的大部太抽象,无法体现具体实施过程及其所产生的实际效果。因此,本选择C++作为程序有的放矢。因此,本对C++的一些特殊的、用于解决非主流的程序设计问题的成分和另外,由于篇幅有限,本也不对属于C++标准库的内容作详细介3章介绍程序的基本流程控制,包括:顺序、分支及循环等控制结构,重点对循环合、指针和等。其中,重点讨论了指针类型的作用和使用原则。容包括:什么是面向对象程序设计、面向对象程序设计的优势、类的定义、类成员的符重载的需要性和基本原则、操作符重载的方法以及对C++语言的一些特殊操作符的重作用、单继承、继承方式、虚函数(成员函数的动态绑定、抽象类、多继承以及面向对10章对程序的输入/I/O函数库的过程式的输入/输出和基于I/O类库的面向对象的输入/输出。12MFCWindows应用程序基本框架,从中体会本的编写和完成与很多人的帮助是分不开的。首先,要感谢教授对本编写工作的精心指导。在内容的选取、安排、用语的规范性等方面,郑老师都事无巨细地给予了考虑,并检查了全文(包括中的每个例子程序。还值得一提的是,作者编写本所必备的专业知识和专业素质是在郑老师的长期熏陶下获得的,这些知识和素题的设计和文字易读性方面所做的大量工作;非常感谢同学对内容所做的检查在遵守C++方面所建议;感谢博士和博士,作者对一些基本概念的理解是在与他们就相关问题的讨论中获得的。另外,还要感谢机械工业的总编辑对本编写工作的鼓励和支持。最后,要感谢我们的家人对本编写工作的理解和支持,的编写占用了大量的20044 前 第1章概 软 第2章基本数据类型和表达 常 变 第3章程序的流程控制――语 if语 while语 for语 break语 continue语 goto语 关于goto语 习 第4章过程抽象――函 小 习 第5章构造数据类 结 联合( 第6章数据抽象―― this指 const成员函 第7章操作符重 第8章继承――派生 第9章类属设施――模 第10章输入/输出 概 基于I/O函数库的控制台 文件 基于I/O类库的文件 小 习 第11章异常处 try、throw以及catch语 小 习 第12章实例--面向对象的Windows应用程序框 MFC类库 FoundationClass MFC对面向对象的Windows应用程序的支 VisualC++的应用向导(AppWizard)和类向导(ClassWizard)错误!未定小 习 附录一ASCII字符集及其编 1946年第一台电子计算机(ENIAC)问世以来,计算机在理论、技术以及应用等方面有了很大的发展。特别是计算机的应用,它已从早期的数值计算应用到现在的大计算机的。没有硬件就没有计算机,但是,如果只有硬件没有软件,可以说计算机什目前大部分计算机基本上采用的还是传统的冯•(von ann)体系结构,即程序式结构。图1-1给出了冯•计算机的硬件构成。1-1UnitCPU构成了计算机的部件,它用于执行计算机指令以完成计算任务。CPU由控用,其作用主要是减少内存的次数,提高指令的执行效率。(Memory内存用于计算机程序(指令和数据。内存由许多单元构成,单元的大8位二进制数。每个单元都有一个地址,对单元的(使用)是通过其地址来CPU内的寄存器相比,内存的容量(内存单元的数目)要大得多,但指令访3、设备(PeripheralDevices,简称外量的信息。外设包括:输入设备、输出设备以及外部器。键盘和鼠标器等属于输入设备;显示器和等属于输出设备。外部器(简称外存)是大容量的低速部件(与内存相比,用于永久性地存中的信息通常以文件形式进行组织和。外存与内存除了在容量和速度上不同外,它们的另一个区别在于:内存中的是正在运行的程序和正在使用的数据,而外存中的冯•计算机的工作模型是:待执行的程序从外存装入到内存中,CPU从内存中程序调用/返回等指令。通常情况下,CPU从某个内存地址开始依次取指令来CPU与内存之间以及内存与输入/输出设备之间的数据传输。现在的计算机中往往利用程序执行和对数据所具有的局部性特征,通过缓存机制来解决部件之间速度不在内存中为外存提供高速缓存(diskcache。计算机硬件只是提供了执行在内存中指令的能力,而执行的指令是需要人来提供系统就属于系统软件。支撑软件是指支持软件开发与的软件,一般由软件开发人员使用,如软件开发环境就是典型的支撑软件。应用软件是指用于特定领域的软件,如:人口普查软件、财务软件等。图1-2给出了计算机软件的分类。1-2测试以及运行与。软件需求分析的主要任务是明确待实现的软件要解决什么问题,即书写程序。测试是对书写好的程序进试,确认其是否满足所规定的需求。运行与是指使用软件并在使用过程中发现和改正程序中的错误。值得一提的是,在工作上的行。早期的软件开发工作主要花费在编程实现阶段,并且采用的是的小作坊开发模设计包含了软件生存周期中其它阶段的一些工作,只是地考虑实现技术而已。因此,软件设计、测试以及等一些问题。程序设计范型(ProgrammingParadigms。序使用。下面的经典刻划了过程式程序设计的本质特征:=+上述中的算法是指对数据的加工步骤的描述,而数据结构则是对算法所加工的数以驾驭大型、复杂系统的设计、实现和。对象程序可简单地表示成下面的:=对象/+对象/对象/=+能够适应软件需求的变化,易于。某个领域中的对象往往具有通用性,它们可以用于杂问题给出解决方案,使得程序容易设计、理解与。面向对象程序设计的不足之处在函数式程序设计是围绕函数及函数应用(FunctionApplication)来进行,它基于了递lambda演算,其中,函数也被作为值来看待。逻辑程序设计是把程序组织Calculus序设计语言往往指的是高级语言。例如,对于计算a+b*c-d的值,用汇编语言可写成:movax,bmulax,caddax,asubax,dmovr=a+b*c-用高级语言书写的程序须翻译成机器语言程序才能在计算机上运行。翻译方式有两(称为源程序首先翻译成功能上等价的机器(称为目标代码程序(再通过汇编程序把它翻译成目标代码程序,然后执行目标代码程序,在目标代码程序的执行中不再需要源程序。解释则是指对高级语言的优点在于:程序容易设计、理解与,容易保证程序正确性。特别地,高级语言的缺点是:用其编写的程序相对低级语言编写的程序效率要低。序设计的难易程度和程序的正确性及易性问题逐渐显现出来,对于一个难以设计、经常出错和难以的程序,尽管它的效率很高,也是不会被接受的。所需遵循的规则集合;语义是指用语言各个成分的含义;语用是指语言成分的使用场合及BjarneStroustrup设计的,VisualC++C++Builder分别是公司和Borland公司语言还必须按照计算机解决问题的方式来描述解题过程,程序设计仍然非常。因此,的数据封装、继承以及多态等设施更加有利于程序的设计、复用与。另外,从待解决设计语言的一些特殊表示细节中去。过多地涉及实现细节,不利于从较高抽象层次现有的编程、人员只熟悉COBOL语言,而待开发的应用可能用C++编合适。在C++C++,则将意味着需要对已有人员进行再培训或招聘新的编程人员,这些都需要时间和投入。如果通过成本估算得出结论:划不来,则该公司也会决定放弃C++而采用COBOL。还有,如果用户指定采用某不同风格的程序。风格有好与不好之分,它影响到程序的正确性和易性。程序设计风序运行环境的情况考虑不足而导致的程序异常终止,这两类错误可能是编程阶段导(debug求使得程序功能更加完善;适应性是指把程序移植到不同的计算平台或环境中。本的主旨是介绍程序设计的基本思想和技术,C++是介绍这些编程思想和技术时C++C语言发展而来。C语言是一个支持过程式程序设计的高级语言,它是由贝尔的DennisRitchie为书写UNIX操作系统而设计的一种系统程UNIX被广泛使用的影响,C语言后来成为了一种被普遍地应用于各种类型应用程序书写的程序设计语言。C语言既有高级语言的优点,如:提供了类型机如:数据位操作和内存地址操作等。与其它高级语言相比,C语言还具有简洁、灵活、高C++语言是贝尔的BjarneStroustrup为进行面向对象程序设计而设计的一种语C语言一样,C++语言的主要特点是:灵活和高效。其中的灵活性体现在:对解决言成分来解决何种问题,对语言的使用不当将会造成不良。C++的高效也是通过把保不过,这要花费程序设计者很多的精力。而在有些语言中,对可能造成不良的一些做至于如何评价C++语言,本作者认为:对掌握了基本程序设计思想和技术的程序国际标准化组织(ISO)已于1998年为C++制定了国际标准。本中大部分关于++C++的实现并没有完全按照国际标准来实施,请读者在阅读本时注意这一点。为了能对C++//ThisisaC++#include<iostream>//对使用的C++标准库中的程序实体进行usingnamespacestd指定使用标准库的名空间std。intmain()//主函数doublex,y;cout“Entertwofloatnumbers:”输出到显示器。cin>>x>>y;//从键盘输入数据。doublez=x+ycoutxyzendl输出计算结果。return0;//程序结束。}Entertwofloatnumbers:7.27.2+9.3=main的函数。函数由函数名、参数和返回类型、局部变量/对象函数的外部和内部,而语句只能出现在函数内部。C++程序从函数main开始执行。函数、类和外部变量/对象的定义,其中有且仅有一个文件中包含一个函数main。每个源规则,句法是指由词构成句子(程序)C++的词法(构词规则,字符集。C++的字符集由26大小写英文字母、10个数字以及一些特殊符号构成。a~z,!#%^&*_-+=~<>/\|.,:;'"()[]{}不能是数字,如:student、student_name、x_1、_name1等都是合法的标识符。象、标号等。在C++程序中,使用一个标识符前必须要对该标识符进行,该标识以两个下划线开头或以一个下划线后跟一个大写字母开头的标识符往往在C++,程序中不要用这些标对于符号常量,采用全部大写的标识符,如:圆周率目的。表1-1列出了C++中的 1-1等,这时就需要对语言的语则进行严格地描述。对一个语言的语法进行精确地描述<标识符非数字字符>|<标识符><非数字字符>|<标识符><数字字符<非数字字符_|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|<数字字符一些扩充的BNF中增加了:方括号“[]”用于表示其中的内容可有可无、花括号“{}”用由于本不是C++的语言定义文本,并且用BNF精确描述的内容有时理解起来显是采用了一种容易理解的混合形式(如:自然语言、流程图、例子以及简化了的BNF形式等)来对C++进行描述。一般要遵循如图1-3所示的步骤。编辑(.cpp,.h)→编译(.obj)→联接(.exe)→运行→1-3C++利用某个编辑程序(如:Windows平台上的写字板、记事本、Word等)C++源程的文件名通常为:*.cpp和*.h。在上述的编译、联接和运行过都有可能发现程序有错。如:编译程序在编译时发在(外部错;程序运行结果与预期的不一致等。这些错误都会使得该执行过程返回如:VisualCTurboCCBuilder等。在这些集成环境中,往往使用一条命令就能完 过CPU执行指令(从内存获得)不断地改变程序的状态(内存中的数据)来实现计算的析、软件设计、编程实现、测试以及运行与这个生存周期。7、与低级语言相比,高级语言的优点在于:程序容易设计、理解与,容易保证程序extern,_book,Car,car_1,ca1r,1car,friend,car1_Car,Car_Type,No.1,本章将对C++提供的基本数据类型(数据的描述)和表达式(数据操作的具体实施)

型 2-1C++types为一个整体来描述的数据类型。图2-1列出了C++提供的数据类型。由于C++提供的对基本数据类型数据的操作非常多(C++的一个特点:提供了的类型本身,它们还涉及到操作数的以及类型转换等其它一些内容,因此,为了对操整数类型用于描述通常的整数。在C++中,整数类型用int表示。由于受到计shortintlongint“shortintintlongint16位的计算机unsignedintunsignedshortintunsignedunsignedlongintunsigned型的数,在其内存空间中没有表示符号的位。因此,对于同样大小的空间,无符号整1。例如,如果用一个字节整数类型数据,则12和-12的补码分别为:和。(doublelonglongdouble型,用于表示精度更高的实型数。由于受到“floatdoublelongdouble具体实现而定,可能是8个字节,也有可能是10个字节。中的a称为尾数;b称为指数。在实数的内存空间中的是尾数和指数两部分,它们均0.1就无法精确地用二进制表示。因此,一些十进制小数无法精确地用描述单个字符数据(char类型的一维数组表示。在计算机中,字符是用其编码来表示和的,char类型描述的字符集是由单字节编码的字符构成。目前,用于计算机的单字节编码的字符集有很多,较常采用的是ASCII(标准信息交换码)字符集。ASCII10个数字、26个英文字母得到的。ASCII字符集及基于它扩充得到的字符集都有一个特征:0~9十个数字、26个大2609就是256个字符,而像汉字这样的字符集,其字符(汉字)256C++wchar_t类型,用于描述像汉字这样的大字unicode的国际通用大字符集,该字符集包含了大部分语言文2字节编码。在C++中,对大字符集字符的表示也可以采用多个char类型的数据来实现,wchar_t类型主要用在程序的实现中,本不对该类型进行详细介绍。是作为signedchar还是unsignedchar,不同的C++实现有不同的规定。C++true1、false0,所以,逻辑值也可返回值的函数的返回类型(4.2.2节)以及通用指针类型(void*5.4.1节。types型和实数类型统称为算术类型(arithmetictypes。一台计算机上的各种数据类型的数据所占的内存空间大小(字节数)可以通过大值和最小值,可以从编译程序提供的C++标准库的某些头文件中获得,例如,头文件typedef已有类型别名例如,下面的定义为类型unsignedint取了一个别名typedefunsignedintunsignedint的地方都可以用Uint常量是指在程序执行过值不变(或不能被改变)的量,如圆周率π、一个星期的在 l算半径为r的圆的周长的表达式:2*3.1416*r中,2和3.1416就是字面常量。0x80,-0x48,为十六进制表示41152LU。如果整数类型常量后面既没有l(L),又没有u(U),则它为int型常量。00,但小数点不能省,如:5.和.5分别表示5.00.5类型数构成,表示基数为10的指数,如:4.5678E2,-5.7e-3等。、例如,字母A有三种表示:'A'、'\101'和'\x41''\r'(回车符、'\t'(横向制表符、'\b'(退格符)2-1C++的一些常用转义序2-1C++"Thisisastring.""I'mastudent.""Pleaseenter\"Y\"or\"N\":""Thisistwo-line\nmessage!"(char字符,其类型为常量字符数组(5.2.1节中的。的字符个数加上1。符号:\0(编码为0的字符)。const类型名常量名>=<值或#define常量名值constdouble #definePIc=booltruefalseC++语言预定义的两个符号常量,它们的值分别为1和0。别给它们取一个有意义的名字(如:PASS_SCORE、MINUTES_PER_HOUR等如果采用字面常量,则就可能出现:程序中有的地方写3.1416;有的地方写3. 半径r就是一个可变的数据,它可能是通过用户输入得到,也可能由程序的其它部分计算和(变量的别名)来变量,特别地,对动态变量的是通过相应的指针来实现xy,如果程序运行前不知道x和y的类型,那么就无法在程序运行前确定表达式x+y的以及给值<类型名变量名<类型名变量名>=<初值定义的变量的名字。注意:变量名不能是C++的。<初值>一般是一个常量,但它也可以是相应类型的一个表达式(参见2.5节,该表达式中可以包含常量和在当前变量定inta=0;double对于上面的变量a和b的定义可以写成:int在C++程序中使用变量之前,必须对使用的变量进行,使得编译程序能对变量的extern类型名变量名上述的变量称为非定义性。由于一个C++程序可以由几个源文件构成,如果要在使用前对变量进行非定义性。为了描述方便起见,在本后面的内容中,如果没有专门,则一概指非定义性。变量定义与的区别是:int变量值的来源有多种途径,它可以是程序执行中产生的计算结果(通过赋值运算得到,也可以从外设(如键盘、磁盘等)C++中如何从键盘输入数据到入对象cin和抽取操作符“>>”来实现,如:#includeiostream>插入一些在标准库中定义的输入/输出操作所需要的usingnamespacestd;//C++标准库中的程序实体是在名空间std中定义的。inti;doublecin>>i;//从键盘输入一个整数类型数给变量icind从键盘输入一个双精度浮点数给变量dcin>>i>>例如,对上面程序中的输入语句,如果输入的数据为:123.4bi12d3.40123.4i的值为可以是其它操作符的运算结果。操作符有时也称为运算符,今后,不加区别地使用保存在临时的单元中。但在C++语言中,有些操作符(如:赋值=、自增++、自减--根据操作符所带的操作数的个数,可把操作符分为:单目(一个操作数、双目(两C++C++C++的灵将会它们的操作数类型以及必要的类型转换。1小数点后面的数将舍去,并且不进行四舍五入。如:3/21;-10/3的结果为-3。(a/b)*b+a%b==对一个变量x,++xx++x1,它们的区别是:++x1xx++1以前的x的值。例如,对于下面定义的变量x和y:int=(++x“=C++中,进行算术运算前通常要对操作数进行类型转换,特别是对两个类型不同的地转换。转换规则(usualarithmeticconversions)自动进行操作数类型转换,其转换规则是:否则,先对操作数进行整型提升转换(integralpromotions,如果转换后操作数的类型不一样,则按e)以后的规则再进行转换。整型提升转换规则是:char、signedchar、unsignedchar、shortint、unsignedshortint类型,如果wchar_t和枚举类型转换成下列类型中第一个能表示其所有值的类型:int、unsignedint、longint、unsignedlongint。两个操作数都转化成unsignedlongint。成无符号数时就会成为正数。例如,对于下面的两个变量i和j:inti=-10;unsignedintj=3;i+j将得到结果:ij的类型不同,编译程序将对它们进行类型转换。根据常规算术转换规则(h)i的值转换成unsignedinti0xFFFFFFF6(它是-10的补码,当把i的值经过类型转换之后就成了正数:。围。如果出现溢出,则结果将会不正确。例如,对于下面的两个变量i和j:int ;//int类型中最大的正整数(假设int4个字节实现int计算i+j将得到错误的结果:- ,为什么呢?因为,i+j的结果已超出了int 10后,结果为0x ,它是int类型中负数:- 或int ;//int类型中最大的正整数(假设int4个字节实现int或 inti=-10;unsignedintj=3;或>(大于)(小于)(不小于)(不大于)(相等)(不等定的关系成立;结果为false则表示不成立。如:32的结果为4.3<1.2的结果为false'A'<'B'的结果为truefalsetrue的结果为truei和j,inti=-10;unsignedintj=1;如:0.1行下面的比较运算可能会得到false:d==,xy可写成:fabs(x-y)<1e-6xy可写成:fabs(x-y)>1e-6(结果为true或false,其运算规则如下:!true->!false->ab(a<=b!(a>(age<10)&&(weight>30)表示小于10岁并且重量大于30公(temperature35&&(humidity0.7350.7(a==b)&&(b==c)表示三个数是否构成一个等边三角形(ab&&bc表示b是否介于a和cfalse&&false的结果为falsefalse&&truefalsetrue&&falsefalsetrue&&true的结果为truetrue时,操作符&&true,否则为(age<10)&&(weight>的结果为false。(a==b)&&(b==c)(a<b)&&(b<c)10;同样,对于:a<b<ca<b的结果与c进行“小于”比1c进行比较C++写多个条件的并且关系时,不能按照数学上为true或false,其运算规则是:false||false的结果为falsefalse||true的结果为truetrue||false的结果为truetrue||true的结果为truefalse。例如,下面的条件表示字符类型变量ch的值不是数字字符:(ch<'0')||(ch>由于C++falsetrue看待,因此,逻辑操作也可以对算术型、falsetruefalse,i&&ijtruefalse。不过,为了提高程序的易(i!=0)&&(j!=作数已能确定运算结果了,则不再计算第二个操作数的值,该规则称为短路求值evaluationtrue||x的结果为truefalse&&xfalse值(这里的x也可能是一个运算式。算提供一个“卫士”(guard),例如,对下面的一个运算式:(number!=0)&&(1/number>number0时,上述逻辑“与”操作的第一个操作数(number!=0)已能确定整个运算式的结果了(false,它将不会再去计算:1/number>0.5,从而可以避免计算1/number时除数为0的异常情况。UNIXC5.4节介绍,下面重点介绍C++提供的数据的二进制位操作。在C++中提供了对整型和枚举类型数据按操作数的各个二进制位分别进行运算的操以及的值,这里的取反是指:0变成1、1变成0。例如:0&0→0&1→1&0→1&1→0&0→0&1→1&0→1&1→0^0→0^1→1^0→1^1→(x^a)^a=s(char)记x的每一个二进制位对应于一个资源,0表示资1个、第2个、...、第n个资源,则:s&0x105个资源是否可用(结果不为零表示可用,否则表示不可用)ss|0x40)7ss&0xF7)4ss^0x20)6个资源的可用状态(可用→不可用;不可用→可用)<<(左移)(右移时,舍弃,低位补0。例如,0x3F612时,低位舍弃,按下面规则处理:例如:对于下面的两个数据ch1和ch2:unsignedcharch1=0xA6signedchar ch2>>2的结果为0xE9(二进制为 注意:在写操作符(逻辑与)和(按位与)、|(逻辑或)和|(按位或)、(左移)和(小于以及(右移和(大于)intijtrue(1。类似地,如果把移i<<ji<j,则也得不到预期的结果:4i<j也是合法的,其结果为true(为a=intif(x==1)y=10;y=有得到正确的值,而且也改变了变量x的值。上述操作符的含义是:如果“#=ab按照aab理解。不过,操作ab与aabaa只计算一次,而后一个操作中的a将计算两次。涉及到CPU与内存之间的数据传输,往往限制了冯•计算模型的计算效率。其中,d1、d2、d3d1true或非零,则运算结果为d2,否则为d3。例如,条件操作:(a>b)?a:b的结果为a和b中的最大者。x=a+b,y=c+d,z=x+z而言,上述的计算式等价于:zabcd,但从语义上讲,用逗号操作表示的计算更加清晰,它反映了z的语义结构。或intx;合法的C++表达式:如,表达式a+++b有两种可能的解释:a+凵++b或a++凵+b,这时必须用空格明确是达式等。如果一个表达式中的操作数为常量或在编译时刻能够确定它的值(如:sizeof的++,-1([-成员选择(对象指针->成员.成员选择(对象.成员++,-!~-2+&*3-4*,/,5+,6<<,7<,<=,>,8==,9&^|?=,*=,/=,%=,+=,-<<=,>>=,&=,^=,,2-2列出了C++中一些常用操作符的优先级和2-2可以看出,C++操作符的优先级有x=3<<1*2+2<48?6:7-x=3 1*2 2<48?6:7-shortinta;intb;doublec;法运算;然后再把a*b的结果(为int型,保存在临时的单元中)转成double型,再与c进行除法运算,结果为double型。shortintint double计算表达式a*b/c将得到错误的结果:-1.0。因为,a*b的结果已超出了int型所能表 的十六进制表示为:0x7FFFFFFF,乘上2后,结b显式转换成double或 没有规定先计算a+b还是先计算c-d。C++中,除了逻辑与(&&、逻辑或(||、条件(?:)和逗号(,)操作符外,对其false(x+1)*(++x),如果先计算(x+1),则表达式的计算结果为:4;而如果先计算(++x),则表达式的计算结果为:6。这是因为,计算++x2x,6。达式中,最好把它们作为单独的操作来用(参见3.2节。可能产生副作用(参见5.4.2节和5.5节。如:输出到显示器、以及磁盘等。下面介绍把表达式的计算结果输出到显示器。定义的对象cout和插入操作符“<<”来实现,例如:#include<iostream>usingnamespacestd;cout<<a+b*c;cout<<a;cout<<b;cout<<endl;或cout<<a+b*c<<a<<b<<数类型包括:int、unsignedint、shortint、unsignedshortint、longintunsignedlongint。typestypes量有利于增加程序的易读性、提高程序对常量使用的一致性以及增强程序的易性。用一个变量时,如果未见到它的定义,则需要对它进行。作符、位操作符、赋值操作符、条件操作符、sizeof等。、-5.23, "TodayMonday.",8、将下列表示成C++的表达式(1)bb2

s(ss(sa)(sb)(sa cd1

4r3 2.5#include<iostream>usingnamespacestd;intmain(){doublea=3.3,b=1.1;inti=a/b;cout<<i<<endl;return0;}第3 句、选择语句和循环(重复)语句。图3-1列出了C++的所有语句。

3-1C++a+b*a>b?a:b;x=a|b&x=a+b;//赋值x+自增f(a);//cina;//输入coutb#include<cmath>#include<iostream>usingnamespacestd;intmain(){doublecout<<"Pleaseinputapositivenumber:";cin>>x;square=x*x;cube=x*x*x;square_rootsqrt(x);//sqrt为C++标准库中的计算平方根的函数。cout"Thesquareofxissquareendl;cout<<"Thecubeof"<<x<<"is"<<cube<<endl;cout<<"Thesquarerootof"<<x<<"is"<<square_root<<endl;return0;}Pleaseinputapositivenumber:9↙Thesquareof9is81Thecubeof9isThesquarerootof9is3-2计算级数a,2a,3a,...n解:上面的级数前n项之和可用下面的求和计算sum(1n)n2#include<iostream>usingnamespacestd;intmain(){intn;cout<<"a=";cin>>a;cout<<"n=";cin>>n;sum=cout<<"sum="<<sum<<endl;return0;}(ock语句序列{intcin>>a>>b;intmax;ifab)//选择语句max=a;max=cout<<max<<}C++中,程序的分支控if语句中选择一个语句执行。if语句有两种格式:1>、<2>if语句的成分语句(或子语句例如,下面的if语句实现把ab中的最大者赋值给变量max:if(a>b)max=max=或或 3-2if一般来讲,一条if语句执行完之后将执行紧接在它后面的其它语句。但是,如果if3-3#include<iostream>usingnamespacestd;intmain(){intcout请输入三个整数:endl;cin>>a>>b>>c;if(a>b)max=max=if(c>max)max=cout最大者为:maxendl;return0;}if语句比较cmax的大小,如果c大,则把cmax,否则,max的值不变。最后,max的值为a、b和c中的最大者。bb2bb2xb2-4ac≥#include<iostream>#include<cmath>usingnamespacestd;intmain(){doublecout请输入一元二次方程的系数(a,b,c):endl;cin>>a>>b>>c;if(a==cout不是一个一元二次方程endl;return-1;}if(t<0)cout方程没有实根endl;return-1;}if(t==root1=root2=-b/(2*a);{root1=(-root2=(-b-}cout方程的根为:root1和root2endl;return0;}ifififififelseifelseifelseif#include<iostream>usingnamespacestd;intmain(){intcin>>a>>b>>if(a+bc||b+ca||c+ab)cout<<"不是三角形";elseifab&&bc)cout<<"等边三角形";elseifab||bc||ca)cout<<"等腰三角形";elseif(a*a+b*bc*c||b*b+c*ca*a||c*c+a*ab*b)cout<<"直角三角形(非等腰)";cout其它三角形";cout<<endl;return}3-6从键盘输入两个表示时刻的时间数据(每个时刻包括:时、分、秒解:对于该问题,我们分别用三个整型变量(h1、m1、s1h2、m2、s2)表示每个时刻#include<iostream>usingnamespacestd;intmain(){intcout请输入第一个时刻(时、分、秒):";cin>>h1>>m1>>s1;cout请输入第二个时刻(时、分、秒):";cin>>h2>>m2>>s2;if(h2>h1)r=1;elseif(h2<h1)r=-1;elseif(m2m1)//从此,h1h2r=1;elseif(m2<m1)r=-1;elseif(s2s1从此,h1h2m2m1r=1;elseif(s2<s1)r=-1;else//h1h2m1m2s1s2r=0;if(r==cout<<"第一个时刻。";elseif(r==-1)cout<<"第二个时刻。";cout两个时刻相同";cout<<endl;return}intt1=s1+m1*60+h1*3600;t2=s2+m2*60+h2*3600;if(t1<t2)cout<<"第一个时刻。";elseif(t1>t2)cout<<"第二个时刻。";cout两个时刻相同。并且,当if1if2>1elseifelseifif(<表达式1>)if(<表达式2>)<语句1>else<语句 对于上面的歧义问题,C++规定按(a)解释,即:elseelse子句的if配对。如果需要按(b)解释,则可以用复合语句来表示:if1if2>1else例如,下面的C++doubleaverage;average=100.0;if(average>=60.0)if(average<70.0)cout<<“Marginalcout<<上面程序输出:FAILelseif,但编译程序并不考虑书写格式,而是严格按照“elseelseifdoubleaverage;average=100.0;if(average>=60.0{if(average<70.0)cout<<"MarginalPASS";}cout<<if>=if>=<cout<<if>=<if>=<cout及格";if(score<60)cout不及格if(score90)cout<<"优";elseif(score80)cout<<"良";elseif(score70)cout<<"中";elseif(score60)cout<<"及格";cout不及格if语句提供了从两个或两组语句(复合语句)选一个(组)来执行的程序流程控制。来表达会显得很罗嗦,它将包含多个嵌套的if语句。3-7从键盘输入一个星期的某一天(0:星期天;1),然后输出其对应的英语单词(if语句实现。#include<iostream>usingnamespacestd;intmain(){intday;cin>>day;if(day==cout<<"Sunday";elseif(day==1)cout<<"Monday";elseif(day==2)cout<<"Tuesday";elseif(day==3)cout<<"Wednesday";elseif(day==4)cout<<"Thursday";elseif(day==5)cout<<"Friday";elseif(day==6)cout<<"Saturday";cout<<"Inputerror";cout<<endl;return}switch整型表达式case1>:case整型常量表达式n>语句序列n>[default:<语句序列n+1>]}:<i>(<语句序列n+1>除外)中的最后一个语句一般是一条break语句。switch语句的含义是:先计算<整型表达式>的值,然后判断是否存在与之相等的<整时,如果其中包含break语句,则执行到break语句就结束该分支的执行,否则,执行完<语句序列i>后,将继续执行<语句序列i+1>。...语单词(switch语句实现。#include<iostream>usingnamespacestd;intmain(){intday;cin>>day;switch(day){case0:cout<<"Sunday";break;case1:cout<<"Monday";break;case2:cout<<"Tuesday";break;case3:cout<<"Wednesday";break;case4:cout<<"Thursday";break;case5:cout<<"Friday";break;case6:cout<<"Saturday";break;default:cout<<"Inputerror";}cout<<endl;return0;}3-9解:根据历法,、、、、、、各月有 以是400的倍数。#include<iostream>usingnamespacestd;intmain()intyear,month,days;cout<<"请输入年:";cin>>year;cout请输入月:";cin>>month;switch(month){case1:case3:case5:case7:case8:case10:case12:days=31;case4:case6:case9:case11:days=30;case2:if(year%400==0||year%4==0&&year%100!=0)days=29;}

days=coutyear年month月的天数是:daysendl;return0;}值得注意的是:C++switch语句与其它一些语言中的多路选择语句(如Pascal中的case语句)有所不同。在其它一些语言的多路选择语句中,一个分支执行完后将自动结束C++switchbreakA、B、C2B、C3Cswitch语句可写成:switch{}来实现有时比if语句效率要高。x=C++提供了三种实现重复操作的循环语句:while、do-whilefor语句。这三种循whilewhile表达式语句falsetruewhile语句中,falsetrue(循环结束3-3while3-10whilen!#include<iostream>usingnamespacestd;intmain(){intn;cin>>n;inti=2,f=1循环初始化whilein{f*=}cout<<"factorialof"<<n<<"="<<f<<endl;return0;}do语句while表达式falsetruefalsetrue(循环结束3-4do-while例3-11do-while循环语句求n!。#include<iostream>usingnamespacestd;intmain(){intn;cin>>n;inti=1,f=1循环初始化{f*=whilein)cout<<"factorialof"<<n<<"="<<f<<endl;return0;}forfalsetruefor语句中,<falsetrue(循环结束3-5for语句图示也就是说,for循环语句的含义是:(23-12forn!#include<iostream>usingnamespacestd;int{intn,i,f;cin>>n;for(i=2,f=1;i<=n; f*=i; cout<<"factorialof"<<n<<"="<<f<<endl;return0;}forfor语句之前进行;<表达准备,该项工作一定是在循环体中给出的。例如,例3-12中的循环可写成:for(;i<=n{f*= }for(inti=1;i<=10i++)<语句i,C++forforiifor语句外定义,这样,for语句结束后,变量i仍然存在并可以使用。for语句的<1>C++语言的设计者倡导的一种程序设计风格:随用随定义。在这一点上,C++与其它一些语言(如:C、PASCAL等)是不同的,从本质上讲,循环可以分成两大类:计数控制的循环和控制的循环。计数控制的循环是指重复执行循环体直到指定的次数;而控制的循环是指循环前不知道循环的次计数控制循环的执行次数不依赖于循环体的执行结果;而控制的循环的执行次数要依使用三种循环语句的一般原则是:如果循环前能确定循环的次数,则用for语句;否for循#include<iostream>usingnamespacestd;intmain(){intcout请输入整数的个数:";cin>>n;cout请输入n个整数:";intsum=0;for(inti=1;i<=n;{inta;cin>>a;sum+=}cout输入的n个整数的和是:sumendl;return0;}在上述循环中,ii操作的数据来使用,如例3-12中的循环控制变量i。一般来讲,对for语句实现的计3-14计算从键盘输入的一系列整数的和,要求输入以-1是否需要执行要依赖于上一次循环操作的结果。该循环可用while语句来实现。#include<iostream>usingnamespacestd;int{intcout请输入若干个整数(以-1结束):";cin>>a;while(a!=-{sum+=a;cin>>}cout输入的整数的和是:sumendl;return0;}的准备-1时结束循环。do-while语句来实现。#include<iostream>#include<cstdlib>usingnamespacestd;intmain(){charch;cout请输入Yes或No(y/n):";cin>>ch;ch=}while(ch!='y'&&ch!='n');if(ch=='y')return}在上述程序中,tolower是C++标准库中定义的函数,其作用是把大写字母转换成小写字母。本例中的循环与例3-14的循环都包含了对读入数据的有效性进行判断,它们的区从概念上讲,whiledo-while中的循环条PASCAL)中,提供了与do-while语句类似的语句:3-16个数能整除n,则n不是素数,否则,n为素数。#include<iostream>usingnamespacestd;intmain(){intn;cin>>n;inti=2;while(i<n&&n%i!=0)i++;if(i==n)coutn是素数。endl;coutn不是素数。endl;return0;}C++for语句的结构性比较好,它可以显式地表示出:循环初始化以及准备比较明确(固定)forwhiledo-while要简洁和清晰。例3-14中的循环,虽然它不属于计数循环,但由于它的循环初始化以及下一次循环准备比较明确,因此用下面的for语句来表达更加清晰:for(cin>>a;a!=-1;cin>>a)sum+=a;表示,那么,这样的循环就不一定适合用for语句来实现了。3-17n个费波那契(Fibonacci)数。解:Fibonacci数的定义如下:fib(n)

(n(nfib(n2)fib(n (n由于根据Fibonacci数的定义很难找到一个通用的计算,因此,这个问题无法用一个表达式来解决。从Fibonacci数的定义可以看出:除了第一和第二个数外,其它每个FibonacciFibonacciFibonacci数时,必须首先计就体现为一个循环。我们可以从第三个Fibonacci数开始计算,并且,在每计算出一个Fibonacci数的同时,还要把刚算出来的(新的)和前一个Fibonacci数记下来,以便计算下一个Fibonacci数。#include<iostream>usingnamespacestd;intmain(){intn;cin>>n;intfib_1=0用于记住前一个Fibonacci数intfib_2=1;//用于记住新的Fibonacci数for(inti=3;i<=n;i++)inttemp=fib_1+fib_2;计算新的Fibonacci数fib_1=fib_2;//记住前一个Fibonacci数fib_2=temp;//记住新的Fibonacci数}cout第n个费波那契数是:fib_2endl;return0;}fib_2fib_1fib_2计算和记住新的Fibonacci数fib_1=fib_2-fib_1;//记住前一个Fibonacci数_1b_2boncibonaci(,而且程序的可读性也有所下降,但它用时间换取了空间,这对于一些内存()例3-18用迭代法求3a。解:迭代为: 1(2xax3 x3nxnxn1

(ε为一个很小的数)时,xn+1即为3a结束。每次循环操作时,xnxn+1xn#include<iostream>#include<cmath>usingnamespacestd;int{constdoubleeps=1e-6;doublea,x1,x2;cout请输入一个数:";cin>>a;x2=a;{x1=x2=}while(fabs(x2-x1)>=couta的立方根是:x2endl;return0;}3-19n的所有素数(质数要求出小于nn的数判断其是否为素数,如果是素数,则输出这个数,否则,继续判断下一个数。上述过的“依次”体现为一个循环,每次循环for(i=2;i<n;if“i“输出}#include<iostream>usingnamespacestd;intmain(){intcoutcinnfor(inti=2;i<ni+2、3、...、n-1{intwhileji&&i%j0循环:分别判断i2、3、...、i-1ifjii{cout<<i<<",";if(count%60coutendl6}}cout<<endl;return0;}上述程序包含了多重循环,其中,外层循环是一个计数循环,而内层循环是一个iii再判断它们是否为素数;其次,判断i是否为素数,j不必到循环到i-1,只需到 的数不能整除i,那么,大于 的数(小于i)也不能整除i。因iii#include<iostream>#include<cmath>usingnamespacestd;intmain(){intcinn从键盘输入一个数if(n<2)return-1;cout2<<",";//for(inti=3i<ni+=2)3、5、...{intwhile(j<=sqrt(i)&&i%j!=0)//循环:分别判断i是否能被2、3、... 整ifjsqrt(ii{cout<<i<<",";if(count%60coutendl6}}cout<<endl;return0;}C++sqrt21向前进while循环中,每次计算循环条件的表达式时,程序都要去调用函数sqrtwhile循环中,sqrt(i)的值是不变的(i的值不变每次计算sqrt(i)是多余的,只要在执行while循环前计算一次就行了:j=intwhile(j<=k&&i%j!=0)//循环:分别判断i是否能被2、3、... 整ifjki3-20求级数:1,x,x2/2!,...,xi/i!n解决上述问题的具体做法是:从键盘输入两个值,分别放在变量xn中;用一个变sum的初始值设为:1+x;然后从第三项开始计算。下面是该程序的cin>>x>>n;sum=1+x;for(i=2;i<n;i++)sum+=xi/i!;cout<<#include<iostream>usingnamespacestd;intmain(){doublex;intn;cout请输入x和n:";cin>>x>>n;doublesum=1+x;…for(inti=2;i<n;{intfor(j=2j<=i;j++a*j计算i!for(j=2;j<=i;j++)b*=x;//计算xisum+=b/a;//计算xi/i!并把它加到sum中}cout<<"x="<<x<<",n="<<n<<",sum="<<sum<<endl;return0;}a=1;b=for(j=2j<=ij++)//计算i!和{a*=j;b*=}#includeusingnamespacestd;intmain(){doublex;intn;cin>>x>>n;inta=1;double…for(inti=2;i<n;a*i;//计算i!b*=x计算sumb/a计算并把它加到sum}cout<<"x="<<x<<",n="<<n<<",sum="<<sum<<endl;return0;}#include<iostream>usingnamespacestd;intmain(){doublex;intn;cin>>x>>double…for(inti=2;i<n;item*x/i;//计算sumitem;//把xi/i!加到sum}cout<<"x="<<x<<",n="<<n<<",sum="<<sum<<endl;return0;}3不直接计算xii!xi-1/(i-1)!xi/i!,因此,对上面的问题有时能得果,而xi-1/(i-1)!的计算结果是有精度损失的,并且这样的精度损失还会不断累加。continuegoto。这些语句不太常用,但使用它们有时会给程序设计带来方便和使得程序在基于控制的循环中,有时循环条件比较复杂,以至于无法写成一个表达式或写判断i是否为素数的循环也可写成:j=k=sqrt(i);while(j<=k){if(i%j==0)break;}for语句可能更加清晰for(j=2,k=sqrt(i);j<=k;j++)if(i%j==0)break;break语句,就立即跳出(结束)break语句后面的语句将不再执行,程序继续执行循环之后的语句。在循环体中,break语句一般作为某个if语句的子句,用于实现进一步的循环控制。break语句只用于结束内层循环语句while{while{...break;}}continue语句只能用在循环语句的循环体中,其含义是:立即结束当前循环,准备进根据<表达式2>的计算结果来决定是进入下一次循环还是结束循环。#include<iostream>#include<cmath>usingnamespacestd;intmain(){intdoublecout请输入若干整数(0结束):";for(cin>>n;n!=0;cin>>n){if(n<0)continue;square_root=sqrt(n);coutn的平方根是:square_root}return}数据(cin>>n0来决定是继续下一次循环还是结束循环。breakcontinue之后的语句也将不再执行,并且,continue语句一般也作为循环体中某个if语句的子句来使用。例如,下面程序中的continue语句将立即结束本次循环,其后面的语句不再执行,直接转到循环条件判断。while{if(bcontinue;}while{if{}}while{if(b1)if(b2)if(b3)}gotogoto语句标号例3-22goto语句求n!。解:在下面的程序中,用goto#include<iostream>usingnamespacestd;intmain(){intn;cin>>n;f*=i;if(i<=n)gotocout<<"factorialof"<<n<<"="<<f<<endl;return0;}(函数体goto语句从一个函数的内部转到该函数的外部。C++goto语句不能掠过带有初始化的变量定义,例如,下面的goto语句是的:void{gotoL1;while{intx=0;L1:...gotoL2;}inty=10;L2:......}在上述程序中,两个goto语句之所以是的,是因为它们可能引起标号L1和L2break语句只能退出一层循环。while{...}while{...goto}L:;intfor(sum=0i=1i<=100;sum+=i,i1100for语句的<3>中做了,循环for语句的循环体必须是一条语句,因此,这里的{...goto}用空语句和goto语句可以来实现continuewhile{...}while{...goto}a=b=在其它一些语言中,上述程序段被认为包含三条语句(第二条语句后面有一条空语句(..Baker编写、易于阅读、易于调试、易于、易于保证和验证程序的正确性。 图3-6结构化程序的三种基本结构程序单位的单/单出口性质可以提高各程序单位的独立性,它不仅易于程序的理以只用图3-6中的三种结构来表达。gotogotoif语句可以实现所有的程序流程控制。在早期的程序设计中,goto语句被广泛地用于程序的流程控制。goto语句,计算机界曾进行过激烈的争论。其中,存在以Dijkstra为代表的HarmfulStatements致程序难以理解、可靠性下降和不容易。从结构化程序设计的角度讲,程序中的每一个结构都应该具有单/单出口的性质,而goto语句将会破坏这个性质。因此,结构化程序设计不提倡用goto语句。实际上,goto语句的使用可以分成两类,一类是向前的转移(forward,另一类是往回的转移(backwardif语句来实现;而往回while、do-whilefor这些结构化的语句来显式地表示。Modula-2)gotogoto语句,,(block否来决定是否执行某个语句或从两个语句中选择一个语句执行。switch语句(又称开关语大类:计数控制的循环和控制的循环。计数控制的循环一般用for语句来实现,而事件控制的循环常常用while或do-while语句来描述。7break、continuegoto。breakswitch语句的一个分支或循环语句的循环操作。continue语句用于结束当前循环的执行,准备进入下一次循环。goto语句用于转向带标号的语句执行。(..Bakerc5(f-32),其中,c为摄氏温度,f959751111 153=13+33+12391123922463369:::::99for(i=0;if(input_line[i]=='?')csccsc第4地方通过子程序的名字来使用(调用)它们。子程序概念在程序设计技术发展过有着down(bottom-up)4-1BBCADEF4-1程序功能的分解和抽象作用,使得程序更容易设计、理解和。数)毕竟有限,对于一些常用的、语言没有提供的功能(sin、cos等,可以一种数据传递方式是利用各个子程序都能到的变量(全局变量,调用者在调用是值传递和传递。子程序中过形式参直接用者提供数据,子序的计算果作为子序的返回值返回给调用者。值传递的长处在于它能够子程序通过形式参数来改变实在参数的通过形参间接调用者提供的数据。传递的优势在于:一方面它能够提高参数传递的效率,另一

温馨提示

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

评论

0/150

提交评论