1、1C+面向对象程序设计习题解答与上机指导(第 2 版)习题参考答案源代码 使用源程序的几点注意事项(1) 由于源程序在复制、编辑、解压缩等过程中可能引起部分符号(主要是标点符号,如分号、冒号、逗号、引号)的字体、半全角等发生变化,在编译时可能被检出语法错误,只要使用“替换”功能,纠正后即能顺利运行。(2) 有的 C+系统 (如 Visual C+6.0)没有完全实现 C+标准,它所提供的不带后缀的.h 的头文件不支持友元运算符重载函数,在 Visual C+6.0 中编译会出错,这时可采用带后缀的.h 头文件。将程序中的#includeusing namespace std;修改成#inclu
2、de即可顺利运行。第 2 章 C+基础【2.2】下面是一个 C 程序,改写它,使它采用 C+风格的 I/O 语句。#include int main() int a,b,d,min;printf(“Enter two numbers:“);scanf(“%d%d“,min=ab? b:a;for (d=2; d using namespace std;int main() int a,b,d,min;couta;cinb;min=ab? b:a;for (d=2; d using namespace std;int i=15;int main() int i;i=100;:i=i+1;cout
3、 using namespace std;void f(int temp=m;m=n;n=temp;int main() int a=5,b=10;f(a,b);cout using namespace std;int return i;int main() int k=0;int cout using namespace std;int main() int *p=new int20; /动态分配 20 个整型内存空间*p=1;*(p+1)=1; /对前面 2 个内存空间赋值 1cout #include using namespace std;4double sroot(int i) re
4、turn sqrt(i);double sroot(long l) return sqrt(l); double sroot(double d) return sqrt(d);int main() int i=12;long l=1234;double d=12.34;cout using namespace std;int main() int i,j,sum=0;for(i=0;i=0) sum+;cout using namespace std;int main() void change(int int a,b;cinab;if(ab)change(a,b);5cout #includ
5、e using namespace std;inline float f(float x) return 2*x*x*x-4*x*x+3*x-6;int main() float left,right,middle,ym,yl,yr;coutleftright; yl=f(left);yr=f(right);do middle=(right+left)/2;ym=f(middle);if (yr*ym0) right=middle;yr=ym;else left=middle;yl=ym; while (fabs(ym)=1e-6);cout using namespace std;6clas
6、s test public:test() ; test() ; private:int i;test:test() i = 25;for (int ctr=0; ctr using namespace std;class Testprivate:int val;public:Test() cout using namespace std;class Studentpublic:void printStu();private:char name10;int age;float aver;int main() Student p1,p2,p3;p1.age =30;return 0;【3.21】指
7、出下列程序中的错误,并说明为什么。#include using namespace std;class Studentint sno;int age;void printStu();void setSno(int d);void printStu() cout using namespace std;8class Pointpublic:int x,y;private:Point() x=1; y=2;int main() Point cpoint;cpoint.x=2;return 0;【3.23】下面是一个计算器类的定义,请完成该类成员函数的实现。class counter public:
8、counter(int number);void increment(); /给原值加 1void decrement(); /给原值减 1int getvalue(); /取得计数器值int print(); /显示计数 private:int value;【解】class counterpublic:counter(int number);void increment(); /给原值加 1void decrement(); /给原值减 1int getvalue(); /取得计数器值int print(); /显示计数 private:int value;counter:counter(i
9、nt number) value=number;void counter:increment() value+;void counter:decrement() value-;9int counter:getvalue() return value;int counter:print() cout using namespace std;class Date public:void printDate(); /显示日期void setDay(int d); /设置日的值void setMonth(int m); /设置月的值void setYear(int y); /设置年的值private:
10、int day,month,year;int main() Date testDay;testDay.setDay(5);testDay.setMonth(10);testDay.setYear(2003);testDay.printDate();return 0;【解】void Date:printDate() cout using namespace std;class cylinderpublic:cylinder(double a,double b);void vol();private:double r,h;double volume;cylinder:cylinder(double
11、 a,double b) r=a; h=b;volume=3.141592*r*r*h;void cylinder:vol() cout using namespace std;const int SIZE=80;class Stockpublic:Stock() strcpy(stockcode,“ “);Stock(char code, int q=1000, double p=8.98) strcpy(stockcode, code);quan=q;price= p;11void print(void) coutstockcode;coutquanprice using namespac
12、e std;class B public:B()B(int i,int j) x=i;y=j;void printb() cout using namespace std;class Apublic:void set(int i,int j) x=i;y=j;int get_y() return y;private:int x,y;class boxpublic:void set(int l,int w,int s,int p) length=l;width=w;label.set(s,p);int get_area() return length*width;private:int leng
13、th,width;A label;int main()13 box b;b.set(4,6,1,20);cout using namespace std;class Samplepublic:Sample( int i,int j) x=i;y=j;void disp() cout using namespace std;class Rpublic:R(int r1,int r2) R1=r1;R2=r2;void print(); void print() const;private:14int R1,R2;void R:print() cout using namespace std;cl
14、ass Studentpublic:Student() +x;coutSno;static int get_x() return x;int get_Sno() return Sno;private:static int x;int Sno;int Student:x=0;int main() cout using namespace std;class CTestpublic:const int y2; CTest (int i1,int i2):y1(i1),y2(i2) y1=10;x=y1;int readme() const;/.private:int x;const int y1;
15、int CTest:readme() const int i;i=x;x+;return x;int main() CTest c(2,8);int i=c.y2;c.y2=i;i=c.y1;return 0;【解】#include using namespace std;class CTestpublic:const int y2;CTest (int i1,int i2):y1(i1),y2(i2) y1=10; / 错误, y1 是用 const 定义的,不能修改 x=y1;int readme() const;/.private:int x;16const int y1;int CTe
16、st:readme() const int i;i=x;x+; / 错误,函数定义用了 const,表示该函数不能修改对象return x;int main() CTest c(2,8);int i=c.y2;c.y2=i; / 错误, y2 是常量,不能修改i=c.y1; / 错误,y1 私有变量,不能直接存取return 0;【4.18】指出下面程序中的错误,并说明原因。#include using namespace std;class CTestpublic:CTest () x=20;void use_friend();private:int x;friend void friend
17、_f(CTest fri);void friend_f(CTest fri) fri.x=55;void CTest:use_friend() CTest fri;this-friend_f(fri);:friend_f(fri);int main() CTest fri,fri1;fri.friend_f(fri);friend_f(fri1);return 0;【解】#include 17using namespace std;class CTestpublic:CTest() x=20;void use_friend();private:int x;friend void friend_
18、f(CTest fri);void friend_f(CTest fri) fri.x=55;void CTest:use_friend() CTest fri;this-friend_f(fri); / 错误, 友元函数不是成员函数,/ 所以不能用 this-调用友元函数:friend_f(fri);int main() CTest fri,fri1;fri.friend_f(fri); / 错误友元函数不是成员函数,/ 所以不能用“对象.函数名”调用友元函数friend_f(fri1);return 0;【4.19】指出下面程序中的错误,并说明原因。#include using names
19、pace std;class CTestpublic:CTest () x=20;void use_this();private:int x;void CTest:use_this() CTest y,*pointer;this=*this.x=10;pointer=this;18pointer=int main() CTest y;this-x=235;return 0;【解】#include using namespace std;class CTestpublic:CTest () x=20;void use_this();private:int x;void CTest:use_thi
20、s() CTest y,*pointer;this= / 错误,不能对 this 直接赋值。*this.x=10; / 错误, 按优先级原句的含义是*(this.x)=10,显然不对/ 正确的写法是(*this).x=10;或 this-x=10;pointer=this;pointer=int main() CTest y;this-x=235; / 错误,this 的引用不能在外部函数中,只能在内部函数中。Return 0;【4.20】写出下面程序的运行结果。#include using namespace std;class toy public:toy(int q, int p) qu
21、an = q;price = p;int get_quan() return quan;19int get_price() return price;private:int quan, price; ;int main() toy op32=toy(10,20),toy(30,48),toy(50,68),toy(70,80),toy(90,16),toy(11,120),;for (int i=0;i using namespace std;class example public:example(int n) i=n;cout using namespace std;class aClas
22、s public:aClass() total+;aClass() total-;int gettotal() return total;private:static int total;int aClass:total=0;int main() aClass o1,o2,o3;cout using namespace std;class test public:test() ; test() ; private:21int i;test:test() i = 25;cout using namespace std;class book public:book(int a, int b) qu
23、= a;price= b;void show_money() cout 22using namespace std;class book public:book(int a, int b) qu= a;price= b;void show_money() coutshow_money();p-; return 0;【4.26】使用 C+ 的类建立一个简单的卖玩具的程序。类内必须具有玩具单价、售出数量以及每种玩具售出的总金额等数据,并为该类建立一些必要的函数,并在主程序中使用对象数组建立若干个带有单价和售出数量的对象,显示每种玩具售出的总金额。【解】实现本题功能的程序如下:#include us
24、ing namespace std;class toy public:toy() toy(int p,int c) Price=p;Count=c;void Input(int P, int C) ;void Compute() ;void Print() ;private:int Price;int Count;23long Total;void toy:Input (int P, int C) Price=P;Count=C;void toy:Compute() Total=(long) Price*Count;void toy:Print() cout using namespace s
25、td;const int SIZE=80;class Stockpublic:Stock() strcpy(stockcode,“ “);24Stock(char code, int q=1000, double p=8.98) strcpy(stockcode, code);quan=q;price= p;void print(void) coutstockcode;coutquanprice using namespace std;class shen_stock; / 向前引用class shang_stock / 深圳类 public:shang_stock(int g,int s,i
26、nt p); / 构造函数friend void shang_count(const shang_stock ss); / 计算上海的股票总数friend void count(const shang_stock ss,const shen_stock zs);/ 计算上海和深圳的股票总数private:int general; / 普通股票个数int st; / ST 股票个数int pt; / PT 股票个数;25shang_stock: shang_stock(int g,int s,int p) / 构造函数 general=g;st=s;pt=p;class shen_stock i
27、nt general; / 普通股票个数int st; / ST 股票个数int pt; / PT 股票个数public:shen_stock(int g,int s,int p ); / 构造函数friend void shen_count(const shen_stock es); / 计算深圳的股票总数friend void count(const shang_stock ss,const shen_stock zs);/ 计算上海和深圳的股票总数;shen_stock:shen_stock(int g,int s,int p) / 构造函数 general=g;st=s;pt=p;in
28、t main() shang_stock shanghai(1600,20,10); / 建立对象/ 表示上海有 1600 支普通股票,20 支 ST 股票, 10 支 PT 股票shen_stock shenzhen(1500,15,8); / 建立对象/ 表示深圳有 1500 支普通股票,15 支 ST 股票,8 支 PT 股票shang_count(shanghai); / 计算上海的股票总数shen_count(shenzhen); / 计算深圳的股票总数count(shanghai,shenzhen); / 计算上海和深圳的股票总数return 0;void shang_count(
29、const shang_stock ss) / 计算上海的股票总数 cout using namespace std;class Studentpublic:Student(int n,string na,double d) no=n;deg=d;name=na;sum+=d;num+;static double avg() return sum/num;static int total() return num;void disp()cout using namespace std;class B1 public:B1(int i) b1=i; cout using namespace st
30、d;class Mainprotected:char *mainfood;public:Main(char *name) mainfood=name;class Subprotected:char *subfood;public:Sub(char *name) subfood=name;class Menu:public Main,public Subpublic:Menu(char *m, char *s):Main(m),Sub(s) void show();void Menu:show() cout using namespace std;class Aprivate:int a;pub
31、lic:29A() a=0; A(int i) a=i;void Print() cout using namespace std;class B1 int b1;public:B1(int i) b1=i; cout“constructor B1.“iendl;void print() coutb1endl;30 ;class B2 int b2;public:B2(int i) b2=i; cout“constructor B2.“iendl;void print() coutb2endl; ;class B3 int b3;public:B3(int i) b3=i; cout“cons
32、tructor B3.“iendl;int getb3() return b3; ;class A :public B2,public B1 int a; B3 bb;public:A(int i,int j,int k,int l):B1(i),B2(j),bb(k) a=l; cout“constructor A.“lendl;void print() B1:print();B2:print();couta“,“bb.getb3()endl; ;int main() A aa(1,2,3,4); aa.print(); return 0;【5.17】下面的程序可以输出 ASCII 字符与所对应的数字的对照表。修改下列程序,使其可以输出字母 a 到 z 与所对应的数字的对照表。