Funkcja kwadratowa, program liczący właściwości

0

W moim programie jest zapewne pewien błąd, chciałbym abyście skontorlowali go. Chodzi o to, że program poprawnie wczytuje wartości użytkownika, po pomocy pewnego usera. Teraz wyświetla wszystko co mu kazałem, oprócz wartości, które chcę, czy ktoś mógłby na to rzucić okiem??? Z góry dziękuje.

 

#include <iostream>
#include <cstdio>
#include <math.h>

using namespace std;

int main()
{
	float x,y;								// argument i wartość
	float a,b,c;							        // współczynniki
	float t,u;								// miejsca zerowe  
	float p,q;								// unikalne współczynniki funkcji
	float delta;
	
	// tu user wpisze sobie wartości na potem
	cout<<"	Podaj wybrana postac rownania ""1. ogolna"
    "2. kanonicza 3. iloczynowa"<<endl;
	int postac;
	cin >> postac;
	
		switch(postac) 
		{
    		case 1:
        	cout<<"Podaj a:";
			cin>>a; 
        	cout<<"Podaj b:";
			cin>>b;
        	cout<<"Podaj c:";
			cin>>c;
        	break;
   	 			case 2:
        		cout<<"Podaj a:";
				cin>>a;
        		cout<<"Podaj p:";
				cin>>p;
        		cout<<"Podaj q:";
				cin>>q;
        		break;
   			 		case 3:
        			cout<<"Podaj a:";
					cin>>a;
        			cout<<"Podaj t:";
					cin>>t;
        			cout<<"Podaj u:";
					cin>>u;
        			break;
	}
	
	
	if(a=!0)
	{
		// tu wpiszę sobie wzorki na współczynniki
		p=b/(2*a);
		q=delta/(4*a);
	
		// liczenie delty 
		delta=pow(b,2)-4*a*c;
		cout<<"Delta tego rownania kwadratowego wynosi:";delta; 
	
		if(delta>0)
		{
			
			t=((-b)-sqrt(delta))/2*a;
			u=((-b)+sqrt(delta))/2*a;
			cout<<"Nasze rownanie kwadratowe ma 2 miejsca zerowe" <<endl;
			cout<<"Pierwszemu miejscu zerowemu odpowiada wartosc";t; 
			cout<<"Drugiemu miejscu zerowemu odpowiada wartosc";u;
				
				
		}		else if(delta=0)
				{
				t=(-b)/2*a;
				cout<<"Nasze rownanie kwadratowe ma jedno miejsce zerowe" <<endl;
				cout<<"Jest nim";t;
				}
				    else if(delta<0)
					{
					cout<<"Nasze rownanie kwadratowe nie ma miejsce zerowych"<<endl;
					}
		}
	
	//skrajne wartosci naszej funkcji
	if(a<0)																
	{
		cout<<"Najwieksza wartosc q wynosi";q;"dla p rownego";p;
	}
		else if(a==0)
		{
			cout<<"Nasze rownianie jest liniowe"<<endl;
		}
			else if(a>0)
			{
				cout<<"Najmniejsza wartosc q wynosi";q;"dla p rownego";p;
			}
	
	
	//wypisujemy postaci naszej funkcji
	
	
			if(delta>=0) 
			{
			cout<<"Postac ogolna naszej funkcji to:";		 
			cout<<"y=";a;"x^2 +";b;"x +";c;				
			cout<<"Postac kanoniczna naszej funkcji to:";
			cout<<"y=";a;"(x+";p;")^2 -";q;
			cout<<"Postac iloczynowa naszej funkcji to:";
			cout<<"y=";a;"(x-";t;")(x-";u;")";
		    }			
					else
					{
					cout<<"Postac ogolna naszej funkcji to:";		 
					cout<<"y=";a;"x^2 +";b;"x +";c;			
					cout<<"Postac kanoniczna naszej funkcji to:";
					cout<<"y=";a;"(x+";p;")^2 -";q;
					}
			
			
			
		
		
		
			
	return 0;								
}




1

Nie wyświetla, bo są takie błędy:

cout<<"Delta tego rownania kwadratowego wynosi:";delta;

Jeśli chcesz wyświetlić wartość musisz zastosować << do strumienia.
Czyli wszędzie gdzie jest

cout<<"Wyświetlana wartość";zmienna;

Musi być

cout<<"Wyświetlana wartość"<<zmienna;
0

Dobrze, a więc co proponujesz, jeżeli wiesz jak to zrobić..

1

Cały program jest zły:

  1. Nie zabezpieczasz wejścia przed błędnie wprowadzonymi danymi.
  2. Wykorzystujesz zmienne które nie zostały zainicjalizowane, w instrukcji switch ograniczasz wprowadzenie wartości tylko do odpowiedniej postaci, ale później wykorzystujesz wszystkie zmienne do wyliczenia. Tego się tak nie robi.
  3. To co napisałeś tu: "cout<<"Delta tego rownania kwadratowego wynosi:";delta;" nie robi tego co chcesz. Aby wypisać deltę należy wpisać instrukcję następująco: "cout << "Delta tego rownania kwadratowego wynosi: " << delta;"
1

Taka mała rada. C/C++ nie jest leniwy więc wartości są obliczane w momencie przypisania. A u ciebie nie zawsze idzie ono po kolei. Oprócz tego operator porównania to == a nie =. Poza tym jeśli \Delta jest ujemna to równanie nie ma TRYWIALNYCH miejsc zerowych (czyt. rzeczywistych).

