程序设计初步讲义_第1页
程序设计初步讲义_第2页
程序设计初步讲义_第3页
免费预览已结束,剩余60页可下载查看

下载本文档

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

文档简介

1、.程序设计初步3.1算法初步及其描述方法3.1.1算法初步1.什么是算法算法是为解决一个特定问题而采取的特定的有限的步骤。广义地说,做任何事情都有算法,例如一X太极拳打法图解也可以看作是一个“太极拳算法”。因此,算法概念不限于算术问题,而是具有更广泛的含义。从计算机应用的角度来说,算法是指完成一个任务所需要的具体步骤和方法(解决问题的方案)。也就是说给定初始状态或输入数据,经过计算机程序的有限次运算,能够得出所要求或期望的终止状态或输出数据。【算法3.1】给定两个正整数p和q,求其最大公因数。古希腊数学家欧几里德给出的算法:步骤1:如果p<q,交换p和q。步骤2:求p/q的余数r。步骤3

2、:如果r=0,则q就是所求的结果。否则反复做如下工作:令p=q,q=r,重新计算p和q的余数r,直到r=0为止,则q就是原来的两正整数的最大公因数。算法常常含有重复的步骤和一些比较或逻辑判断。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。从原则上说,有了算法,人们就可以借助纸、笔和算盘等工具直接求解问题了。但如果问题比较复杂,计算步骤很多,则应通过编写计算机程序,使用计算机解决。2.算法的特征算法是在有限步骤内求解某一问题所使用的一组定义明确的规则。通俗点说,就是

3、计算机解题的过程。在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法。前者是推理实现的算法,后者是操作实现的算法。一个算法应该具有以下五个重要的特征:(1)有穷性:一个算法必须保证执行有限步之后结束。(2)确切性:算法的每一步骤必须有确切的定义。(3)输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定义了初始条件。(4)输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的。(5)可行性:算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。3.算法的类型和结构(1)算法的类型算法可分为两大类:数值算

4、法和非数值算法。数值算法是为数学问题形成一个构造性解法的完备而确切的描述,并规定方法中仅允许使用加、减、乘、除等基本的算术运算。非数值算法广泛应用在“数据处理”的场合。需要对大量的信息(数据)进行加工处理,包括转换、分类、查找、排序和存储等。常用的算法有穷举、递推、顺序查找和冒泡排序等。(2)算法的结构一个算法是由“结构”和“原操作”构成的。原操作包括:输入、输出、赋值和比较等。算法的三种基本结构是:顺序结构、分支结构和循环结构。用这三种基本结构可以表示任意一个复杂的算法。顺序结构顺序结构是指通过安排操作的排列顺序来决定算法流程的结构。在这种结构中,各个操作是依次执行的。顺序结构是由若干个依次

5、执行的处理块组成,这是任何一个算法都离不开的基本主体结构。分支结构在绝大多数情况下,算法不会按部就班地从第一条操作执行到最后一条操作,往往由特定的条件决定执行哪个操作,这就是分支结构。分支结构是以条件或情况的判断为起始点,它是人脑判断思维活动的抽象。最基本的分支结构是二分支结构,根据判断逻辑是否成立而决定选择哪一边的处理块去执行。循环结构循环结构是指在算法设计中,从某处开始有规律地反复执行某一处理块,这个处理块称为循环体。循环体的执行次数由一个控制循环条件决定。满足条件反复做,不满足则停止。3.1.2算法的描述工具设计一个算法可以根据问题的不同需要用某种语言符号来描述。目前最常用的几种算法描述

6、工具有:自然语言、流程图、N-S图、伪代码等。1.自然语言自然语言就是人们日常使用的语言,可以是中文、英文等。用自然语言表示的算法通俗易懂,但一般篇幅较冗长,表达上不易准确,易引起理解上的“歧义性”(即对同一段文字,不同的人会有不同的理解)。【算法3.2】输入3个数,求其最大数。分析:该算法可以使用分支结构表示。设num1,num2,num3存放3个数,max存放其最大值。为求其最大数,只要对3个数进行比较,可按如下步骤去做:S1:输入3个数num1,num2,num3;S2:先把第1个数num1的值赋给max;S3:将num2与max比较,如果num2>max,则把num2的值赋给ma

7、x,否则,不做任何事情。S4:将num3与max比较,如果num3>max,则把num3的值赋给max,否则,不做任何事情。S5:输出max的值,即最大值。【算法3.3】求1+2+3+100。分析:该算法可以使用循环结构表示。设n存放1到100之间的整数,sum存放1到100的和,即sum=1+2+3+100,可按如下步骤去做:S1:进行初始化,1=>n,0=>sum;S2:sum+n=>sum;S3:n+1=>n;S4:进行判断,n是否小于等于100,如果条件为真,则返回S2,否则执行S5;S5:输出sum的值。2.流程图流程图是用一组规定的图形符号、流程线和文

