计算机二级(VC++)复习资料_第1页
计算机二级(VC++)复习资料_第2页
计算机二级(VC++)复习资料_第3页
计算机二级(VC++)复习资料_第4页
计算机二级(VC++)复习资料_第5页
已阅读5页,还剩107页未读, 继续免费阅读

下载本文档

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

文档简介

第一章C++概述•本章要求.熟悉VC++集成环境的启动和退出方法。.熟悉菜单的基本操作技术。.掌握调试一个VC++程序的基本过程。.打开一个已经存在的VC++源程序文件,并能编译、连接和执行。一、程序设计语言1、分类(1)低级语言(机器语言和汇编语言)一面向机器(④高级语言(GVR火诙VF等)一面向问题计算过程,接近于人们的习惯2程序由计算机语言来描述,由语句构成。A程序运行的原理源程序(由高级语言编写)f 编译程序编谕 形成面向机器的机器语言程序(即由0和1组成)二、算法1、定义一解决问题的具体步骤或解题方法(或过程)。例:求S=AfB+€算法1,在内存中设一个累加用的存储单元s步骤一:将存储单元S置零步骤二:输入第一个数A步骤三:把助口到存储单元S中步骤四:输入第一个数B步骤五:把B加到存储单元S中步骤六:输入第一个数C步骤七:把C加到存储单元S中步骤八:把存储单元S中的结果输出。算法2(用循环实现)三、简单的G卷序介绍/源程序文件名为examl.cpp尸加呈序的基本结构介绍表/#include<iostreamh>voidmain«oi0{coutWi—; /显示提示符inti; 展明变量i的类型cin»i; 键盘上输入变量i的值coutWi的值为:出变量i的值该程序经编译和连接后,运行可执行程序时,显示器上显示为:1=此时等待用户输入一个整数,设输入为100,则最后结果为:I的值为:100下面介绍程序的基本结构和各语句的作用:1、注释和说明信息(1)*/(飞〃(从此开始到本行结束为止)2,包含文件或编译预处理指令编译预处理指令:以圻头的行(由于本例中用到输入输出函数,iostreamh是一个标准的输入湍出流的头文件)A主函数main()任何一个G济呈序必须要且只能有一个主函数。一个G隹序总是从main0函数开始执行,而不管该函数在整个程序中的具体位置。4大括号{}(函数或语句括号)任一函数体均要以开始,以}为结尾。注意:大括号要配对使用。.任一个G隹序均有一个或多个函数组成,其中必须有一个主函数main(),其余函数(包括库函数和用户自定义函数)可有可无。而且每条语句均要以;为结束。.程序的书写规则一个语句可写成若干行,一行内也可写若干个语句。(2)对齐规则:同一层次的语句必须从同一列开始;同一层次的大开括号必须与对应的大闭括号在同一列上。(3)缩进规则:同一层次的语句必须缩进几个字符。(今任何函数的定义均要从第一列开始书写。IG般有专门的输入陶出语句。输入厮出语句要通过函数来实现。&严格区分字母的大小写。四、M3H程序的实现1、M3H上机环境介绍2一个源程序的执行过程#include<iostream.h>voidmain(void){floatr,s;cout«〃请输入圆的半径:”;cin»r;s=2*3.1415926*rcout<<”圆的周长为:*«s<<endl;)人注意的问题:(1)VC++集成环境每一次只允许编译和调试一个应用程序,当需要输入另外一个程序时,则应该先关闭当前窗口,然后建一个“Projects”项目,再建立一个新的“C++SourceFile”。(2)编译和运行可以合并一步完成,即选择工具栏上红色“!:当源程序有错误时,需要先把错误修改正确后再单击该工具“!”,如果此时程序没有错误系统会自动执行。(3)源程序有错误并修改后一定要再编译后执行,即先编译后执行这个过程不可缺省。每次修改都要再编译运行。第二章数据类型、运算符和表达式•本章要求1、掌握常量的表示法【字符和字符串常量、短整型、整型和长整型、实数(float)和双精度实数(double)].2、掌握各种类型变量的说明及初始化3、掌握各种运算符和各类表达式(1)算术运算、逻辑运算、关系运算、++和一一运算、三目条件运算符;运算符的优先级、结合规则和目数的概念;(3)类型的自动转换和强制类型转换;表达式的组成、左值和赋值,逻辑表达式的求值优化;一、数据类型:C++提供了十分丰富的数据类型,除基本类型外,还提供了导出(构造)数据类型:r整型r单精度型I双精度型r基本类型r单精度型I双精度型[实型(实型)'数组类型数据类型构造类型结构体类型数据类型构造类型共同体类型,枚举类型注意:各种数据类型在内存中所占用的字节数。二、标识符:注意标识符的命名规则。三、常量:常量可分为整型常量、实型常量、字符常量、字符串常量和标识符常量。注意:(1)字符常量单引号括起来的单个字符。例如:‘a'J&'等都是合法的字符常量,’ab,,“a”都是不合法的字符型常量。C++还提供了另一种表示字符型常量的方法,即所谓的“转义序列”。转义序列就是以转义符开始,后跟一个字符或一个整型常量(字符的ASCII值)的办法来表示一个字符。若转义字符后边是一个整型常量,则必须是一个八进制或十六进制数,其取值范围必须在0〜255之间。该八进制数可以以0开头,也可以不以0开头;而十六进制数必须民0X或Ox开头。常用的转义序列字符有:’\\'表示字符'\"表示单引号,表示双引号,’\n,表示换行符等。(2)字符串常量用双引号括起来的若干个字符。例如:“ab3d”,“a”都是合法的字符串常量。字符串常量与字符常量的存放格式不一样,在字符串常量的尾部,存储时都要存放一个'\0','\0'表示字符串的结束符。注意:当双引号要作为字符串中的一个字符时,必须采用转义序列表示法;单引号作为字符串中的一个字符时,可直接出现在字符串常量中,也可以采用转义序列表示法。(3)标识符常量标识符常量是用标识符表示的常量。定义标识符常量后,可以像字面常量一样使用该标识符。可用两种方法定义标识符常量:一种是使用编译预处理命令方法,另一-种是利用常量说明语句。①编译预处理命令例:#definePI3.1415926②使用常量说明符const例:constfloatPI=3.1415926在程序中标识符常量必须先定义后引用,并且标识符常量在程序中只能引用,不能改变其值。四、变量根据其取值的不同,分为不同类型的变量:整型变量、实型变量、字符型变量、构造型变量和指针型变量等。例如:inta:〃定义整型型变量a,并为a分配4个字节的存储单元,变量说明语句必须以分号结束。变量要求说明在前,使用在后。变量说明语句可以出现在程序中语句可出现的任何位置,同一变量只能作一次定义性说明。首次引用变量时,变量必须有一个确定的值。对变量赋初值的三种方法:①在变量说明的同时对变量赋初值,例如:charch1=I',charch2=E;②使用赋值语句赋值,例如:floatx,y;x=1.234;y=2.56;③通过输入流cin对变量赋初值,例如:inta;cin»a;(后面章节将会学到)五、运算符与表达式(1)算术运算C++中的算术运算符有两个单目运算符(只有一个操作数的运算符):+(正号)、-(负号);五个双目运算符(有两个操作数的运算符):+(加)、-(减)、*(乘)、/(除)、%(取余)。注意数据类型的转换!(2)关系运算C++提供六种关系运算符:>(大于)、〈(小于)、>=(大于等于)、<=(小于等于)、==(等于)、!=(不等于)。前面4种(>,V,>=,<=)优先级相同,后两种(==,!=)优先级相同,前4种高于后两种。结合性都为右结合。关系运算符完成两个操作数的比较运算,即比较两个操作数的数值大小。运算的结果为一整数,当关系成立时,其运算结果为整数1:当关系不成立时,其运算结果为整数0。关系运算的结果可作为一个整数参与表达式的运算。(3)逻辑运算C++中提供三种逻辑运算符:逻辑非(!)、逻辑与(&&)和逻辑或(II)第一个运算符是单目运算,后两转者是双目运算符。在计算过程中,要注意&&的优先级低于!优先级,但高于II的优先级。!为左结合,而其它两个为右结合。注意:在逻辑运算中要注意逻辑表达式的副作用:①对于a&&b&&c,只有a为非。时,才需要计算b的值,因为当a为。时,不管后面的项如何,都能得到该表达式的值就为0。同样只有在a和b都为非0的情况下才需要计算c的值。②对于allbllc,只要a为非0,就不需要判断b和c的值,而只有当a、b都为0时才需要计算C项。(4)赋值运算C++中赋值运算符分为两种:单一赋值运算符(=)和复合赋值运算符(+=,-=,*=,/=,%=,&=,八=,|=,<<=,»=),都为双目运算符,结合性为左结合,其运算法则为:将左操作数与右操作数进行相应的运算,再将结果赋给左操作数。对于赋值运算符,其左操作数必须为变量。sizeof()运算符sizeof()运算符是用来计算某种类型或数据所占用的字节数,它为单目运算符•该运算符与其它类型的基本运算符稍有不同,它的操作数必须在括号内,其使用格式为:sizeof(〈类型〉) 或sizeof(〈表达式〉)(6)自增、自减运算自增运算符“++”和自减运算符”都具有两种形式,且它们都是单目运算符,操作数必须为变量,一般是整型变量,但也可以是实型或字符型变量。++i(前置自增:先将i的值加1,再将变化后的i值参与运算)i++(后置自增:先将i参与运算,再将i的值加1)-i(前置自减:先将i的值减1,再将变化后的i值参与运算)i-(后置自减:先将i参与运算,再将i的值减1)(7)逗号运算逗号运算符的优先级为所有运算符中最低的,结合性为右结合。逗号表达式的一般形式为: (表达式1〉,(表达式2〉,…,(表达式n>其运算顺序为按从左到右的顺序依次求出各表达式的值,并把最后一个表达式的值作为整个逗号表达式的值。以下三个表达式的结果是不同的:(8)条件运算条件运算符“?:”为三目运算符,要求有三个操作对象,使用格式为:v表达式1>?v表达式2>:v表达式3>计算过程为:先计算(表达式1>,若其值不等于0,则计算〈表达式2〉,并将计算的值作为该条件表达式的值;否则求解〈表达式3>的值,并将该值作为条件表达式的值。其优先级高于赋值和逗号运算,左结合。(9)常用运算符的优先级高!++——负号算术运算关系运算逻辑运算条件运算赋值运算(含复合赋值)低J逗号运算(10)类型转换在求表达式值的过程中,对于双目运算符,通常会出现两个操作数的类型不一致的情形,这时就要求将这两个操作数转换为同一类型,然后再进行运算。可以分为三种情况的转换:不同类型数据的混合运算、赋值时的类型转换和强制类型转换,分别要注意这三种情况的数据类型的转换。六、举例说明1、设有说明“intx=5,y=7,z=8;",执行表达式“z+=x++lly++ll++z”后,则x、y、z的值分别为A.6、7、9 B.6、8、10C.6、8、8D.6>8、12、设有语句"inta=258,b;unsignedcharc;b=c=a;",则b的值是203、设有语句“chars[]="Rep\0Ch”;intm=sizeof(s)f\则m的值是7 °4、在数学式当中,变量x和y的取值为整数,而变量a和b的取值为实数,在C++程序5ab中对应的正确表达式是()A.3/5*x*y/a/bB.3*x*y/5/a/bC.3*x*y/5*a*bD.3/a/b/5*x*y5、设有四个常数:①4e0.5,②③0x5a,④“V;其中符合C++语法规则的常量是()A.②③ B.②@ C.③④ D.①②第三章简单的输入/输出语句•注意:GH中无专门的输入输出语句,而是所有的输入输出语句通过输入输出流来实现的。即:必须在程序的开头增加一行。#include<iostreamh>/包含输入输出流的头文件输入:把键盘上输入的数据赋值给变量。输出:将程序计算的结果送到显示器上显示。一、输入语句(cirj)1、输入十进制的整数和实数注意;(1)“少称为提取运算符,靠第善》程序的运行,等待用户从键盘上输入相应的数据。(②输入的数据之间用一个或多个空格隔开。(1)从键盘上输入数据的个数、类型及顺序,必须与cin中列举的变量一一对应。()若都为数值型,则整数和实数可相互转换。2输入字符型数据(1)格式如上charcl,c2,c3,c4;cin>>cI»c2»c3;若从键盘上输入:Abe回车和从键盘上输入:Abe回车两者结果一样(回车键不算输入的字符!)注意:1、缺省情况下,cin自动跳过输入的空格。即cin不能将输入的空格赋值给字符型变量。2输入时不需带引号。cin.get《字符型变量与一从输入行中取出一个字符作用:把从键盘上输入的每一个字符,包含空格和回车键都作为一个字符赋值给字符型变量。但该语句一次只能从输入行中提取一个字符。例:charc5;cin.get(c5);〃得至ij字母A注意:cin.getline(s9n)二、输出语句(cout)1、输出十进制整数和实数格式:coutw安达式1XW安达式2>..…例:inti=2,j=10,t=20,nr6afloatx=3.14y=10。cout«i«j<=^endl;coutyn^Cj1;cout«x<sg«fend1;输出的结果为:210302003.14100注意:(1)endl表示输出一个换行符,等效于'7。(④缺省情况下,每一个输出的数据之间无分隔符。故要加'7(™或’7(回车)等分隔符将数据分割开。0)Setw(h):用于指定输出的宽度。其必须要在程序的开头位置加一行:#includeVicmaniph>另外:1)n值必须为正整数,指出紧随其后的输出项占用的字符位置个数。)该设置仅对其后的一个输出项有效,一旦按指定的宽度输出其后的输出项,又回到原来的缺省输出方式。TOC\o"1-5"\h\z例:cout<Ksetw⑥<Ki«setw(10) ;cout<Ksetw©<5^irKsetw(IQ)<j;cout<Ksetw(IQ<Kx<Ksetw(IQ) ;则输出为:2 1030 2003.14 100第四章C++的流程控制语句第一节C++语言的语句和程序结构一、GH语言的语句概述语句分类:1、说明语句(位置任意)一对数据结构的定义和描述、对变量的定义性说明等。2控制语句(有可能改变程序执行顺序的语句,如条件、循环等)A函数调用语句4表达式语句(表达式后加一分号,如1=1+1;)*空语句只有一分号所构成的语句,不执行任何操作,主要用于指明转向的控制点或在特殊情况下作为循环语句的循环体。)6块语句(由花括号括起来的语句)二、程序的三种基本结构1、顺序结构Z选择结构X循环结构第二节选择结构一、条件语句【if结构】单选条件语句格式:if(v表达式〉)v语句〉二中择一语句格式:if(v表达式〉)〈语句1>else〈语句2>嵌套条件语句格式:if(v表达式1>)v语句1>elseif(v表达式2>)〈语句2>elseif…else〈语句n>注意:1)《语句》若为一条,则不需要括号;反之若为多条,则需要用“{}”括起来2)其中〈表达式〉可以是符合C++语法规则的任一表达式,可以是算术表达式、关系表达式、逻辑表达式或逗号表达式。3)《表达式》必须用括号括起来。4)对于嵌套的if语句,C++规定了else与if的配对规则为:else总是与其前面最近的还没有配对过的if进行配对。5)条件运算符(?:)一三目运算在结合)格式:磷达式1才礁达式2>磷达式3>执行步骤:先求出表达式1的值,若其不等于0,则求出表达式2的值(不求表达式3的值),并把该值作为运算的结果;否则求出表达式3的值(不求表达式2的值),并把他作为运算的结果。例1:max=w>t?a:b;等价于:ifma^=^e1se例2max=(t=a>=b?a:b)<c?c:t;等价于:if(a>=b)t=a;elset=b;if(t>c)max=c;elsemax=t;二、开关语句【switch结构】其格式为:switch(<表达式>){case〈常量表达式1>:《语句序列1》《break;》case〈常量表达式2>:《语句序列2》《break;》case(常量表达式n>:《语句序列n》《break;》《default:〈语序列句n+l>》)注意:1)〈表达式〉叫做“switch控制表达式”,〈表达式〉的值只能为整型、字符型或枚举型。2)(常量表达式i>只能为整数、字符或枚举类型的常数。3)(语序列句i>可以含有多个语句,也可以没有任何语句,当有多条语句时,不需要用大括号“{}”括起来。4)执行过程:《break》语句可有可无。若有则【需要补充,很重要的!】三、上述两种结构的区别和使用共同点:if语句根据《表达式》的值选择合适的语句执行四、举例说明1、判断输入字符的种类。把字符分为五类:数字、大写字母、小写字母、控制字符(ASCII的编码小于32)和其他字符。#include<iostreamh>voidmain(void){charc;cout《输入一个字符:”;cin.get©;ifQ<32)coutW:这是一个控制字符。7';elseif仁三08&.c—9)cout《这是一个数字字符。elseifd c<^Z)cout〈M这是一个小写字母。7*;elseif8Ac<^Z)cout《这是一个大写字母。7';elseCOUtV这是一个其他字符。7';}注意:条件2、执行下列程序段后,变量i的值为inti=10;switch(i)(i+=l;i+=l;i+=1;default:i+=l;)A.13 B.12 C.ll D.14注意:break语句第三节循环语句结构一\while结构:while。语句格式:while(〈循环条件表达式》)〈循环体)do…while。语句格式:do{<循环体》}while(<循环条件表达式));注意:while(<循环条件表达式》)后的分号不可省略。while。语句与do…while。语句的主要区别:循环条件的判断与循环体的执行顺序不同,while。语句是先判断后执行,而do…while。语句是先执行后判断。因此,while。语句中的循环体可以一次也不执行,而do…while。语句中的循环体至少要执行一次。二、foi•结构格式:for(〈表达式1>;〈表达式2>;<表达式3>)<循环体)1、执行过程:(1)求出表达式1的值(2)求出表达式2的值,若表达式2的值等于0(为假),则执行4),否则执行3)(3)执行语句S求出表达式3的值。转2)(④结束循环,执行forO后面的语句。(5)从执行过程看,首先判断循环条件,若满足循环条件,则执行循环体,所以循环体可能一次也不执行,也有可能执行若干次。2、注意:1)一般在表达式1中对循环变量赋初值,如果为空则应在for语句前对循环变量赋初值。2)表达式2为循环条件,可以为空,此时系统约定其值为1,即循环条件恒成立,所以要想退出循环应该在循环体中使用break语句。3)•般在表达式3中改变循环变量的值,如果为空则应在循环体中改变循环变量的值。4)任何情况下表达式1和表达式2后的分号都不可省略。三、比较1、这三种循环结构中,循环体中的语句多于一条时,应用大括号{}括起来以复合语句形式出现。2.CR和WHLE都是先判断循环条件,再根据条件决定是否要执行循环体。而DO则其循环体至少要被执行一次。3、CR适用于循环次数已确定的情况下,用的比较多。四、控制执行顺序的语句1、break语句(结束循环)2.continue语句(结束本次循环,重新开始下次循环)五、举例说明1、用牛顿迭代法求*心的近似值。已知迭代公式: 、产区血凶/2要求:前后两次求出的根的近似值之差的绝对值小于10。#include<iostreamh>#include<nath.h>voidmainRoi@{floatxO,xl,a;cout《输入一个正数:”;ciri»a;if coutW不能开平方!else{x1=g/2;do{x(Mclxl=(xl-l^/xQ)/2;)while(fabs(XI-xQ)>le-5);cout<Kxl<^\^})2、设有语句“for(inti=5,sum=0;i<IO,sum++;i++)sum+=i;,\则for()语句的执行情况是。A.循环0次 B.循环4次 C.循环5次D.循环6次.循环语句afor(intx=0,y=0;y!=100llx<10;)x++;>>,执行的循环次数是。A.无限次 B.10 C.11 D.100.for(intx=O,y=O;!x&&y<=5;y++)语句执行循环的次数是。A.OB.5 C.6D.无次数5、以下程序的输出结果是s=,k=o#include<iostream.h>voidmain(void){intj,k,s,m;for(k=l;k<7;k++){s=l;m=k+2;for(j=k;j<m;j++,k-H-)s+=j;}cout«,,s=,,«s«M,«,,k=,'«k«,\n,;}6、以下程序输出的第一行是,第二行是。#include<iostream.h>voidmain(void){intx=6;do{x-=2;cout«x«'\n';}while(—x);)7、设计一个程序,输出所有的水仙花数。所谓水仙花数是一个三位数,其各位数字的立方等于该数本身。例如:15Af+5'M。&判断一个数是否是素数第五章函数和编译预处理第一节函数的定义和调用1、概述#include<iostream.h>floatmax(floatx,floaty){return(x>y?x:y);}voidmain(void){floata,b;cout<<"输入两个实数:”;cin»a»b;cout<<”两个数中的大数为:“〈(maxSMcc'n,;)(1)函数是具有特定功能的模块。(2)一个C++源(程序)文件由一个或多个函数组成。(3)任何一个C++源(程序)文件都必须有一个名为main的主函数。C++程序执行总是从main函数开始,调用其它函数后总是回到main函数,最后在main函数中结束整个程序的运行。一个函数可以调用其它函数或其本身,但任何函数(除main函数外)均不可调用main函数。(5)函数包括用户自定义函数和系统库函数。库函数是C++编译系统中已经预先定义的函数,使用它必须先包含该库函数所在的头(.h)文件:函数就是具有特定功能的模块,C++程序由一个主函数和若干个其他函数构成,由主函数调用其他函数执行。函数包括用户自定义函数和系统库函数(标准函数)。(6)函数通常需''先定义,后使用”。(7)函数不能嵌套定义,但是可以嵌套调用2,函数的定义与调用函数定义的格式:〈类型〉〈函数名〉(形式参数列表){函数体}注意:1)形式参数在函数体的作用取决于其数据类型和与其结合的实形参数相关,而与其名字无关,只要是符合标识符命名规则都可以。2)函数的返回值通过函数体内的return语句实现:return〈表达式〉;程序执行到函数体内的return语句时,立即结束该函数的执行,控制转移到函数调用处的后继语句。3)不管函数返回值的类型(return后面表达式)是什么,最后的返回值要转化成与《类型》制定的数据类型。4)若函数体中没有return语句,则函数定义的〈类型>则制定为void;反之,<类型>不是void数据类型,则再函数体中一定要有return《表达式》。参函数调用格式:〈函数名〉(实形参数列表);第二节函数的形参、实参、返回值及函数的原型说明及具有缺省参数值和函数的重载一、形参、实参和函数的返回值1、函数的形参和实参(1)形参:函数的定义中一一列出的参数。例:floatf(floatx,floaty,intI,charc){....} 〃函数体注意:形参表中的每一个参数都必须依次列举每一个参数的类型,即使同类型的参数也是如此。floatf(floatx,y,intI,charc) 〃这种写法是错误的。(2)实参:在函数调用时,一列出的参数成为实际参数注意:1、实参可以是表达式2、在实参表中,每一个实参的类型必须与对应的形参的类型相匹配。即一般情况下,要求实参在类型和个数上与形参一一对应。3、注意兼容性(实参对于形参而言,若可以转换则称为可兼容)4、形参名可任意。2、参数的传递方式:(1)按值传递#inc1ude<iostream.h>voidp(inta,intb){a++;b++;)voidmain(void){intx=100,y=200;cout«x«,\tf«y«f\n;p(x,y);cout<<x«,\t'<<y<<'\n’;p(x,x);cout«x«,\t9«y«*\n;p(y,x);cout«x«'\t'<<y«'\n;p(y,y);cout«x<〈'\t'<<y<〈'\n';)(2)引用传递#include<iostream.h>voidp(int&a,intb){a++;b++;)voidmain(void){intx=100,y=200;cout«x<<'\t'<<y«'\n';p(x,y);cout<<x<〈'\t'<<y<<'\n’;p(x,x);cout<<x«,\V«y<<*\n;p(y,x);cout«x«,\t'«y<<*\n;p(y,y);cout«x«)\t*«y«'\n';)二、函数原型说明语句如:#include<iostream.h>voidmain(void){intx=100,y=200;cout«x«*\t'«y«*\n';p(x,y);//A)voidp(int&a,intb){a++;b++;)1、编译过程中将指出A行中的函数p(x,y)没有定义,即出现编译错误。2、若函数调用在前,函数定义在后,此时在主函数中应增加函数原型说明B。3、函数原型说明的一般格式:〈类型〉〈函数名〉(〈形式类型说明表〉)或〈类型〉〈函数名〉(〈形式说明表〉)4、函数原型说明的目的是告诉编译程序,该函数的返回值类型、参数个数和各个参数的类型,以便其后调用该函数时,编译程序对该函数的调用做参数的类型、个数、顺序及函数的返回值是否有效的检查。5、函数原型说明是说明语句,其后的分号不可缺少,可出现在程序中的任何位置,且队一函数的函数原型说明次数没有限制。解决问题1的方法有:(1)将p函数在main函数之前定义。(如前面节中所述)(2)仍然是现在的顺序,则可以在函数调用语句(p(x,y))之前保证有如下语句:voidp(int&a,intb);或voidp(int&,int);三、具有缺省参数值如:#include<iostream.h>intp(inta,intb=1){a++;b++;returna+b;)voidmain(void){intx=100,y=200,tl,t2;tl=p(x,y): //At2=p(x): //Bcout«tl«,\t>«t2<<*\n':)1、具有缺省参数的函数:在C++定义函数时,允许给参数指定一个缺省的值,在调用函数时,若明确给出了实参的值,则使用相应的实参的值;若没有给出相应的实参,则使用缺省的值。2,注意:(1)缺省参数的说明必须出现在函数调用以前。两种方法:一、函数定义放前,如上例;二、先给出函数的原型说明,并在院说明中依次列出参数的缺省值,而在后面的定义函数时,不能重复指定缺省参数的值。(2)参数的缺省值可以是表达式,但表达式所用到的量必须有确定的值。(3)在定义函数时,具有缺省值的参数可有多个,但在函数定义时,缺省的参数必须位于参数表中的最右边。例上例中A行不能写成:floatv(floata,floatb=10,floatc);〃或floatv(floata=20,floatb,float=20);(4)同一个函数在不同的作用域内,可提供不同的缺省参数值。四、函数的重载#include<iostream.h>intabs(intx){ //Areturn(x<0?-x:x);}floatabs(floatx){//Breturn(x<0?-x:x);)doubleabs(doublex){//Creturn(x<0?-x:x);)voidmain(void){inta;floatb;doublec;cin»a»b»c;cout«abs(a)«,\n,;//Dcout«abs(b)«,\n,;//Ecout«abs(c)«,\n,;//F)1、函数的重载:完成不同功能的函数可以具有相同的函数名。2、编译器根据函数的实参来确定应该调用哪一个函数。3、注意:(1)定义的重载函数必须具有不同的参数个数或不同的参数类型。这有这样编译系统才有可能根据不同的参数去调用不同的重载函数。(2)仅返回值不同时,不能定义为重载函数。例:floatfun(floatx){ }voidfun(floatx){ }此时两个函数名、参数的个数和类型均相同,仅返回值不同,将导致编译错误。第三节递归函数、变量的作用域和编译预处理一、递归函数#include<iostream.h>longintf(intn){if(n==Olln==l) return(l);elsereturnn*f(n-l);)voidmain(void){intn;cin»n;cout»f(n)»,\n,;}1、在定义一函数时,C++语言不允许在其函数体内再定义另一个函数,任一函数的定义均是独立的。函数之间都是平等的、平行的。函数之间的嵌套调用是可以的,即在调用一个函数时,在该函数的函数体内又调用另一函数。2、递归函数问题的求解过程:进行调用时,如果给出了实参值,则将实参值传递给对应的形参,若没有给出实参值,则用形式参数指定的默认值进行调用。3、举例说明:#include<iostream.h>intf(inti){if(i==l)return1;returni*f(i-l);)voidmain(void){intsum=O,t;for(intj=1;j<=4;j++){t=f(j);sum+=t;cout«t«V«sum«,\n,;})二、标识符的作用域和存储类1、标识符的作用域分类:块作用域,函数原型作用域,文件作用域,函数作用域和类作用域a)块作用域括号括起来的程序段称为块,块内标识符的有效范围是从声明处开始,到该块结束处为止。块的嵌套问题:当块A中嵌套另一个块B,块A与B中存在同名标识符,则在B中的标识符将屏蔽A中的同名标识符,即局部优先。if语句和switch语句的表达式(即括号中语句)中定义的标识符,作用域在该语句内。for语句的第一个表达式中声明的标识符,作用域为包含该for语句的整个块。有参函数形式参数的作用域为块作用域。b)函数原型作用域函数原型声明中参数的作用域为函数原型作用域,有效范围即参数所在的括号内。c)文件作用域:在所有函数之外定义的不属于任何块的标识符,所具有的作用域为文件作用域。有效范围从标识符声明处开始,一直到文件结束。具有文件作用域的变量称为全局变量。当全局变量与局部变量存在同名时,局部变量优先,但是可以通过作用域运算符“::”来强制调用全局变量。d)函数作用域指在函数内定义的标识符在其定义的函数内均有效。C++中,只有标号具有函数作用域。e)类作用域(后述)2、标识符的存储类分类:自动(auto)、寄存器(register)、静态(static)>外部(extern)a)自动(auto):局部变量默认为自动类型,且自动类型不能为全局变量,自动类型的局部变量定义后,未赋初值,则变量的值是不确定的。b)寄存器(register)c)静态(static)存储类型的变量分为全局变量和静态类型变量。静态类型的变量在程序开始运行时就为其分配存储空间,当程序结束时才释放其所占用的存储空间,因此在程序执行过程中,静态变量始终占用同一个存储空间。即,程序开始执行时就对静态类型变量初始化,若不赋初值其缺省值即所属类型的默认值。静态变量的作用域和普通变量一样。注意:静态的整形变量有确定的初值,其缺省的初值为0。d)外部(extern)类型变量必须是全局变量。通常在全局变量定义之前使用该变量时,在使用前需进行外部类型变量声明,或在一个源文件中引用另一个源文件中定义的全局变量时,引用前须进行该变量的外部声明。3^全局变量问题的分析(1)#include<iostream.h>intk;voidmain(void){k=10;for(inti=0;i<5;i++){intk;k=i+l;cout«k«**;::k++;)cout«\n,«k«,\n';}(2)#include<iostream.h>intz;voidfun(intx,int&y){z=x;x=x+y;y=y+z;cout<<x<<'<<y<< '«z<<endl;)voidmain(void){intx=5,y=10;z=15;fun(x,y);cout«x«;«y««z«endl;}4、静态变量问题的分析#include<iostream.h>intf(intx){staticintu=1;x+=x;returnu*=x;}voidmain(void){intx=10;cout«f(x)«'\n';cout«f(x)«,\n,;)#include<iostream.h>intf(void){staticinta,b=10,c=l;a+=b;b-i-=c;retumc=a+b;}voidmain(void){cout«f()«endl;cout«f()«endl;三、编译预处理1、定义:在进行编译处理前对程序进行的“预处理”工作。编译预处理指令一律以“#"开头,以回车符结束。#include文件包含格式为:#include〈文件名〉 〃目录include子目录下的文件或#include ”文件名” 〃当前工作目录下的文件被包含的文件一般是以.h、.cpp、.txt为扩展名的文件,一条include语句只能包含一个文件,文件的包含是可以嵌套的(2)宏定义/不带参数的宏定义:例:#definePI3.14159注意:末尾不加分号,宏名出现在字符串中不进行扩展/带参数的宏定义:例:#defineS(a,b)a*b/注意:宏名与括号间不允许有空格2、宏定义的应用(1)设有宏定义:#definef(x)(-x*2)执行语句:cout«f(3+4)«endl;则输出为#include<iostream.h>#defineSQR(x)x*xvoidmain(){inta,k=3;a/=SQR(k+l);cout«a«'\n';}(3)若有宏定义:#defineN2#defineY(n)((N+l)*n)则执行语句“z=2*(N+Y(N+2));"后,z的值为。第六章数组第一节数组(一):基本概念、数值型数组一、基本概念1、数组的定义格式一维数组:《存储类型》〈数据类型〉数组名[〈常量表达式>]二位数组:《存储类型》〈数据类型〉数组名常量表达式1>][<常量表达式2>]注意:1)《存储类型》指的是aut。、sataic等。2)〈常量表达式>要求其值必须是整型常量,一定不能是变量,如:inta[2];〃正确inta[2.5]; 〃错误,2.5这个实数不能出现在定义数组的大小inta[];〃错误,括号中一定要有确定的值intn=3;inta[n];//错误,因为定义数组中n是变量constintn=3;inta[n]:〃正确,因为此时n是常量3)默认维下界是0,上界为:V常量表达式>一14)数组的大小一维数组:(常量表达式〉的值二位数组:〈常量表达式1>的值Xv常量表达式2>的值5)数组在内存中的存储一维数组:第0个元素、第1个元素 依次存储二位数组:先将第。行的每个元素顺序存储,再依次存储第1、2等行的每一个元素。6)数组由如干个同类型变量组成的集合,数组中元素通过数组名加下标来访问。7)数组元素在内存中的存放是连续的2、数组元素的初始化:定义数组的同时给其元素赋值一维数组:方法1:inta[5]={1,2,345};〃后面列举5个常量值,注意其后面列出的常量的个数不能大于前面定义的数组大小5,但可以inta[5]={1,2},则表示前两个元素的指分别为1和2,后面三个元素的值均为0;方法2:inta[]={l,2,3,4,5,6};〃数组的大小由其后面列出的常量个数来确定,本例a十由6个元素组成的一维数组;二位数组:方法1:inta⑵⑵={{1,2},{3,4}}〃或者inta⑵[2]={1,2,3,4}方法2:int2[2]0={1,2};//表示第0行的两个元素值为1和2,第1行的两个元素值均为0方法3:吊12[][2]={1,2,3,4,5};〃行数省略,列数确定,则每次固定取出两个值放在数组的每一行,相当于inta⑶⑵={{1,2},{3,4},{5,0}},不够取出的则以0取代。注意:对于二维数组初始化时其列数不能省略,即inta[3][]={l,2,3,4}错误。3、数组赋值方法1:初始化方法2:通过循环语句注意:对数值型的数组千万不可以整体的赋值、输入和输出,如:inta[5];cin»a;〃错误cout«a«endl;//错误二、数组与函数:数组作为函数的参数情况一:数组元素作为实参,对应形参为普通变量,此时属于值传递。书写格式:调用函数的函数体:inta[10]={1,2,3);f(a[3]); 〃实参为a数组中的某一个数组元素被调函数:voidf(intb){ 〃值传递情况二:数组名作为实参,对应形参为同类型同大小的数组,此时属于地址传递。调用函数的函数体:inta[10]={1,2,3};intb[2][3];f(a,b); 〃此时a,b后面不可以有括号被调函数:voidf(intaa[10],intbb[2][3]){〃或voidf(intaa[],intbb[][3]))三、举例1、定义(1)下列数组定义中错误的是()A、inta[*a*]B、intx=5,a[x];C、intaa[2][3]D、intaa[l];(2)若有“doublea[3][4]“,贝ijsizeof(a)的值是(3)下列数组定义中错误的是A、intal[2]={l); B、inta2[][2]={{l},{2});C、inta3[3]; D、inta[][3];2、数组作为函数的形参时,把数组名作为实参,传递给函数的是1A.该数组的首地址B.该数组的元素个数C.该数组中的各元素值D.该数组的大小3、一维数组的应用(1)排序(选择、冒泡)选择for(inti=O;i<n—1;i++)for(j=i+1;j<n;j++)if(a[i]>a[j]){intt=a[i];a[i]=a[j];a|j]=t;)冒泡for(inti=O;i<n-l;i++)for(j=0;j<=n-i-2;j++)if(a[j]>a[j+l]){intt=a[i];a[i]=a[j];a|j]=t;}(2)最大(小)值(3)在有序的一维数组中插入值x后保持新数组也有序。(4)结合等级考试真题讲解4、二维数组的应用求每行(列)元素的最大(小)值。将最大(小)值所在的行(列)和最小(大)值所在的行(列)顺序交换元素。求上(下)三角元素之和将二维数组的行元素和列元素交换位置。求(主、副)对角线元素之和将二维数组顺(逆)时针旋转90度求边界元素之和求两个二维数组之和(积)。以上程序输出的是#include<iostream.h>voidmain(void){inta[4][4]={{1,2,0,-1),{3,-2,-3,0},{4,0,-5,5},{66,0,7));for(inti=0,s=0;i<4;i++)for(intj=0;j<4;j++){if(a[i][j]<0)continue;if(a[i][j]==O)break;s+=a[i][j];)cout«s«endl;第二节字符数组一、字符数组1、定义《存储类型》char数组名[(常量表达式>]其中:《存储类型》、《常量表达式>]和前一章的要求一致。2、初始化方法1:charstr[5]=rc',h,T,2}//每一个元素都是一个char类型变量,对没有指定具体值的元素,字体自动设其值为空(ASCII值为0),即str[0]=,c,,str[l]=,h,,str[2]=,l,,str[3]=<2,,str[4]=,\0,.方法2:charsU=ra;b,,e,d/e,}〃实际数组s的大小由括号中列出的字符常量个数决定,即定义了s数组的长度为5。方法3chars[5]="abc";//相当于5[0]='求闻1]='1>'闻2]='(:过3]=30,是字符结束标记,而5[4]=,\0,为系统自动配置的值。要求定义的长度(本例中是5)要大于后面赋予字符串中字符的长度。3、注意:1)字符串的结束标记是'\0',也可写成0。但不能等于,0"2)注意以下写法:chars[5]=^^12345^^;//错误,因为定义的长度(本例中是5)要大于后面赋予字符串中字符的长度。charss[5];ss='"123";〃错误,不能直接赋值ss[2]="2";〃错误,因为赋值号后面字符串中字符个数(2个),而ss⑵是存储一个字符的数组元素。ss[2]='a';〃正确,类型匹配3)字符和数值类型转换:chars='a';ints2=3;intaa=s-O;//字符型转换成数值型方法为:字符型字符一'0'charaa2=s2+O;〃数值型转换成字符型的方法为:数值型+,0'4)字符数组是字符串的一种表示方法,此时要注意字符串结束标记、0、4、数组元素赋值方法1:初始化方法2:循环语句方法3:通过字符串函数strcpy注意:1)字符数组可以直接输入和输出。2)当字符数组整体输出时,它输到、(T为止。二、字符串处理函数1)用以下函数时需要在文件开始处加一条如下语句:#include<iostream.h>strlenstrlen(str):求字符串str中第一个结束符号、(T之前所有字符的个数(不包括该结束符号)注意:sizeof(str)函数不管str中山多少个结束符号,其返回值总是str中所有字符(不论是否时结束符号)的个数。strcpystrcpy(strl,str2):将str2赋值给strl,要求strl的长度要大于str2的氏度。strcatstrcat(strl,str2):字符串连接函数,先去掉strl后面的结束符号,然后将str2连接到strl之后,要求strl所在的字符数组要由足够的剩余空间以容纳str2«strcmpstrcmp(strl,str2):字符串比较函数,其值有三个0,1,-1若:strcmp(strl,str2)=0;//表示strl和str2相等;strcmp(strl,str2)=l;〃表示strl大于str2;strcmp(strl,str2)=-1;//表示strl小于str2;三、字符数组的应用1、基本概念(1)设有说明语句:chars[]="ef\0\123\\\n89”;sizeof(s)的值是。(2)设有说明语句:chars[]="ab\0\123\\\n79”;strlen(s)的值是。(3)若有“charp[]=''A\0BC\0DEF\n'',则strlen(p+4)的值是。(4)判断两个字符串si和s2是否相等,应当使用if()o2、程序分析(1)以下程序的功能是将已知字符串中某个字符删除,生成一个新字符串。include<iostream.h>voidmain(void){intij;chars[]="hayagafeaak";cout«"Theoldstring:n«s«endl;TOC\o"1-5"\h\zi=j=0; //Afor(;s[i]!=10';i++)if(s[i]!='a,)s[j++]=s[i]; //Bs[j]=W,; //Ccout«MThenewstring:H«s«endl;)(2)一个字符串若正向拼写与反向拼写都一样,则称之为“回文",如"madam”是一个回文。判断时,忽略大小写字母的区别、空格及标点符号等。即“Madam,FmAdam”也是回文。#include<iostream.h>#include<string.h>intf(chars[]){intnl,n2j=0,i,n3;chars2[80];nl=;//strlen(s)for(i=0;i<n1;i++){if()s2[j++]=s[i];//s[i]>=a'&&s[i]<=z'if(s[i]>='A,&&s[i]v=Z)s2[j++]=; //s[i]+32)s2|j]=; 〃V),n2=strlen(s2);n3=n2/2;for(j=0;j<n3;j++)if()break; //s2[j]!=s2[n2-l-j]if()return0; //j<n3elsereturn1;voidmain(void){chars[80]=nMadamJ'mAdam”;if()coutvv”Yes”;〃f(s)elsecout«nNo";导出的数据类型第七章结构体、共同体和枚举类型一、结构体类型格式:struct〈结构体类型名>{〈类型名>〈变量1〉;〈类型名〉(变量2;;};(1)注意结构体类型和结构体类型变量的概念。(2)结构体的成员可以是任何一种类型的数据,包括基本类型和构造类型。不能指定成员的存储类型为auto、register,extern,但是可以指定其为static«(3)结构体类型变量的定义•般格式:(结构体类型名〉〈变量名1>,(变量名2>, <变量名n>;注意:可有三种方法来定义:方法一:先定义结构体类型,再定义结构体类型变量方法二:定义结构体类型同时定义结构体类型变量,并给结构体类型命名方法三:定义结构体类型同时定义结构体类型变量,不给结构体类型命名(4)结构体类型与结构体类型变量必须先定义结构体类型,再定义结构体类型变量。定义结构体类型时不给成员分配存储空间,定义结构体类型变量时才真正为其分配存储空间。使用时必须通过变量来完成具体的操作。结构体变量的存储空间为其所有成员占用的空间之和。例如:si的存储空间为2+20+1+2+4*3=37(bytes)(5)结构体类型变量的初始化studentsl={1012,“mary",'F',19,87,92.5,72};注意:初始值表中的数据类型必须与定义结构体类型时成员表中的类型一致。另外,初始值表中的数据的个数只能小于等于结构体成员表中元素的个数。(6)结构体类型变量的应用对结构体变量的使用一般是通过对其成员的引用来实现的。一般格式为:〈结构体变量名〉.<成员名〉例题:①输入20个学生的基本信息到数组s2for(i=0;i<20;i++)cin»s2[i].id»s2[i].name»s2[i].sex»s2[i].age»s2[i].eng»s2[i].phy»s2[i].math;②统计20个人的各门课程的平均成绩for(i=0;i<20;i++){ave_eng+=s2[i].eng;ave_phy+=s2[i].phy;ave_math+=s2[i].math;)ave_eng=ave_eng/20;ave_phy=ave_phy/20;ave_math=ave_math/20;③输出20个学生的基本信息和各门课程的平均成绩cout«”学号\t”《"姓名\t”《"性别\t“vv”英语成绩\t”《"物理成绩\t”《”数学成绩\n”;for(i=0;i<20;i++)cout«s2[i].id«,\t,«s2[i].name«,\t,«s2[i].sex«,\t,«s2[i].age«,\t,«s2[i].eng«,\t,«s2[i].phy«,\t,«s2[i].math«endl;coutv<”英语平均成绩:”《ave_eng«endl;coutvv”物理平均成绩:,,«ave_phy«endl;cout«”数学平均成绩:”《ave_math«endl;二、共同体类型定义格式:union(共同体类型名>{〈类型名〉〈变量1>;〈类型名〉〈变量2〉;(1)定义共同体类型变量基本格式:〈共同体类型名〉 〈变量名1>,(变量名2>,……〈变量名n>;注意:同结构体类型变量一样也有三种定义方法。这里省略。(2)结构体和共同体的区别1)不同点:共同体变量:其分配的存储空间为其成员中最大的一个所占的空间,所有成员使用同一个存储空间,因此在某一时刻,只有一个成员是有效的。结构体变量:其分配的存储空间为其所有成员所占的空间之和,各个成员都有自己的存储空间,在任一时刻,所有成员都是有效的。2)相同点它们都是一种新的数据类型,都必须先定义这种新的数据类型,再定义具有这种数据类型的变量。并且系统不会为这种导出的数据类型分配内存空间,只会为具有这种数据类型的变量分配内存空间。(3)共同体类型变量的应用和结构体类型变量的应用相同,可以参考前面的内容,这里省略。三、枚举类型1、基本格式:enum〈枚举类型名>(<枚举量表>};(1)〈枚举量表〉山逗号隔开的标识符组成,这些标识符称为枚举元素或枚举常量。例如:enumweekday!Sun,Mon,Tue,Wed,Thu,Fri,Sat};weekday有七个元素,这七个元素的名字分别为Sun、Mon,Tue、Wed、Thu、Fri>Sat,但实际存储整型值,默认从0开始,依次加1。如例题中的值分别为0、1、2、3、4、5、62、定义枚举类型时也可以指定元素的值为一整型数例如:enumweekday!Sun=7,Mon=l,Tue,Wed,Thu,Fri,Sat);这时Sun、Mon、Tue、Wed、Thu,Fri、Sat对应的整型值分别为7,1,2,3,4,5,63、指定的整型数也可以相同例如:enumcolor{white,red,blue=l,green,yellow,black=2};这时white,red,blue,green,yellow,black对应的整型值分别为0,1,1,2,3,24、枚举类型变量的定义与结构体变量的定义方法类似,也有三种方法,常用第•种方法。例如:weekdaydayl,day2;colorc[10];四、应用1、问程序输出的结构是#include<iostream.h>voidmain(void){structs{inta;floatyl;floatx[3];inty2⑵⑶;};ssi;cout«sizeof(sl);}2、执行以下语句序列:enmu{Red,Blue,Yellow}cl,c2;cl=Yellow;//Acout«cl; //B则oA.输出IB.输出2C.输出3D.B行语法错第十章类和对象【2】第一节基本概念一、类的概念1、类是对一组具有共同属性的事物的抽象,从语言角度讲,它是一种自定义的数据类型,其中既包含有描述其属性的数据,又有处理这些数据的操作(函数),它是C++封装的基本手段。2、类是对一组具有共同属性的事物的抽象,从语言角度讲,它是•种自定义的数据类型,其中既包含有描述其属性的数据,又有处理这些数据的操作(函数),它是C++封装的基本手段。3、类是一种导出型数据类型,或称用户自定义的数据类型,在定义类之后就可以用它来说明变量,具有类类型的变量称为类的对象,或者称为类的实例。类的作用和功能主要通过它的对象体现。前面一经提过,类的定义仅说明一种新的数据类型,此时并不为它分配存储空间,只有在定义类的对象时,系统才会为该对象分配内存空间。在程序中定义对象的语法和定义变量相同。在定义对象之前,一定要先进行类的定义或声明。二、类的特性面向对象程序设计要素:封装性、继承和派生性、重载性、多态性。三、对象的概念第二节类和对象一、类1、类的定义(定义类的格式与结构(struct)类似。)class(类名>{《《private:》(私有成员数据和成员函数〉;》《public:〈公有成员数据和成员函数〉;》(protected:〈保护成员数据和成员函数〉;》);其中:private限定的成员称为私有成员,私有成员只限定在该类的内部使用,即只允许该类中的成员函数访问私有的成员数据和私有的成员函数:public限定的成员称为公有成员,公有成员数据不仅可以被该类中的成员函数访问,而且能够被类外的函数访问,同样,公有成员函数可以被类中的成员函数和类外的函数调用;•protected限定的成员称为保护成员,对保护成员的访问要求与私有成员类似,只是在产生派生类时与私有成员不同,保护成员可以在派生类中被派生类成员所访问。♦前三者在程序中出现的顺序无关紧要,每个关键字在类体中可使用多次。当使用一个这样的关键字(如private)来限定成员的访问权限时,从紧跟该关键字后的第一个成员开始,到出现另一个限定的饿关键字之前的所有成员的防哪个问权限够有该关键字确定。同样,在定义一个类时,类体中定义成员的顺序无关紧要,可先定义成员数据,也可先定义成员函数,也可将成员数据夹在成员函数之间,还可成员函数插在成员数据之间。#include<iostream.h>classAA{intx[10];intm;intsum;public:voidf(inta[],intn){inti;for(i=0;ivn;i++)x[i]=a[i];m=n;sum=0;}voidg(void){inti;for(i=0;i<m;i++)sum+=x[i];}voidshow(){inti;for(i=0;i<m;i++){cout«x[i]«^';if((i+l)%5==0)cout«endl;}cout«,'sum=,,«sum«endl;)};或者:classAA{intx[10];intm;intsum;public:voidf(inta[],intn);voidg(void);voidshow();};voidAA::f(inta[],intn){inti;for(i=0;i<n;i++)x[i]=a[i];m=n;sum=O;)voidAA::g(void){inti;for(i=0;i<m;i++)sum+=x[i];}voidAA::show(){inti;for(i=0;i<m;i++){cout«x[i]«,\t,;if((i+l)%5==0)cout«endl;)cout«"sum="«sum«endl;}2、注意:(1)类是一个数据类型,它定义的是一种对象类型,由成员数据和成员函数组成,描述了属于该类型的所有对象的性质。(2)通过类定义的变量称为对象。类是抽象的,对象是具体的。(3)类中的任何成员数据均不能使用关犍字extern、auto以及register等(static除外)来限定其存储类型。(4)类中的成员具有类作用域,即类中的成员的有效范围为整个类体,它们只能供类中的成员函数访问,外部环境不能直接访问类的成员。可以通过对象访问类的成员。(5)不为类分配存储空间,不能对类中的成员数据初始化。(6)编译系统只为对象中的成员数据分配存储空间,而同类对象的成员函数的代码是共享的。(7)对象只能访问公有成员。对象只能通过公有成员函数间接地访问其私有成员或保护成员。3.类与结构的异同(1)结构是类的一种特殊情况,结构也可以定义成员函数。(2)结构的数据成员默认为public,类的数据成员默认为private。(3)通过时象(或对象指针)访问类的成员的方法和通过结构体变量(或结构体指针)访问结构体成员的方法完全一样。二、对象1、对象:具有类类型的变量,即类的实例。使用方法与结构体变量的使用方法相同。2、对象的说明(先定义后使用)一般格式:[存储类型]〈类名〉〈对象名〉….3、应用:#include<iostream.h>classAA{intx[10];intm;intsum;public:voidf(inta[],intn){inti;for(i=0;i<n;i++)x[i]=a[i];m=n;sum=0;)voidg(void){inti;for(i=0;i<m;i++)sum+=x[i];)voidshow(){inti;for(i=0;i<m;i4-+){cout«x[i]«At,;if((i+l)%5=0)cout«endl;}cout«',sum=',«sum«endl;));voidmain(){intt[]={1,2,3,4,5,678,9。};AAarl;arl.f(t,10);arl.gO;arl.show();三、成员函数的重载成员函数重载的原则与普通函数事载的原则相同,即重载函数之间靠所包含的参数的类型或个数之间的差异进行区分,即要实现两个同名成员函数的重载,其参数的类型或个数必须不同。classCAdd{TOC\o"1-5"\h\zintAdd(inta,intb){returna+b;} //AdoubleAdd(doublex,doubley){returnx+y;} //B);intAdd(inta,intb){returna+b;} //C

voidmain(){〃调用A〃调用A行定义的函数〃调用B行定义的函数〃调用C行定义的函数cout«,'5+3=**<<c.Add(5,3)«endl;cout«"3.5+6.l="«c.Add(3.5,6.1)«endl;cout«M5+10="vvAdd(5,10)«endl;)四、this指针的概念*this指针是一个指向当前被操作对象的特殊指针。在类的成员函数中,*this指针代表当前对象。*this指针是一个常量指针,只允许在成员函数内使用该指针,不允许修改指针的值,但可以改变指针所指向的数据的值。第八章指针第一节指针概念、指针与一维数组、指针与字符串一、指针概念1、定义格式:〈数据类型〉*v指针名>;2、作用:存放相同数据类型的变量的地址。举例:inta,*p;p=&a;3、注意:1)p存放变量a的地址。2)若执行语句*p=3;则变量a的值变成3,而变量p的值不变。3)任何类型的指针变量都只分配4个字节的内存空间,这与它所指向变量的类型无关。4)在使用指针前,指针必须有一个明确的值,即指针必须指向一个具体的内存单元。4、指针变量可以进行的运算:一赋值比较二、指针变量与一维数组inta[5]={l,2,3,4,5),&p=a;1、数组名a:数组的首地址,等效于&a[0];但是数组名a不能进行:a++,a」因为数组名永远代表了数组的首地址,但是可以写成a+1(此时a仍然是首地址);2、此时(即指针变量指向首地址),数组元素a[i],可以写成:p[i]或*(a+i)或*(p+i);3、注意while(*p++);后p的指向!4、注意:*p++ *(p++) (*p)++#include<iostream.h>voidfun(int*a,int*b){(*a)++;*b++;*a++;(*b)++;cout«*a«,\t,«*b«endl;)voidmain(void){intcl[3]={l0,20,30},c2[3]={40,50,60);fun(cl,c2);cout«c1[O]«,\t,«c1[1]«endl;cout«c2[0]«'\t'«c2[1]«endl;}5、指针变量作为参数:#include<iostream.h>voidf(int*s,intnl,intn2){intt;while(nl<n2){t=*(s+nl);*(s+nl)=*(s+n2);*(s+n2)=t;nl++;n2--;voidmain(void){inta[10]={l,2,3,4,5,6,7,8,9,0},i,*p=a;f(p,0,3);f(p+3,1,6);for(i=0;i<10;i++){if(i%5==0)cout«z,\n/z;cout«a[i];}}#include<iostream.h>voidfun(intn,int*s){intfl,f2;if(n==l||n==2)*s=l;else{fun(n-1,&f1);fun(n-2,&f2);*s=2*fl+f2+l;cout«fK<,\t,«f2«,\n,;}}voidmain(void){intx;fun(4,&x);cout<<,,x=,,<<x«>\n,;・补充:参数传递假设实形参数定义为:inta,*p,A[10],B[4][3],;实形参数a*a*aAAB形式参数aa&aa*aaintAA[10]或intAA[]int*ppintBB[4][3]sgBB[][3]结合方式值地指A后面不可以带指针ppB后面不可以带[10]结址针[10]指向A⑼BB[][3]不可以写成合结传所在的存BB[4]口或者BB[][]合递储空间实形参数Ba函数名形式参数int(*q)[3]&aa指向函数的指针变量结合方式int(*q)[3]不可写成int*q[3]或int*q引用传递指向函数的指针变量形式为:int*f(参数列表)*不在上述表中或不符合上述写法的则其语法错误!三、指针与字符串chars[]="abcd,,,&p=s+l;cout«*s«endl«s«endl;则输出:bbed注意:1、*s表示s当前所指向的那个单.元的一个字符;2、s表示从s所指向的那个单元开始到'\0'之前的所有字符;第二节指针与二维数组、函数的返回值是指针变量、指向函数的指针变量一、指针与二维数组1、概念:行地址:元素地址:数组元素(值):2、参考书149页表8—1^include<iostream.h>voidf(int*ql,int*q2,int*q3){q3=ql+*q2;)voidmain(void){inti,j,a[3][3]={1,1},*pl=a[0],*p2=a[0]+l,*p3=a[0]+2;for(i=2;i<9;i++)f(pl++,p2++,p3++);for(i=0;i<3;i++){for(j=0;j<3;j++)cout«a[i][j]«,\t,;cout<<,\n,;}二、函数的返回值是指针变量ttinclude<iostream.h>float*f(float*p,floatx[],intn){floatsum=0;for(inti=0;i<n;i++)sum+=x[i];p=∑x[n]=sum;returnx+n;voidmain(void){floatx[]={l,2,5,7,0},s=0,*pl,*p2=&s;pl=f(p2,x,4);cout«**pl=*«*pl«,\n;cout«"*p2=”<<*p2«'\n';三、指向函数的指针变量(函数名表示该函数的入口地址,即在内存中的起始地址)1、定义指向函数的指针变量的格式:V类型标识符,(*V变量名>)(〈参数表〉)例:float(*fpl)(void)float*(*fp2)(float*,float**);2、注意:指向函数的之中呢变量只能指向与该指针变量具有相同返回值类型和相同参数(个数及顺序一致)的任一函数。3、举例:#include<iostream.h>intf(intx,inty){returnx*y;}voidmain(void){inti,j,(*fun)(int,int);fun=f;for(i=l;i<4;i++){switch(i){case1:case2:j=(*fun)(i,i+1);break;case3:j=(*fun)(i-1,i+2);break;)cout«,,j=,,«j«,\n,;}}#i

温馨提示

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

最新文档

评论

0/150

提交评论