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

Tablice-sortowanie liczb

Ostatnio zmodyfikowano 2015-07-04 22:31
Autor Wiadomość
GregoryIwanek
Temat założony przez niniejszego użytkownika
Tablice-sortowanie liczb
» 2015-07-04 12:44:23
Cześć. Wszystko w ramach ćwiczenia, więc tak czy siak proszę o nie wstawianie pomysłów na inne podejście do tematu. Chcę zrozumieć, dlaczego wychodzi tak a nie inaczej tym sposobem...
Tak jak w temacie, chciałem zrobić sobie algorytm w którym podaje się liczbę elementów w tablicy ( jest zawsze mniejsza niż 999, więc z góry wiem, jaka ta tablica musi być) i który później posortuje w niej elementy od najmniejszego do największego.

Wymąciłem coś takiego ( fragment większego kodu). Chodzi mi mianowicie o to, jaki jest błąd myśleniowy w części sortującej elementy w tablicy. Dla 15<x<135 ( liczba komórek do wypełnienia) wszystko ładnie sortuje, ale jeżeli wpiszę ilość komórek do wypełnienia z poza tego przedziału, to część wyników wyświetlana jest jako 0, 1, 256 ( no i nie w kolejności).
C/C++
#include <iostream>
#include <ctime> //wymaga funckja rand
#include <cstdlib> //wymaga funkcja srand
using namespace std;

int main() {
    int x, tablica_wartosci[ 999 ], nie_najmniejszy_element;
    srand( time( NULL ) ); //nadanie wartosci ziarnu w funkcji srand na podstawie czasu zegarowego
    cin >> x; // ilość komórek do zapelnienia
   
    for( int i = 0; i < x; i++ ) {
        tablica_wartosci[ i ] = rand(); //dodanie do tablicy liczba losowych ( rand() ) na podstawie funkcji srand(time(NULL));
        cout << tablica_wartosci[ i ] << endl;
    }
    //część sortująca
    for( int i = 0; i < x; i++ ) { // co jest tutaj źle? 15<x<135 jest ok, ale z poza przedziału opuszcza część wyników..., dlaczego tak się dzieje?
        for( int j = 1; j < x; j++ ) {
            if( tablica_wartosci[ i ] > tablica_wartosci[ i + j ] ) {
                nie_najmniejszy_element = tablica_wartosci[ i ];
                tablica_wartosci[ i ] = tablica_wartosci[ i + j ];
                tablica_wartosci[ i + j ] = nie_najmniejszy_element;
            }
        }
    }
    //część sortująca
    cout << endl;
    for( int i = 0; i < x; i++ ) {
        cout << tablica_wartosci[ i ] << endl;
    }
    return 0;
};

Jeśli gdzieś było dokładnie to samo, to nie znalazłem poprzez szukaj.
[/i]
P-134297
pekfos
» 2015-07-04 14:17:55
C/C++
for( int i = 0; i < x; i++ ) {
    for( int j = 1; j < x; j++ ) {
        if( tablica_wartosci[ i ] > tablica_wartosci[ i + j ] ) {
Masz x elementów, a odwołujesz się do elementu i + j? Ta suma może być równa nawet niecałe 2 * x.
P-134302
GregoryIwanek
Temat założony przez niniejszego użytkownika
» 2015-07-04 14:54:19
Odwołanie było dobre, tylko, że wyszedłem z odwołaniem 'i+j" poza tablicę, bo nie dałem żadnego warunku na przerwanie w takim wypadku.

Poprawnie powinno być:
C/C++
for( int i = 0; i < x; i++ ) {
    for( int j = 1; j < x; j++ ) {
       
        if( i + j == x ) break; // tutaj warunek na przerwanie pętli, żeby nie wyjść poza tablicę która ma jakąś wartość...
       
        else if( tablica_wartosci[ i ] > tablica_wartosci[ i + j ] ) {
            nie_najmniejszy_element = tablica_wartosci[ i ];
            tablica_wartosci[ i ] = tablica_wartosci[ i + j ];
            tablica_wartosci[ i + j ] = nie_najmniejszy_element;
        }
    }
}

Tylko, że dalej nie rozumiem dlaczego sortowało dobrze gdy x należał do 15<x<135 ;]
Tak czy siak, dziękuję za chęć pomocy. Pozdro.
P-134305
pekfos
» 2015-07-04 22:31:09
dalej nie rozumiem dlaczego sortowało dobrze gdy x należał do 15<x<135 ;]
Przypadek.
P-134326
« 1 »
  Strona 1 z 1