Instrukcje warunkowe if,else oraz instrukcja wyboru switch

monika2109
Użytkownik
Użytkownik
Posty: 40
Rejestracja: 10 mar 2010, o 17:26
Płeć: Kobieta
Lokalizacja: Polska
Podziękował: 2 razy

Instrukcje warunkowe if,else oraz instrukcja wyboru switch

Post autor: monika2109 »

Napisz program, który dla danych współczynników a,b,c trójmianu kwadratowego wyznaczy jego pierwiastki. Rozstrzygnij wszystkie możliwe przypadki. W zadaniu wykorzystaj funkcję sqrt() z biblioteki math.h
robciu663
Użytkownik
Użytkownik
Posty: 18
Rejestracja: 15 gru 2009, o 07:35
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 2 razy

Instrukcje warunkowe if,else oraz instrukcja wyboru switch

Post autor: robciu663 »

No to gdzie tutaj problem ?

1. Do zmiennej delta przypisujesz wartość b^{2} - 4ac [masz tutaj wykorzystanie funkcji sqrt, która podnosi do kwadratu [w tym przypadku b], choć w sumie trochę bez sensu marnować pamięć... Ale skoro dane jest w zadaniu...]
2. Sprawdzasz, czy delta jest:
a) większa od zera - masz dwa pierwiastki
b) równa zeru- jeden pierwiastek (podwójny)
c) mniejsza- zwraca brak rozwiązań
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Instrukcje warunkowe if,else oraz instrukcja wyboru switch

Post autor: soku11 »

Funkcja sqrt() liczy pierwiastek kwadratowy z nieujemnej liczby, a nie potęguje. Zresztą żeby policzyć kwadrat stosuje się po prostu b*b, a nie korzysta z dość rozbudowanej i czasochłonnej funkcji pow(). I co ma marnowanie pamięci do wartości delty? I czy te dodatkowe 4 bajty (najprawdopodobniej) robią jakąś różnicę?

Pozdrawiam.
robciu663
Użytkownik
Użytkownik
Posty: 18
Rejestracja: 15 gru 2009, o 07:35
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 2 razy

Instrukcje warunkowe if,else oraz instrukcja wyboru switch

Post autor: robciu663 »

Oj, sorry, zmęczony byłem

Tak, robi różnicę... Bo w szkole uczy się myślenia w programowaniu. Przy małych projektach to jest epsilon różnicy, ale przy większych już się robi bałagan...
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Instrukcje warunkowe if,else oraz instrukcja wyboru switch

Post autor: soku11 »

W czym się robi bałagan? Czemu uważasz, że zmienna lokalna jest taka zła i wprowadza jakiś narzut?

Pozdrawiam.
robciu663
Użytkownik
Użytkownik
Posty: 18
Rejestracja: 15 gru 2009, o 07:35
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 2 razy

Instrukcje warunkowe if,else oraz instrukcja wyboru switch

Post autor: robciu663 »

Nie to miałem na myśli. Uważam, że stosowanie bibliotek w takich przypadkach po prostu mija się z celem...
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Instrukcje warunkowe if,else oraz instrukcja wyboru switch

Post autor: soku11 »

No to jak chcesz obliczyć pierwiastek bez użycia funkcji sqrt() z math? Napisać własną funkcję do tego?

Pozdrawiam.
monika2109
Użytkownik
Użytkownik
Posty: 40
Rejestracja: 10 mar 2010, o 17:26
Płeć: Kobieta
Lokalizacja: Polska
Podziękował: 2 razy

Instrukcje warunkowe if,else oraz instrukcja wyboru switch

Post autor: monika2109 »

A czy to jest dobrze?


#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{cout<<"Podaj a:";
float a,b,c,del;
cin>>a;
cout<<"Podaj b:";
cin>>b;
cout<<"Podaj c:";
cin>>c;
cout<<"Data a:";
cin>>del;
del=b*b+(4*a*c)
if(del>0)
{float x1,x2;
x1=(-b-sqrt(del))/2*a;
x2=(-b*sqrt(del))/2*a;
cout<<"Rozwiazanie:"<<x1<<x2<<endl;
}else
if(del<0)
{cout<<"Brak rozwiazan.";
}else
if(del==0)
{float x0;
x0=-b/2*a;
cout<<"Rozwiazanie:"<<x0<<endl;
system("PAUSE");
return 0;
}
Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

