C++程序设计案例教程课后习题答案1-13章(高职)_第1页
C++程序设计案例教程课后习题答案1-13章(高职)_第2页
C++程序设计案例教程课后习题答案1-13章(高职)_第3页
C++程序设计案例教程课后习题答案1-13章(高职)_第4页
C++程序设计案例教程课后习题答案1-13章(高职)_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

C++程序设计案例教程课后习题答案1T3章北邮

第1章C++语言基础

一、选择题

1.D2,C3.B4.B5,B

二、填空题

1.特殊符号2.注释3.大括号4.分号5.cpp

第2章数据类型、运算符和表达式

一、选择题

1.D2.C3.B4.A5.A6.C7.B8.A9,D

10.C11.C

二、填空题

1.整型2.8103.double4.213

5.0000000000100100

6.17.18.e

三、编程题

1.从键盘输入某个字母的ASCII码,如:97(字母a),98(字

母b),65(字母A)等,在屏幕上输出给字母。

#include<iostream.h>

intmain(intargc,char*argv[])

inti;

charc;

cout<<”请输入ASCII码值:"«endl;

cin»i;〃输入ASCII码

c=i;

cout«c«endI;〃输出对应字符

return0;

}

2.编写一个程序,将“China”译成密码。编码的规律:用原来

的字母后面第4个字母代替原来的字母。

#incIude<iostream.h>

intmain(intargc,char*argv[])

(

charc仁'C',c2二'h',c3='i',c4='n',c5='a';

c1+=4;

c2+=4;

c3+=4;

c4+=4;

c5+=4;

cout«c1«c2«c3«c4«c5«endI;

return0;

第3章程序控制语句

一、选择题

1.C2.C3.D4.A5.B6.A

二、填空题

1.do-whiIe2.顺序结构'选择结构和循环结构3.6

4.break5.47106.16

三、编程题

1.求100^200之间不能被3整除也不能被7整除的数。

#incIude<iostream.h>

intmain(intargc,char*argv[])

{

inti;

for(i=100;i<=200;i++)

(

if(i%3=0||i%7=0)

continue;

eIse

cout«i«endI;

)

return0;

}

2.从键盘输入一个整数,判断该数是否为回文数。所谓的回文

数就是从左到右读与从右向左读都是一样的数。例如7887、23432是

回文数。

#incIude<iostream.h>

intmain(intargc,char*argv[])

(

inti,x,r,y=0;

cout<<"请输入一个整数:";

cin»x;

i二x;

whiIe(i!=0)

(

r二i%10;

i二i/10;

y=y*10+r;

)

if(y=x)

cout«x<<"是回文数"《endI;

if(y!=x)

cout«x<<"不是回文数"<<endl;

return0;

)

3.编程求1001000之间所有的水仙花数。“水仙花数”是指一

个三位数,其各位数字立方和等于该数本身。例如:153是一个“水

仙花数”,因为153=俨+53+33。

#incIude<iostream.h>

intmain(intargc,char*argv[])

(

inti=1,j=1,k=1,x=100;

cout«"100^1000之间的水仙花数有:

for(x=100;x<1000;x++)

(

i=x%10;

j=x/10%10;

k=x/100;

if(x==i*i*i+j*j*j+k*k*k)

cout«x«"

}

cout«endI;

return0;

}

4.将100元换成10元、5元和1元的组合,共有多少种组合方

法?要求每种组合方法中都有10元、5元和1元。

#incIude<iostream.h>

intmain(intargc,char*argv[1)

coirt«"100元钱可以兑换成:"«endl;

doubIex;

for(inti=1;i<=9;i++)

(

for(intj=1;j<=17;j++)

(

for(intk=1;k<=85;k++)

(

x=10*i+5*j+k;

if(x==100)

(

cout«"10元张,5元的”张,

1元的"<<k<〈"张"《endl;

)

}

}

}

return0;

)

第4章函数和预处理

一、选择题

1.A2.C3.B4.A5.D6.C7.D8.C9.C

10.C

11.C12.D13.A14.D15.B

二、填空题

1.fun(a,4)+fun(b,4)-fun((a+b),3)

2.void

3.010111212

4.81

5.函数体

6.右侧

7.文件包含命令

三、编程题

1.假定小兔子一个月就可以长成大兔子,而大兔子每个月都会生

出一对小兔子。(即兔子从生后第三个月才会生小兔子。)如果年初养

了一对小兔子,问到年底时将有多少对兔子?用递归函数解决这一问

题。

#include<iostream.h>

intfib(intn)

(

if(n==1||n==2)

return1;

eIse

return(fib(n-1)+fib(n-2));

)

intmain(intargc,char*argv[])

t

cout«"请输入月数为:”;

intn;

cin»n;

cout<<"兔子总数为:"«fib(n)«endl;

return0;

)

2.哥德巴赫猜想指出:任何一个充分大的偶数都可以表示为两

个素数之和。编程将4~100之间的所有偶数表示为两个素数之和。

#include<iostream.h>

intfun(intx);

intmain(intargc,char*argv[])

(

intn,j;

cout«'Tl00之间的所有偶数用两个素数之和表示为:

"«endI;

for(n=4;n<101;n=n+2)

for(j=2;j<=n/2;j++)

if((fun(j)==1)&&(fun(n-j)-1))

cout«n«"="«j«"+"«n-j«endI;

return0;

}

intfun(intx)

inti;

intisPrime=1;〃1为素数

for(i=2;i<x;i++)

if(!(x%i))

isPrime=0;

}

}

returnisPrime;

)

第5章数组、指针和引用

一、选择题

1.D2,C3.D4.B5.D6.B7.D8,B9.A

10.C

二、填空题

1.类型'数量'下标运算符、下标'索弓I、常变量

2.必须要转化为一维方式'按行方式、右'越快、a数组的首地

址'(i*n+j)*u

3.地址、NULL、已经分配了内存的变量的地址、变量的地址'直

接访问'间接访问

三、写出下列程序运行结果

1.101,1012.sum=300

3.

C++Programming

Datastructure

English

Internet

Mathematics

四、简单题

1.解释运算符和“&”的作用,运算符”和的作用。

答:在应用指针变量时,是间接引用(dereference)运算

符,作用于一个指针类型的变量,访问该指针所指向的内存数据。因

结果是内存中可寻址的数据。“&”是取地址运算符,作用于内存中一

个可寻址的数据(如:变量,对象和数组元素等等),操作的结果是

获得该数据的地址。

运算符和"->"是成员访问运算符(MemberAccessOprator)。

在对象或结构外部去访问公有的数据成员或函数成员时,是在对象名

后加(点操作符),再加成员函数名或函数名就可以了。但是这

些成员必须是公有的成员,只有公有成员才能在对象的外面对它进行

访问。当用指向对象和结构变量的指针访问其公有成员时,则只要在

指针变量名后加(箭头操作符),再加公有成员名就可以了。

2.设a为数组名,那么a++是否合法?为什么?

答:非法。因为a是指针常量。

3.指针作为函数的参数时,它传递的是什么?实参要用什么?而

使用引用时实参要用什么?何时只能用指针而不能用引用?

答:指针作为函数的参数时,它传递的是地址,是指针所指向的

变量或对象的内存首地址,在物理上讲我们传的是指针的值,与传其

它变量是没有差异的,函数获得的是另一个变量的地址,在逻辑上讲

我们是把另一个变量的地址传过去了,可以看作传地址。实参要用变

量或对象的地址。而使用引用时实参要用变量或对象本身。实参为数

组时,只能用指针而不能用引用,因为数组的引用不存在。

五、编程题

1.打印杨辉三角形(10行)。

#incIude<iostream.h>

intmain(intargc,char*argv[])

constintn=10;

inta[n][n];

inti,j;

for(i=0;i<n;i++)

(

for(j=0;j<=i;j++)

(

if(j—0||j—i)

(

}

eIse

a[i][j]=a[i-1][j~1]+a[i-1][j];

cout«a[i][j]«"\t";

)

cout«"\n\n";

}

return0;

)

2.写一个函数,将一个3阶方阵转置。

#incIude<iostream.h>

intarray[3][3];

voidconvert(intarray[3][3])

inti,j,t;

for(i=0;i<3;i++)

for(j=1+i;j<3;j++)

(

t=array[i][j];

array[i][j]=array[j][i];

array[j][i]=t;

)

)

intmain(intargc,char*argv[])

(

inti,j;

cout<〈"请输入矩阵中各元素的值:"<<endl;

for(i=0;i<3;i++)

for(j=0;j<3;j++)

cin»array[i][j];

cout<<"矩阵转置前:"<<endl;

for(i=0;i<3;i++)

(

for(j=0;j<3;j++)

cout«array[i][j]«"

cout«endI;

}

convert(array);

cout<〈"矩阵转置后:"«endI;

for(i=0;i<3;i++)

(

for(j=0;j<3;j++)

cout«array[i][j]«"

cout«endI;

}

return0;

}

3.使用指针编写函数strcat(),实现两个字符串的首尾连接(将

字符串str2接到st门的后面,str1最后面的''0'被取消)。

#incIude<iostream.h>

char*strcat(char*s,constchar*t){

char*st=s;

while(*s)

s++;

while(*s++-*t++);

returnst;

)

intmain(intargc,char*argv[])

chars1[15]="HelIo",s2[15]="WorId";

cout«strcat(s1,s2)«endI;

return0;

)

第6章非基本数据类型

一、选择题

1.C2,C3.D4.A5.D

二、写出下面程序的运行结果

zhangsan372493

三'编程题

1.定义一个表示日期的结构体变量(包括年月日),写一个函数,

返回值为某天是当年的第几天。

#include<iostream.h>

structdate〃定义结构体类型

(

intyear;

intmonth;

intday;

};

int

i,count,daysofmonth[13]={0,31,28,31,30,31,30,31,31,30,31

,30,31);

intmain(intargc,char*argv[])

(

structdated;〃定义结构体变量

intdays=0;

cout<<"请输入日期(年月日):"«endI;

cin»d.year»d.month»d.day;

counted,day;〃把dt.d计入总天数

for(i=0;i<d.month;i++)

count+=daysofmonth[i];

〃把输入月份前面的每月的天数累计入总数

if(d.month>2&&

(d.year%4==0&&d.year%100!=01|d.year%400==0))

count+=1;

//如果是闰年,则要把3月份和3月份以后的总天数加1

cout<<"这一日是这一年的第"<<count<<"日"<<endI;

return0;

)

2.定义一种表示学生的姓名,课程名,期中和期末成绩的结构,

然后输入一个学生的期中和期末成绩,计算平均成绩并输出。

#include<iostream.h>

structstudent

char*name;

char*coursename;

floatqzcj;

floatqmcj;

}stu={"LiPing","语文",80,85};

intmain(intargc,char*argv[])

(

fIoatavgScore;

avgScore=(stu.qzcj+stu.qmcj)/2;

cout«stu.coursename<<"平均成绩为:"<<avgScore«endI;

return0;

}

第7章类和对象

一、选择题

1.A2.B3.C4.A5.A6.B7.C8.D9.A

10.B11.D12.B

二、程序题

1.

Zl/2012

Zl/2012

/10/20122

IZ10Z2函

析01

^数

_数

?^构

^数

anytO

kecontinue

2.

1

2

Pressanykeytocontinue

3.

1.2

3,4

5,6

Pressanykeytocontinue

4.

ThestudentisS

Theteachei*isT

