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

0

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 program:

#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);
}

 

Moje logi kompilacji (nie wiedziałem jak je wstawić, więc dałem cytat)

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.cpp9: warning: address of local variable 'tab' returned [-Wreturn-local-addr]
int tab[zad1_r];
^

Compilation succeeded in 1.87 seconds with warnings

Pozdrawiam i z góry dziękuję za wszelką pomoc

2
void losowanie(int tab[],unsigned size)
  {    
   //srand(time(0)); // przenieść do main()
   for(unsigned i=0;i<size;++i) tab[i]=rand()%1001-500;
  }

void drukuj(int tab[],unsigned size)
  {
   cout<<"{";
   for(unsigned i=0;i<size;++i)  cout<<(", "+!i)<<tab[i];
   cout<<" }";
  }

void zad1(int tab[],unsigned size)
  {
   losowanie(tab,size);
   cout<<"WYLOSOWANA TABLICA "; 
   drukuj(tab,size);
   sortowanie(tab,0,size-1);
   cout<<"POSORTOWANA TABLICA "; 
   drukuj(pobrane,size);
  }

int main()
  {
   srand(time(0));
   int tab[zad1_r];
   zad1(tab,zad1_r);
   return 0;
  }
0

Wstawiłem te funkcje i efekt jest ten sam: Program przestaje działać po wyświetleniu wylosowanych elementów.

Oto nowy kod:

 
#include <iostream>
#include <fstream> //do plików
#include <ctime>
#include <cstdlib>

#define zad1_r 100

using namespace std;

void losowanie(int tab[],unsigned size)
  {    
   for(unsigned i=0;i<size;++i) tab[i]=rand()%1001-500;
  }


void drukuj(int tab[],unsigned size)
  {
   cout<<"{";
   for(unsigned i=0;i<size;++i)  cout<<(", "+!i)<<tab[i];
   cout<<" }";
  }
  
  
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(int tab[],unsigned size)
  {
   losowanie(tab,size);
   cout<<"WYLOSOWANA TABLICA "; 
   drukuj(tab,size);
   sortowanie(tab,0,size-1);
   cout<<"POSORTOWANA TABLICA "; 
   drukuj(tab,size);
  }
 
int main()
  {
   srand(time(0));
   int tab[zad1_r];
   zad1(tab,zad1_r);
   return 0;
  }

0

Nie ten sam, teraz drukowanie przed losowaniem działa.

#include <algorithm>
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
 
#define zad1_r 100

void losowanie(int tab[],unsigned size)
  {    
   for(unsigned i=0;i<size;++i) tab[i]=rand()%1001-500;
  }
 
 
void drukuj(int tab[],unsigned size)
  {
   cout<<"{";
   for(unsigned i=0;i<size;++i)  cout<<(", "+!i)<<tab[i];
   cout<<" }"<<endl;
  }

void zad1(int tab[],unsigned size)
  {
   losowanie(tab,size);
   cout<<"WYLOSOWANA TABLICA "; 
   drukuj(tab,size);
   //sortowanie(tab,0,size-1);
   sort(tab,tab+size);
   cout<<"POSORTOWANA TABLICA "; 
   drukuj(tab,size);
  }
 
int main()
  {
   srand(time(0));
   int tab[zad1_r];
   zad1(tab,zad1_r);
   return 0;
  }

http://ideone.com/XcLFje

1 użytkowników online, w tym zalogowanych: 0, gości: 1