Методические указания Ухта 2006 удк 681 06(076) г 23

Вид материалаМетодические указания

Содержание


Список литературы
Приложение 1. Текст заголовка класса MyString (файл MyString.h)
Приложение 2. Тексты членов – функций класса MyString (файл MyString.cpp)
Подобный материал:
1   2   3   4   5   6

Список литературы

  1. Гради Буч, Объектно-ориентированный анализ и проектирование; Санкт-Петербург; BINOM; 2001 - 560 стр.
  2. Брукс Ф. Мифический человеко-месяц или как создаются программные системы; Санкт-Петербург: Символ-Плюс; 2000 - 298стр
  3. Аммераль Л. STL для программистов на C++; М. ДМК; 1999 - 240стр
  4. Шилдт Г Самоучитель С++; Санкт-Петербург; BHV, 1997 - 510стр
  5. Герб Саттер; Решение сложных задач на C++; Санкт-Петербург; Издательский дом "Вильямс"; 2002 - 396стр
  6. Бьёрн Страуструп; Язык программирования C++; М, BINOM, 1999г. - 991 стр, третье издание.



Приложение 1. Текст заголовка класса MyString (файл MyString.h)



/* простой учебный класс: наша работа со строками.

закладывается возможность создавать строки как по C++, так и как

в Pascal


Гатин Г.Н. 28.11.2002 */

#include

#include

extern FILE * B;

class MyString {

char * ps; // собственно указатель на строку.

int Ls; // объём выделеной памяти под строку.

int Tl; // текущая длина строки.

int flag; // флажки строки

public:

// простой конструктор

MyString () { Ls = 256;

ps = NULL;

ps = new char [Ls];

if (ps == NULL) { Ls = -1; Tl = -1; flag = -1; return; }

Tl = 0; flag = 0;

return;

}

// конструирование строки заданной длины

MyString (int A) {

if (A <= 0) A = 256;

Ls = A;

ps = NULL;

ps = new char [Ls];

if (ps == NULL) { Ls = -1; Tl = -1; flag = -1; return; }

Tl = 0; flag = 0;

return;

}

// конструирование строки с одновременной инициализацией.

MyString (char * U) {

int i, ls;

ls = strlen (U);

Ls = ls + 10;

ps = NULL;

ps = new char [Ls];

if (ps == NULL) { Ls = -1; Tl = -1; flag = -1; return; }

for ( i = 0; i < ls; i++) ps[i] = U[i];

for (; i < Ls; i++) ps[i] = 0x00;

Tl = ls; flag = 1;

return;

}

// Д Е С Т Р У К Т О Р .

/* ~MyString () { if (flag < 0) return;

// delete [] ps;

}

*/

// конструктор копирования.

MyString (const MyString & Qs) {

int i;

ps = NULL;

ps = new char [Qs.Ls];

if (ps == NULL) { Ls = -1; Tl = -1; flag = -1; return; }

Ls = Qs.Ls; Tl = Qs.Tl; flag = Qs.flag;

for (i = 0; i < Ls; i++) ps[i] = Qs.ps[i];

}

// программа, возвращающая длину строки

int LenMyStr () { return Tl; };

// программа возвращающая "объём" строки:

int MyStrSize () { return Ls; }

// очищение нашей строки концами строк из C++

void ClearMyStr ();

// проверка на пустоту строки

bool IsMyStrEmpty () { if (flag < 1) return true;

else return false; }

// преобразование в char

char * c_har ();

// перегрузка оператора +

MyString operator + (MyString &);

// перегрузка оператора + char * Гатин Г.Н. 04.12.2002

MyString operator + (char * Ot);

// ещё одна перегрузка оператора + char * Гатин Г.Н. 04.12.2002

friend MyString operator + (char *, MyString &);

// перегрузка оператора =

MyString & operator = (MyString);

// перегрузка оператора = char * Гатин Г.Н. 4.12.2002

MyString & operator = (char * Oth);

// перегрузка сравнения : равно : ==

bool operator == (MyString & Oth);

// перегрузка сравнения : меньше : <

bool operator < (MyString & Oth);

// перегрузка операции []

char operator [] (int i) { if (i < 1) return 0x00;

if (i > Tl) return 0x00;

return ps[i-1]; }

// опробование перегрузки унарной операции ++

// переводим весь шрифт в заглавные буквы. Гатин Г.Н. 4.12.2002

MyString operator ++ (); // префиксная форма.

MyString operator ++ (int x); // постфиксная форма.

// пример реализации функции Substr Гатин Г.Н. 01.04.2004

MyString Substr (int i, int l);

// программка преобразования в AnsiString. Гатин Г.Н. для MessageDlg

operator AnsiString () { AnsiString U = ps; return U; }


private:

bool Redefinition (int);


};

Приложение 2. Тексты членов – функций класса MyString (файл MyString.cpp)



// очищение нашей строки концами строк из C++

void MyString::ClearMyStr () { if (flag < 1) return;

for (int i = 0; i < Ls; i++) ps[i] = 0x00;

Tl = 0; flag = 0; return; }

// преобразование в char

char * MyString::c_har () {

if (flag < 1) return NULL;

if (ps[Tl] != 0x00) { if (Ls == Tl) Redefinition(Ls+1);

ps[Tl] = 0x00;

}

return ps;

}

// перераспределение памяти под уже построенную строку!

Гатин Г.Н. 4.12.2002

