Prawdopodobny błąd w kodzie

0

Zacznę od tego że, robię równania kwadratowe na funkcjach. Program uruchamia się ale nie wyświetla tego co powinien, dla przykładu jeśli delta jest mniejsza od zera to powinien wyświetlić się komunikat o tym, że równanie nie ma pierwiastków, a wyświetla się wynik taki jakby delta była równa 0. Wydaje mi się, że to może być błąd w nawiasach, lecz nie jestem pewny ponieważ dopiero zaczynam programować i się tego uczyć. Dane które pojawiają się żle to :komunikat dla delty<0, wynik dla delty==0 wyświetla się zawsze nawet jeśli delta jest ujemna lub dodatnia, nie wyświetla się wynik x1 oraz x2. Niżej załączam kod programu i mam prośbę, aby ktoś pomógł mi znależć ewentualny błąd w kodzie, lub po prostu błąd zapisu

#include <iostream>
#include <math.h>
using namespace std;

int del (int a,int b,int c,int delta)
{
	delta=b*b-4*a*c;
	cout<<"Delta wynosi "<<delta<<endl;
}
int obliczaniex(int b, int a, int x)
{
	x=-b/(2*a);
	cout<<endl;
	cout<<"X wynosi "<<x<<endl;
}
int obliczaniex1 (int b,int delta,int a,int x1)
{
	x1= (-b-sqrt(delta))/(2*a);
	cout<<"x1 wynosi "<<x1;
}
int obliczaniex2 (int x2,int pom,int x1)
{
	x2=pom/x1;
	cout<<"x2 wynosi "<<x2<<endl;
}
int obliczaniexx2 (int x2,int b,int delta,int a)
{
	x2= (-b+sqrt(delta))/(2*a);
	cout<<"X2 wynosi"<<x2;
}
int obliczaniexx1 (int x1,int pom,int x2)
{
	x1=pom/x2;
	cout<<"x1 wynosi "<<x1;
}
int main ()
{
	int a,b,c,pom,x1,x2,delta,x;
	cout<<"Program wykonuje funkcje kwadratowa "<<endl;
	cout<<"Podaj wartosc a "<<endl;
	cin>>a;
	cout<<"Podaj wartosc b "<<endl;
	cin>>b;
	cout<<"Podaj wartosc c "<<endl;
	cin>>c;
		if (a==0)
		{
		cout<<"To nie jest rownanie kwadratowe"<<endl;
		return 0;
		}
		else
		{
			del (a,b,c,delta);
			
			if (delta<0)
			{
				cout<<"Rownanie nie ma pierwiastkow "<<endl;
			}
			else 
			{
				if (delta==0)
				{
				obliczaniex (b,a,x);
				}
				else
				{
					pom=c/a;
					if (b>0)
					{
						obliczaniex1 (b,delta,a,x1);
						obliczaniex2 (x2,pom,x1);
					}
					else
					{
						obliczaniexx2 (x2,b,delta,a);
						obliczaniexx1 (x1,pom,x2);
					}
				}
			}
		}
		cout<<"x1 wynosi "<< x1<<endl<<"x2 wynosi "<< x2<<endl;
3
int del (int a,int b,int c,int delta)
{
delta=bb-4ac;
cout<<"Delta wynosi "<<delta<<endl;
}

Nic nie zwracasz z tej funkcji.

if (delta<0)

Nigdzie nie przypisujesz do delta

3

dodaj do kompilatora opcje -Werror
https://wandbox.org/permlink/Q2oGgX37WCiPG1vt

rog.cc: In function 'int del(int, int, int, int)':
prog.cc:10:1: error: no return statement in function returning non-void [-Werror=return-type]
   10 | }
      | ^
prog.cc: In function 'int obliczaniex(int, int, int)':
prog.cc:16:1: error: no return statement in function returning non-void [-Werror=return-type]
   16 | }
      | ^
prog.cc: In function 'int obliczaniex1(int, int, int, int)':
prog.cc:21:1: error: no return statement in function returning non-void [-Werror=return-type]
   21 | }
      | ^
