Se consideră n puncte din plan, definite prin coordonatele lor carteziene (x,y). Să se ordoneze dcsrescător punctele date, după distanţa lor de la originea de cordonate. Indicaţie: distanţa d a punctului P(x,y) de la originea de coordonate se determină după formula: d = (x2 + y2)1/2.
Intrare.În prima linie a fişierului text puncte.in se află numărul natural n, iar în fiecare din următoarele n linii se conţin căte 2 numere reale, x şi y (separate prin spaţiu), reprezentând abscisa, respectiv ordonata punctului respectiv.
Ieşire. Fişierul text puncte.out este constituit din n linii, pe fiecare din care se conţin căte 3 numere, separate prin spaţiu, în ordinea: abscisa, ordonata şi distanţa punctului respectiv de la originea de coordonate; liniile fişierului de ieşire vor fi ordonate descrescător după distanţa lor de la origine, folosint metoda selecţiei de sortare.
Rog ajutor
Răspunsuri la întrebare
#include <iostream>
#include <fstream>
#include <cmath>
struct Punct {
double x, y;
double distanta() const {
return sqrt(x * x + y * y);
}
bool operator<(const Punct& p) const {
return distanta() < p.distanta();
}
};
std::ostream& operator<<(std::ostream& out, const Punct& p) {
return out << p.x << ' ' << p.y << ' ' << p.distanta();
}
void selection_sort(Punct* lhs, const size_t n) {
Punct *mx;
for (size_t j, i = 0; i < n - 1; ++i) {
mx = lhs + i;
for (j = i + 1; j < n; ++j)
if (*mx < lhs[j])
mx = lhs + j;
std::swap(*mx, lhs[i]);
}
}
int main() {
size_t n;
Punct *v;
{
std::ifstream fin("puncte.in");
fin >> n;
v = new Punct[n];
for (size_t i = 0; i < n; ++i)
fin >> v[i].x >> v[i].y;
}
selection_sort(v, n);
std::ofstream fout("puncte.out");
for (size_t i = 0; i < n; ++i)
fout << v[i] << '\n';
delete[] v;
}