#include <stdio.h> // для ввода/вывода
#include <string.h> // для строк
#include <stdlib.h>
#include <time.h>
int isCorrectMatrix(const char type[])
{
char input[100];
while (1)
{
printf("Write sequence number of matrix: ");
fgets(input
, sizeof(input
), stdin
);
int temp, n;
if (sscanf(input
, "%d%n", &temp
, &n
) == 1 && n
== strlen(input
) && temp
> 0) {
return temp;
}
else
{
printf("-------------------------\nIncorrect input!\n"); };
}
}
int determinantFunc(int **matrix, int n) {
// порядок равен 2 => детерминант равен единственному элементу
if (n == 1) {
return matrix[0][0];
}
// порядок равен 2 => используем формулу для 2x2 детерминанта
if (n == 2) {
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
}
// инициализируем переменную для хранения итогового детерминанта
int det = 0;
// инициализируем знак для чередования плюса и минуса в сумме (начинаем с +)
int sign = 1;
// для каждого i создаём подматрицу, учитывая минор, исключая строку 0 и столбец i.
for (int i = 0; i < n; i++) {
// выделяем память для подматрицы размером n x n, исключая строку 0 и столбец i
int **submatrix
= (int **)malloc((n
-1) * sizeof(int *)); for (int k = 0; k < n-1; k++) {
submatrix
[k
] = (int *)malloc((n
-1) * sizeof(int)); }
// заполняем подматрицу: копируем элементы из строк 1 до n-1, пропуская столбец i
for (int row = 1; row < n; row++) {
int col_index = 0; // индекс столбца в подматрице
for (int col = 0; col < n; col++) {
if (col != i) { // пропускаем столбец i
submatrix[row-1][col_index++] = matrix[row][col];
}
}
}
// добавляем к детерминанту: (+1 или -1) * элемент первой строки и столбца i * детерминант подматрицы
det += sign * matrix[0][i] * determinantFunc(submatrix, n-1);
// чередуем -1 и +1
sign = -sign;
for (int k = 0; k < n-1; k++) {
}
}
return det;
}
int CramerMethod(int **matrix, int sequence_number, int *linesResultInSystem)
{
int **delta
= (int **)malloc(sequence_number
* sizeof(int *));
if (delta == NULL)
{
return 1;
}
for (int i = 0; i < sequence_number; i++)
{
delta
[i
] = (int *)malloc(sequence_number
* sizeof(int));
if (delta[i] == NULL)
{
for (int k = 0; k < i; k++)
{
}
return 1;
}
for (int j = 0; j < sequence_number; j++)
{
delta[i][j] = matrix[i][j];
}
}
// главный детерминант
int determinantNumber = determinantFunc(delta, sequence_number);
for (int i = 0; i < sequence_number; i++)
{
}
printf("\n------------------\n\nDeterminant of main delta: %d\n", determinantNumber
);
// остальные детерминанты и высчитывание иксов
if (determinantNumber == 0)
{
printf("\n!!!!!!!!!!!!!!\nInvalid method of Cramer, continue on next method...\n!!!!!!!!!!!!!!\n"); return 1;
}
for (int delta_numeric = 1; delta_numeric <= sequence_number; delta_numeric++)
{
int **delta_another
= (int **)malloc(sequence_number
* sizeof(int *)); for (int i = 0; i < sequence_number; i++)
{
delta_another
[i
] = (int *)malloc(sequence_number
* sizeof(int));
if (delta_another[i] == NULL)
{
for (int k = 0; k < i; k++)
{
}
return 1;
}
for (int j = 0; j < sequence_number; j++)
{
delta_another[i][j] = matrix[i][j];
}
delta_another[i][delta_numeric - 1] = linesResultInSystem[i];
}
int anotherDeterminantNumber = determinantFunc(delta_another, sequence_number);
float mainX;
mainX = (float)anotherDeterminantNumber / determinantNumber;
printf("x%d: %.2f; ", delta_numeric
, mainX
); for (int i = 0; i < sequence_number; i++)
{
}
}
}
int main()
{
// рандом
// порядок матрицы
int sequence_number;
// проверка целочисленности матрицы
sequence_number = isCorrectMatrix("sequence_number");
// объявление матрицы и результата линии в системе матриц
int *linesResultInSystem
= (int *)malloc(sequence_number
* sizeof(int)); int **matrix
= (int **)malloc(sequence_number
* sizeof(int *));
// проверка достатка памяти
if (matrix == NULL)
{
return 1;
}
// наполнение матрицы и результата линии в системе матриц рандомными числами от 0 до 9
for (int i = 0; i < sequence_number; i++)
{
linesResultInSystem
[i
] = rand() % 10; matrix
[i
] = (int *)malloc(sequence_number
* sizeof(int)); if (matrix[i] == NULL)
{
for (int k = 0; k < i; k++)
{
}
return 1;
}
for (int j = 0; j < sequence_number; j++)
{
matrix
[i
][j
] = rand() % 10; }
}
printf("\n-------------\nYour generated matrix: \n");
// вывод системы матриц
for (int i = 0; i < sequence_number; i++)
{
for (int j = 0; j < sequence_number; j++)
{
if (j > 0)
{
printf(" + %dx", matrix
[i
][j
]); }
else
{
}
}
printf(" = %d", linesResultInSystem
[i
]); }
int resultOfCramer = CramerMethod(matrix, sequence_number, linesResultInSystem);
if (resultOfCramer == 0)
{
return 1;
}
for (int i = 0; i < sequence_number; i++) {
}
free(linesResultInSystem
);
return 0;
}