МИНИСТЕРСТВО
НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ
ФЕДЕРАЦИИ
Федеральное
государственное автономное образовательное
учреждение
высшего
образования
«Национальный
исследовательский Томский политехнический
университет»
Инженерная
школа информационных технологий и
робототехники
Отделение
автоматизации и робототехники
Направление:
15.03.04 – Автоматизация технологических
процессов и производств
Отчёт
по лабораторной работе № 3
по
дисциплине «Основы программирования
и алгоритмизации»
«Двумерные
массивы»
вариант
№ 13
Выполнил:
Студент
группы 8Т41 Кирильцева К. М.
Проверил:
Ассистент
________________ Кургинов Я. О.
Томск
2025
Цель
работы:
Изучить
и освоить основы работы с двумерными
массивами в языке
программирования
C++, научиться объявлять и инициализировать
двумерные
массивы,
осуществлять доступ к их элементам и
модификацию, применять
циклы
для обработки элементов, а также решать
практические задачи,
связанные
с использованием двумерных массивов,
такие как работа с
матрицами
и таблицами данных.
Задание:
№
|
Формулировка
|
1.
|
Косинусное
сходство
|
2.
|
Среднего
|
3.
|
Медиана
|
Блок
схемы:
Блок
схема основного кода представлена на
рисунке 1.
Рисунок
1- Блок схема основного кода.
Блок
схема функции представлена на рисунке
2.
Рисунок
2 - Блок схема функции.
Блок
схема функции представлена на рисунке
3.
Рисунок
3 - Блок схема функции.
Результат
матрицы косинусного сходства показан
на рисунке 4:
Рисунок
4 - Матрица косинусного сходства
Результат
замены на среднее показан на рисунке
5:
Рисунок
5 - Матрица после замены на среднее
Результат
замены на среднее
показан
на рисунке 6:
Рисунок
6 - Матрица после замены на среднее
Вывод:
Освоенно
создание, инициализация и обработка
элементов двумерных массивов с помощью
циклов и условных операторов. Реализованы
функции для расчета косинусного сходства,
что помогло понять, как оценивать
близость и связь между элементами.
Использованы статистические методы
(среднее, медиана), чтобы эффективно
заменять недостающие данные и аномалии
в таблицах.
Таким
образом, лабораторная работа помогла
закрепить знания и навыки работы с
двумерными массивами для решения
практических задач в области обработки
данных и изображений.
Приложение
A.
(Обязательный)
Листинги
программ
Листинг
1 – Код всех функций, использующихся в
задании
#include
"Header.h"
#include
<iostream>
#include
<fstream>
#include
<sstream>
#include
<cmath>
#include
<algorithm>
-
bool
loadMatrixFromFile(const std::string& filename, double**&
matrix, int& rows, int& cols) {
std::ifstream
file(filename);
if
(!file.is_open()) {
return
false;
}
-
std::string
line;
std::getline(file,
line);
std::stringstream
ss(line);
std::string
token;
cols
= 0;
-
//
Подсчет количества столбцов
while
(std::getline(ss, token, ',')) {
cols++;
}
-
//
Подсчет количества строк
rows
= 1;
while
(std::getline(file, line)) {
rows++;
}
-
//
Создание динамического массива
matrix
= new double* [rows];
for
(int i = 0; i < rows; i++) {
matrix[i]
= new double[cols];
}
-
//
Сброс позиции файла и повторная
загрузка данных
file.clear();
file.seekg(0);
|
Продолжение
Листинга 1
for
(int i = 0; i < rows; i++) {
std::getline(file,
line);
std::stringstream
ss(line);
for
(int j = 0; j < cols; j++) {
if
(std::getline(ss, token, ',')) {
matrix[i][j]
= std::stod(token);
}
}
}
-
file.close();
return
true;
}
-
bool
saveMatrixToFile(const std::string& filename, double**
matrix, int rows, int cols) {
std::ofstream
file(filename);
if
(!file.is_open()) {
return
false;
}
-
for
(int i = 0; i < rows; i++) {
for
(int j = 0; j < cols; j++) {
file
<< matrix[i][j];
if
(j < cols - 1) {
file
<< ',';
}
}
file
<< '\n';
}
-
file.close();
return
true;
}
-
void
calculateCosineSimilarity(double** matrix, int rows, int cols,
double** result) {
for
(int i = 0; i < rows; i++) {
for
(int j = 0; j < rows; j++) {
double
dotProduct = 0.0;
double
normA = 0.0;
double
normB = 0.0;
-
for
(int k = 0; k < cols; k++) {
dotProduct
+= matrix[i][k] * matrix[j][k];
normA
+= matrix[i][k] * matrix[i][k];
normB
+= matrix[j][k] * matrix[j][k];
}
normA
= std::sqrt(normA);
normB
= std::sqrt(normB);
|
Продолжение
Листинга 1
void
replaceWithMedian(double** matrix, int rows, int cols, double
threshold) {
for
(int j = 0; j < cols; j++) {
double
median = calculateMedian(matrix, rows, j);
for
(int i = 0; i < rows; i++) {
if
(matrix[i][j] == threshold) {
matrix[i][j]
= median;
}
}
}
}
-
void
freeMatrix(double**& matrix, int rows) {
for
(int i = 0; i < rows; i++) {
delete[]
matrix[i];
}
delete[]
matrix;
}
|
Листинг
2 – Код основного файла, для выбора типа
сортировки
#include
"Header.h"
-
void
printMenu() {
setlocale(LC_ALL,
"Russian");
std::cout
<< "\nМеню операций:\n";
std::cout
<< "1. Вычисление косинусного
сходства\n";
std::cout
<< "2. Замена значений на среднее\n";
std::cout
<< "3. Замена значений на медиану\n";
std::cout
<< "0. Выход\n";
std::cout
<< "\nВыберите операцию: ";
}
-
void
printMatrix(double** matrix, int rows, int cols) {
for
(int i = 0; i < rows; i++) {
for
(int j = 0; j < cols; j++) {
std::cout
<< matrix[i][j] << "\t";
}
std::cout
<< std::endl;
}
}
-
int
main() {
setlocale(LC_ALL,
"Russian");
double**
matrix = nullptr;
int
rows = 0, cols = 0;
int
choice;
-
//
Загрузка матрицы из файла
if
(!loadMatrixFromFile("input.csv", matrix, rows, cols))
{
std::cerr
<< "Ошибка
загрузки
файла"
<< std::endl;
return
1;
}
-
do
{
printMenu();
std::cin
>> choice;
-
switch
(choice) {
case
1: {
double**
result = new double* [rows];
for
(int i = 0; i < rows; i++) {
result[i]
= new double[rows];
}
calculateCosineSimilarity(matrix,
rows, cols, result);
std::cout
<< "\nМатрица косинусного
сходства:\n";
printMatrix(result,
rows, rows);
freeMatrix(result,
rows);
break;
}
|
Продолжение
Листинга 2
case
2: {
double
threshold;
std::cout
<< "Введите значение для замены
на среднее: ";
std::cin
>> threshold;
replaceWithMean(matrix,
rows, cols, threshold);
std::cout
<< "\nМатрица после замены на
среднее:\n";
printMatrix(matrix,
rows, cols);
break;
}
case
3: {
double
threshold;
std::cout
<< "Введите значение для замены
на медиану: ";
std::cin
>> threshold;
replaceWithMedian(matrix,
rows, cols, threshold);
std::cout
<< "\nМатрица после замены на
медиану:\n";
printMatrix(matrix,
rows, cols);
break;
}
case
0:
std::cout
<< "Выход из программы\n";
break;
default:
std::cout
<< "Неверный выбор. Попробуйте
снова.\n";
}
}
while (choice != 0);
-
//
Освобождение памяти
freeMatrix(matrix,
rows);
-
return
0;
}
|