《c++面向对象程序设计_自学指导书.docx》由会员分享,可在线阅读,更多相关《c++面向对象程序设计_自学指导书.docx(101页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C+面向对象程序设计自学指导书浙江师范大学信息科学与工程学院朱建新编2005年4月30日第章C+语言概述4【学习要点】4【例题分析】4【思考题】5第二章基本数据类型运算符及表达式6【学习要点】6【例题分析】6【思考题】8第三章控制结构8【学习要点】8【例题分析】9【思考题】17第四章数组20【学习要点】20【例题分析】21【思考题】24第五章函数与编译预处理33【学习要点】33【例题分析】33【思考题】40第六章指针49【学习要点】49【例题分析】50【思考题】58第七章结构体与共用体60【学习要点】60【例题分析】60【思考题】67第八章类与对象70【学习要点】70【例题分析】71【思考题】
2、77第九章继承与派生类80【学习要点】80【例题分析】80【思考题】84第十章运算符重载与虚函数89【学习要点】89【例题分析】89【思考题】99第十一章文件与流类库100【学习要点】100【例题分析】100【思考题】105第一章C+语言概述本章主要介绍C+十的起源、发展历史及其特点;C+十程序的基本结构; Visual C +6.0集成开发环境及上机操作过程。【学习要点】1 . 了解C+十语言的特点。2 .理解C+十语言源程序的结构、书写格式和main 函数的作用。3.熟悉Visual C+6.0集成开发环境。熟练掌握利用Visual C+6.0集成开 发环境开发、调试C+十控制台程序的步骤
3、和基本操作。【例题分析】、选择题例1-1以下叙述中正确的是。A.C+十程序由main 函数组成B.C+十程序由函数组成C. C +十程序的执行从第一个函数开始D,在C +十程序中,注释只能位于一条语句之后解:对于C+十程序应明确:(1)程序由函数组成。个可运行的C+十源程序可由一个且仅能由一个main 函数加上其他的函数组成,其他函数可有可无。(2)不管main 函数出现在什么位置,程序总是从main 函数开始执 行。(3)注释的两种方法:是用/和/把注释信息括起来;二是用/,它表示 之后到本行结束为注释内容。可以在程序任何位置进行注释。正确答案:B二、填空题例1-2在下列程序的每行之后加上注
4、释。#include iostream.hvoid main () (coutHello!n;cout Welcome to C+!n; | 解:注释如下:# include iostream.h 指示编译器在此处将文件iostream.h上中的代码嵌入本程 序。void main ()主函数,void表示main ()函数没有返回值。coutHello!nj 输出字符串“Hello!”到显示器上。cout “Welcome to C+ + !nJ 输出 字符 串 “Welcome to C + + !n”。)例1-3 C+十中函数的函数体由符号一开始,用符号结束。解:C+十中函数的函数体由符
5、号“ 开始,用符号“ ”结束。三、编程题例1-4编写个程序,运行时提示输入个数字,再把这个数字显示出来。解:程序如下:#include Hiostream.hnvoid main()(int i;cout请输入 个数字:;cini;coutw”你输入的数字是“ vviwendl;【思考题】、选择题1 .C+十语言规定:在个源程序中,main 函数的位置。A.必须在最开始B,必须在系统调用的库函数的后面C,可以任意D,必须在最后2 .以下正确的叙述是。A. C+十程序的每行中只能写个语句B. C+十语言本身无输入、输出语句C.在对个C+十源程序进行编译的过程中,可发现注释中的拼写错误D,在C+十
6、程序中,main 函数必须位于程序的最前面3 .以下符号中能作为用户标识符的是。A. _123 B. void C. struct D .switch4 . C+十语言程序的基本单位是_。A.程序行B.语句C.函数D.字符二、填空题5 . 个可执行的C +十程序至少必须有一个函数。6 . C+十源程序中注释的作用是。7 . 一个C+语句以_结束。_是C+十语句的组成部分。8 .在C+十语言中输入、输出操作是通过一来实现的。9,在下列程序的每行之后,上注释。#include void main()int nl, n2, sum;contnln2;sum=nl+n2;coutnl+nl= sum
7、endl;)三、编程题10 .参照例题分析,编写个C+十程序并上机运行,能输出以下信息:Hello, C+ + !11 .编写个C+十程序,输入任意三个数a,b,c,能输出其中的最大值。第二章基本数据类型运算符及表达式本章是C +十语言中需要熟记的内容最多的一章,对于数据类型、运算符、表 达式等内容既要熟记,更要灵活运用;特别要注意与自然语言明显不同的逗号运 算、自增自减等运算的特点。【学习要点】1 .掌握常量与变量、整型数与实型数的概念。2 .掌握字符型数据与字符串型数据的概念以及二者的区别。3 .掌握各种类型的变量说明及其初始化。4 .掌握算术运算、逻辑运算、关系运算、赋值运算、逗号运算等
8、概念。5 .掌握运算符的优先级、左结合和右结合规则以及目数的概念。6 .掌握表达式求值时类型的自动转换和强制类型转换。7 .掌握表达式的组成、表达式的优化。8 .掌握位运算和位运算符。【例题分析】、选择题例21下列不合法的变量名为_A. student B. -student C._student D. student ()解:根据变量命名要求,音字母以英文字母或下划线开头。正确答案:Bo例22下列不合法的变量名为A. t%udent B. astudent C. s_tudent D. studen ()解:根据变量命名要求,变量反组成只能由大小写字母、数字、下划线组成。正确答案:A,例23
9、下列不合法的变量名为_A. lint B. inti c. int D.int解:根据变量命名要求,系统关键字能作为变量名。正确答案:Co例24当a=6, b=5时,逻辑表达式a8的值为_A. true B. false C, 非 整型数D. 解:根据题意和该逻辑表达式的运算结果。正确答案:Co例25设X, y, Z为整型数,下列各式中,运算结果与X=y=24的表达式相 同的是。A. x=(y=z=8, 4X6)B. x= y= (z=8, 4X6)C. X=y=z=8, 4X6D,x= (y=z=8) , 4X6解:C+语言的赋值运算有别于其他高级语言,逗号运算又是其他高级语言所没有 的。1
10、 .在赋值表达式中,可以有多个赋值运算符;计算顺序自右向左,运算优先 级低,仅高于远号运算符。2 .逗号既是分隔符,又是运算符,可以用个逗号运算符或多个逗号运算得将 多个表达式连接成逗号表达式,计算顺序自左向右,并将最后一个表达式的值作为 整个逗号表达式的值,运算优先级最低:例:a= (2X2, 4+6, 20/4, 6);结果 a=6o 正确答案:B。例26设i=6, k=0下列各式中,运算结果为k=7的表达式是。A. k=i+ + +k B. k=k+i+ C. k= + +i+k D. k=k+ (十十 i) 解:自增十十、自减运算符是C+十语言特有的。1 .运算符在变量的前面或后面,其
11、运算结果是不同的。若十十或在变量前;则 先将变量的值加1(或减1后,再将变量的值参加运算;反之则先将变量的值参加 运算;再将变量的值加1 (或减1)。2 .自增、自减运算符优先级高于算术运算符,A式i+ +k,先计算i+ + , 再。k, D式k= k+ ( + +i),若去掉括号,则改变了运算顺序;变为k+十 后,再十1。正确答案;C和D。二、填空题例2-7表达式,A,+B+20的值为_解;不同类型的数据混合运算时,系统可以自动进行类型转换,将表示范围小 的数据类型转换成另操作数的相同类型后再参与运算,则转换为65 + 66 + 20 = 151例 28 如果定义 inte=8; doubl
12、e f=6.4, g=8.9;则表达式 f+int (e / 3*int (f+g) /2) %4 的值为_。解:不同类型的数据混合运算时,可以使用强制类型转换符,强制将一种数据 类型转换成另种数据类型后再参与运算,对于表达式,先求表达式的值,然后再 转换值的类型,本例的运算结果为9.4。若将式中e/3改为e/3.0则运算结果为6.4,因为e/3的值是整型数,而e/3.0的值是实型数,改变了 括号内的运算结果,致使整个表达式的值发生变化。例 29 若 inti=65535, j = 0 xOOOx, k: k=i&j;,则 k值为_, i 值为_。解:将10进制数65535和16进制数OOOa
13、H在计算机内的二进制原型数值按位 与运算,结果为k= 10, i为655350三、编程题例2-10编写个将华氏温度转换为摄氏温度的程序。转换公式为C =(5.0/9) (F32),要求输出华氏温度和摄氏温度的对应值。解:程序如下:#includevoid main ()double C,F;coutvv”输入华氏温度值:“;cinF;C=(5.0/9)*(F-32);cout华氏温度为:“VVFVVV对应的摄氏温度值是:Cendlendl;【思考题】、选择题1 .以下可作为正确变量名的是。A , class B. class 1 C. 1 class D. class2以下可作为正确变量名的是
14、。A . case B. -cd C. 33 D. 33s3 .若a=15, b=3时,逻辑表达式a8的值为A. ture B. folse C. 非 整型数D. 4 .若a和b为整型变量,语句b= (a=l+2aX3) , a+5运行后,a和b的结果为A . 9, 8 B. 3, 8 C. 3, 9 D. 9, 145 .以下不正确的叙述是。A,在C +十程序中,PI和pi是不同的变量B,在C+十程序中,逗号运算符的优先级最低C.当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能 输入实型数值D.若s、t为int数,设t=S2后,s的值不变6 .若int a; char b;
15、 float c; double d;则表达式a*bc+d值的数据类型为_。A. int B. float C. double D. char7 .已知字母A的ASCII码为十进制数65, D为字符型变量,则D=A+9-4 的值。8 .若a为16进制数,若想通过a&b运算使a的二进制数的高4位清零,低4位 不变;则b的16进制数是。9 .编制程序,输入相应字母的ASCII码值,输出该字母。10 .用C+描述面命题:(1) a小于b或大于c(2) a和b中至少有一个大于c。(3) a和b中只有一个大于Co(4) a和b中两个都大于c。第三章控制结构【学习要点】1 .掌握顺序结构的编程方法,这是程
16、序设计的基础。2 .学会cin、cout实现输入/输出数据。3 .学会应用字符输入/输出函数。4 .掌握printf函数和scanf函数。5 .掌握条件语句的形式和使用.6 .掌握条件语句的嵌套。7 .掌握条件运算符的使用。8 .掌握switch语句的形式和使用。9 .掌握for. while, do一while三种循环语句。10 .掌握循环的嵌套。11 .掌握 break, continue, goto 语句.【例题分析】、多项选择题例3 1如有以下定义和输入语句,若要求al、a2、el、c2的值分别为 20、60、A、B,则下列数据输入方式中正确的是。int al,a2;char cl,c
17、2;cina Icla2c2;A. 20A 11 60B B. 20,A,60,BC. 20 LJ A 11 60 L-1 BD. 20A60B E. 20A6 0 B注:此处为空格符,为回车键符,下文同。解:C +十语言没有专门的输入/输出语句,其输入/输出可通过输入/输 出流来实现。ein不能将输入的空格赋给字符型变量,空格和回车键均作为输入 字符之间的分隔符;字符型变量只能容纳个字符,整型数只能由数字组成; 逗号不能作为分隔符。正确答案:A、C、D、Eo例32设有语句float PI= 3.14:,若用科学表示法输出为3.140000e+000 则下列正确的表达式为_A. coutPIe
18、ndl;B. cout.setf (ios: scientific, ios:floatfield) ;coutPIn;C. printff% 12.10仙,PI);D. printf(%en, PI);解:C+十语言除用输岀流输出数据外,还可用C语言的输入/输出函数,但需 包含stdio.h,其输出格式与C+十输出流格式不同:C+十中可用预定义的格式控制 函数定义输出格式,也可以用ios类的成员函数进行格式控制。若学用科学表示法输 出数据,必须用ios类成员函数setf设置状态标志。printf函数必须用e格式符可 以输出科学表示法形式的数据。正确答案:B、D,二、填空题例3-3以下程序的输
19、出结果为# include void main ()(short i;i=-6;cout oct= octidec deci ,hex=hex iendl:解:i为short类型,占用2字节内存,而。ct、dec、hex是C+十中预定义的格 式控制函数控制输入/输出数据的格式。答案为。=177772,dec=-6, hex=fffao例3-4以下程序的输出结果为# include void main () (int i=66;char c=,A,;coutMi=M(char)i,c=Mdecinii;解:本程序采用了强制型转换符,将i转换为字符型数据输出,又用格式控制函数 将字符型数据转换成数
20、值型数据输出。答案为1 = 8, C=66a例3-5以下程序的输出结果为#include void main() (int i=0,x=0,y=0;do i+:if(i%3!=0) x+=i; i-H-;y+=i 卄; while(i5),cout,x=MxM y= vyendl;)解:x = 5 y = 7例3-6以下程序的输出结果为#include void main() |int x, y=10;while(x=y-l) y-=2;if(y%3=0) x-H-; continue;)else if(y4) break;X-H-;coutMx=,xH y= yendl;)解:输出结果是:x
21、=3y=2例3-7以下程序的输出结果为#includevoid main() int i,j,m;fbr(i=l;i4;i+) for(j=l;j7y-h+) f(j= =4) break;coutiM * njM= m n;coutendl;解:运行结果如下:1X1= 1 1X2 = 21X3 = 32X1=22X2=42X3=63X1=33X2=63X3=9注意:当j的值为4时,结束的是内层循环,外层for循环继续执行。例3-8以下程序的输出结果为#includevoid main()int i j,m;fbr(i= l;i4;i+) ifi(j = = 4) continue;m=i *
22、j;couti * jM=n mM M;coutendl;解:运行结果如下:1X1 = 11X2=21 X3=31X5=51 X6=62X1 =22X2=42X3=62X5 = 102X6= 123X1=33X2=63X3=93X5 = 153X6= 18注意:continue结束本次循环,即当j的值为4时,内层循环体的条件语句后面的部 分不执行,循环变量j自加,执行下一次内层循环。例39输入一个自然数,输出其各因子的连乘形式。如输入12,输出12=12X2X3的形式,请填空。#include void main()int i=2, n;coutw”输入一个自然数:;cinn;coutn=;d
23、o if(n%i= =0) cout,*i;1:else i+; while(2);)解:n=n/i:n! = l三、编程题例3-10编程实现如下所示的函数关系式。已知X,求y的值。-X (xl)y= J x+5(lWxW10)5(x2 10)解:该函数实质是个分段函数,即根据x的不同取值范围,由相应的函数式求y 的值。(1)使用缺省else的if语句形式#inc 1 udevoid main()float x,y;coutMEnter a number:cinx;if(x= 1 &x=10) y=x-5;coutMy= yendl;)(2)用条件语句的嵌套形式实现#inc 1 udevoid
24、 main()(float x,y;coutnEnter a number:M;cinx;ifi(xl) y=x;else if(x 10) y=x+5;else y=x-5;cout ” y= yendl;)例3 11根据输入的年月,求出该年该月的天数。解:本题要根据月份来讨论天数,如是大月(1, 3, 5, 7, 8, 10, 12)则天数 是31,如是小月(4, 6, 9, 11)则天数是30;如是2月;要看该年是否闰年,是 闰年则为29天,非闰年则为28天,显然本程序采用多分支选择结构。具体程序如 下:#include#inc 1 udevoid main()int year,mont
25、h,days;cout*Enter the year: *;cinyear;coutHEnter the month:*;cinmonth;switch(month)(case 1:case 3:case 5:case 7:case 8:case 10:case 12:days=3 1 ; break;case 4:case 6:case 9:case 11 :days=30;break;case 2: ifi(year%4=0& & year%100!=0) | year%400= =0) days=29;else days=28; break;default:coutMInput erro
26、r ! Mendl; exit(0);!coutnyear: M yearendl month: Hmonthendldays: dayscndl;例312求下列分数序列的前15项之和。2/1, 3/2, 5/3, 8/5, 13/8,21 / 13,.解:根据题意可采用累加方法,为此需定义个存放累加结果的变量sum,累加 的过程自然是通过循环结构来实现,循环变量i的取值范围是1到15,且循环变量 表示当前的数列项数;在循环体内不仅要计算数列第i项的值,还要计算前i项的累 加和。数列的规律:从第2项开始;每项的分母是前一项的分子,而分于是前 项的分子分母之和,即第i1项为a/b,则当il时,第
27、i项为(a+b) /a。程序 如下:(1)用while语句实现。#includevoid main() float sum,t,a,b;int i;a=2;b= l;i= 2 ) t=a/b; sum=t;while(i=5) a=a+b;求第i项的分子b=a-b; 求第i项的分母t=a/h;求第i项的值sum+=t; 求第i项的和i+;cout sum= sumendl;(2)用for语句实现.#includevoid main() float sum,t,a,b;int i,a=b= 1.0, sum=0.0;fbr(i= l;i= 15;i+) a=a+b; 求第i项的分子b=ab,;求
28、第i项的分母t=a/b:求第i项的值sum+=t; 求第i项的和 )cout sum= sumendl ; (3 )用do-while语句实现#include void main() float sum,t,a,b;int i=l, a=b=1.0;sum=0;do a=a+b; 求第i项的分子 b=a-b; 求第i项的分母 t=a/b; 求第i项的值 sum+=t:求第i项的和 while(+i= 15);cout sum= sumendl; )例3/3正整数n从键盘输人,计算5n的值。解:计算511可用循环语句实现,本例仅以while语句实现。#include void main() in
29、t i=l,n;float resuIt=1.0;cout”输入 n:“; cinn;ifln) while(i=n) result*=5.0; i+;) cout结果是:resultn; )例 3-14 1-1 / 2+1 / 3-1 / 4+ -+ 1/99-1 / 100 的值。 解:本题仅以fbr语句实现。#include void main()float sum=0.0, s=l .0;fbr(int i=l;i=100;i+) sutn+=s/i;s=-s,cout结果是:sum n;)例3 15输入一行字符,将其中的两种字符(,和+ 显示出来,而对其他 字符不显示,同时统计出其他
30、字符的个数。解:#include #include void main()char ch;int i=0;while (ch=getchar()! =*n) if(ch!=C&ch!=+) i+;continue;|coutch;cout其他字符的个数为:in,;例3 16从键盘输入某班若干名学生一门课程的成绩,编程找出最高分和最低分, 并统计全班平均成绩。解:要求程序具有灵活性,程序中参加统计的学生人数应随具体情况而定,不应 固定,若以输入负数作为统计结束条件,则程序如下:#include void main()(float score;max;min;sum=0.0;int num=0;c
31、outw”输入一个成绩;cinscore;max=min= score;whi 1 e(score=0) ifi(scoremax) max=score;ifi(scoremin) min=score;sum+=score;num+;coutw”输入一个成绩!;cinscore;if(num) coutvv”共统计 Mnum,AMendl;cout”最高分是“ vvmaxvvendl;coutvv”最低分是 Mminendl;coutvv”平均成绩是“ vvsum/numvvendl;)else coutw”无输入!” wendl;例317从键盘不断读入字母,如字母为元音字母,则输出其相应的大
32、写字母,否 则结束程序解:#include void main()(char ch;int quit=O;do coutMn输入个字母:”;cinch;switch(ch) case a:coutvvA: break;case e:coutvvE; break;case i:coutvvT; break;case :coutwO; break;case u:coutU; break;default: quit=l; break; while(iquit);)例3 18模拟计算器进行加、减、乘、除数学运算。要求当输入两个操作数和 运算符后,输出运算结果。一次运算结束后询问用户是否继续,用户根据需
33、要可继 续进行运算。解:#include void main()char op;char quit=y;float dl;d2;while(quit= =y| quit= =7) coutvv”输入:第一个操作数;运算符和第二个操作数” vvendl;cind 1 opd2;switch(op) case 屮:coutd 1 4-d2-(dl+d2)endl;break;case coutdl d2 =(dl-d2) endl;break;case *: coutdl * d2= (dl * d2)endl;break;case /:ifid2=0.0) coutvv”输入错误!” vvend
34、l;quit=0;elsecoutdl 7d2- (dl/d2)rendl; break;defauit:coutvv”运算符错误 wendl;break;)cout是否继续(y)? ”;cinquit;【思考题】一.选择题1 .以下程序的输出结果是#includevoid main()int w=4,x=3,y=2,z= 1,result;result=wx?w: zy?z:x;coutresultendl;A. 1 B. 2. C 3. D. 42 .若所以变量均已正确说明,下列程序运行后X的值是a=b=c=0;x=35;if(! a)x-;else if(b) x=2;if(c) x=3
35、;else x=4;coutxendl;A. 34 B. 4 C. 35 D. 33,若已有说明语句int x,y;则不能实现以下函数关系的程序段是r -1 (xl)A. if(x0) y= 1;else y=0;C. y=0;D. if(x=0)if(x=0)if(x0) y=l;if(x0) y=l;else y=0;else y=-l;else y=-l;4.设有说明语句inta=l,b=0;则执行以下语句后输出为switch(a)case 1:switch(b)(case 0:coutM *O*M;break;case 1: cout: *1* ;break;case 2:coutM
36、*2*n; break;A *0* b *o*2* c *0*2* D 有语法错误5 .设有以下程序段,则int x=O;s=O;while (!x!=0) s+=+x;couts;A,运行程序段后输出0子 B,运行程序段后输出1C.程序段中的控制表达式是非法D.程序段执行无限次6 .以下程序段中,能正确计算10!的是A. do i=l;s=l; s=s*i; i+; while(i=10);C. i=l;s=l;do s=s*i;i+;while(i=10);B. do i=l;s=0;s=s*i;i+;while(i=10);D. i=l;s=0;do s=s*i;i+;while(i=1
37、0);7 .下面程序的功能是计算正整数2345的各位数字的平方和。请选择填空。#include void main() int n,sum=0;n=2345;do sum=sum+ 1;n= 2; while(n);coutn sum=H sumendl;) A. n%10 B. (n%10)*(n%10) C. n/10 D. (n/ 10)*(n/10) A. n/1000 B. n/100C. n/10 D. n%108.等比数例的第1项a=l,公比q=2下面程序的功能是求满足前n项和小于100时 的最大n,请选择填空。#includeMiostream.hHvoid main()int
38、 a,q,n,sum;a=l ;q=2;n=sum=0;do 1;-H-n; a=a*q; while(sum100);2;coutn;) A. sum+ B. sum+=a C. sum*=a D. a+=sum A. n=n-2B. n=nC. n-H-D. n-=l二、填空题9 .下面程序的功能是计算100至1000之间有多少个数,其各位数字之和是5。 #includevoid main() int i,s,k,count=0, fbr(i=100;iv=1000;iH) s=0,k=i, while() s=s+; ,)i 心!=5); elsecount+;) coutcount;)
39、10 .计算两个整数的最大公因子。 #include void main() int temp,num,den,a,b; cinab, num=a; den=b, while(den)temp=;num=den; den=tcmp;) coutendl;11 .阅读理解指出下面程序的功能。#include void main() (const int magic= 17;int guess;coutnguess the magic number: M;cinguess;ifi(guess= =magic)coutRight!endl;coutThe magic number is:magic;
40、)else(coutWrong! endl;if (guessmagic) coutToo highendl;else coutToo lowendl;)三、编程题12 .修改例3-11根据所输入的年份,求出该年天数。13 .试编程序输入三角形三边a, b,c,判断是否能构成一个三角形若能,则求该三 角形面积。14 .每个苹果0.8元第一天买2个苹果从第二天开始,每天买前一天的2倍直至 购买的苹果个数不超过100的最大值、编写程序,求每天花多少钱?15 .找出199之间的全部同构数。同构数是这样组数:它出现在其平方数的右 边。如5是25右边的数,25是625右边的数,故5和25都是同构数。16
41、 .求一个整数任意次方的最后三位数。即求x 丫的最后三位数要求x,y从键盘输 入。17 .将数列 1、2, 5、10、21、42、85、170、341、682、.延长到第 50 项18 .计算 l!+2!+3! + . . . +n!前 10 项之和。19 .输入一行由英文字母、数字、符号等组成的字符,将其中的大写和小写字母的 个数分别统计出来。20 .买现摄氏温度与华氏温度的转换,并按1.0间隔输出对照表,格式如下:摄氏温度华氏温度0.032.01.033.821 .求整数100-200间能被3或13整除的所有整数。22 .读入10个学生的个人信息的学号和成绩,输出所有学生的学号、成绩,同时并根 据分数与等级的对应关系,输出每个学生相应的成绩等级。成绩:1090898