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

[C] Sortowanie bąbelkowe struktury

Ostatnio zmodyfikowano 2016-05-02 18:51
Autor Wiadomość
hasek
Temat założony przez niniejszego użytkownika
[C] Sortowanie bąbelkowe struktury
» 2016-05-01 17:56:41
Witam.
Poszukuje pomocy z sortowaniem bąbelkowym struktury.
Kod:
C/C++
#include <stdio.h>
#include <stdlib.h>
int i = 0;
struct KSIEGA * osoba = NULL; // GLOBALNA KSIEGA
size_t ROZMIAR_KSIEGI_PODCZAS_CZYTANIA = 0;
struct KSIEGA
{
   
    int lp;
   
    char nazwisko[ 20 ];
   
    char imie[ 20 ];
   
    int wiek;
   
};

void sortowanie( struct KSIEGA * osoba, int size )
{
    int i, j, temp;
    for( j = 0; j < size - 1; j++ )
    {
        for( i = 0; i < size - 1 - j; i++ )
        {
            if( osoba[ i ].wiek > osoba[ i + 1 ].wiek )
            {
                temp = osoba[ i + 1 ].wiek;
                osoba[ i + 1 ].wiek = osoba[ i ].wiek;
                osoba[ i ].wiek = temp;
            }
        }
    }
}

void wczyt()
{
    FILE * plik;
   
    plik = fopen( "asd.txt", "r" );
   
    if( plik == NULL )
   
         printf( "Nie moge znalezc bazy" );
   
    else
   
    {
        ROZMIAR_KSIEGI_PODCZAS_CZYTANIA = 1;
        osoba =( struct KSIEGA * ) calloc( ROZMIAR_KSIEGI_PODCZAS_CZYTANIA, sizeof( struct KSIEGA ) );
        for( i = 0;( !feof( plik ) ); i++ )
        {
            // jeœli numer wczytywanego rekordu jest wiêkszy ni¿ rozmiar tablicy
            if(( i + 1 ) > ROZMIAR_KSIEGI_PODCZAS_CZYTANIA ) {
                // rozszerzenie rozmiaru tablicy (realloc jest wolny, trzeba go robiæ mozliwie rzadko)
                ROZMIAR_KSIEGI_PODCZAS_CZYTANIA += 1;
                osoba =( struct KSIEGA * ) realloc( osoba, ROZMIAR_KSIEGI_PODCZAS_CZYTANIA * sizeof( struct KSIEGA ) );
            }
            fscanf( plik, "%d %s %s %d", & osoba[ i ].lp, osoba[ i ].imie, osoba[ i ].nazwisko, & osoba[ i ].wiek );
        }
       
        printf( "Baza wczytana pomyslnie!\n\n" );
       
       
       
    }
   
    fclose( plik );
}
void odczyt()
{
    int i;
    for( i = 0; i < ROZMIAR_KSIEGI_PODCZAS_CZYTANIA; i++ )
   
    {
        printf( "%d  %s \t %s  \t        %d\n", osoba[ i ].lp, osoba[ i ].imie, osoba[ i ].nazwisko, osoba[ i ].wiek );
    }
   
}

int main( int argc, char ** argv )

{
    int wybor;
    wczyt();
   
    printf( "\t\tMENU UZYTKOWNIKA\n\nCo chcesz zrobic?\n"
   
    "1. Wyswietl baze danych\n\n"
   
    "Twoj wybor: " );
   
    scanf( "%d", & wybor );
   
    switch( wybor )
   
    {
       
    case 1:
       
        printf( "\nLP IMIE\t\t NAZWISKO\t\tWIEK\t\n\n" );
       
        odczyt();
       
        break;
       
    case 2:
        printf( "\nLP IMIE\t\t NAZWISKO\t\tWIEK\t\n\n" );
        sortowanie();
        break;
        default:
        printf( "\n BRAK TAKIEJ OPCJI\n" );
        break;
       
    }
   
    free( osoba );
   
    getch();
   
    return 0;
   
}

