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

Цвинтарный Иван 362-2 Лабораторная работа 6

.docx
Скачиваний:
3
Добавлен:
21.06.2023
Размер:
241.92 Кб
Скачать

Министерство науки и высшего образования Российской Федерации

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)

Кафедра промышленной электроники (ПрЭ)

ОТЧЁТ

по результатам лабораторной работы №6

по дисциплине «Информатика»

Двумерные массивы

Выполнил

Студент гр. 362-2

________ Цвинтарный И.В.

«___» __________

Проверил

Преподаватель

_____________ Савин Д.А.

«___»__________

Томск 2022

Оглавление

Введение 3

1. Ход работы 4

2. Индивидуальное задание 5

3. Блок-схема подпрограммы 5

4. Программный код – текст программы 6

5. Результаты работы программы 12

Заключение 13

Введение

В шестой лабораторной работе нам требуется освоить двумерные массивы. Научиться выделять память одним из трех способов. Повторить понятия, операции и закрепить умения и навыки матричной алгебры. Повысить навыки отладки программного кода на С++, трассировки программы и просмотра значений переменных в окне Watch.

1. Ход работы

1. Написать, отладить и протестировать программу, выполняющую следующие операции с одномерными и многомерными массивами данных в соответствии со своим вариантом.

2. Выделить память первым способом – статически (согласно варианту).

3. Написать подпрограммы операций выделения памяти под матрицы и вектора, вывод на экран, матричной арифметики, освобождение памяти и т.п.

4. При выполнении операций матричной алгебры размерность вектора и второй матрицы задать самостоятельно таким образом, чтобы была возможность эти операции производить. Организовать в подпрограммах проверку корректности размерностей матриц: при произведении – проверять сцепленность матриц, при сложении – совпадение размерностей.

5. При демонстрации преподавателю работающей программы необходимо провести пошаговую трассировку указанного преподавателем участка программы с комментариями производимых программой действий.

6. В отчете показать блок-схему алгоритмов вычисляющей подпрограммы и рисунок, отражающий распределение памяти под матрицу.

7. В отчете привести проверку правильности произведенных вычислений, сделанную в программном пакете MatCAD.

2. Индивидуальное задание

Вариант индивидуального задания – 23.

Рисунок 2.1 – Формулировка задания

3. Блок-схема подпрограммы

Рисунок 3.1 – Блок-схема подпрограммы

4. Программный код – текст программы

#include <iostream>

#include <time.h>

using namespace std;

#define rnd2(a, b) (((double)rand()/RAND_MAX)*((b) - (a)) + (a))

#define N 3 // макросы размерности массива

#define M 4 // N - число строк, M - число столбцов

void init_matrix(float A[N][M], int n, int m, float a, float b); // инициализация матрицы

void init_vector(float X[], int n, float a, float b); // инициализация вектора

void print_matrix(float A[N][M], int n, int m, const char* name); // вывод матрицы

void print_vector(float X[], int n, const char* name, bool bVert); // вывод вектора

void operation_vec(float A[N][M], int n, int m, float X[], float Y[]); // операция с вектором

void operation_mat(float A[N][M], int n, int m, float B[N][M], float C[N][M]); // операция с матрицами

float minimum(float A[N][M], int n, int m); // вычислительная операция

int main()

{

setlocale(LC_ALL, "RUS");

srand(time(NULL));

float A[N][M];

float B[N][M];

float C[N][M];

float X[N];

float Y[M];

init_matrix(A, N, M, -10, 10);

init_matrix(B, N, M, 0, 5);

print_matrix(A, N, M, "A");

print_matrix(B, N, M, "B");

operation_mat(A, N, M, B, C);

print_matrix(C, N, M, "C");

init_vector(X, N, 0, 2);

print_vector(X, N, "X", false);

operation_vec(A, N, M, X, Y);

print_vector(Y, M, "Y", false);

cout << "Минимальное произведение элементов столбцов: " << minimum(A, N, M) << endl;

}

void init_matrix(float A[N][M], int n, int m, float a, float b) // заполняем матрицу

{

for (int i = 0; i < n; i++)

for (int j = 0; j < m; j++) // {} не используем т.к. в цикле выполняется всего 1 операция

A[i][j] = rnd2(a, b);

}

void init_vector(float X[], int n, float a, float b) // заполняем вектор

{

for (int i = 0; i < n; i++)

X[i] = rnd2(a, b);

}

void print_matrix(float A[N][M], int n, int m, const char* name) // вывводим матрицу

{

for (int i = 0; i < n; i++)

{

for (int j = 0; j < m; j++)

{

cout << name << "[" << i << "][" << j << "] = " << A[i][j];

cout << "\t";

}

cout << endl;

}

cout << endl;

}

void print_vector(float X[], int n, const char* name, bool bVert) // выводим вектор

{

for (int i = 0; i < n; i++)

{

cout << name << "[" << i << "] = " << X[i];

if (bVert == true)

cout << endl;

else

cout << "\t";

}

cout << endl;

if (bVert == false)

cout << endl;

}

void operation_vec(float A[N][M], int n, int m, float X[], float Y[]) // операция с вектором х*4*А

{

for (int j = 0; j < m; j++)

{

Y[j] = 0; // обнуляем т.к. операция сложения

for (int i = 0; i < n; i++)

Y[j] += X[i] * 4 * A[i][j];

}

}

void operation_mat(float A[N][M], int n, int m, float B[N][M], float C[N][M]) // операция с матрицей 4*В-А

{

for (int i = 0; i < n; i++)

for (int j = 0; j < m; j++)

C[i][j] = 4 * B[i][j] - A[i][j]; // не надо обнулять т.к. операция присвоения, результат не поменяется

}

float minimum(float A[N][M], int n, int m) // вычисление минимума произведений элементов в столбцах

{

float res = 1;

float min = 1;

for (int i = 0; i < n; i++)

{

res *= A[i][0];

}

min = res;

for (int j = 0; j < m; j++)

{

res = 1;

for (int i = 0; i < n; i++)

{

res *= A[i][j];

}

if (min > res)

{

min = res;

}

}

return min;

}

Рисунок 4.1 – Программный код 1/3

Рисунок 4.2 – Программный код 2/3

Рисунок 4.3 – Программный код 3/3

5. Результаты работы программы

Рисунок 5.1 – Результат работы программы

Рисунок 5.2 – Проверка вычислений в MathCad

Заключение

В ходе лабораторной работы освоил способ статического выделения памяти под двумерные массивы. Закрепил навыки матричной алгебры. Составил блок-схему подпрограммы для описания алгоритмов ее работы. Повысил навыки отладки программного кода на С++, трассировки программы и просмотра значений переменных в окне Watch.