Смекни!
smekni.com

Розробка власного класу STRING (стр. 16 из 16)

Розроблено клас 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] ='&bsol;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] ='&bsol;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] ! ='&bsol;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] ='&bsol;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] ='&bsol;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<<"&bsol;nEnter string"<<endl;

cin>>test2;

cout<<test2<<endl;

cout<<"Enter string"<<endl;

cin>>test2;

cout<<test2<<endl;

cout<<"s1 is &bsol;""<<test1<<"&bsol;" and s2 is &bsol;""<< test3<<"&bsol;""

<<"&bsol;n&bsol;nThe results of comparing is: "

<<"&bsol;ns2==s1 yields "

<< (test3==test1?"true": "false")

<<"&bsol;ns2! =s1 yields "

<< (test3! =test1?"true": "false")

<<"&bsol;ns2>s1 yields "

<< (test3>test1?"true": "false")

<<"&bsol;ns2<s1 yields "

<< (test3<test1?"true": "false")

<<"&bsol;ns2<=s1 yields "

<< (test3<=test1?"true": "false")

<<"&bsol;ns2>=s1 yields "

<< (test3>=test1?"true": "false") <<endl;

cout << "&bsol;n&bsol;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<<"**********************************************************&bsol;n";

test1="112211221122";

test3="334433443344334";

cout<<"&bsol;ns1 is &bsol;""<<test1<<"&bsol;" and s2 is &bsol;""<< test3<<"&bsol;"";

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;

}