Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Odczyt z klas

Ostatnio zmodyfikowano 2015-05-25 21:59
Autor Wiadomość
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
C/C++
//
#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; //płyta,wypożyczający,wypożyczenie;
    int id_plyty;
    char rodz_muzyki[ 10 ]; //id_plyty(case 1,3) rodz_muzyki (case 1)
    int id_wypozyczajacego, wiek; // case 2
    char nazwisko[ 50 ]; //case 2
    int liczba_plyt, liczba_wypozyczajacych, liczba_wypozyczen; //case 4,5,6
    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();
    //wypozyczenie.dat zplikWypozyczenie("wypozyczenie.dat"
   
   
    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;
                   
                   
                   
                    //wypoz[i].Wypozyczajacy(id_wypozyczajacego,nazwisko,wiek);
                   
                }
               
                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;
                   
                    //wypozycz[i].Wypozyczenie(id_wypozyczajacego,id_plyty);
                }
                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>
P-108122
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ą
C/C++
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ę.
P-108173
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
P-132786
« 1 »
  Strona 1 z 1