Witam,
Mam takie zadanie:
Dane wczytywane są z pliku, pierwsza linia wejścia zawiera liczbę całkowitą z - liczbę zestawów danych, których opisy występują kolejno po sobie. Opis jednego zestawu jest następujący:
Pierwsza linia zawiera liczbę naturalną n, określającą długość tablicy T. W kolejnej linii znajduje się n elementów tablicy, oddzielonych pojedynczym odstępem.
Dla każdego zestawu danych wypisz w jednej linii pooddzielany spacjami posortowany ciąg rosnąco.
Przykładowa zawartość pliku to np.
2
3
3 1 2
4
0 5 1 7
Napisałem taki kod:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int partition(int tablica[], int p, int r) // dzielimy tablice na dwie czesci, w pierwszej wszystkie liczby sa mniejsze badz rowne x, w drugiej wieksze lub rowne od x
{
int x = tablica[p]; // obieramy x
int i = p, j = r, w; // i, j - indeksy w tabeli
while (true) // petla nieskonczona - wychodzimy z niej tylko przez return j
{
while (tablica[j] > x) // dopoki elementy sa wieksze od x
j--;
while (tablica[i] < x) // dopoki elementy sa mniejsze od x
i++;
if (i < j) // zamieniamy miejscami gdy i < j
{
w = tablica[i];
tablica[i] = tablica[j];
tablica[j] = w;
i++;
j--;
}
else // gdy i >= j zwracamy j jako punkt podzialu tablicy
return j;
}
}
void quicksort(int tablica[], int p, int r) // sortowanie szybkie
{
int q;
if (p < r)
{
q = partition(tablica,p,r); // dzielimy tablice na dwie czesci; q oznacza punkt podzialu
quicksort(tablica, p, q); // wywolujemy rekurencyjnie quicksort dla pierwszej czesci tablicy
quicksort(tablica, q+1, r); // wywolujemy rekurencyjnie quicksort dla drugiej czesci tablicy
}
}
void otworz(ifstream &file)
{
while(true) //Pętla wykonuje się do momentu otwarcia pliku
{
string nazwa_pliku;
cout << "Podaj nazwe pliku : ";
getline(cin,nazwa_pliku); //pobranie nazwy pliku
//sprawdzamy czy użytkownik podał nazwe z rozszerzeniem, jeżeli nie to dopisujemy do nazwy *.txt
file.open(nazwa_pliku.c_str());
if(file.is_open())
return;
file.open((nazwa_pliku+".txt").c_str());
if(file.is_open())
return;
//Jeżeli użytkownik podał nieprawidłową nazwę pliku zwracamy komunikat
cout<<"Podana nazwa pliku jest nieprawidłowa! Plik nie istnieje"<<endl;
}
}
void iloscciagow(ifstream &file, int &z)
{
file >> z;
}
int *wczytaj(ifstream &file, int &n)
{
int i;
int *Tablica;
file >> n;
Tablica = new int [n-1];
for (i=0; i<=n-1; i++)
{
file >> Tablica[i];
cout<<Tablica[i]<< " ";
};
cout<<endl;
return Tablica;
}
int main()
{
ifstream plik;
int a,b,n;
otworz(plik);
iloscciagow(plik,b);
cout<<b<<endl;
for (a=0; a<=b-1; a++)
{
wczytaj(plik,n);
quicksort(wczytaj(plik,n),0,n-1);
};
getchar();
return 0;
}
Otwiera plik, wczytuje oba ciągi poprawnie, ale po dołączeniu funkcji quicksort do pętli dostaje dwa wiersze po 4 losowe wartości. Nie mogę się doszukać błędu. Mógłby ktoś pomóc?
Z góry dziękuje za pomoc,