eliminacja gaussa

0

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");

}

0

Mam gdzieś błąd, który sprawia, że wyniki nie są poprawne

Z pomocą tego kodu nie jesteś w stanie uzyskać żadnych wyników, gdyż w ogóle się nie kompiluje.
Na przykład sygnatura deklaracji funkcji

void wczytanieWspolczynnikow(Rownanie niewiadoma);

nie pokrywa się z jej późniejszą definicją.

Popraw wszystkie błędy (wskazane przez kompilator) a następnie sformatuj poprawnie kod w poście, to można będzie porozmawiać o wynikach.

0

Tutaj:
https://algs4.cs.princeton.edu/code/edu/princeton/cs/algs4/GaussianElimination.java.html
Eliminacja Gaussa w Javie. Sprawdź sobie, bo Masx, jak zaznaczyli powyżej, sporo błędów.

0

Na przykład sygnatura deklaracji funkcji

void wczytanieWspolczynnikow(Rownanie niewiadoma);

Poprawiłem, dzięki nie zauważyłem tego wcześniej.

Popraw wszystkie błędy (wskazane przez kompilator) a następnie sformatuj poprawnie kod w poście, to można będzie porozmawiać o wynikach.

Kompilator pokazuje mi tylko jeden błąd, a w zasadzie to ostrzeżenie:

Ostrzeżenie	C6385	Odczyt nieprawidłowych danych z elementu „wspolczynnik->wspolczynniki[n-2]”: rozmiar obszaru do odczytu to „80”, ale odczytana liczba bajtów może wynieść: „-4”.	gauss ost	C:\USERS\LEILA\SOURCE\REPOS\GAUSS OST\GAUSS OST\GAUSS OST.CPP	156		
2

float wyrazWolny[maxRownan][maxRownan] = { {0},{0} }; - od kiedy wyrazWolny jest macierzą? Zawsze był wektorem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1