[C] Sortowanie bąbelkowe struktury
Ostatnio zmodyfikowano 2016-05-02 18:51
carlosmay |
» 2016-05-02 14:52:22 KSIEGA temp; lub KSIEGA * temp = NULL; |
|
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: #include <stdio.h> #include <stdlib.h> int i = 0; struct KSIEGA * osoba = NULL; 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 ]; 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++ ) { if(( i + 1 ) > ROZMIAR_KSIEGI_PODCZAS_CZYTANIA ) { 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; }
|
|
carlosmay |
» 2016-05-02 15:20:51 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 ]; 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 ); | 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. |
|
hasek Temat założony przez niniejszego użytkownika |
» 2016-05-02 18:51:19 Problem rozwiązany. Dziękuje bardzo za pomoc :) |
|
1 « 2 » |