Skip to content

Instantly share code, notes, and snippets.

@boldijar
Created February 8, 2016 18:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save boldijar/6e499997c97a82ea0be2 to your computer and use it in GitHub Desktop.
Save boldijar/6e499997c97a82ea0be2 to your computer and use it in GitHub Desktop.
// Example program
#include <iostream>
using namespace std;
struct Interval{
double stanga, dreapta; //extremele intervalului
};
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
int min(int a,int b)
{
if(a<b)
return a;
else return b;
}
Interval citesteInterval()
{
// declaram un interval, si ii citim valorile
Interval interval;
cout<<"Stanga: ";
cin>>interval.stanga;
cout<<"Dreapta: ";
cin>>interval.dreapta;
return interval;
}
Interval reuniuneIntervale(Interval interval1,Interval interval2)
{
// calculam reuniunea intervalelor din parametrii
// mai intai sortam intervalele corect, sa fie primul ala mai din stanga
if(interval1.stanga>interval2.stanga)
{
// hopa, intervalul1 incepe dupa intervalul2, sa le interschimbam
Interval aux=interval1;
interval1=interval2;
interval2=aux;
}
// mai intai initializam un interval cu 0 si 0
Interval interval;
interval.stanga=0;
interval.dreapta=0;
// verificam daca nu cumva inceputul intervalului 2, e mai mare decat sfarsitul primului interval (intervalele nu se intalnesc)
if(interval2.stanga>interval1.dreapta)
{
// returnam intervalul cu 0 0
return interval;
}
// daca am ajuns aici inseamna ca intervalele se intersecteaza, returnam reuniunea, adica stanga primului si dreapta intervalului 2
interval.stanga=interval1.stanga;
interval.dreapta=interval2.dreapta;
return interval;
}
Interval intersectieIntervale(Interval interval1,Interval interval2)
{
// calculam intersectia intervalelor din parametrii
// mai intai sortam intervalele corect, sa fie primul ala mai din stanga
if(interval1.stanga>interval2.stanga)
{
// hopa, intervalul1 incepe dupa intervalul2, sa le interschimbam
Interval aux=interval1;
interval1=interval2;
interval2=aux;
}
// mai intai initializam un interval cu 0 si 0
Interval interval;
interval.stanga=0;
interval.dreapta=0;
// verificam daca nu cumva inceputul intervalului 2, e mai mare decat sfarsitul primului interval (intervalele nu se intalnesc)
if(interval2.stanga>interval1.dreapta)
{
// returnam intervalul cu 0 0
return interval;
}
// daca am ajuns aici inseamna ca intervalele se intersecteaza, returnam intersectia, adica [max(interval1.stanga,interval2.dreapta),min(interval1.dreapta,interval2.dreapta)]
interval.stanga=max(interval1.stanga,interval2.stanga);
interval.dreapta=min(interval1.dreapta,interval2.dreapta);
return interval;
}
bool valoareInInterval(int valoare,Interval interval)
{
// aceasta metoda verifica daca in intervalul din parametru se afla valoarea din parametru, si returneaza adevarat sau fals
return valoare>=interval.stanga && valoare<=interval.dreapta; // daca valoarea e mai mare ca partea din stanga, si mai mica ca cea din dreapta, e in interval
}
int lungimeInterval(Interval interval)
{
// lungimea unui interval e de fapt dreapta - stanga
return interval.dreapta-interval.stanga;
}
void afisareInterval(Interval interval)
{
// afiseaza intervalul din parametru
cout<<"["<<interval.stanga<<","<<interval.dreapta<<"]";
}
int main()
{
int nrIntervale;
cout<<"Numar de intervale: ";
cin>>nrIntervale;
Interval intervale[nrIntervale];
for(int i=0;i<nrIntervale;i++)
{
// citim cele <nrIntervale> intervale
intervale[i]=citesteInterval();
}
// afisam intervalele
for(int i=0;i<nrIntervale;i++)
{
afisareInterval(intervale[i]);
cout<<endl;
}
Interval I,R;
// intervalul I e intersectia intervalelor, R e reuniunea
I=intervale[0];
R=intervale[0];
// punem primul interval ca raspuns temporar a solutiei, si vom calcula cu restul elementelor intervalele cerute
for(int i=1; i<nrIntervale;i++)
{
// dupa cum vezi, incep de la 1, nu de la 0
I=intersectieIntervale(I,intervale[i]);
R=reuniuneIntervale(R,intervale[i]);
}
cout<<endl<<"Intersectia intervalelor: ";
afisareInterval(I);
cout<<endl<<"Reuniunea intervalelor: ";
afisareInterval(R);
int numar;
cout<<"Numar (verificam daca nr asta e in intervale) ";
cin>>numar;
// acum vom vedea in care interval apare, din cele citite acest numar
for(int i=0; i<nrIntervale; i++)
{
if(valoareInInterval(numar,intervale[i]))
{
cout<<endl<<"Apare in intervalul: ";
afisareInterval(intervale[i]);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment