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

[c++] Program do obsługi biblioteki. Problem z funkcją wypożyczającą ksiązki

Ostatnio zmodyfikowano 2018-01-21 13:21
Autor Wiadomość
paula1902
Temat założony przez niniejszego użytkownika
[c++] Program do obsługi biblioteki. Problem z funkcją wypożyczającą ksiązki
» 2018-01-20 19:32:20
Mam problem z programem. Właściwie zalążkiem programu, bo te wszystkie dane powinny być pobierane od użytkownika lub z pliku i zapisane do pliku. Ale mam problem ze złożonymi strukturami dlatego postanowiłam najpierw spróbować w ten sposób.

Muszę stworzyć listę czytelników, listę książek i połączyć książki wypożyczone z czytelnikami.
Funkcje dodawania ksiązki i czytelnika działają. Natomiast problem pojawia się z wypożyczeniem (a więc i oddaniem, bo nie było możliwości sprawdzenia). Kompilator nie wyrzuca mi żadnych błędów. Próbowałam modyfikować funkcję na różne sposoby, jednak po wywołaniu funkcji wypozyczKs i nastepnym wypiszLC nie wyświetla się nic.


C/C++
#include <iostream>
#include <string>
using namespace std;


struct Ksiazka {
    string nAutora;
    string iAutora;
    string tytul;
    int liczba_egz;
    Ksiazka * Knast;
};


struct Wypozyczona {
    Ksiazka * wypozyczona;
    string dataWyp;
    Wypozyczona * nastWyp;
};

struct Czytelnik {
    string nazwisko;
    string imie;
    int nr_karty;
    Czytelnik * Cnast;
    Wypozyczona * wypKs;
};



void dodajKsiazke( Ksiazka *& gl, const string nazw, const string im, const string tytul, int const le );
void dodajCzytelnika( Czytelnik *& gl, const string nazw, const string im, int const nr );
void dodDoWypoz( Wypozyczona *& gl, Ksiazka *& doWyp, const string data );
void wypiszLK( Ksiazka * glowa );
void wypiszC( Czytelnik * czyt );
void wypiszLC( Czytelnik * glowa );
Czytelnik * znajdzCzytelnika( Czytelnik * gl, const string nazw, const string imie );
Ksiazka * znajdzKsiazke( Ksiazka * gl, const string tytul );
Wypozyczona * znajdzWypozyczona( Wypozyczona * gl, Ksiazka * szukana );
void usunKs( Ksiazka *& gl, Wypozyczona * gw, const string tytul );
void wypozycz( Ksiazka *& gl, Czytelnik * & gc, const string nazw, const string imie, const string tytul, const string data );
void usunZwyp( Wypozyczona *& gl, Wypozyczona *& usun );
void oddajKsiazke( Ksiazka * & gl, Czytelnik *& gc, const string nazw, const string imie, const string tytul );
void usunCzytelnika( Czytelnik * gl, const string nazwisko, const string imie );



int main()
{
    Czytelnik * glowaC = NULL;
    Ksiazka * glowaK = NULL;
    //Wypozyczona* glowaW = NULL;
   
    dodajKsiazke( glowaK, "Sienkiewicz", "Henryk", "W pustyni i w puszczy", 3 );
    dodajKsiazke( glowaK, "Sienkiewicz", "Henryk", "Krzyzacy", 15 );
    dodajKsiazke( glowaK, "Mickiewicz", "Adam", "Pan Tadeusz", 7 );
    dodajKsiazke( glowaK, "Kaminski", "Aleksander", "Kamienie na szaniec", 1 );
   
   
    dodajCzytelnika( glowaC, "Lis", "Piotr", 0256 );
    dodajCzytelnika( glowaC, "Nowak", "Piotr", 0471 );
    dodajCzytelnika( glowaC, "Nowak", "Adam", 0257 );
    dodajCzytelnika( glowaC, "Kot", "Anna", 0456 );
    dodajCzytelnika( glowaC, "Nowaczewski", "Piotr", 0252 );
    wypiszLC( glowaC );
    cout << endl;
   
    wypiszC( znajdzCzytelnika( glowaC, "Nowak", "Adam" ) );
    wypiszC( znajdzCzytelnika( glowaC, "Nowak", "Ada" ) );
    //wypozycz(glowaK, glowaW, glowaC, "Kot", "Ana", "Wiersze", "2017-03-12");
   
    cout << endl;
    wypozycz( glowaK, glowaC, "Nowak", "Piotr", "Krzyzacy", "2018-01-13" );
    wypozycz( glowaK, glowaC, "Nowak", "Piotr", "Pan Tadeusz", "2018-01-13" );
   
    wypozycz( glowaK, glowaC, "Nowak", "Adam", "Pan Tadeusz", "2018-01-13" );
    wypiszLC( glowaC );
   
    wypiszC( znajdzCzytelnika( glowaC, "Nowaczewski", "Piotr" ) );
   
    cin.get();
    return 0;
}




