C++ program z klasami


(system) #1

Witam wszystkich forumowiczów. Mam problem z napisanie programu obliczającego cene brutto na podstawie wpisanej ceny netto i VATu ze zdefiniowaną klasą TFaktura.

ucze się juz tego c++ jakis czas ale w ogole nie wiem jak sie zabrac za taki program, prosze o pomoc wiem ze dla wielu z was jest to pestka :wink:

prosze takze o komentarze ponieważ chciałbym się tego nauczyć i zrozumieć. Pomógł by ktoś?


(system) #2

dzięki za odpowiedź jednak przy kompilacji pojawia się błąd w linijce z klamerka (środkowa)

void TFaktura::WstawNetto(float n) //definicja metody (jej ciało czyli co ma robić)

{

netto=n; //przepisuję to co dostałem jako argument do wnętrza klasy (to co w sekcji prywatnej dostępne tylko przez metody)

Bardzo proszę jeśli możesz o pokazanie całego dobrego kodu od #include do system pause bo już wyrywam sobie włosy z głowy i nic mi nie wychodzi:( siedze juz dzisiaj nad tym dobre 5 godzin (nie licze poprzednich dni) :frowning:


(Billa) #3

include

// definicja klasy, pola prywatne + metody publiczne

class TFaktura

{

private: //sekcja prywatna, tylko metody tej klasy mogą tu grzebać, nie da się tego zrobić z zewnątrz (nie piszę o klasach zaprzyjaźnionych)

double netto; //pole netto typu zmiennoprzecinkowego podwójnej precyzji (jak w zwykłej strukturze)

double vat;

double brutto;

public:

void WstawNetto(float); //deklaracja (sam nagłówek) funkcji należącej do klasy, czyli tzw. metody

void WstawVat(float);

void WstawBrutto(float);

void PodajWszystko();

void Oblicz();

}; // <- nie przegap tego średnika :smiley:

// definicje metod

void TFaktura::WstawNetto(float n) //definicja metody (jej ciało czyli co ma robić)

{

netto=n; //przepisuję to co dostałem jako argument do wnętrza klasy (to co w sekcji prywatnej dostępne tylko przez metody)

};

void TFaktura::WstawVat(float vat)

{

this->vat=vat; // jeśli parametr nazywa się tak samo, można użyć (wtedy trzeba) wskaźnika "this"

// ten wskaźnik pokazuje samą siebie "klasę"

};

void TFaktura::Oblicz()

{

brutto = netto + vat/100.0 * netto; //chyba tak się dodaje VAT :smiley:

};

void TFaktura::PodajWszystko()

{

cout << "netto " << netto << endl << "brutto " << brutto << endl << "vat " << vat << endl;

};

// a potem wypróbuj czy działa

int main()

{

TFaktura fakturka; //Deklaracja obiektu typu TFaktura

fakturka.WstawNetto(100); // Używamy metod tego obiektu

fakturka.WstawVat(22); // Programowanie obiektowe "woli" żeby grzebać w klasie tylko poprzez metody

fakturka.Oblicz(); // nie dopuści zrobienia czegoś takiego np. fakturka.vat = 0.22; (bo pole vat jest prywatne vide wyżej)

fakturka.PodajWszystko();

system("pause"); // To możesz wywalić, ja używam DevCpp (darmowy) i tak zatrzymuję program konsolowy

return 0;

}

//ps. dodaj sobie analogicznie inne metody


(system) #4

hm teraz sie uruchamia ale odrazu sie pokazuje:

netto 100

brutto 122

vat 22

a co zmienic aby kwote netto i vat podac z klawiatury?

i to by chyba bylo na tyle, teraz przestudiuje wszystkie komentarze i moze uda mi sie cos zalapac, kurcze przeczytalem juz kursow i ebokow o c++ i wraz to dla mnie czarna magia:(


(Billa) #5

wstawianie danych z klawiatury można zrobić na trzy sposoby (tyle mi od razu przychodzi do głowy)

1) Obejść problem i zrobić to w dwóch krokach

...

double ilevat;

...

cout << "podaj vat" << endl;

cin >> ilevat;

fakturka.WstawVat(ilevat); // rozwiązanie zadziała, choć jest mało "obiektowe";

2) Napisać metodę pobierającą dane z klawiatury, względnie zmienić brzmienie metody np. WstawVat:

w klasie:

void WstawVat(void); // <- teraz nie trzeba argumentu bo metoda sama sobie pobierze wartość ze strumienia (klawiatury)

poniżej:

TFaktura::WstawVat()

{

cout << "Podaj vat" << end;

cint >> vat;

};

3) Napisać własny operator strumienia ">>" choć to nie ma sensu bo

a) trzeba by rozróżnić czy podajesz vat, czy kwotę brutto czy jeszcze coś innego

b) wymaga średniozaawansowanej znajomości obiektów

Poniżej przykład operatora, ktory umożliwia strumieniowe wpisanie nowej stawki VAT:

class TFaktura

{

 private: 

          double netto; 

          double vat;

          double brutto;

 public:

        void WstawNetto(float); 

        void WstawVat(float);

        void WstawBrutto(float);

        void PodajWszystko();

        void Oblicz();

        friend istream& operator>>(istream&, TFaktura&);

        // ta metoda jest zaprzyjaźniona, tylko przyjaciele mogą grzebać w sekcji "private"

}; //

...

// definicje metod

istream& operator>>(istream& i, TFaktura& f)

{

    i >> f.vat;

    return i;         

}

Gdzieś na końcu programu można sprawdzić jak to działa:

cout << "Podaj nowy VAT" <
 cin >> fakturka;

 fakturka.Oblicz();

 fakturka.PodajWszystko();