Mam gdzieś błąd, który sprawia, że wyniki nie są poprawne, ten sam kod bez dzielenia go na struktury działa czy ktoś może mi wskazać co robię źle?
#include <stdio.h>
#include <math.h>
const int maxRownan = 20;
struct Rownanie
{
int liczbaNiewiadomych = 0;
float wspolczynniki[maxRownan][maxRownan] = {{0},{0}};
float wyrazWolny[maxRownan][maxRownan] = { {0},{0} };
};
struct Rownania
{
int liczbaRownan = 0;
struct Rownanie A[maxRownan][maxRownan] = { {0},{0} };
};
void niewiadome();
void wczytanieWspolczynnikow(Rownanie niewiadoma);
void wczytywanieRownan(Rownanie wspolczynnik, Rownanie* wyraz, Rownanie* niewiadoma);
void macierzSchotkowa(Rownanie* wspolczynnik, Rownanie* wyraz, Rownanie* niewiadoma);
//------------------------------------------------------------------------
int main(Rownanie* wspolczynnik, Rownanie* wyraz, Rownanie* niewiadoma)
{
niewiadome();
return(0);
}
//------------------------------------------------------------------------
void niewiadome()
{
int n = 0;
printf("Rozwiazywanie ukladu rownan liniowych.\n(Rownan moze byc maksymalnie 20.)");
printf("\nPodaj ilosc niewiadomych: ");
scanf_s("%d", &n);
if (n < 20 && n > 0)
{
Rownanie niewiadoma;
niewiadoma.liczbaNiewiadomych = *&n;
wczytanieWspolczynnikow(&niewiadoma);
}
}
void wczytanieWspolczynnikow(Rownanie *niewiadoma)
{
int n = niewiadoma->liczbaNiewiadomych;
struct Rownanie wspolczynnik;
struct Rownanie wyraz;
for (int i = 0; i < n; i++)
{
printf("\nPodaj wartosci wspolczynnikow i wyraz wolny dla rownania %d:\n", i+1);
for (int j = 0; j < (n + 1); j++)
{
if (j < n)
{
printf("Rownanie %d niewiadoma [%d]: ",i+1 , j+1);
scanf_s("%f", &wspolczynnik.wspolczynniki[i][j]);
}
else
{
printf("Rownianie %d Wyraz wolny: ",i+1);
scanf_s("%f", &wspolczynnik.wspolczynniki[i][j]);
}
}
}
niewiadoma->liczbaNiewiadomych = *&n;
wczytywanieRownan(&wspolczynnik, &wyraz,niewiadoma);
macierzSchotkowa(&wspolczynnik, &wyraz,niewiadoma);
}
void wczytywanieRownan(Rownanie* wspolczynnik, Rownanie* wyraz, Rownanie* niewiadoma)
{
int n = niewiadoma->liczbaNiewiadomych;
printf("\n");
for (int i = 0; i < n; i++)
{
for (int j = 0, k = 1; j < (n + 1); j++, k++)
{
if (j < n)
{
if (wspolczynnik->wspolczynniki[i][j] != 0)
{
printf("%.f x[%d] ", wspolczynnik->wspolczynniki[i][j], k);
int h = 0;
for (int l = j;l < n - 1 && h < 1;l++)
{
if (wspolczynnik->wspolczynniki[i][j + 1] > 0)
{
printf("+ ");
h++;
}
else
{
h++;
}
}
}
}
else
{
printf("= %.f", wspolczynnik->wspolczynniki[i][j]);
printf("\n");
}
}
}
}
void macierzSchotkowa(Rownanie* wspolczynnik, Rownanie* wyraz, Rownanie* niewiadoma)
{
int n = niewiadoma->liczbaNiewiadomych;
float c=0, x[20];
printf("\n");
for (int i = 0; i < 20; i++)
{
x[i] = 0;
}
for (int i = 1; i < n; i++)
{
for (int j = 1; j <= n; j++)
{
if (i > j)
{
c = wspolczynnik->wspolczynniki[i][j] / wspolczynnik->wspolczynniki[j][j];
for (int k = 1; k <= n + 1; k++)
{
wspolczynnik->wspolczynniki[i][k] = wspolczynnik->wspolczynniki[i][k] - c * wspolczynnik->wspolczynniki[j][k];
}
}
}
}
x[n] = wspolczynnik->wspolczynniki[n-2][n - 1] / wspolczynnik->wspolczynniki[n-2][n-2];
for (int i = n - 1; i > 1; i--)
{
float sum = 0.0;
for (int j = i + 1; j <= n; j++)
{
sum = sum + wspolczynnik->wspolczynniki[i][j] * x[j];
}
x[i] = (wspolczynnik->wspolczynniki[i][n] - sum) / wspolczynnik->wspolczynniki[i][i];
}
printf("Rozwiazanie: \n");
for (int i = 1; i <= n; i++)
{
if (x[i] != INFINITY)
{
printf("\nx[%d] = %.f\t", i, x[i]);
}
else
{
printf("Brak rozwiązania.\n");
}
}
printf("\n");
}