void dodajKsiazke( Ksiazka *& gl, const string nazw, const string im, const string tytul, int const le )
{
    Ksiazka * nowa = new Ksiazka;
    nowa->nAutora = nazw;
    nowa->iAutora = im;
    nowa->tytul = tytul;
    nowa->liczba_egz = le;
    nowa->Knast = NULL;
   
    if( gl == NULL ) //jesli jest pusta dodajemy na poczatek
    {
        gl = nowa; return;
    }
    if( gl = nowa )
         nowa->liczba_egz += gl->liczba_egz; //dodajemy liczbe egz
   
    if( gl->tytul > nowa->tytul )
    {
        nowa->Knast = gl;
        gl = nowa;
        return;
    }
    Ksiazka * tmp = gl; //zeby nie zmienic glowy
    while( tmp->Knast != NULL && tmp->Knast->tytul < nowa->tytul )
         tmp = tmp->Knast;
   
    nowa->Knast = tmp->Knast;
    tmp->Knast = nowa;
}

void dodajCzytelnika( Czytelnik *& gl, const string nazw, const string im, int const nr )
{
    Czytelnik * nowy = new Czytelnik;
    nowy->nazwisko = nazw;
    nowy->imie = im;
    nowy->nr_karty = nr;
    nowy->Cnast = NULL;
    nowy->wypKs = NULL;
   
    if( gl == NULL ) //jesli jest pusta dodajemy na poczatek
    {
        gl = nowy; return;
    }
   
    if( gl->nazwisko > nowy->nazwisko )
    {
        nowy->Cnast = gl;
        gl = nowy;
        return;
    }
    if( gl->nazwisko == nowy->nazwisko ) //jesli nazwiska sie powtarzaja
    {
        if( gl->imie > nowy->imie ) //porownujemy imiona
        {
            nowy->Cnast = gl;
            gl = nowy;
            return;
        }
    }
   
    Czytelnik * tmp = gl; //zeby nie zmienic glowy
    while( tmp->Cnast != NULL && tmp->Cnast->nazwisko < nowy->nazwisko )
         tmp = tmp->Cnast;
   
    nowy->Cnast = tmp->Cnast;
    tmp->Cnast = nowy;
}

void dodDoWypoz( Wypozyczona *& gl, Ksiazka *& doWyp, const string data ) //dodaje do listy wypozyczonych
{
    Wypozyczona * wyp = new Wypozyczona;
    wyp->wypozyczona = doWyp;
    wyp->dataWyp = data;
    wyp->nastWyp = NULL;
   
    if( gl == NULL ) //jesli jest pusta dodajemy na poczatek
    gl = wyp; return;
   
    if( gl->dataWyp > wyp->dataWyp ) //sort wg daty
    {
        wyp->nastWyp = gl;
        gl = wyp;
        return;
    }
    Wypozyczona * tmp = gl; //zeby nie zmienic glowy
    while( tmp->nastWyp != NULL && tmp->nastWyp->dataWyp < wyp->dataWyp )
         tmp = tmp->nastWyp;
   
    wyp->nastWyp = tmp->nastWyp;
    tmp->nastWyp = wyp;
}

