Розроблено клас clsString, який призначений для розв'язку задачі обробки рядків.
Розроблений клас включає 4 компонентів-даних та 29 компонентів-методів, серед яких 2 є захищеними, 29 можуть успадковуватися, а 27 є загальнодоступними. Клас включає 4 конструктори, 1 деструктор, 1 віртуальних функцій, надає можливості з використання найменувань стандартних операцій для виконання введення/виведення в потік, порівняння рядків.
Розроблений клас є похідним від класів TPStrThread та TPStrCompare, котрі є похідними від класу TPString.
Особливостями розробленого класу є можливість ініціалізації, отримуючи дійсне чи ціле число, та пошук першого входження з вказаної позиції підстроки.
Результати тестування підтвердили працездатність і ефективність використання об'єктів, створюваних на основі розробленого класу.
Розроблене програмне забезпечення функціонує під керуванням операційної системи Windows.
1. MSDN
2. Pohl, Ira C++ by Dissection. Addison-Winsley: New York, 2002.520p
3. Stroustrup, Bjarne The C++ Programing Language. Addison-Winsley: New York, 1997.912p
4. Дейтел Х.М. Дейтел П. Дж. Как программировать на С++. М.: Бином, 2005.1244с
5. Липпман С.Б. С++ для начинающих. М.: Питер, 2002.1194с
Додаток А
Код файлу "TPstr. h", з об’явою класів.
#ifndef TPSTR_H
#define TPSTR_H
#include <iostream>
using std:: ostream;
using std:: istream;
class TPString
{
public:
// TPString ();
TPString (const char * = "");
TPString (TPString&);
~TPString ();
char&operator [] (int);
const char &operator [] (int) const;
TPString &operator= (TPString&);
TPString &operator+= (const TPString&);
TPString &operator+ (const TPString&);
void Clear ();
void TPdelete (int startpos, int count);
void insert (TPString&, int pos, int count);
int lenght () const;
virtual int ErrorCode () {return 0; }
protected:
int BuffLen;
int len;
char * symb;
void FatalError () const;
void setString (const char*);
};
class TPStrThread abstract: virtual public TPString
{
friend ostream &operator<< (ostream&, const TPStrThread&);
friend istream &operator>> (istream&, TPStrThread&);
public:
char* GetStr (); // повертає копію рядка у стилі С
char* GetStr (int stpos, int count); // копія підрядка у стилі С
};
class TPStrCompare abstract: virtual public TPString
{
public:
bool operator! () const; // Чи порожня строка
bool operator! = (const TPStrCompare&) const;
bool operator== (const TPStrCompare&) const;
bool operator< (const TPStrCompare&) const;
bool operator> (const TPStrCompare&) const;
bool operator<= (const TPStrCompare&) const;
bool operator>= (const TPStrCompare&) const;
};
class clsString: public TPStrThread, public TPStrCompare
{
public:
clsString (const char * = "");
clsString (const long);
clsString (const double, int pers = 12);
clsString (clsString&);
~clsString () {}
clsString &operator () (int, int);
clsString & operator= (const clsString&);
int ErrorCode () {return code; }
int find (const clsString&, int pos =0);
private:
int code;
};
#endif
Код файлу "TPstr. cpp", з описом методів класів.
#include "TPstr. h"
#include <errno. h>
// class TPString
TPString:: TPString (const char *s)
{
len=strlen (s);
BuffLen=0;
symb=NULL;
setString (s);
}
TPString:: TPString (TPString & copy)
{
len=copy. len;
BuffLen=0;
symb=NULL;
setString (copy. symb);
}
TPString:: ~TPString ()
{
delete [] symb;
}
char&TPString:: operator [] (int index)
{
if ( (index<0) || (index>=len)) FatalError ();
return * (symb+index);
}
const char &TPString:: operator [] (int index) const
{
if ( (index<0) || (index>=len))
{
FatalError ();
}
return symb [index];
}
TPString &TPString:: operator= (TPString& copy)
{
len=copy. len;
setString (copy. symb);
return *this;
}
TPString &TPString:: operator+= (const TPString& part)
{
if (BuffLen< (len+1+part. len)) {
BuffLen=len+1+part. len;
char *ptr=new char [BuffLen];
strcpy (ptr,symb);
strcpy (ptr+len,part. symb);
ptr [BuffLen-1] =0;
delete [] symb;
symb=ptr;
} else {
strcpy (symb+len,part. symb);
}
len+=part. len;
return *this;
}
TPString &TPString:: operator+ (const TPString& part)
{
TPString temp (*this);
temp+=part;
return temp;
}
void TPString:: Clear ()
{
len=0;
if (symb! =NULL) symb [0] ='\0';
}
void TPString:: TPdelete (int startpos, int count)
{
if (startpos>=len||startpos<0||count<0) return;
if (startpos+count>=len||count==0) count=len-startpos+1;
int st=startpos+count;
for (; st<=len; st++) symb [startpos++] =symb [st];
len=len-count;
}
void TPString:: insert (TPString& part, int pos, int count)
{
if (pos>len) return;
if (count>part. len) count=part. len;
if (part. len<count||count<=0) count=part. len;
if (BuffLen>=len+count+1) {
for (int i=len; i>=pos; - -i)
{
symb [i+count] =symb [i];
}
for (int i=0; i<count; i++, pos++)
{
symb [pos] =part. symb [i];
}
// symb [pos] ='\0';
} else {
char *temp=new char [len+part. len+1];
strncpy (temp,symb,pos);
strncpy (temp,part. symb,count);
strncpy (temp,symb+pos,len-pos);
delete [] symb;
symb=temp;
BuffLen=len+part. len+1;
}
len+=count;
}
int TPString:: lenght () const
{
return len;
}
void TPString:: setString (const char* s)
{
if (BuffLen<len+1)
{
if (symb! =NULL) delete [] symb;
BuffLen=len+1;
symb=new char [BuffLen];
}
strcpy (symb,s);
}
void TPString:: FatalError () const
{
exit (1); }
// class TPStrThread
ostream &operator<< (ostream& out, const TPStrThread& tp)
{
for (int i=0; i<tp. len; i++)
out<<tp. symb [i];
return out;
}
istream &operator>> (istream& input, TPStrThread& tp)
{
int i=256;
int k=-1;
char *temp=new char [i];
do{
k++;
if (k>i) {
i<<1;
char * t=new char [i];
strncpy (t,temp,k);
delete [] temp;
temp=t;
}
input. get (temp [k]);
}while (temp [k] ! ='\n');
temp [k] =0;
if (tp. symb! =NULL) delete [] tp. symb;
tp. symb=temp;
tp. BuffLen=i;
tp. len=strlen (temp);
return input;
}
// TPStrThread &operator= (TPStrThread&);
char* TPStrThread:: GetStr ()
{
char *temp=new char [len+1];
strcpy (temp,symb);
return temp;
}
char* TPStrThread:: GetStr (int stpos, int count)
{
if (stpos<0|| stpos>=len||count<=0||count+stpos>=len) return NULL;
char *temp=new char [count+1];
strncpy (temp,symb+stpos,count);
temp [count] ='\0';
return temp;
}
// class TPStrCompare
bool TPStrCompare:: operator! () const
{
if (len==0) return true; else return false;
}
bool TPStrCompare:: operator! = (const TPStrCompare& part) const
{
return (strcmp (symb,part. symb) ! =0);
}
bool TPStrCompare:: operator== (const TPStrCompare& part) const
{
return! (*this! = part);
}
bool TPStrCompare:: operator< (const TPStrCompare& part) const
{
return strcmp (symb,part. symb) <0;
}
bool TPStrCompare:: operator> (const TPStrCompare& part) const
{
return (strcmp (symb,part. symb) >0);
}
bool TPStrCompare:: operator<= (const TPStrCompare& part) const
{
return! (*this> part);
}
bool TPStrCompare:: operator>= (const TPStrCompare& part) const
{
return! (*this< part);
}
// class clsString
clsString:: clsString (const char * s)
{
len=strlen (s);
BuffLen=0;
symb=NULL;
setString (s);
}
clsString:: clsString (const long l)
{
char s [_CVTBUFSIZE];
if (_i64toa_s (l,s,15,10) ==EINVAL) code=1;
else code=0;
len=strlen (s);
BuffLen=0;
symb=NULL;
setString (s);
}
clsString:: clsString (const double d, int pers)
{
char buf [_CVTBUFSIZE];
if (_gcvt (d,pers,buf) ! =0) code=1; else code=0;
len=strlen (buf);
BuffLen=0;
symb=NULL;
setString (buf);
}
clsString:: clsString (clsString& s)
{
len=s. len;
setString (s. symb);
}
clsString & clsString:: operator= (const clsString& copy)
{
len=copy. len;
setString (copy. symb);
return *this;
}
clsString& clsString:: operator () (int index, int subLen)
{
if (index<0 ||index>=len|| index+subLen>=len) return clsString ("");
char *tempstr=new char [subLen+1];
if (subLen==0) subLen=len-index;
strncpy (tempstr,symb+index,subLen);
tempstr [subLen] ='\0';
clsString temp (tempstr);
delete [] tempstr;
return temp;
}
int clsString:: find (const clsString& comp, int pos)
{
bool Notequal=1;
if (comp. len>pos+this->len) return - 1;
int fin=this->len-comp. len;
for (; (pos<=fin) &&Notequal; pos++)
{
int k=0;
for (int j=pos; k<comp. len; k++,j++)
if (this->symb [j] ! =comp. symb [k]) break;
if (k==comp. len) Notequal=0;
}
if (Notequal) return - 1;
else return pos;
}
Код файлу "driver. cpp", з драйвером тестування.
#include <iostream>
#include "TPstr. h"
using namespace std;
int main ()
{
clsString* temp=new clsString ("This program will test my work");
cout <<*temp<<endl;
*temp= (clsString)"This is a small driver";
clsString test1 ("Testing in process");
clsString test2;
clsString test3 (*temp);
cout<<*temp<<endl<<test1<<endl<<test2<<endl<<test3;
cout<<"\nEnter string"<<endl;
cin>>test2;
cout<<test2<<endl;
cout<<"Enter string"<<endl;
cin>>test2;
cout<<test2<<endl;
cout<<"s1 is \""<<test1<<"\" and s2 is \""<< test3<<"\""
<<"\n\nThe results of comparing is: "
<<"\ns2==s1 yields "
<< (test3==test1?"true": "false")
<<"\ns2! =s1 yields "
<< (test3! =test1?"true": "false")
<<"\ns2>s1 yields "
<< (test3>test1?"true": "false")
<<"\ns2<s1 yields "
<< (test3<test1?"true": "false")
<<"\ns2<=s1 yields "
<< (test3<=test1?"true": "false")
<<"\ns2>=s1 yields "
<< (test3>=test1?"true": "false") <<endl;
cout << "\n\ns1 += s2 yields s1 = ";
test1 += test3; // test overloaded concatenation
cout << test1<<endl;
test1 [0] ='t';
test1 [1] ='E';
cout<<"s1 after s1 [0] = 't' and s1 [1] ='E'"<<endl;
cout<<test1<<endl;
cout<<"find and delete in s1 s2"<<endl;
int pos=test1. find (test3);
test1. TPdelete (pos,test3. lenght ());
cout<<test1<<endl;
cout<<"**********************************************************\n";
test1="112211221122";
test3="334433443344334";
cout<<"\ns1 is \""<<test1<<"\" and s2 is \""<< test3<<"\"";
cout<<"Insert to s1 5 symbols from s2. Start position 0: "<<endl;
test1. insert (test3,0,5);
cout<<test1<<endl;
test1="112211221122";
test3="334433443344334";
cout<<"Insert to s1 5 symbols from s2. Start position 5: "<<endl;
test1. insert (test3,5,5);
cout<<test1<<endl;
test1="112211221122";
test3="334433443344334";
cout<<"Insert to s1 5 symbols from s2. Start position end of s1: "<<endl;
test1. insert (test3,test1. lenght (),5);
cout<<test1<<endl;
temp->~clsString ();
temp=new clsString ( (long) 2007);
cout<<*temp<<endl;
temp->~clsString ();
temp=new clsString (-12.34567890123);
cout<<*temp<<endl;
temp->~clsString ();
return 0;
}