山东大学数据结构实验报告实验一

数据结构实验报告——实验一

 

第二篇:数据结构实验报告一C++基础实验

实验报告一C++基础实验

班级__2010XXX__  学号__2010XXXX__  姓名__HoogLe__  专业___XXXX____

一、          实验目的:

(1)       掌握类与对象的基本知识点

(2)       掌握引用、指针的应用

(3)       掌握函数模板、类模板的应用

(4)       利用time函数实现算法评价的事后统计方法

(5)       熟悉抽象数据类型的表示和实现方法

二、          实验内容:

1、利用函数模板,实现输入三个数(可以是三个整形或浮点数等),并按由大到小的进行排序后输出。

#include <iostream>

­­_using namespace std__;

_template<typename Type>__

swap1(_Type_ *p1,_Type_ *p2)

{

  _Type_ p;

  p=*p1;

  *p1=*p2;

  *p2=p;

}

void main()

{_int_ n1,n2,n3;

 cout<<"请输入三个整数:\n";

 cin>>n1>>n2>>n3;

 if (n1<n2)  __swap1(&n1,&n2)___;

 if (n1<n3)  __swap1(&n1,&n3)___;

 if (n2<n3)  __swap1(&n2,&n3)___;

 cout<<"排序后为:"<<n1<<ends<<n2<<ends<<n3<<endl;

 _float_ e1,e2,e3;

 cout<<"请输入三个浮点数:\n";

 cin>>e1>>e2>>e3;

 _if(e1<e2)  swap1(&e1,&e2)_____;

_if(e1<e3)  swap1(&e1,&e3)_____;

_if(e2<e3)  swap1(&e2,&e3)_____;

 cout<<"排序后为:"<<e1<<ends<<e2<<ends<<e3<<endl;

}

请粘贴出运行测试结果:

2、  实现利用选择排序对存储10个数值的动态数组进行排序的通用模板。

#include <iostream>

using namespace std;

_template<typename Type>_

void sort(_Type_ *a, int n)  /*选择法排序,从小到大*/

{int i,j; __Type_ p;

  for (i=0;i<n;i++)

         for (j=i+1;j<_n___;j++)

         {

                if (a[i]>a[j])

                {

                      p=*(a+i);  //*(a+i)等价于a[i];

                      a[i]=a[j]____;

                      _*(a+j)___=p;

                }

         }

}    

试分析sort的时间复杂度:O();

void main()

{   int n;  //数组大小变量

       cout<<"请输入动态数组的大小:";

    ­_cin>>n_;

       _int *p=new int[n]__________;  //申请动态数组存储空间

       cout<<"\n请输入数组中的"<<n<<"个数据:\n";

       for(int i=0;i<n;i++)

       _cin>>p[i]___;//从键盘读入数据

       _sort(p,n)___________; //对数组中的数据进行排序

     cout<<"排序后数组中的数据:\n";

    for(int j=0;j<n;j++)

       __cout<<p[j]_____;    //输出数组中的数据

       cout<<endl;

    __delete [ ] p_____________ ; //释放所申请的存储空间

}

粘贴测试数据及运行结果:

3. 算法事后统计分析方法,利用函数库time中clock_t类进行测试。

实例:统计5,000,000,00次空的for循环的时间,单位是秒。

这个头部定义了与时间有关的三种类型Clock_t,time_t,tm。),利用此方法,可对同一问题的不同算法加以性能测试。

#include <iostream>

#include <time.h>

using namespace std;

void main()

{          volatile long unsigned t;//volatile 可变的

       //方法一:

       time_t start;

       start=time(NULL);//设置起始时间

       for(t=0;t<500000000;t++);

       cout<<"loop used " <<difftime(time(NULL),start)<<" seconds.\n";

    //方法二:

       clock_t ti=clock();//取当前时钟时间

    for(t=0;t<500000000;t++);

    cout<<"loop used " <<(clock()-ti)/(CLK_TCK*1.0)<<" seconds.\n";//精度更高

}

粘贴测试结果:

4.[问题描述]:设计一个复数类,其抽象数据类型描述如下。

 [复数抽象数据类型描述]:

ADT complex is

Date

实部。

虚部。

Operation

Complex构造函数

   输入:要初始化实部的值realval与虚部的值imgval。

动作:确定实部与虚部。

GetReal 获得实部

   输入:无

   前置条件:无

   动作:获得复数的实部

   输出:返回该复数的实部。

   后置条件:无

GetImag 获得虚部

   输入:无

   前置条件:无

   动作:获得复数的虚部

   输出:返回该复数的虚部。

   后置条件:无

Operate + 重载加法运算符,实现两个复数相加