void wypiszLK( Ksiazka * glowa ) //wypisuje liste ksiazek
{
    while( glowa != NULL )
    {
        cout << glowa->nAutora << " " << glowa->iAutora << " " << '"' << glowa->tytul << '"' << " " << glowa->liczba_egz << endl;
        glowa = glowa->Knast;
    }
}

void wypiszC( Czytelnik * czyt ) //tylko jednego czytelnika i liste jego ksiazek
{
    if( czyt != NULL ) {
        cout << czyt->nazwisko << " " << czyt->imie << " " << czyt->nr_karty << endl;
        if( czyt->wypKs != NULL )
             wypiszLK( czyt->wypKs->wypozyczona );
       
    }
}
void wypiszLC( Czytelnik * glowa ) //wypisuje liste wszystkich czytelnikow i ich ksiazek
{
    while( glowa != NULL )
    {
        wypiszC( glowa );
        if( glowa->wypKs != NULL )
             wypiszLK( glowa->wypKs->wypozyczona );
       
        glowa = glowa->Cnast;
    }
}
Czytelnik * znajdzCzytelnika( Czytelnik * gl, const string nazw, const string imie )
{
    while( gl != NULL )
    {
        if( gl->nazwisko == nazw && gl->imie == imie )
             return gl;
       
        gl = gl->Cnast;
    }
    return NULL;
   
}


Ksiazka * znajdzKsiazke( Ksiazka * gl, const string tytul )
{
    while( gl != NULL )
    {
        if( gl->tytul == tytul )
             return gl;
       
        gl = gl->Knast;
    }
    return NULL;
   
}

Wypozyczona * znajdzWypozyczona( Wypozyczona * gl, Ksiazka * szukana ) //szuka wsrod wypozyczonych
{
    while( gl != NULL )
    {
        if( gl->wypozyczona == szukana )
             return gl;
       
        gl = gl->nastWyp;
    }
    return NULL;
}

void usunKs( Ksiazka *& gl, Wypozyczona * gw, const string tytul )
{
    Ksiazka * usun = znajdzKsiazke( gl, tytul );
    if( gl == NULL ) { cout << "Brak ksiazek w bazie!" << endl; return; }
    if( usun == NULL ) { cout << "Nie ma takiej ksiazki w bazie!" << endl; return; }
    if( znajdzWypozyczona( gw, usun ) != NULL ) {
        if( gl == usun ) //jesli jest to pierwszy element
        {
            gl = gl->Knast;
            delete usun; return;
        }
        Ksiazka * tmp = gl;
        while(( tmp->Knast != NULL ) && tmp->Knast != usun )
             tmp = tmp->Knast;
       
        if( tmp->Knast != NULL )
        {
            usun = tmp->Knast;
            tmp->Knast = tmp->Knast->Knast;
            delete usun;
            return;
        } cout << "Ksiazka jest wypozyczona!" << endl;
    }
}
void wypozycz( Ksiazka *& gl, Czytelnik * & gc, const string nazw, const string imie, const string tytul, const string data ) //dodaje do listy wszystkich wpozyczonych ksiazkek
{
    Ksiazka * szukana = znajdzKsiazke( gl, tytul );
    if( szukana == NULL )
         cout << "Brak ksiazki w systemie!" << endl;
   
    if( szukana->liczba_egz == 0 ) //jesli jest w bazie, spr jest wystarczajaca ilosc
         cout << "Brak dostepnych egzemplarzy!";
   
    Czytelnik * czytel = znajdzCzytelnika( gc, nazw, imie ); //szuka czytelnika, ktory chce wypozyczyc ks
    if( czytel == NULL )
         cout << "Nie ma takiego czytelnika w bazie!";
   
    dodDoWypoz( czytel->wypKs, szukana, data ); //dodajemy do listy wypozyczonych ks czytelnika
    ( szukana->liczba_egz ) --; //dekrementujemy liczbe dostepnych egzemparzy
}


