Conversation with Merlin [email protected] · Tue Nov 07 2023

Реализовать пользовательское меню. В двунаправленном линейном списке записываются данные об осадках, каждый день в течении года. Данные поступают в список ежедневно в виде: Дата, количество осадков. По окончанию месяца должно высчитываться среднее количество осадков за месяц. Пользователь может просматривать данные за день, а также за месяц. А также добавлять, удалять редактировать и искать данные об осадках, а также среднее значение за месяц. Для этого он должен выбрать месяц для изменения. Обязателен диалог с пользователем! На языке C++

Конечно, я могу помочь вам реализовать пользовательское меню для работы с данными об осадках в двунаправленном линейном списке на языке C++.

Давайте начнем с создания структуры "Узел" для хранения данных об осадках за день:

struct Node { int day; int precipitation; Node* prev; Node* next; };

Затем создадим класс "Список", который будет представлять наш двунаправленный линейный список осадков:

class RainfallDataList { private: Node* head; Node* tail; public: // Конструкторы и деструктор // Добавить данные об осадках за день в список void addData(int day, int precipitation); // Удалить данные об осадках за день из списка void removeData(int day); // Редактировать данные об осадках за день в списке void editData(int day, int newPrecipitation); // Найти данные об осадках за день в списке Node* searchData(int day); // Вычислить среднее количество осадков за месяц float calculateAveragePrecipitation(int month); // Вывести данные об осадках за день void displayData(int day); // Вывести данные об осадках за месяц void displayMonthData(int month); // Показать пользовательское меню void showMenu(); };

Теперь реализуем методы классаСписок", начиная с метода "addData":

void RainfallDataList::addData(int day, int precipitation) { Node* newNode = new Node; newNode->day = day; newNode->precipitation = precipitation; newNode->prev =; newNode->next = nullptr; if (head == nullptr) { head = newNode; tail = newNode; } else { tail->next = newNode; newNode->prev = tail; tail = newNode; } }

Продолжим реализацией метода "removeData":

void RainfallDataList::removeData(int day) { Node* currentNode = head; while (currentNode != nullptr) { if (currentNode->day == day) { if (currentNode == head) { head = currentNode->next; if (head != nullptr) { head->prev = nullptr; } } else if (currentNode == tail) { tail = currentNode->prev; if (tail != nullptr) { tail->next = nullptr; } } else { currentNode->prev->next = currentNode->next; currentNode->next->prev = currentNode->prev; } delete currentNode; return; } currentNode = currentNode->next; } }

Продолжим с реализацией метода "editData":

void RainfallDataList::editData(int day, int newPrecipitation) { Node* node = searchData(day); if (node != nullptr) { node->precipitation = newPrecipitation; cout << "Данные об осадках за день " << day << " успешно изменены!" << endl; } else { cout << "Данные об осадках за д " << day << " не найдены!" << endl; }

Перейдем к реализации метода "searchData":

Node* RainfallDataList::searchData(int day) Node* currentNode = head; while (currentNode != nullptr) { if (currentNode->day == day) { return currentNode; } currentNode = currentNode->next; } return nullptr; }

Реализуем метод "calculateAveragePrecipitation":

float RainfallDataList::calculateAveragePrecipitation(int month) { int totalPrecipitation = 0; int daysInMonth = ; Node* currentNode = head; while (currentNode != nullptr) { // Проверяем, принадлежит ли текущий день к заданному месяцу // Мы можем использовать номер месяца, предполагая, что 1 я