Created
May 3, 2026 08:43
-
-
Save thinkphp/b01d64aff54b87c71d3ad13bf82a609b to your computer and use it in GitHub Desktop.
Proiect Traseu
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <iostream> | |
| #include <fstream> | |
| #include <vector> | |
| #include <cmath> | |
| #include <algorithm> | |
| using namespace std; | |
| //CLASA PUNCT | |
| class Punct { | |
| private: | |
| string numeLocatie; | |
| double abscisa; //coordonata x (positiva) | |
| double ordonata; //coordonata y (positiva) | |
| public: | |
| //constructorul clasei | |
| Punct(const string& nume, double x, double y): numeLocatie(nume), abscisa(x), ordonata(y){} | |
| //functii de access | |
| //getters | |
| string getNume() const {return numeLocatie;} | |
| double getAbscisa() const {return abscisa;} | |
| double getOrdonata() const {return ordonata;} | |
| //setters | |
| void setNume(const string &n) {numeLocatie=n;} | |
| void setAbscisa(double x) {abscisa = x;} | |
| void setOrdonata(double y) {ordonata = y;} | |
| //supraincarcare operator << | |
| friend ostream& operator<<(ostream& os, const Punct& p) { | |
| os << "{"<<p.numeLocatie<<", ("<<p.abscisa<<", "<<p.ordonata<<")}"; | |
| return os; | |
| } | |
| //operatorul () - distanta euclidiana intre doua puncte | |
| double operator()(const Punct& alt) const { | |
| double dx = abscisa - alt.abscisa; | |
| double dy = ordonata - alt.ordonata; | |
| return sqrt(dx*dx + dy*dy); | |
| } | |
| }; | |
| class Traseu { | |
| private: | |
| string numeTraseu; | |
| vector<Punct*> puncte; //colectie de pointeri la Punct | |
| public: | |
| //constructorul clasei | |
| Traseu(const string& nume): numeTraseu(nume){} | |
| //destructorul clasei | |
| ~Traseu() { | |
| } | |
| //functii de access | |
| //getter si setter | |
| string getNume() const {return numeTraseu;} | |
| //operatorul << pentru adaugarea unui punct la traseu | |
| Traseu& operator<<(Punct *p) { | |
| puncte.push_back( p ); | |
| return *this; | |
| } | |
| //operator [] - returneaza adresa punctului cu numele dat sau nullptr daca nu exista | |
| Punct* operator[](const string& numeLocatie) const { | |
| for(Punct *p: puncte) { | |
| if(p->getNume() == numeLocatie) return p; | |
| } | |
| return nullptr; | |
| } | |
| //operator cast la double - lungimea totala a traseului | |
| operator double() const { | |
| double total = 0.0; | |
| for(size_t i = 1; i < puncte.size(); ++i) { | |
| total+= (*puncte[i-1])(*puncte[i]); | |
| } | |
| return total; | |
| } | |
| // Operator << afisare in consola | |
| // Traseu: <nume> | |
| // <punct1> ... | |
| // | |
| // Lungime traseu: <val> | |
| friend ostream& operator<<(ostream&os, const Traseu& t) { | |
| os<<"Traseu "<<t.numeTraseu<<"\n"; | |
| for(const Punct*p : t.puncte) { | |
| os<<"\t"<<*p<<"\n"; | |
| } | |
| os<<"Lungime traseu: "<<double(t)<<"\n"; | |
| return os; | |
| } | |
| // Operator << serializare in fisier text: | |
| // punctele sunt sortate, se evita intoarcerile pe axa Ox | |
| //ordine crescatoare dupa abscisa, primul punct ramane fix | |
| friend fstream& operator<<(fstream& fs, const Traseu& t) { | |
| if(t.puncte.empty()) return fs; | |
| //copiem pointerii (fara primul punct) | |
| vector<Punct*> sortate(t.puncte.begin()+1, t.puncte.end()); | |
| //sortam dupa abscisa crescator | |
| sort(sortate.begin(), sortate.end(), [](Punct *a, Punct *b) { | |
| return a->getAbscisa() < b->getAbscisa(); | |
| }); | |
| fs<<"Traseu "<<t.numeTraseu<<"\n"; | |
| // | |
| fs<<"\t"<<t.puncte[0]<<"\n"; | |
| for(Punct* p: sortate) { | |
| fs<<"\t"<<*p<<"\n"; | |
| } | |
| //calculam lungimea pe ordinea sortata | |
| double lungime = 0.0; | |
| Punct *prev = t.puncte[0]; | |
| for(Punct*p: sortate) { | |
| lungime += (*prev)(*p); | |
| prev = p; | |
| } | |
| fs<<"Lungime traseu: "<<lungime<<"\n"; | |
| } | |
| }; | |
| int main(int argc, char const *argv[]) | |
| { | |
| //cream Punctele | |
| Punct p1("depozit_1",4, 7); | |
| Punct p2("depozit_2",20, 15); | |
| Punct p3("depozit_3",10, 11); | |
| Punct p4("depozit_4",22, 5); | |
| //cream traseu si adaugam punctele cu operatorul << | |
| Traseu t1("T1"); | |
| t1<<&p1<<&p2<<&p3<<&p4; | |
| //afisare consola | |
| cout<<t1; | |
| return 0; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment