Цвинтарный Иван 362-2 Лабораторная работа 6
.docxМинистерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра промышленной электроники (ПрЭ)
ОТЧЁТ
по результатам лабораторной работы №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.