《Visual_C++_实用教程(第3版)》ppt课件_第1页
《Visual_C++_实用教程(第3版)》ppt课件_第2页
《Visual_C++_实用教程(第3版)》ppt课件_第3页
《Visual_C++_实用教程(第3版)》ppt课件_第4页
《Visual_C++_实用教程(第3版)》ppt课件_第5页
已阅读5页,还剩777页未读 继续免费阅读

下载本文档

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

文档简介

.,第1章基本C+语言,C+是在20世纪80年代初期由贝尔实验室设计的一种在C语言的基础上增加了对面向对象程序设计支持的语言,它是目前应用最为广泛的编程语言。本章先来说明C+程序结构,然后详细讨论数据类型、运算符与表达式、基本语句、函数和预处理、构造类型、指针和引用等内容。需要说明的是,在学习本章之前最好先做实验1。1.1C+程序结构同其他程序设计语言一样,C+也有自己的程序结构。,.,1.1.1几个C+程序,下面先来介绍几个比较简单的C+程序。例Ex_Simple1一个简单的C+程序#includestdafx.h/*C+程序的基本结构*/#includevoidmain()doubler,area;/声明变量coutr;/从键盘上输入变量r的值area=3.14159*r*r;/计算面积cout圆的面积为:arean;/输出面积,.,1.1.1几个C+程序,例Ex_Simple2在屏幕上输出一个由星号形成的三角形/输出星号的三角形阵列#includevoidDoDraw(intnum);/声明一个全局函数voidmain()intnum=5;/定义并初始化变量DoDraw(num);/函数的调用voidDoDraw(intnum)/函数的定义for(inti=0;inum;i+)/循环语句for(intj=0;j=i;j+)cout*;coutn;主函数main和被调用的函数DoDraw。DoDraw函数是在屏幕上输出星号的三角形阵列,这个阵列的行数以及每行星号的个数由num决定。结果如下:,.,1.1.1几个C+程序,例Ex_Simple3用类的概念重写例Ex_Draw#includeclassCDrawArray/定义一个类public:voidDoDraw(intnum);/声明类的公有成员函数;voidCDrawArray:DoDraw(intnum)/成员函数的实现for(inti=0;inum;i+)for(intj=0;j=i;j+)cout*;coutn;voidmain()intnum=5;CDrawArraymyDraw;/定义类的一个对象myDraw.DoDraw(num);/调用此对象的成员函数虽然本程序的作用和例Ex_Simple2是一样的,但它引用了类的概念,是一个面向对象的C+程序。程序中class后的名称是要定义的类名,该类仅声明了一个公共类型的成员函数DoDraw。调用时,先定义该类的对象,然后像myDraw.DoDraw(num)语句那样调用。,.,1.1.2C+程序的基本组成,从上面的几个例子可以看出,一个C+程序往往由预处理命令、语句、函数、变量和对象、输入与输出以及注释等几个基本部分组成的。(1)预处理命令。(2)语句。(3)函数。(4)变量和对象。(5)输入与输出。(6)注释。,.,1.1.3C+程序的书写风格,1.标识符命名标识符是用来标识变量名、函数名、数组名、类名、对象名等的有效字符序列。下面几个原则是命名时所必须注意的。(1)合法性。C+规定标识符由大小写字母、数字字符(09)和下划线组成,且第一个字符必须为字母或下划线。任何标识符中都不能有空格、标点符号及其他字符,(2)有效性。(3)易读性。,.,1.1.3C+程序的书写风格,2.缩进和注释缩进每个“”花括号占一行,并与使用花括号的语句对齐。花括号内的语句采用缩进书写格式,缩进量为四个字符(一个默认的制表符)。注释要注意的是:注释应在编程的过程中同时进行,不要指望程序开发完成后再补写注释。必要的注释内容应包含:在源文件头部进行必要的源程序的总体注释:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。在函数的头部进行必要的函数注释:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等。其他的少量注释。如全局变量的功能、取值范围等。千万不要陈述那些一目了然的内容,否则会使注释的效果适得其反。,.,1.2.1基本数据类型,C+基本数据类型有char(字符型)、int(整型)、float(单精度实型)和double(双精度实型),“实型”又可称为“浮点型”。在ANSIC+中,基本数据类型还有wchar_t(双字节字符型)和bool(布尔型,值为false或true,而false用0表示,true用1表示)。需要说明的是:(1)无符号(unsigned)和有符号(signed)的区别在于数值最高位的含义。对于signed类型来说,最高位是符号位,其余各位表示数值大小;而unsigned类型的各个位都用来表示数值大小;因此相同基本数据类型的signed和unsigned的数值范围是不同。例如,无符号字符型值的范围为0255,而有符号字符型值的范围为-128-127。(2)char、short、int和long可统称为整型。默认时,char、short、int和long本身是有符号(signed)的。,.,1.2.1基本数据类型,图1.1C+的数据类型,.,1.2.1基本数据类型,表1.1C+的基本数据类型,.,1.2.2常量,根据程序中数据的可变性,数据可以分为常量和变量两大类。在程序运行过程中,其值不能被改变的量称为“常量”。常量,又称为“直接量”,可分为不同的类型,如1、20、0、-6为整型常量,1.2、-3.5为实型常量,a、b为字符常量。常量一般从其字面形式即可判别。下面介绍各种不同数据类型常量的表示方法。,.,1.2.2常量,1.整型常量整型常量可以用十进制、八进制和十六进制来表示。(1)十进制整型常量。即十进制整数,如34、128等。(2)八进制整型常量。以数字0开头的数是八进制整数,它由0至7的数字组成。如045,即(45)8,表示八进制数45,等于十进制数37;-023表示八进制数-23,等于十进制数-19。(3)十六进制整型常量。以0 x或0X开头的数是十六进制整数,它由0至9、A至F或a至f组成。例如0 x7B,即(7B)16,等于十进制的123,-0X1a等于十进制的-26。需要注意的是:整型常量中的长整型(long)要以L或小写字母l作为结尾,如3276878L,496l等。整型常量中的无符号型(unsigned)要以U或u作为结尾,如2100U,6u,100ul(表示unsignedlong)等。,.,1.2.2常量,实型常量实型常量即实数,它有十进制数或指数两种表示形式。(1)十进制数形式。十进制数形式是由整数部分和小数部分组成的(注意必须有小数点)。例如0.12、.12、1.2、12.0、12.、0.0都是十进制数形式。(2)指数形式。指数形式采用科学表示法,它能表示出很大或很小的实数。例如1.2e9或1.2E9都代表1.2x109,注意字母E(或e)前必须有数字,且E(或e)后面的指数必须是整数。若实型常量是以F(或f)结尾的,则表示单精度实型(float),以L(或小写字母l)结尾的,表示长双精度实型(longdouble)。若一个实型常量没有任何说明,表示双精度实型(double)。,.,1.2.2常量,字符常量字符常量是用单引号括起来的一个字符。如A、g、%、等都是字符常量。注意B和b是两个不同的字符常量。C+还可以用一个“”开头的字符序列来表示特殊形式的字符常量。表1.2列出了常用的转义序列符。,表1.2C+中常用转义序列符,.,1.2.2常量,字符串常量C+语言中除了允许使用字符常量外,还允许使用字符串常量。字符串常量是一对双引号括起来的字符序列。例如:“Hello,World!n”“C+语言”“abcdef”等等都是字符串常量。字符串常量中还可以包含空格、转义序列符或其他字符。由于双引号是字符串的分界符,因此如果需要在字符串中出现双引号则必须用“”表示。例如:“Pleasepress“F1”tohelp!”这个字符串被解释为:Pleasepress“F1”tohelp!字符串常量应尽量在同一行书写,若一行写不下,可用来连接,例如:“ABCDEFGHIGK.”,.,1.2常量,符号常量在C+中,也可以用一个标识符来代替一个常量。例如:例Ex_PI1用#define定义符号常量#include#definePI3.14159voidmain()doubler=100.0,area;area=PI*r*r;cout圆的面积是:arean;程序中用#define命令行定义PI,使其代替常量3.141593,此后凡是在程序中出现的PI都代表3.14159,可以和常量一样进行运算。在C+中,除了用#define定义符号常量外,C+还常常用const定义的变量来代替#define定义的符号常量。,.,1.2.2常量,例Ex_PI2用const定义的变量代替符号常量#includeconstdoublePI=3.14159;voidmain()doubler=100.0,area;area=PI*r*r;cout圆的面积是:arean;与例Ex_PI1相比,程序代码几乎一样,不同的地方是第二行中的const和例Ex_PI1中的#define不一样。,.,1.2.3变量,变量是指在程序执行中其值可以改变的量。变量有3个基本要素:C+合法的变量名、变量类型和变量的数值。1.变量的定义一般格式语句进行定义的(凡格式中出现的尖括号“”,表示括号中的内容是必需指定,若为方括号“”,则括号中的内容是可选的,本书作此约定):;变量名和数据类型是告诉编译器要为其分配多少内存空间,以及变量中要存取的是什么类型的数据。例如:intnNum1;intnNum2;intnNum3;doublex;这样,nNum1、nNum2、nNum3分别占用4个字节的存储空间,其存取的数据类型是int型,称之为“整型变量”,而x则占用8个字节的存储空间,存取的数据类型是double型,称之为“双精度实型变量”。有时,为使代码简洁,还可以将同类型的变量定义在一行语句中,不过同类型的变量名要用逗号(,)分隔。,.,1.2.3变量,2.变量的初始化程序中常需要对一些变量预先设置初值,即将初值存储在变量名所代表的内存空间,这一过程称为初始化。在C+中,变量初始化是在定义变量时同时赋初值。例如:intnNum1=3;/指定nNum1为整型变量,初值为3doublex=1.28;/指定x为双精度实变量,初值为1.28charc=G;/指定c为字符变量,初值为G也可以在多个变量的定义语句中单独对某个变量初始化,如:intnNum1,nNum2=3,nNum3;变量的初始化还有另外一种形式,例如:intnX(1),nY(3);表示nX和nY是整型变量,它们的初值分别为1和3。,.,1.2.4基本输入、输出,1.输出流(cout)通过cout可以输出一个整数、实数、字符及字符串,cout中的插入符“voidmain()coutABCDt1234tendl;执行该程序,结果如下:ABCD1234程序中“t”是制表符(见表1.2),它将后面的1234在水平的下一个制表位置输出。endl是C+中控制输出流的一个操作算子(预定义的对象),它的作用和n等价,都是结束当前行,并将屏幕输出的光标移至下一行。,.,1.2.4基本输入、输出,实际上,为了更好地调整输出格式,有时还可以使用下面的输出函数。(1)width()函数。width()函数有两种格式:intwidth();intwidth(int);第一种格式用来获取当前输出数据时的宽度,另一种格式是用来设置当前输出数据时的宽度。(2)precision()函数。与width()相似,precision()也有两种格式:intprecision();intprecision(int);(3)fill()函数。fill()函数也有下列两种格式,这两种格式分别用来获取和设置当前宽度内的填充字符,第二种格式函数还将返回设置前的填充字符。charfill();charfill(char);,.,1.2.4基本输入、输出,下面通过一个例子说明上述格式输出函数的用法。例Ex_CoutFrmcout的格式输出#includevoidmain()intnNum=1234;doublefNum=12.3456789;cout1234567890endl;cout.width(10);coutnNumn;cout.width(10);coutfNumendl;coutcout.precision(4)endl;coutfNumendl;cout.fill(#);cout.width(10);coutfNum.其中,提取符“”可以连续写多个,每个后面跟一个表达式,该表达式通常是获得输入值的变量或对象。例如:intnNum1,nNum2,nNum3;cinnNum1nNum2nNum3;要求用户从键盘上输入三个整数。输入时,必须在3个数值之间加上一些空格来分隔,空格的个数不限,最后用回车键结束输入(书中出现的“”表示输入一个回车键,特此约定);或者在每个数值之后按回车键。例如,上述输入语句执行时,用户可以输入:12920或12920,.,1.2.4基本输入、输出,3.格式算子格式算子oct、dec和hex能分别将输入或输出的数值转换成oct、dec和hex八进制、十进制及十六进制,例如:例Ex_Algorism格式算子的使用#includevoidmain()intnNum;couthexnNum;coutOcttoctnNumendl;coutDectdecnNumendl;coutHexthexnNumendl;程序执行时,结果如下:,.,1.3.1算术运算符,算术运算符包括双目的加减乘除四则运算符、求余运算符以及单目的正负运算符。C+中没有幂运算符,幂运算符是通过函数来实现的。算术运算符如下所示:+(正号运算符,如+4,+1.23等)-(负号运算符,如-4,-1.23等)*(乘法运算符,如6*8,1.4*3.56等)/(除法运算符,如6/8,1.4/3.56等)%(模运算符或求余运算符,如40%11等)+(加法运算符,如6+8,1.4+3.56等)-(减法运算符,如6-8,1.4-3.56等),.,1.3.1算术运算符,(5)溢出处理在C+中,当某数除以0或当其它溢出时,编译系统将报告错误并终止程序运行。但对整数溢出,系统却不认为是一个错误,这在编程时需要特别小心。例如:例Ex_OverFlow一个整型溢出的例子#includevoidmain()shortnTotal,nNum1,nNum2;nNum1=nNum2=1000;nTotal=nNum1*nNum2;coutnTotal=(大于等于),=(相等于),!=(不等于)其中,前4种的优先级相同且高于后面的两种。例如:a=bc等效于a=(bc)但关系运算符的优先级低于算术运算符(其他可参见表1.4)。例如:a=bc等效于a=(b3注意,只有在表达式2后面才能出现分号结束符,“表达式1”和“表达式2”中都不能有分号。,.,1.3.8自增和自减运算符,单目运算符自增(+)和自减(-)为整型变量加1或减1提供一种非常有效的方法。+和-既可放在变量的左边也可以出现在变量的右边,分别称为前缀运算符和后缀运算符。例如:i+;或+i;(等效于i=i+1;或i+=1;)i-;或-i;(等效于i=i-1;或i-=1;)这是要特别注意:若前缀运算符和后缀运算符仅用于某个变量的增1和减1,则这两都是等价的,但如果将这两个运算符和其他的运算符组合在一起,在求值次序上就会产生根本的不同:如果用前缀运算符对一个变量增1(减1),在将该变量增1(减1)后,用新的值在表达式中进行其他的运算。如果用后缀运算符对一个变量增1(减1),用该变量的原值在表达式进行其他的运算后,再将该变量增1(减1)。例如:a=5;b=+a-1;/相当于a=a+1;b=a1;和a=5;b=a+-1;/相当于b=a1;a=a+1;,.,1.3.8自增和自减运算符,虽然它们中的a值的结果都是6,但b的结果却不一样,前者为5,后者为4。在自增和自减混合运算时,一要注意次序,二要注意变量是表示相应的存储空间这个特性。例如:b=a+*-a*a+;/相当于a=a1;b=a*a*a;a=a+1;a=a+1;/若a初值为5,该句执行后,则b=64,a=6;这比较好理解,若a的初值为5,当有:b=-a*-a*-a;则不同的编译器有不同的处理方式,TurboC+或BorlandC+认为其相当于:a=a1;a=a1;a=a1;b=a*a*a;显然执行该语句后的结果为a=2,b=8。而VisualC+先计算-a*-a,即其相当于:a=a1;a=a1;b=a*a;此时a=3,b=9;然后计算9*-a,即其相当于:a=a1;b=9*a;结果a=2,b=18。无论是何种处理方式,可千万不要认为是b=4*3*2,那是完全错误的,因为变量a是表示一个相应的存储空间,在同一运行周期中,其存储的数值不应有两种可能。再比如,若a的初值为5,当有:b=a+*-a*-a;/执行该语句后,TC+或BC+:a=4,b=27。VC+:a=4,b=48。,.,1.3.9逗号运算符,逗号运算符是优先级最低的运算符,它可以使多个表达式放在一行上,从而大大简化了程序。在计算时,C+将从左至右逐个计算每个表达式,最终整个表达式的结果是最后计算的那个表达式的类型和值。例如:j=(i=12,i+8);式中,i=12,i+8是含逗号运算符的表达式,计算次序是先计算表达式i=12,然后再计算i+8,整个表达式的值是最后一个表达式的值,即i+8的值20,从而j的结果是20。再如:d=(a=1,b=a+2;c=b+3);d的结果为6。,.,1.3.10sizeof运算符,sizeof的目的是返回操作数所占的内存空间大小(字节数),它具有下列两种格式:sizeof()sizeof()例如:sizeof(“Hello”)/计算字符串常量“Hello”所占内存的字节大小,结果为6sizeof(int)/计算整型int所占内存的字节数需要说明的是,由于同一类型的操作数在不同的计算机中占用的存储字节数可能不同,因此sizeof的结果有可能不一样。例如sizeof(int)的值可能是4,也可能是2。,.,1.3.11优先级、结合性和运算次序,.,1.4.1表达式语句、空语句和复合语句,例Ex_Block块语句的变量使用范围。#includevoidmain()inti=5,j=6;coutijendl;/输出的结果是5和6inti=2,j=3,k=4;coutijkendl;/输出结果是2、3和4coutijendl;/输出的结果仍然是5和6,但不能使用k,如coutnNum2;if(nNum1!=nNum2)if(nNum1nNum2)coutnNum2endl;elsecoutnNum1nNum2endl;elsecoutnNum1=nNum2Thisisanumber3;执行结果是输出Thisisanumber3;因为3是一个不为0的数,条件总为“真”。(2)适当添加花括号(“”)来增加程序的可读性。例如:上面例Ex_Compare中的条件语句还可写成下列形式,其结果是一样的。if(nNum1!=nNum2)if(nNum1nNum2)coutnNum2)coutnNum2;/此句才是if后面的有效语句coutchGrade;switch(chGrade)caseA:casea:cout90-100endl;break;caseB:caseb:cout80-89endl;break;caseC:casec:cout70-79endl;caseD:cased:cout60-69endl;caseE:casee:cout60endl;default:couterror!endl;,.,1.4.2选择结构语句,例Ex_Switch根据成绩的等级输出相应的分数段运行时,当用户输入A,则输出:,但当用户输入d时,则结果如下:,实际上,这不是想要的结果,而应该只输出60-69。,.,1.4.3循环结构语句,1.while循环语句while循环语句可实现“当型”循环,它具有下列形式:while()while是关键字,是此循环的循环体,它可以是一条语句,也可以是多条语句。当为多条语句时,一定要用花括号(“”)括起来,使之成为复合语句,如果不加花括号,则while的范围只到while后面第一条语句。当表达式为非0(“真”)时便开始执行while循环体中的语句,然后反复执行,每次执行都会判断表达式是否为非0,若等于0(“假”),则终止循环。,.,1.4.3循环结构语句,例Ex_SumWhile求整数1到50的和#includevoidmain()intnNum=1,nTotal=0;while(nNum=50)nTotal+=nNum;nNum+;coutThesum,from1to50,is:nTotaln;运行结果为:,.,1.4.3循环结构语句,2.do.while循环语句do.while循环语句可实现“直到型”循环,它具有下列形式:dowhile()其中do和while都是C+关键字,是此循环的循环体,它可以是一条语句,也可以是复合语句。当语句执行到while时,将判断表达式是否为非0值,若是,则继续执行循环体,直到下一次表达式等于0为止。例如Ex_SumWhile用do.while循环语句可改写成:例Ex_SumDoWhile求整数1到50的和#includevoidmain()intnNum=1,nTotal=0;donTotal+=nNum;nNum+;while(nNum=50);coutThesum,from1to50,is:nTotaln;,.,1.4.3循环结构语句,3.for循环语句表达式1表达式2循环体表达式3truefalse图1.3for循环流程图for循环语句既可实现“当型”循环,又可实现“直到型”循环,它具有下列形式:for(表达式1;表达式2;表达式3)其中for是关键字,是此循环的循环体,它可以是一条语句,也可以是复合语句。一般情况下,表达式1用作循环变量的初始化,表达式2是循环体的判断条件,当等于非0(true)时,开始执行循环体,然后计算表达式3,再判断表达式2的值是否为非0,若是,再执行循环体,再计算表达式3,如此反复,直到表达式2等于0(false)为止。其流程如图1.3所示。,图1.3for循环流程图,.,1.4.3循环结构语句,例如,Ex_SumWhile用for循环语句可改写成:例Ex_SumFor求整数1到50的和#includevoidmain()intnTotal=0;for(intnNum=1;nNum=50;nNum+)nTotal+=nNum;coutThesum,from1to50,is:nTotalendl;,.,1.4.4break和continue语句,在C+程序中,若需要跳出循环结构或提前结束本次循环,就需要使用break和continue语句,其格式如下:break;continue;break语句用于强制结束switch结构(如例Ex_Switch)或从一个循环体跳出,即提前终止循环。continue是用于那些依靠条件判断而进行循环的循环语句。例Ex_Continue把1100之间的不能被7整除的数输出#includevoidmain()for(intnNum=1;nNum=100;nNum+)if(nNum%7=0)continue;coutnNum;coutn;,.,1.5.1函数的定义和调用,函数的定义在C+程序中,定义一个函数的格式如下:()函数体可以看出,一个函数的定义是由函数名、函数类型、形式参数表和函数体四个部分组成的。函数类型决定了函数所需要的返回值类型,它可以是函数或数组之外的任何有效的C+数据类型,包括构造的数据类型、指针等。如果不需要函数有返回值,只要定义函数的类型为void即可。,.,1.5.1函数的定义和调用,2.函数的声明声明一个函数可按下列格式进行:();其中,形参的变量名可以省略。但要注意,函数声明的内容应和函数的定义应相同。例如对于sum()函数的声明如下:intsum(intx,inty);和intsum(int,int);是等价的。但末尾的分号“;”不要忘记。需要说明的是,函数的声明又可称为对函数的原型进行说明。,.,1.5.1函数的定义和调用,3.函数的调用函数调用的一般形式为:();所谓“实际参数”(简称“实参”),它与“形参”相对应,是实际调用函数时所给定的常量、变量或表达式,且必须有确定的值。例如:inta5=7,9,6,3,4;sum(a0,6);或sum(a0*a1,a2+a3);等都是合法的调用。需要注意的是:实参与形参的个数应相等,类型应一致,且按顺序对应,一一传递数据。C+中,调用一个函数的方式可以有很多,例如:sum(3,4);/Aintc=2*sum(4,5);/Bc=sum(c,sum(c,4);/C)其中,A是将函数作为一个语句,不使用返回值,只要求函数完成一定的操作;B把函数作为表达式的一部分,将返回值参与运算,结果c=18;C是将函数作为函数的实参,等价于“c=sum(18,sum(18,4);”,执行sum(18,4)后,等价于“c=sum(18,22);”,最后结果为c=40。,.,1.5.2函数的参数传递,例Ex_SwapValue交换函数两个参数的值。#includevoidswap(floatx,floaty)floattemp;temp=x;x=y;y=temp;coutx=x,y=yn;voidmain()floata=20,b=40;couta=a,b=bn;swap(a,b);couta=a,b=ba;if(a0)a=-a;intb;/b的作用域起始处/b的作用域终止处/a的作用域终止处代码中,声明的局部变量a和b处在不同的块中。其中变量a是在fun函数的函数体块中,因此在函数体这个范围内,该变量是可见的。而b是在if语句块中声明的,故它的作用域是从声明处开始到if语句结束处终止。,.,1.5.3作用域和存储类型,1.作用域(2)函数原型作用域。例如:doublemax(doublex,doubley);和doublemax(double,double);是等价的。不过,从程序的可读性考虑,在声明函数原型时,为每一个形参指定有意义的标识符,并且和函数定义时的参数名相同,是一个非常好的习惯。(3)函数作用域。(4)文件作用域。,.,1.5.3作用域和存储类型,2.变量的存储类型这些存储类型的声明是按下列格式进行的:;(1)自动类型(auto)。一般说来,用自动存储类型声明的变量都是限制在某个程序范围内使用的,即为局部变量。从系统角度来说,自动存储类型变量是采用动态分配方式来分配内存空间的。因此,当程序执行到超出该变量的作用域时,就释放它所占用的内存空间,其值也随之消失了。在C+语言中,声明一个自动存储类型的变量是在变量类型前面加上关键字auto,例如:autointi;若自动存储类型的变量是在函数内或语句块中声明的,则可省略关键字auto,例如:inti;(2)静态类型(static)。静态类型变量也是一种局部变量。它和自动存储类型的变量的最大不同之处在于:静态类型变量在内存中是以固定地址存放的,它采用静态分配方式来分配内存空间的。在这种方式下,只要程序还在继续执行,静态类型变量的值就一直有效,不会随它所在的函数或语句块的结束而消失。,.,1.5.3作用域和存储类型,在C+语言中,声明一个静态类型的变量是在变量类型前面加上关键字static。例如:例Ex_Static使用静态类型的局部变量#includevoidcount()inti=0;staticintj=0;/静态类型cout”i=”i”,j=”j”n”;i+;j+;voidmain()count();count();运行结果为:,.,1.5.4带默认形参值的函数,在C+中,允许在函数的声明或定义时给一个或多个参数指定默认值。这样在调用时,可以不给出参数,而按指定的默认值进行工作。例如:voiddelay(intloops=1000);/函数声明voiddelay(intloops)/函数定义if(loops=0)return;for(inti=0;iloops;i+);/空循环,起延时作用这样,当调用delay();/和delay(1000)等效时,程序都会自动将loops当作成1000的值来进行处理。当然,也可重新指定相应的参数值,例如:delay(2000);,.,1.5.4带默认形参值的函数,在设置函数的默认参数值时要注意:(1)当函数既有声明又有定义时,不能在函数定义中指定默认参数。(2)当一个函数中有多个默认参数时,则形参分布中,默认参数应从右到左逐次定义。在函数调用时,系统按从左到右的顺序将实参与形参结合,当实参的数目不足时,系统将按同样的顺序用声明或定义中的默认值来补齐所缺少的参数。例如:例Ex_Default一个设置多个默认参数的函数示例#includevoiddisplay(inta,intb=2,intc=3)/在函数的定义中设置默认参数couta=a,b=b,c=c0时,.,1.5.5函数的递归调用,#includelongfactorial(intn);voidmain()coutfactorial(4)ab;cout最大的数为:fmax(a,b)n;使用内联函数时,还需要注意的是:(1)内联函数也要遵循定义在前,调用在后的原则。形参与实参之间的关系与一般函数相同。(2)在C+中,需要定义成的内联函数不能含有循环、switch和复杂嵌套的if语句。(3)递归函数是不能被用来做内联函数的。(3)编译器是否将用户定义成的内联函数作为真正的内联函数处理,由编译器自行决定。,.,1.5.7函数的重载,函数重载是指C+允许多个同名的函数存在,但同名的各个函数的形参必须有区别:形参的个数不同,或者形参的个数相同,但参数类型有所不同。例如:例Ex_OverLoad编程求两个或三个操作数之和#includeintsum(intx,inty);intsum(intx,inty,intz);doublesum(doublex,doubley);doublesum(doublex,doubley,doublez);voidmain()coutsum(2,5)endl;/结果为7coutsum(2,5,7)endl;/结果为14coutsum(1.2,5.0,7.5)(9)?(3):(9);/结果为9很显然,带参数的宏相当于一个函数的功能,但却比函数简捷。需要注意的是:定义有参宏时,宏名与左圆括号之间不能留有空格。否则,编译器将空格以后的所有字符均作为替代字符串,而将该宏视为无参数的宏定义。,.,1.5.8预处理,3.文件包含命令所谓“文件包含”是指将另一个源文件的内容合并到源程序中。C+语言提供了#include命令用来实现文件包含的操作,它有下列两种格式:#include#include“文件名”在使用#include命令需要注意的是,一条#include命令只能包含一个文件,若想包含多个文件须用多条文件包含命令。例如:#include#include.,.,1.5.8预处理,4.条件编译命令一般情况下,源程序中所有的语句都参加编译,但有时也希望根据一定的条件去编译源文件的不同部分,这就是“条件编译”。条件编译使得同一源程序在不同的编译条件下得到不同的目标代码。C+提供的条件编译命令有几种常用的形式,现分别介绍如下:第一种形式#ifdef#else#endif其中,#ifdef、#else和#endif都是关键字,是由若干条预处理命令或语句组成的。这种形式的含义是:如果标识符已被#define命令定义过,则编译,否则编译。,.,1.5.8预处理,例Ex_UseIfdef使用#ifdef条件编译命令#include#defineLIvoidmain()#ifdefLIcoutHello,LI!n;#elsecoutHello,everyone!n;#endif运行结果:,(2)第二种形式#ifndef#else#endif这与前一种形式的区别仅在于,如果标识符没有被#define命令定义过,则编译,否则就编译。,.,1.5.8预处理,例Ex_UseIfdef使用#ifdef条件编译命令(3)第三种形式#if#elif.#else#endif其中,#if、#elif、#else和#endif是关键字。它的含义是,如果为“真”就编译,否则如果为“真”就编译,.,如果各表达式都不为“真”就编译。,.,1.6构造类型,1.6.1数组数组是相同类型的元素的有序集合,每个元素在数组中的位置可用统一的数组名和下标来惟一确定。1.数组的定义定义一个数组可按下列格式进行:.后面的.用于确定数组的维数和大小。如:inta10;它表示数组名为a,一维数组,此数组有10个元素,每个元素的类型都是整型。又如:floatb23;charc456;其中,b是实型的二维数组,它有2x3个元素,每个元素的类型都是实型。c是字符型的三维数组,它有4x5x6个元素,每个元素的类型都是字符型。一般地,表示某维大小的常量表达式中不能包含变量,但可以包括常量和符号常量,其值必须是一个确定的整型数值,且数值大于1。例如:inta4-23*6;constintSIZE=18;intbSIZE;都是合法的数组定义。,.,1.6.1数组,2.数组元素的引用数组定义后,就可以引用数组中的元素,引用时按下列格式:.例如a0、b5等,这里的0和5是数组的下标,a和b是定义过的数组名。需要注意的是:(1)C+数组的下标总是从0开始的,也就是说,a0是数组a的第一个元素;但下标一定要小于数组定义时的大小。也就是说,长度为n的数组,其下标范围为0(n-1)。例如,inta5;它的数组元素下标应从0到4,而没有a5这个数组元素。(2)下标可以是整型常量或整型表达式,且引用的元素下标个数应与数组定义的维数一致。例如:intd234;是三维数组,d023,d012都是合法的元素,但d12或d13等都是不合法的数组元素的引用。(3)数组定义后,系统会根据数组的大小开辟相应的内存,并依照下标的高低依次存放数组中的各个元素。例如一维数组a5的存放次序是:a0,a1,a2,a3,a4。(4)由于每一个数组元素都可以看成是一个与数组类型相同的变量,因此在程序中对某个或所有数组元素进行赋值或其他处理时,它的操作与变量类似。,.,1.6.1数组,3.一维数组的初始化和赋值数组中的元素既可以在数组定义的同时赋初值,即初始化,也可以在定义后赋值。例如:inta5=1,2,3,4,5;是将整数1,2,3,4,5分别赋于数组a的各个元素,注意要将这些初值用花括号“”括起来。它与下列的赋值语句的结果是相同的:a0=1;a1=2;a2=3;a3=4;a4=5;当然,也可以给其中的一部分元素赋值。例如:intb5=1,2;是将数组b的元素b0,b1分别赋予1,2的值。需要说明的是,在对数组进行初始化中,若没有明确列举元素值的元素,则其值均为0。有时,在对全部数组元素赋初值时,可以不指定数组的长度;例如intc=1,2,3,4,5;系统将据数值的个数自动定义c数组的长度,这里是5。,.,1.6.1数组,4.二维数组的初始化和赋值二维数组可以看成一个具有行和列的数据表,例如intb34;它在内存空间的存放次序是:b00,b01,b02,b03,/第0行b10,b11,b12,b13,/第1行b20,b21,b22,b23。/第2行可见,在数组b34中,3表示行数,4表示列数。因此,在进行二维数组进行初始化时可以采用以“行”为单位来进行。例如:intd34=1,2,3,4,5,6,7,8,9,10,11,12;其中,最外面的一对花括号里面的1,2,3,4是对第0行元素进行初始化,5,6,7,8是对第1行元素进行初始化,9,10,11,12是对第2行元素进行初始化。每对花括号里的数据个数均不能大于列数。它等价于intd34=1,2,3,4,5,6,7,8,9,10,11,12;/依次对元素进行初始化,.,1.6.1数组,5.排序数组作为一种常见的数据结构,在许多方面都得到了应用。“排序”就是一个常用的应用实例。例如:例Ex_ArraySort把5个整型数按从小到大的次序排列#include#defineN5voidmain()intaN=20,40,-50,7,13;intmin,k;for(inti=0;iaj)min=aj;k=j;ak=ai;ai=min;for(i=0;iN;i+)coutait;coutendl;结果如下:,.,1.6.1数组,5.排序上述排序是用“选择法”进行的。所谓“选择法”,其过程是这样的:首先从N个数中找出最小值,放在第一个元素位置上,再从剩下的N-1个数中找出最小值,放在第二个元素位置上,这样不断重复下去,直到剩下最后一个数。当然,也可以用“冒泡法”(或称“起泡法”)进行排序,其过程是:首先将N个数中相邻两个数进行比较,若当前的数比下一个数大,则相互交换,再与下一个相邻的数逐一比较,直到最大的数“沉”到第N个位置为止,再将剩下的N-1个数,

温馨提示

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

评论

0/150

提交评论