Problem z równaniem kwadratowym

0

Witam, mam problem z programem liczącym pierwiastki równania kwadratowego. Problem pojawia sie w przypadku, gdy delta > 0, wychodzą wtedy dziwne wyniki. Na przykład dla danych a= 1, b=2, c=-3 wychodzi x1= 538444096.000000 i x2 = -538444096.000000.

#include <stdio.h>
#include <math.h>

int main()
{
	int a, b, c;
	float delta,pierw;
	float x, x1, x2;
	printf("Podaj wspolczynniki rownania kwadratowego:");
	scanf("%d%d%d", &a, &b, &c);
	delta = (b * b) - (4 * a * c);
	pierw = sqrt(delta);
	if (a == 0) {
		printf("To nie jest rownanie kwadratowe!");
	}
	else {
	if (delta < 0) {
		printf("Brak pierwiastkow!");
	}
	if (delta == 0) {
		x = -b / (2 * a);
		printf("%s %f", "Rownanie ma jedno rozwiazanie rowne:", x);
	}
	if (delta > 0) {
		x1 = (-b + pierw) / (2 * a);
		x2 = (-b - pierw) / (2 * a);
		printf("Rownanie ma dwa rozwiazania:");
		printf("%s %f", "x1 = ",x1);
		printf("%s %f", " x2 = ",x2);

	}
return 0;
}
2

Podany przez Ciebie kod, po naprawieniu błędów składniowych, działa prawidłowo: https://ideone.com/QOBd1a

Btw, na przyszłość: https://stackoverflow.com/help/minimal-reproducible-example - dzięki temu zaoszczędzisz zarówno swój czas, jak i forumowiczów; niejednokrotnie samo przygotowanie odpowiedniego przykładu wystarcza, aby rozwiązać problem ;-)

0

U mnie nadal wyrzuca dziwne wyniki, nawet po przekopiowaniu kodu.

1

Pokaż jaki kod dokładnie uruchamiasz oraz opisz swoje środowisko (system operacyjny, kompilator itd.).

0
#include <stdio.h>
#include <conio.h>
#include <math.h>


void cwiczenie4()
{
    int a, b, c;
    float delta, pierw;
    float x, x1, x2;
    printf("Podaj wspolczynniki rownania kwadratowego:");
    scanf_s("%d%d%d", &a, &b, &c);
    delta = (b * b) - (4 * a * c);
    pierw = sqrt(delta);
    if (a == 0) {
        printf("To nie jest rownanie kwadratowe!");
    }
    else {
        if (delta < 0) {
            printf("Brak pierwiastkow!");
        }
        if (delta == 0) {
            x = -b / (2 * a);
            printf("%s %f", "Rownanie ma jedno rozwiazanie rowne:", x);
        }
        if (delta > 0) {
            x1 = (-b + pierw) / (2 * a);
            x2 = (-b - pierw) / (2 * a);
            printf("Rownanie ma dwa rozwiazania:");
            printf("%s %f", "x1 = ", x1);
            printf("%s %f", " x2 = ", x2);
        }
    }
}

int main()
{
	cwiczenie4();
	return 0;

}

System Windows 10, a kompilator Visual Studio

0

Pierwsze primo: jeśli nie uruchamiasz tego samego kodu (tutaj scanf_s vs scanf, #include <conio.h>, kod wydzielony do odrębnej funkcji), nie pisz "po przekopiowaniu nadal nie działa".

Drugie primo: wrzuć screenshota albo jakieś wideo z tym, jak ten program u Ciebie się zachowuje.

0

Visual Studio nie rozumie scanf i każe używać scanf_s.

0

Tak wyglada program

0

Sprawdź ze współczynnikami wpisanymi na sztywno:

// scanf_s("%d%d%d", &a, &b, &c);
a = 1;
b = 2;
c = -3;
0

Nic to nie zmieniło. Wyniki nadal są niepoprawne.

0

No to pora na dziel-i-zwyciężaj :-) wytnijmy połowę kodu:

int main() {
    int a=1, b=2, c=-3;
    float delta, pierw;
    float x, x1, x2;
//    printf("Podaj wspolczynniki rownania kwadratowego:");
//    scanf_s("%d%d%d", &a, &b, &c);
    delta = (b * b) - (4 * a * c);
    pierw = sqrt(delta);

            x1 = (-b + pierw) / (2 * a);
            x2 = (-b - pierw) / (2 * a);
            printf("Rownanie ma dwa rozwiazania:");
            printf("%s %f", "x1 = ", x1);
            printf("%s %f", " x2 = ", x2);
}
0

Z ciekawości skopiowałem cały kod do nowego czystego pliku projektu i działa poprawnie :/

1
fifi8909 napisał(a):
	if (delta == 0) {

Tak nie porównuje się liczb zmiennoprzecinkowych.
Błędy zaokrągleń powodują, że dla wielu danych tam gdzie powinno wyjść zero, wyjdzie coś w stylu: 1.23e-10.

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