nowawieza Temat założony przez niniejszego użytkownika |
Sortowanie nazwisk [C] » 2017-02-16 02:09:16 Witam, mam takie zadanie: Napisz program z tablicą imion i nazwisk grupy n studentów, który sortuje je według nazwisk w kolejności alfabetycznej. Metoda sortowania dowolna ale ma być to w funkcji raczej. Zacząłem robić to i już się męczę. Wiele prób, a co chwilę jakieś problemy mam :/ W programie jest wiele prób w komentarzach co do sortowania. #include <stdio.h> #include <stdlib.h> const int N = 30, M = 2, B = 25; void sortowanie_babelkowe( float tab[ N ], char dane[ M ][ N ][ B ], int n ); void Sortowanie_alfabetyczne( char[], int );
int main() { int i = 0, xd = 0, n, s = 0; char dane[ N ][ M ][ B ], dane2[ N ][ M ][ B ], c, z, f, j; float tab[ N ], r; do { printf( "Podaj ilosc studentow: " ); i = scanf( "%d", & n ); fflush( stdin ); } while( i == 0 || n > 30 || n < 2 ); system( "cls" ); for( i = 0; i < n; i++ ) { printf( "\nPodaj imie studenta nr %d: ", i + 1 ); scanf( "%24s", & dane[ i ][ 0 ] ); fflush( stdin ); printf( "Podaj nazwisko studenta nr %d: ", i + 1 ); scanf( "%24s", & dane[ i ][ 1 ] ); fflush( stdin ); } for( i = 0; i < n; i++ ) { tab[ i ] = dane[ i ][ 1 ][ 0 ]; } do { s = 0; for( i = 0; i < n; i++ ) { if( tab[ i ] < tab[ i + 1 ] ) { z = dane[ i ][ M ][ B ]; dane[ i ][ M ][ B ] = dane[ i + 1 ][ M ][ B ]; dane[ i + 1 ][ M ][ B ] = z; s = 1; } } } while( s != 0 ); for( i = 0; i < n; i++ ) { printf( "\n %s %s", dane[ i ][ 0 ], dane[ i ][ 1 ] ); } return 0; }
void Sortowanie_alfabetyczne( char dane[], int n ) { char nazwisko; int i; int j; for( i = 1; i < n; ++i ) { nazwisko = dane[ i ]; for( j = i - 1; j >= 0 && dane[ j ] > nazwisko; --j ) { dane[ j + 1 ] = dane[ j ]; } dane[ j + 1 ] = nazwisko; } }
Jakie sortowanie powinienem wybrać? Jakie są tu błędy? Generalnie nie rozumiem tablic 3 wymiarowych jeśli chodzi o zapis w programie :/ Gubię się strasznie więc pewnie z tym są związane błędy. |
|
Nazgul |
» 2017-02-16 02:18:11 Nie rozumiem pytania. Czemu używasz trójwymiarowej tablicy, skoro może być jednowymiarowa? Zadanie jest trywialne, a wprowadzasz tutaj kosmiczną abstrakcję.
Pomogę, ale mam pytania: Miałeś struktury? Miałeś klasy? Miałeś tworzenie tablic dynamicznych?
//EDIT aaa rozumiem, w C, to pewnie dynamicznej alokacji pamięci nie ogarniacie, ok rozumiem |
|
nowawieza Temat założony przez niniejszego użytkownika |
» 2017-02-16 02:33:18 Wydaje mi się, że prowadząca ćwiczenia na studiach wymaga w tym zadaniu tablicy 3 wymiarowej (sam tego nie rozumiem...)
Nie poznaliśmy jeszcze klas, struktur ani tablic dynamicznych.
To jest dział tablic i ich sortowania. Na tablicach 3 wymiarowych też za wiele nie działaliśmy ale no trzeba próbować. |
|
Nazgul |
» 2017-02-16 02:39:11 to okej, wybór sortowania jest dowolny, np. w sortowaniu bąbelkowym przydaje się funkcja zamien(...), np.: void zamien( char * wyraz1, char * wyraz2 ) { for( unsigned int i = 0; i < MAX_DLUGOSC_WYRAZU; i++ ) { if( wyraz1[ i ] > wyraz2[ i ] ) { char * wyraz3 = wyraz1; wyraz1 = wyraz2; wyraz2 = wyraz3; return; } } }
i resztę robisz tak jak w sortowaniu bąbelkowym. void zamien( char * wyraz1, char * wyraz2 ) { for( unsigned int i = 0; i < MAX_DLUGOSC_WYRAZU; i++ ) { if( wyraz1[ i ] > wyraz2[ i ] ) { char * wyraz3 = wyraz1; wyraz1 = wyraz2; wyraz2 = wyraz3; return; } } }
void sortuj( char * tablica[], unsigned int rozmiar ) { do { for( unsigned int i = 0; i < rozmiar - 1; i++ ) zamien( tablica[ i ], tablica[ i + 1 ] ); rozmiar--; } while( rozmiar > 1 ); }
|
|
nowawieza Temat założony przez niniejszego użytkownika |
» 2017-02-16 02:46:44 Nie mogę użyć char * gdyż nie miałem jeszcze wskaźników, a to pewnie wskaźnik. No my jeszcze gwiazdek nie poznaliśmy :P
Ale nawet mniejsza o to. Głównie mam problem z całym programem, a nie tylko z sortowaniem :D
Zaraz postaram się napisać program bardziej czysty ale to już jest męczarnia :/ |
|
nowawieza Temat założony przez niniejszego użytkownika |
» 2017-02-16 03:05:21 #include <stdio.h> #include <stdlib.h> const int N = 30, M = 2, B = 25; void sortowanie_babelkowe( float tab[ N ], char dane[ M ][ N ][ B ], int n ); void sortuj( char[], int );
int main() { int i = 0, xd = 0, n, s = 0; char dane[ N ][ M ][ B ], dane2[ N ][ M ][ B ], c, z, f, j; float tab[ N ], r; do { printf( "Podaj ilosc studentow: " ); i = scanf( "%d", & n ); fflush( stdin ); } while( i == 0 || n > 30 || n < 2 ); system( "cls" ); for( i = 0; i < n; i++ ) { printf( "\nPodaj imie studenta nr %d: ", i + 1 ); scanf( "%24s", & dane[ i ][ 0 ] ); fflush( stdin ); printf( "Podaj nazwisko studenta nr %d: ", i + 1 ); scanf( "%24s", & dane[ i ][ 1 ] ); fflush( stdin ); } for( i = 0; i < n; i++ ) { tab[ i ] = dane[ i ][ 1 ][ 0 ]; } do { s = 0; for( i = 0; i < n; i++ ) { if( tab[ i ] < tab[ i + 1 ] ) { z = dane[ i ][ M ][ B ]; dane[ i ][ M ][ B ] = dane[ i + 1 ][ M ][ B ]; dane[ i + 1 ][ M ][ B ] = z; s = 1; } } } while( s != 0 ); for( i = 0; i < n; i++ ) { printf( "\n %s %s", dane[ i ][ 0 ], dane[ i ][ 1 ] ); } return 0; }
void zamien( char * wyraz1, char * wyraz2 ) { for( unsigned int i = 0; i < B; i++ ) { if( wyraz1[ i ] > wyraz2[ i ] ) { char * wyraz3 = wyraz1; wyraz1 = wyraz2; wyraz2 = wyraz3; return; } } }
void sortuj( char * tablica[], unsigned int rozmiar ) { do { for( unsigned int i = 0; i < rozmiar - 1; i++ ) zamien( tablica[ i ], tablica[ i + 1 ] ); rozmiar--; } while( rozmiar > 1 ); }
}
Na razie tyle. Będę edytował jak coś poprawię. (Nadal u mnie nie działa no ale to pewnie dlatego, że źle dobrane argumenty w funkcjach. Zobaczę co i jak) |
|
Nazgul |
» 2017-02-16 03:08:48 #include <stdio.h> #include <stdlib.h>
const unsigned int MAX_DLUGOSC_WYRAZU = 25; const unsigned int MAX_LICZBA_STUDENTOW = 30;
int main() { unsigned int n = 0; char tablica_studentow[ 2 ][ MAX_LICZBA_STUDENTOW ][ MAX_DLUGOSC_WYRAZU ]; printf( "Podaj liczbe studentow: " ); scanf( "%d", & n ); if( n > MAX_LICZBA_STUDENTOW ) return - 1; for( unsigned int i = 0; i < n; i++ ) { printf( "\nPodaj imie studenta nr %d: ", i + 1 ); scanf( "%24s", & tablica_studentow[ 1 ][ i ][ 0 ] ); printf( "Podaj nazwisko studenta nr %d: ", i + 1 ); scanf( "%24s", & tablica_studentow[ 0 ][ i ][ 0 ] ); } unsigned int rozmiar = n; while( rozmiar > 1 ) { for( unsigned int i = 0; i < rozmiar - 1; i++ ) { for( unsigned int j = 0; j < MAX_DLUGOSC_WYRAZU; j++ ) { if( tablica_studentow[ 0 ][ i ][ j ] > tablica_studentow[ 0 ][ i + 1 ][ j ] ) { char zamiennik_imie[ MAX_DLUGOSC_WYRAZU ]; char zamiennik_nazwisko[ MAX_DLUGOSC_WYRAZU ]; for( unsigned k = 0; k < MAX_DLUGOSC_WYRAZU; k++ ) { zamiennik_imie[ k ] = tablica_studentow[ 1 ][ i ][ k ]; zamiennik_nazwisko[ k ] = tablica_studentow[ 0 ][ i ][ k ]; } for( unsigned k = 0; k < MAX_DLUGOSC_WYRAZU; k++ ) { tablica_studentow[ 1 ][ i ][ k ] = tablica_studentow[ 1 ][ i + 1 ][ k ]; tablica_studentow[ 0 ][ i ][ k ] = tablica_studentow[ 0 ][ i + 1 ][ k ]; } for( unsigned k = 0; k < MAX_DLUGOSC_WYRAZU; k++ ) { tablica_studentow[ 1 ][ i + 1 ][ k ] = zamiennik_imie[ k ]; tablica_studentow[ 0 ][ i + 1 ][ k ] = zamiennik_nazwisko[ k ]; } break;; } } } rozmiar--; } return 1; }
Powinno być okej, sprawdz jeszcze dokładnie bo nie mam pewności. z rozdzieleniem na funkcje nie powinieneś mieć problemu. Zrobiłem to typowo "na Janusza", z pewnością można to zrobić lepiej, ale domyślam się że na kolokwium prowadzący będzie miał to gdzieś;P Ahh gdyby te wskaźniki mogły być używane, to byśmy pięknie zmieniali same wskaźniki, a nie przepisywali całe tryliardy znaczków |
|
nowawieza Temat założony przez niniejszego użytkownika |
» 2017-02-16 03:14:21 Ciężko mi zrozumieć chwilowo ten kod, bo jest 20 razy coś podobnego ale powiedz mi tylko czy zrobiłeś sortowanie względem nazwiska, bo innego nie potrzebuję :D A to nawet nie na kolokwium tylko na oddanie ma pójść. Miałem 6 zadań z sortowaniem i to mi tylko zostało. Ps: Dałbyś radę mi przetłumaczyć jakoś co tu zrobiłeś?: unsigned int rozmiar = n; while( rozmiar > 1 ) { for( unsigned int i = 0; i < rozmiar - 1; i++ ) { for( unsigned int j = 0; j < MAX_DLUGOSC_WYRAZU; j++ ) { if( tablica_studentow[ 0 ][ i ][ j ] > tablica_studentow[ 0 ][ i + 1 ][ j ] ) { char zamiennik_imie[ MAX_DLUGOSC_WYRAZU ]; char zamiennik_nazwisko[ MAX_DLUGOSC_WYRAZU ]; for( unsigned k = 0; k < MAX_DLUGOSC_WYRAZU; k++ ) { zamiennik_imie[ k ] = tablica_studentow[ 1 ][ i ][ k ]; zamiennik_nazwisko[ k ] = tablica_studentow[ 0 ][ i ][ k ]; } for( unsigned k = 0; k < MAX_DLUGOSC_WYRAZU; k++ ) { tablica_studentow[ 1 ][ i ][ k ] = tablica_studentow[ 1 ][ i + 1 ][ k ]; tablica_studentow[ 0 ][ i ][ k ] = tablica_studentow[ 0 ][ i + 1 ][ k ]; } for( unsigned k = 0; k < MAX_DLUGOSC_WYRAZU; k++ ) { tablica_studentow[ 1 ][ i + 1 ][ k ] = zamiennik_imie[ k ]; tablica_studentow[ 0 ][ i + 1 ][ k ] = zamiennik_nazwisko[ k ]; } break;; } } } rozmiar--; }
Znaczy widzę, że są zamieniane miejsca co chwilę ale kurcze serio nie da się bez wskaźników tego ułatwić? Troche masakra xD |
|
« 1 » 2 3 4 |