8、字说明来表示算法,它直观形象,易于理解。流程图的特点是用“流线”给算法执行中的每一个步骤指定了逻辑上的顺序,因此能把程序执行的控制流表达得十分清楚。但如果使用不当会使程序的流程出现缠绕,不利于结构化程序设计的实施。流程图符号见图3-1。【算法3.4】用流程图描述算法3.2(如图3-2)。【算法3.5】用流程图描述算法3.3(如图3-3)。3.N-S图N-S图也是描述算法的常用工具。与流程图相比,N-S图完全去掉了流程图中的流线和箭头,因此能用N-S图表示的算法,必是结构化的算法。【算法3.6】用N-S图描述算法3.2(如图3-5)。【算法3.7】用N-S图描述算法3.3(如图3-6)。4.伪代

9、码伪代码是一种算法描述语言,使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言实现。因此,伪代码必须结构清晰,代码简单,可读性好,并且类似自然语言。【算法3.8】用伪代码描述算法3.2。INPUTnum1,num2,num3num1=>maxIFnum2>maxTHENnum2=>maxIFnum3>maxTHENnum3=>maxPRINTmax【算法3.9】用伪代码描述算法3.3。1=>n,0=>sumwhile(n<=100)sum+n=>sum;n+1=>n;printsum3.1.3算法和程序设计前面介绍了如何

10、描述算法,但计算机是无法识别流程图和伪代码的,只有用计算机语言编写的程序,经编译成目标程序后,才能被计算机执行。因此,用任何方法描述的算法,还得要将它转化成计算机语言程序。程序设计是人关于现实问题求解的思维活动的“代码化”过程,是用计算机语言作为工具进行的创造性劳动。编程序的一个主要内容就是如何将解决应用问题所使用的算法用程序设计语言来描述。1.程序设计的一般步骤(1)分析问题根据用户的具体要求,进行需求分析、数据及处理分析、可行性分析、运行环境分析。然后在分析的基础上,将实际问题抽象化,建立相应的数学模型并确定解决方案。读者在初学程序设计的时候,教科书中的例题都比较简单,从这些简单的例题中读

11、者很难体会到分析问题的作用。而且题目本身往往已经对需要解决的问题做了清楚准确的描述。但尽管如此,我们也不应直接开始编程,而应该首先进行问题分析。(2)确定算法根据选取的数学模型和确定的方案,设计出具体的操作步骤,并可以通过流程图等描述算法的工具将确定的算法清晰、直观的表示出来。(3)编写程序选用合适的开发平台和程序设计语言,将算法按所选语言的规则描述出来,即形成程序设计语言编制的源程序。(4)调试运行程序对编写好的程序进行试运行和检验,发现问题立即对程序进行修改,然后再试运行和检验,直至得出正确的结果。(5)建立文档资料整理分析计算结果,并建立相应的文档资料(程序技术说明书、用户使用说明书等)

12、,以便维护和修改。2.结构化程序设计方法结构化的程序设计方法的要点如下:(1)程序的质量标准是“清晰第一,效率第二”。(2)程序的设计采用“自顶向下,逐步求精,模块化设计,结构化编程”的方法。(3)程序的结构仅由顺序、分支、循环三种基本结构的组合、嵌套而成,且满足:·每个程序模块只有一个入口和一个出口;·没有死语句(永远执行不到的语句);·没有死循环(永远不能终止的循环);(4)程序的书写必须按一定的规X和格式进行(参见附录部分)。(5)程序的设计风格要以好的可读性为标准,力求外观美观、结构流畅、语句简洁。3.2基本计算3.2.1数据类型在C+中,数据具有不同的类

13、型,类型定义了变量可存储的数值X围以及可进行的操作。变量是用于内存中保存数据的,每个变量都必须有确定的数据类型,C+语言的数据类型如图3-7所示。说明:基本数据类型前可以添加修饰符,以改变基本类型的意义,可用的修饰符有long、short、signed和unsigned四种,其中,unsigned和signed只用于修饰char和int,且signed修饰词可以省略。当用unsigned修饰词时,后面的类型说明符可以省略。另外,双精度型前可以加long修饰符。基本的数据类型及其表示X围,可参见表3-1。当多种类型的数据进行混合运算时,往往需要进行类型转换,将它们转换为相同的类型,即较低类型转换

