funkcja kwadratowa 5730 10

O temacie

Autor Trout

Zaczęty 7.09.2011 roku

Wyświetleń 5730

Odpowiedzi 10

Trout

Trout

Użytkownicy
posty50
Propsy1
  • Użytkownicy
Witam,
chce napisac program obliczajacy miejsca zerowe funkcji kwadratowej i napisałem takie cos:


#include<iostream>
#include<conio.h>
#include<cmath>
using namespace std;
float pow(float base, float exponent);
float delta, delta2;
float row(float a, float b, float c)
{
    if (a==0 && b!=0) return -c/b;
    if (a!=0)
    {
         delta=pow(b,2) - 4*a*c; delta2=sqrt(delta);
         if (delta>0) return (-b-delta2)/(2*a) && (-b+delta2)/(2*a);
         if (delta==0) return -b/(2*a);
         }
}
int main()
{
    float a,b,c;
    cout<<"Podaj wspolczynnik a: ";
    cin>>a;
    cout<<"Podaj wspolczynnik b: ";
    cin>>b;
    cout<<"Podaj wspolczynnik c: ";
    cin>>c;
    if (a==0)
             if (b==0)
                      if (c==0) cout<<"Rownanie posiada nieskonczenie wiele rozwiazan. "<<endl;
                      else cout<<"Rownanie nie posiada rozwiazania. "<<endl;
    cout<<"Rozwiazanie: "<<row(a,b,c)<<endl;
    getch();
    return 0;
}

Jednak wystąpiły dwa problemy:
1. Wychodzi mi ciagle wynik 5.3465e+036
2. Oraz nie wiem jak zrobic zeby dla delty ujemnej wyswietlał sie napis, ze dane rownanie nie ma rozwiazan
No i czy przez zastosowanie koniunkcji zwroci mi dwie wartosci? (13 linijka)

Z góry dzięki
Pozdrawiam
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
#include<iostream>
#include<conio.h>
#include<cmath>
using namespace std;
float pow(float base, float exponent);
float delta, delta2;
void row(float a, float b, float c)
{
    if (a==0 && b!=0) return -c/b;
    if (a!=0)
    {
         delta=pow(b,2) - 4*a*c; delta2=sqrt(delta);
         if (delta>0) cout<<"Rozwiazanie:"<< (-b-delta2)/(2*a) <<"i"<< (-b+delta2)/(2*a)<<endl;
         if (delta==0) cout<<"Rozwiazanie:"<< -b/(2*a)<<endl;
         if (delta<0) cout<<"Dane rownanie nie ma rozwiazan"<<endl;
         }
}
int main()
{
    float a,b,c;
    cout<<"Podaj wspolczynnik a: ";
    cin>>a;
    cout<<"Podaj wspolczynnik b: ";
    cin>>b;
    cout<<"Podaj wspolczynnik c: ";
    cin>>c;
    if (a==0)
             if (b==0)
                      if (c==0) cout<<"Rownanie posiada nieskonczenie wiele rozwiazan. "<<endl;
                      else cout<<"Rownanie nie posiada rozwiazania. "<<endl;
    row(a,b,c);
    getch();
    return 0;
}

Teraz powinno reagować na ujemną deltę.

Nie biorę odpowiedzialności za niepoprawność/nieprofesjonalność powyższego kodu. Nie jestem zbyt dobry w te klocki jak na razie, poza tym pisałem kod od razu w poście :) .

Błąd z tym dziwnym wynikiem może był spowodowany tym, że przy delcie dodatniej kazałeś mu zwracać dwa obiekty a nie jeden.
 
Popisuje się ciągle menda jedna...

Trout

Trout

Użytkownicy
posty50
Propsy1
  • Użytkownicy
Dzięki, działa teraz  :wink:  
Tylko jeszcze pytanie czy nie dałoby sie tego jakos zrobic z returnami?
 

Tomek

Tomek

Użytkownicy
Kapitan Rob
posty2181
Propsy2189
ProfesjaNierób
  • Użytkownicy
  • Kapitan Rob
że też o tym nie pomyślałem w tamtym roku. props za pomysł
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Dzięki, działa teraz  :wink:  
Tylko jeszcze pytanie czy nie dałoby sie tego jakos zrobic z returnami?

Na pewno byłoby ładniej. Tyle, że musiałbyś pewnie stworzyć structa złożonego z boola i floata czy może nawet 2 booli i 2 floatów. Jeden bool odpowiadający za to czy jest rozwiązanie a drugi czy jest drugie rozwiązanie.boola i dwóch floatów. Bool jest odpowiedzialny za to czy w ogóle są rozwiązania a floaty są perwiastkami równania. W przypadku gdy są równe to znaczy, że jest tylko jedno rozwiązanie.

Pewnie można byłoby i tak zrobić to ładniej, ale o tej porze nic mi lepszego do głowy nie wpadło.
 
Popisuje się ciągle menda jedna...

Trout

Trout

Użytkownicy
posty50
Propsy1
  • Użytkownicy

Trout

funkcja kwadratowa
#5 2011-09-09, 15:58(Ostatnia zmiana: 2011-09-09, 16:00)
A nie dałoby siż jakoś stworzyć structa string float i bezpośrednio stringa zwrócić?
Ja próbowałem i tak nie działa ale może po prostu źle to robię. (w sensie ze z tym stringiem próbowałem)
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja

Adanos
Administrator

