using namespace std;class complex //对复数这个类进行定义 {
double real; double imag; public:
complex(){real=0;imag=0;} //复数的实部与虚部的初始化
complex(double r,double i){real=r;imag=i;} complex addCom(complex c2); void outCom(); //加法
complex dec(complex c2); //减法 complex multiply(complex c2); //乘法
complex made(complex c2); //除法 double model(complex c2); //取模 };
complex complex::addCom(complex c2) //加法程序的设计
{
complex c3;
c3.real=real+c2.real; c3.imag=imag+c2.imag; return c3; }
complex complex::dec(complex c2) //减法程序的设计
{
complex c3; c3.real=real-c2.real; c3.imag=imag-c2.imag; return c3; }
complex complex::multiply(complex c2) //乘法程序的设计
{
complex c3;
c3.real=real*c2.real-imag*c2.imag; c3.imag=real*c2.imag+imag*c2.real; return c3;
}
complex complex::made(complex c2) //除法程序的设计
{
complex c3;
c3.real=((real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag))/1.0;
c3.imag=((c2.real*imag-real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag))/1.0;
return c3; }
double complex::model(complex c2) //取模的程序设计
{ return sqrt(c2.real*c2.real+c2.imag*c2.imag);} void complex::outCom()
{ cout<<\"(\"<{double r1,r2,i1,i2; //对复数赋予初值 cout<<\"请输入一个复数的实部和虚部:\"<>r1>>i1;cout<<\"请再输入一个复数的实部和虚部:\"<>r2>>i2;complex c1(r1,i1),c2(r2,i2); complex C1,C2,C3,C4;
double C5;
C1=c1.addCom( c2);
cout<<\"c1和c2的复数和为:\";C1.outCom(); C2=c1.dec(c2);
cout<<\"c1和c2的复数差为:\";C2.outCom(); C3=c1.multiply(c2);
cout<<\"c1和c2的复数积为:\";C3.outCom(); C4=c1.made(c2);
cout<<\"c1和c2的商为:\"; C4.outCom(); C5=c1.model(c2);
cout<<\"c2的复数模为:\"<(4) 调试分析起初因为在主函数调用的时候总是对c2前进行复数complex的说明,结果导致程序的错误,也因为觉得这是理所当然的正确,所以在找出错误这个环节上就被卡住了。后来与组长讨论,觉得主函数前不是已经对c2进行了complex的说明,后面再来一次显得多余了。所以就简单的改成类似
C1=c1.addCom( c2)的情况。结果问题就迎刃而解了。 (5) 用户使用说明
用户只需要根据屏幕上提供的字样输入相应的值,就可以运行该程序,而且得到相应的准确值。关键的是在于一个类的定义以及主函数的编写。
class complex //对复数这个类进行定义 {
double real;
double imag; public:
complex(){real=0;imag=0;} //复数的实部与虚部的初始化
complex(double r,double i){real=r;imag=i;} complex addCom(complex c2); void outCom(); //加法
complex dec(complex c2); //减法 complex multiply(complex c2); //乘法 complex made(complex c2); //除法 double model(complex c2); //取模 };
理清自己对运算进行调用其中相关的量是什么,而后一气呵成,因为复数与实数的运算类似,所以调用函数的程序就很简单。
complex C1,C2,C3,C4; double C5;
C1=c1.addCom( c2);
cout<<\"c1和c2的复数和为:\";C1.outCom(); C2=c1.dec(c2);
cout<<\"c1和c2的复数差为:\";C2.outCom(); C3=c1.multiply(c2);
cout<<\"c1和c2的复数积为:\";C3.outCom(); C4=c1.made(c2);
cout<<\"c1和c2的商为:\"; C4.outCom(); C5=c1.model(c2);
cout<<\"c2的复数模为:\"<因为调用的都是函数,不是一个复数值,所以在定义Ci(i=1,2,3,4,5)的complex,进行调用函数的赋值,这样程序就可以运行了。 (6) 测试分析
以前就觉得自己在面向对象上比较薄弱,当再次对这个进行编程,刚开始还是有点不知所措,不懂得如何下手。自己就去翻书深入了解,和组长进行探讨,对输入值的类型以及是否是函数还是一个值,都进行细致研究,虽然成功了,但是在其中遇到的问题还是重复对值进行类型定义,以后要注意了。
面向对象设计题3------利用虚函数手段,按照三种不同的
计算方法求出Fiboncci数列的第n项
(1) 需求分析
按照三种不同的计算方法求出Fiboncci数列的第n项,分别是简单变量“数据平移法”,使用数组的实现法,还是就是使用递归函数。对于自己输入的n的值,三种方法得到相同的答案。 (2) 概要设计
都是“int”的类型,不同于面向过程的就仅仅是“数据平移法”,要求是在虚函数的条件下主函数分别对三个函数进行调用,因为在运行的时候,n的值较大,所以又有了指数类型的函数,三种方法三个求解,没有什么特别之处。 (3) 详细设计与编码
#include using namespace std;class baseCla// 虚函数的说明以及类的定义 { public:
virtual double fib(int n)=0; };
class fib1Cla:public baseCla { public:
virtual double fib(int n); };
class fib2Cla:public baseCla { public:
virtual double fib(int n); };
class fib3Cla:public baseCla { public:
virtual double fib(int n); };
double fib1Cla:: fib(int n)//简单变量“数据平移法”的函数说明,此前面向过程已经编写过。
{
double c;
if(n==1||n==2) c=1; else {
double c1=1,c2=1;
for(int i=3;i<=n;i++) } return c; }
double fib2Cla::fib(int n) //利用数组进行数列的层层递进,从而达到对第n个值的求解。
{
double c[2000]; c[1]=1;c[2]=1; for(int i=3;i<=n;i++) {
c[i]=c[i-1]+c[i-2]; } return c[n]; }
double fib3Cla::fib(int n)//递归函数求解,最简单的程序代码
{
double c; if(n==1||n==2)
{
c=c1+c2; c1=c2; c2=c; }
c=1;
else c=fib(n-1)+fib(n-2); return c; }
void fun(baseCla *p,int n)//指数形式得到数列的第n项的值。
{
double d =p->fib(n); cout.flags(ios::scientific); cout.precision(15);
cout<<\"fib(\"<void main() {fib1Cla obj1; fib2Cla obj2; fib3Cla obj3;
cout<<\"............fib1Cla..........\"<cout<<\"............fib2Cla..........\"<cout<<\"............fib3Cla..........\"<fun(&obj3,35); }(4) 程序调试
说实话,这三种方法的程序代码并不难,难的是理解题目说明同一个虚函数以及基类和派生类的定义,自己在程序运行的过程中,得到的数组值不正确,通过观察知道了那是数组太短造成溢出,从而导致结果出错。还有就是不明白这个虚函数好似就是对n进行调用一下,没有特别的功能。 (5) 用户使用说明
这个程序已经在主函数中对三种方法的n值进行了初值的定义,所以用户在使用的时候如果想知道其他的值,可以对主函数进行稍微的变动,自己来输入n的值。
比如cout<<\"..........fib1Cla........\"<变动成cout<<“请输入一个整数n的值:”<fun(&obj1,n);就可以了。其实很简单的。 至于三种方法的程序的代码只要细细分析一下还是很容易就明白。无外乎就是循环。 (6) 设计体会这次的设计是面向对象的,自己在这次的设计中也遇到了不小的困难,有其是在计算器的设计中,自己刚开始可以说是毫无头绪的,不过经过自己在网查找资料以及在老师的指导和同学的帮助下还是完成了的。其他的题目也有一些难点,主要是自己对于文件的输出以及操作这一块还是很不熟悉,自己的在课下得在加紧把这一块的不上去。