Witam, jakiś czas temu oddawałem zadanie na spoja (sort1). zadanie polegało na tym, żeby podać współrzędne punktu, które następnie zostaną posortowane i wyświetlone ze względu na odległość od początku układu współrzędnych (najpierw wyświetlane są punkty bliżej początku). program działał, został zaakceptowany, był ok -> wygląda o tak:
#include <iostream>
using namespace std;
const int Tib = 10;
struct punkt
{
char ch [Tib];
int x;
int y;
float odl;
};
inline double odleg (punkt t1) {return t1.x * t1.x + t1.y*t1.y;}
void sortuj(punkt *t1, int n);
int main()
{
using namespace std;
int test, liczba_punktow;
punkt t1[1000];
char ch;
cin>> test;
for (int i = 0; i < test; i++)
{
int j;
cin>>liczba_punktow;
for (j = 0; j < liczba_punktow; j++) //wpisywanie wartosci punktow do tablicy i oblicznaie odleglosci za pomoca funkcji.
{
cin>>t1[j].ch;
cin>>t1[j].x >> t1[j].y;
t1[j].odl = odleg (t1[j]);
}
sortuj(t1, j);
for (int w = 0; w < j; w ++)
cout<< t1[w].ch<<" "<<t1[w].x<<" "<<t1[w].y<<endl;
}
}
void sortuj(punkt *t2, int n)
{
punkt tmp;
for (int i=0; i<n; i++)
{
for (int j = 0; j < n - 1; j++)
{
if (t2[j].odl > t2[j+1].odl)
{
tmp=t2[j];
t2[j]=t2[j+1];
t2[j+1]=tmp;
}
}
}
}
teraz chciałbym przepisać program tak, żeby zamiast na strukturze operował na klasie (co może i jest bez sensu i tylko komplikuje program, ale chcę poćwiczyć) . Chcę stworzyć klasę i wyposażyć ją w funkcje która liczy odległość. Teraz wygląda tak:
#include <iostream>
#include <string>
const int TIB = 10;
class Punkt
{
private:
std::string ch;
int x;
int y;
double odleg;
double odl(int a, int b) { odleg = a * a + b * b;}
public:
Punkt ();
Punkt (std::string ch1, int xx, int yy); //konstruktor
};
void sortuj(Punkt t3, int n);
int main()
{
using namespace std;
int test, liczba_punktow;
Punkt t2[1000]; //czyli tu musi byc konstruktor domyslny?
cin>> test;
for (int i = 0; i < test; i++)
{
string ch;
int x, y;
int j;
cin>>liczba_punktow;
for (j = 0; j < liczba_punktow; j++)
{
cin>>ch>>x>>y;
t2[j] = Punkt (ch,x,y); // a dlaczego nie Punkt::Punk (ch,x,y)t???
}
// jeszcze nic nie sortuje. na tym skonczyłem
}
}
// tu był alfgorytm sortujący, ale jeszcze do struktur. Nic z nim nie robiłem
Punkt::Punkt () //konstruktor domyslny
{
ch = "bez nazwy"; // chciałem tutaj wpisac do tablicy char ale wyskakiwaly bledy . strcpy nie dzialalo
x = 0;
y = 0;
}
Punkt::Punkt (string ch1, int xx, int yy)
{
ch = ch1;
x=xx;
y=yy;
odl(xx,yy);
}
Teraz mam kilka pytań - oprócz tych zawartych w komentarzach
- jak to zrobić lepiej i ładniej. Wiem, ze ktoś mi zaraz wklei poprawiony kod, natomiast prosiłbym o jakies komentarze
- jak to postortowac wg wartosci prywatnej (odleg)? Wiem, ze nie korzystam ze specjalnej funkcji, do tego stosuje sortowanie bąbelkowe ale che wiedziec co się dzieje w srodku