14、为较高类型,然后再参加运算,转换规则如图3-8。注:其中,type表示一种非void的数据类型。图3-7C+数据类型表3-1基本的数据类型及其表示X围类型名类型字节表示X围char字符型1-128127unsignedchar无符号字符型10255int整型4-2,147,483,6482,147,483,647unsignedint无符号整型404,294,967,295short短整型2-32,76832,767unsignedshort无符号短整型2065,535long长整型4-2,147,483,6482,147,483,647unsignedlong无符号长整型404,294,96

15、7,295float浮点型43.4E+/-38(7位有效数字)double双精度型81.7E+/-308(15位有效数字)longdouble长双精度型101.2E+/-4932(19位有效数字)图中横向的箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转换成double型再进行运算,结果亦为double型。纵向箭头表示当运算符两边的操作数为不同类型时的转换,如一个long型数据与一个int型数据一起运算,需要先将int型数据转换为long型,然后两者再进行运算,结果为long型。所有这些转换都是由系统自动进行的,因此也称为隐式转换。*include<iost

16、ream>usingnamespacestd;intmain(void)chara='x'intb=3;intf=2;floatc=2.5678;doubled=5.2345;longe=32L;cout<<a-b+d/c-e*f<<endl;return0;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

17、75;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

18、75;¯¯¯¯¯下面我们来分析一下这段程序:(1)进行d/c运算时,要将c转换成double型,运算的中间结果为double型;(2)进行e*f运算时,将f转换为long型,运算的中间结果为long型;(3)进行a-b运算时,将a转换为int型,运算的中间结果为int型;(4)当(3)的中间结果与(1)的中间结果运算时,将(3)的中间结果转换为double型,运算的中间结果为double型;(5)当(4)的中间结果与(2)的中间结果运算时,将(2)的中间结果转换为double型,得出最后结果。程序最后的运行结果为:程序所处理的数据不仅分为不同的

19、类型,而且每种类型的数据还有常量和变量之分。接下来,我们详细讨论各种基本类型的数据。3.2.2变量在程序执行过程中其值可以变化的量称为变量。变量是需要用名字来标识的,其命名规则与标识符相同。为了提高程序的可读性,给变量命名时,应该注意使用有意义的名字,以帮助描述变量所保存的值。例如:要用一个变量保存工资总额,可以使用total_payroll,也可以使用XYZ作变量名,它们都是合法的名字。但使用前者比使用后者就更好,因为从变量名就能大致知道它保存了什么样的值,便于使用。在使用一个变量之前,必须先定义。变量的定义的一般格式如下:数据类型变量名1=初始值1,变量名2=初始值2,.;“数据类型”是指

20、C+有效的数据类型,如int、double、long等。方括号中的内容是可选的,它是在变量定义时给变量赋初值。下面是几个变量定义的实例:longn;/定义了一个长整型变量n,未赋初值doublea,b=0.5;/定义双精度型变量a、b,a未赋初值,b的初值为0.5下面是一个使用变量的程序实例。*include<iostream>usingnamespacestd;intmain(void)intworkDays=5;/定义了一个整型变量workDays,并初始化为5,表示一周的工作天数。floatworkHours,payRate,weeklyPay;/定义了三个实型变量,分别表示

21、每天工作的小时数、每小时应支付的薪水及每周应支付的薪水。workHours=7.5;payRate=38.55;/两个赋值语句。7.5赋给变量workHours,38.55赋给变量payRate。weeklyPay=workDays*workHours*payRate;/计算每周的工资,即三个变量workDays、workHours、payRate的积,*是乘运算符,结果保存在变量weeklyPay变量中。cout<<"WeeklyPay="<<weeklyPay<<'n'/输出字符串"WeeklyPay=&qu

22、ot;、变量weeklyPay的值和换行符。return0;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

23、¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯本程序的运行结果如下:注意:我们定义一个变量时,如果没有给它赋初值,它的值是不定的。例如,在上面的第四行执行前,weeklyPay的值是不定的。因此,变量第一次赋值称之为初始化,变

24、量在使用之前应当先初始化。下面分别介绍各种类型的变量。1.整型整型变量可用short、int、long定义,可以表示正整数、负整数和零。缺省的情况下,整型变量假定为有符号的,但是,使用unsigned关键字,也可以把整型变量定义为无符号的。整型是常用的一种数据类型,但是,它的大小是不固定的。整数能存储的最大值是由计算机给它分配的存储空间的大小决定的,而整数所占的存储空间因不同的计算机而异。当一个整数存储在计算机中时,左起第一位叫做第0位,即符号位,它用来表示该数是正数或负数。如果是负数,符号位被置1,正数则为0。例如,某种计算机可能用16位(两个字节)来存储一个整数,能表示的整数X围是-327