funkcja kwadratowa
#6 2011-09-09, 17:21(Ostatnia zmiana: 2011-09-09, 17:23)
Żadne "stwarzać structa", tylko zadeklarować strukturę. Struktura to złożony typ danych i może być różnego typu: http://pl.wikipedia.org/wiki/Struktura_%28programowanie%29

Skoro chcesz, żeby funkcja zwracała ci napis, to po co ci struktura do tego?

Może napisz coś więcej, co chcesz zwracać, daj ten kod ze strukturą, który ci nie działa.

Trout

Trout

Użytkownicy
posty50
Propsy1
  • Użytkownicy
Żadne "stwarzać structa", tylko zadeklarować strukturę. Struktura to złożony typ danych i może być różnego typu: http://pl.wikipedia.org/wiki/Struktura_%28programowanie%29

Skoro chcesz, żeby funkcja zwracała ci napis, to po co ci struktura do tego?

Może napisz coś więcej, co chcesz zwracać, daj ten kod ze strukturą, który ci nie działa.

Chciałbym, aby wszystkie wyniki zwracał poprzez funkcje return. Próbowałem to zrobić i pewnie wpędzałem się z błędu w błąd, więc jest ich pewnie sporo.

#include<iostream>
#include<conio.h>
#include<cmath>
#include<string>
using namespace std;
struct kwadrat
{
       string napis;
       float liczba;
       };
float pow(float base, float exponent);
float delta, delta2;
kwadrat s;
kwadrat row(float a, float b, float c)
{
    if (a==0 && b!=0) return -c/b;
    if (a!=0)
    {
         delta=pow(b,2) - 4*a*c; delta2=sqrt(delta);
         if (delta>0) return (-b-delta2)/(2*a)&&(-b+delta2)/(2*a);
         if (delta==0) return -b/(2*a);
         if (delta<0)
         {
                      s.napis="Dane rownanie nie posiada rozwiazania. ";
                      return s;
                      }
         }
         if (a==0)
             if (b==0)
                      if (c==0)
                      {
                                s.napis="Rownanie posiada nieskonczenie wiele rozwiazan. ";
                                return s;
                                }
                      else
                      {
                           s.napis="Rownanie nie posiada rozwiazania. ";
                           return s;
                           }
}
int main()
{
    float a,b,c;
    cout<<"Podaj wspolczynnik a: ";
    cin>>a;
    cout<<"Podaj wspolczynnik b: ";
    cin>>b;
    cout<<"Podaj wspolczynnik c: ";
    cin>>c;
    cout<<"Rozwiazanie: "<<row(a,b,c);
    getch();
    return 0;
}
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Tak?
#include<iostream>
#include<conio.h>
#include<cmath>
#include<string>
using namespace std;
struct kwadrat
{
   string napis;
   float liczba;
   float liczba2;
   unsigned char rozw;
};

float pow(float base, float exponent);
float delta, delta2;
kwadrat s;

kwadrat row(float a, float b, float c)
{
   s.napis = "Ma rozwiązanie!";
   s.rozw = 0;

   if (a==0 && b!=0) s.liczba = -c/b;

   if (a!=0)
   {
      delta=pow(b,2) - 4*a*c; delta2=sqrt(delta);

      if (delta>0)
      {
         s.liczba = (-b-delta2)/(2*a);
         s.liczba2 = (-b+delta2)/(2*a);
         s.rozw = 2;
      }
         //return (-b-delta2)/(2*a)&&(-b+delta2)/(2*a);
      if (delta==0)
      {
         s.liczba = -b/(2*a);
         s.rozw = 1;
      }

      if (delta<0) s.napis="Dane rownanie nie posiada rozwiazania. ";
   }

   if (a==0 && b==0)
      if (c==0) s.napis="Rownanie posiada nieskonczenie wiele rozwiazan. ";
      else s.napis="Rownanie nie posiada rozwiazania. ";

   return s;
}
int main()
{
    float a,b,c;
    kwadrat k;

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

    k = row(a,b,c);

    if (k.rozw==0) cout<<"Rozwiazanie: "<<k.napis;
    else if (k.rozw==1) cout<<"Rozwiazanie: "<<k.napis << k.liczba;
    else cout<<"Rozwiazanie: "<<k.napis << " " << k.liczba << " "<< k.liczba2;
    getch();
    return 0;
}

A teraz uwagi:
  • return to nie funkcja, a słowo kluczowe
  • gdy chcesz, żeby funkcja zwróciła jakąś wartość, to musi mieć ten sam typ co funkcja, nie może być czegoś takiego if (delta>0) return (-b-delta2)/(2*a)&&(-b+delta2)/(2*a);[/li]
    , jeśli funkcja jest typu kwadrat
  • jak dobrze pamiętam, to funkcja w c/c++ nie zwraca dwóch wartości tylko jedną, więc to: if (delta>0) return (-b-delta2)/(2*a)&&(-b+delta2)/(2*a);[/li]
    chyba nie zwraca dwóch wartości
I chyba tyle. Jak widać, musisz się jeszcze wiele nauczyć :D  Ucz się dalej :D  Możliwe, że kod można popoprawiać, ale chyba oto ci chodziło.

Trout

Trout

Użytkownicy
posty50
Propsy1
  • Użytkownicy
O to mi chodziło, wielkie dzięki  :wink:   To ja ide uczyc się dalej  :D
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Zapomniałem o jednym. Nie używaj zmiennych globalnych. Zamiast tego używaj lokalnych, statycznych.


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry