Ĺadny brzuch
Witam! Piszę sobie program i już wymiękam. Bynajmniej nie ze względu na godzinę.
Mam z programem nastepujący prombel.
Chciał bym aby klasa "zawartosc" dziedziczyła "proba" z klasy "Karaty"
Ponieważ w tej chwli sam sobie jakoś z kądś pobiera "proba" w dziwnym formacie np 23.234324-4er4 i wylicza mi wynik karatów 0
Kiedy miałem jedna klase to karaty liczyło poprawnie.
Już sie zakreciłem. I nie weim jak to wykonać.
ps. Program musi być napisany obiektowo. Ja tego nie wymysliłem :)
Generalnie chodzi o zaprezentowanie dziedziczenia, konstruktorów itp.
Z góry dzięki za pomoc.
#include <iostream> #include <conio.h> using namespace std; // program przelicza probe zlota na karaty i wylicza ilosc procent czystego zlota w stopie class Karaty { public: float proba; void wypisz(); float obliczkaraty(); }; class Zawartosc: public Karaty { public: float obliczprocent(); void wypisz(); }; void Karaty::wypisz() { cout << endl << " proba: " << this->proba << endl; cout << " Wynik w karatach: " << this->obliczkaraty() << " ct" << endl; cout << endl; } float Karaty::obliczkaraty() { return (this->proba /1000) * 24; //licze karaty } void Zawartosc::wypisz() { cout << endl <<" proba: " << this->proba << endl; //jesli podam probe nowa to liczy poprawnie a ma ja dziedziczyc z klasy KARATY cout << " Procent zlota/srebra w stopie: " << this->obliczprocent() << " %" << endl; cout << endl; } float Zawartosc::obliczprocent() { return this->proba /10; //licze procent } int main(void) { Karaty k1; Zawartosc z1; cout << " podaj probe zlota / srebra od 1 do 1000: "; cin >>z1.proba; k1.wypisz(); z1.wypisz(); getch(); }
chyba nie pojales do konca tego dziedziczenia ;)
dziedziczenia pozwala Ci stworzyc klase wykorzystujac do tego inna klase i tylko tyle
to jest calkowicie inna instancja, tworzac obiekt jest on niezalezny nie wazne czy byl on dziedziczony czy nie
Klasa karaty wywala Ci "smieci" bo nic nie jest zainicjowane
generlanie to mozna robi na setki ronzych sposobw a nie wiem ktore wyjscie jest intecja zadania
ja sie domyslam, ze masz stworzyc dwie klasy jedna dziedziczy po drugiej, ale masz utworzyc tylko jeden obiekt, ktory bedzie wykorzystywal funkcje dziedziczone
ja proponuje zebys funkcje wypisz oznaczyl inaczej:
wypisz_procent()
wypisz_karaty()
stworzyc tylko jeden obiekt zawartosc
zawartosc z1; ... z1.wypisz_karaty(); z1.wypisz_procent();
konstruktora tez zadnego nie widze, ale tu proponuje zebys sam sie zainteresowal - to podstawa C++
jak bedziesz mial problemy to napisz tu, pomozemy
Użytkownik fernandez edytował ten post 08 grudzień 2009, 10:46
Poprawiłem troche.
Dzięki Fernandez!
Siedze i czytam po różnych stronach jak działają te klasy ale ludzie piszą zbyt chaotycznie dla kogoś kto nie zna wszystkich pojęć.
Proszę o sprawdzenie w komentarzach programu czy wszystko dobrze opisałem i ew. uzupełnienie lub korektę błędów.
#include <iostream> //dyrektywa preprocesora #include <conio.h> // -//- using namespace std; //to wiem przestrzenie nazw // program przelicza probe zlota na karaty i wylicza ilosc procent czystego zlota w stopie class Karaty //klasa o nazwie Karaty { public: //specyfikator dostepu - każda klasa w programie może kożystać ze zmiennych float proba; // zmienna proba void wypisz_karaty(); // funkcja wypisz_karaty float wynikkaraty(); //zmienna wynikkaraty }; class Zawartosc: public Karaty //klasa o nazwie Zawartosc dziedziczy z klasy Karaty { public: //specyfikator dostepu float obliczprocent(); // zmienna obliczprocent void wypisz_procent(); // funkcja wypisz_procent }; void Karaty::wypisz_karaty() /*Dostęp do elementów klasy Karaty dlaczego void? bo jest tam funkcja wypisz_karaty a nie zmienna? Trzeba pisać to void? dlaczego? (wiem że void nie zwraca wartosci) nazwa klasy (operator dostepu::) funkcja wypisz_karaty */ { cout << endl << " proba: " << this->proba << endl << endl; //napis wiadomo i ( wywołanie funkcji proba) cout << " Wynik w karatach: " << this->wynikkaraty() << " ct" << endl; cout << endl; } float Karaty::wynikkaraty() // float liczby rzeczywiste zmiennoprzecinkowe { return (this->proba /1000) * 24; //zwraca wynik liczenia w postaci zmiennej wynikkaraty ( do klasy Karaty czy w klaise karaty? czy jak) } void Zawartosc::wypisz_procent() //TO SIE POWTARZA ...................... { cout << " Procent zlota/srebra w stopie: " << this->obliczprocent() << " %" << endl; cout << endl; } float Zawartosc::obliczprocent() { return this->proba /10; //..........................AŻ DO TĄD } int main(void) { Zawartosc z1; //objekt pierwszy z1 tak? cout << " podaj probe zlota / srebra od 1 do 1000: "; cin >>z1.proba; z1.wypisz_karaty(); // wywołanie funkcji składowej (wypisz_karaty) w objekcie z1 z1.wypisz_procent(); // tu podobnie getch(); } /* Naczytałem sie i zmajstrowałem coś takiego chciał bym aby konstruktor stworzył nowy obiekt i żeby w nim był wyliczony procent: nowe zmienne float newproba; int mianownik = 10; Konstruktor ktory powinien wyliczyć procenty Zawartosc(float proba, int mianownik) { cout << " Nowa proba: "; newproba= this->proba/10; cout << newproba; } I tu mam problem jako świerzynka w obiektowym. Nie wiem gdzie umieścić ów konstruktor w programie. */
Dobra teraz zgłupiałem kompletnie już. :)
w pierwszej wersji tej poprawionej mam
int main(void) { Zawartosc z1; cout << " podaj probe zlota / srebra od 1 do 1000: "; cin >>z1.proba; z1.wypisz_karaty(); z1.wypisz_procent(); getch(); }
Co wypisuje wyniki na ekranie i jak to usune to oczywiscie ich nie wypisuje.
A teraz probuje dodać zapis do pliku. Już mniejsza z tym że sie nie udaje ale co dziwne wstawiłem:
void dopisz_do_bazy_wynikow(Karaty *s,int numer,int i) // i-numer samochodu w bazie / numer- do obliczen w petli for { fstream fs("spis.txt",ios_base::in); if(!fs) //jesli nie ma pliku negacja-> ! { cout << "Zostala utworzony plik spis.txt.\n"; getch(); fs.open("spis.txt", ios_base::out); } else { fs.close(); fs.open("spis.txt", ios_base::out|ios_base::app); } for(i;i<numer;i++) { cout << "numer wyniku w bazie: " << i << endl; s[i].ns=i; fs << s[i].ns << endl; cout << "Podaje no włąsnie nie wiem co: \n"; cin >> s[i].proba; fs << s[i].proba << endl; } fs.close(); } int main(void) { int numer, i, s, przycisk; cout << "Dodaj dane do spisu. 1\n"; cout << "cos tam. 2\n"; cin >> przycisk; switch (przycisk) { case 1: { cout << "narazie jeszcze nic" << endl; break; } case 2: { cout << "narazie nic" << endl; break; } default: cout<<"nie wiem co chcesz zrobic "; break; } getch(); }
I nie ma w programie tego co wyżej a wyniki sie wyswietlają poprawnie i program dalej smiga. Jakim cudem?
co do konstruktorow to w ogole nie pojales idei
polecam przeczytac np: http://pl.wikibooks....or_i_destruktor
konstruktor sluzy (najczesciej) do inicjalizacji obiektu, czy tez inaczej do przypisania mu jakis wartosci
class Klasa { int i; Klasa(); }; Klasa::Klasa() { this->i = 0; //na przyklad } Klasa::Klasa(int p) { this->i = p; //na przyklad } ... int main() { int liczba = 10; Klasa k1 = new Klasa(); // tu bedzie zero Klasa k2 = new Klasa(liczba); // tu bedzie 10
przeanalizuj i sprobuj zastosowac
co do reszty to wklej caly kod bo ja juz nie wime co jest a czego nie ma :>
heheh No tak ja już sie sam gubie bo narobiłem przez 3 dni jakies 40 plików robiąc ten program :)
Więc tak:
Zrobiłem 3 klasy
W jednej jest sobie konstruktor kopiujący z wikipedii( taki aby był).
Teraz chciał bym zapisać wynik obliczen do pliku.
Czyli:
-podaną próbe (może być bez tego jeśli sie nie da)
-wynik ile karatów
-wynik ile procent
Myśle że fajnie jak by program pytał po obliczeniach czy chce zapisać wynik i dawał taka możliwość.
Nie musi odczytywać nic z pliku bo musiał bym umozliwic zapisanie kilku wyników i sie bawic pewnie z jakimis tablicami a nie chce.
Jak wykonać taki prosty zapis wyniku?
Znalazłem taką scigawkę:
http://peb.pl/progra...owanie-itd.html
Ale jest tam taki ogrom informacji że mózg mi sie lansuje.
Narazie to naskrobałem:
#include <iostream> //operator dostepu:: #include <conio.h> using namespace std; //////////////////////////////////////////////////////////////////////////////// class Karaty { public: float proba; // zmienna proba void wypisz_karaty(); // funkcja wypisz_karaty float wynikkaraty(); // zmienna wynikkaraty }; //////////////////////////////////////////////////////////////////////////////// class Zawartosc: public Karaty { public: float obliczprocent(); // zmienna obliczprocent void wypisz_procent(); // funkcja wypisz_procent }; //////////////////////////////////////////////////////////////////////////////// class Przelicznik: Karaty { public: int dana; // zmienna dana Przelicznik( int parametrDomyslny ) // konstruktor kopiujący { this->dana = parametrDomyslny; } }; //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////// void Karaty::wypisz_karaty() //funkcja wypisz_karaty ma dostęp do elementów klasy Karaty { cout << endl << " proba: " << this->proba << endl << endl; //wyswietlenie proby cout << " Wynik w karatach: " << this->wynikkaraty() << " ct" << endl; //wyswietlenie wyniku karatow cout << endl; } float Karaty::wynikkaraty() // zmienna wynikkaraty ma dostęp do elementów klasy Karaty { return (this->proba /1000) * 24; //zwraca wynik liczenia w postaci zmiennej wynikkaraty } ///////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////// void Zawartosc::wypisz_procent() { cout << " Procent zlota/srebra w stopie: " << this->obliczprocent() << " %" << endl; cout << endl; } float Zawartosc::obliczprocent() { return this->proba /10; } ///////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////// int main(void) { Zawartosc objektz1; //objekt pierwszy z1 tak? cout << " podaj probe zlota / srebra od 1 do 1000: "; cin >>objektz1.proba; objektz1.wypisz_karaty(); // wywołanie funkcji składowej (wypisz_karaty) w objekcie z1 objektz1.wypisz_procent(); Przelicznik obiektKlasyPrzelicznik( 1000 ); Przelicznik kopiaObiektuKlasyPrzelicznik( obiektKlasyPrzelicznik ); cout << " Czyste zloto / srebro posiada probe "<<kopiaObiektuKlasyPrzelicznik.dana ; getch(); }
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Mam z programem nastepujący prombel.
Chciał bym aby klasa "zawartosc" dziedziczyła "proba" z klasy "Karaty"
Ponieważ w tej chwli sam sobie jakoś z kądś pobiera "proba" w dziwnym formacie np 23.234324-4er4 i wylicza mi wynik karatów 0
Kiedy miałem jedna klase to karaty liczyło poprawnie.
Już sie zakreciłem. I nie weim jak to wykonać.
ps. Program musi być napisany obiektowo. Ja tego nie wymysliłem :)
Generalnie chodzi o zaprezentowanie dziedziczenia, konstruktorów itp.
Z góry dzięki za pomoc.
#include <iostream> #include <conio.h> using namespace std; // program przelicza probe zlota na karaty i wylicza ilosc procent czystego zlota w stopie class Karaty { public: float proba; void wypisz(); float obliczkaraty(); }; class Zawartosc: public Karaty { public: float obliczprocent(); void wypisz(); }; void Karaty::wypisz() { cout << endl << " proba: " << this->proba << endl; cout << " Wynik w karatach: " << this->obliczkaraty() << " ct" << endl; cout << endl; } float Karaty::obliczkaraty() { return (this->proba /1000) * 24; //licze karaty } void Zawartosc::wypisz() { cout << endl <<" proba: " << this->proba << endl; //jesli podam probe nowa to liczy poprawnie a ma ja dziedziczyc z klasy KARATY cout << " Procent zlota/srebra w stopie: " << this->obliczprocent() << " %" << endl; cout << endl; } float Zawartosc::obliczprocent() { return this->proba /10; //licze procent } int main(void) { Karaty k1; Zawartosc z1; cout << " podaj probe zlota / srebra od 1 do 1000: "; cin >>z1.proba; k1.wypisz(); z1.wypisz(); getch(); }
chyba nie pojales do konca tego dziedziczenia ;)
dziedziczenia pozwala Ci stworzyc klase wykorzystujac do tego inna klase i tylko tyle
to jest calkowicie inna instancja, tworzac obiekt jest on niezalezny nie wazne czy byl on dziedziczony czy nie
Klasa karaty wywala Ci "smieci" bo nic nie jest zainicjowane
generlanie to mozna robi na setki ronzych sposobw a nie wiem ktore wyjscie jest intecja zadania
ja sie domyslam, ze masz stworzyc dwie klasy jedna dziedziczy po drugiej, ale masz utworzyc tylko jeden obiekt, ktory bedzie wykorzystywal funkcje dziedziczone
ja proponuje zebys funkcje wypisz oznaczyl inaczej:
wypisz_procent()
wypisz_karaty()
stworzyc tylko jeden obiekt zawartosc
zawartosc z1; ... z1.wypisz_karaty(); z1.wypisz_procent();
konstruktora tez zadnego nie widze, ale tu proponuje zebys sam sie zainteresowal - to podstawa C++
jak bedziesz mial problemy to napisz tu, pomozemy
Użytkownik fernandez edytował ten post 08 grudzień 2009, 10:46
Poprawiłem troche.
Dzięki Fernandez!
Siedze i czytam po różnych stronach jak działają te klasy ale ludzie piszą zbyt chaotycznie dla kogoś kto nie zna wszystkich pojęć.
Proszę o sprawdzenie w komentarzach programu czy wszystko dobrze opisałem i ew. uzupełnienie lub korektę błędów.
#include <iostream> //dyrektywa preprocesora #include <conio.h> // -//- using namespace std; //to wiem przestrzenie nazw // program przelicza probe zlota na karaty i wylicza ilosc procent czystego zlota w stopie class Karaty //klasa o nazwie Karaty { public: //specyfikator dostepu - każda klasa w programie może kożystać ze zmiennych float proba; // zmienna proba void wypisz_karaty(); // funkcja wypisz_karaty float wynikkaraty(); //zmienna wynikkaraty }; class Zawartosc: public Karaty //klasa o nazwie Zawartosc dziedziczy z klasy Karaty { public: //specyfikator dostepu float obliczprocent(); // zmienna obliczprocent void wypisz_procent(); // funkcja wypisz_procent }; void Karaty::wypisz_karaty() /*Dostęp do elementów klasy Karaty dlaczego void? bo jest tam funkcja wypisz_karaty a nie zmienna? Trzeba pisać to void? dlaczego? (wiem że void nie zwraca wartosci) nazwa klasy (operator dostepu::) funkcja wypisz_karaty */ { cout << endl << " proba: " << this->proba << endl << endl; //napis wiadomo i ( wywołanie funkcji proba) cout << " Wynik w karatach: " << this->wynikkaraty() << " ct" << endl; cout << endl; } float Karaty::wynikkaraty() // float liczby rzeczywiste zmiennoprzecinkowe { return (this->proba /1000) * 24; //zwraca wynik liczenia w postaci zmiennej wynikkaraty ( do klasy Karaty czy w klaise karaty? czy jak) } void Zawartosc::wypisz_procent() //TO SIE POWTARZA ...................... { cout << " Procent zlota/srebra w stopie: " << this->obliczprocent() << " %" << endl; cout << endl; } float Zawartosc::obliczprocent() { return this->proba /10; //..........................AŻ DO TĄD } int main(void) { Zawartosc z1; //objekt pierwszy z1 tak? cout << " podaj probe zlota / srebra od 1 do 1000: "; cin >>z1.proba; z1.wypisz_karaty(); // wywołanie funkcji składowej (wypisz_karaty) w objekcie z1 z1.wypisz_procent(); // tu podobnie getch(); } /* Naczytałem sie i zmajstrowałem coś takiego chciał bym aby konstruktor stworzył nowy obiekt i żeby w nim był wyliczony procent: nowe zmienne float newproba; int mianownik = 10; Konstruktor ktory powinien wyliczyć procenty Zawartosc(float proba, int mianownik) { cout << " Nowa proba: "; newproba= this->proba/10; cout << newproba; } I tu mam problem jako świerzynka w obiektowym. Nie wiem gdzie umieścić ów konstruktor w programie. */
Dobra teraz zgłupiałem kompletnie już. :)
w pierwszej wersji tej poprawionej mam
int main(void) { Zawartosc z1; cout << " podaj probe zlota / srebra od 1 do 1000: "; cin >>z1.proba; z1.wypisz_karaty(); z1.wypisz_procent(); getch(); }
Co wypisuje wyniki na ekranie i jak to usune to oczywiscie ich nie wypisuje.
A teraz probuje dodać zapis do pliku. Już mniejsza z tym że sie nie udaje ale co dziwne wstawiłem:
void dopisz_do_bazy_wynikow(Karaty *s,int numer,int i) // i-numer samochodu w bazie / numer- do obliczen w petli for { fstream fs("spis.txt",ios_base::in); if(!fs) //jesli nie ma pliku negacja-> ! { cout << "Zostala utworzony plik spis.txt.\n"; getch(); fs.open("spis.txt", ios_base::out); } else { fs.close(); fs.open("spis.txt", ios_base::out|ios_base::app); } for(i;i<numer;i++) { cout << "numer wyniku w bazie: " << i << endl; s[i].ns=i; fs << s[i].ns << endl; cout << "Podaje no włąsnie nie wiem co: \n"; cin >> s[i].proba; fs << s[i].proba << endl; } fs.close(); } int main(void) { int numer, i, s, przycisk; cout << "Dodaj dane do spisu. 1\n"; cout << "cos tam. 2\n"; cin >> przycisk; switch (przycisk) { case 1: { cout << "narazie jeszcze nic" << endl; break; } case 2: { cout << "narazie nic" << endl; break; } default: cout<<"nie wiem co chcesz zrobic "; break; } getch(); }
I nie ma w programie tego co wyżej a wyniki sie wyswietlają poprawnie i program dalej smiga. Jakim cudem?
co do konstruktorow to w ogole nie pojales idei
polecam przeczytac np: http://pl.wikibooks....or_i_destruktor
konstruktor sluzy (najczesciej) do inicjalizacji obiektu, czy tez inaczej do przypisania mu jakis wartosci
class Klasa { int i; Klasa(); }; Klasa::Klasa() { this->i = 0; //na przyklad } Klasa::Klasa(int p) { this->i = p; //na przyklad } ... int main() { int liczba = 10; Klasa k1 = new Klasa(); // tu bedzie zero Klasa k2 = new Klasa(liczba); // tu bedzie 10
przeanalizuj i sprobuj zastosowac
co do reszty to wklej caly kod bo ja juz nie wime co jest a czego nie ma :>
heheh No tak ja już sie sam gubie bo narobiłem przez 3 dni jakies 40 plików robiąc ten program :)
Więc tak:
Zrobiłem 3 klasy
W jednej jest sobie konstruktor kopiujący z wikipedii( taki aby był).
Teraz chciał bym zapisać wynik obliczen do pliku.
Czyli:
-podaną próbe (może być bez tego jeśli sie nie da)
-wynik ile karatów
-wynik ile procent
Myśle że fajnie jak by program pytał po obliczeniach czy chce zapisać wynik i dawał taka możliwość.
Nie musi odczytywać nic z pliku bo musiał bym umozliwic zapisanie kilku wyników i sie bawic pewnie z jakimis tablicami a nie chce.
Jak wykonać taki prosty zapis wyniku?
Znalazłem taką scigawkę:
http://peb.pl/progra...owanie-itd.html
Ale jest tam taki ogrom informacji że mózg mi sie lansuje.
Narazie to naskrobałem:
#include <iostream> //operator dostepu:: #include <conio.h> using namespace std; //////////////////////////////////////////////////////////////////////////////// class Karaty { public: float proba; // zmienna proba void wypisz_karaty(); // funkcja wypisz_karaty float wynikkaraty(); // zmienna wynikkaraty }; //////////////////////////////////////////////////////////////////////////////// class Zawartosc: public Karaty { public: float obliczprocent(); // zmienna obliczprocent void wypisz_procent(); // funkcja wypisz_procent }; //////////////////////////////////////////////////////////////////////////////// class Przelicznik: Karaty { public: int dana; // zmienna dana Przelicznik( int parametrDomyslny ) // konstruktor kopiujący { this->dana = parametrDomyslny; } }; //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////// void Karaty::wypisz_karaty() //funkcja wypisz_karaty ma dostęp do elementów klasy Karaty { cout << endl << " proba: " << this->proba << endl << endl; //wyswietlenie proby cout << " Wynik w karatach: " << this->wynikkaraty() << " ct" << endl; //wyswietlenie wyniku karatow cout << endl; } float Karaty::wynikkaraty() // zmienna wynikkaraty ma dostęp do elementów klasy Karaty { return (this->proba /1000) * 24; //zwraca wynik liczenia w postaci zmiennej wynikkaraty } ///////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////// void Zawartosc::wypisz_procent() { cout << " Procent zlota/srebra w stopie: " << this->obliczprocent() << " %" << endl; cout << endl; } float Zawartosc::obliczprocent() { return this->proba /10; } ///////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////// int main(void) { Zawartosc objektz1; //objekt pierwszy z1 tak? cout << " podaj probe zlota / srebra od 1 do 1000: "; cin >>objektz1.proba; objektz1.wypisz_karaty(); // wywołanie funkcji składowej (wypisz_karaty) w objekcie z1 objektz1.wypisz_procent(); Przelicznik obiektKlasyPrzelicznik( 1000 ); Przelicznik kopiaObiektuKlasyPrzelicznik( obiektKlasyPrzelicznik ); cout << " Czyste zloto / srebro posiada probe "<<kopiaObiektuKlasyPrzelicznik.dana ; getch(); }