
ТП_23_ИСТ_1_1_Какушкина_Ольга_Витальевна_ЛР_1.2
.docxМИНОБРНАУКИ РОССИИ
Ф
едеральное
государственное бюджетное образовательное
учреждение высшего образования
НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ им. Р.Е.АЛЕКСЕЕВА
Институт радиоэлектроники и информационных технологий
Кафедра информатики и систем управления
ОТЧЕТ по лабораторной работе №1
(наименование темы проекта или работы)
по дисциплине
Технологии программирования
(наименование дисциплины)
РУКОВОДИТЕЛЬ:
________________ Капранов С. Н.
(подпись) (фамилия, и.,о.)
СТУДЕНТ:
________________ Какушкина О.В
(подпись) (фамилия, и.,о.)
23-ИСТ-1-1
(шифр группы)
Работа защищена «___» ____________
С оценкой ________________________
Нижний Новгород 2024
Текст задания:
N серых и M белых мышей сидят по кругу. Кошка ходит по кругу по часовой стрелке и съедает каждую S -тую мышку. В первый раз счет начинается с серой мышки. Составить алгоритм определяющий порядок в котором сидели мышки, если через некоторое время осталось K серых и L белых мышей.
Список функций и структур данных с описанием:
struct Mouse |
Хранит цвет мыши как символ. Структура - Элемент в списке. |
class MouseList |
Список из элементов структуры Mouse. |
void add(char color) |
Метод для добавления мыши в конец списка. Принимает тип char. Возвращает void. |
void print() |
Метод для вывода всех цветов мышей в списке. Ничего не принимает. Возвращает void. |
Mouse* getMouseAt(int index) |
Получает указатель на мышь по индексу. Принимает индекс элемента в списке. Возвращает указатель элемент Mouse. |
void resetMouseAt(int index, char color) |
Меняет цвет мыши по индексу. Индекс мыши (int index) и новый цвет (char color). Возвращает void. |
int size() |
Возвращает количество мышей в списке.Ничего не принимает. Возвращает количество элементов. |
int inputWithValidation(const std::string& prompt, bool allowZero = false) |
Вводит числовое значение с проверкой на корректность. Принимает: Строку запроса (std::string& prompt) и флаг (bool allowZero), позволяющий ввод нуля. Возвращает: Корректное числовое значение (int). |
void mass_mouse(int S, int N, int M, int K, int L) |
Реализует логику поедания мышей и заполняет список. Принимает: Параметры к поеданию (int S, int N, int M, int K, int L). Возвращает void. |
int loadFromFile(int& N, int& M, int& S, int& K, int& L) |
Функция для чтения данных из файла. Читает значения из файла. Возвращает int в случае ошибки открытия файла. |
Программный код:
Tehprog1.cpp
#include <iostream>
#include <limits>
#include <fstream>
#include <string>
struct Mouse {
char color;
Mouse* next;
Mouse* prev;
Mouse(char c) : color(c), next(nullptr), prev(nullptr) {}
};
class MouseList {
private:
Mouse* head;
Mouse* tail;
public:
MouseList() : head(nullptr), tail(nullptr) {}
~MouseList() {
Mouse* current = head;
while (current != nullptr) {
Mouse* next = current->next;
delete current;
current = next;
}
}
void add(char color) {
Mouse* newMouse = new Mouse(color);
if (!head) {
head = tail = newMouse; // Список был пуст
}
else {
tail->next = newMouse;
newMouse->prev = tail;
tail = newMouse;
}
}
Mouse* begin() { return head; } // Возвращает указатель на первый элемент
Mouse* end() { return nullptr; } // Возвращает nullptr как конец списка
void print() { // вывод восстановленного круга мышей
std::cout << "Финальная расстановка мышей: ";
Mouse* current = head;
while (current != nullptr) {
std::cout << current->color << ' ';
current = current->next;
}
std::cout << std::endl;
}
Mouse* getMouseAt(int index) { //получаем цвет мыши
Mouse* current = head;
int i = 0;
while (current != nullptr && i < index) {
current = current->next;
i++;
}
return current;
}
void resetMouseAt(int index, char color) { //Меняет цвет мыши по индексу.
Mouse* mouse = getMouseAt(index);
if (mouse) {
mouse->color = color;
}
}
int size() { // Вычисляем количество элементов
int count = 0;
Mouse* current = head;
while (current != nullptr) {
count++;
current = current->next;
}
return count;
}
};
// Функция для ввода числового значения с проверкой
int inputWithValidation(const std::string& prompt, bool allowZero = false) {
int value;
while (true) {
std::cout << prompt;
std::cin >> value;
if (std::cin.fail() || (value < 0 || (!allowZero && value == 0))) { // Проверка на корректность ввода
std::cin.clear(); // Сброс флага ошибки
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Очистка буфера ввода
std::cout << "Некорректный ввод. Пожалуйста, введите положительное целое число." << std::endl;
}
else {
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Очистка буфера
return value;
}
}
}
// Функция для чтения данных из файла
int loadFromFile(int& N, int& M, int& S, int& K, int& L) {
std::ifstream file("C:/Users/79081/OneDrive/Рабочий стол/ООП материал/data.txt");
if (!file.is_open()) {
std::cerr << "Ошибка: не удалось открыть файл." << std::endl;
return 2;
}
// Считываем значения
file >> N >> M >> S >> K >> L;
// Проверка корректности считанных значений
if (N < 0 || M < 0 || S < 1 || K < 0 || L < 0) {
std::cerr << "Ошибка: одно из считанных значений неверно." << std::endl;
return 3;
}
if (K > N || L > M) {
std::cerr << "Ошибка: конечные значения K или L больше начальных количеств серых или белых мышей." << std::endl;
return 4;
}
file.close();
return 0; // Успешное завершение
}
// Основная логика поедания мышей
void mass_mouse(int S, int N, int M, int K, int L) {
MouseList mice; // Создаем свой список для хранения мышей
for (int i = 0; i < N + M; i++) {
mice.add('E'); // Добавляем пустые (в начале) мыши
}
Mouse* it = mice.begin(); // Итератор на начало списка
int curK = N, curL = M, curS = 0; // Текущие значения
// Цикл поедания мышей
while (curK > K || curL > L) {
if (!it) {
it = mice.begin();
}
if (curK > 0 || curL > 0) {
if (it->color == 'E') {
curS++; // Увеличиваем счетчик для каждой S-й мыши
if (curS == S) {
if (curK > K) { // Съедаем серую мышь
it->color = 'G'; // Серая мышь
curK--;
}
else if (curL > L) { // Съедаем белую мышь
it->color = 'W'; // Белая мышь
curL--;
}
curS = 0; // Сбрасываем счетчик
}
}
it = it->next; // Переход к следующему элементу
}
else {
break; // Выход из цикла, если мыши закончились
}
}
// Заполнение оставшихся пустых мест (если нужно)
for (int i = 0; i < mice.size(); i++) {
if (mice.getMouseAt(i)->color == 'E') {
if (curK > 0) {
mice.resetMouseAt(i, 'G'); // Добавляем серую мышь
curK--;
}
else if (curL > 0) {
mice.resetMouseAt(i, 'W'); // Добавляем белую мышь
curL--;
}
}
}
// Вывод результата
mice.print();
}
int main() {
setlocale(LC_ALL, "Russian");
int choice;
std::cout << "Выберите способ ввода данных:\n";
std::cout << "1. Ввод с клавиатуры\n";
std::cout << "2. Ввод из файла (data.txt)\n";
std::cout << "3. Выход \n";
std::cout << "Ваш выбор: ";
std::cin >> choice;
int S, N, M, K, L;
if (choice == 1) {
S = inputWithValidation("Введите S (период, через который мышь ест): ");
N = inputWithValidation("Введите N (количество серых мышей): ");
M = inputWithValidation("Введите M (количество белых мышей): ");
K = inputWithValidation("Введите K (конечное количество серых мышей): ", true);
L = inputWithValidation("Введите L (конечное количество белых мышей): ", true);
}
else if (choice == 2) {
loadFromFile(S, N, M, K, L);
int result = loadFromFile(N, M, S, K, L);
if (result != 0) {
return result; // Прекращаем выполнение, если произошла ошибка
}
}
else if (choice == 3) {
return 1;
}
else {
std::cerr << "Некорректный выбор." << std::endl;
return 1;
}
// Проверка на корректность значений
if (K > N || L > M) {
std::cout << "Ошибка: конечные значения K или L больше начальных количеств серых или белых мышей." << std::endl;
return 1;
}
mass_mouse(S, N, M, K, L);
return 0;
}
Файл:
Вывод в консоли:
Ввод с клавиатуры
Чтение из файла
Некорректные данные с клавиатуры
Некорректные данные с файла
Вывод:
В процессе написания лабораторной работы разработан алгоритм на основе двухсвязных списков. Также был изучен и повторен материал по структурам данных.