Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Современные методы программирования / СМП ЛР1 Мустафина ИВТ-327

.docx
Скачиваний:
0
Добавлен:
26.06.2025
Размер:
849.95 Кб
Скачать

ФГБОУ ВО

«Уфимский университет науки и технологий»

Кафедра ТК

ОТЧЕТ

по лабораторной работе № 1

по дисциплине «Современные методы программирования»

Тема: «Проектирование класса, использующего свободную память

(содержащего динамический массив структур)»

Вариант № 16

Выполнил: студент гр. ИВТ-327

Проверил: доцент каф. ТК

Хасанов А.Ю.

Уфа 2024

Содержание

Задание

Спроектировать структуру MARSCH, содержащую поля: наименование тура, цена одного дня, количество дней, стоимость проезда.

Спроектировать структуру TUR, содержащую поле типа MARSCH дополнительно поля: фамилия, имя, отчество клиента, стоимость поездки. Файл содержит информацию о проданных туристических поездках. Требуется спроектировать класс, позволяющий обрабатывать эти данные. В классе должно быть предусмотрено, как минимум, выполнение следующих видов обработки:

1. Загрузка из файла;

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

3. Добавление записи;

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

5. Вывод на экран дисплея данных и результатов обработки;

6. Сортировка по Ф.И.О. клиента;

7. Алфавитная сортировка по наименованию тура;

8. Числовая сортировка по количеству дней.

Выполнение задания

Разметка таблицы

Фамилия и инициалы

Стоимость

Название тура

Цена 1-го дня

Кол-во дней

Цена проезда

Код программ:

#include <Windows.h> //для русского языка

#include <conio.h> //для очистки экрана

#include <fstream> //для работы с файлами

#include <iomanip> //для setw

#include <iostream>

#include <string>

using namespace std;

struct marsch

{

string name;

int priceDay, cnt, priceTransit;

};

struct tur {

marsch dr;

string nameFIO;

int price;

};

class masA {

private:

tur* px;

int n;

public:

masA() :px(NULL), n(0) {};

masA(masA& Z) { //конструктор копирования

int i;

n = Z.n;

if (n == 0) px = NULL;

else {

px = new tur[n];

if (px == NULL) {

cout << "Нет памяти.";

_getch();

exit(1);

}

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

px[i] = Z.px[i];

}

}

~masA() { if (px != NULL) delete[]px; }//деструктор

void inputFile();

void addTur();

void deleteTur();

void output();

void outputFile();

void sortName();

void sortNameTur();

void sortCnt();

void FindName();

};

int main() {

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

masA a;

int j;

while (1) {

system("cls");

cout << "------------------------------------------------------------\n";

cout << "\t\t\tМЕНЮ\n";

cout << "------------------------------------------------------------\n";

cout << "1. Ввод исходного массива из файла.\n";

cout << "2. Вывод исходного массива на экран.\n";

cout << "3. Сохранение результатов обработки в файл.\n";

cout << "4. Добавление записи в базу данных.\n";

cout << "5. Удаление записи в базе данных.\n";

cout << "6. Сортировка по Ф.И.О.\n";

cout << "7. Сортировка строкового поля.\n";

cout << "8. Сортировка по количеству дней.\n";

cout << "9. Проверка работы конструктора копирования.\n";

cout << "10. Выход из программы.\n";

cout << "------------------------------------------------------------\n";

cout << "\nВаш выбор: ";

cin >> j;

if (cin.fail())

{

string s;

cin.clear();

cin >> s;

cout << "Это не пункт меню\n";

_getch();

continue;

}

switch (j) {

case 1: a.inputFile(); break;

case 2: a.output(); break;

case 3: a.outputFile(); break;

case 4: a.addTur(); break;

case 5: a.deleteTur(); break;

case 6: a.sortName(); break;

case 7: a.sortNameTur(); break;

case 8: a.sortCnt(); break;

case 9: {masA b(a);

a.output(); b.output(); } break;

case 10: cout << "Конец работы.\n";

_getch(); return 0;

default: cout << "Нет такого пункта в меню\n";

_getch();

}

}

}

void masA::inputFile()

{

ifstream fin;

string file;

string iniz;

tur t;

cout << "Имя входного файла:";

cin >> file;

fin.open(file.c_str());

if (fin.fail()) {

cout << file << " не открывается\n";

_getch(); return;

}

n = 0;

if (px != NULL) { delete[] px; px = NULL; }

while (1)

{

fin >> t.nameFIO >> iniz >> t.price >> t.dr.name >> t.dr.priceDay >> t.dr.cnt >> t.dr.priceTransit;

if (fin.fail()) break;

n++;

}

fin.close();

fin.open(file.c_str());

if (fin.fail()) {

cout << file << "повторно не открывается\n";

_getch(); n = 0; return;

}

px = new tur[n];

if (px == NULL) {

cout << "Нет памяти.\n"; fin.close();

cout << "Ввести фаил не удается.\n";

_getch(); n = 0; return;

}

for (int i = 0; i < n; i++)

{

fin >> px[i].nameFIO >> iniz >> px[i].price >> px[i].dr.name >> px[i].dr.priceDay >> px[i].dr.cnt >> px[i].dr.priceTransit;

px[i].nameFIO = px[i].nameFIO + " " + iniz;

}

fin.close();

cout << "Файл введен " << endl;

_getch();

}

void masA::output()

