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ść
jedrula.pogo
Temat założony przez niniejszego użytkownika
» 2014-12-05 19:38:21
Prawdopodobnie jeszcze potrzebuję małej pomocy z wyszukiwaniem po nazwisku, bo już głupieję przy tym zadaniu .

Chodzi mi o wyszukanie w bazie człowieka o wpisanym na wejście nazwisku.

Napisałem coś takiego :
C/C++
{
    char nazw[ D_NAZ ];
    cout << "Podaj nazwisko poszukiwanego lekarza : ";
    cin >> nazw;
   
    for( int i = 0; i < indeks; i++ )
    {
        if( LK[ i ].nazwisko = nazw )
             nazw = LK[ i ].nazwisko;
        else
        {
            cout << "Nie odnaleziono lekarza o podanym nazwisku " << endl;
            system( "pause" );
        }
    }
   
    lista_naglowek();
    for( int i = 0; i < indeks; i++ )
    {
        if( LK[ i ].nazwisko == nazw )
             lista_lekarz( LK + i );
       
    }
}
Co robię w tym przypadku źle ?
P-122266
darko202
» 2014-12-05 22:18:37
na pewno w if( LK[ i ].nazwisko = nazw )
bo  = to przypisanie == porównanie
a oto chyba chodzi w if najczęsciej
P-122290
Kaikso
» 2014-12-05 22:29:29
C/C++
{
    char nazw[ D_NAZ ];
    cout << "Podaj nazwisko poszukiwanego lekarza : ";
    cin >> nazw;
   
    for( int i = 0; i < indeks; i++ )
    {
        //po pierwsze nadpisujesz nazwisko w if()
        //po drugie operatorem == nie da rady porównać łańcuchów w stylu c
        //tekst porównuje się funkcją strcmp()
        //if( LK[ i ].nazwisko = nazw )
        //więc warunek powinno wyglądać to tak
        if( strcmp( LK[ i ].nazwisko, nazw ) != NULL )
        {
            //nazw = LK[ i ].nazwisko;
            //nie rozumiem po co nadpisujesz :P
            //jeśli znalazłeś lekarza to coś musisz z nim zrobić
            //na wypadek kilku lekarzy o tym samym nazwisku musisz ich gdzieś zapisać
        }
        //nie ma sensu tego wywoływać w pętli
        /*else
                {
                    cout << "Nie odnaleziono lekarza o podanym nazwisku " << endl;
                    system( "pause" );
                }*/
    }
   
    lista_naglowek();
    for( int i = 0; i < indeks; i++ )
    {
        //ty podobnie jak wyżej
        //if( LK[ i ].nazwisko == nazw )
        if( strcmp( LK[ i ].nazwisko, nazw ) != NULL )
             lista_lekarz( LK + i );
       
    }
}

Z tego kawałka kodu nie wiele da się dowiedzieć podaj najlepiej całą funkcje. ;)
A jeśli nie masz jej jeszcze to napisz:
1. Czy ma zwracać jednego lekarza po kolei, czy wszystkich na raz w jednej tablicy?
2. Jeśli funkcja pobiera dane wewnątrz to jak ma się zachować, gdzie przekazać dane?
P-122293
Tomek_z_W11
» 2014-12-06 00:19:34
Nie było mnie na forum parę dni - dlatego nie odpisywałem.

Myślę, że główne problemy zostały napisane:
-operator przypisania '=' zamiast porównania '==' w ifie,
-else w pętli oznaczający, że jeżeli nie wejdziemy do ifa ( LK[ 0 ]!=nazw, bo i zaczyna się od 0 ), to od razu wychodzimy z pętli.

Zamień '=' na '==' i wywal else'a, jak zaznaczyć, że nie znalazłeś szukanego nazwiska możesz zrobić w ten sposób:

C/C++
bool a = true;

for( int i = 0; i < indeks; i++ )
{
    if( LK[ i ].nazwisko == nazw )
    {
        nazw = LK[ i ].nazw;
        a = false;
    }
}
if( a ) //jezeli a jest prawdziwe, to
//nie znalezlismy lekarza, bo gdybysmy go znalezli, to a mialoby wartosc false.


Możesz, tak jak pisał kolega wyżej, nie nadpisywać zmiennej nazw, czyli jeżeli wejdziesz do ifa porównującego nazwiska, przerywasz pętle (break), zapamiętując jednocześnie indeks, który będzie przechowywać zmienna i.
P-122309
jedrula.pogo
Temat założony przez niniejszego użytkownika
» 2014-12-06 13:21:59
Coś mi nie wychodzi. Najdalej doszedłem w inny sposób :
Podzieliłem wyszukiwanie na dwa etapy.

int szukaj_wg_nazw1
C/C++
int ile = 0;
for( int i = 0; i < indeks; i++ )
     if( strcmp( LK[ i ].nazwisko, nazw ) == 0 ) Ind[ ile++ ] = i;

return( ile );


Sprawdzam wśród osób czy istnieje osoba o zadanym nazwisku, jeśli tak to zwracam tablicę zawierającą indeksy tych osób.

Następnie funkcja :

void szukaj_wg_nazw2

C/C++
char nazw[ D_NAZ ];
int Ind[ indeks ];
int ile_ind;

cout << "Podaj nazwisko: ";
cin >> nazw;
if(( ile_ind = szukaj_wg_nazw1( LK, indeks, Ind, nazw ) ) != 0 )
{
    lista_naglowek();
    lista_lekarz( LK + ile_ind );
}
else
{
    cout << "Nie odnaleziono osoby o nazwisku " << nazw << endl;
    system( "pause" );
}
}

Czy jest to dobre rozumowanie ? Wyszukiwanie nie działa w odpowiedni sposób.
P-122330
Kaikso
» 2014-12-06 13:23:54
@Tomek_z_W11 Pamiętaj że zmienne tablic to wskaźniki używając operatora porównania == porównujemy jedynie wartości wskaźników, a nie zawartość tablic. W takim wypadku należy użyć do porównania tablic char funkcji
strcmp( const char * str1, const char * str2 )
, a do porównania tablic pozostałych typów funkcji
memcmp( const void * tab1, const void * tab2, size_t size )
 z #include <string.h>.
P-122332
jedrula.pogo
Temat założony przez niniejszego użytkownika
» 2014-12-06 13:25:41
A możesz się odwołać do mojego rozumowania, które przesłałem chwilę przed Tobą : )
P-122333
Kaikso
» 2014-12-06 13:43:31
Może spróbuj tak:
C/C++
int szukaj_wg_nazw( lekarz * LK, int index, const char * nazw, int start = 0 )
{
    for( int i = start; i < index; i++ )
    if( strcmp( LK[ i ].nazwisko, nazw ) == 0 )
         return i;
   
    return - 1; //nie znaleziono
}

A używa się tak:

C/C++
char nazw[ D_NAZ ];

cout << "Podaj nazwisko: ";
cin >> nazw;

int idx = szukaj_wg_nazw( LK, index, nazw );
if( idx != - 1 ) //znaleziono
{
    do
    {
        /*
        * Operacje na lekarzu o indeksie idx
        */
    } while(( idx = szukaj_wg_nazw( LK, index, nazw, ++idx ) ) != - 1 ); //następny lekarz
   
}
else //nie znaleziono
{
    cout << "Nie znaleziono lekarza o nazwisku: " << nazw << endl;
}

Chyba jedno z najlepszych rozwiązań.
Powodzenia :)
P-122336
1 2 3 « 4 » 5
Poprzednia strona Strona 4 z 5 Następna strona