Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТП_23_ИСТ_1_1_Какушкина_Ольга_Витальевна_ЛР_2.2.docx
Скачиваний:
0
Добавлен:
23.06.2025
Размер:
217.38 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Ф едеральное государственное бюджетное образовательное учреждение высшего образования

НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ

УНИВЕРСИТЕТ им. Р.Е.АЛЕКСЕЕВА

Институт радиоэлектроники и информационных технологий

Кафедра информатики и систем управления

ОТЧЕТ по лабораторной работе №2

(наименование темы проекта или работы)

по дисциплине

Технологии программирования

(наименование дисциплины)

РУКОВОДИТЕЛЬ:

________________ Капранов С. Н.

(подпись) (фамилия, и.,о.)

СТУДЕНТ:

________________ Какушкина О.В

(подпись) (фамилия, и.,о.)

23-ИСТ-1-1

(шифр группы)

Работа защищена «___» ____________

С оценкой ________________________

Нижний Новгород 2024

Текст задания:

Дана разреженная матрица Диагональный формат. Обойти её по варианту 7 и вывести все четные элементы.

Список функций и структур данных с описанием:

void inputPackedMatrix(unordered_map<int, vector<int>>& packedMatrix);

Функция позволяет пользователю вводить упакованную матрицу через стандартный ввод (консоль). packedMatrix: Ссылка на unordered_map, который будет хранить диагонали матрицы. Ключом является индекс диагонали (целое число), а значением — вектор целых чисел, представляющий элементы этой диагонали.

void readPackedMatrixFromFile(unordered_map<int, vector<int>>& packedMatrix);

Функция читает упакованную матрицу из текстового файла. packedMatrix: Ссылка на unordered_map, который будет хранить диагонали матрицы, аналогично inputPackedMatrix.

vector<vector<int>> unpackMatrix(const unordered_map<int, vector<int>>& packedMatrix, int n);

функция распаковывает упакованную матрицу из packedMatrix в двухмерный вектор (матрицу). packedMatrix: Константная ссылка на unordered_map, содержащий упакованные диагонали.

n: Размер распакованной матрицы (количество строк и столбцов, т.е. её размерность).

Возвращает распакованную матрицу как двухмерный вектор целых чисел, заполненный нулями по умолчанию.

void printUnpackedMatrix(const vector<vector<int>>& unpackedMatrix);

Функция выводит распакованную матрицу в консоль. unpackedMatrix: Константная ссылка на двумерный вектор, представляющий распакованную матрицу.

void printEvenElementsSnake(const vector<vector<int>>& unpackedMatrix);

Эта функция выводит четные элементы распакованной матрицы в формате "змейки". unpackedMatrix: Константная ссылка на двумерный вектор, представляющий распакованную матрицу.

Программный код:

Main.Cpp

#include <iostream>

#include "input_operations.h"

using namespace std;

int main() {

setlocale(LC_ALL, "Russian");

unordered_map<int, vector<int>> packedMatrix;

int choice = 0;

do {

cout << "\nВыберите действие:\n";

cout << "1 - Ввести упакованную матрицу\n";

cout << "2 - Считать упакованную матрицу из файла\n";

cout << "3 - Выход\n";

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

cin >> choice;

switch (choice) {

case 1:

inputPackedMatrix(packedMatrix);

break;

case 2:

readPackedMatrixFromFile(packedMatrix);

break;

case 3:

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

return 0;

default:

cout << "Неверный выбор. Попробуйте снова." << endl;

break;

}

} while (true);

return 0;

}

Input_operations.H

#include <unordered_map>

#include <vector>

using namespace std;

void inputPackedMatrix(unordered_map<int, vector<int>>& packedMatrix);

void readPackedMatrixFromFile(unordered_map<int, vector<int>>& packedMatrix);

Input_operations.Cpp

#include "input_operations.h"

#include "matrix_operations.h"

#include <iostream>

#include <fstream>

#include <limits>

using namespace std;

// Функция для наполнения упакованной матрицы

void inputPackedMatrix(unordered_map<int, vector<int>>& packedMatrix) {

int m, N;

cout << "Введите количество диагоналей: ";

while (!(cin >> m) || m <= 0) {

cout << "Ошибка ввода! Пожалуйста, введите положительное число: ";

cin.clear(); // Сброс состояния cin

cin.ignore(numeric_limits<streamsize>::max(), '\n'); // Очистка ввода

}

cout << "Введите размер массива: ";

while (!(cin >> N) || N <= 0) {

cout << "Ошибка ввода! Пожалуйста, введите положительное число: ";

cin.clear();

cin.ignore(numeric_limits<streamsize>::max(), '\n');

}

for (int i = 0; i < m; ++i) {

int diagIndex;

cout << "Введите индекс диагонали: ";

while (!(cin >> diagIndex)) {

cout << "Ошибка ввода! Пожалуйста, введите целое число: ";

cin.clear();

cin.ignore(numeric_limits<streamsize>::max(), '\n');

}

vector<int> values(N);

cout << "Введите " << N << " элементов для диагонали " << diagIndex << ": ";

for (int j = 0; j < N; ++j) {

while (!(cin >> values[j])) {

cout << "Ошибка ввода! Пожалуйста, введите целое число для элемента " << j + 1 << ": ";

cin.clear();

cin.ignore(numeric_limits<streamsize>::max(), '\n');

}

}

packedMatrix[diagIndex] = values;

}

// Предполагаю, что функции unpackMatrix и printUnpackedMatrix уже реализованы

auto unpackedMatrix = unpackMatrix(packedMatrix, N);

printUnpackedMatrix(unpackedMatrix);

printEvenElementsSnake(unpackedMatrix);

}

// Функция для чтения упакованной матрицы из файла

void readPackedMatrixFromFile(unordered_map<int, vector<int>>& packedMatrix) {

string filename = "C:/Users/79081/OneDrive/Рабочий стол/Отчеты Web/matrix.txt";

ifstream file(filename);

if (!file.is_open()) {

cout << "Не удалось открыть файл!" << endl;

return;

}

int m, N;

if (!(file >> m) || m <= 0) {

cout << "Ошибка чтения количества диагоналей! Проверьте корректность файла." << endl;

file.close();

return;

}

if (!(file >> N) || N <= 0) {

cout << "Ошибка чтения размера массива! Проверьте корректность файла." << endl;

file.close();

return;

}

for (int i = 0; i < m; ++i) {

int diagIndex;

if (!(file >> diagIndex)) {

cout << "Ошибка чтения индекса диагонали! Проверьте корректность файла." << endl;

file.close();

return;

}

vector<int> values;

int value;

while (values.size() < N && file >> value) {

values.push_back(value);

}

// Проверка, считано ли нужное количество элементов

if (values.size() < N) {

cout << "Недостаточно элементов для диагонали " << diagIndex << ". Ожидалось " << N << ", но считано " << values.size() << "." << endl;

// Можно либо завершить выполнение, либо продолжить и считать далее

}

packedMatrix[diagIndex] = values;

}

file.close();

cout << "Матрица успешно считана из файла!" << endl;

auto unpackedMatrix = unpackMatrix(packedMatrix, N);

printUnpackedMatrix(unpackedMatrix);

printEvenElementsSnake(unpackedMatrix);

}