
ПР №1 Разработка алгоритмов и программ обработки массивов данных
.docФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Кафедра безопасности информационных систем
ОТЧЁТ
по итоговой работе №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