Smegmiarz Temat założony przez niniejszego użytkownika |
[C] Sortowanie przez wybieranie » 2017-06-20 19:17:13 Witam, mam problem. Nie rozumiem dlaczego funkcja nie chce mi posortować tablicy ? #include <stdio.h> #include <stdlib.h> #include <time.h>
int spwyb( int tab[], int n );
int main( void ) { int a, b, i, n; printf( "Podaj liczbe elementow tablicy: " ); scanf( "%d", & n ); printf( "Podaj wartosc minimalna: " ); scanf( "%d", & a ); printf( "Podaj wartosc maksymalna: " ); scanf( "%d", & b ); int tab[ n ]; srand( time( NULL ) ); for( i = 0; i <( sizeof( tab ) / sizeof( tab[ 0 ] ) ); i++ ) { tab[ i ] = rand() %( b - a + 1 ) + a; } printf( "Tablica nieposortowana: " ); for( i = 0; i <( sizeof( tab ) / sizeof( tab[ 0 ] ) ); i++ ) { printf( "%d ", tab[ i ] ); } spwyb( tab, n ); printf( "\nTablica posortowana: " ); for( i = 0; i <( sizeof( tab ) / sizeof( tab[ 0 ] ) ); i++ ) { printf( "%d ", tab[ i ] ); } return 0; }
int spwyb( int tab[], int n ) { int i, j, temp, min; for( i = 0; i <( sizeof( tab ) / sizeof( tab[ 0 ] ) ) - 1; i++ ) { min = i; for( j = i + 1; j <( sizeof( tab ) / sizeof( tab[ 0 ] ) ); j++ ) { if( tab[ j ] < tab[ min ] ) min = j; temp = tab[ min ]; tab[ min ] = tab[ i ]; tab[ i ] = temp; } } } |
|
maly7 |
» 2017-06-20 19:54:14 Na początek skompiluj z wyświetlaniem wszystkich warningów i je ponaprawiaj. Między innymi int tab[ n ]; nie można tak tworzyć tablicy, chyba, że n jest const. |
|
Smegmiarz Temat założony przez niniejszego użytkownika |
» 2017-06-20 20:39:22 Przecież tu nie ma żadnych warningów a inicjalizacja tablicy int tab [n] jest dopuszczalna, gdyż n zostało ustalone wcześniej więc to nie jest problemem. Chodzi tu zapewne o przeniesienie parametrów do funkcji..... Chyba. |
|
Saran |
» 2017-06-20 20:42:15 Nie da się zainicjalizować normalnej tablicy zmienną, której wartość nie jest znana przed kompilacją. Użyj std::vector <> , lub wyznacz liczbę elementów tablicy przed kompilacją. |
|
maly7 |
» 2017-06-20 21:02:36 Co do samego sortowania, jeśli przekazujesz ilość elementów tablicy to w pętli użyj po prostu n. Poza tym, zamianę elementów zrób po drugiej pętli, jak już znajdzie minimalny element, a nie w środku. Dodatkowo jeśli nic nie zwracasz, zrób void (to też pokazują warningi) void spwyb( int tab[], int n ) { int i, j, temp, min; for( i = 0; i < n - 1; i++ ) { min = i; for( j = i + 1; j < n; j++ ) { if( tab[ j ] < tab[ min ] ) min = j; } temp = tab[ min ]; tab[ min ] = tab[ i ]; tab[ i ] = temp; } } Możesz jeszcze sprawdzać, czy min != i, żeby zaoszczędzić zamiany tych samych elementów, ale to już drobiazg. |
|
Smegmiarz Temat założony przez niniejszego użytkownika |
» 2017-06-20 21:33:32 Miałeś rację Maly7. trzeba było dać po prostu "n" zamiast "sizeof" i wstawić zamianę po drugiej pętli. Wielkie dzięki :) Ale to jakich Wy kompilatorów używacie że pokazuje Wam warningi ?? W Dev++ nic takiego mi nie wyskakuje... chyba że program nie może się skompilować bo ma błędy składniowe. |
|
carlosmay |
» 2017-06-20 21:41:12 Nie da się zainicjalizować normalnej tablicy zmienną, której wartość nie jest znana przed kompilacją. |
VLA jest niezgodne ze standardem C++, ale w C jak najbardziej dopuszczalne. Jakikolwiek z tego dziesięciolecia. Od 2005 mamy już nowsze standardy: np C11. np. Code::blocks plus aktualizacja kompilatora do GCC powyżej wersji 5.xxx. |
|
Smegmiarz Temat założony przez niniejszego użytkownika |
» 2017-06-20 21:55:30 No ale wtedy co mi wszyscy pisali żebym popoprawiał warningi to w Devie++ jest napisane: Compilation results... -------- - Errors: 0 - Warnings: 0 mimo że były te wszystkie błędy co mi napisaliście. Więc nie wiem czemu u mnie tego nie widać. Ostateczna wersja programu: #include <stdio.h> #include <stdlib.h> #include <time.h>
void spwyb( int tab[], int n );
int main( void ) { int a, b, i, n; printf( "Podaj liczbe elementow tablicy: " ); scanf( "%d", & n ); printf( "Podaj wartosc minimalna: " ); scanf( "%d", & a ); printf( "Podaj wartosc maksymalna: " ); scanf( "%d", & b ); int tab[ n ]; srand( time( NULL ) ); for( i = 0; i <( sizeof( tab ) / sizeof( tab[ 0 ] ) ); i++ ) { tab[ i ] = rand() %( b - a + 1 ) + a; } printf( "Tablica nieposortowana: " ); for( i = 0; i <( sizeof( tab ) / sizeof( tab[ 0 ] ) ); i++ ) { printf( "%d ", tab[ i ] ); } spwyb( tab, n ); printf( "\nTablica posortowana: " ); for( i = 0; i <( sizeof( tab ) / sizeof( tab[ 0 ] ) ); i++ ) { printf( "%d ", tab[ i ] ); } return 0; }
void spwyb( int tab[], int n ) { int i, j, temp, min; for( i = 0; i < n - 1; i++ ) { min = i; for( j = i + 1; j < n; j++ ) { if( tab[ j ] < tab[ min ] ) min = j; } if( min != i ) { temp = tab[ min ]; tab[ min ] = tab[ i ]; tab[ i ] = temp; } } } I w tym przypadku log wygłąda tak: Compilation results... -------- - Errors: 0 - Warnings: 0 - Output Filename: C:\Users\Wszechświat\Documents\Projekt1.exe - Output Size: 130,626953125 KiB - Compilation Time: 0,67s |
|
« 1 » 2 |