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

[C++]Struktury dynamiczne - dodawanie kolejnych osób do bazy danych

Ostatnio zmodyfikowano 2014-12-16 17:18
Autor Wiadomość
Tomek_z_W11
» 2014-12-03 22:38:33
Nie widzę potrzeby robienia listy.

Wszystko jest w porządku, tak, możesz przesłać kod - możesz równie dobrze skompilować.

Zastanów się jeszcze po co przekazujesz funkcji argument ilość specjalistów? I czy jest to potrzebne - nie znam Twoich zamiarów, na ten moment wygląda to tak, że ten argument jest zbędny, ale to Ty piszesz ten program i Ty wiesz czy go potrzebujesz, czy nie.
P-122130
jedrula.pogo
Temat założony przez niniejszego użytkownika
» 2014-12-03 23:49:58
Przekazuję do
dodaj_lekarz
 ilość specjalistów, bo będzie ona potrzebna dla funkcji
powieksz_pamiec
, która jest wywolywana wewnatrz funkcji dodającej lekarzy.

Oto cały kod:
C/C++
#include <iostream>
#include<iomanip>
#include<cstdlib>
#include <cstring>

using namespace std;

const int D_ID = 5; // ID <0000 ; 9999 >
const int D_IM = 10;
const int D_NAZ = 20;
const int D_OS = 40; // ??
const int D_SPEC = 20;
const int D_OPI = 255;


struct lekarz {
    char ID[ D_ID ];
    char imie[ D_IM ];
    char nazwisko[ D_NAZ ];
    char osrodek[ D_OS ];
    char specjalnosc[ D_SPEC ];
    int ilpacj;
};

struct opinie {
    char ID[ D_ID ];
    char opinia[ D_OPI ];
    char imie_kom[ D_IM ];
    char naz_kom[ D_NAZ ];
   
};

// --------------MENU---------------------
void menu( lekarz * LK, int liczba_spec );
void menu_gl( int opcja );
void menu_szuk( lekarz * LK, const int liczba_spec );
//-------------FUNKCJE DODAJ/USUN------------

void dodaj_lekarza( lekarz * LK, int liczba_spec );
void kasuj_lekarza( lekarz * LK, int & liczba_spec );

//-------------EDYCJA DANYCH-----------------

void edycja_lekarza( lekarz * LK, int & liczba_spec );

//-------------WYSZUKIWANIE------------------

int szukaj_wg_ID1( lekarz * LK, const int liczba_spec, char ID[] );
void szukaj_wg_ID2( lekarz * LK, const int liczba_spec );

// ------------LISTA-------------------------

void lista_naglowek();
void lista_lekarz( lekarz * LK );
void lista_calosc( lekarz * LK, const int liczba_spec );

//-------------POWIEKSZANIE PAMIECI----------

void powieksz_pamiec( lekarz * LK, int liczba_spec );

//-------------------------------------------

int indeks; // ilosc uzupelnionych danych o specjalistach w bazie

int main() {
    lekarz * LK;
    int liczba_spec = 50;
   
   
    LK = new lekarz[ liczba_spec ];
   
    menu( LK, liczba_spec );
   
    delete[] LK;
   
}

// ---------------------------------

//FUNKCJE ODPOWIADAJACE ZA MENU

void menu_gl( int opcja )
{
    switch( opcja )
    {
    case 1: {
            cout << endl;
            cout << "BAZA DANYCH SPECJALISTOW" << endl;
            cout << "------------------------" << endl;
            cout << "MENU GLOWNE :" << endl;
            cout << "------------------------" << endl;
            cout << "1 - Dodaj Lekarza" << endl;
            cout << "2 - Usun Lekarza" << endl;
            cout << "3 - Edytuj dane lekarza" << endl;
            cout << "4 - Wyszukaj lekarza" << endl;
            cout << "5 - Lista lekarzy" << endl;
            cout << "6 - Zobacz opinie o lekarzu" << endl;
            cout << "0 - Zakoncz prace" << endl;
            cout << ">>";
            break;
        }
    case 2: {
            cout << endl;
            cout << "MENU WYSZUKIWANIA : " << endl;
            cout << "------------------------" << endl;
            cout << "1 - Wyszukiwanie lekarza po nazwisku" << endl;
            cout << "2 - Wyszukiwanie lekarza po specjalizacji" << endl;
            cout << "3 - Wyszukiwanie po osrodku" << endl;
            cout << "4 - Wyszukiwanie specjalisty z najmniejsza kolejka" << endl;
            cout << "5 - Wyszukiwanie lekarza po ID" << endl;
            cout << "0 - Wyjdz do glownego menu" << endl;
            cout << ">>";
            break;
        }
    }
}

