Методические указания Ухта 2006 удк 681 06(076) г 23
Вид материала | Методические указания |
СодержаниеСписок литературы Приложение 1. Текст заголовка класса MyString (файл MyString.h) Приложение 2. Тексты членов – функций класса MyString (файл MyString.cpp) |
- Методические указания Санкт Петербург 2006 удк 947, 435.39kb.
- Методические указания Санкт-Петербург 2011 удк 541. 1(076., 289.58kb.
- Методические указания по выполнению и оформлению курсовой работы по дисциплине «бухгалтерский, 1337.13kb.
- Методические указания Новосибирск 2003 удк ббк т3(2), 342.37kb.
- Методические указания Санкт-Петербург 2009 удк 947, 1006.45kb.
- Удк 340. 6+681. 327+681 015 Д. В. Ландэ, В. Н. Фурашев, 450.24kb.
- Удк 681 053: 681. 32: 007, 134.3kb.
- Администрация, 29.13kb.
- Методические указания Санкт-Петербург 2010 удк 947, 1278.52kb.
- Методические указания для студентов и аспирантов Сыктывкар 2006, 119.19kb.
Список литературы
- Гради Буч, Объектно-ориентированный анализ и проектирование; Санкт-Петербург; BINOM; 2001 - 560 стр.
- Брукс Ф. Мифический человеко-месяц или как создаются программные системы; Санкт-Петербург: Символ-Плюс; 2000 - 298стр
- Аммераль Л. STL для программистов на C++; М. ДМК; 1999 - 240стр
- Шилдт Г Самоучитель С++; Санкт-Петербург; BHV, 1997 - 510стр
- Герб Саттер; Решение сложных задач на C++; Санкт-Петербург; Издательский дом "Вильямс"; 2002 - 396стр
- Бьёрн Страуструп; Язык программирования 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;
}