Главная страница
Навигация по странице:

  • Практическая работа №2

  • О714Б Веселова Маргарита - ПР 2 Наследование. Практическая работа 2 по дисциплине Программирование на языке высокого уровня на тему Наследование


    Скачать 211.3 Kb.
    НазваниеПрактическая работа 2 по дисциплине Программирование на языке высокого уровня на тему Наследование
    Дата17.04.2022
    Размер211.3 Kb.
    Формат файлаdocx
    Имя файлаО714Б Веселова Маргарита - ПР 2 Наследование.docx
    ТипПрактическая работа
    #481459


    Балтийский государственный технический университет
    «ВОЕНМЕХ» им. Д. Ф. Устинова

    Кафедра О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");

    }
    Результат работы программы:


    1. Базовый класс строка





    1. Наследник класс Идентификатор




    1. Наследник класс Шестнадцатеричная строка













    Вывод: В данной практической работе был реализован класс «Строка» и два производных класса «Строка Идентификатор» и «Шестнадцатеричная строка». Для каждого класса были сделаны методы: конструктор без параметров, конструктор, принимающий в качестве параметра Си-строку, конструктор копирования, деструктор, перегрузка операции присваивания «=». Во всех методах всех классов предусмотрена печать сообщения, содержащего имя метода. Был предусмотрен тест всех методов всех классов.


    написать администратору сайта