25、6832767。如图3-9。2.实型实型变量分为单精度(float)型、双精度(double)型和长双精度(longdouble)型三类。有关规定见表3-2。表3-2实型数据类型比特数有效数字数值X围float32673.4×10-383.4×1038double6415161.7×10-3081.7×10308longdouble12818191.2×10-49321.2×104932一个实型数据一般在内存中占4个字节(32位)。与整型数据的存储方式不同,实型数据是按照指数形式存储的。系统把一个实型数据分成小数部分和指数部分分别存放

26、,小数部分采用规X化的指数方式表示。实数3.14159在内存中的存放形式如图3.10示意。3.字符型字符变量用char定义,表示用单引号括起来的一个字符,如'a','D','"','$'等。另外,还有一些字符是不可显示字符,也无法通过键盘输入,例如响铃、换行、制表符、回车等。这样的字符变量该如何写到程序中呢.C+提供一种称为转义序列的表示方法来表示这些字符,表3-3列出了C+预定义的转义序列。表3-3C+预定义的转义序列字符常量形式ASCII码含义a07响铃n0A换行t09水平制表符v0B垂直制表符b08退格r0D回车5

27、C字符“”22双引号27单引号一个字符变量仅占用一个字节,存放该字符的ASCII码,如图3-11所示。例如:字符'A'的ASCII码为65,字符'a'的ASCII码为97。象整型数一样,字符变量也可被指定为signed或unsigned。一个有符号字符变量可以保存-128127之间的整数,而一个无符号字符变量可以保存0255之间的整数,它们均可用于表示小整数,象整型数一样赋值,例如:signedcharoffset=-88;unsignedcharrow=2,column=26;C+语言把字符型变量当作整型量一样使用,下面举例说明:*include<ios

28、tream>usingnamespacestd;intmain(void)charc1='a'charc2='b'charc3,c4;c3=c1-('a'-'A');c4=c2-('a'-'A');cout<<c3<<c4<<endl;return0;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

29、75;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

30、75;¯¯¯¯¯¯¯¯¯¯¯¯运行结果为:程序中的'a'-'A'是大小写字母之间的差值,其值为32。所以我们也可以把程序写成:c3=c1-32;c4=c2-32;如果我们想看一看c3、c4中到底存储的值是多少,可以这样:cout<<(int)c3<<(int)c4<<endl;其运行结果为:6566注意:在内存中,字符数据以ASCII码存储,即以整数表示,因此,'0'和0是不同的。4.布尔型布

31、尔类型变量用bool定义,其值为true或false,true和false都是C+的关键字。整型值也可赋给bool变量,但会被隐式转换成true或false。转换规则如下:整型值非0时,转换为true,整型值为0时,转换为false。同样,布尔值也可赋值给整型变量,但要进行隐式转换,转换规则为:布尔值为true时,转换为1,布尔值为false时,转换为0。所有的条件表达式返回类型都是bool型,比如n!=0(!=是“不等于”运算符,我们在本章后面要介绍)根据不同的n,返回true或false。3.2.3常量常量就是在程序运行过程中其值不发生变化的量。常量可分为直接常量与符号常量。直接常量就是平

32、常我们所说的常数,例如:'r'为字符型直接常量,3.1415926为双精度直接常量。符号常量就是用一个标识符代表某个常量。符号常量可用关键字const声明,其格式如下:const数据类型常量名常数值;例如:constinta=1234;/定义a为整型常量,其值为1234。constcharb='a'/定义b为字符型常量,其值为'a'。在程序设计中,尽量使用符号常量来代替常数,这是一种好的编程习惯,这样可以增加程序的可读性、可维护性。例如,在数值计算中,我们会经常遇到一些常量,比如圆周率,如果把它定义成符号常量,当需要更改常量值的时候,只需要更改符

33、号常量的定义语句即可。也可以使用预处理语句定义符号常量,例如:*definePI3.14159定义符号常量PI,然后在程序中使用PI,跟使用常数3.14159的效果是一样的。编译器在编译时,把符号PI替换成3.14159,当需要修改PI的值时,只需要修改上面的语句即可。但是我们不推荐这样做,因为在编译时使用常数替代了所有的预定义符号,这样在代码中相应位置实际都是常数。程序中过多的常数会导致程序代码量变大,而且在多个源文件中定义了同样的符号,会产生符号重定义的问题。由于大部分内容在变量的相关内容中介绍了,下面简单介绍各种类型的常量。1.整型常量整型常量即以文字形式出现的整数,包括正整数、负整数和