void usunZwyp( Wypozyczona *& gl, Wypozyczona *& usun )
{
    if( gl == NULL ) { return; }
    if( gl == usun ) //jesli jest to pierwszy element
    {
        gl = gl->nastWyp;
        delete usun; return;
    }
    Wypozyczona * tmp = gl;
    while(( tmp->nastWyp != NULL ) && tmp->nastWyp != usun )
         tmp = tmp->nastWyp;
   
    if( tmp->nastWyp != NULL )
    {
        usun = tmp->nastWyp;
        tmp->nastWyp = tmp->nastWyp->nastWyp;
        delete usun;
        return;
    }
}

void oddajKsiazke( Ksiazka * & gl, Czytelnik * & gc, const string nazw, const string imie, const string tytul ) //usuwa ks z listy wyp u czytelnika i z listy wszystkich wypozyczonych
{
    Czytelnik * czyt = znajdzCzytelnika( gc, nazw, imie );
    if( czyt == NULL );
   
    cout << "Nie ma takiego czytelnika w bazie!" << endl;
    Ksiazka * ks = znajdzKsiazke( gl, tytul );
    Wypozyczona * wypC = znajdzWypozyczona( czyt->wypKs, ks ); //w liscie wypozyczonych czytelnika
    if( wypC == NULL )
         cout << "Nie znaleziono takiej ksiazki u czytelnika!" << endl;
   
    if( ks == NULL )
         cout << "Brak takiej ksiazki w bazie!" << endl;
   
    usunZwyp( czyt->wypKs, wypC );
    ks->liczba_egz++;
}

void usunCzytelnika( Czytelnik * gl, const string nazwisko, const string imie )
{
    Czytelnik * usun = znajdzCzytelnika( gl, nazwisko, imie );
    if( gl == NULL ) { cout << "Brak czytelnikow w bazie!" << endl; return; }
    if( gl == usun ) //jesli jest to pierwszy element
    {
        if( usun->wypKs == NULL )
        {
            gl = gl->Cnast;
            delete usun; return;
        }
        cout << "Nie mozna usunac czytelnika!" << endl;
    }
    Czytelnik * tmp = gl;
    while(( tmp->Cnast != NULL ) && tmp->Cnast != usun )
         tmp = tmp->Cnast;
   
    if( tmp->Cnast != NULL )
    {
        if( usun->wypKs == NULL ) {
            usun = tmp->Cnast;
            tmp->Cnast = tmp->Cnast->Cnast;
            delete usun;
            return;
        }
        cout << "Nie mozna usunac czytelnika!" << endl;
    }
}
P-168855
Kinexity
» 2018-01-20 23:03:48
if( czyt == NULL );
 - w funkcji oddajKsiazke jest taki błąd.
P-168856
YooSy
» 2018-01-21 01:26:51
» Kurs C++ / FAQNajczęściej spotykane bugi często zadawane pytania
P-168857
paula1902
Temat założony przez niniejszego użytkownika
» 2018-01-21 10:27:48
Znalazłam błąd w funkcji dodajKsiazke :
C/C++
if( gl = nowa )
     nowa->liczba_egz += gl->liczba_egz;

A więc zapewne w funkcji wypozycz błąd równie tkwi w:
C/C++
dodDoWypoz( czytel->wypKs, szukana, data ); //dodajemy do listy wypozyczonych ks czytelnika
( szukana->liczba_egz ) --;

Nie mogę w taki sposób zmieniać wartości?
W jaki sposób to zrobić?

Chodzi mi o to, żeby powiększyć liczbę dostępnych egzemplarzy jeśli dodajemy książkę, która już istnieje.
A jeśli wypożyczam, najpierw sprawdzić czy liczba dostępnych egzemplarzy nie jest równa 0, jeśli nie to zmniejszyć dostępną liczbę o jeden.
P-168858
YooSy
» 2018-01-21 13:21:09
Użyj debugera.
P-168863
« 1 »
  Strona 1 z 1