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ść
carlosmay
» 2016-05-02 14:52:22
KSIEGA temp;

lub

KSIEGA * temp = NULL;
P-147872
hasek
Temat założony przez niniejszego użytkownika
» 2016-05-02 15:07:48
Kod zadziałał lecz teraz wypisuje mi tylko jedną osobę z funkcji sortowania. Mianowicie 2 na liście.
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 temp;

struct KSIEGA
{
    int lp;
   
    char nazwisko[ 20 ];
   
    char imie[ 20 ];
   
    int wiek;
   
};

void sortowanie()
{
   
    int i, j;
    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 ]; // oczywiście temp nie może być int tylko obiektem
                osoba[ i + 1 ] = osoba[ i ];
                osoba[ i ] = temp;
            }
        }
    }
    printf( "%d  %s \t %s  \t        %d\n", osoba[ i ].lp, osoba[ i ].imie, osoba[ i ].nazwisko, osoba[ i ].wiek );
}

int 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++ )
        {
            // jesli numer wczytywanego rekordu jest wiêkszy niz 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" );
        printf( "Liczba osob wczytana: %d\n\n", ROZMIAR_KSIEGI_PODCZAS_CZYTANIA );
    }
    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"
    "2. Wyswietl posortowana 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;
   
}
P-147873
carlosmay
» 2016-05-02 15:20:51
C/C++
int i, j;
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 ]; // oczywiście temp nie może być int tylko obiektem
            osoba[ i + 1 ] = osoba[ i ];
            osoba[ i ] = temp;
        }
    }
} // zmienna 'i' po opuszczeniu pętli ma wartość ostatniego sprawdzanego indeksu
// i tylko ten jeden element jest wypisywany osoba[i]
printf( "%d  %s \t %s  \t        %d\n", osoba[ i ].lp, osoba[ i ].imie, osoba[ i ].nazwisko, osoba[ i ].wiek );

printf należałoby wykonać w pętli przez wszystkie elementy tablicy.
Poza tym, wypisanie danych z tablicy to osobna funkcjonalność (nie związana z sortowaniem),
więc wypadałoby utworzyć funkcję, która będzie zajmować się tylko wypisywaniem,
a funkcji sortowanie() zostawić sortowanie.
P-147875
hasek
Temat założony przez niniejszego użytkownika
» 2016-05-02 18:51:19
Problem rozwiązany. Dziękuje bardzo za pomoc :)
P-147883
1 « 2 »
Poprzednia strona Strona 2 z 2