Odczyt z klas
Ostatnio zmodyfikowano 2015-05-25 21:59
kamil_20 Temat założony przez niniejszego użytkownika |
Odczyt z klas » 2014-04-13 17:07:28 Witam wszystkich to jest mój program #include "StdAfx.h" #include<ctime> #include <iostream> #include <fstream> #include <string.h> using namespace std;
class Plyta { private: int identyfikator_plyty; char rodzaj[ 10 ]; public: Plyta() { } Plyta( int id, char * rodzaj ) { identyfikator_plyty = id; strcpy( this->rodzaj, rodzaj ); } void wypisz_plyte() { cout << "ID : " << identyfikator_plyty << ", Rodzaj muzyki : " << rodzaj << endl; } int daj_id() { return identyfikator_plyty; } int porownaj_typ( char * rodzaj ) { if( strcmp( this->rodzaj, rodzaj ) ) { return 1; } else { return 0; } } };
class Wypozyczajacy { private: int identyfikator_wypoz; char nazwisko[ 50 ]; int wiek; public: Wypozyczajacy() { } Wypozyczajacy( int id_wypoz, int wiek_wypoz, char * nazwisko ) { identyfikator_wypoz = id_wypoz; wiek = wiek_wypoz; strcpy( this->nazwisko, nazwisko ); } void wypisz_wypoz() { cout << "ID : " << identyfikator_wypoz << ", Nazwisko : " << nazwisko << ", " << wiek << " lat" << endl; } int daj_id() { return identyfikator_wypoz; } int daj_wiek() { return wiek; } };
class Wypozyczenie { private: int id_wypozyczenie, id_plyty; public: Wypozyczenie() { } Wypozyczenie( int id_wypozyczenie, int id_plyty ) { this->id_wypozyczenie = id_wypozyczenie; this->id_plyty = id_plyty; } void wypisz_wypozyczenie() { cout << "ID_wypozyczajacego : " << id_wypozyczenie << ", ID_plyty : " << id_plyty << endl; } int daj_id_wypoz() { return id_wypozyczenie; } int daj_id_plyty() { return id_plyty; } };
int main() { int wybor_zadania; int p, wypozycajacy_plyte, wypozycenie_plyty; int id_plyty; char rodz_muzyki[ 10 ]; int id_wypozyczajacego, wiek; char nazwisko[ 50 ]; int liczba_plyt, liczba_wypozyczajacych, liczba_wypozyczen; char koniec = 'n'; float srednia; int licznik; Plyta * ply; ply = new Plyta[ 100 ]; Wypozyczajacy * wypoz; wypoz = new Wypozyczajacy[ 100 ]; Wypozyczenie * wypozycz; wypozycz = new Wypozyczenie[ 100 ]; ifstream zplikPlyta( "plyta.dat", ios_base::binary ); if( zplikPlyta.is_open() ) { liczba_plyt = 0; while( zplikPlyta.read(( char * ) & ply[ liczba_plyt ], sizeof( ply[ liczba_plyt ] ) ) ) { liczba_plyt++; } } zplikPlyta.close(); ifstream zplikWypozyczajacy( "wypozyczajacy.dat", ios_base::binary ); if( zplikWypozyczajacy.is_open() ) { liczba_wypozyczajacych = 0; while( zplikWypozyczajacy.read(( char * ) & wypoz[ liczba_wypozyczajacych ], sizeof( wypoz[ liczba_wypozyczajacych ] ) ) ) { liczba_wypozyczajacych++; } } zplikWypozyczajacy.close(); ifstream zplikWypozyczenie( "wypozyczenie.dat", ios_base::binary ); if( zplikWypozyczenie.is_open() ) { liczba_wypozyczen = 0; while( zplikWypozyczenie.read(( char * ) & wypozycz[ liczba_wypozyczen ], sizeof( wypozycz[ liczba_wypozyczen ] ) ) ) { liczba_wypozyczen++; } } zplikWypozyczenie.close(); do { cout << "1.Dodaj nowa plyte: " << endl; cout << "2.Dodaj nowego wypozyczajacego " << endl; cout << "3.Wypozycz plyte osobie " << endl; cout << "4.Wypisz wszystkie płyty " << endl; cout << "5.Wypisz wszystkich wypożyczających " << endl; cout << "6.Wypisz wszystkie wypożyczenia " << endl; cout << "7.Wyszukaj najbardziej popularny rodzaj muzyki wsórd osób w danym przedziale wiekowym" << endl; cout << "8.Wyszukaj sredni wiek osób słuchających jazzu " << endl; cout << "9.Wyjdz z programu " << endl; cin >> wybor_zadania; switch( wybor_zadania ) { case 1: { cout << "Wybrałes opcje dodania nowej plyty" << endl; cout << "Ile plyt chcesz dodac ?" << endl; cin >> p; for( int i = 0; i < p; i++ ) { cout << "Podaj identyfikator plyty" << endl; cin >> id_plyty; cout << "Podaj rodzaj muzyki" << endl; cin >> rodz_muzyki; Plyta tmpp( id_plyty, rodz_muzyki ); ply[ i ] = tmpp; } for( int i = 0; i < p; i++ ) { ply[ i ].wypisz_plyte(); } getchar(); getchar(); ofstream doplikPlyta( "plyta.dat", ios_base::app | ios_base::binary ); for( int i = 0; i < p; i++ ) { doplikPlyta.write(( char * ) & ply[ i ], sizeof ply[ i ] ); } doplikPlyta.close(); ifstream zplikPlyta( "plyta.dat", ios_base::binary ); if( zplikPlyta.is_open() ) { liczba_plyt = 0; while( zplikPlyta.read(( char * ) & ply[ liczba_plyt ], sizeof( ply[ liczba_plyt ] ) ) ) { liczba_plyt++; } } zplikPlyta.close(); break; } case 2: { cout << "Wybrales opcje dodania wypozyczajacego" << endl; cout << "Ile wypozyczajacych chcesz dodac" << endl; cin >> wypozycajacy_plyte; for( int i = 0; i < wypozycajacy_plyte; i++ ) { cout << "Podaj identyfikator wypozyczajacego" << endl; cin >> id_wypozyczajacego; cout << "Podaj nazwisko wypożyczajacego:" << endl; cin >> nazwisko; cout << "Podaj wiek wypozyczajacego:" << endl; cin >> wiek; Wypozyczajacy tmpw( id_wypozyczajacego, wiek, nazwisko ); wypoz[ i ] = tmpw; } for( int i = 0; i < wypozycajacy_plyte; i++ ) { wypoz[ i ].wypisz_wypoz(); } getchar(); getchar(); ofstream doplikuWypozyczajacy( "wypozyczajacy.dat", ios_base::app | ios_base::binary ); for( int i = 0; i < wypozycajacy_plyte; i++ ) { doplikuWypozyczajacy.write(( char * ) & wypoz[ i ], sizeof wypoz[ liczba_wypozyczajacych ] ); } doplikuWypozyczajacy.close(); ifstream zplikWypozyczajacy( "wypozyczajacy.dat", ios_base::binary ); if( zplikWypozyczajacy.is_open() ) { liczba_wypozyczajacych = 0; while( zplikWypozyczajacy.read(( char * ) & wypoz[ liczba_wypozyczajacych ], sizeof( wypoz[ liczba_wypozyczajacych ] ) ) ) { liczba_wypozyczajacych++; } } zplikWypozyczajacy.close(); break; } case 3: { cout << "Wybrales opcje dodania wypozyczenia:" << endl; cout << "Ile wypozyczen chcesz pokazac? " << endl; cin >> wypozycenie_plyty; for( int i = 0; i < wypozycenie_plyty; i++ ) { cout << "Podaj ID wypozyczajacego" << endl; cin >> id_wypozyczajacego; cout << "Podaj ID plyty" << endl; cin >> id_plyty; Wypozyczenie tmpwp( id_wypozyczajacego, id_plyty ); wypozycz[ i ] = tmpwp; } for( int i = 0; i < wypozycenie_plyty; i++ ) { wypozycz[ i ].wypisz_wypozyczenie(); } getchar(); getchar(); ofstream doplikWypozyczenie( "wypozyczenie.dat", ios_base::app | ios_base::binary ); for( int i = 0; i < wypozycenie_plyty; i++ ) { doplikWypozyczenie.write(( char * ) & wypozycz[ i ], sizeof wypoz[ i ] ); } doplikWypozyczenie.close(); ifstream zplikWypozyczenie( "wypozyczenie.dat", ios_base::binary ); if( zplikWypozyczenie.is_open() ) { liczba_wypozyczen = 0; while( zplikWypozyczenie.read(( char * ) & wypozycz[ liczba_wypozyczen ], sizeof( wypozycz[ liczba_wypozyczen ] ) ) ) { liczba_wypozyczen++; } } zplikWypozyczenie.close(); break; } case 4: { for( int i = 0; i < liczba_plyt; i++ ) { printf( "\n" ); ply[ i ].wypisz_plyte(); } getchar(); getchar(); break; } case 5: { for( int i = 0; i < liczba_wypozyczajacych; i++ ) { printf( "\n" ); wypoz[ i ].wypisz_wypoz(); } getchar(); getchar(); break; } case 6: { for( int i = 0; i < liczba_wypozyczen; i++ ) { printf( "\n" ); wypozycz[ i ].wypisz_wypozyczenie(); } getchar(); getchar(); break; } case 7: break; case 8: srednia = 0; licznik = 0; for( int i = 0; i < liczba_wypozyczen; i++ ) { for( int j = 0; j < liczba_wypozyczajacych; j++ ) { if( wypozycz[ i ].daj_id_wypoz() == wypoz[ j ].daj_id() ) { for( int k = 0; k < liczba_plyt; k++ ) { if( wypozycz[ i ].daj_id_plyty() == ply[ k ].daj_id() ) { if( ply[ k ].porownaj_typ( "jazz" ) ) { srednia = wypoz[ j ].daj_wiek() + srednia; licznik++; } } } } } } srednia = srednia / licznik; cout << "Srednia wieku osob wypozyczajacych jazz : " << srednia << endl; getchar(); getchar(); break; case 9: { koniec = 't'; break; } } system( "cls" ); } while( koniec != 't' ); return 0; }
Problem w moim programie jest taki iż gdy wypożycze płyte osobie punkt 3(case 3) po naduszeniu 6 powinno mi wyświetlić wszystkie wypożyczenia to wurzuca mi liczby na minusie <a href="http://pl.tinypic.com?ref=24q3keo" target="_blank"><img src="http://i59.tinypic.com/24q3keo.jpg" border="0" alt="Image and video hosting by TinyPic"></a> |
|
libed |
» 2014-04-14 18:24:43 Mimo, że używasz klas to z obiektowością mało ma ten kod wspólnego. Płyta sama w sobie nie ma żadnego identyfikatora. Klasa płyty powinna zawierać jedynie informacje o niej. Wszelkie ID/kody powinny być nadawane przez klasę Wypożyczalni. Identycznie z ID klienta. Człowiek nie rodzi się z identyfikatorem. Takie rzeczy są nadawane przez kogoś. Np. metodą void Osoba::ZapiszSie( Wypozyczalnia * wyp ) { if( this->moja_wypozyczalnia != nullptr ) { cout << "Jestem juz zapisany!\n"; return; } int id_klienta = wyp->DodajKlienta( this ); if( id_klienta ) this->moje_id = id_klienta; else cout << "Wypozyczalnia odmowila rejestracji\n"; } Klasa Wypozyczenie powinna byc co najwyżej jakąś wewnętrzną strukturą klasy Wypożyczalnia. Metody typu void jakas_klasa::wypisz_cos() powinny być oznaczone modyfikatorem const, ponieważ nie zmieniają stanu obiektu. Reasumując: Brak podstawowej klasy reprezentującej Wypożyczalnie, która zarządzałaby płytami do wypożyczenia (wczytywanie/statystyka) oraz zamówieniami(komu i jaką płytę). 90% funkcji main powinno być wykonywane przez metody Wypozyczalni. Gdybyś to sensownie zaprojektował nie miałbyś żadnych problemów tuypu "kto? kiedy? komu? co?" i zarazem łatwiej można by było zrozumieć działanie programu. Aktualnie przebijanie się przez strukturalno-pseudoobiektowy main to droga przez mękę. |
|
krolik941023 |
prosba » 2015-05-25 21:59:01 Witam Cie kamil_20, posiadasz może kod do tego swojego programu już po poprawieniu błędów? bym był wdzięczny jak byś mi go podesłał na maila krolik941023@gmail.com |
|
« 1 » |