Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # include <stdio.h>
- # include <math.h>
- # include <stdlib.h>
- # include <Windows.h>
- # include <locale.h>
- # include <time.h>
- # include <iostream>
- using namespace std;
- void arrprint(float** arr, int m, int n) {
- for (int i = 0; i < m; i++) {
- printf("\n");
- printf("(");
- for (int j = 0; j < n; j++) {
- printf("%6.3f ", arr[i][j]);
- }
- printf(")");
- }
- printf("\n");
- }
- void Umnojenie(float **a, float **b, float **c, float n, float m) {
- for (int i = 0; i < n; i++)
- for (int j = 0; j < m; j++)
- {
- c[i][j] = 0;
- for (int k = 0; k < n; k++)
- c[i][j] += a[i][k] * b[k][j];
- }
- }
- void Sum(float **a, float **b, float **c, float n, float m) {
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++)
- {
- c[i][j] = 0;
- }
- for (int k = 0; k < n; k++) {
- c[i][k] += a[i][k] + b[i][k];
- }
- }
- }
- void Raznost(float **a, float **b, float **c, float n, float m) {
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++)
- {
- c[i][j] = 0;
- }
- for (int k = 0; k < n; k++) {
- c[i][k] += a[i][k] - b[i][k];
- }
- }
- }
- int main()
- {
- setlocale(LC_ALL, "");
- srand(time(NULL));
- int N, M;
- double const eps = 1E-9;
- double det = 1;
- printf("Введите размерность матрицы А\n");
- scanf_s("%d", &N);
- printf("Введите кол-во столбцов в матрице В\n");
- scanf_s("%d", &M);
- float **A = new float*[N];
- for (int i = 0; i < N; i++)
- A[i] = new float[N];
- float **B = new float*[N];
- for (int i = 0; i < N; i++)
- B[i] = new float[M];
- float **X = new float*[N];
- for (int i = 0; i < N; i++)
- X[i] = new float[M];
- float **E = new float*[N];
- for (int i = 0; i < N; i++)
- E[i] = new float[N];
- float **CA = new float*[N];
- for (int i = 0; i < N; i++)
- CA[i] = new float[N];
- float **CE = new float*[N];
- for (int i = 0; i < N; i++)
- CE[i] = new float[N];
- float **T = new float*[N];
- for (int i = 0; i < N; i++)
- T[i] = new float[M];
- float **Q = new float*[N];
- for (int i = 0; i < N; i++)
- Q[i] = new float[M];
- float **P = new float*[N];
- for (int i = 0; i < N; i++)
- P[i] = new float[N];
- float **R = new float*[N];
- for (int i = 0; i < N; i++)
- R[i] = new float[N];
- float **S = new float*[N];
- for (int i = 0; i < N; i++)
- S[i] = new float[N];
- int answer;
- printf("Выберите способ заполнения матриц:\n1.Ручной\n2.Случайная генерация\n");
- scanf_s("%d", &answer);
- switch (answer) {
- case 1: {
- for (int i = 0; i < N; i++) {
- for (int j = 0; j < N; j++) {
- printf("Введите элемент A[%d][%d]\n", i, j);
- cin >> A[i][j];
- }
- }
- for (int i = 0; i < N; i++) {
- for (int j = 0; j < M; j++) {
- printf("Введите элемент B[%d][%d]\n", i, j);
- cin >> B[i][j];
- }
- }
- printf("A = ");
- arrprint(A, N, N);
- printf("B = ");
- arrprint(B, N, M);
- } break;
- case 2: {
- for (int i = 0; i < N; i++) {
- for (int j = 0; j < N; j++)
- A[i][j] = rand() % 20;
- }
- for (int i = 0; i < N; i++) {
- for (int j = 0; j < M; j++)
- B[i][j] = rand() % 20;
- }
- printf("A = ");
- arrprint(A, N, N);
- printf("B = ");
- arrprint(B, N, M);
- } break;
- }
- for (int i = 0; i < N; i++)
- {
- for (int j = 0; j < N; j++) {
- E[i][j] = 0;
- CE[i][j] = 0;
- }
- E[i][i] = 1;
- CE[i][i] = 1;
- }
- for (int i = 0; i < N; i++) {
- for (int j = 0; j < N; j++)
- CA[i][j] = A[i][j];
- }
- for (int i = 0; i < N; i++) {
- int imax = i;
- for (int j = i + 1; j < N; ++j)
- if (fabs(A[j][i]) > fabs(A[imax][i]))
- imax = j;
- if (fabs(A[imax][i]) < eps) {
- det = 0;
- printf("det(A) = ");
- printf("%lf ", det);
- printf("\n");
- printf("Матрица A вырождена");
- printf("\n");
- break;
- }
- swap(A[i], A[imax]);
- swap(E[i], E[imax]);
- if (i != imax)
- det = -det;
- float a = A[i][i];
- for (int j = i + 1; j < N; j++)
- {
- float b = A[j][i];
- for (int k = 0; k < N; k++)
- {
- A[j][k] -= A[i][k] * b / a;
- E[j][k] -= E[i][k] * b / a;
- }
- }
- }
- if (det != 0) {
- for (int i = 0; i < N; i++)
- det *= A[i][i];
- printf("det(A) = ");
- printf("%lf ", det);
- printf("\n");
- for (int i = 0; i < N; i++) {
- float a = A[i][i];
- for (int j = 0; j < N; j++) {
- A[i][j] = A[i][j] / a;
- E[i][j] = E[i][j] / a;
- }
- }
- for (int j = N - 1; j > 0; j--) {
- for (int i = j - 1; i >= 0; i--) {
- float a = A[i][j];
- for (int k = N - 1; k >= 0; k--) {
- A[i][k] = A[i][k] - A[j][k] * a;
- E[i][k] = E[i][k] - E[j][k] * a;
- }
- }
- }
- printf("obr(A) = ");
- arrprint(E, N, N);
- printf("X = obr(A) * B\nX =");
- Umnojenie(E, B, X, N, M);
- arrprint(X, N, M);
- printf("Проверка\nA * X =");
- Umnojenie(CA, X, T, N, M);
- arrprint(T, N, M);
- printf("A * X - B =");
- Raznost(T, B, Q, N, M);
- arrprint(Q, N, M);
- printf("A * obr(A) =");
- Umnojenie(CA, E, P, N, N);
- arrprint(P, N, N);
- printf("obr(A) * A =");
- Umnojenie(E, CA, R, N, N);
- arrprint(R, N, N);
- printf("A + E =");
- Sum(CA, CE, S, N, N);
- arrprint(S, N, N);
- }
- for (int i = 0; i < N; i++)
- delete[] A[i];
- delete[] A;
- for (int i = 0; i < N; i++)
- delete[] B[i];
- delete[] B;
- for (int i = 0; i < N; i++)
- delete[] X[i];
- delete[] X;
- for (int i = 0; i < N; i++)
- delete[] E[i];
- delete[] E;
- for (int i = 0; i < N; i++)
- delete[] CA[i];
- delete[] CA;
- for (int i = 0; i < N; i++)
- delete[] CE[i];
- delete[] CE;
- for (int i = 0; i < N; i++)
- delete[] T[i];
- delete[] T;
- for (int i = 0; i < N; i++)
- delete[] Q[i];
- delete[] Q;
- for (int i = 0; i < N; i++)
- delete[] P[i];
- delete[] P;
- for (int i = 0; i < N; i++)
- delete[] R[i];
- delete[] R;
- for (int i = 0; i < N; i++)
- delete[] S[i];
- delete[] S;
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement