Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <math.h>
- #include <locale.h>
- #include <windows.h>
- #define N 5
- //----------------------------------------------
- //Описание функции
- //----------------------------------------------
- void find_max(int k, double mas[][N + 1], int otv[])
- {
- int i, j, i_max = k, j_max = k;
- double temp;
- //Ищем максимальный по модулю элемент
- for (i = k; i < N; i++)
- for (j = k; j < N; j++)
- if (fabs(mas[i_max][j_max]) < fabs(mas[i][j]))
- {
- i_max = i;
- j_max = j;
- }
- //Переставляем строки
- for (j = k; j < N + 1; j++)
- {
- temp = mas[k][j];
- mas[k][j] = mas[i_max][j];
- mas[i_max][j] = temp;
- }
- //Переставляем столбцы
- for (i = 0; i < N; i++)
- {
- temp = mas[i][k];
- mas[i][k] = mas[i][j_max];
- mas[i][j_max] = temp;
- }
- //Учитываем изменение порядка корней
- i = otv[k];
- otv[k] = otv[j_max];
- otv[j_max] = i;
- }
- void printsys(double mas[][N+1])
- {
- puts("Система:");
- for (int i = 0; i < N; i++)
- {
- for (int j = 0; j < N + 1; j++)
- printf ("%7.2lf ",mas[i][j]);
- puts("");
- }
- }
- int main(void)
- {
- setlocale(LC_ALL, "RUS");
- double mas[N][N + 1]{ {1,0,0,2,6,41}, {-2,3,4,3,3,32}, {2,2,-1,1,3,29}, {3,4,6,3,2,48}, {2,1,5,-1,4,42} };
- double x[N]; //Корни системы
- int otv[N]; //Отвечает за порядок корней
- int i, j, k;
- //Ввод данных
- system("cls");
- //Вывод cистемы
- printsys(mas);
- //Сначала все корни по порядку
- for (i = 0; i < N; i++)
- otv[i] = i;
- //Прямой ход метода Гаусса
- for (k = 0; k < N; k++)
- { //На какой позиции должен стоять главный элемент
- find_max(k, mas, otv); //Установка главного элемента
- if (fabs(mas[k][k]) < 0.0001)
- {
- printf("Система не имеет единственного решения");
- return (0);
- }
- for (j = N; j >= k; j--)
- {
- mas[k][j] /= mas[k][k];
- }
- for (i = k + 1; i < N; i++)
- for (j = N; j >= k; j--)
- {
- mas[i][j] -= mas[k][j] * mas[i][k];
- }
- }
- //Обратный ход
- for (i = 0; i < N; i++)
- x[i] = mas[i][N];
- for (i = N - 2; i >= 0; i--)
- for (j = i + 1; j < N; j++)
- x[i] -= x[j] * mas[i][j];
- //Вывод результата
- printf("Ответ:\n");
- for (i = 0; i < N; i++)
- for (j = 0; j < N; j++)
- if (i == otv[j])
- { //Расставляем корни по порядку
- printf("%f\n", x[j]);
- break;
- }
- return (0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement