dopisanie struktury do programu

0

Witam wszystkich użytkowników forum mam następujący problem. Moim zadaniem jest napisać program obliczający pierwiastki równania kwadratowego, z tym to problemu nie miałem cały program wklejam poniżej. Problem pojawia się w momencie gdy do programu trzeba dodać strukturę(tablice). Mógłby to w sposób klarowny mi wytłumaczyć lub dopisać do programu te struktury.Pozdrawiam i liczę na szybką pomoc.

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

int oblicz_delte(int a, int b, int c)
{
     int delta;
     delta = b*b - 4*a*c;
    if(delta<0)
    cout<<" brak rozwiazan rzeczywistych"<<endl;
	 return delta;
}
void oblicz_miejsca_zerowe ( int a, int b, int delta)
{
   double x, x1, x2;
   x= -b/2*a;
   x1= (-b - sqrt(delta))/2*a;
   x2=(-b + sqrt(delta))/2*a;

   if(delta==0)
       cout<<" jest jedno miejsce zerowe:"<<x1<<endl;  
    if(delta>0)     
		 cout<< "Sa dwa miejsca zerowe:"<<x1<<endl<<x2<<endl;
}

int main()
{
   int a,b,c;

   cout<<"podaj a:"<< endl;
   cin>>a;
   cout<<"podaj b:"<< endl;
   cin>>b;
   cout<<"podaj c:"<< endl;
   cin>>c;

   oblicz_miejsca_zerowe(a,b,oblicz_delte (a,b,c));
 

  system("pause");
   return 0;
}
1

Czesc igubi123

a powiedz Ty mi... na co tutaj tablica? Co ona miala by tutaj robic?
A i pamietaj struktura w C++ to jest to
http://cpp0x.pl/kursy/Kurs-C++/Struktury-danych/303

takze struktura != tablica

no i jeszcze ostatnia uwaga. Jezeli wpiszesz do a zero to program Ci sie wysypie (bedzie staral sie dzielic przez zero)

0

Okey pomyliłem pojęcia nie chodzi mi o tablicę, tylko o dopisanie struktury danych.

no i jeszcze ostatnia uwaga. Jezeli wpiszesz do a zero to program Ci sie wysypie (bedzie staral sie dzielic przez zero)

Rzeczywiście nie zauważyłem tego, już dopisuję :)

0

w linku ktorym dalem jest wiecej opisane o tym.
Temat jezeli chodzi o struktury (w tym takze klasy) jest dosc obszerny. Dlatego nie bede dokladnie Ci tlumaczyl te pojecia, bo mozesz sobie poczytaj o nich bez problemow ;) (wszedzie jest duzo materialow dostepnych na ten temat. I po polsku i po angielsku)

mozesz strukture/klase zrobic taka

struct FunkcjaKwadratowa{
  float a;
  float b;
  float c;
  
  float x1;
  float x2;
  
  void ObliczMiejscaZerowe()
  {
    // tutaj wrzucasz kod
  }

  void WyswietlMiejscaZerowe()
  {
    // tutaj wrzucasz swoj kod
  }

  void WczytajParametryFunkcji()
  {
     cin >> a >> b >> c; 
  }
}; 

oczywiscie jest to struktura taka najbardziej prymitywna. Mozna ja zrobic duzo lepiej, ale na poczatek jest ok

Jakbys chcial wiedziec jak zrobic lepsza strukture/klase to trzebaby bylo zrobic tak

  • Nazwy po angielsku
  • wszystkie zmienne trzymac jako prywatne
  • przeladowac operator >> dla tej klasy zeby wczytywac dane
  • przeladowac operator << zeby wyswietlac dane z tej klasy

mozna nawet isc jeszcze "bardziej profesjonalnie" ale w tym przypadku to by byla sztuka dla sztuki ;)

0

Dzięki bardzo za odpowiedz. To jest kod po przetworzeniu

 #include <iostream>
#include <math.h>
using namespace std;
 struct FunkcjaKwadratowa
 {
  	float a;
  	float b;
  	float c;
 	float x;
	float x1;
	float x2;
	float delta;	

void oblicz_delte(float a, float b, float c)
{
    float delta;
     delta = b*b - 4*a*c;
    if(delta<0)
    cout<<" brak rozwiazan rzeczywistych"<<endl;
     
}
void oblicz_miejsca_zerowe ( float a, float b, float delta)
{
   float x, x1, x2;
   x= -b/2*a;
   x1= (-b - sqrt(delta))/2*a;
   x2=(-b + sqrt(delta))/2*a;
 
  
}
void wyswietl_miejsca_zerowe(){
   
  if(delta==0)
       cout<<" jest jedno miejsce zerowe:"<<x1<<endl;  
    if(delta>0)     
         cout<< "Sa dwa miejsca zerowe:"<<x1<<endl<<x2<<endl;
}
void WczytajParametryFunkcji()
  {
    cout<<"podaj a:"<< endl;
   cin>>a;
   cout<<"podaj b:"<< endl;
   cin>>b;
   cout<<"podaj c:"<< endl;
   cin>>c;
}
}

błędy z kompilatora
47 1[Error] expected ';' after struct definition

0

musisz poczytac tutoriale o strukturach/klasach. Nikt za Ciebie tego nie zrobi ;) Bo widac, ze nie masz pojecia co robisz i probujesz cos osiagnac robiac to po omacku. Tak sie nie da.

A blad masz taki, ze brakuje Ci } zamykajacego po strukturze (i ; po }. spojrz na moj post)

0

Okey, mógłbyś powiedzieć mi np dlaczego w pierwszej funkcji void kompilator wyrzuca błąd? Co jest źle napisane?

0

bo nadal nie poczytales nic na temat klas i struktur

Ostatni raz Ci odpowiem, nastepne pytania dotyczace podstaw ktore wskazalem co trzeba czytac bede ignorowal

W moim kodzie struktura ma funkcje. Twoja struktura ma tylko pola zadnych funkcji, wiec jest to normalne ze funkcje nie znaja tych zmiennych jako ze nie naleza do struktury

0

Można prosić o ocenę tej wersji programu? Ostatnie już chyba pytanie co musi znajdować się w tym przypadku w funkcji main, żeby wypisać wynik?

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


 struct dane
 {
 	
  	float a;
  	float b;
  	float c;
 	float x;
	float x1;
	float x2;
	float delta;
};
struct dane wczytaj()
{
   struct dane p;
   cout<<"podaj a:"<< endl;
   cin>>p.a;
   cout<<"podaj b:"<< endl;
   cin>>p.b;
   cout<<"podaj c:"<< endl;
   cin>>p.c;
   return p;

  
}
void oblicz_delte(struct dane p)
{	
 p.delta =p.b*p.b-4*p.a*p.c;
    if(p.delta<0) 
    cout<<" brak rozwiazan rzeczywistych"<<endl;
   
}


void oblicz_miejsca_zerowe ( struct dane p)
{
 
 p.x= -p.b/2*p.a;
 p.x1= (-p.b - sqrt(p.delta))/2*p.a;
 p.x2=(-p.b + sqrt(p.delta))/2*p.a;
}


void wyswietl_miejsca_zerowe(struct dane p){

  if(p.delta==0) {
  
       cout<<" jest jedno miejsce zerowe:"<<p.x1<<endl; 
			}
    if(p.delta>0)	{
		 
         cout<< "Sa dwa miejsca zerowe:"<<p.x1<<endl<<p.x2<<endl;
}
} 
1

Absolutnie do bani, wady:

  1. Brak kontroli wprowadzenia danych - literki zamiast liczb.
  2. Bezsensowne zmienne, np wpisujesz do p.x zaś przy jednym miejscu i tak wypisujesz p.x1
  3. Cały komplet jest bezużyteczny - np chcę zechcę użyć jak jest w moim projekcie, a nie mogę bo brak możliwości obliczenia delta bez wywalenia jakiegoś śmiecia na ekran.
  4. Brak sprawdzenie czy a==0, od tak dzielisz przez zero.
  5. Bezsensowne oszczędzenie na precyzji - float zamiast double.
  6. Wszędzie przewalanie danych przez stos, tak jakby nie słyszałeś o referencji czy wskaźniku.
  7. Polskie nazewnictwo.
    Aby było sensownie:
  8. Daj dane wejściowe do struktury struct data { double a,b,c; };
  9. Daj dane wyjściowe do struktury struct result { double mid,shift; bool imagin,good; }; do mid wpisujesz -b/2*a do shift wpisujesz: sqrt(fabs(delta))/2*a do: imagin wpisujesz: delta<0; no i good <- true;
  10. W przypadku ujemnej delta: imagin <- true;
  11. Funkcje liczące mają liczyć a nie wyświetlać, np oblicz_delte -> double calc_delta(const data &d)
  12. W przypadku braku rozwiązań np (a=0,b=0,c=5) lub nieskończonej liczby rozwiązań np (a=0,b=0,c=0): good <- false;
0

Wydaje mi się, że ta wersja programu jest już dużo lepsza od poprzednich. Tylko cały czas mam problem jak wypisać wartości tych dwóch pierwiastków

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

enum param_id { param_a = 0, param_b = 1, param_c = 2};

struct rownanie
{
   double params[3];
   double delta;
   double x[2];
   
   
   
   bool oblicz_delte()
   {
       delta = params[param_b]*params[param_b] - 4*params[param_a]*params[param_c];
       return delta >=0;
   }
   int oblicz_miejsca_zerowe ()
   {
     int res = 0;//0 nie ma rozwiazan
     if (oblicz_delte())
     {
         if (delta == 0)
         {
           x[0] = -params[param_b]/2*params[param_a];
           res = 1;
         }
         else
         {
           x[0] = (-params[param_b] - sqrt(delta))/2*params[param_a];
           x[1] = (-params[param_b] + sqrt(delta))/2*params[param_a];
           res = 2;
         }
     } 
     return res;
   }
};

int main()
{
   rownanie r;
   int x;
   cout<<"podaj a:"<< endl;
   cin>>r.params[param_a];
   cout<<"podaj b:"<< endl;
   cin>>r.params[param_b];
   cout<<"podaj c:"<< endl;
   cin>>r.params[param_c];
   
   x = r.oblicz_miejsca_zerowe();
   cout<<"To rownanie kwadratowe ma pierwiastki o wartości"<<x<<"\nDelta to"<<r.delta<<endl; //W tej linijce jest błąd, w sensie program się kompiluje lecz nie podaje wartości pierwiastków tylko ile ich jest. 
   for(int i = 0; i < x; ++i)
     cout<<"\nx["<<(i+1)<<"] = "<<r.x[i];
   return 0;

}
1

nie wierze, ze to sam napisales. Jakbys rozumial co tu sie dzieje to bys sobie wyswietlil to co potrzebujesz.

Wiec standardowo odpowiem

Poczytaj podstawy o klasach i strukturach

0

Przecież tu masz wypisywane pierwiastki:

 for(int i = 0; i < x; ++i)
     cout<<"\nx["<<(i+1)<<"] = "<<r.x[i];

a i nie math.h, a cmath winno być

0

Akurat kolego fasadin mylisz, się przysiedziałem i ten program sam napisałem, miałem tylko problem z wyświetlaniem danych, dlatego poprosiłem kolegę, żeby to dopisał, lecz do końca nie rozumiałem działania tej pętli. Aktualnie program działa, dziękuję za wielką pomoc na tym forum i nie rozumiem dlaczego tutaj zawsze pocisną po człowieku. Zamiast być miłym, nie oczekuję nie wiadomo czego, przecież większość osób chce się czegoś dowiedzieć, a przecież łatwiej jest to zrozumieć przez wyjaśnienie części kodu niż siedzenie 2h i lekturę.

0
igubi123 napisał(a):

... i nie rozumiem dlaczego tutaj zawsze pocisną po człowieku ...
czy uwierzysz że ktoś kto w miarę sprawnie operuje sin() i cos() nie rozumie dodawania? Tak samo baaaardzo trudno uwierzyć że rozumiesz struktury i metody, zaś nie rozumiesz prostej pętli.
W związku z powyższym wyglądasz na roszczeniowego leniucha, dla którego nikt nic nie chce robić.

0

jeżeli rozumiesz struktury i napisałeś sam ten cały kod to jakim prawem nie wiesz jak wypisać??? a wypisuje ile ich jest bo tak jest napisany kod... to nie jest błąd tylko po prostu tak to "napisałeś"

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