34、零。一个整型常量,例如2007,总是被假定为int类型,除非有L或l后缀,才被处理为longint类型。例如2007L,2007l。同样,一个整型数也可以加U或u后缀,指定为unsigned类型。例如2007U,2007u。整型常量的表示形式有10进制、8进制和16进制。如果一个整型数有前缀0,则表示是8进制数,有前缀0x或0X,表示是16进制数。例如:92(十进制),0134(8进制),0x5C(16进制)。其中,8进制数只能使用数字07,16进制数可用09及AF(或af)表示。2.实型常量实型常量即以文字形式出现的实数,实数有一般形式和指数形式两种表示形式。一般形式:例如,12.5,-12

35、.5等。指数形式:例如,0.345E+2表示0.345×102,其中字母E可以大写或小写。一个实型数,如0.06总是假定为double型,除非有F或f后缀,才被处理为float型。若有L或l后缀,则被处理为longdouble型。3.字符型常量字符常量可以表示用一对单引号括起来的普通字符及转义字符(转义序列)。4.字符串常量字符串常量简称字符串,是用一对双引号括起来的字符序列,例如,"abcd","China","Thisisastring."都是字符串常量。由于双引号是字符串的界限符,所以字符串中间的双引号就要用转义序列来

36、表示。例如,"Pleaseenter"Yes"or"No"则表示的是下列文字:Pleaseenter"Yes"or"No"字符串与字符是不同的,它在内存中的存放形式是:按串中字符的排列次序顺序存放,每个字符占一个字节,并在末尾添加'0'作为结尾标记。需要注意的是:(1)不要把字符与字符串混淆了。例如:"A"与'A'不等价,前者由两个字节组成(字符'A'与字符'0'),而后者只有一个字节。(2)最短的字符串是空字符串(&qu

37、ot;),它仅由一个结尾符'0'组成。5.布尔常量布尔常量只有两个:false(假)和true(真)。3.2.4运算符与表达式到现在为止,我们了解了C+语言中各种类型数据的特点及其表示形式。那么如何对这些数据进行处理和计算呢.通常当我们要进行某种计算时,都要首先列出算式,然后求解其值。利用C+语言编写程序求解问题时也是这样。在程序中,表达式是计算求值的基本单位。可以简单地将表达式理解为用于计算的公式,它由运算符(例如:+-*/)、运算量(也称操作数,可以是常量、变量等)和括号组成。执行表达式所规定的运算,所得到的结果值便是表达式的值。例如,a+b,x/y都是表达式。下面我们给表

38、达式下一个定义,读者如果不能够完全理解也不要紧,表达式在程序中无处不在,而且接下来我们还要详细讨论各种类型的表达式,用得多了自然也就理解了。表达式可以被定义为:·一个常量或标识对象的标识符是一个最简单的表达式,其值是常量或对象的值。·一个表达式的值可以用来参与其他操作,即用作其他运算符的操作数,这就形成了更复杂的表达式。·包含在括号中的表达式仍是一个表达式,其类型和值与未加括号时的表达式相同。C+语言中定义了丰富的运算符,如算术运算符、关系运算符、逻辑运算符等等。有些运算符需要两个操作数,使用形式为:操作数1运算符操作数2这样的运算符称为二元运算符(或双目运算符)

39、。另一些运算符只需要一个操作数,称为一元运算符(或单目运算符)。下面就来详细讨论各种类型的运算符和表达式。1.算术运算符与算术表达式()算术运算符C+提供5种基本的算术运算符,参见表3-4。表3-4算术运算符运算符名称实例+加12+4.9/得出16.9-减3.98-4/得出-0.02*乘2*3.4/得出6.8/除9/2.0/得出4.5%取余13%3/得出1说明:这5个算术运算符都是双目运算符。其中,“%”是取余运算,只能用于整型操作。其它算术运算符的两个操作数可以是整型和实型的混合类型,运算结果的数据类型是两个操作数的数据类型中具有较高级别的数据类型。当除运算符(/)的两个操作数均为整数时,所

40、得的结果总是被化为整数。例如:9/2/得出4,不是4.5!-9/2/得出5,不是-4!另外,C+还提供了“+”运算符和“”运算符,其中“+”是自增运算符,“”是自减运算符,这两个运算符都是单目运算符,且功能相近,都是将数值变量的值加1或减1,用户只能将这类操作符应用于变量而不能应用于常量。例如可以将下列代码:valuel=valuel+1;替换为+valuel;或valuel+;假设value的初值为15,参见表3-5。我们可以看出,自加和自减运算符可在变量名前,也可在变量名后,即都可以用于前缀和后缀的形式,但含义并不相同。对于前缀的形式,变量先作自加或自减运算,然后将运算结果用于表达式中;而