prog.cc: In function 'int obliczaniex2(int, int, int)':
prog.cc:26:1: error: no return statement in function returning non-void [-Werror=return-type]
   26 | }
      | ^
prog.cc: In function 'int obliczaniexx2(int, int, int, int)':
prog.cc:31:1: error: no return statement in function returning non-void [-Werror=return-type]
   31 | }
      | ^
prog.cc: In function 'int obliczaniexx1(int, int, int)':
prog.cc:36:1: error: no return statement in function returning non-void [-Werror=return-type]
   36 | }
      | ^
5
int del (int a,int b,int c,int delta)
{
    delta=b*b-4*a*c;
    cout<<"Delta wynosi "<<delta<<endl;
}
  1. Funkcja musi zwracać zadeklarowaną wartość, dodaj return. Do tego celu musisz utworzyć zmienną, do której będziesz podstawiał wynik obliczenia i następnie ją zwracał.
  2. Do czego potrzebna jest zmienna delta przekazywana przez wartość? Musisz się zdecydować czy funkcja ma zwracać wartość, czy też używać zmienną przekazywaną przez referencję.
  3. Staraj się nie używać wewnątrz funkcji "wypisywania" na konsolę cout. Funkcja ma za zadanie wyliczyć deltę i nic więcej. Jeżeli chcesz wyświetlić jej wartość to zrób to w funkcji main.
  4. Do obliczenia delty ( i nie tylko ) użyj typu zmiennoprzecinkowego double. Zmień też typy wartości przekazywanych do funkcji na double.
  5. Staraj się zamieszczać na forum taki kod, który można skompilować. Jak tworzysz program to kompiluj go od czasu do czasu i spróbuj poprawić błędy, które pokazuje kompilator.
0

Przy porównywaniu liczb zmiennoprzecinkowych nie używa się operatora ==, tylko coś w tym stylu:

#include <cmath>
const float EPSILON = 1e-6f;
...
if (delta>=0 && delta <EPSILON) { // Edit: poprawione za poradą AnyKtokolwiek
    // tutaj działania dla delta == 0
}

Do obliczania pierwiastków masz wzory x1=(-b-sqrt(delta))/(2*a) i x2=(-b+sqrt)(delta)/(2*a)), poco co ci tam jeszcze te wzory Vieta? Chyba, że to jest treścią zadania.

Jeżeli to jest c++ to wato skorzystać z std::optional i np std::pair:

#include <optional>
#include <utility>

auto oblicz_pierwiastki(double a, double b, double c)
    -> pair<optional<double>, optional<double>> {
    double delta = ... //oblicz delte

    if (delta < 0) return {{}, {}}; // delta ujemna
    if (delta < EPSILON) return {-b / (2 * a), {}}; // delta == 0
    return {(-b - sqrt(delta)) / (2 * a), (-b + sqrt(delta)) / (2 * a)};
}

int main() {
...
    auto [x1, x2] = oblicz_pierwiastki(a, b, c);
    if (x1 && x2) {
        cout << "dwa pierwiastki: x1=" << *x1 << ", x2=" << *x2 << endl;
    } else if (x1) {
        cout << "jeden pierwiastek: x=" << *x1 << endl;
    } else {
        cout << "brak pierwiastkow" << endl;
    }
...
}

zmienna optional ładnie rzutuje się na bool i w ifie można sprawdzić czy ma jakąś wartość, jeżeli tak to można ją wyłuskać jak ze wskaźnika

1
jvoytech napisał(a):

Przy porównywaniu liczb zmiennoprzecinkowych nie używa się operatora ==, tylko coś w tym stylu:

#include <cmath>
const float EPSILON = 1e-6f;
...
if (fabs(delta) < EPSILON) {
    // tutaj działania dla delta == 0
}

W tym szczególnym przypadku nie fabs(delta), tylko

if(delta>=0 && delta <EPSILON) 

Ujemna delta, choćby mała, to crash

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