Pressanykeytocontinue

三、简答题

1.构造函数和析构函数的作用是什么?什么时候需要自己定义构

造函数和析构函数?

答:构造函数是对象建立时,由系统调用的特殊的成员函数。它

的作用是实现数据成员的初始化。析构函数也是一个特殊的成员函数,

它的作用正好与构造函数相反,旨在释放对象所占空间的资源。

类中可以定义多个构造函数,实现构造函数重载,以适应不同对象

对数据成员初始化的不同要求。构造函数可以不带参数,作为默认构

造函数,也可以根据数据成员初始化情况,建立带参构造函数。

类定义中析构函数只有一个,且不带参数。当对象所在的函数或程

序结束时,系统自动调用析构函数,释放对象所占空间。

2.静态成员函数的主要作用是什么?

答:在类中定义函数时,如果函数定义行前有关键字static,那

么这个函数就是静态成员函数。静态成员函数主要用于处理静态数据

成员。

3.定义指向对象成员函数的指针变量的方法和定义指向普通函数

的指针变量方法的不同处?

答:与普通指向函数的指针变量不同,定义指向对象成员函数的

指针变量时,指针变量名前需加上类名;初始化指针变量名时,成员

函数名前面需加上类名,即

函数类型(类名::*指针变量名)(参数表);//定义指针变

指针变量名:&类名::成员函数名;〃初始化指针变

(对象名.*指针变量名)();〃调用指针变量所指的对象成员

函数

4.分析友元函数的利弊。

答:如果在类之外定义的一个函数,这个函数可以是不属于任何

类的非成员函数,也可以是其他类的成员函数,在类体中用friend

对其进行声明,此函数就称为本类的友元函数。

友元函数可以访问这个类中的私有成员,虽然方便,但它的存在

也对数据成员的安全性产生潜在的威胁。

四、编程题

1.定义一个类Point。要求如下所述:

(1)构造函数初始化类Point类的对象;

(2)定义函数Distance,计算平面上两点之间的距离。

#incIude<iostream>

#incIude<math.h>

usingnamespacestd;

cIassPoint

(

private:

doubIex1,y1,x2,y2;

pubIic:

Point():x1(0),y1(0),x2(0),y2(0)

1}

Point(inta1,intb1,inta2,int

b2):x1(a1),y1(b1),x2(a2),y2(b2)

(}

doubIeDistance0

(

doubIet1,t2;

t1=pow(x2-x1,2);

t2=pow(y2-y1,2);

returnsqrt(t1+t2);

)

};

voidmain()

(

Pointp(1,2,4,2);

cout«"Thedistanceis"«p.Distance()«endI;

}

2.建立一个对象数组,内放5个人的数据(ID号'姓名),设立

一个函数find,用指向对象的指针做函数参数,在find函数中按给

定的ID号输出其姓名。

#incIude<iostream>

#incIude<string.h>

usingnamespacestd;

cIassPerson

(

pubIic:

intid;

charname[10];

pubIic:

Person(inti,charn[10]):id(i)

(

strcpy(name,n);

)

booIfind(intid_find)

(

if(id_find-id)

(

cout«"id:"«id«",name:"«name«endI;

returntrue;

)

eIse

returnfalse;

}

};

intmain()

(

intid_find;

Person

p[5]={Person(1,"zhao"),Person(2,"qian"),Person(3,"sun"),

Person(4,"Ii"),Person(5,"zhou")};

Person*p_find;

cout«"pIeaseinputtheid:"«endI;

cin»id_find;

for(inti=0;i<5;i++)

{

p_find二&p[i];

if(p_find->find(id_find))

break;

)

return0;

}

3.有一信息管理系统,要求检查每个登录系统的用户(User)的

用户名和口令,系统检查合格以后方可登录系统。用C++程序予以描

述。

#incIude<iostream>

#incIude<string.h>

usingnamespacestd;

cIassPerson

private:

charuserName[10];

charpassword[6];

pubIic:

Person(charu[10],charp[6])

(

strcpy(userName,u);

strcpy(password,p);

)

booIfind(charname[10],charpass[6])

(

if(strcmp(userName,name)!=0)

(

cout«"notexist"«endI;

returnfalse;

}

eIseif(strcmp(password,pass)!=0)

cout«"invaIidpassword"«endI;

returnfalse;

)

eIse

(

cout«"valid!!!"«endI;

returntrue;

}

)

);

