szukanie zaawansowane
 [ Posty: 13 ] 
Autor Wiadomość
Kobieta Offline
PostNapisane: 12 mar 2010, o 21:26 
Użytkownik

Posty: 40
Lokalizacja: Polska
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
Uniwersytet Wrocławski Instytut Matematyczny - rekrutacja 2019
Góra
Mężczyzna Offline
PostNapisane: 13 mar 2010, o 00:40 
Użytkownik

Posty: 18
Lokalizacja: Wrocław
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ń
Góra
Mężczyzna Offline
PostNapisane: 13 mar 2010, o 00:50 
Użytkownik

Posty: 6607
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.
Góra
Mężczyzna Offline
PostNapisane: 15 mar 2010, o 21:47 
Użytkownik

Posty: 18
Lokalizacja: Wrocław
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...
Góra
Mężczyzna Offline
PostNapisane: 16 mar 2010, o 00:57 
Użytkownik

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

Pozdrawiam.
Góra
Mężczyzna Offline
PostNapisane: 16 mar 2010, o 09:59 
Użytkownik

Posty: 18
Lokalizacja: Wrocław
Nie to miałem na myśli. Uważam, że stosowanie bibliotek w takich przypadkach po prostu mija się z celem...
Góra
Mężczyzna Offline
PostNapisane: 16 mar 2010, o 20:04 
Użytkownik

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

Pozdrawiam.
Góra
Kobieta Offline
PostNapisane: 16 mar 2010, o 20:37 
Użytkownik

Posty: 40
Lokalizacja: Polska
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;
}
Góra
Mężczyzna Offline
PostNapisane: 16 mar 2010, o 20:40 
Gość Specjalny
Avatar użytkownika

Posty: 8687
Lokalizacja: Wrocław
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.
Góra
Kobieta Offline
PostNapisane: 16 mar 2010, o 21:30 
Użytkownik

Posty: 40
Lokalizacja: Polska
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;
}
Góra
Mężczyzna Offline
PostNapisane: 16 mar 2010, o 21:46 
Gość Specjalny
Avatar użytkownika

Posty: 8687
Lokalizacja: Wrocław
Cytuj:
Kod:
1
2
cout<<"Data a:";
cin>>del;

Przecież użytkownik nie wprowadza delty, bo wynika ona ze współczynników a,b,c.

Cytuj:
Kod:
1
x1=(-b-sqrt(del))/2*a;

"2*a" z ostrożności wziąłbym w nawias.
Cytuj:
Kod:
1
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.
Góra
Mężczyzna Offline
PostNapisane: 17 mar 2010, o 01:47 
Użytkownik

Posty: 6607
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#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.
Góra
Kobieta Offline
PostNapisane: 17 mar 2010, o 17:07 
Użytkownik

Posty: 40
Lokalizacja: Polska
Bardzo dziękuje za pomoc :)
Góra
Utwórz nowy temat Odpowiedz w temacie  [ Posty: 13 ] 


 Zobacz podobne tematy
 Tytuł tematu   Autor   Odpowiedzi 
 Instrukcje warunkowe if,else oraz instrukcja wyboru switch  monika2109  10
 Instrukcje warunkowe if,else oraz instrukcja wyboru switch - zadanie 4  monika2109  11
 Instrukcje warunkowe if,else oraz instrukcja wyboru switch - zadanie 2  monika2109  3
 [C++] Dodanie instrukcji switch do programu  darek20  5
 Płyty DVD oraz standardy ich zapisu  meFisto  2
 
Atom [Regulamin Forum] [Instrukcja LaTeX-a] [Poradnik] [F.A.Q.] [Reklama] [Kontakt]
Copyright (C) Karpatka.pl