|
О714Б Веселова Маргарита - ПР 2 Наследование. Практическая работа 2 по дисциплине Программирование на языке высокого уровня на тему Наследование
Балтийский государственный технический университет «ВОЕНМЕХ» им. Д. Ф. Устинова
Кафедра О7 «Информационные системы и программная инженерия»
Практическая работа №2 по дисциплине «Программирование на языке высокого уровня» на тему «Наследование»
вариант 26
Выполнил: Студент Веселова М.В. Группа О714Б
Преподаватель: Кимсанбаев К. А.
Санкт-Петербург 2022 г.
Задача 1.
Описать три класса: базовый класс «Строка» и производные от него класс «Строка-идентификатор» и класс, заданный индивидуальным вариантом. Обязательные для всех классов методы: конструктор без параметров, конструктор, принимающий в качестве параметра Си-строку, конструктор копирования, деструктор, перегрузка операции присваивания «=». Во всех методах всех классов предусмотреть печать сообщения, содержащего имя метода. Для конструкторов копирования каждого класса дополнительно предусмотреть диагностическую печать количества его вызовов, рекомендуется использовать статические члены класса.
Поля класса «Строка»: указатель на блок динамически выделенной памяти для размещения символов строки, длина строки в байтах. Обязательные методы, помимо вышеуказанных: конструктор, принимающий в качестве параметра символ (char), функция получения длины строки.
Строки класса «Строка-идентификатор» строятся по правилам записи идентификаторов в Си, и могут включать в себя только те символы, которые могут входить в состав Си-идентификаторов. Если исходные данные противоречат правилам записи идентификатора, то создается пустая «Строка-идентификатор». Дополнительные методы для класса «Строка-идентификатор»: перевод всех символов строки (кроме цифр) в верхний регистр, переопределение операции проверки на равенство ==, переопределение операции больше >
Производный от «Строки» класс Шестнадцатеричная строка
Строки данного класса могут содержать только символы шестнадцатеричных цифр (как в верхнем, так и в нижнем регистре) и символы - и +, задающие знак числа, которые могут находиться только в первой позиции числа, при отсутствии знака число считается положительным. Если в составе инициализирующей строки будут встречены любые символы, отличные от допустимых, Шестнадцатеричная строка принимает нулевое значение. Содержимое данных строк рассматривается как шестнадцатеричное число.
Обязательные методы: определение, можно ли представить данное число в формате unsigned int, проверки на больше >,сложения +.
Используемые функции (методы):
virtual bool correct(const char *add) – проверка строки на совпадение с условиями.
virtual void print() – вывод строки.
virtual void input() – ввод строки.
virtual String &operator = (const String &add) – перегрузка оператора = для объектов класса строка.
virtual String &operator = (const char *add) – перегрузка оператора =, принимающая char.
virtual bool operator == (const String& add) – перегрузка оператора ==.
virtual String &operator < (String &add) – перегрузка оператора <
virtual String &operator += (String &add)
virtual void up() – функция смены регистра строки
virtual char getlen() – получение длины
friend ostream &operator << (ostream &output, String &add) – перегрузка оператора <<
friend istream &operator >> (istream &input, String &add) – перегрузка оператора >>
Istring &operator = (const Istring &add) – перегрузка оператора =, принимающего объект Идентификатор
Istring &operator = (const char *add) override - перегрузка оператора =, принимающего char
bool operator == (const Istring& add) - перегрузка оператора ==
bool operator > (const Istring& add) - перегрузка оператора >
void input() override - вывод строки
bool correct(const char *sixstr1) override - проверка на принадлежность к шестнадцатеричным числам
virtual void Uns() – проверка возможно ли представить шестнадцатеричное число представить в unsigned int
explicit SixteenStr(const SixteenStr &add) – конструктор копирования для шестнадцатеричного числа
explicit SixteenStr(const char *sixstr1) – конструктор с параметрами для шестнадцатеричного числа
void input() override – ввод шестнадцатеричного числа
bool operator > (int chsr) – проверка на больше/меньше
int operator + (int chsr) – перегрузка оператора + для сложения шестнадцатеричного числа с десятичным
void operator + (SixteenStr &a) – перегрузка оператора + для сложения шестнадцатеричных чисел
Текст программы:
#include
#include
#include using namespace std; static int countcopy = 0, Icountcopy = 0, Dcountcopy = 0; class String
{
public:
explicit String() //конструктор без пораметров строка
{
len = 0;
str = new char[1];
str[0] = '\0';
cout << "Конструктор без параметров Строка: " << this << endl;
} explicit String(const char *add) //конструктор с параметрами строка
{
len = strlen(add); //считывание длины
str = new char[len+1];
strcpy(str, add);
str[len] = '\0';
cout << "Конструктор c параметрами Строка: " << this << endl;
} explicit String(const String& add) //конструктор копирования строка
{
countcopy += 1; // счетчик вызова конструктора копирования
len = add.len;
str = new char[len+1];
strcpy(str, add.str);
str[len] = '\0';
cout << "Конструктор копирования Строка №: " << countcopy << " : " << this << endl;
} virtual bool correct(const char *add) //проверка на шестнадцатиричное число
{
for (int i = 0; i < strlen(add); i++)
if (!((add[i] >= '0' && add[i] <= '9') || (add[i] >= 'a' && add[i] <= 'z') || (add[i] >= 'A' && add[i] <= 'Z') || add[i] == '_'))
return 0;
return 1;
} virtual void print() //вывод строки
{
cout << "Оператор '<<':" << endl;
if(str[0] == '\0')
{
cout << "Строка пустая!";
return;
}
cout << str;
} virtual void input() //ввод строки
{
cout << "Оператор '>>':" << endl;
cout << "Введите строку: " << endl;
str = new char[128];
int k, i;
k = getc(stdin);
for(i = 0; i < 128 - 1 && k != '\n'; i++)
{
str[i] = k;
k = getc(stdin);
}
str[i] = '\0';
len = i;
k = 0; i = 0;
} virtual String &operator = (const String &add) //перегрузка опертатора =, принимающего строку
{
cout << "Оператор '='" << endl;
if (this == &add)
return *this;
delete[] str;
str = nullptr;
len = add.len;
str = new char[len + 1];
strcpy(str, add.str);
str[len] = '\0';
return *this;
}
virtual String &operator = (const char *add) //перегрузка оператора =, принемающего char
{
cout << "Оператор '='" << endl;
delete[] str;
str = nullptr;
len = strlen(add);
str = new char[len + 1];
strcpy(str, add);
str[len] = '\0';
return *this;
} virtual bool operator == (const String& add) //перегрузка оператора == строки
{
cout << "Оператор '=='" << endl;
if(strcmp(str, add.str)) //проверка на равенство
return 0;
return 1;
} virtual String &operator < (String &add) //перегрузка оператора <
{
cout << "Оператор '<'" << endl;
for (int i = 0; i < add.len; i++)
{
add.str[i] = toupper(add.str[i]);
}
return *this;
} virtual String &operator += (String &add) //перегрузка оператора += для строки
{
cout << "Оператор '+=':" << endl;
strcat(str, add.str);
return *this;
} virtual void up() //перевод в верхний регистр
{
for (int i = 0; i < len; i++)
{
str[i] = toupper(str[i]);
}
}
virtual char getlen() //получение длины
{
return len;
} friend ostream &operator << (ostream &output, String &add) //перегрузка оператора <<
{
add.print();
return cout;
} friend istream &operator >> (istream &input, String &add) //перегрузка оператора >>
{
add.input();
return cin;
} virtual String() //деструктор
{
cout << "Деструктор: " << this << endl;
delete [] str;
str = nullptr;
len = 0;
}
protected:
char len;
char *str;
}; class Istring : public String //класс идентификатор, наследник от класса строки
{
public:
explicit Istring() //конструктор без параметров
{
len = 0;
str = new char[1];
str[0] = '\0';
cout << "Идентификатор - конструктор без параметров: " << this << endl;
} void up() override //перевод в верхний регистр
{
for (int i = 0; i < len; i++)
{
str[i] = toupper(str[i]);
}
} explicit Istring(const char *add) //конструктор с параметрами
{
if(!correct(add))
{
len = 0;
str = new char[1];
str[0] = '\0';
return;
}
len = strlen(add);
str = new char[len+1];
strcpy(str, add);
str[len] = '\0';
cout << "Идентификатор - конструктор c параметрами: " << this << endl;
} explicit Istring(const Istring &add) //конструктор копирования
{
if(!correct(add.str))
{
len = 0;
str = new char[1];
str[0] = '\0';
return;
}
Icountcopy += 1;
len = add.len;
str = new char[len+1];
strcpy(str, add.str);
str[len] = '\0';
cout << "Идентификатор - конструктор копирования №: " << Icountcopy << " : " << this << endl;
} Istring &operator = (const Istring &add) //перегрузка оператора = для идентефикатора
{
cout << "Оператор '='" << endl;
if (this == &add)
return *this;
delete[] str;
str = nullptr;
len = add.len;
str = new char[len + 1];
strcpy(str, add.str);
str[len] = '\0';
return *this;
} Istring &operator = (const char *add) override //перегрузка оператора =
{
cout << "Оператор '='" << endl;
delete[] str;
str = nullptr;
len = strlen(add);
str = new char[len + 1];
strcpy(str, add);
str[len] = '\0';
return *this;
}
bool operator == (const Istring& add) //перегрузка оператора ==
{
cout << "Оператор '=='" << endl;
if(strcmp(str, add.str))
return 0;
return 1;
} bool operator > (const Istring& add) //перегрузка оператора >
{
cout << "Оператор '>'" << endl;
if(strcmp(str, add.str)> 0)
return 1;
else
return 0;
} void input() override //вывод строки
{
cout << "Оператор '>>':" << endl;
cout << "Введите строку индентификатор: " << endl;
str = new char[128];
int k, i;
k = getc(stdin);
for(i = 0; i < 128 - 1 && k != '\n'; i++)
{
str[i] = k;
k = getc(stdin);
}
str[i] = '\0';
if(!correct(str))
{
len = 0;
str = new char[1];
str[0] = '\0';
return;
}
len = i;
k = 0; i = 0;
} friend ostream &operator << (ostream &output, Istring &add) //перегрузка оператора <<
{
add.print();
return cout;
} friend istream &operator >> (istream &input, Istring &add) //перегрузка оператора >>
{
add.input();
return cin;
}
Istring() override //деструктор
{
cout << "Идентификатор - деструктор: " << this << endl;
delete [] str;
str = nullptr;
len = 0;
}
};
class SixteenStr : public String
{
public:
explicit SixteenStr() //конструктор без параметров
{
len = 0;
str = new char[1];
str[0] = '\0';
cout << "Производный - конструктор без параметров: " << this << endl;
} explicit SixteenStr(const char *sixstr1) //конструктор с параметрами
{
if(!correct(sixstr1))
{
cout << "Не подходит. Создается пустая строка.";
len = 0;
str = new char[1];
str[0] = '\0';
return;
}
len = strlen(sixstr1);
str = new char[len+1];
strcpy(str, sixstr1);
str[len] = '\0';
cout<<"Подходит"<< endl;
} bool correct(const char *sixstr1) override //проверка на принадлежность к шестнадцатеричным числам
{
for (int i = 0; i < strlen(sixstr1); i++)
{
if(!((sixstr1[i]>= '0' && sixstr1[i]<= '9' ) || (sixstr1[i] >='A' && sixstr1[i]<= 'F') || (sixstr1[i] >='a' && sixstr1[i]<= 'f')))
{
return 0;
}
}
return 1;
} explicit SixteenStr(const SixteenStr &add) //конструктор копирования
{
Dcountcopy += 1; len = add.len;
str = new char[len+1];
strcpy(str, add.str);
str[len] = '\0';
cout << "Производный - конструктор копирования №: " << Dcountcopy << " : " << this << endl;
} friend ostream &operator << (ostream &output, SixteenStr &add) //перегрузка операции <<
{
add.print();
return cout;
} void input() override //ввод строки
{
fflush(stdin);
cout << "Оператор '>>':" << endl;
cout << "Введите шестнадцатеричное число: " << endl;
str = new char[128];
int k, i;
k = getc(stdin);
for(i = 0; i < 128 - 1 && k != '\n'; i++)
{
str[i] = k;
k = getc(stdin);
}
str[i] = '\0';
if(!correct(str))
{
len = 0;
str = new char[1];
str[0] = '\0';
return;
}
len = i;
k = 0; i = 0;
} friend istream &operator >> (istream &input, SixteenStr &add) //перегрузка оператора >>
{
add.input();
return cin;
} virtual void Uns() //проверка на возможность засписи в unsigned int
{
unsigned int a;
sscanf(str , "%x", &a);
if (a <= UINT_MAX && a >= 0 )
cout << "Да, может быть представленно: " << a << endl;
else
cout << "Нет, не может"<< endl;
} bool operator > (int chsr) //перегрузка оператора для проверки на больше/меньше
{
int h;
sscanf(str , "%x", &h);
if (h>chsr)
return 1;
else
return 0;
} int operator + (int chsr) //перегрузка оператора + для сложения шестнадцатеричного числа с десятичным
{
int h;
sscanf(str , "%x", &h);
h+= chsr;
sprintf(str, "%x", h);
return h;
} void operator + (SixteenStr &a) // перегрузка оператора + для сложения шестнадцатеричных чисел
{
int h, t;
sscanf(str , "%x", &h);
sscanf(a.str, "%x", &t);
h += t;
sprintf(str, "%x", h);
}
SixteenStr() override // деструктор
{
delete [] str;
str = nullptr;
len = 0;
cout<<"destructor six"<< endl;
}
}; int main()
{
setlocale(LC_ALL, "Russian");
//тест
cout << "
Тест базового класса Строка
" << endl;
String F ("Hello!");
cout << "1. Вывод стоки: " << F<< endl;
cout << "2. ";
String H(F);
cout << H << endl;
cout << "3. ";
H = "Not hello";
cout << H << endl;
system ("pause");
system ("cls"); cout << "
Тест класса Строки-идентификатора
" << endl;
Istring a("312gdsf");
Istring l("123"); cout << "1. Проверка на > : " << endl;
if (a > l)
cout << "Больше " << endl;
else
cout << "Меньше " << endl; cout << "2. " << a< cout << "3. Перевод в верхний регистр : " < cout< a.up();
cout< cout << "4.Проверка на равенство : " < if(a == l)
cout<<"Равны"< cout<<"Не равны"< cout << "5.Конструктор копирования : " < Istring J(a);
cout<< J << endl;
cout << "6. " ;
a = l;
cout << a << endl;
system ("pause");
system("cls"); cout << "
Тест класса Шестнадцатеричная строка
" << endl;
SixteenStr y("A123");
cout << y << endl;
cout << "1.Сложение : " << endl;
int lsdf = 2, sr;
y + lsdf;
cout << y<< endl;
cout << "2.Проверка на > " < cout << "Введите число для проверки: ";
cin >> sr;
if (y > sr)
cout << "Шестнадцатеричное число больше введеного"<< endl;
else cout << "Шестнадцатеричное число меньше введеного"<< endl;
cout << "3.Можно ли представить в типе unsigned int?" < y.Uns();
cout << "4.Конструктор копирования: " < SixteenStr ccs(y);
cout << ccs<< endl;
SixteenStr nm, jk;
cout << "5. ";
nm = ccs;
cout << nm< cin >> jk;
cout << jk;
nm + jk;
cout << nm << endl;
system ("pause");
system ("cls");
} Результат работы программы:
Базовый класс строка
Наследник класс Идентификатор
Наследник класс Шестнадцатеричная строка
Вывод: В данной практической работе был реализован класс «Строка» и два производных класса «Строка Идентификатор» и «Шестнадцатеричная строка». Для каждого класса были сделаны методы: конструктор без параметров, конструктор, принимающий в качестве параметра Си-строку, конструктор копирования, деструктор, перегрузка операции присваивания «=». Во всех методах всех классов предусмотрена печать сообщения, содержащего имя метода. Был предусмотрен тест всех методов всех классов. |
|
|