PROBLEMĂ C++ PENTRU ELITĂ. EȘTI ÎN STARE?
PROGRAM C++
În plan euclidian un disc poate fi definit prin coordonatele centrului O(x, y) și raza lui R. Datele referitoare la n discuri din plan sunt înregistrate în fișierul text "disc.in", în prima linie a cărui se află numarul natural n, iar fiecare urmatoarele n linii conțin câte trei numere reale x, y și R (separate prin câte un spațiu), reprezentând abscisa, ordonata și raza discului respectiv.
Scrieți un program, care va creia fișierul "disc.out", în care se vor înregistra informațiile despre toate discurile exterioare în raport cu discul de rază maximală, din cele date. Liniile fișierului de ieșire vor avea același format ca și în cel de intrare și vor fi ordonate crescător după lungimea razei.
Răspunsuri la întrebare
Am sa incerc sa dau detalii despre cum as face eu acest program.
1. Construiesc o structura de date ce va contine:
- x: double: coordonata x a centrului discului
- y: double: coordonata y a centrului discului
- R: double: raza discului.
struct StructDiscInfo {
double x;
double y;
double R;
};
2. Din fisierul de intrare, citesc prima linie, numarul n.
3. Construiesc un vector de n elemente
StructDiscInfo *discInfo = new StructDiscInfo[n];
ale carui elemente sint chiar structurile de mai sus.
3. Cu ajutorul unui ciclu de la 0 la n-1 (adica n elemente) citesc linie cu linie fisierul de intrare. Pentru fiecare linie construiect o structura pe care o adaug in vectorul de elemente:
StructDiscInfo structDiscInfo = {.x = value_X_din_fisier, .y = value_Y_din_fisier, .R = value_R_din_fisier};
discInfo[i] = structDiscInfo;
4. Ordonez crescator, dupa raza, elementele din discInfo. Voi folosi metoda bulelor in acest sens, deoarece este cea mai simpla si populara.
5. Determin discul cu cea mai mare raza. Acesta va fi ultimul element din array-ul discInfo:
StructDiscInfo discInfoMaxRadius = discInfo[n - 1]
Fie xo, yo, Ro pentru acest disc.
5. Pentru toate celelalte n-1 discuri (adica primele n-1 elemente din discInfo), cu un ciclu for, determin daca acestea sint in exteriorul discului cu raza maxima.
Adica determin distanta dintre centrele celor 2 discuri:
d = rad((xi - xo)² + (yi - yo)²)
Discul i este in exteriorul discului cu raza maxima daca: d > Ri + Ro
Daca conditia este indeplinita, scriu o linie (cu datele din discInfo[i]) in fisierul de iesire.
Observatie: liniile in fisierul de iesire vor fi deja ordonate crescator dupa raza, deoarece array-ul de intrare discInfo este ordonat crescator dupa raza,
6. Si cam asta este tot.
Succes