Wczytywanie i odczytywanie struktury z pliku txt działa lecz nie wiem czy pomysł z sortowaniem bąbelkowym jest dobry. Przy kompilowaniu wywala błąd error: too few arguments to function 'sortowanie'. Z góry dziękuje za odpowiedź :)
P-147835
carlosmay
» 2016-05-01 21:42:40
C/C++
void sortowanie( struct KSIEGA * osoba, int size )
sortowanie();
Czy coś tutaj jest nie tak?

too few arguments to function 'sortowanie'
Komunikat mówi wszystko.
P-147857
hasek
Temat założony przez niniejszego użytkownika
» 2016-05-01 23:52:45
Mógłbyś mi w takim wypadku powiedzieć jak to napisać :) ? jak już to zobaczę to zrozumiem.
P-147860
mateczek
» 2016-05-02 00:47:34
1. funkcja sortowanie wymaga parametrów !!! ty jej nic nie przekazujesz
C/C++
void sortowanie( struct KSIEGA * osoba, int size ) //jeśli chcesz sortować tablice globalną to na ki czort parametry wywołania ??

//zrób tak
void sortowanie() {
    //tutaj kod
}
// nie zgadza Ci sie deklaracja z wywołaniem !!!
Taka luźna uwaga Ja bym to zrobił odwrotnie. księgę zrobił bym katalogiem na osoby :)
C/C++
osoba ksiega[]; //księga osób
// imię nazwisko wiek to atrybuty osoby, nie księgi
P-147862
carlosmay
» 2016-05-02 01:10:10
Mógłbyś mi w takim wypadku powiedzieć jak to napisać :) ? jak już to zobaczę to zrozumiem.
W skrócie: próbujesz wywołać funkcję z argumentami wywołaniem bez argumentów.
Inaczej: funkcja oczekuje argumentów, a ich nie otrzymuje.

Funkcje - patrz przekazywanie wartości do funkcji przez argumenty
P-147863
hasek
Temat założony przez niniejszego użytkownika
» 2016-05-02 11:20:02
Zrozumiałem już swój błąd dziękuje. Ale teraz mam inny problem.
C/C++
void sortowanie()
{
    int i, j, temp;
    for( j = 0; j < ROZMIAR_KSIEGI_PODCZAS_CZYTANIA - 1; j++ )
    {
        for( i = 0; i < ROZMIAR_KSIEGI_PODCZAS_CZYTANIA - 1 - j; i++ )
        {
            if( osoba[ i ].wiek > osoba[ i + 1 ].wiek )
            {
                temp = osoba[ i + 1 ].wiek;
                osoba[ i + 1 ].wiek = osoba[ i ].wiek;
                osoba[ i ].wiek = temp;
            }
        }
    }
}

ROZMIAR_KSIEGI_PODCZAS_CZYTANIA jest globalna tak samo jak struktura. Wiec czemu program nie wyświetla mi żadnych danych po włączeniu tej funkcji ? Co zrobiłem nie tak ? :(
P-147866
carlosmay
» 2016-05-02 12:31:28
C/C++
if( osoba[ i ].wiek > osoba[ i + 1 ].wiek )
{
    temp = osoba[ i + 1 ].wiek;
    osoba[ i + 1 ].wiek = osoba[ i ].wiek;
    osoba[ i ].wiek = temp;
}
Porównuj składowe 'wiek', ale zamieniaj całe obiekty, a nie składowe obiektów.
C/C++
{
    temp = osoba[ i + 1 ]; // oczywiście temp nie może być int tylko obiektem
    osoba[ i + 1 ] = osoba[ i ];
    osoba[ i ] = temp;
}
P-147868
hasek
Temat założony przez niniejszego użytkownika
» 2016-05-02 12:47:38
Rozumiem co do zamiany, lecz jak stworzyć obiekt w C? Z tego co czytałem to w C nie ma klas co za tym idzie nie ma obiektów. Więc chyba trzeba zrobić strukturę. Ale jak to ma wyglądać. Nie za bardzo rozumiem tego procesu jak mam zrobić z temp'a obiekt :(
P-147869
« 1 » 2
  Strona 1 z 2 Następna strona