void menu( lekarz LK[], int liczba_spec )
{
    int opcja_menu;
   
    do {
        menu_gl( 1 );
        cin >> opcja_menu;
        switch( opcja_menu )
        {
        case 1: dodaj_lekarza( LK, liczba_spec );
            break;
        case 2: kasuj_lekarza( LK, liczba_spec );
            break;
            //case 3: menu_edycja();
            //break;
        case 4: menu_szuk( LK, liczba_spec );
            break;
        case 5: lista_calosc( LK, liczba_spec );
            break;
        }
       
    } while( opcja_menu != 0 );
   
}

void menu_szuk( lekarz LK[], const int liczba_spec )
{
    int opcja_menu;
    do {
        menu_gl( 2 );
        cin >> opcja_menu;
        switch( opcja_menu )
        {
        case 1:;
            break;
        case 2:;
            break;
        case 3:;
            break;
        case 4:;
            break;
        case 5: szukaj_wg_ID2( LK, liczba_spec );
            break;
        }
    } while( opcja_menu != 0 );
   
}



//-----------FUNKCJE DODAJ/USUN---------------

void dodaj_lekarza( lekarz * LK, int liczba_spec )
{
    int n;
    cout << "Ilu chcesz dodac specjalistow ? (Podaj liczbe) : ";
    cin >> n;
   
    if(( indeks + n ) >= 49 )
    {
        powieksz_pamiec( LK, liczba_spec );
    }
   
    for( int i = 0; i < n; i++ )
    {
       
        cout << "ID : ";
        cin >> LK[ indeks ].ID;
        cout << "Imie : ";
        cin >> LK[ indeks ].imie;
        cout << "Nazwisko : ";
        cin >> LK[ indeks ].nazwisko;
        cout << "Osrodek (miasto) : ";
        cin >> LK[ indeks ].osrodek;
        cout << "Specjalnosc : ";
        cin >> LK[ indeks ].specjalnosc;
        cout << "Ilosc pacjentow w kolejce : ";
        cin >> LK[ indeks ].ilpacj;
        indeks++;
    }
}

void kasuj_lekarza( lekarz * LK, int & liczba_spec )
{
    char ID[ D_ID ];
    int ind; //indeks elementu do usuniecia
   
    cout << " Podaj ID lekarza do skasowania: ";
    cin >> ID;
    if(( ind = szukaj_wg_ID1( LK, liczba_spec, ID ) ) != - 1 ) //znaleziony lekarz o okreslonym ID
    {
        for( int i = ind; i < liczba_spec - 1; i++ )
             LK[ i ] = LK[ i + 1 ];
       
        indeks--;
        cout << "Sukces !" << endl;
    }
    else
    {
        cout << "Nie odnaleziono lekarza o podanym numerze ID " << ID << endl;
        system( "pause" );
    }
}


//---------------WYSZUKIWANIE-----------------
// wyszukiwanie ID
int szukaj_wg_ID1( lekarz * LK, const int liczba_spec, char ID[] )
{
    for( int i = 0; i < liczba_spec; i++ )
         if( strcmp( LK[ i ].ID, ID ) == 0 ) return( i );
   
    return( - 1 );
}

void szukaj_wg_ID2( lekarz * LK, const int liczba_spec )
{
    char ID[ D_ID ];
    int ind;
   
    cout << "Podaj ID : ";
    cin >> ID;
    if(( ind = szukaj_wg_ID1( LK, liczba_spec, ID ) ) != - 1 )
    {
        lista_naglowek();
        lista_lekarz( LK + ind );
    }
    else
    {
        cout << "Nie ma osoby o podanym numerze ID " << ID << endl;
        system( "pause" );
    }
}

//wyszukiwanie specjalizacja


//---------------LISTA------------------------

void lista_naglowek()
{
    cout << endl;
    cout << "|ID |  IMIE   |  NAZWISKO  | OSRODEK |  SPECJALNOSC  | KOLEJKA | " << endl;
    cout << "_________________________________________________________________" << endl;
   
}

void lista_lekarz( lekarz * LK )
{
    cout << LK->ID;
    cout << setw( 10 ) << LK->imie;
    cout << setw( 15 ) << LK->nazwisko;
    cout << setw( 10 ) << LK->osrodek;
    cout << setw( 15 ) << LK->specjalnosc;
    cout << setw( 10 ) << LK->ilpacj;
    cout << endl;
}

void lista_calosc( lekarz * LK, const int liczba_spec )
{
    lista_naglowek();
    for( int i = 0; i < indeks; i++ )
         lista_lekarz( LK + i );
   
    cout << "________________________________________________________________" << endl;
    cout << "Ilosc lekarzy w bazie : " << indeks << endl;
    cout << endl;
   
}

//-------------------EDYCJA------------------------------

