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

[C] Sortowanie przez wybieranie

Ostatnio zmodyfikowano 2017-06-20 22:25
Autor Wiadomość
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 ?
C/C++
#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;
        }
    }
}
P-162725
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.
P-162726
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.
P-162728
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ą.
P-162729
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)

C/C++
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.
P-162731
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.
P-162733
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.
P-162734
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:

C/C++
#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
P-162736
« 1 » 2
  Strona 1 z 2 Następna strona