1、程序设计实习 作业解答,2012-3,作业二:魔兽世界之一,描述:魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两军的司令部都会制造武士。武士一共有 dragon 、ninja、iceman、lion、wolf 五种。每种武士都有编号、生命值、攻击力这三种属性。双方的武士编号都是从1开始计算。红方制造出来的第n个武士,编号就是n。同样,蓝方制造出来的第n个武士,编号也是n。武士在刚降生的时候有一个生命值。在每个整点,双方的司令部中各有一个武士降生。红方司令部按照iceman、lion、wolf、ninja、dragon的顺序循环制造武士。蓝方司令部按照lion、dragon、ninja
2、、iceman、wolf的顺序循环制造武士。制造武士需要生命元。制造一个初始生命值为m的武士,司令部中的生命元就要减少m个。如果司令部中的生命元不足以制造某个按顺序应该制造的武士,那么司令部就试图制造下一个。如果所有武士都不能制造了,则司令部停止制造武士。给定一个时间,和双方司令部的初始生命元数目,要求你将从0点0分开始到双方司令部停止制造武士为止的所有事件按顺序输出。,作业二:魔兽世界之一,描述:魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两军的司令部都会制造武士。武士一共有 dragon 、ninja、iceman、lion、wolf 五种。每种武士都有编号、生命值、攻击力这三种
3、属性。双方的武士编号都是从1开始计算。红方制造出来的第n个武士,编号就是n。同样,蓝方制造出来的第n个武士,编号也是n。武士在刚降生的时候有一个生命值。在每个整点,双方的司令部中各有一个武士降生。红方司令部按照iceman、lion、wolf、ninja、dragon的顺序循环制造武士。蓝方司令部按照lion、dragon、ninja、iceman、wolf的顺序循环制造武士。制造武士需要生命元。制造一个初始生命值为m的武士,司令部中的生命元就要减少m个。如果司令部中的生命元不足以制造某个按顺序应该制造的武士,那么司令部就试图制造下一个。如果所有武士都不能制造了,则司令部停止制造武士。给定一个
4、时间,和双方司令部的初始生命元数目,要求你将从0点0分开始到双方司令部停止制造武士为止的所有事件按顺序输出。,作业二:魔兽世界之一,作业二:魔兽世界之一,1 写出下面程序的运行结果,解析: return返回时,产生临时变量,调用拷贝构造函数,函数完全返回后,临时变量销毁,n 减小 41 验证:插入print语句,类和对象的基本概念 作业三,2 写出下面程序的运行结果,解析:构造函数和复制构造函数的调用注意区分:Sample b=a;d=a;切记:不同的编译选项可能会影响程序结果eg. Realse vs. Debug建议:赋值构造函数参数使用const 9不优化:22 优化:205,类和对象的
5、基本概念 作业三,Return value optimization,原始版本,原始版本实现伪码,优化版本实现伪码,Return value optimization,Optionsgcc -fno-elide-constructorsVisual C+ /Od /O2扩展阅读:Named Return Value Optimization in Visual C+ 2005Return value optimization (wikipedia),2 写出下面程序的运行结果,解析:构造函数和复制构造函数的调用注意区分:Sample b=a;d=a;切记:不同的编译选项可能会影响程序结果eg.
6、 Realse vs. Debug建议:赋值构造函数参数使用const 9不优化:22 优化:205,类和对象的基本概念 作业三,3 程序输出结果如下, 请填空class A public:int val;A(_ ) val = n; ; _ GetObj() return _; ;main() A a; cout a.val endl; 0a.GetObj() = 5; cout a.val endl; /修改了val 5,(int n=0) int,类和对象的基本概念 作业三,自动类型转换之构造函数转换,自动类型转换:如果编译器看到一个表达式或函数调用了一个不合适的类型,它经常会将当前类型
7、转到所需要的类型。,构造函数转换:如果一个构造函数函数能把另一类型对象(或引用)作为它的单个参数,那么这个构造函数允许编译器执行自动类型转换。,4 程序输出结果如下, 请填空3+4i 5+6i补足Complex类的成员函数,不能增加成员变量class Complex private:double r,i;public:void Print() cout r + i i endl;int main()Complex a;a = 3+4i;a.Print();a = 5+6i;a.Print();,类和对象的基本概念 作业三,构造函数Complex() ;Complex (const char *
8、 a) 另一种思路重载赋值操作符Complex &operator=(const char * a)演示,类和对象的基本概念 作业三,Print( )函数限制了只做正数答案只是参考完整的Complex类还需要完善,5 程序输出结果如下, 请填空10补足Sample类的成员函数,不能增加成员变量class Samplepublic:int v;Sample(int n):v(n) ;main()Sample a(5);Sample b = a;cout b.v ;,Sample( const Sample ,类和对象的基本概念 作业三,6 程序输出结果如下, 请填空ThisHello补足MySt
9、ring类的成员函数,不能增加成员变量class MyStringchar * p;public:MyString( char * s ) p = new charstrlen(s)+1;strcpy(p,s);MyString() delete p; const char * c_str() return p;,main()MyString s1(This), s2 =s1;s2.Copy ( Hello);cout s1.c_str () endl s2.c_str () ;,类和对象的基本概念 作业三,补足成员函数void Copy( char * s) delete p;p = new
10、 charstrlen(s)+1;strcpy(p,s);MyString( MyString ,类和对象的基本概念 作业三,7 程序输出结果如下, 请填空5,55,5class Base public:int k;Base (int n) : k(n) ;class Bigpublic:int v;Base b;Big _ Big _ ;,main()Big a1(5);Big a2 = a1;cout a1.v , a1.b.k endl;cout a2.v , a2.b.k endl;,Big(int n):v(n),b(n) Big(const Big & x):v(x.v),b(x.
11、b.k) ,类和对象的基本概念 作业三,1 程序输出结果如下, 请填空4,1请写出被隐藏的部分,MyInt的成员函数里不允许使用静态变量class MyIntint nVal;public: MyInt( int n) nVal = n ; int ReturnVal() return nVal; .;,main () MyInt objInt(10);objInt-2-1-3;cout objInt.ReturnVal();cout ,;objInt-2-1;cout objInt.ReturnVal();,MyInt ,运算符重载 作业三,2 程序输出结果如下, 请填空(4,5)(7,8)
12、class Point private:int x;int y;public: Point(int x_,int y_ ):x(x_),y(y_) ; _; _ operator (_, const Point ,main() cout Point(4,5) Point(7,8);,运算符重载 作业三,class Point private:int x;int y;public: Point(int x_,int y_ ):x(x_),y(y_) ; _; _ operator (_, const Point ,friend ostream ,ostream & operator ( ostr
13、eam & o, const Point & p),o ( p.x , p.y ) endl;,o,运算符重载 作业三,3 写一个二维数组类 Array2, 使得下面程序的输出结果是:0,1,2,3,4,5,6,7,8,9,10,11next0,1,2,3,4,5,6,7,8,9,10,11,运算符重载 作业三,using std:cout;using std:endl;int main() Array2 a(3,4); int i,j; for( i = 0;i 3; i + ) for( j = 0; j 4; j + ) aij = i * 4 + j; for( i = 0;i 3;
14、i + ) for( j = 0; j 4; j + ) cout a(i,j) ,; cout endl; ,cout next endl; Array2 b; b = a; for( i = 0;i 3; i + ) for( j = 0; j 4; j + ) cout bij ,; cout endl; return 0;,运算符重载 作业三,有哪些操作?内部如何实现?,运算符重载 作业三,注:重载的实际上是第二维的,第一维的直接调用int型一维数组的定义,运算符重载 作业三,第二种解法:,4 程序输出结果如下, 写一个HugeInt类 1)1000000890000002)10000
15、00890000003)100004)100005)100016)100067)100000089010006,运算符重载 作业三,有多少人没有把代码编译运行就提交了?,我是编译器?,void main() CHugeInt a(1234545436342424354354365289899834234235);CHugeInt d(9999);CHugeInt temp = CHugeInt(100000088888888) + 111112;CHugeInt temp2 = 111112+CHugeInt(100000088888888);cout 1) temp endl;cout 2)
16、 temp2 endl;cout 3) +d endl;cout 4) d+ endl;cout 5) d endl;d += 5;cout 6) d endl;cout 7) d + temp;,运算符重载 作业三,Again:标准答案只是参考,同样存在问题,1 写一个Mystring类, 使得程序输出结果如下:1. abcd-efgh-abcd-2. abcd-3.4. abcd-efgh-5. efgh-6. c7. abcd-8. ijAl-9. ijAl-mnop10. qrst-abcd-11. abcd-qrst-abcd- uvw xyz,aboutbigmetakeabcdq
17、rst-abcd-,继承和多态 作业四,#include#includeusing namespace std;class MyStringpublic: char *p; MyString() / 构造函数 p = NULL; MyString(char *t) / 构造函数 p = new charstrlen(t) + 1; strcpy(p,t); MyString(const MyString ,Mystring类(1),继承和多态 作业四,MyString() / 析构函数 if(p) deletep; MyString operator+(const MyString ,Myst
18、ring类(2),继承和多态 作业四,MyString operator+(const char *s) / +号重载,这里表示 /MyString类型+字符串的情形 char *q; q = new charstrlen(p) + strlen(s) + 1; strcpy(q, p); strcat(q, s); MyString temp(q); delete q; return temp; MyString 0,Mystring类(3),继承和多态 作业四,char ,Mystring类(4),继承和多态 作业四,MyString operator()(int i, int n) /
19、()重载 char *q; q = new charn+1; strncpy(q, p+i, n); qn = 0; MyString temp(q); delete q; return temp; ;ostream ,Mystring类(5),继承和多态 作业四,/ 号的重载int operator(const MyString ,Mystring类(6),继承和多态 作业四,2 从string类派生的写法class MyString : public stringpublic:MyString():string() MyString( const char * s):string(s)My
20、String( const string ,Mystring类(7),继承和多态 作业四,作业六:魔兽世界之二,两军的司令部都会制造武士。武士一共有 dragon 、ninja、iceman、lion、wolf 五种。每种武士都有编号、生命值这两种属性。有的武士可以拥有武器。武器有三种,sword, bomb,和arrow,编号分别为0,1,2。不同的武士有不同的特点。dragon 可以拥有一件武器。编号为n的dragon降生时即获得编号为 n%3 的武器。dragon还有“士气”这个属性,是个浮点数,其值为它降生后其司令部剩余生命元的数量除以造dragon所需的生命元数量。ninjia可以拥
21、有两件武器。编号为n的ninjia降生时即获得编号为 n%3 和 (n+1)%3的武器。iceman有一件武器。编号为n的iceman降生时即获得编号为 n%3 的武器。lion 有“忠诚度”这个属性,其值等于它降生后其司令部剩余生命元的数目。wolf没特点。请注意,在以后的题目里,武士的士气,生命值,忠诚度在其生存期间都可能发生变化,都有作用,武士手中的武器随着使用攻击力也会发生变化。,作业六:魔兽世界之二,作业六:魔兽世界之二,问题,没使用类把类当全局变量,只用来保存数据类设计得不好,结构层次不清晰只有很少几位同学的作业达到要求希望找点时间对照参考答案多思考,1 写出下面程序的运行结果,c
22、lass B private: int nBVal;public: void Print() cout nBVal= nBVal endl; void Fun() cout B:Fun endl; B ( int n ) nBVal = n;,class D:public B private : int nDVal;public: void Print() B:Print(); cout nDVal=nDVal endl; D( int n) : B(3*n) nDVal = n; void Fun() cout D:Fun Fun(); pd-Fun(); pb-Print (); pd-P
23、rint (); pb = ,D:FunB:FunD:FunnBVal=2nBVal=24nDVal=8B:FunnBVal=12,继承和多态 作业六,2 写出下面程序的运行结果,class A public:A( ) virtual void func() cout A:func endl; A( ) virtual void fund( ) cout A:fund endl; ;class B:public A public:B ( ) func( ) ; void fun( ) func( ) ; B ( ) fund( ); ;,class C : public B public :C
24、( ) void func( ) cout C:func endl; C() fund( );void fund() cout C:fund endl;main() C c; ,继承和多态 作业六,A:funcC:fundA:fund,3 程序输出结果如下, 请填空,A:FunC:Do请补足横线上丢失的部分#include class A private:int nVal;public:void Fun() cout A:Fun endl; ;void Do() cout A:Do endl; ;class B:public A public:virtual void Do() cout B:
25、Do endl;,class C:public B public:void Do( ) cout ”C:Do”endl; void Fun() cout C:Fun endl; ;void Call( _ ) p.Fun(); p.Do();main() C c;Call( c);,继承和多态 作业六,B & p,4 程序输出结果如下, 请填空,destructor Bdestructor A请完整写出 class A. 限制条件:不得为 class A 编写构造函数#include class A ;class B:public A public:B() cout destructor B
26、endl; ;main() A * pa;pa = new B;delete pa;,继承和多态 作业六,class A public:virtualA() cout destructor A endl; ;,5 程序输出结果如下, 请填空A:FunA:DoA:FunC:Do,class A private: int nVal;public: void Fun() cout A:Fun endl; ; virtual void Do() cout A:Do endl; ;,class B:public A public: virtual void Do() cout B:Do endl;class C:public B public: void Do( ) cout C:Doendl; void Fun() cout C:Fun Fun(); p-Do();main() Call( new A(); Call( new C();,A * p,void Call(_) p.Fun(); p.Do();main() Call(A(); Call(C();,A & p,继承和多态 作业六,