This is an old revision of the document!
Responsabili: Emil Racec, Laura Vasilescu
Termen de predare: 18 noiembrie 2012 23:55. Tema se va trimite prin intermediul platformei de cursuri cs.curs
Obiective: După realizarea acestei teme de casă studentul va fi capabil să:
Cunoștințe necesare rezolvării acestei teme de casă:
Acuzat de trădare (pentru că a prezis declinul Imperiului Galactic), Hari Seldon este exilat alături de echipa sa de „Enciclopediști” pe planeta Terminus. Aceștia însă implementează în secret un plan de rezervă – A doua fundație – la celălalt capăt al galaxiei.
Cea mai importantă parte din plan este însă cunoașterea în amănunt a celuilalt capăt al galaxiei. Analizând cu atenție harta Universului, Seldon constată că există o planetă îndepărtată, numită Planeta Provinus, despre care se cunosc foarte puține date, și hotărăște să facă o expediție intergalactică pe aceasta.
Lipsa de informații despre această planetă se datorează numeroaselor expediții eșuate datorită unor fenomene stranii de pe suprafața planetei, soldate cu dispariții sau avarieri fatale ale navelor.
Hari Seldon și cu echipa sa de filosofi construiesc, pentru această expediție aparent imposibilă, un sistem de sateliți performanți, cu ajutorul cărora reușesc să facă o analiză a fenomenelor stranii de pe Planeta Provinus, bazându-se pe parametrii colectați de sateliți.
Astfel, ei au constatat că planeta are o Zonă Periculoasă, aproximativ delimitată de un triunghi, in care sunt fenomene electrice și magnetice de o forță nemaiîntâlnită. De asemenea, această zonă poate să își schimbe poziția pe suprafața planetei, însă își menține întotdeauna forma triunghiulară.
Deoarece Nava lui Sheldon nu dispune de un sistem de navigare atât de avansat încât să evite pericolul, proiectați componenta computerului de bord a navei care ajută la sistemul de ghidare. Pentru aceasta, aveți la dispoziție datele furnizate de sistemul de sateliți, care pot fi de două tipuri:
TIPUL 1:
(V1x,V1y) (V2x,V2y) (V3x,V3y) TIPUL 2:
N (P1x,P1y) (P2x,P2y) (P3x,P3y) …. (P(n-1)x,P(n-1)y) (Pnx,Pny)
In momentul in care se primesc date de TIPUL 2
, va trebui să calculați dacă nava se află sau nu in Zona Periculoasă (pentru fiecare poziție a sa din cele n poziții), și dacă da, să afișați distanța cea mai scurtă până la ieșirea din această zonă (număr de tip real, cu exact două zecimale după virgulă). Un exemplu de afișare este:
SAU
TIPUL 1
furnizate nu pot forma o arie a Zonei Periculoase In momentul in care sateliții furnizează date de tipul 1 înseamnă că Zona Periculoasă s-a modificat, deci calculele pentru pozițiile ulterioare ale navei se vor face raportat la noile coordonate ale zonei. Astfel, o poziție a navei se va calcula întotdeauna raportat la ultimul set de coordonate ale Zonei Periculoase transmise de sateliți.
Încheierea transmisiei de către sateliți, reprezentând finalul expediției de pe planeta Provinus, va fi marcată prin transmiterea unei linii noi(goale). De asemenea, afișarea rezultatelor voastre va trebuie să se încheie tot printr-o linie nouă(goală).
Datele de intrare se vor citi de la tastatură. Acestea vor fi furnizate alternativ de către sateliți și se garantează că transmisia lor începe cu date de TIPUL 1
și se termină cu date de TIPUL 2
. Coordonatele punctelor (pentru ambele tipuri de date) vor fi de forma (Cx,Cy): cele doua coordonate reale vor fi incadrate intr-o paranteza rotunda si despartite printr-o virgula. Două puncte sunt despărțite între ele printr-un singur spațiu iar două tipuri de date consecutive printr-o linie nouă('\n').
Rezultatele analizei se vor afișa pe ecran astfel: fiecare linie va conține la început N - numărul de puncte analizate pentru aceeași zonă de TIPUL 2
urmat de rezultatele obținute pentru cele N puncte (de forma: (N0) sau (YES,<d_min_ieșire_din_undefined>)) separate printr-un singur spațiu. Două zone consecutive de TIPUL 2
vor fi despărțite prin linie nouă.
Determinarea Zonei Periculoase se face de către sateliți folosind proceduri complexe de aproximare și interpolare a diferitelor valori ale parametrilor inregistrați. Totuși, datorită unor truncheri a valorilor coordonatelor este posibil ca cele 3 puncte furnizate să nu poată constitui o arie validă a Zonei Periculoase. În acest caz, se va afișa(pe o linie nouă) “SATELLITE COMPUTATION ERROR!” (fără ghilimele) și secvența de N puncte corespunzătoare acestei zone NU va fi analizată.
Fie următoarea secvență de date de intrare, furnizate de sateliți:
(0.00,0.00) (0.00,1.50) (2.11,-1.37) 4 (1.00,2.00) (2.23,45.1) (0.12,0.73) (0.00,0.00) (1.16,2.12) (9.14,3.21) (1.16,2.12) 2 (-15.21,0.99) (5.55,-8.93)
Se va afișa la ecran:
4 (NO) (NO) (YES,0.12) (YES,0.00) SATELLITE COMPUTATION ERROR!
Fișierul sursă trimis de voi va trebui să se numească tema2.c
(fără majuscule!). El va fi compilat folosind gcc
sub Linux, astfel că indiferent de mediul de programare folosit la elaborarea programului, tema voastră va trebui să fie compilabila cu gcc
. Makefile-ul folosit la compilarea temei voastre este cel folosit în cadrul Laboratorului 1, cu actualizările de rigoare.
Implementarea voastră trebuie să fie modulară. Hint: definiti-vă și folosiți cât mai multe funcții.
În afară de avertizările de la secțiunea validității datelor de intrare, puteți fi siguri că nu se vor strecura alte date nevalide sau incompatibile între ele (precum neconcordanta între numărul de puncte N și numărul actual de puncte, etc.)
Deși programul vostru va trebui să citească direct de la tastatură și să afișeze pe ecran (folosind, de exemplu, scanf și printf), puteți să citiți datele și să le scrieți în fișiere text, folosind redirectarile din consolă, fără să modificați programul. Dacă fișierul de intrare este example.in
, și cel de ieșire este example.out
, iar programul vostru se numește tema2, comanda la consolă va fi:
./tema2 < example.in > example.out
De asemenea, se garantează că dimensiunea unei coordonate nu va depăși tipul float
iar N (numărul de puncte) va fi un întreg fără semn pe 32 de biți.