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

[C++] Losowanie i sortowanie szybkie liczb - program kończy się już po wylosowaniu

Ostatnio zmodyfikowano 2014-05-25 20:19
Autor Wiadomość
Borowicz
Temat założony przez niniejszego użytkownika
[C++] Losowanie i sortowanie szybkie liczb - program kończy się już po wylosowaniu
» 2014-05-24 14:26:38
Witam,
mam do napisania program o następujących założeniach:
 
Wylosować w tablice 100 elementów typu int z przedziału  <-500,500>
Zaimplementować algorytm ‘quicksort’ z wykorzystaniem rekurencji.
Posortować wylosowaną tablicę.

Wylosowałem i wypisałem na ekran elementy - tu wszystko jest ok. Problem w tym, że nie chce nie mogę wyświetlić posortowanych liczb - program przerywa działanie po wylosowaniu liczb i zwraca dużą wartość.

Mój kod:
C/C++
#include <iostream>
#include <fstream> //do plików
#include <ctime>
#include <cstdlib>

#define zad1_r 100

using namespace std;

void zad1();

int main()
{
    zad1();
}


int * losowanie()
{
    srand( time( NULL ) );
    int tab[ zad1_r ];
    for( int i = 0; i < zad1_r; i++ )
    {
        tab[ i ] = rand() / 1001 - 500;
    }
    return tab;
}

int * drukuj( int * pobrane ) //tutaj może być też void
{
    cout << "WYLOSOWANA TABLICA\n";
    int tab[ zad1_r ];
    for( int i = 0; i < zad1_r; i++ )
    {
        cout << tab[ i ] << " ";
    }
}

int partycjonowanie( int * pobrane, int start, int koniec )
{
    int piwot = pobrane[ koniec ];
    int r;
   
    while( pobrane[ start ] < piwot )
         start++;
   
    while( pobrane[ koniec ] > piwot )
         koniec--;
   
    if( pobrane[ start ] == pobrane[ koniec ] )
         start++;
   
    else if( start < koniec )
    {
        int zmienna = pobrane[ start ];
        pobrane[ start ] = pobrane[ koniec ];
        pobrane[ koniec ] = zmienna;
    }
   
    return r;
}

void sortowanie( int * pobrane, int start, int koniec )
{
    if( start < koniec )
    {
        int j = partycjonowanie( pobrane, start, koniec );
        sortowanie( pobrane, start, j - 1 );
        sortowanie( pobrane, j + 1, koniec );
    }
}
void zad1()
{
    losowanie();
    int * pobrane = losowanie();
    drukuj( pobrane );
    sortowanie( pobrane, 0, 99 );
    drukuj( pobrane );
}

Logi do mojego kodu:

General: TDM-GCC 4.8.1 64-bit Release
Executing g++.exe...
g++.exe "F:\Semestr II - informatyka\Podstawy programowania\na forum.cpp" -o "F:\Semestr II - informatyka\Podstawy programowania\na forum.exe"  -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.8.1\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib" -static-libgcc
F:\Semestr II - informatyka\Podstawy programowania\na forum.cpp: In function 'int* losowanie()':
F:\Semestr II - informatyka\Podstawy programowania\na forum.cpp:21:9: warning: address of local variable 'tab' returned [-Wreturn-local-addr]
     int tab[zad1_r];
         ^

Compilation succeeded in 1.87 seconds with warnings


Pisząc algorytm sortowania szybkiego opierałem się na poniższym kodzie, który jest według mnie prawidłowy
C/C++
#include <iostream>
using namespace std;

const int INPUT_SIZE = 10;

// A simple print function
void print( int * input )
{
    for( int i = 0; i < INPUT_SIZE; i++ )
         cout << input[ i ] << " ";
   
    cout << endl;
}

// The partition function
int partition( int * input, int p, int r ) //0 9
{
    int pivot = input[ r ];
   
    while( p < r )
    {
        while( input[ p ] < pivot )
             p++;
       
        while( input[ r ] > pivot )
             r--;
       
        if( input[ p ] == input[ r ] )
             p++;
        else if( p < r )
        {
            int tmp = input[ p ];
            input[ p ] = input[ r ];
            input[ r ] = tmp;
        }
    }
   
    return r;
}

// The quicksort recursive function
void quicksort( int * input, int p, int r )
{
    if( p < r )
    {
        int j = partition( input, p, r );
        quicksort( input, p, j - 1 );
        quicksort( input, j + 1, r );
    }
}

int main()
{
    int input[ INPUT_SIZE ] = { 500, 700, 800, 100, 300, 200, 900, 400, 1000, 600 };
    cout << "Input: ";
    print( input );
    quicksort( input, 0, 9 );
    cout << "Output: ";
    print( input );
    return 0;
}
P-110782
Borowicz
Temat założony przez niniejszego użytkownika
» 2014-05-24 14:39:31
A co zrobiłem źle? Bo nie widzę naruszenia regulaminu?
P-110783
michal11
» 2014-05-25 20:19:47
Umiesz czytać warningi ?

F:\Semestr II - informatyka\Podstawy programowania\na forum.cpp: In function 'int* losowanie()':
F:\Semestr II - informatyka\Podstawy programowania\na forum.cpp:21:9: warning: address of local variable 'tab' returned [-Wreturn-local-addr]

Zwracasz lokalna zmienną
tab
P-110857
« 1 »
  Strona 1 z 1