您好,欢迎来到九壹网。
搜索
您的当前位置:首页软件设计 面向对象的实验报告

软件设计 面向对象的实验报告

来源:九壹网
面向对象设计题1------自定义一个示意性的复数类型complex

(1) 需求分析

简单来说就是定义一个的类,而后编制程序进行复数的加,减,乘,除,以及取模的运算。要明白的是此时运算的是复数,而非实数。所以要对复数进行类的定义。根据你从电脑中的输入的量,程序对复数进行加,减,乘,除,以及取模的运算。 (2) 概要设计

因为定义的都是复数的类,自然参数的类型是complex,而主程序就是对复数的各个运算进行编程,达到求解的目的。然后在主函数里对其进行调用即可,被调用的程序之间也没有什么必然的联系,就是和实数运算类似的计算方法。 (3) 详细设计与编码

#include #include 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) 设计体会

这次的设计是面向对象的,自己在这次的设计中也遇到了不小的困难,有其是在计算器的设计中,自己刚开始可以说是毫无头绪的,不过经过自己在网查找资料以及在老师的指导和同学的帮助下还是完成了的。其他的题目也有一些难点,主要是自己对于文件的输出以及操作这一块还是很不熟悉,自己的在课下得在加紧把这一块的不上去。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务