p align="left">Протестуємо оператори порівняння: |
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) | cout<<"\ns1 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; | | |
У рядку (1) вказуємо дві строки, які ми будемо порівнювати. У рядках (3), (5), (7), (9), (11), (13) ми говоримо користувачу, яку операцію будемо тестувати, а у наступномі виводимо результат відповідного тестування, використовуючи тернарну операцію. Результати (Т12) - (Т20). Наступним етапом тестування стане операція конкатенації, процес її тестування подібний до операції тестування (Т23): cout << "\n\ns1 += s2 yields s1 = "; test1 += test3; // test overloaded concatenation cout << test1<<endl; Операція індексації матиме 2 тести: зміна 0 символу (відлік символів починається з 0), будь-якого іншого, наприклад 1, бо вказівник на рядок-вказівник на перший символ, а далі перевірка операції індексації (Т24) - (Т25): test1 [0] ='t'; test1 [1] ='E'; cout<<"s1 after s1 [0] = 't' and s1 [1] ='E'"<<endl; cout<<test1<<endl; Функцію пошуку об'єднаємо з функцією видалення рядка: |
(1) (2) (3) | int pos=test1. find (test3); test1. TPdelete (pos,test3. lenght ()); cout<<test1<<endl; | | |
У змінну pos отримаємо позицію входження, потім (2) з цієї позиції видалимо весь рядок test3, використовуючи функцію визначення довжини рядка. Та виведемо (3) результат видалення (Т26) - (Т27). Тестування операцій вставки більш складне: |
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) | 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; | | |
Для полегшення перевірки вставки задамо початкові строки (1) - (2), (7) - (8), та (12) - (13). Вставка в початок рядка (5), між 5 та 6 символами (10) та в кінець (13). Результати приведені у рядках (Т30) - (Т36). На останок тестування конструкторів перетворення з числа до строки. Так як вони основані лице на стандартних операціях строк у стилі С, достатньо одного тесту на кожний: |
(1) (2) (3) (4) (5) (6) | temp=new clsString ( (long) 2007); cout<<*temp<<endl; temp->~clsString (); temp=new clsString (-12.34567890123); cout<<*temp<<endl; temp->~clsString (); | | |
У (1) та (4) створення об'єкту та передача значення. Замітимо явне приведення типу у (1), якщо цьго невиконати, то компілятор видасть помилку "error C2668: 'clsString:: clsString': ambiguous call to overloaded function". Це пов'язане з тим, що компілятор неявно не розрізняє ціле та дійсне числа, тому виника б неоднозначність. Ми використовуємо динамічні об'єкти, а отже виклик деструкторів (3) та (6) обов'язковий. Результат (2) та (3) є рядки (Т37) та (Т38). ВисновкиВ ході виконання курсової роботи були отримані наступні результати.Розроблено клас 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) 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) 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) // 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) 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; }
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
|