bool MyString::Redefinition (int NM) {

char * ti;

int i;

if (NM < 1) return false;

if (Ls > 0)

if (NM <= Ls) return true;

ti = NULL;

ti = new char [NM];

if (ti == NULL) return false;

if (Tl > 0) {

for (i = 0; i < Ls; i++) ti[i] = ps[i];

for (; i < NM; i++) ti[i] = 0x00;

}

else

{ ti[0] = 0x00; Tl = 0; }

delete [] ps;

Ls = NM;

if (flag < 0) flag = 0;

ps = ti;

return true;

}


//перегрузка оператора + фактически выполняем конкатенацию наших строк

MyString MyString::operator + (MyString & Oth) {

int L, i, j;

L = LenMyStr() + Oth.LenMyStr()+1;

MyString temp = MyString (L);

if (Tl > 0) {

for (i = 0; i < Tl; i++) temp.ps[i] = ps[i];

if (temp.ps[i-1] == 0x00) i--;

}

else i = 0;

if (Oth.Tl < 1) { temp.Tl = i-1; return temp; }

for (j = 0; j < Oth.Tl; j++, i++)

temp.ps[i] = Oth.ps[j];

temp.ps[L] = 0x00;

temp.Tl = L-1; temp.flag = 1;

return temp;

}


// перегрузка оператора + char * Гатин Г.Н. 04.12.2002

MyString MyString::operator + (char * Ot) {

int L, i, j, k;

k = strlen(Ot);

L = LenMyStr() + k + 1;

MyString temp = MyString (L);

if (Tl > 0) {

for (i = 0; i < Tl; i++) temp.ps[i] = ps[i];

if (temp.ps[i-1] == 0x00) i--;

}

else i = 0;

if (k < 1) { temp.Tl = i-1; return temp; }

for (j = 0; j < k; j++) {

temp.ps[i] = Ot[j];

i++; }

temp.ps[i] = 0x00;

temp.Tl = i-1; temp.flag = 1;

return temp;

}


// ещё одна перегрузка оператора + char * Гатин Г.Н. 04.12.2002

MyString operator + (char * Ot, MyString & Se)

{

int L, i, j, k;

k = strlen(Ot);

L = Se.LenMyStr() + k + 1;

MyString temp = MyString (L);

if (k > 0) {

for (i = 0; i < k; i++) temp.ps[i] = Ot[i];

if (Ot[i-1] == 0x00) i--;

}

else i = 0;

if (Se.Tl < 1) { temp.Tl = i; return temp; }

for (j = 0; j < Se.Tl; j++, i++)

temp.ps[i] = Se.ps[j]; ////////

temp.ps[i] = 0x00;

temp.Tl = i-1; temp.flag = 1;

return temp;

}


// перегрузка оператора =

MyString & MyString::operator = (MyString Oth) {

int i;

if (Ls < Oth.Ls) Redefinition(Oth.Ls+1);

for (i = 0; i < Oth.Ls; i++) ps[i] = Oth.ps[i];

Oth.ps[i] = 0x00;

Tl = i; flag = 1;

if (Ls > Oth.Ls) for (; i < Ls; i++) ps[i] = 0x00;

return *this;

}

// перегрузка оператора = char * Гатин Г.Н. 4.12.2002

MyString & MyString::operator = (char * Oth) {

int i, k;

k = strlen(Oth);

if (Ls < k) Redefinition(k+1);

for (i = 0; i < k; i++) ps[i] = Oth[i];

Oth[i] = 0x00;

if (Ls > k) for (; i < Ls; i++) ps[i] = 0x00;

Tl = k; flag = 1;

return *this;

}


// перегрузка сравнения : равно : ==

bool MyString::operator == (MyString & Oth)

{

int i, j, k, l;

if (IsMyStrEmpty() & Oth.IsMyStrEmpty()) return true;

if (IsMyStrEmpty() | Oth.IsMyStrEmpty()) return false;

k = LenMyStr();

l = Oth.LenMyStr();

if (k < l) j = k; else j = l;

for (i = 0; i <= j; ++i)

if (ps[i] != Oth.ps[i]) return false;

return true;

}


// перегрузка сравнения : меньше : <

bool MyString::operator < (MyString & Oth)

{

int i, j, k, l;

if (IsMyStrEmpty() & Oth.IsMyStrEmpty()) return false;

k = LenMyStr();

l = Oth.LenMyStr();

if (k < l) j = k; else j = l;

for (i = 0; i < j; ++i) {

if (ps[i] > Oth.ps[i]) return false;

if (ps[i] < Oth.ps[i]) return true;

}

if (k < l) return true; else return false;

}


// опробование перегрузки унарной операции ++

// переводим весь шрифт в заглавные буквы. Гатин Г.Н. 4.12.2002

MyString MyString::operator ++ () // префиксная форма.

{

AnsiString Ux, Up; // пока для упрощения работы. Так делать нельзя.

int i;

Ux = ps;

Up = AnsiUpperCase(Ux);

Tl = Up.Length();

for (i = 0; i < Tl; i++) ps[i] = Up[i+1];

return *this;

}

MyString MyString::operator ++ (int x) // постфиксная форма.

{

AnsiString Ux, Up; // пока для упрощения работы. Так делать нельзя.

int i;

Ux = ps;

Up = AnsiUpperCase(Ux);

Tl = Up.Length();

for (i = 0; i < Tl; i++) ps[i] = Up[i+1];

return *this;

}


// пример реализации функции Substr Гатин Г.Н.

MyString MyString::Substr (int i, int l)

{

MyString pM = MyString(l+1);

int k = LenMyStr(), j;

if (i < 1) return pM;

if (i > k) return pM;

if (l < 1) return pM;

for (j = 0; l > 0; --l, ++i, ++j) {

if (i >= k) break;

pM.ps[j] = ps[i];

}

pM.ps[j+1] = 0x00;

pM.Tl = j;

return pM;

}
/>