void edycja_lekarza( lekarz * LK, int & liczba_spec )
{
    char ID[ D_ID ];
    int ind; //indeks elementu do edycji
   
    cout << " Podaj ID lekarza do edycji: ";
    cin >> ID;
    if(( ind = szukaj_wg_ID1( LK, liczba_spec, ID ) ) != - 1 ) //znaleziony lekarz o okreslonym ID
    {
        for( int i = ind; i < liczba_spec - 1; i++ )
             cout << "Stare imie : " << LK[ i ].imie << endl;
       
        cout << "Nowe imie  :"; cin >> LK[ i ].imie; cout << endl;
        cout << "Stare nazwisko : " << LK[ i ].nazwisko << endl;
        cout << "Nowe nazwisko  :"; cin >> LK[ i ].nazwisko; cout << endl;
        cout << "Stary osrodek : " << LK[ i ].osrodek << endl;
        cout << "Nowe osrodek  :"; cin >> LK[ i ].osrodek; cout << endl;
        cout << "Stara specjalnosc : " << LK[ i ].specjalnosc << endl;
        cout << "Nowa specjalnosc  :"; cin >> LK[ i ].specjalnosc; cout << endl;
        cout << "Obecna ilosc osob w kolejce : " << LK[ i ].ilpacj << endl;
        cout << "Nowa ilosc osob w kolejce:"; cin >> LK[ i ].ilpacj; cout << endl;
        cout << "Sukces !" << endl;
    }
    else
    {
        cout << "Nie odnaleziono lekarza o podanym numerze ID " << ID << endl;
        system( "pause" );
       
       
    }
   
   
   
   
    //------------------POWIEKSZANIE PAMIECI-----------------
   
    void powieksz_pamiec( lekarz * LK, int liczba_spec )
    {
        lekarz * temp = new lekarz[ liczba_spec * 2 ];
       
        for( int i = 0; i < liczba_spec; i++ )
        {
            temp[ i ].ID = LK[ i ].ID;
            temp[ i ].imie = LK[ i ].imie;
            temp[ i ].nazwisko = LK[ i ].nazwisko;
            temp[ i ].osrodek = LK[ i ].osrodek;
            temp[ i ].specjalnosc = LK[ i ].specjalnosc;
            temp[ i ].ilpacj = LK[ i ].ilpacj;
        }
        delete[] LK;
        LK = temp;
        liczba_spec *= 2;
    }

Jest jeszcze funkcja o której nie wspominałem, czyli
edycja_lekarz
, wydaje mi się, że jest poprawnie zrobiona.

Kompilator wypuszcza mi właśnie błędy tylko w tej właśnie funkcji:

In function 'void edycja_lekarza(lekarz*, int&)':

300 37 [Error] name lookup of 'i' changed for ISO 'for' scoping [-fpermissive]
300 37 [Note] (if you use '-fpermissive' G++ will accept your code)
325 1 [Error] a function-definition is not allowed here before '{' token
340 1 [Error] expected '}' at end of input
28 recipe for target 'main.o' failed

Jestem już pewnie natrętny, przepraszam. : )
P-122143
Tomek_z_W11
» 2014-12-04 12:31:36
Mnie to nie przeszkadza.

zmień int& liczba_spec na int liczba_spec, jeżeli zmienna liczba_spec jest typu int, to w funkcji musisz przechwytywać typ int,nie int &
P-122160
jedrula.pogo
Temat założony przez niniejszego użytkownika
» 2014-12-04 13:24:39
Dobrze, to już zostało zmienione.

Dalej występują błędy podane w przedostatnim moim poście i nie wiem co one do końca oznaczają i jak się ich pozbyć.

Natomiast mam pytanie czy funkcja
powieksz_pamiec
 w obecnej formie, na pewno będzie zmieniała rozmiar tablicy ? Pytam ponieważ w argumentach ma zmienną liczba_spec, która została zadeklarowana w mainie, czy funkcja będzie bezpośrednio zmieniać jej wartość ?

P-122161
Tomek_z_W11
» 2014-12-04 14:21:47
Występują błędy, bo nie zamknąłeś nawiasu klamrowego funkcji.


Nie, funkcja nie będzie zmieniać wartości zmiennej liczba_spec.
W momencie wywołania funkcji z przekazanymi jej jakimiś argumentami, funkcja tworzy kopie - zmienne lokalne - i na nich operuje. Jeżeli w funkcji zmienisz zmienną lokalną, to nie wpłynie to na zmienną, którą umieściłeś jako argument funkcji. Żeby lepiej to zrozumieć, prześledź sobie poniższy kod:

