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. |
|
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: #include <iostream> #include<iomanip> #include<cstdlib> #include <cstring>
using namespace std;
const int D_ID = 5; 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 ]; };
void menu( lekarz * LK, int liczba_spec ); void menu_gl( int opcja ); void menu_szuk( lekarz * LK, const int liczba_spec );
void dodaj_lekarza( lekarz * LK, int liczba_spec ); void kasuj_lekarza( lekarz * LK, int & liczba_spec );
void edycja_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 );
void powieksz_pamiec( lekarz * LK, int liczba_spec );
int indeks;
int main() { lekarz * LK; int liczba_spec = 50; 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; 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; 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; }
void edycja_lekarza( lekarz * LK, int & liczba_spec ) { char ID[ D_ID ]; int ind; cout << " Podaj ID lekarza do edycji: "; cin >> ID; if(( ind = szukaj_wg_ID1( LK, liczba_spec, ID ) ) != - 1 ) { 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" ); } 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. : ) |
|
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 & |
|
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ść ? |
|
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: void fun( int argument ) { argument = 5000; { int main() { int a = 3; cout << a << endl; fun( a ); cout << a << endl; }
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. |
|
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: void powieksz_pamiec( lekarz * LK, int liczba_spec ) { lekarz * temp = new lekarz[ liczba_spec * 2 ]; for( int i = 0; i < liczba_spec; i++ ) { strcmp( temp[ i ].ID, LK[ i ].ID ); 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. void edycja_lekarza( lekarz * LK, int liczba_spec ) { char ID[ D_ID ]; int ind; cout << " Podaj ID lekarza do edycji: "; cin >> ID; if(( ind = szukaj_wg_ID1( LK, liczba_spec, ID ) ) != - 1 ) { 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 |
|
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. |
|
jedrula.pogo Temat założony przez niniejszego użytkownika |
» 2014-12-04 21:33:40 Racja, głupie rozumowanie. Dzięki za poradę. |
|
1 2 « 3 » 4 5 |