0

Po zastosowaniu waszej instrukcji program działa, a to jest już dobry fakt. Jednak liczy deltę w postaci liczby sratatata e+cośtam. Moglibyście rzucić okiem, czy zapis mój nie jest przypadkiem błędny.

0

Dobra, wszystko działa mi już dobrze... dziękuje wszystkim. Działa..... dziękuje wszystkim za wkład w poprawienie... nie da się ukryć, jednego z moich pierwszych programów.

1

Jeszcze wzór na q to : -delta / 4 * a

2

Jeszcze taka mała uwaga: if(a=!0) - warunek tego ifa zawsze jest spełniony i dodatkowo zmienia wartość a na true czyli prawdopodobnie 1.0.
Zapewne chodziło Ci o if (a != 0)

0

Mam jeszcze pytanko dotyczące warunku, który(póki co) nie figuruje w nowym, dobrym programie. Chodzi więc o fakt, iż f(p)=q, chciałbym przyrównać x do p, za pomoc jakiej funkcji mogę to zrobić, byłbym wdzięczny za jakiś klarowny pomysł.

0

Problem, chyba już ostatni polega na tym, iż funkcja w przypadku a=0 zwraca mi napisz Ta funkcja jest liniowa, jak chciałem, ale również wyświetla wszystkie inne dane w postaci liczb sratatata e+cośtam, lub normalnych rzeczywistych. Fragment programu:

 
if(a<0)
    {
        p=b/(2*a);
        q=-delta/(4*a);
        cout<<"Najwieksza wartosc q wynosi"<<q <<"dla p rownego"<<p;
    }
    else if(a==0)
    {
        cout<<"Nasze rownianie jest liniowe"<<endl;
    }
    else if(a>0)
    {
        p=b/(2*a);
        q=-delta/(4*a);
        cout<<"Najmniejsza wartosc q wynosi"<<q <<"dla p rownego"<<p;
    }


0

Bo wypisuje Ci dokładnie to co jest dalej w programie, rozdziel to na trzy funkcje, bo nie jesteś w stanie tego połączyć w jednej.

#include <iostream>
using namespace std;

struct FunkcjaKwadratowa
{
	static void Ogolna( );
	static void Kanoniczna( );
	static void Iloczynowa( );
};

void FunkcjaKwadratowa::Ogolna( )
{
	float a, b, c;

	do
	{
		if( !cin.good( ) )
		{
			cout << "Liczby powinny byc typu float!\n";
			cin.clear( cin.goodbit );
			cin.ignore( );
		}
		cout << "Podaj a: ";
		cin >> a;
		if( cin.fail( ) )
			continue;
	
		cout << "Podaj b: ";
		cin >> b;
		if( cin.fail( ) )
			continue;

		cout << "Podaj c: ";
		cin >> c;
		if( cin.fail( ) )
			continue;
	} while( !cin.good( ) );

	float delta = b * b - 4 * a * c;

	if( delta > 0 )
	{
		cout << "Pierwsze miejsce zerowe: " << ( -b - delta ) / ( 2 * a ) << endl;
		cout << "Drugie miejsce zerowe: " << ( -b + delta ) / ( 2 * a ) << endl;
	}
	else if( delta == 0 )
		cout << "Miejsce zerowe: " << -b / ( 2 * a );
	else
		cout << "Brak miejsc zerowych.";
}
 
int main()
{
	FunkcjaKwadratowa::Ogolna( );

	getchar( );
	getchar( );
	return 0;                                                                
}

Przykład jednej funkcji, drugą i trzecią napisz samodzielnie. Dodatkowo jak widać podczas wprowadzania danych dodałem sprawdzanie poprawności danych, także jeżeli wpiszesz przez przypadek literę, to program się nie wyłoży, tylko poinformuje, że wpisane są błędne dane i powtórzy operację ;]

0
Immortal Mefisto napisał(a)

a jaśniej?

if(a<0)
    {
        p=b/(2*a);
        q=-delta/(4*a);
        cout<<"Najwieksza wartosc q wynosi"<<q <<"dla p rownego"<<p;
    }
    else if(a==0)
    {
        cout<<"Nasze rownianie jest liniowe"<<endl;
    }
    else if(a>0)
    {
        p=b/(2*a);
        q=-delta/(4*a);
        cout<<"Najmniejsza wartosc q wynosi"<<q <<"dla p rownego"<<p;
    }

Można napisać po prostu:

if(a<0 || a>0)
    {
        p=b/(2*a);
        q=-delta/(4*a);
        cout<< (a<0)?"Najwieksza":"Najmniejsza" << "wartosc q wynosi"<<q <<"dla p rownego"<<p;
    }
    else
    {
        cout<<"Nasze rownianie jest liniowe"<<endl;
    }
0

Poradziłem sobie wstydliwą instrukcją na początku:

 
if(a==0)
{
goto koniec;
}

Oraz na końcu:


if(a==0)
{
koniec:
cout<<"Funkcja nie jest kwadratowa"<<endl;
}

Dosyć mechanicznie, ale dzięki temu opuszcza mi wszystkie niepotrzebne instrukcje i zwraca dla funckji liniowej napis: Funkcja nie jest kwadratowa. Dziękuje wam za pomoc i różne spojrzenia na jedną sprawę.

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