1.要求
设计一个继承层次结构,用来处理字符串序列Sequence和有序字符串序列Sortedsequence
Sequence类拥有如下数据成员
1.用来存储多个字符串的成员
2.用来存储文件名的成员
3.用来存储最后一个字符串索引值的成员
4.用来处理输入输出文件的成员
Sequence类的公有成员函数完成如下操作
1.添加字符串到指定位置
2.删除指定位置的字符串
3.输出序列
Sequence类的默认构造函数完成如下操作
1.设定最后一个字符串的索引值为-1,表明序列中没有任何字符串
2.只有唯一参数的的构造函数完成如下操作
设定最后一个字符串的索引值为-1
将传递进来的代表文件名的字符串拷贝到相应的数据成员中
尝试打开该文件用于输入,如果文件不能打开,构造函数直接返回
从文件中读入序列,直到文件结尾或内存不够
关闭文件
析构函数完成如下功能
1.如果文件名是一个null字符串则返回
2.打开该文件用于输出
3.将序列写入文件中
4.关闭文件
2.实现
class Sequence{
public:
bool adds(int,const string&);//添加
bool del(int);//删除
void output()const;//输出
Sequence():last(-1){}//默认构造函数
Sequence(const char*);
~Sequence();
protected:
enum{MaxStr=50;}
string s[MaxStr];
int last;
private:
string filename;
ifstream in;
ofstream out;
};
bool Sequence::adds(int pos, const string& entry)
{
if(last==MaxStr-1||pos<0||pos>last+1)
return false;
for(int i = last; i>=pos;i--)
s[i+1]=s[i];
s[pos] = entry;
last++;
return true;
}//在pos位加入一个数
bool Sequence::del(int pos)
{
if(pos<0||pos>last)
return false;
for(int i = pos; i<last;i++)
s[i]=s[i+1];
last--;
return true;
}//删除pos位的数
Sequence::~Sequence()
{
if(filename =="")
return;//若文件名是一个空字符串则返回
out.open(filename.c_str());//将序列写入文件
for(int i = 0;i<=last;i++)
out<<s[i]<<'\n';//打开该文件用于输出
out.close();
}
void Sequence::output()const
{
for(int i = 0;i<=last;i++)
cout<<i<<" "<<s[i]<<'\n';
}
//输出函数
Sequence::Sequence(const char* fname)
{
last = -1;//设定最后一个字符串索引值为-1
fileneme=fname;//将传递进来的代表文件名的字符串拷贝到相应的数据成员中
in.open(fname);
if(!in)
return;//尝试打开文件用于输入,如果文件打不开,构造函数直接返回
while(last<MaxStr-1&&getline(in, s[last+1])))
last++;//从文件中读入序列,直到文件结尾或内存不够
in.close();//关闭文件
}
SortedSeq可从Sequence类派生出
1.SortedSeq定义了一个用于插入元素的成员函数,该函数只有一个元素,即要被插入的元素
(sort函数用来对序列进行排序)
2.SortedSeq类的默认构造函数调用Sequence类的默认构造函数
3.SortedSeq类没有析构函数,继承Sequence类的
class SortedSeq:public Sequence{
public:
bool addss(const string&)
SortedSeq(){}
SortedSeq(const char*);
protected:
void sort();//排序函数
private:
using Sequence::addss;
};
void SortedSeq::sort()
{
string temp;
int i,j;
for(i=0;i<last-1;i++)
{
temp=s[i+1];
for(j = i;j>=0;j--)
if(temp<s[j])
s[j+1]=s[j];
else
bresk;
s[j+1]=temp;
}
}//排序算法实现
bool SortedSeq::addss(const string& entry)
{
int i;
for(i=0; i<=last;i++)
if(entry<=s[i])
break;
return adds(i,entry);
}
SortedSeq::SotredSeq(const char* fname):Sequence(fname)
{
sort();
}