Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Отчёт_3

.docx
Скачиваний:
0
Добавлен:
27.06.2025
Размер:
136.92 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное автономное образовательное учреждение

высшего образования

«Национальный исследовательский Томский политехнический университет»

Инженерная школа информационных технологий и робототехники

Отделение автоматизации и робототехники

Направление: 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 – Код всех функций, использующихся в задании

  1. #include "Header.h"

  2. #include <iostream>

  3. #include <fstream>

  4. #include <sstream>

  5. #include <cmath>

  6. #include <algorithm>

  7. bool loadMatrixFromFile(const std::string& filename, double**& matrix, int& rows, int& cols) {

  8. std::ifstream file(filename);

  9. if (!file.is_open()) {

  10. return false;

  11. }

  12. std::string line;

  13. std::getline(file, line);

  14. std::stringstream ss(line);

  15. std::string token;

  16. cols = 0;

  17. // Подсчет количества столбцов

  18. while (std::getline(ss, token, ',')) {

  19. cols++;

  20. }

  21. // Подсчет количества строк

  22. rows = 1;

  23. while (std::getline(file, line)) {

  24. rows++;

  25. }

  26. // Создание динамического массива

  27. matrix = new double* [rows];

  28. for (int i = 0; i < rows; i++) {

  29. matrix[i] = new double[cols];

  30. }

  31. // Сброс позиции файла и повторная загрузка данных

  32. file.clear();

  33. file.seekg(0);

Продолжение Листинга 1

  1. for (int i = 0; i < rows; i++) {

  2. std::getline(file, line);

  3. std::stringstream ss(line);

  4. for (int j = 0; j < cols; j++) {

  5. if (std::getline(ss, token, ',')) {

  6. matrix[i][j] = std::stod(token);

  7. }

  8. }

  9. }

  10. file.close();

  11. return true;

  12. }

  13. bool saveMatrixToFile(const std::string& filename, double** matrix, int rows, int cols) {

  14. std::ofstream file(filename);

  15. if (!file.is_open()) {

  16. return false;

  17. }

  18. for (int i = 0; i < rows; i++) {

  19. for (int j = 0; j < cols; j++) {

  20. file << matrix[i][j];

  21. if (j < cols - 1) {

  22. file << ',';

  23. }

  24. }

  25. file << '\n';

  26. }

  27. file.close();

  28. return true;

  29. }

  30. void calculateCosineSimilarity(double** matrix, int rows, int cols, double** result) {

  31. for (int i = 0; i < rows; i++) {

  32. for (int j = 0; j < rows; j++) {

  33. double dotProduct = 0.0;

  34. double normA = 0.0;

  35. double normB = 0.0;

  36. for (int k = 0; k < cols; k++) {

  37. dotProduct += matrix[i][k] * matrix[j][k];

  38. normA += matrix[i][k] * matrix[i][k];

  39. normB += matrix[j][k] * matrix[j][k];

  40. }

  41. normA = std::sqrt(normA);

  42. normB = std::sqrt(normB);

Продолжение Листинга 1

  1. void replaceWithMedian(double** matrix, int rows, int cols, double threshold) {

  2. for (int j = 0; j < cols; j++) {

  3. double median = calculateMedian(matrix, rows, j);

  4. for (int i = 0; i < rows; i++) {

  5. if (matrix[i][j] == threshold) {

  6. matrix[i][j] = median;

  7. }

  8. }

  9. }

  10. }

  11. void freeMatrix(double**& matrix, int rows) {

  12. for (int i = 0; i < rows; i++) {

  13. delete[] matrix[i];

  14. }

  15. delete[] matrix;

  16. }

Листинг 2 – Код основного файла, для выбора типа сортировки

  1. #include "Header.h"

  2. void printMenu() {

  3. setlocale(LC_ALL, "Russian");

  4. std::cout << "\nМеню операций:\n";

  5. std::cout << "1. Вычисление косинусного сходства\n";

  6. std::cout << "2. Замена значений на среднее\n";

  7. std::cout << "3. Замена значений на медиану\n";

  8. std::cout << "0. Выход\n";

  9. std::cout << "\nВыберите операцию: ";

  10. }

  11. void printMatrix(double** matrix, int rows, int cols) {

  12. for (int i = 0; i < rows; i++) {

  13. for (int j = 0; j < cols; j++) {

  14. std::cout << matrix[i][j] << "\t";

  15. }

  16. std::cout << std::endl;

  17. }

  18. }

  19. int main() {

  20. setlocale(LC_ALL, "Russian");

  21. double** matrix = nullptr;

  22. int rows = 0, cols = 0;

  23. int choice;

  24. // Загрузка матрицы из файла

  25. if (!loadMatrixFromFile("input.csv", matrix, rows, cols)) {

  26. std::cerr << "Ошибка загрузки файла" << std::endl;

  27. return 1;

  28. }

  29. do {

  30. printMenu();

  31. std::cin >> choice;

  32. switch (choice) {

  33. case 1: {

  34. double** result = new double* [rows];

  35. for (int i = 0; i < rows; i++) {

  36. result[i] = new double[rows];

  37. }

  38. calculateCosineSimilarity(matrix, rows, cols, result);

  39. std::cout << "\nМатрица косинусного сходства:\n";

  40. printMatrix(result, rows, rows);

  41. freeMatrix(result, rows);

  42. break;

  43. }

Продолжение Листинга 2

  1. case 2: {

  2. double threshold;

  3. std::cout << "Введите значение для замены на среднее: ";

  4. std::cin >> threshold;

  5. replaceWithMean(matrix, rows, cols, threshold);

  6. std::cout << "\nМатрица после замены на среднее:\n";

  7. printMatrix(matrix, rows, cols);

  8. break;

  9. }

  10. case 3: {

  11. double threshold;

  12. std::cout << "Введите значение для замены на медиану: ";

  13. std::cin >> threshold;

  14. replaceWithMedian(matrix, rows, cols, threshold);

  15. std::cout << "\nМатрица после замены на медиану:\n";

  16. printMatrix(matrix, rows, cols);

  17. break;

  18. }

  19. case 0:

  20. std::cout << "Выход из программы\n";

  21. break;

  22. default:

  23. std::cout << "Неверный выбор. Попробуйте снова.\n";

  24. }

  25. } while (choice != 0);

  26. // Освобождение памяти

  27. freeMatrix(matrix, rows);

  28. return 0;

  29. }

Соседние файлы в предмете Основы программирования и алгоритмизации