Instrukcje warunkowe if,else oraz instrukcja wyboru switch

Post autor: miki999 »

Na pewno nie jest dobrze, bo nie ma biblioteki math.h.

Wzór na deltę zły.


Poza tym wystarczy ściągnąć jakiś kompilator i sprawdzić czy działa- jeżeli nie to szukać błędów.



Pozdrawiam.
monika2109
Użytkownik
Użytkownik
Posty: 40
Rejestracja: 10 mar 2010, o 17:26
Płeć: Kobieta
Lokalizacja: Polska
Podziękował: 2 razy

Instrukcje warunkowe if,else oraz instrukcja wyboru switch

Post autor: monika2109 »

Poprawiłam to tak ale dalej nic


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

int main(int argc, char *argv[])
{cout<<"Podaj a:";
float a,b,c,del;
cin>>a;
cout<<"Podaj b:";
cin>>b;
cout<<"Podaj c:";
cin>>c;
cout<<"Data a:";
cin>>del;
del=b*b-(4*a*c);
if(del>0)
{float x1,x2;
x1=(-b-sqrt(del))/2*a;
x2=(-b+sqrt(del))/2*a;
cout<<"Rozwiazanie:"<<x1<<x2<<endl;
}else
if(del<0)
{cout<<"Brak rozwiazan";
}else
if(del==0)
{float x0;
x0=-b/2*a;
cout<<"Rozwiazanie:"<<x0<<endl;
system("PAUSE");
return 0;
}
Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

Instrukcje warunkowe if,else oraz instrukcja wyboru switch

Post autor: miki999 »

Kod: Zaznacz cały

cout<<"Data a:";
cin>>del;
Przecież użytkownik nie wprowadza delty, bo wynika ona ze współczynników \(\displaystyle{ a,b,c}\).

Kod: Zaznacz cały

x1=(-b-sqrt(del))/2*a;
"2*a" z ostrożności wziąłbym w nawias.

Kod: Zaznacz cały

cout<<"Rozwiazanie:"<<x1<<x2<<endl;
Może jakąś spację i bądź przecinek pierdyknąć?

Instrukcje do "else" zaznaczyłbym klamrami- nawet jeżeli nie dla sprawniejszego działania, to dla lepszej czytelności.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Instrukcje warunkowe if,else oraz instrukcja wyboru switch

Post autor: soku11 »

Warto jeszcze wspomnieć o dokładności obliczeń na liczbach typu float i double. Nie za bardzo działa przyrównywanie do 0, bo liczba może wynosić 1.23e-38, co jest różne od 0.0f. Tak więc poprawiony kod dla potomności:

Kod: Zaznacz cały

#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;

static const float EPSILON=0.00001f;


int main()
{
  float a=0.0f;
  float b=0.0f;
  float c=0.0f;

  cout<<"Podaj a: ";
  cin>>a;
  cout<<"Podaj b: ";
  cin>>b;
  cout<<"Podaj c: ";
  cin>>c;

  float det=b*b-(4*a*c);
  if(det>EPSILON)
  {
    float x1=(-b-sqrt(det))/(2*a);
    float x2=(-b+sqrt(det))/(2*a);

    cout<<"Rozwiazania: "<<x1<<" "<<x2<<'\n';
  }
  else if(det<-EPSILON)
  {
    cout<<"Brak rozwiazan\n";
  }
  else  // det==0
  {
    float x0=-b/(2*a);
    cout<<"Rozwiazanie podwojne: "<<x0<<'\n';
  }


  return EXIT_SUCCESS;
}
Pozdrawiam.
monika2109
Użytkownik
Użytkownik
Posty: 40
Rejestracja: 10 mar 2010, o 17:26
Płeć: Kobieta
Lokalizacja: Polska
Podziękował: 2 razy

Instrukcje warunkowe if,else oraz instrukcja wyboru switch

Post autor: monika2109 »

Bardzo dziękuje za pomoc
ODPOWIEDZ