41、对于后缀的形式,变量的值先在表达式中参与运算,然后再作自加或自减运算。表3-5自加和自减运算符运算符名称实例+自加(前缀)+valuel+10/得出26,valuel变为16+自加(后缀)valuel+10/得出25,valuel变为16-自减(前缀)-valuel+10/得出24,valuel变为14-自减(后缀)valuel-+10/得出25,valuel变为14例如:a=6;b=a+;执行结果为:b=6,a=7而a=6;b=+a;执行结果为:b=7,a=7。自减运算符也存在同样情况,例如:a=6;b=a-;执行结果为:b=6,a=5.而a=6;b=-a;执行结果为:b=5,a=5.()算

42、术表达式算术表达式是由算术运算符组成的表达式,其表达式的值是一个数值。表达式的类型具体地由运算符和操作数决定。*include<iostream>usingnamespacestd;intmain(void)inta,b,m=3,n=4;a=7*2+-3%5-4/3;/-3%5=-3,4/3=1b=m+-n;cout<<a<<"t"<<b<<"t"<<m<<"t"<<n<<endl;return0;¯¯

43、75;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

44、75;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯执行结果如下:2.关系运算符与关系表达式()关系运算符C+提供6种关系运算符,用于数值之间的比较,表达式的值或为1(表示true),或为0(表示false),参见表3-6。表3-6关系运算符运算符名称实例=等于5=5/得出1!=不等于5!=5/得出0<小于5<

45、;5.5/得出1<=小于或等于5<=5/得出1>大于5>5.5/得出0>=大于或等于6.3>=5/得出1注意:字符串不应当用关系运算符比较,因为被比较的不是字符串的内容本身,而是字符串的地址。例如:"Wele"<"Beijing"引起"Wele"的地址与"Beijing"的地址进行比较。由于字符串的地址是由编译器决定的,所以,表达式的结果或为假,或为真,并不确定。我们以后会看到:可以用C+的库函数strcmp,比较两个字符串。()关系表达式由关系运算符组成的表达式为关系表达

46、式。关系表达式的运算结果为逻辑型,即bool型。在C+中常常将逻辑真用非0表示(一般为1),逻辑假用0表示。常用在条件语句和循环语句中。*include<iostream>usingnamespacestd;intmain(void)charx='m',y='n'intn;n=x<y;cout<<n<<endl;n=x=y-1;cout<<n<<endl;n=('y'!='Y')+(5<3)+(y-x=1);cout<<n<<endl;

47、return0;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

48、5;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯程序执行结果为:通过上面的程序可以看出:关系运算的结果为真时值等于1,结果为假时值等于0。3.逻辑运算符和逻辑表达式()逻辑运算符C+提供了3种逻辑运算符,参见表3-7。如同关系运算符,用逻辑运算符组成的表达式的值或为1(表

49、示true),或为0(表示false)。逻辑非(!)是单目运算符,它将操作数的逻辑值取反。即:如果操作数是非零,它使表达式的值为0;如果操作数是0,它使表达式的值为1。逻辑与(&&)与逻辑或(|)的含义,参见表3-8。下面是一些有效的逻辑表达式:!20/得出010&&5/得出110|5.5/得出110&&0/得出0表3-7逻辑运算符运算符名称实例!逻辑非!(5=5)/得出0&&逻辑与5<6&&6<6/得出0|逻辑或5<6|6<5/得出1表3-8逻辑与(&&)和逻辑或(|)运算

50、运算符操作数1操作数2表达式的值逻辑与(&&)TruetruetrueFalsetruefalseTruefalsefalseFalsefalsefalse逻辑或(|)TruetruetrueFalsetruetrueTruefalsetrueFalsefalsefalse()逻辑表达式由逻辑运算符组成的表达式称为逻辑表达式。逻辑表达式的值为逻辑型,结果为1和0。C+规定:在由&&和|运算符组成的逻辑表达式中,当计算出一个子表达式的值之后便可确定整个逻辑表达式的值时,后面的子表达式就不需要再计算了,整个表达式的值就是该子表达式的值。这种表达式也称为短路表达式。例

51、如:inta=3,b=0;该表达式运算后a和b的值是多少.(1)!a&&a+b&&a+(2)!a|a+|b+分析:第一题:这是一个由&&组成的逻辑表达式,从左至右计算三个子表达式,只要有一个为0就不再计算其他子表达式。当计算!a的值为0时,便可确定整个表达式的值为0,因此后面的子表达式就不再计算了。所以a的值为3,b的值为0。第二题:这是一个由|组成的逻辑表达式,从左至右计算三个子表达式,只要有一个结果为真则不再计算后面的子表达式。第一个子表达式为!a结果为0,再计算a+结果为4,所以就不再计算后面的子表达式。所以结果a为4,b为0。4.赋值运算

