matematykaszkolna.pl
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ż? emotka
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 emotka
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 emotka
13 mar 18:58