{

int i;

if (px == NULL) { cout << "\n Данных нет.\n Массив пуст.\n"; _getch(); }

else {

cout << "____________________________________________________________________________________\n";

cout << "| | | | | | | \n";

cout << "| No | Фамилия и инициалы | Cтоимость | Название | Цена |Кол-во| Цена \n";

cout << "| | | | тура | 1-го дня | дней | проезда \n";

cout << "|____|______________________|____________|____________|____________|______|_________\n";

int i;

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

cout << "| " << setw(2) << i + 1 << " | " << setw(20) << px[i].nameFIO << " | " << setw(10)

<< px[i].price << " | " << setw(10) << px[i].dr.name << " | " << setw(10) << px[i].dr.priceDay

<< " | " << setw(4) << px[i].dr.cnt << " | " << setw(6) << px[i].dr.priceTransit << " | \n";

cout << "|____|______________________|____________|____________|____________|______|_________\n";

_getch();

}

}

void masA::outputFile()

{

ofstream fout;

string file;

int i;

cout << "Имя выходного файла:"; cin >> file;

fout.open(file.c_str());

if (fout.fail()) {

cout << "\n " << file << "не создается.\n";

_getch(); return;

}

fout << "____________________________________________________________________________________\n";

fout << "| | | | | | | | \n";

fout << "| No | Фамилия и инициалы | Cтоимость | Название | Цена |Кол-во| Цена | \n";

fout << "| | | | тура | 1-го дня | дней | проезда | \n";

fout << "|____|______________________|____________|____________|____________|______|_________|\n";

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

fout << "| " << setw(2) << i + 1 << " | " << setw(20) << px[i].nameFIO << " | " << setw(10)

<< px[i].price << " | " << setw(10) << px[i].dr.name << " | " << setw(10) << px[i].dr.priceDay

<< " | " << setw(4) << px[i].dr.cnt << " | " << setw(6) << px[i].dr.priceTransit << " | \n";

fout << "|____|______________________|____________|____________|____________|______|_________\n";

fout.close();

cout << "Массив структур сохранен в файл.\n";

_getch();

}

void masA::addTur() {

int i;

tur f, * p; string iniz;

p = new tur[n + 1];

if (p == NULL) {

cout << " Нет памяти.\n";

cout << " Добавить не удается.\n";

_getch(); return;

}

cout << "Фамилия и инициалы: ";

cin >> f.nameFIO >> iniz;

f.nameFIO = f.nameFIO + " " + iniz;

cout << "Стоимость: ";

cin >> f.price;

cout << "Название тура: ";

cin >> f.dr.name;

cout << "Цена 1-го дня: ";

cin >> f.dr.priceDay;

cout << "Кол-во дней: ";

cin >> f.dr.cnt;

cout << "Цена проезда: ";

cin >> f.dr.priceTransit;

for (i = 0; i < n; i++) p[i] = px[i];

p[n] = f;

n++;

delete[] px;

px = p;

cout << "Запись добавлена.\n";

_getch();

}

void masA::deleteTur()

{

int j, i;

tur* p;

char ch;

output();

cout << "Номер строки, которую вы хотите удалить: ";

cin >> j;

if (cin.fail())

{

cin.clear();

string s;

cin >> s;

cout << " Это не номер строки.\n";

_getch();

return;

}

if (j<1 || j>n) {

cout << "Ошибка: нет такой строки.\n";

_getch(); return;

}

j--;

cout << " " << j + 1 << "-я строка:\n";

cout << px[j].nameFIO << " " << px[j].price << " " << px[j].dr.name << " " << px[j].dr.priceDay << " " << px[j].dr.cnt << " " << px[j].dr.priceTransit << " \n";

cout << "Удалить?(y/n):"; cin >> ch;

if (ch == 'n') return;

if (ch != 'y') {

cout << "Ошибка ответа на вопрос. \n";

_getch(); return;

}

if (n == 1) { delete[] px; px = NULL; n = 0; }

else {

p = new tur[n - 1];

if (p == NULL) {

cout << "Нет памяти.\n ";

cout << "Удалить не удается.\n";

_getch(); return;

}

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

p[i] = px[i];

for (i = j + 1; i < n; i++)

p[i - 1] = px[i];

delete[] px;

px = p;

n--;

}

cout << "Запись удалена.\n"; _getch();

}

void masA::sortName()

{

int i, fl, nn;

tur t;

nn = n;

do {

fl = 0; nn--;

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

if (px[i].nameFIO > px[i + 1].nameFIO)

{

fl = 1; t = px[i];

px[i] = px[i + 1];

px[i + 1] = t;

}

} while (fl == 1);

cout << "Массив структур упорядочен по ФИО в алфавитном порядке\n";

_getch();

}

void masA::sortNameTur()

{

int i, fl, nn;

tur t;

nn = n;

do {

fl = 0; nn--;

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

if (px[i].dr.name > px[i + 1].dr.name)

{

fl = 1; t = px[i];

px[i] = px[i + 1];

px[i + 1] = t;

}

} while (fl == 1);

cout << "Массив структур упорядочен по наименованию тура в алфавитном порядке\n";

_getch();

}

void masA::sortCnt()

{

int i, fl, nn;

tur t;

nn = n; // вводим копию размера массива

do {

fl = 0; nn--;

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

if (px[i].dr.cnt > px[i + 1].dr.cnt)

{

fl = 1; t = px[i];

px[i] = px[i + 1];

px[i + 1] = t;

}

} while (fl == 1);

cout << "Массив структур упорядочен по количеству дней\n";

_getch();

}

Скриншоты работы программы

  1. Ввод меню и загрузка из файла

а) В качестве пункта меню введено не число:

б) Введен несуществующий пункт меню:

в) Введен несуществующий файл:

г) Введен правильный файл:

2. Вывод на экран дисплея данных

3. Добавление записи

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

a) В качестве номера строки введено не число

б) Введена несуществующая строка:

в) Дан неверный ответ на подтверждение удаления:

г) Удаление отменено:

д) Удаление:

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

6. Сортировка по наименованию туров.

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

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

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

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

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

21