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

  • Выполнение задания Разметка таблицы

  • Код программы

  • Скриншоты работы программы 1. Загрузка из файла 14 2. Вывод на экран дисплея данных 3. Добавление записи

  • 7. Числовая сортировка по номеру счета 21 8. Сохранение результатов обработки в файлах 22 9. Проверка работы конструктора копирования

  • 10. Выход из программы 24 11. Проверка работоспособности защиты, ошибки при выборе пункта меню

  • 14. Проверка работоспособности защиты, ошибки при удалении строки 15. Проверка работоспособности защиты, ошибка при отсутствии памяти Вывод

  • смп. ИВТ-325_ЛР-1_Загребин_М.А._Вариант-30. Проектирование класса, использующего свободную память (содержащего динамический массив структур)


    Скачать 1.9 Mb.
    НазваниеПроектирование класса, использующего свободную память (содержащего динамический массив структур)
    Дата13.03.2023
    Размер1.9 Mb.
    Формат файлаpdf
    Имя файлаИВТ-325_ЛР-1_Загребин_М.А._Вариант-30.pdf
    ТипОтчет
    #985593


    1
    ФГБОУ ВО
    «Уфимский университет науки и технологий»
    Кафедра ТК
    ОТЧЕТ
    по лабораторной работе № 1
    по дисциплине «Современные методы программирования»
    Тема: «Проектирование класса,
    использующего свободную память (содержащего динамический массив
    структур)»
    Вариант № 30
    Выполнил: студент гр. ИВТ-325
    Загребин М. А.
    Проверил: доцент каф. ТК
    Хасанов А.Ю.
    Уфа 2023

    2
    Содержание
    Задание ................................................................................................................................................ 3
    Выполнение задания .......................................................................................................................... 3
    Код программы ................................................................................................................................... 3
    Скриншоты работы программы ...................................................................................................... 13 1. Загрузка из файла ......................................................................................................................... 13 2. Вывод на экран дисплея данных ................................................................................................. 14 3. Добавление записи ....................................................................................................................... 14 4. Удаление записи ........................................................................................................................... 16 5. Алфавитная сортировка по Ф.И.О. ............................................................................................. 18 6. Сортировка по дате открытия счета ........................................................................................... 19 7. Числовая сортировка по номеру счета ....................................................................................... 20 8. Сохранение результатов обработки в файлах ........................................................................... 21 9. Проверка работы конструктора копирования ........................................................................... 22 10. Выход из программы ................................................................................................................. 23 11. Проверка работоспособности защиты, ошибки при выборе пункта меню .......................... 24 12. Проверка работоспособности защиты, ошибки при загрузке данных из файла .................. 24 13. Проверка работоспособности защиты, ошибки при добавлении строки ............................. 25 14. Проверка работоспособности защиты, ошибки при удалении строки ................................. 27 15. Проверка работоспособности защиты, ошибка при отсутствии памяти .............................. 27
    Вывод: ............................................................................................................................................... 27

    3
    Задание
    Спроектировать структуру PERSON, содержащую поля: фамилия, имя, отчество.
    Спроектировать структуру CLIENT, содержащую поле типа PERSON и дополнительно поля: номер счета, код счета, сумма на счете, дата открытия счета, годовой процент начисления.
    Файл содержит информацию о счетах в банке. Требуется спроектировать класс, позволяющий обрабатывать эти данные. В классе должно быть предусмотрено, как минимум, выполнение следующих видов обработки:
    1.
    Загрузка из файла;
    2.
    Сохранение результатов обработки в файлах;
    3.
    Добавление записи;
    4.
    Удаление записи;
    5.
    Вывод на экран дисплея данных и результатов обработки;
    6.
    Алфавитная сортировка по Ф.И.О.;
    7.
    Сортировка по дате открытия счета;
    8.
    Числовая сортировка по номеру счета;
    9.
    Конструктор копирования.
    Выполнение задания
    Разметка таблицы
    № Фамилия Имя Отчество
    Номер счета
    Код счета
    Сумма на счете
    Дата открытия счета
    Годовой процент начисления
    День Месяц Год
    Код программы
    #include // cin, cout
    #include // Работа с файлами
    #include // Работа со строками
    #include // Форматный вывод
    #include // system("pause") и т.п.
    #include // Прерывания
    #include // Русский язык
    #include struct person { std::string surname, name, otch; }; struct data { int day, month, year; }; // Дополнительная структура под дату struct client
    { person per;

    4 std::string number; // Номер счета (20 зн) (40817 - физ. лица | 156-юань, 810-доллар,
    840-рубль | (1 знак) контрольный ключ | 0000-счет открыт в головном отделении банка или в банке без филиалов | (7 знаков) порядковый номер клиента) std::string code; // Код счета ? (16 зн) double summ; // Сумма на счете (9 зн) data dr; float percent; // Годовой процент начисления (5 зн)
    }; class masA
    { private: client *px; int n; public:
    // Специальные методы класса masA(): px (NULL), n(0) {}; // Конструктор

    masA() {if (px != NULL) delete[] px;}; // Деструктор masA(masA &z); // Копирующий коснтруктор
    // Дополнительные методы класса void InputFile(); // Загрузка из файла void Output(); // Вывод на экран дисплея данных и результатов обработки void OutputFile(); // Сохранение результатов обработки в файл void AddClient(); // Добавление записи void DeleteClient(); // Удаление записи void FioSort(); // Алфавитная сортировка по ФИО void DataSort(); // Сортировка по дате открытия счета void NumberSort(); // Числовая сортировка по номеру счета
    }; masA :: masA (masA &z) // Конструктор копирования
    { n = z.n; // Кол-во записей if (n == 0) px = NULL; // ? else
    { px = new client [n]; if (px == NULL) // ?
    { std::cout<<"Ошибка. Нет памяти.\n Конструктор копирования."; system("pause"); exit(1);
    } for (int i = 0; i < n; i++) px[i] = z.px[i];
    }
    } // Конец конструктора копирования void masA :: InputFile() // Загрузка из файла
    { std::ifstream fin; std::string FileName; client t; std::cout << "Введите имя входного файла: "; std::cin >> FileName; fin.open(FileName.c_str()); if (fin.fail()) // Защита от неправильного ввода имени файла
    { std::cout << FileName << " не открывается\n"; system("pause"); return;
    } if (px != NULL) { delete[] px; px = NULL;} // Очистка массива while (1)
    {

    5 fin >> t.per.surname >> t.per.name >> t.per.otch >> t.number >> t.code >> t.summ >> t.dr.day >> t.dr.month >> t.dr.year >> t.percent; if(fin.fail()) break; n++;
    } fin.close(); fin.open(FileName.c_str()); if (fin.fail())
    { std::cout << FileName << "Ошибка. Повторно не открывается\n"; system("pause"); n = 0; return;
    } px = new client[n];
    //px = NULL; if (px == NULL)
    { std::cout << "Ошибка. Нет памяти.\nВвести фаил не удается.\n"; fin.close(); system("pause"); n = 0; return;
    } for (int i = 0; i < n; i++)
    { fin >> px[i].per.surname >> px[i].per.name >> px[i].per.otch >> px[i].number >> px[i].code >> px[i].summ >> px[i].dr.day >> px[i].dr.month >> px[i].dr.year >> px[i].percent;
    } fin.close(); std::cout << "Файл введен\n"; system("pause");
    } void masA :: Output() // Вывод на экран дисплея данных и результатов обработки
    {
    // Вывод заголовка таблицы std::cout << "
    ____________________________________________________________________________________________
    ______________________________________\n"; // 3, 14, 12, 14, 22, 18, 11, 4, 5, 5, 10 = 118 std::cout << " | | | | | |
    | | Дата рождения | Годовой |\n"; std::cout << " | № | Фамилия | Имя | Отчество | Номер счета |
    Код счета | Сумма |----------------| процент |\n"; std::cout << " | | | | | |
    | на счете |День|Месяц| год |начислений| \n"; std::cout << "
    |___________________________________________________________________________________________
    ______________________________________|\n"; std::cout << std::left;
    // Вывод строк таблицы for (int i = 0; i < n; i++)
    { std::cout << " | " << std::setw(2) << i + 1 << "| " << std::setw(12) << px[i].per.surname << " | " << std::setw(10) << px[i].per.name << " | " << std::setw(13) << px[i].per.otch << " | " << std::setw(20) << px[i].number << " | " << std::setw(16) << px[i].code << " | " << std::setw(9) << px[i].summ << " | " << std::setw(2) << px[i].dr.day
    << " | " << std::setw(3) << px[i].dr.month << " |" << std::setw(4) << px[i].dr.year << " | "
    << std::setw(8) << px[i].percent << " | \n";
    }

    6 std::cout << "
    |___________________________________________________________________________________________
    ______________________________________|\n"; system("pause");
    } void masA :: OutputFile() // Сохранение результатов обработки в файл
    { std::ofstream fout; std::string FileName; std::cout << "Введите имя выходного файла: "; std::cin >> FileName; fout.open(FileName.c_str());
    // Защита от неправильного ввода имени файла if (fout.fail())
    { std::cout << FileName << " содержит недопустимые символы. Файл не создается."; system("pause"); return;
    }
    // Вывод заголовка таблицы fout << "
    ____________________________________________________________________________________________
    ______________________________________\n"; // 3, 14, 12, 14, 22, 18, 11, 4, 5, 5, 10 = 118 fout << " | | | | | |
    | | Дата рождения | Годовой |\n"; fout << " | №| Фамилия | Имя | Отчество | Номер счета | Код счета | Сумма |----------------| процент |\n"; fout << " | | | | | |
    | на счете |День|Месяц| год |начислений| \n"; fout << "
    |___________________________________________________________________________________________
    ______________________________________|\n"; fout << std::left;
    // Вывод строк таблицы for (int i = 0; i < n; i++) fout << " | " << std::setw(2) << i + 1 << "| " << std::setw(12) << px[i].per.surname
    << " | " << std::setw(10) << px[i].per.name << " | " << std::setw(13) << px[i].per.otch << "
    | " << std::setw(20) << px[i].number << " | " << std::setw(16) << px[i].code << " | " << std::setw(9) << px[i].summ << " | " << std::setw(2) << px[i].dr.day << " | " << std::setw(3)
    << px[i].dr.month << " |" << std::setw(4) << px[i].dr.year << " | " << std::setw(8) << px[i].percent << " | \n"; fout << "
    |___________________________________________________________________________________________
    ______________________________________|\n"; fout.close(); std::cout << "Массив структур сохранен в файл: " << FileName << std::endl; system("pause");
    } void masA :: AddClient() // Добавление записи
    { client t, * p; char ch, str_1; p = new client[n + 1]; if (p == NULL)
    { std::cout << "Ошибка. Нет памяти.\nДобавить не удается."; system("pause"); return;
    } std::cout << "Введите следующие данные.\n"; std::cout << "Фамилия, имя, отчество (через пробел): "; std::cin >> t.per.surname >> t.per.name >> t.per.otch; // ФИО

    7 for (int i = 0; i < t.per.surname.size(); i++)
    { str_1 = t.per.surname[i]; if (str_1 < 'А' || str_1 > 'я' || str_1 >= 0 && str_1 <= 9)
    { std::cout << "Ошибка. Использование недопустимых символов. \nНеобходимо использовать только русский язык.\n"; system("pause"); return;
    }
    } for (int i = 0; i < t.per.name.size(); i++)
    { str_1 = t.per.name[i]; if (str_1 < 'А' || str_1 > 'я' || str_1 >= 0 && str_1 <= 9)
    { std::cout << "Ошибка. Использование недопустимых символов. \nНеобходимо использовать только русский язык.\n"; system("pause"); return;
    }
    } for (int i = 0; i < t.per.otch.size(); i++)
    { str_1 = t.per.otch[i]; if (str_1 < 'А' || str_1 > 'я' || str_1 >= 0 && str_1 <= 9)
    { std::cout << "Ошибка. Использование недопустимых символов. \nНеобходимо использовать только русский язык.\n"; system("pause"); return;
    }
    } std::cout << "Номер счета: "; std::cin >> t.number; // Номер счета for (int i = 0; i < t.number.size(); i++)
    { str_1 = t.number[i]; if (str_1 < 48 or str_1 > 57)
    { std::cout << "Ошибка. Использование недопустимых символов. \nНеобходимо использовать только числа.\n"; system("pause"); return;
    }
    } if (t.number.size() != 20)
    { std::cout << "Ошибка. Номер счета должен состоять из 20 символов.\n"; system("pause"); return;
    } for (int i = 0; i < n; i++)
    { if (t.number == px[i].number)
    { std::cout << "Ошибка. Данный номер счета уже зарегистрирован.\nПовторное использование невозможно.\n"; system("pause"); return;
    }
    } std::cout << "Код счета: "; std::cin >> t.code; // Код счета for (int i = 0; i < t.code.size(); i++)
    {

    8 str_1 = t.code[i]; if (str_1 < 48 or str_1 > 57)
    { std::cout << "Ошибка. Использование недопустимых символов. \nНеобходимо использовать только числа.\n"; system("pause"); return;
    }
    } if (t.code.size() != 16)
    { std::cout << "Ошибка. Код счета должен состоять из 16 символов.\n"; system("pause"); return;
    } std::cout << "Сумма на счете: "; std::cin >> t.summ; // Сумма на счете if (std::cin.fail())
    { std::cin.clear(); std::cin.ignore(32767, '\n'); std::cout << "Ошибка. Использование недопустимых символов. \nНеобходимо использовать только числа.\n"; system("pause"); return;
    } std::cin.ignore(32767, '\n'); if (std::cin.gcount() > 1)
    { std::cout << "Ошибка. Использование недопустимых символов. \nНеобходимо использовать только числа.\n"; system("pause"); return;
    } std::cout << "Дата открытия счета дд.мм.гг (через пробел): "; std::cin >> t.dr.day >> t.dr.month >> t.dr.year; // Дата открытия счета if (std::cin.fail())
    { std::cin.clear(); std::cin.ignore(32767, '\n'); std::cout << "Ошибка. Использование недопустимых символов. \nНеобходимо использовать только числа.\n"; system("pause"); return;
    } std::cin.ignore(32767, '\n'); if (std::cin.gcount() > 1)
    { std::cout << "Ошибка. Использование недопустимых символов. \nНеобходимо использовать только числа.\n"; system("pause"); return;
    } std::cout << "Годовой процент начисления (%): "; std::cin >> t.percent; // Годовой процент начисления на счет if (std::cin.fail())
    { std::cin.clear(); std::cin.ignore(32767, '\n'); std::cout << "Ошибка. Использование недопустимых символов. \nНеобходимо использовать только числа.\n"; system("pause"); return;
    } std::cin.ignore(32767, '\n');

    9 if (std::cin.gcount() > 1)
    { std::cout << "Ошибка. Использование недопустимых символов. \nНеобходимо использовать только числа.\n"; system("pause"); return;
    } std::cout << "
    ____________________________________________________________________________________________
    __________________________________\n"; // 3, 14, 12, 14, 22, 18, 11, 4, 5, 5, 10 = 118 std::cout << " | | | | |
    | | Дата рождения | Годовой |\n"; std::cout << " | Фамилия | Имя | Отчество | Номер счета |
    Код счета | Сумма |----------------| процент |\n"; std::cout << " | | | | |
    | на счете |День|Месяц| год |начислений| \n"; std::cout << "
    |___________________________________________________________________________________________
    __________________________________|\n"; std::cout << std::left; std::cout << " | " << std::setw(12) << t.per.surname << " | " << std::setw(10) << t.per.name << " | " << std::setw(13) << t.per.otch << " | " << std::setw(20) << t.number <<
    " | " << std::setw(16) << t.code << " | " << std::setw(9) << t.summ << " | " << std::setw(2)
    << t.dr.day << " | " << std::setw(3) << t.dr.month << " |" << std::setw(4) << t.dr.year << "
    | " << std::setw(8) << t.percent << " | \n"; std::cout << "
    |___________________________________________________________________________________________
    __________________________________|\n"; std::cout << "Добвить? (y/n): "; std::cin >> ch; if (ch == 'n')
    { std::cout << "Отмена добавления записи.\n"; system("pause"); return; // отказ от добавления строки
    } if (ch != 'y')
    { std::cout << "Ошибка ответа на вопрос. \n"; system("pause"); return;
    } for (int i = 0; i < n; i++) p[i] = px[i]; p[n] = t; n++; if (px != NULL) delete[] px; px = p; std::cout << "Запись успешно добавлена.\n"; system("pause");
    } void masA :: DeleteClient() // Удаление записи
    { int j; client* p; char ch;
    Output(); std::cout << "Номер удаляемой строки: "; std::cin >> j;
    // Защита от неправильного ввода номера строки if (std::cin.fail())
    { std::cin.clear();

    10 std::cin.ignore(32767, '\n'); std::cout << "Ошибка. Это не номер строки.\n"; system("pause"); return;
    } std::cin.ignore(32767, '\n'); if (std::cin.gcount() > 1)
    { std::cout << "Ошибка. Это не номер строки.\n\n"; system("pause"); return;
    } if (j < 1 || j > n)
    { std::cout << "Ошибка. Нет такого номера строки.\n\n"; system("pause"); return;
    } j--; std::cout << "
    ____________________________________________________________________________________________
    ______________________________________\n"; // 3, 14, 12, 14, 22, 18, 11, 4, 5, 5, 10 = 118 std::cout << " | | | | | |
    | | Дата рождения | Годовой |\n"; std::cout << " | № | Фамилия | Имя | Отчество | Номер счета |
    Код счета | Сумма |----------------| процент |\n"; std::cout << " | | | | | |
    | на счете |День|Месяц| год |начислений| \n"; std::cout << "
    |___________________________________________________________________________________________
    ______________________________________|\n"; std::cout << std::left; std::cout << " | " << std::setw(2) << j + 1 << "| " << std::setw(12) << px[j].per.surname << " | " << std::setw(10) << px[j].per.name << " | " << std::setw(13) << px[j].per.otch << " | " << std::setw(20) << px[j].number << " | " << std::setw(16) << px[j].code << " | " << std::setw(9) << px[j].summ << " | " << std::setw(2) << px[j].dr.day
    << " | " << std::setw(3) << px[j].dr.month << " |" << std::setw(4) << px[j].dr.year << " | "
    << std::setw(8) << px[j].percent << " | \n"; std::cout << "
    |___________________________________________________________________________________________
    ______________________________________|\n"; std::cout << "Удалить? (y/n): "; std::cin >> ch; if (ch == 'n')
    { std::cout << "Отмена удаления записи.\n"; system("pause"); return; // отказ от удаления строки
    } if (ch != 'y')
    { std::cout << "Ошибка ответа на вопрос. \n"; system("pause"); return;
    }
    // Выполнение удаления строки if (n == 1) { delete[] px; px = NULL; n = 0; } else
    { p = new client[n - 1]; if (p == NULL)
    { std::cout << "Ошибка. Нет памяти.\n ";

    11 std::cout << "Ошибка. Удалить не удается.\n"; system("pause"); return;
    } for (int i = 0; i < j; i++) p[i] = px[i]; for (int i = j + 1; i < n; i++) p[i - 1] = px[i]; delete[] px; px = p; n--;
    } std::cout << "Запись удалена.\n"; system("pause");
    } void masA :: FioSort() // Алфавитная сортировка по ФИО
    { int fl, nn; client t; nn = n; do
    { fl = 0; nn--; for (int i = 0; i < nn; i++)
    { if (px[i].per.surname > px[i + 1].per.surname)
    { fl = 1; t = px[i]; px[i] = px[i + 1]; px[i + 1] = t;
    } else if (px[i].per.surname == px[i + 1].per.surname && px[i].per.name > px[i +
    1].per.name)
    { fl = 1; t = px[i]; px[i] = px[i + 1]; px[i + 1] = t;
    } else if (px[i].per.surname == px[i + 1].per.surname && px[i].per.name == px[i +
    1].per.name && px[i].per.otch > px[i + 1].per.otch)
    { fl = 1; t = px[i]; px[i] = px[i + 1]; px[i + 1] = t;
    }
    }
    } while (fl == 1); std::cout << "Массив структур упорядочен по ФИО в алфавитном порядке.\n"; system("pause");
    } void masA :: DataSort() // Сортировка по дате открытия счета
    { int fl, nn; client t; nn = n; do { fl = 0; nn--; for (int i = 0; i < nn; i++)
    { if (px[i].dr.year > px[i + 1].dr.year)
    { fl = 1; t = px[i]; px[i] = px[i + 1]; px[i + 1] = t;

    12
    } else if (px[i].dr.year == px[i + 1].dr.year && px[i].dr.month > px[i +
    1].dr.month)
    { fl = 1; t = px[i]; px[i] = px[i + 1]; px[i + 1] = t;
    } else if (px[i].dr.year == px[i + 1].dr.year && px[i].dr.month == px[i +
    1].dr.month && px[i].dr.day > px[i + 1].dr.day)
    { fl = 1; t = px[i]; px[i] = px[i + 1]; px[i + 1] = t;
    }
    }
    } while (fl == 1); std::cout << "Массив структур упорядочен по дате открытия счета.\n"; system("pause");
    } void masA :: NumberSort() // Числовая сортировка по номеру счета
    { int fl, nn; client t; nn = n; do { fl = 0; nn--; for (int i = 0; i < nn; i++) if (px[i].number > px[i + 1].number)
    { fl = 1; t = px[i]; px[i] = px[i + 1]; px[i + 1] = t;
    }
    } while (fl == 1); std::cout << "Массив структур упорядочен по номеру счета\n"; system("pause");
    } void main ()
    {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251); masA a; int j; char ch; while (1)
    { system("cls"); std::cout << "1. Загрузка данных из файла.\n"; std::cout << "2. Вывод на экран дисплея данных и результатов обработки.\n"; std::cout << "3. Сохранение результатов обработки в файл.\n"; std::cout << "4. Удаление записи\n"; std::cout << "5. Добавление записи.\n"; std::cout << "6. Алфавитная сортировка по ФИО.\n"; std::cout << "7. Сортировка по дате открытия счета.\n"; std::cout << "8. Числовая сортировка по номеру счета.\n"; std::cout << "9. Проверка коснтруктора копирования.\n"; std::cout << "10. Выход из программы.\n\n"; std::cout << "Ваш выбор (1-10): "; std::cin >> j;

    13
    // Защита от неправильного ввода пункта меню if (std::cin.fail())
    { std::cin.clear(); std::cin.ignore(32767, '\n'); std::cout << "Это не пункт меню.\n"; system("pause"); continue;
    } std::cin.ignore(32767, '\n'); if (std::cin.gcount() > 1)
    { std::cout << "Это не пункт меню.\n"; system("pause"); continue;
    } switch(j)
    { case 1: a.InputFile(); break; case 2: a.Output(); break; case 3: a.OutputFile(); break; case 4: a.DeleteClient(); break; case 5: a.AddClient (); break; case 6: a.FioSort(); break; case 7: a.DataSort(); break; case 8: a.NumberSort(); break; case 9: {masA d(a); a.Output(); d.Output();}; break; case 10: std::cout << "Конец работы.\n"; system("pause"); return; default: std::cout << "Ошибка. Нет такого пункта меню.\n"; system("pause");
    }
    }
    }
    Скриншоты работы программы
    1. Загрузка из файла

    14
    2. Вывод на экран дисплея данных
    3. Добавление записи

    15

    16
    4. Удаление записи

    17

    18
    5. Алфавитная сортировка по Ф.И.О.

    19
    6. Сортировка по дате открытия счета

    20
    7. Числовая сортировка по номеру счета

    21
    8. Сохранение результатов обработки в файлах

    22
    9. Проверка работы конструктора копирования

    23
    10. Выход из программы

    24
    11. Проверка работоспособности защиты, ошибки при выборе пункта меню
    12. Проверка работоспособности защиты, ошибки при загрузке данных из
    файла

    25
    13. Проверка работоспособности защиты, ошибки при добавлении строки

    26

    27
    14. Проверка работоспособности защиты, ошибки при удалении строки
    15. Проверка работоспособности защиты, ошибка при отсутствии памяти
    Вывод: в ходе выполнения работы были получены навыки реализации программ проектирования класса, использующего свободную память (содержащего динамический массив структур) на языке С++. При проверке работоспособности защиты, при использовании одной схемы защиты в разных местах, в отчет приводился пример работы программы, в случае возникновения ошибки, в единичном экземпляре.


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