数据结构实验报告——实验一
实验报告一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的共轭复数:
[粘贴测试结果]
三、 心得体会:(含上机中所遇问题的解决办法,所使用到的编程技巧、创新点及编程的心得)
高等数学数学实验报告实验人员:院(系)_______________学号________姓名实验地点:计算机中心机房实验一一、实验…
数学实验报告实验名称matlab学院专业班级姓名学号20xx年6月一实验目的通过课后习题的练习掌握利用matlab进行概率运算和数…
重庆大学学生实验报告实验课程名称数学实验开课实验室学院年级专业班学生姓名学号开课时间学期数学与统计学院制开课学院实验室数学与统计D…
西安交通大学数学实验报告高等数学实验报告MATLAB实验操作报告同组人髙加西20xx年04月10日电气工程学院电气工程与自动化专业…
程序设计心得体会做了一个星期的程序设计终于做完了,在这次程序设计课中,真是让我获益匪浅,我突然发现写程序还挺有意思的。由于上学期的…
心得体会:做了一个星期的程序设计终于做完了,在这次程序设计课中,真是让我获益匪浅。对大一学习的C语言和这学期开的数据结构,并没有掌…
数据结构课程设计心得体会(专业:计算机科学与技术姓名:朱文学号:20xx220xx7)通讯录管理系统是基于双向循环链表设计而成的信…
数据结构基础实验总结本学期开设的《数据结构基础》课程已经告一段落,现就其知识点及其掌握情况、学习体会以及对该门课程的教学建议等方面…
课程设计的心得体会姓名:何云龙学号:0804012022班级:08计科(2)班“数据结构与算法课程设计”是计算机科学与技术专业学生…
这次课程设计的心得体会通过实习我的收获如下1、巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。2、培养了我选用参考…