cpp
Alky: Zadanie(podpunkt) z tegorocznej próbnej matury z inf.
Znajdź te okręgi z pliku okregi.txt, które są styczne do osi OX. Posortuj je niemalejąco
względem pierwszej współrzędnej środka okręgu, a jeśli te współrzędne są równe, względem
drugiej współrzędnej. W takiej kolejności zapisz dane o znalezionych okręgach (liczby x, y, r
oddzielone spacją) w pliku wynik2.txt. W ostatnim wierszu tego pliku zapisz liczbę tych
okręgów.
Moja propozycja:
void pptb()
{
ifstream fin;
ofstream fout;
fin.open("okregi.txt");
fout.open("probnaWynik2.txt");
if(!fin) cout<<"Nie ma takiego plku"<<endl;
int x, y, r;
int ilosc=0;
while(!fin.eof())
{
fin>>x, y, r;
if(abs(y)==r)
{
ilosc++;
fout<<x<<" "<<y<<" "<<r<<endl;
}
}
fout<<ilosc;
fin.close();
fout.close();
}
Dane w pliku tekstowym to x linii danych typu całkowitego. W jednej linni są x y r oddzielone
spacją.
To jest oczywiście bez wspomnianego w zadaniu sortowanie, bo jak zobaczyłem, że nie działą to
skupiłem się na sednie problemu. Więc.. Ktoś jest w stanie powiedzieć mi dlaczego to nie
działa ? Nie znajduje żadnych okręgów :'(
12 mar 23:13
Pytający:
Nic dziwnego. Zastanów się, co robi linijka:
fin>>x, y, r;
Przecinek to cudowny operator, nieprawdaż?
12 mar 23:28
Alky: daim
To....to nie tak ...
I nagle 121 wyników
Pomyłka. Dzięki wielkie
12 mar 23:32
Mariusz:
Do sortowania możesz użyć jednego z następujących algorytmów
struct circle
{
int x,y,r;
};
// sortowanie przez scalanie
void Merge(struct circle *array,int left,int mid,int right)
{
int n1,n2,i,j,k;
struct circle *auxArray;
n1=mid−left+1;
n2=right−mid;
auxArray=(struct circle*)malloc((n1+n2)*sizeof(struct circle));
for(k=left; k<=right; k++)
auxArray[k−left]=array[k];
i=0;
j=n1;
k=left;
while((i<n1)&&(j<n1+n2))
{
if(auxArray[i].x<=auxArray[j].x)
{
array[k]=auxArray[i];
i++;
}
else
{
array[k]=auxArray[j];
j++;
}
k++;
}
while(i<n1)
{
array[k]=auxArray[i];
i++;
k++;
}
while(j<n1+n2)
{
array[k]=auxArray[j];
j++;
k++;
}
free(auxArray);
}
void MergeSort(struct circle *array,int left,int right)
{
int mid;
if(left<right)
{
mid=(left+right)/2;
MergeSort(array,left,mid);
MergeSort(array,mid+1,right);
Merge(array,left,mid,right);
}
}
//sortowanie stogowe
void heapify(struct circle *array,int i,int heapsize)
{
int left,right,largest;
struct circle aux;
int isHeap;
isHeap=0;
while((i<=heapsize)&&(!isHeap))
{
left=2*i+1;
right=2*i+2;
if((left<heapsize)&&(array[left].x>array[i].x))
largest=left;
else
largest=i;
if((right<heapsize)&&(array[right].x>array[largest].x))
largest=right;
if(largest!=i)
{
aux=array[i];
array[i]=array[largest];
array[largest]=aux;
i=largest;
}
else
isHeap=1;
}
}
void buildHeap(struct circle *array,int n)
{
int i;
for(i=n/2−1; i>=0; i−−)
heapify(array,i,n);
}
void heapSort(struct circle *array,int n)
{
int i;
struct circle x;
buildHeap(array,n);
for(i=n−1; i>=1; i−−)
{
x=array[0];
array[0]=array[i];
array[i]=x;
heapify(array,0,i);
}
}
//sortowanie szybkie
void QuickSort(struct circle *array,int left,int right)
{
struct circle x,v;
int i,j;
v=array[(left+right)/2];
i=left;
j=right;
do
{
while(array[i].x<v.x) i++;
while(array[j].x>v.x) j−−;
if(i<=j)
{
x=array[i];
array[i]=array[j];
array[j]=x;
i++;
j−−;
}
}
while(i<=j);
if(j>left) QuickSort(array,left,j);
if(i<right) QuickSort(array,i,right);
}
W C++ malloc zastępujesz new
a free zastępujesz delete
Przy czytaniu z pliku przydatna jest też funkcja realloc ale nie wiem jak ją zastąpić w C++
Funkcje sortujące musisz jeszcze zmodyfikować bo chcą abyś w przypadku
równych odciętych sortował po rzędnych
13 mar 10:31
Mariusz:
Tak na dobrą sprawę to sortowanie danych w pliku należy zrealizować jednym z algorytmów
mergeSort bo nie mamy gwarancji że plik nam się zmieści w pamięci RAM
Można wczytać do tablicy i posortować (najlepiej kopcem)
ale tylko aby przygotować sobie początkowe serie
bo tak jak pisałem cały plik może nie zmieścić się w dostępnej dla nas pamięci RAM
Ja znalazłem jedynie łączenie naturalne w Pascalu
Niby coś na ten temat jest u Wirtha ale spróbuj napisać kod
U Diksa i Ryttera jest o tym niewiele no ale gdy ja dałem tego typu zadanie
to jc pisał że o tym jest wszędzie napisane
13 mar 11:02
Alky: Sortowania znam. Co do RAM'u to jest to zadanie jak mówiłem maturalne, więc jest zrobione tak,
że chyba nie da się tego schrzanić, nawet jeśli wybierze się nieoptymalną metodę. Wczoraj tego
nie skończyłem, więc dziś wieczorkiem usiądę i dokończę. Dzięki
13 mar 16:23
Mariusz:
Możemy mieć takie sytuacje
Mamy dość duży plik z danymi do posortowania
Mamy bardzo mało dostępnej pamięci RAM jak np w DOS
(tzw konwencjonalnej 640kB którą można było rozszerzyć do 1MB)
i tu przydaje się sortowanie przez scalanie
Kod łączenia naturalnego można znaleźć w Pascalu
Bardziej efektywnych sortował jak łączenie wielofazowe czy kaskadowe trudno ci będzie znaleźć
13 mar 18:24
Mariusz:
Te sortowania które podałem na ogół są dość szybkie chociaż quicksort może czasem zwolnić
jednak przystosowane są do sortowania tablic a wczytanie pliku do tablicy może nie rozwiązać
problemu bo zależy to od rozmiaru sortowanego pliku i ilości dostępnej pamięci RAM
13 mar 18:46
Jack: counting sort
13 mar 18:58