52、符和赋值表达式()赋值运算符=是赋值运算符,它的作用是将等号右边表达式的值赋给等号左边的对象。例如:inta,b,c;a=3;b=4;c=(a+b)*(2*a-b)/得出14除了“”以外,赋值运算符还可与算术运算符组合,产生复合赋值运算符,参见表3-9(假定n是一个整型变量)。表3-9赋值运算符运算符实例等价于=n=25+=n+=25n=n+25-=n-=25n=n-25*=n*=25n=n*25/=n/=25n=n/25%=n%=25n=n%25()赋值表达式由赋值运算符组成的表达式为赋值表达式。赋值运算符除了“=”之外还有+=,-=,*=,/=,%=等复合运算符。赋值运算符的结合性是由右至

53、左,因此,C+程序中允许出现连续赋值的情况。例如:inta,b,c,d;a=b=c=d=5/2;这里先计算5/2结果为2,再赋值给d,结果d=5/2表达式的值为2,再将这个值赋给c,以此类推,结果a、b、c、d的值均为2。在计算复合赋值运算符表达式中,首先计算右值表达式的值后再与左值运算。例如:inta=3,b=4;a*=b+1;这里先计算b+1等于5,再与a相乘赋值给a,结果等于15。5.条件运算符与条件表达式()条件运算符条件运算符是C+中唯一的三目运算符,也称为三元运算符,它有三个操作数,格式为:操作数1"操作数2:操作数3操作数1一般是条件表达式,若表达式成立,即为真,则整个

54、表达式的值为操作数2,否则为操作数3。例如:('A'<=ch&&ch<='Z')"('a'+ch-'A'):ch结果是一个小写字母。例如:intm=1,n=2;intmin=(m<n"m:n);/min取1()条件表达式由三目运算符":组成的表达式为条件表达式。例如a>b"x=4:x=9;条件表达式的值取决于.前面的表达式的值,该表达式的值为非0时,整个表达式的值为“:”前面的表达式的值,否则为“:”后面的表达式的值。*include<iostr

55、eam>usingnamespacestd;intmain(void)inta=3,b=4,c;c=a>b"+a:+b;cout<<a<<","<<b<<","<<c<<endl;c=a-b"a-3"b:b-a:a;cout<<a<<","<<b<<","<<c<<endl;return0;¯¯¯

56、75;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

57、75;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯该程序执行的结果为:6.逗号运算符与逗号表达式多个表达式可以用逗号组合成一个表达式,即逗号表达式。逗号表达式的一般形式是:表达式1,表达式2,表达式n,它的值是取表达式n的值。逗号表达式是用逗号将若干个表达式连起来组成的表达式。该表达式的值是组成逗号表达式的若干个表达式中的最后一个

58、表达式的值,类型也是最后一个表达式的类型。逗号表达式的计算顺序是自左至右。*include<iostream>usingnamespacestd;intmain(void)inta,b,c;a=1,b=2,c=a+b+3;cout<<a<<','<<b<<','<<c<<endl;c=(a+,a+=b,a-b);cout<<a<<','<<b<<','<<c<<endl;ret

59、urn0;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯&

60、#175;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯输出结果如下:7.求字节数运算符C+提供了求字节的运算符sizeof,它是一个单目运算符,用于计算表达式或数据类型的字节数,其运算结果与不同的编译器和机器相关。当我们进行算术运算时,如果运算结果超出变量所能表达的数据X围时,就会发

61、生溢出。而利用sizeof运算符计算变量所占的字节数,也就是说,可以算出变量的数据X围,从而可以避免可能出现的错误。8.优先级和结合性当不同的运算符混合运算时,运算顺序是根据运算符的优先级而定的,优先级高的运算符先运算,优先级低的运算符后运算。在一个表达式中,如果各运算符有相同的优先级,运算顺序是从左向右,还是从右向左,是由运算符的结合性确定的。所谓结合性是指运算符可以和左边的表达式结合,也可以与右边的表达式结合。C+运算符的优先级和结合性参见表3-10。表中有一些运算符,我们还没有介绍,以后我们会在有关的内容中学习。表3-10C+运算符的优先级和结合性优先级运算符种类结合性最高()->

