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

Смирнова_Мария_2370_Лабораторная_8

.docx
Скачиваний:
1
Добавлен:
05.12.2024
Размер:
173.25 Кб
Скачать

Смирнова Мария 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;

}

Р езультаты программы:

Б лок-схема: