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

ПР №1 Разработка алгоритмов и программ обработки массивов данных

.doc
Скачиваний:
2
Добавлен:
02.02.2025
Размер:
115.2 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

(СПбГУТ)

Кафедра безопасности информационных систем

ОТЧЁТ

по итоговой работе №1 на тему: «Разработка алгоритмов и программ обработки массивов данных»

по дисциплине «Алгоритмы и структуры данных»

Выполнил: студент группы ИСТ-931, Гетманченко П.А.

«28» сентября 2020 г. ___________/П.А. Гетманченко /

Принял: к.ф.-м.н., доцент, Моисеев И. А.

«28» сентября 2020 г. __________/ И. А. Моисеев /

Основная часть

Цель работы: разработать пользовательский алгоритм и программу для вычислений матрицы (умножение матриц) и числа сочетаний (формула). Приобрести навыки и умения анализа алгоритма.

Результаты выполнения работы

Задание 1:

Разработать алгоритм и программу умножения двух целочисленных матриц А (m1 х n1) и В (m2 х n2). Размер матриц (двумерных массивов) вводится с клавиатуры. На выходе программы – новая матрица C (m х n ) с результатом умножения. Элементы матриц А (aij) и В (bkl) задаются случайным образом с использованием генератора случайных чисел в диапазоне от -100 до 100. Алгоритм программы должен учитывать математические правила умножения матриц.

#include <iostream>

#include <iomanip>

#include <cstdlib>

#include <clocale>

void multiply(int** mat1, int** mat2, int** res,

const int m, const int n, const int k) {

// здесь реализован алгоритм произведения матриц

// в алгоритме выполняются 3 вложенных цикла,

// т.о. сложность алгоритма составляет O(n^3) в Big-O нотации

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

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

res[i][j] = 0;

for (int l = 0; l < k; ++l) {

res[i][j] += mat1[i][l] * mat2[l][j];

}

}

}

}

int main()

{

setlocale(LC_ALL, "Russian");

int m1, n1, m2, n2; // размеры исходных матриц

std::cout << "Введите размеры матриц\n";

std::cout << "Первая матрица:\n";

std::cout << "число строк: "; std::cin >> m1;

std::cout << "число столбцов: "; std::cin >> n1;

std::cout << "Вторая матрица:\n";

std::cout << "число строк: "; std::cin >> m2;

std::cout << "число столбцов: "; std::cin >> n2;

//std::cin >> m1 >> n1; // ввод с клавиатуры

//std::cin >> m2 >> n2; // ввод с клавиатуры

if (n1 != m2) { // проверяем можем ли эти матрицы перемножить или нет

std::cout << "\nОшибка: матрицы с заданными размерами нельзя перемножить\n";

return 1;

}

int** mat1 = new int* [m1]; // выделение памяти

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

mat1[i] = new int[n1];

}

std::cout << "\nПервая матрица:\n";

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

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

mat1[i][j] = rand() % 201 - 100;

std::cout << std::setw(5) << mat1[i][j];

}

std::cout << "\n";

}

std::cout << "\nВторая матрица:\n";

int** mat2 = new int* [m2]; // выделение памяти

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

mat2[i] = new int[n2];

}

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

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

mat2[i][j] = rand() % 201 - 100;

std::cout << std::setw(5) << mat2[i][j];

}

std::cout << "\n";

}

int** res = new int* [m1]; // выделение памяти под результат произведения

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

res[i] = new int[n2];

}

multiply(mat1, mat2, res, m1, n2, n1); // вызов функции перемножения

std::cout << "\nРезультат умножения:\n";

for (int i = 0; i < m1; ++i) { // вывод результативной матрицы

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

std::cout << std::setw(7) << res[i][j];

}

std::cout << "\n";

}

for (int i = 0; i < m1; ++i) { // освобождаем выделенную память

delete[] mat1[i];

}

delete[] mat1;

for (int i = 0; i < m2; ++i) { // освобождаем выделенную память

delete[] mat2[i];

}

delete[] mat2;

for (int i = 0; i < m1; ++i) { // освобождаем выделенную память

delete[] res[i];

}

delete[] res;

system("Pause");

return 0;

}

Положительный результат:

Отрицательный результат:

Задание 2:

Разработать алгоритм и программу вычисления числа сочетаний из n элементов по m: С𝒏𝒎=𝒏(𝒏−𝟏)(𝒏−𝟐)…(𝒏−𝒎−𝟏)𝟏𝟐𝟑…𝒎= 𝒏!𝒎!(𝒏−𝒎)!.

Числа n и m вводятся с клавиатуры (n m).

#include <iostream>

// функция вычисляющая факториал

int Fact(int n) {

if (n == 0) {

return 1;

}

return n * Fact(n - 1);

}

// вычисление сочетаний с помощью функции факториала

int Combination(int n, int k) {

return Fact(n) / Fact(k) / Fact(n-k);

}

// вычисление сочетаний с помощью рекурсии

int CombinationRecursive(int n, int k) {

if (k == 0 || k == n) {

return 1;

} else {

return CombinationRecursive(n - 1,k - 1) + CombinationRecursive(n - 1, k);

}

}

int main() {

int n, m;

std::cin >> n >> m; // ввод с клавиатуры

if (n < m) { // проверка на правильность

std::cout << "\nError: cannot compute combination";

return 1;

}

std::cout << "Combination = " << Combination(n, m) << "\n"; // вывод

std::cout << "Combination(Recursive) = " << CombinationRecursive(n, m) << "\n"; // вывод

return 0;

}

Положительный результат:

Отрицательный результат:

Выводы: были разработаны пользовательские алгоритмы и составлены программы для указанных задач. Также были приобретены навыки и умения анализа алгоритма.

Содержание

Основная часть 2

Результаты выполнения работы 2

Выводы 6

Содержание 6

САНКТ-ПЕТЕРБУРГ 2020