输入:另一个所要相加复数对象

   前置条件:无

   动作:将两个复数的实部与虚部分别相加

   输出:返回相加后的复数对象。

   后置条件:无

Operate - 重载减法运算符,实现两个复数相减

输入:要减的复数对象

   前置条件:无

   动作:将两个复数的实部与虚部分别相减

   输出:返回相减后的复数对象。

   后置条件:无

Display  输出复数

输入:无

   前置条件:无

   动作:将复数的实部和虚部按一定格式输出

   输出:无

   后置条件:无

end ADT complex

[利用类模板加以实现,使实部、虚部可以为int或float或double]

头文件complex.h实现类声明代码如下:

#include<iostream.h>

template<class T>

class complex 

{

private:

       T realval,imgval;

public:

       complex(){ realval=imgval=0;};

       complex<T>(T real=0,T img=0){

              realval=real;

              imgval=img;

       }

       ~complex(){};

       T GetReal();

       T GetImag();

    complex<T> operator+(complex<T>& c);

       complex<T> operator-(complex<T>& c);

       friend ostream& operator<<(ostream& out,complex<T>& d);

       friend istream& operator>>(istream& in,complex<T>& d);

       void display();

};

在complex..cpp文件中实现complex类中成员函数,实现代码如下:

template<class T>

T complex<T>::GetReal(){

      return realval;

}

template<class T>

T complex<T>::GetImag(){

        return imgval;

}

template<class T>

complex<T> complex<T>::operator+(complex<T>& c){

         realval+=c.realval;

         imgval+=c.imgval;

         return *this;

}

template<class T>

complex<T> complex<T>::operator-(complex<T>& c){

         realval-=c.realval;

         imgval-=c.imgval;

         return *this;

 }

template<class T>

ostream& operator<<(ostream&out,complex<T>& d) {

       if(d.realval!=0&&d.imgval!=0){

            out<<d.realval<<"+"<<d.imgval<<"i";

            return out;

       }

       else if(d.realval!=0&&d.imgval==0){

              out<<d.realval;

            return out;

       }

       else if(d.realval==0&&d.imgval!=0){

              out<<d.imgval<<"i";

            return out;

       }

       else {

             out<<0;

                return out;

       }

}

template<class T>

istream& operator>>(istream&in,complex<T>& d) {

            in>>d.real>>d.imag;

            return in;

}

template<class T>

void complex<T>::display(){

       if(realval!=0&&imgval!=0){

            cout<<realval<<"+"<<imgval<<"i";

       }

       else if(realval!=0&&imgval==0){

              cout<<realval;

       }

       else if(realval==0&&imgval!=0){

              cout<<imgval<<"i";

       }

       else {

            cout<<0;

       }

}

主程序代码如下:

#include<iostream.h>

#include"complex.h"

void main(){

    complex<int> com11(0,0),com12(0,0);

       complex<int> com21(4,0),com22(0,3);

       complex<double> com31(3,1.5),com32(8,-1.5);

       complex<double> com41(-4,3.4),com42(-6,-8.1);

       complex<double> com51(-5.4,1.2),com52(5.4,3.2);

      

       cout<<"输入测试"<<endl;

       com11.display();cout<<" ";com12.display();cout<<endl;

       com21.display();cout<<" ";com22.display();cout<<endl;

       com31.display();cout<<" ";com32.display();cout<<endl;

       com41.display();cout<<" ";com42.display();cout<<endl;

       com51.display();cout<<" ";com52.display();cout<<endl;

   

       cout<<"测试加法、减法"<<endl;

       cout<<"("<<com31<<")+("<<com32<<")=";

       cout<<(com31+com32)<<endl;

       cout<<"("<<com41<<")-("<<com42<<")=";

       cout<<com41-com42<<endl;

      

       cout<<"测试提取实部虚部"<<endl;

       cout<<com51<<":"<<com51.GetReal()<<"-----"<<com51.GetImag()<<endl;

       cout<<com52<<":"<<com52.GetReal()<<"-----"<<com52.GetImag()<<endl;

      

       cout<<"通过提取实部虚部求Z1的共轭复数"<<endl;

       complex<int> z1(com11.GetImag(),com11.GetReal());

       cout<<z1<<endl;

}

 [测试数据]

(1)Z1=0,Z2=0;

(2)Z1=4,Z2=3i;

(3)Z1=3+1.5i,Z2=8-1.5i;

(4)Z1=-4+3.4i,Z2=-6-8.1i;

(5)Z1=-5.4+1.2i,Z2=5.4+3.2i;

(6)Z1的共轭复数:

[粘贴测试结果]

三、          心得体会:(含上机中所遇问题的解决办法,所使用到的编程技巧、创新点及编程的心得)

相关推荐