Skip to content

Instantly share code, notes, and snippets.

@thinkphp
Created May 3, 2026 08:43
Show Gist options
  • Select an option

  • Save thinkphp/b01d64aff54b87c71d3ad13bf82a609b to your computer and use it in GitHub Desktop.

Select an option

Save thinkphp/b01d64aff54b87c71d3ad13bf82a609b to your computer and use it in GitHub Desktop.
Proiect Traseu
#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