
МИНОБРНАУКИ РОССИИ
Ф
едеральное
государственное бюджетное образовательное
учреждение высшего образования
НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ им. Р.Е.АЛЕКСЕЕВА
Институт радиоэлектроники и информационных технологий
Кафедра информатики и систем управления
ОТЧЕТ по лабораторной работе №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);
}