intmain()

(

Persons[5]={Person("zhao","zhao"),Person("qian","qian"),

Person("sun","sun"),Person("Ii"Ii"),Person("zhou","zhou")

|;

charname[10],pass[6];

cout«"pIeaseinputusername:"«endI;

cin»name;

cout«"pIeaseinputpassword:"«endI;

cin»pass;

for(inti=0;i<5;i++)

{

if(s[i].find(name,pass))

break;

)

}

4.定义一个类Student记录学生计算机课程的成绩。要求使用静

态成员变量或静态成员函数计算全班计算机课程的总成绩和平均成

绩。

#incIude<iostream>

#incIude<string.h>

usingnamespacestd;

cIassStudent

pubIic:

intid;

charname[10];

intscore;

staticinttotaIScore;

Student(inti,charn[10],ints):id(i),score(s)

{

strcpy(name,n);

)

staticvoiddispIay0

(

cout«"totaIScore:"«totaIScore«endI;

cout«"aveScore:"«totaIScore/5«endI;

}

staticvoidcompute(Students)

totaIScore+=s.score;

}

};

intStudent::totaIScore=0;

intmain()

(

Student

s[5]={Student(1,"zhao",90),Student(2,"qian",82),Student(3,

sun",75),Student(4,"Ii",89),Student(5,"zhou",62));

for(inti=0;i<5;i++)

(

s[i].compute(s[i]);

}

Student::dispIay();

return0;

}

第8章类的继承与派生

一、选择题

1.D2,A3.A4.B5.B6.B

二、程序题

(略)

三、简答题

1.派生类对基类的继承方式有哪些?在派生类中,成员有几种

不同的访问属性?

答:派生类对基类的继承方式有三种:public、protectedx

private。成员也有三种访问属性:public、protectedvprivate。

2.多级派生的访问属性如何确定?

答:多级派生的访问属性确定的原则与单层派生一致。

3.在执行派生类时,如何调用基类的构造函数?

答:在派生类构造函数的初始化列表中描述。

4.对数据成员初始化时,如何对子对象初始化?

答:在派生类构造函数的初始化列表中,写上子对象名(实际参

数)。

5.程序中有多重继承时,系统如何调用析构函数?

答:按照调用构造函数相反的顺序调用析构函数。

6.举例说明多重继承引起的二义性,如何解决此问题?

多重继承指一个类从多个基类中派生而来。如果一个派生类有多

个直接基类,而这些直接基类又都派生于同一个基类,则在最终派生

类中会保留间接基类中的多份数据成员,从而导致在派生类中访问这

些数据成员时,可能产生错误,即二义性的错误。C++提供了虚基类

(virtualbaseclass)的方法来解决这个问题,使得派生类在获得

间接基类的数据成员时只保留一份拷贝。

7.谈谈虚基类的作用。

在进行多重继承时,为保证最终派生类中只继承一次,通常声明

该基类为所有直接派生类的虚基类。如果虚基类中定义了带参数的构

造函数,则在其所有的派生类(直接派生类或者间接派生类)中,必

须通过这些派生类的构造函数对虚基类构造函数调用。但是,其实只

有最后的派生类成功地调用了虚基类的构造函数,并对虚基类的数据

成员进行了初始化,其余派生类中对虚基类的调用只是形式,以形成

派生类构造函数声明格式的一致性,而没有真正调用虚基类的构造函

数。这就保证了虚基类的数据成员不会被多次初始化。

四、编程题

分别声明Teacher类和Cadre类,采用多重继承方式由这两个类

派生出新类TC类。要求.

’(1)在两个基类中都包含姓名、年龄、性别'地址'电话等数据

成员。

(2)在Teacher类中还包含数据成员title,在Cadre类中还

包含数据成员post。在TC类中还包含wages。

(3)对两个基类中的姓名'年龄'性别、地址'电话等数据成员

用相同的名字,在引用这些数据成员时,指定作用域。

(4)在派生类TC的成员函数show中调用Teacher类中的

display函数,输出姓名'年龄'性别'职称、地址'电话,然后再

输出职务与工资。

#include<iostream>

#incIude<string>

usingnamespacestd;

cIassTeacher

(

private:

charname[10];

intage;

chartitle[20];

charsex[10];

charaddress[100];

charteI[20];

publie:

Teacher(charnam口,intag,chartit[],charse[],char

add[],chart[])

(

age=ag;

strepy(sex,se);

strcpy(name,nam);

strcpy(ti11e,tit);

strcpy(address,add);

strcpy(teI,t);

}

voiddispIay0

(

cout«name«endI«age«endI«sex«endI«address«endI«t

eI«endI;

)

};

cIassCadre

(

private:

charname[10];

intage;

charpost[20];

charsex[10];

charaddress[100];

charteI[20];

pubIic:

Cadre(charnam[],intag,charpo[],charse[],char

add[],chart[])

(

age二ag;

strcpy(sex,se);

strcpy(name,nam);

strcpy(post,po);

strcpy(address,add);

strcpy(teI,t);

|

char*pos0

returnpost;

}

};

cIassTC:pubIicTeacher,pubIicCadre

(

private:

intwage;

publie:

TO(charnam口,intag,charpo[],chartit[],char

se[],charadd[],chart[],intw)

:wage(w),Teacher(nam,ag,tit,se,add,t),Cadre(nam,ag,po,se

,add,t){}

voidshowk0

(

Teacher::dispIay0;

cout«Cadre::pos()«endI«wage«endI;

}

};

main()

t

TC

A("wang",25,"leader","teacher","female","Nanjing","13813900

000",5000);

A.showk();

return0;

}

第9章多态性和虚函数的使用

一、选择题

1.C.2,C3.A4.C5.6.D

二、程序题

(略)

三'简答题

1.C++多态性主要体现在哪两个方面?

答:在C++中,多态性是指系统调用同名的函数,实现不同的功能。

多态性包含静态多态性和动态多态性。静态多态性体现在编译时函数

重载或者运算符重载上;展现了同一类中多个同名函数的处理机制。

而动态多态性是指程序运行过程中通过虚函数动态地确定针对的对

象,展现继承层次结构中同名函数的处理机制。

2.比较函数重载和虚函数在概念上和使用方式有什么区别。

函数重载是指函数名称相同,但是参数的个数或者参数的数据类

型不同。因此,系统调用重载函数时,会依据参数确定调用哪一个。

而在继承的机制中,基类的成员函数可能会与派生类新增的成员

函数同名,包括参数个数和参数类型,这种现象不属于函数重载。当

基类的一个成员函数被声明为虚函数后,其派生类中的同名函数都自

动成为虚函数。派生类可以对虚函数重新定义。虚函数实现动态多态

的问题。

3.比较抽象类、虚函数、纯虚函数的概念和使用上的区别。

虚函数通常在基类中定义,定义可以是空,派生类中可以对虚函

数重写,也可以不写。虚函数起到了接口的默认行为作用。

纯虚函数在基类中是没有定义的,必须在直接或者间接派生类中

加以实现,它起到了接口的作用。

包含了纯虚函数的类,被称为抽象类。抽象类不能建立对象。

4.谈谈虚基类和虚函数,区分两者不同的概念和各自的作用。

在继承机制中,一个派生类继承多个直接基类,而这些基类又

有一个公共的基类,这个公共的基类成员在继承中可能产生多个拷

贝。虚基类的基本原则是在内存中只有基类成员的一份拷贝。这

样,通过把基类继承声明为虚拟的,就只能继承基类的一份拷贝,

从而消除歧义。用virtual限定符把基类继承说明为虚拟的。

虚函数指基类中成员函数声明为virtual,使它在一个或多个

派生类中被重新定义,虚函数的作用是实现多态性。虚函数必须是

基类的非静态成员函数,其访问权限可以protected或publico

四、编程题

1.编写一个程序,声明抽象基类Shape,由它派生出3个派生类:

CirIce,Rectangle,Triangle,用—C函数printArea分别输出以

上三种的面积,3个图形的数据在定义对象时给定。

#incIude<iostream>

usingnamespacestd;

cIassShape

(

pubIic:

virtuaIvoidprintArea0=0;

};

cIassCircle:pubIicShape

(

private:

intr;

pubIic:

Circle(intrr):r(rr){)

voidprintArea0

(

cout«"theareaofcircle:"«3.14*r*r«endI;

}

|;

cIassRectangle:publicShape

private:

intlen,width;

pubIic:

RectangIe(intI,intw):len(I),width(w){)

voidprintArea0

(

cout«"theareaofrectangle:"«Ien*width«endI;

)

};

cIassTriangIe:pubIicShape

(

private:

intbase,height;

pubIic:

TriangIe(intb,inth):base(b),height(h){)

voidprintArea0

cout«"theareaoftriangle:

"«0.5*base*height«endI;

)

};

intmain()

(

Circlec(2);

c.printArea();

Rectangler(2,3);

r.printArea();

Trianglet(2,3);

t.printArea();

return0;

}

2.改写以上程序,用虚函数分别计算几种图形面积,并求它们之

和。要求用基类指针数组,使它每一个元素指向一个派生类对象。

#incIude<iostream>

usingnamespacestd;

cIassShape

publie:

virtuaIintcomputeArea0-0;

virtuaIvoidprintArea0=0;

|;

cIassCircle:pubIicShape

private:

intr;

intcircIeArea;

publie:

CircIe(intrr):r(rr){}

intcomputeArea0

circIeArea=3.14*r*r;

returncircIeArea;

)