C/C++
void fun( int argument )
{
    argument = 5000; //pod zmienna LOKALNA zostaje przypisana wartosc 5000, nasze "main'owe" a sie nie zmienia
    {
       
        int main()
        {
            int a = 3; // nasza zmienna ma wartosc 3
           
            cout << a << endl; //wypisuje 3
           
            fun( a ); //wywolanie funkcji z argumentem naszej zmiennej (w funkcji pod argument zostaje przypisane 5000, ale to nic)
           
            cout << a << endl; //wypisuje 3
        }


Dalej nie wiem po co Ci zmienna liczba_spec, możesz użyć zmiennej globalnej indeks do określenia ilości specjalistów.
indeks+1 - liczba  aktualnie dodanych specjalistów. Powiem więcej, to będzie lepsze rozwiązanie, ale oczywiście rób jak uważasz.
P-122169
jedrula.pogo
Temat założony przez niniejszego użytkownika
» 2014-12-04 19:28:19
Okej, po wspólnej pomocy Twojej @Tomek_z_W11 i konsultantem z uczelni doszliśmy do takich przeróbek.
Otóż:
powieksz_pamiec
Teraz wygląda tak:

C/C++
void powieksz_pamiec( lekarz * LK, int liczba_spec )
{
    lekarz * temp = new lekarz[ liczba_spec * 2 ]; //tablca tymczasowa
   
    for( int i = 0; i < liczba_spec; i++ )
    {
        strcmp( temp[ i ].ID, LK[ i ].ID ); //przepisanie zawartosci
        strcmp( temp[ i ].imie, LK[ i ].imie );
        strcmp( temp[ i ].nazwisko, LK[ i ].nazwisko );
        strcmp( temp[ i ].osrodek, LK[ i ].osrodek );
        strcmp( temp[ i ].specjalnosc, LK[ i ].specjalnosc );
        strcmp( temp[ i ].ilpacj, LK[ i ].ilpacj );
    }
    delete[] LK;
    LK = temp;
    liczba_spec *= 2;
}

Zrozumiałem, że strcmp również może służyć do przepisywania wartości na kolejne tablice.

Program się kompiluje i uruchamia.

Co o tym sądzisz ?

Przy okazji uświadomiono mi, że nie jest to najwydajniejsze rozwiązanie do baz danych i poszedłem trochę
inną ścieżką niż zakładano przy tym zadaniu.

@Tomek_z_W11 Masz jak zawsze rację z tym nadmiernym używaniem liczba_spec, już niedługo będę czyścił kod od zbędnych zastosowań.

Tymczasem mam w tym momencie problem z funkcją
edytuj_lekarza
.

Po podaniu ID, wpisuje nowe dane, a funkcja po raz kolejny zatacza koło.

C/C++
void edycja_lekarza( lekarz * LK, int liczba_spec )
{
    char ID[ D_ID ];
    int ind; //indeks elementu do edycji
   
    cout << " Podaj ID lekarza do edycji: ";
    cin >> ID;
    if(( ind = szukaj_wg_ID1( LK, liczba_spec, ID ) ) != - 1 ) //znaleziony lekarz o okreslonym ID
    {
        for( int i = ind; i < liczba_spec - 1; i++ )
        {
           
            cout << "Stare imie : " << LK[ i ].imie << endl;
            cout << "Nowe imie : ";
            cin >> LK[ i ].imie; cout << endl;
           
            cout << "Stare nazwisko : " << LK[ i ].nazwisko << endl;
            cout << "Nowe nazwisko : ";
            cin >> LK[ i ].nazwisko; cout << endl;
           
            cout << "Stary osrodek : " << LK[ i ].osrodek << endl;
            cout << "Nowe osrodek : ";
            cin >> LK[ i ].osrodek; cout << endl;
           
            cout << "Stara specjalnosc : " << LK[ i ].specjalnosc << endl;
            cout << "Nowa specjalnosc : ";
            cin >> LK[ i ].specjalnosc; cout << endl;
           
            cout << "Obecna ilosc osob w kolejce : " << LK[ i ].ilpacj << endl;
            cout << "Nowa ilosc osob w kolejce : ";
            cin >> LK[ i ].ilpacj; cout << endl;
           
            cout << "Sukces !" << endl;
        }
    }
    else
    {
        cout << "Nie odnaleziono lekarza o podanym numerze ID " << ID << endl;
        system( "pause" );
       
       
    }
}

Gdzie popełniam błąd w tym przypadku ?
Pozdrawiam



P-122206
Kaikso
» 2014-12-04 20:55:40
Ta pętla for jest zbędna jeśli edytujesz lekarza o wybranym ID to poco powtarzać czynność dla wszystkich ID w górę.
Usuń pętle, a miejsca z `i' zastąp ind.
P-122215
jedrula.pogo
Temat założony przez niniejszego użytkownika
» 2014-12-04 21:33:40
Racja, głupie rozumowanie. Dzięki za poradę.
P-122218
1 2 « 3 » 4 5
Poprzednia strona Strona 3 z 5 Następna strona