实验五多态性
一.实验目的和要求
目的:
1、掌握方法重载和类的多态性。
要求:
1、加减运算能够接收不同类型的参数既可以实现复数与实数的加减、复数与复数
的加减运算。
2、两游戏角色决斗。角色1交手次数+1,生命值-1,经验值+2;角色2交手次
数+1,生命值-2,经验值+3。经验值每增加50时,生命值+1;生命值<0判为负。
生命值初始为1000,经验值初始为0。
3、给定二个不同的角色,判定交手的胜负关系。
4、实验报告给出决斗结果和交手次数
5、实验报告给出所有源代码。
二.实验内容
1、编写一个名为“复数”的类,包含复数的实部和虚部(数据成员),以及复数之间的
基本算术运算:加、减(方法成员),并要求复数加减运算,程序运行中能对给定的复数进行运算,并打印运算的结果。
2、用类来描述游戏角色的交手次数、经验值、生命值之间的关系,并断定角色决斗的
胜负。
三.实验环境
硬件:
(1)学生用微机
(2)多媒体实验教室
软件:
(1)Windows XP中文操作系统
(2)JDK控制台
四.算法描述及实验步骤
实验步骤:
内容一:
1、创建“复数”类Complex,定义实部、虚部成员
2、定义构造函数接收二个double参数用来初始化数据成员
3、定义二个复数运算函数plus()以及minus()各接收一个复数类型以实现复数与复数
的加减运算。
4、定义二个复数运算函数plus()以及minus()各接收一个double类型以实现复数与与
实数的加减运算。
4、定义一个打印方法。
5、在main()方法中创建复数对象并调用相关方法来验证。
内容二:
1、建立角色类Role,给出相应的成员,并能以生命值、经验值初始化角色对象。
2、在角色类中建立fight方法,接收一个角色类型的参数并与之“战斗”,返回胜者信
息。
3、在主函数中初始化二个角色,调用fight方法。
五.调试过程
1.根据要求写出程序并调试运行,得:
当出现负数时,不需要我们外加一个负号,同时为什么会多出那么长的一串零呢?搞不懂为什么。于是我将程序改为当出现负数时,不外加一个负号。修改后的程序见附录1,结果见实验结果1。
2.根据实验步骤,写出程序并调试运行:
500次,不对啊,角色2经验上升时生命会增加啊,怎么会只有500次呢。仔细检查,修改程序得实验结果(见实验结果2,程序见附录2)。
六.实验结果
1.程序一运行结果:
2.程序二运行结果:
七.总结
这次的程序好长,不过都是自己写的,发了两节课,出现了不少问题(只是没好意思截出来),和同学老师讨论了一下,对普通函数和构造函数有了更深刻的认识,这次的程序也不如之前的完美,很多本来想做的东西,如用Scanner类从键盘键入自己想要的数字、如何读取自己输入的复数、只进行自己想要进行的运算、对运算结果进行说明等,最终由于时间的原因,也由于自己自身能力的限制,没能如自己所愿,是一大憾事。不过也不能太灰心,至少可能写一些简单的程序,其实我很得意的是我用了一个三元运算符(?:),呵呵,也不
能算没有收获。
附录:
1.程序一:
public class fsys//复数运算主类
{ static void print( complex c)//打印复数函数
{ System.out.print((c.em==0)?(c.re+"\n"):(c.re+((c.em>0)?("+"):(""))+c.em+"i\n" ));
}
public static void main(String ar[])
{ complex a=new complex();
complex b=new complex();
complex c=new complex();
double d=4.30;//要进行运算的实数
a.re=1.02;//加数(被减数)的实部
a.em=2.34;// 加数(被减数)的虚部
b.re=3.105;// 被加复数(减数)的实部
b.em=5.4317;// 被加复数(减数)的虚部
c=a.plus(b);
print(c);
c=a.minus(b);
print(c);
c=a.plus(d);
print(c);
c=a.minus(d);
print(c);
}
}
class complex
{ double re;//复数实部
double em; //复数部
complex plus(complex other)//复数相加
{ complex result=new complex();
result.re=this.re+other.re;
result.em=this.em+other.em;
return result;
}
complex minus(complex other)//复数相减
{ complex result=new complex();
result.re=this.re-other.re;
result.em=this.em-other.em;
return result;
}
complex plus(double other)//复数加实数
{ complex result=new complex();
result.re=this.re+other;
result.em=this.em;
return result;
}
complex minus(double other)//复数减实数
{ complex result=new complex();
result.re=this.re-other;
result.em=this.em;
return result;
}
}
2.程序二:
class role
{ String name;//角色姓名
int life=1000;//角色生命初值为1000
int exp=0;//角色经验初值为0
int count=0;//角色交战场次初值0
role fight(role role2)//定义生死搏斗函数
{ int n,E1,E2,i=0,j=0;
while(this.life>0&&role2.life>0)
{ this.life=this.life-1;
role2.life=role2.life-2;
this.exp=this.exp+2;
role2.exp=role2.exp+3;
E1=this.exp;
E2=role2.exp;
this.count++;
role2.count++;
if(E1-50*i>=50)
{ this.life=this.life+1;
i++;
}
if(E2-50*j>=50)
{ role2.life=role2.life+1;
j++;
}
}
return ((this.life<0)?role2:this);//生命值<0判为负 }
}
public class game
{ public static void main(String ar[])
{ role role1=new role();
role role2=new role();
https://www.wendangku.net/doc/3f14701337.html,="role1";
https://www.wendangku.net/doc/3f14701337.html,="role2";
role winner=new role();
winner=role1.fight(role2);
System.out.print(https://www.wendangku.net/doc/3f14701337.html,+"经过"+winner.count+"次的努力,终于赢得了胜利!");
}
}