voidprintArea0

cout«"theareaofcircle:"«circIeArea«endI;

}

);

cIassRectangIe:pubIicShape

private:

intlen,width;

intrectangIeArea;

publie:

RectangIe(intI,intw):len(I),width(w){}

intcomputeArea()

rectangIeArea=Ien*width;

returnrectangleArea;

voidprintArea0

cout«"theareaofrectangle:

«rectangIeArea«endI;

cIassTriangle:pubIicShape

(

private:

intbbase,height;

inttriangIeArea;

publie:

TriangIe(intb,inth):bbase(b),height(h)(}

intcomputeArea0

(

triangIeArea二(bbase*height)/2;

returntriangIeArea;

voidprintArea0

cout«"theareaoftriangle:

"«triangleArea«endI;

)

intmain()

Circlec(2);

Rectangler(2,3);

Trianglet(2,3);

Shape*p[3]={&c,&r,&t};

doubIetotaIArea=0;

for(inti=0;i<3;i++)

(

totaIArea+=p[i]->computeArea();

p[i]->printArea();

)

cout«"totaIArea:"«totaIArea«endI;

return0;

}

第10章运算符重载

一、选择题

1.A2.D3.A4.B5.D6.C

二、写出下列程序运行结果

(略)

三、简答题

1.

⑴只能重载已有的C++运算符,不可自创新的运算符。

