Informatică, întrebare adresată de Andrey555, 8 ani în urmă

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

Anexe:

Răspunsuri la întrebare

Răspuns de Petruccinator
1

#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;

}


Andrey555: baaaaa mulțumesc mai ajutat foarte mult!!!!!
Andrey555: Ma mai poti ajuta la o problema,,
Andrey555: ?!
Alte întrebări interesante