62、.双目从左到右+-+-!*&newdeletesizeof(类型)单目从右到左->*.*双目从左到右+/%双目从左到右+双目从左到右<<>>双目从左到右<<=>>=双目从左到右=!=双目从左到右&双目从左到右双目从左到右|双目从左到右&&双目从左到右|双目从左到右":三目从左到右=双目从右到左最低,双目从左到右9.类型转换当表达式中出现了多种类型数据的混合运算时,往往需要进行类型转换。表达式中的类型转换分为显式转换和隐式转换。() 显式转换(强制类型转换)显式转换是通过类型名和括号来实现的,一般形式

63、为:(类型名)(表达式)显式转换的作用是将表达式的结果类型转换为类型名所指定的类型。例如:(int)3.14/3.14转换成整型数3(long)3.14/3.14转换成长整型数3L(double)2/2转换成双精度数2.0(char)122/122转换成ASCII码为122的字符(unsignedshort)3.14/3.14转换成无符号整型数3如果类型名仅为一个单词,显式类型转换的形式也可以写成:类型表示符(表达式)。例如:int(3.14)等价于(int)3.14需要注意的是:(int)(x+y)是将(x+y)转换为int型,而(int)x+y是将x转换为int型后再与y相加。显式类型转换

64、只是得到一个所需类型的中间变量,原来变量的类型并不发生变化。()隐式转换(自动类型转换)在一般情况下,各种数据都按默认类型参与运算,当两个不同的数据类型进行运算时,数据将进行自动类型转换,转换后再参与运算。自动类型转换也称为隐式转换(见3.2.1)。3.2.5基本输入和输出C+语言本身并不带输入和输出(即I/O)功能,而是提供了输入输出库,也称为I/O库。通过I/O库,我们可以完成输入和输出的操作。大多数C程序使用一种称为stdio的标准I/O库,该库也能够在C+中使用。但是,在C+程序中,一种称为iostream(I/O流库)的I/O库用得更多。标准的输出流(通常是屏幕)称为cout,标准的

65、输入流(通常是键盘)称为cin。在C+中,I/O使用运算<<和>>,<<与cout结合用于输出,>>与cin结合用于输入。要使用C+标准的I/O流的功能,必须包括头文件iostream.h。iostream.h中预定义了四个全局的流对象:cout、cerr、clog和cin,用于标准输出和输入,cout和cin在程序设计中会经常用到。1.用cout输出()输出流的使用输出流cout与运算符<<一起使用,其格式如下:cout<<表达式1<<表达式2<<<<表达式n;例如:cout<&

66、lt;"您好,世界!"/输出“您好,世界!”到屏幕上cout<<120;/输出数字120到屏幕上cout<<x;/输出变量x的值到屏幕上运算符“<<”又叫插入运算符,因为它将后面所跟的数据插入到它前面的数据流中。在以上的例子中,字符串常量"您好,世界!"、120、变量x先后被插入输出流cout中。每当我们使用字符串常量的时候,必须用引号把字符串引起来,以便将它和变量名明显的区分开来。例如,下面两个语句是不同的:cout<<"Hello"/将字符串常量"Hello"输出

67、到屏幕上cout<<Hello;/将变量Hello的值输出到屏幕上插入运算符“<<”可以在同一语句中被多次使用:cout<<"Hello,"<<"Iam"<<"aC+sentence!"上面这一行语句将会在屏幕上输出:Hello,IamaC+sentence!()换行符的使用必须注意,除非我们明确指定,cout并不会自动在其输出内容的末尾加换行符,因此下面的语句:cout<<"Thisisasentence."cout<<"

68、;Thisisanothersentence."将会有如下内容输出到屏幕:Thisisasentence.Thisisanothersentence.虽然我们分别调用了两次cout,两个句子还是被输出在同一行。所以,为了在输出中换行,我们必须插入一个换行符来明确表达这一要求。在C+中换行符可以写作n。cout<<"Thisisasentence.n"cout<<"Thisisanothersentence."将会产生如下输出:Thisisasentence.Thisisanothersentence.另外,也可以用操作符

69、endl来换行,例如下面两行语句也会实现换行输出:cout<<"Firstsentence."<<endl;cout<<"Secondsentence."<<endl;()格式输出在输出数据时,为简便起见,往往不指定输出的格式,由系统根据数据的类型采取默认的格式,但有时希望数据按指定的格式输出,有两种方法可以达到此目的。使用控制符控制输出格式表3-11常用的I/O流控制符控制符含义dec设置整数的基数为10hex设置整数的基数为16oct设置整数的基数为8setw(n)设置字段宽度为nsetprecision(n)设置实数的精度为nsetioflags(ios:left)输出数据左对

温馨提示

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

评论

0/150

提交评论