⑵重载后运算符的优先级和结合性都不变。

⑶重载的功能应当与原有功能相类似。

2.

::..*?:sizeoftypeid

3.

&&

四'编程题

1.

#incIude<iostream>

cIassMyString{

publie:

MyString0

(

strLength=0;

pStr二newchar[1];

*pStr='\0';

)

MyString(constchar*pString)

(

strLength二strIen(pString);

pStr二newchar[strLength+1];

strepy(pStr,pString);

|

MyString(charch,intn)

strLength二n;

pStr二newchar[strLength+1];

for(unsignedinti=0;i<strLength;*(pStr+i++)=ch);

*(pStr+strLength)='\0';

}

MyString(intnumber)

(

charbuffer[20];

inttemp二number;

if(number<0)

number:-number;

intIen=0;

do{

buffer[Ien++]=static_cast<char>('0'+number%10

);

number/=10;

}whiIe(number>0);

if(temp<0)

buffer[Ien++]=

buffer[Ien]='\0';

strLength=len;

pStr二newchar[strLength+1];

strcpy(pStr,buffer);

charch=0;

for(inti=0,j=len-1;i<j;i++,j-)

(

ch二pStr[i];

pStr[i]:pStr[j];

pStr[j]=ch;

}

|

MyString(constMyString&rString)

(

strLength=rString.strLength;

pStr二newchar[strLength+1];

strcpy(pStr,rString.pStr);

}

~MyString()

deIete[]pStr;

}

MyString&operator+(constMyString&rStr)const

(

returnMyString(*this)+=rStr;

}

};

