实验三 数组、指针与字符串

  • 格式:doc
  • 大小:59.00 KB
  • 文档页数:5

实验三数组、指针与字符串(4学时)[实验目的]
1、通过动态内存分配实现动态数组,并体会指针在其中的作用;
2、理解C++中深、浅拷贝的区别和适用场合,掌握其应用方法;
3、运用所学知识,实现简单的数据结构,培养分析和解决实际问题的能力。

[实验内容与步骤]
1、实现一个大小可变的整型数据元素集合,集合可存储的集合元素个数在对象构造时给
定,由构造函数为数据元素分配存储空间,在对象被释放时由析构函数释放存储空间。

此外,编程实现元素增添、删除、复制、查找、显示及求集合的交集、并集。

#include<iostream>
using namespace std;
const int maxNum = 20; //集合中允许容纳的元素的默认最大值
//大小可变的集合类:
class Set
{
int size; //集合中允许容纳的元素的最大个数
int *elems; //存储元素的数组
int num; //集合中元素的个数
public:
Set (int sz=maxNum);
~Set();
bool IsMember(int); //判断是否为集合的元素
bool AddElement(int); //添加元素
void RemoveElement(int); //删除元素
void Copy(Set &); //集合复制
void Show(); //显示集合中元素
void Intersect(Set &,Set &); //求集合的交集
bool Union(Set &,Set &); //求集合的并集
};
//类Set的实现
inline Set::Set(int sz)
{
num=0;
size=sz;
elems=new int[size];
}
inline Set::~Set()
{
delete []elems;
}
bool Set::IsMember(int e)
{
for (int i=0; i<num; i++)
if (elems[i]==e) return true;
return false;
}
bool Set::AddElement(int elem)
{
if (IsMember(elem)) return true;
if (num<size)
{
elems[num++] = elem;
return true;
}
return false;
}
void Set::RemoveElement(int c)
{
int index=-1;
for (int i=0; i<num; i++)
if (elems[i]==c)
{
index =i;
break;
}
if (index!=-1)
{
for (int i=index; i<num-1; i++)
{
elems[i] = elems[i+1];
num --;
}
}
}
void Set::Copy(Set &s)
{
if (size<s.size)
{
delete []elems;
elems = new int[s.size];
size = s.size;
}
for (int i=0; i<s.num; i++) elems[i] = s.elems[i];
num = s.num;
}
void Set::Show()
{
cout<<"{";
for (int i=0; i<num-1; i++) cout<<elems[i]<<",";
if (num>0) cout<<elems[num-1];
cout<<"}"<<endl;
}
void Set::Intersect(Set &s1,Set &s2)
{
if (size<s1.size)
{
delete []elems;
elems=new int[s1.size];
size=s1.size;
}
num=0;
for (int i=0; i<s1.num; i++)
if (s2.IsMember(s1.elems[i])) elems[num++] = s1.elems[i];
}
bool Set::Union(Set &s1,Set &s2) //求集合的并集(填写代码实现其功能){
}
//测试
int main()
{
Set s1,s2,s3;
int i;
for (i=0; i<5; i++) s1.AddElement(2*i);
for(i=0;i<5;i++) s2.AddElement(3*i);
cout<<"s1="; s1.Show();
cout<<"s2="; s2.Show();
s2.RemoveElement(9);
cout<<"s2-{9}="; s2.Show();
if(s1.IsMember(2)) cout<<"2 is in s1\n";
else cout<<"2 is not in s1\n";
s3.Intersect(s1,s2);
cout<<"s1 intsec s2="; s3.Show();
//
//s3.Union(s1,s2);
//cout<<"s1 union s2="; s3.Show();
return 0;
}
2、下面是一个声明了部分成员的类:
c lass strclass
{
char *p;
int length;
public:
char *getstring(){return (p);}
int getlength(){return (length);}
};
要求编写两个构造函数。

第一个构造函数没有参数,用new 动态分配128字节的内存,并用空字符串对该段内存进行初始化,在length中放入值128;第二个构造函数有两个参数,第一个参数是字符串,用于初始化,另一个参数是字节数,据此大小分配内存空间,并将字符串拷贝到该内存。

要求进行必要的界限检查,并在主程序演示构造函数的工作情况。

[实验要求]
1、明确实验目的,理解和掌握课程教学中的有关基本概念,并加以灵活应用以解决实际问
题,提高分析问题和解决问题的能力。

2、根据[实验内容与步骤],做好实验前的预习,并按要求拟定解决问题的算法和编制程序。

3、写出实验报告,包括实验目的、实验内容中的题目、算法及程序清单、测试数据及运行
结果、调试分析和体会。

[习题与思考题]
1、用类Vector表示一组向量,类Vector内包含了整型数据成员n 及指针array,n表示
向量的成分个数,而array则是指向该向量的内容(为一动态数组),要求为这种类型的向量建立加法、内积及标度(scale)函数,利用这种方式我们可以处理维数不固定的向量的运算。

2、利用类表示堆栈(stack),并为此堆栈建立push( ) (压栈)、pop( ) (弹栈)及显示堆栈内
容的showstack( ) 等函数。

(要求在主控程序中以菜单方式调用上述功能)
3、试用类建立一个环状队列的数据系统,并为此环状队列建立put( )、get( ) 及显示队列内
容的函数。