jedrula.pogo Temat założony przez niniejszego użytkownika |
[C++]Struktury dynamiczne - dodawanie kolejnych osób do bazy danych » 2014-12-02 12:12:05 Witam ! Mam za zadanie stworzenie bazy danych osób w oparciu o struktury dynamiczne. Program ma na początku pytać ile zarezerwować miejsca na bazę, a następnie wykonywać różne funkcje takie jak dodawanie , usuwanie , edycja i tym podobne. Obecnie mam problem z dodawaniem osób do bazy. Załóżmy, że na początku proszę program o zarezerwowanie 50 miejsc w tablicy dynamicznej ( i tutaj już wiem, że nie będę tego modyfikował). Następnie uruchamiam funkcję dodaj_lekarza i powiedzmy, że w tym momencie chcę dodać na razie dwie osoby. Mam więc dwie osoby o odpowiednio indeksie 0 i 1. I powiedzmy, że teraz chciałbym znowu dodać na przykład dwie kolejne osoby ( zachowując poprzednie dane) o indeksach 3 i 4 i tak dalej. W tym właśnie momencie nie wiem jak to zrealizować w funkcji dodaj_lekarza, mam wykorzystać jakąś kolejną zmienną, która będzie przechowywać historię zmiennej liczba_spec ? Przepraszam za ewentualny bałagan myślowy, dopiero się uczę i nie mogę sobie z tym poradzić. Oto co mi się udało napisać : #include <iostream> #include<iomanip> #include<cstdlib> #include <cstring>
using namespace std;
const int D_ID = 3; 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 opinia[ D_OPI ]; char imie_kom[ D_IM ]; char naz_kom[ D_NAZ ]; };
void menu( lekarz LK[], int liczba_spec ); void menu_gl( int opcja ); void menu_szuk( lekarz LK[], const int liczba_spec ); void menu_kasuj();
void dodaj_lekarza( lekarz LK[], int & liczba_spec ); void kasuj_lekarza( lekarz LK[], int & liczba_spec );
int szukaj_wg_ID1( lekarz LK[], const int liczba_spec, char ID[] ); void szukaj_wg_ID2( lekarz LK[], const int liczba_spec );
void lista_naglowek(); void lista_lekarz( lekarz LK[] ); void lista_calosc( lekarz LK[], const int liczba_spec );
int main() { lekarz * LK; int liczba_spec, liczba_spec2; cout << "Podaj ilosc specjalistow (rezerwacja pamieci) : "; cin >> liczba_spec; liczba_spec2 = liczba_spec; LK = new lekarz[ liczba_spec ]; menu( LK, liczba_spec ); delete[] LK; }
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 << "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; } case 3: { cout << endl; cout << "MENU KASOWANIA : " << endl; cout << "------------------------" << endl; cout << "1 - Skasuj dane 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: menu_kasuj(); 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 ); }
void menu_kasuj() { int opcja_menu; do { menu_gl( 3 ); cin >> opcja_menu; switch( opcja_menu ) { case 1:; break; case 2:; break; } } while( opcja_menu != 0 ); }
void dodaj_lekarza( lekarz LK[], int & liczba_spec ) { int n; cout << "Ilu chcesz dodac specjalistow ? (Podaj liczbe) : "; cin >> n; for( int i = 0; i < n; i++ ) { cout << "ID : "; cin >> LK[ i ].ID; cout << "Imie : "; cin >> LK[ i ].imie; cout << "Nazwisko : "; cin >> LK[ i ].nazwisko; cout << "Osrodek (miasto) : "; cin >> LK[ i ].osrodek; cout << "Specjalnosc : "; cin >> LK[ i ].specjalnosc; cout << "Ilosc pacjentow w kolejce : "; cin >> LK[ i ].ilpacj; } }
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" ); } }
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 < liczba_spec; i++ ) lista_lekarz( LK + i ); cout << "________________________________________________________________" << endl; cout << "Ilosc lekarzy w bazie : " << liczba_spec << endl; cout << endl; }
|
|
Tomek_z_W11 |
» 2014-12-02 17:33:40 Jeżeli lekarzy przechowujesz w tablicy, to proponuje to zrobić w ten sposób: - Tworzysz zmienną globalną indeks, która ma na początku wartość 0. - W momencie, gdy użytkownik poprosi o dodanie lekarza - wywołaj odpowiednią funkcje, dodaj_lekarza() czy jak ją tam nazwałeś. - W funkcji prosisz o ilość specjalistów, zapisujesz ich pod indeks, indeks+1, indeks+2 itd... (zależnie ile masz ich zapisać), a przed wyjściem z funkcji zwiększasz indeks tak, żeby przy następnym wywołaniu funkcji lekarze byli znowu przypisywani pod odpowiednie indeksy tablicy - te jeszcze nie użyte. - Jeżeli ktoś zapisze 3 lekarzy, to indeks zwiększasz o 3, jeżeli o 5 lekarzy to indeks zwiększasz o 5. |
|
jedrula.pogo Temat założony przez niniejszego użytkownika |
» 2014-12-02 20:11:38 Zrobiłem to co powiedziałeś. Czy ten kod ma w tej chwili sens ? Obecnie napisałem funkcje na usuwanie , dodawanie , wyszukiwanie po ID. #include <iostream> #include<iomanip> #include<cstdlib> #include <cstring>
using namespace std;
const int D_ID = 3; 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 opinia[ D_OPI ]; char imie_kom[ D_IM ]; char naz_kom[ D_NAZ ]; };
void menu( lekarz LK[], int liczba_spec ); void menu_gl( int opcja ); void menu_szuk( lekarz LK[], const int liczba_spec ); void menu_kasuj();
void dodaj_lekarza( lekarz LK[], int & liczba_spec ); void kasuj_lekarza( lekarz LK[], int & liczba_spec );
int szukaj_wg_ID1( lekarz LK[], const int liczba_spec, char ID[] ); void szukaj_wg_ID2( lekarz LK[], const int liczba_spec );
void lista_naglowek(); void lista_lekarz( lekarz LK[] ); void lista_calosc( lekarz LK[], const int liczba_spec );
int indeks;
int main() { lekarz * LK; int liczba_spec; cout << "Podaj ilosc specjalistow (rezerwacja pamieci) : "; cin >> liczba_spec; LK = new lekarz[ liczba_spec ]; menu( LK, liczba_spec ); delete[] LK; }
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 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 ); }
void dodaj_lekarza( lekarz LK[], int & liczba_spec ) { int n; cout << "Ilu chcesz dodac specjalistow ? (Podaj liczbe) : "; cin >> n; 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; cout << " Podaj ID lekarza do skasowania: "; cin >> ID; if(( ind = szukaj_wg_ID1( LK, liczba_spec, ID ) ) != - 1 ) { 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" ); } }
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" ); } }
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; }
|
|
darko202 |
» 2014-12-02 20:52:51 pewnie nie zauważyłeś że na razie nie masz w programie zwiększania rozmiaru tablicy zrobić to trzeba według algorytmu jesli skonczy mi sie miejsce w mojej tablicy to tworze tablice tymczasowa przepisuje zawartosc mojej tablicy do tymczasowej kasuje starą tablicę przypisane do tablicy wskaźnika tablicy tymczasowej zwiększam pole informujące o wielkości tablicy np. podobny wcześniejszy przypadek z forum tam była struktura historia i zmienna globalna a - ilość zarezerwowanej pamięci void powieksz( int licznik, abcd *& historia, int * wsk_a ) { if( licznik == * wsk_a ) { abcd * temp = new abcd[ * wsk_a * 2 ]; for( int i = 0; i < * wsk_a; i++ ) { temp[ i ].x = historia[ i ].x; } delete[] historia; historia = temp; * wsk_a *= 2; } }
jeśli mogę Ci radzić to koncentruj się na istotnym dla Ciebie elemencie niepotrzebnie załączasz cały kod (wystarczy struktura, istotne funkcje (najlepiej ta która Ci dolega) + main nie uwzględniłeś rady @Tomek_z_W11 |
|
jedrula.pogo Temat założony przez niniejszego użytkownika |
» 2014-12-02 21:26:09 void dodaj_lekarza( lekarz LK[], int & liczba_spec ) { int n; cout << "Ilu chcesz dodac specjalistow ? (Podaj liczbe) : "; cin >> n; 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++; } }
Czy to jest złe przekształcenie według rad @TOMEK_Z_W11? Dodałem zmienną globalną indeks i inkrementuję ją po każdej pętli w funkcji o tyle ile chciałem dodać specjalistów. Pytanie co do algorytmu zwiększania rozmiaru tablicy. Rozumiem, że implementuję go wtedy kiedy dodaję osobę, która już wykracza po za pierwotny rozmiar pierwszej tablicy. Gdzie będę musiał tę funkcję wpuścić ? Jutro coś z tym pokombinuję |
|
Tomek_z_W11 |
» 2014-12-02 23:03:32 Jeżeli dobrze patrze, to wszystko jest okay.
Co do zwiększania elementów tablicy. W funkcji dodaj_lekarza() przed wszystkim (przed cały dodawaniem danych nt lekarza) sprawdzasz, czy dotychczasowy indeks ma wartość, jaki tam był rozmiar? 50? jeżeli dobrze pamiętam..., jeżeli ma wartość większą lub równą 49 (bo indeksy tablicy numerujemy od 0), to robisz to co napisał kolega wyżej w komentarzu. jeżeli ma wartość mniejszą od 49, to musisz uwzględnić dodatkowy przypadek: załóżmy, że indeks ma wartość 46, a ktoś poprosi o dodanie 10 lekarzy, indeks będzie się zwiększać do 56ściu, a w momencie, gdy będzie miał wartość 50, już wyjdziesz poza zakres tablicy...
Wszystko można załatwić jednym ifem, co więcej będzie to poprawniejsze. Pobierasz ilość lekarzy i sprawdzasz, czy n (ilość lekarzy) + indeks jest mniejszy bądź równy 49, jeżeli tak - wszystko w porządku - dodajesz kolejnych specjalistów, jeżeli nie, robisz to co napisał kolega wyżej w komentarzu. |
|
jedrula.pogo Temat założony przez niniejszego użytkownika |
» 2014-12-03 19:39:08 Napisałem tę funkcję i warunek wedle waszych wskazówek. Oto one : funkcja: powieksz_pamiec void powieksz_pamiec( lekarz *& LK, int * wsk_spec ) { lekarz * temp = new lekarz[ * wsk_spec * 2 ]; for( int i = 0; i < * wsk_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; * wsk_spec *= 2; }
tutaj dostaję błąd : [ERROR] invalid array assignment razy sześć Zmiany w dodaj_lekarza void dodaj_lekarza( lekarz LK[], int & liczba_spec, int * wsk_spec ) { int n; cout << "Ilu chcesz dodac specjalistow ? (Podaj liczbe) : "; cin >> n; if(( indeks + n ) >= 49 ) { powieksz_pamiec( LK, wsk_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++; } }
[Error] 'wsk_spec' was not declared in this scope Nie jestem pewien , ale czy ja źle przenoszę argumenty do funkcji ? |
|
Tomek_z_W11 |
» 2014-12-03 21:22:21 Nie tyle co źle przenosisz ile źle odbierasz. Proponuje zrobić tak. Po pierwsze to tablice lekarzy LK[] zamienić na tablicę dynamiczną: void dodaj_lekarza( lekarz * LK, int & liczba_spec, int * wsk_spec )
Oczywiście będziesz musiał też parę rzeczy pozmieniać w mainie. Druga sprawa, w funkcji powiększ_pamięć() zrobić drobne zmiany: void powieksz_pamiec( lekarz * LK, int * wsk_spec )
Dodam też, że jeżeli chodzi o argumenty int * wsk_spec możesz zamienić na zwykłe int'y - w tej kwestii nie potrzebujesz wskaźników, no chyba że masz w tym jakiś cel, a ja o nim nie wiem. |
|
« 1 » 2 3 4 5 |