2.

#incIude<iostream>

cIassMyString{

publie:

MyString()

(

strLength=0;

pStr二newchar[1];

*pStr='\0';

}

MyString(constchar*pString)

strLength二strIen(pString);

pStr二newchar[strLength+1];

strcpy(pStr,pString);

|

MyString(charch,intn)

(

strLength二n;

pStr二newchar[strLength+1];

for(unsignedinti=0;i<strLength;*(pStr+i++)=ch);

*(pStr+strLength)='\0';

|

MyString(intnumber)

(

charbuffer[20];

inttemp二number;

if(number<0)

number二-number;

intIen=0;

do{

buffer[Ien++]=staticcast<char>('0'+number%10

);

number/=10;

}whiIe(number〉。);

if(temp<0)

buffer[Ien++]=;

buffer[Ien]='\0';

strLength=len;

pStr二newchar[strLength+1];

strcpy(pStr,buffer);

charch=0;

for(inti=0,j=len-1;i<j;i++,j-)

(

ch=pStr[i];

pStr[i]=pStr[j];

pStr[j]=ch;

}

|

MyString(constMyString&rString)

strLength二rString.strLength;

pStr二newchar[strLength+1];

strcpy(pStr,rString.pStr);

)

~MyString()

(

deIete[]pStr;

}

MyString&Operator=(constMyString&rStr)const

(

if(this==&rStr)return*this;

deIete[]str;

str二newchar[strIen(rStr.str)+1];

strcpy(str,rStr.str);

return*this;

)

};

第11章输入/输出流

一、选择题

1.B2.B3.A4.C5.A

二、填空题

1.ciriscoutscerrscIog

2.iostream.h

3.iomanip.h

4.endI

5.setw()

6.hex

7.scientific、fixed

8.cout«endI

9.数据从一个位置流向另一个位置

三、写出下面程序运行结果

1.

2531

#0.12346

2.

f

***12345

3.

168.6

4.

12468

四、编程题

1.编程统计从键盘上输入每一行字符的个数,从中选出最长的行

的字符个数,统计共输入多少行?

#incIude<iostream.h>

constintSIZE=80;

intmain(intargc,char*argv[])

(

introw=0,lmax=-1;

charbuf[SIZE];

cout<<"请输入字符串:\n";

while(cin.getIine(buf,SIZE))

(

intcount=cin.gcount();

row++;

if(count>lmax)

Imax二count;

温馨提示

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

评论

0/150

提交评论