Блок-схема процедуры ввода данных

 

Рисунок 1 - Блок-схема процедуры ввода данных

 

Блок-схема метода Жордана

 

Рисунок 2 - Блок-схема метода Жордана


Алгоритм основной программы

 

 

Рисунок 3 - Тело основной программы


 

ТЕКСТ ПРОГРАММЫ И РЕЗУЛЬТАТ ВЫПОЛНЕНИЯ

Текст программы

 

#include<stdio.h>

 

float a[100][100], a_temp[100][100], nev[100], x[100];

intn,where[100];

 

// Процедура ввода данных

void input() {

inti, j;

FILE * fin = fopen("input.txt", "r"); // Открываем файл для ввода данных

fscanf(fin, "%d", &n); // Ввод размера матрицы

for (i = 0; i< n; i++) {

for (j = 0; j < n + 1; j++) {

fscanf(fin, "%f", &a[i][j]); // Ввод матрицы A и последний элемент - свободный коэффициент

}

}

}

 

// Процедура вычисления корней

intjordan_gauss() {

inti, j, k, col, row;

for (i = 0; i< n; i++) {

where[i] = -1; // Инициализируеммассив where

for (j = 0; j <= n; j++) a_temp[i][j] = a[i][j]; // Икопируемматрицу

}

for (col = 0,row = 0; col< n &&row< n; col++) { // Цикл, в котором будем выполнять все преобразования

intsel = row; // Выбираем очередную строку

for (i = row; i < n; i++) // Цикл по всем строкам ниже

if (fabs(a[i][col]) >fabs(a[sel][col])) sel = i; // Выбираем максимальный элемент на позиции col среди всех строк

if (fabs(a[sel][col]) < 1e-5) continue; // Если максимальный элемент равен 0, то переходим к следующей итерации

for (i = col; i <= n; i++) { // Цикл по всем оставшимся столбцам

float t = a[sel][i]; // Меняем элементы стркоsel и row в этих столбцах

a[sel][i] = a[row][i];

a[row][i] = t;

}

where[col] = row; // Для столбца colсоохраняем номер строки, в которой он был преобразован

for (i = 0; i < n; i++) // Цикл по всем строкам

if (i!= row) { // выбираем только строки, которые не row

float c = a[i][col] / a[row][col]; // Вычисляемкоэффициент

for (j = col; j <= n; j++) // И все элементы строки начиная от col заменяем на новое значение, чтобы появились 0

a[i][j] -= a[row][j] * c;

}

row++; // Переходим к следующей строке

}

for (i = 0; i< n; i++)

if (where[i]!= -1)

x[i] = a[where[i]][n] / a[where[i]][i]; // Вычисляемответы

for (i = 0; i < n; i++) { // Делаем проверку, подходит ли это решение

floatsum = 0; // набранная сумма

for (j = 0; j < n; j++) // Цикл по всем найденным иксам

sum += x[j] * a[i][j]; // Подставляем значение в формулу

if (fabs(sum - a[i][n]) > 1e-5) return 0; // Если разница между полученным значением и действительным больше заданной точности, то решение не подходит

}

for (i = 0; i < n; i++)

if (where[i] == -1) return 2; // Если какой-то столбец не задействован, то есть он нулевой, то имеется множество решений

return 1;

}

 

// Тело основной программы. Вызываются нужные методы и выводятся данные

void main() {

input();

inti, j;

int verdict = jordan_gauss(); // ВызовметодаЖордана-Гаусса

printf("Initial system: \n");

for (i = 0; i< n; i++) {

for (j = 0; j <= n; j++) printf("%.2f\t", a_temp[i][j]); // Выводисходнойсистемы

printf("\n");

}

if (verdict == 0) { // Из функции пришел 0 - нет решения

printf("Noroots\n");

} elseif (verdict == 1) { // из функции пришел 1 - единственное решение

printf("Found roots: \n");

for (i = 0; i< n; i++) printf("x[%d] = %.4f\n", i + 1, x[i]); // Выводимкорни

printf("Error vector: \n");

for (i = n - 1; i>= 0; i--) { // Считаемошибку

float err = a_temp[i][n];

for (j = 0; j < n; j++) err -= a_temp[i][j] * x[j];

printf("%f\t", err);

}

} else { // Иначе - многорешений

printf("Infinite number of solutions\n");

}

}

 

Результат выполнения

 

Рисунок 4 - Результат выполнения на тесте №1

 

Рисунок 5 - Результат выполнения на тесте №2


ЗАКЛЮЧЕНИЕ

 

В ходе выполнения курсового проекта была разработана программа на языке С для решения линейных уравнений n-ного порядка методом Жордана и выполняющая проверку решения, если оно найдено. Была сформулирована математическая формализация задачи. Также была составлена блок-схема алгоритма.

 

 


 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: