
Смирнова_Мария_2370_Лабораторная_8
.docxСмирнова Мария 2370 Задание №8
Преобразовать программу из задания №7 таким образом, чтобы размерности матриц могли вводиться с клавиатуры.
Примечание:
Задача связана с использованием динамических массивов. При решении необходимо определить порядок пересчета двумерных индексов элементов в линейный индекс, определяющий позицию элемента в динамическом массиве.
Программа:
#include <iostream>
using namespace std;
void Matrix_In(double* Matrx, int x, int y) {
for (int i=0;i < x;i++) {
for (int j=0;j < y;j++) {
cin >> Matrx[i * y + j];}}}
void Matrix_Out(double* Matrx, int x, int y) {
for (int i = 0;i < x;i++) {
for (int j = 0;j < y;j++) {
cout << Matrx[i * y + j] << ' ';}
cout << endl;}}
void Matrix_End(double* Matrx1, double* Matrx2, double* Matrx3, int x1, int y1, int x2, int y2) {
if (y1 != x2) return;
for (int i = 0;i < x1;i++) {
for (int j = 0;j < y2;j++) {
Matrx3[i * y2 + j] = 0;
for (int k = 0;k < x1;k++) {
Matrx3[i * y2 + j] += Matrx1[i * y1 + k] * Matrx2[k * x2 + j];}}}}
int main()
{
setlocale(LC_ALL, "Rus");
int x1, y1, n1;
cout << "Первая матрица. Введите количество строк: ";
cin >> x1;
cout << "Первая матрица. Введите количество столбцев: ";
cin >> y1;
int x2, y2, n2;
cout << "Вторая матрица. Введите количество строк: ";
cin >> x2;
cout << "Вторая матрица. Введите количество столбцев: ";
cin >> y2;
double* Matrx1 = (double*)malloc(x1 * y1 * sizeof(double));
double* Matrx2 = (double*)malloc(x2 * y2 * sizeof(double));
double* Matrx3 = (double*)malloc(y1 * x2 * sizeof(double));
if (Matrx1 == 0 || Matrx2 == 0 || Matrx3 == 0)
return -1;
if (x1 != y1 and x2 != y2 and y1 != x2) {
cout << "В таких матрицах нет смысла. Попытайтесь придумать новые, которые хотя бы одному заданию подходят." << endl;
return -1;
}
cout << "Введите первую матрицу: " << endl;
Matrix_In(Matrx1, x1, y1);
cout << "Введите вторую матрицу: " << endl;
Matrix_In(Matrx2, x2, y2);
if (y1 != x2) {
cout << "Перемножение нeвозможно!" << endl;
}
if (y1 == x2) {
cout << "Умножение первой и второй матрицы: " << endl;
Matrix_End(Matrx1, Matrx2, Matrx3, x1, y1, x2, y2);
Matrix_Out(Matrx3, x1, y2);
}
if (x1 == y1) {
cout << "Первая матрица квадратная. Возведение в степень возможно." << endl;
cout << "Введите степень для первой матрицы: ";
cin >> n1;
double* MatrxN1 = Matrx1;
if (n1 > 0) {
for (int i = 1;i < n1;i++) {
double* B = (double*)malloc(x1 * y1 * sizeof(double));
Matrix_End(Matrx1, MatrxN1, B, x1, x1, x1, x1);
MatrxN1 = B;
}
Matrix_Out(MatrxN1, x1, x1);
free(MatrxN1);
}
if (n1 <= 0) {
cout << "Возведение в такую степень невозможно" << endl;
}
}
if (x1!=y1){
cout << "Первая матрица не квадратная. Возведение в степень невозможно." << endl;
}
if (x2 == y2) {
cout << "Вторая матрица квадратная. Возведение в степень возможно." << endl;
cout << "Введите степень для второй матрицы: ";
cin >> n2;
double* MatrxN2 = Matrx2;
if (n2 > 0) {
for (int i = 1;i < n2;i++) {
double* B = (double*)malloc(x2 * y2 * sizeof(double));
Matrix_End(Matrx2, MatrxN2, B, x2, x2, x2, x2);
MatrxN2 = B;
}
Matrix_Out(MatrxN2, x2, x2);
free(MatrxN2);
}
if (n2 <= 0) {
cout << "Возведение в такую степень невозможно" << endl;
}
}
if (x2!=y2){
cout << "Вторая матрица не квадратная. Возведение в степень невозможно." << endl;
}
free(Matrx1);
free(Matrx2);
free(Matrx3);
return 0;
}
Р
езультаты
программы:
Б
лок-схема: