# PBinfo #2736 – Baza De Date – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Cerința
Se citește numărul n și apoi n articole cu structura: prenume nume salariu vârstă funcție număr_de_telefon email. Fiecare articol este plasat pe câte o linie, câmpurile sale fiind separate prin câte un spațiu. Câmpurile salariu și vârstă conțin numere naturale, celelalte conțin șiruri de caractere.

Se citește apoi un număr natural p cuprins între 1 și 7  și un caracter c care poate fi + sau -.

Se cere ordonarea celor n articole în funcție de p și c, astfel:


dacă p=1, ordonarea se face după prenume; dacă p=2, ordonarea se face după nume; dacă p=3, ordonarea se face după salariu; dacă p=4, ordonarea se face după vârstă; dacă p=5, ordonarea se face după funcție; dacă p=6, ordonarea se face după număr_de_telefon; dacă p=7, ordonarea se face după email;
dacă c are valoarea +, ordonarea va fi crescătoare, iar dacă c are valoarea -, ordonarea va fi descrescătoare;
dacă două articole au aceeași valoare a câmpului în raport cu care se face sortarea, ordinea lor nu se va modifica.

Date de intrare
Programul citește de la tastatură numărul n, apoi cele n articole, fiecare pe câte o linie, câmpurile fiecărui articol fiind separate prin câte un spațiu, apoi p și c cu semnificația din enunț.

Date de ieșire
Programul va afișa pe ecran articolele sortate conform cerinței. Fiecare articol va fi afișat pe câte o linie, câmpurile fiind separate prin câte un spațiu.

Restricții și precizări

1 ≤ n ≤ 80
câmpurile numerice vor avea valori pe 64 de biți fără semn, iar celelalte vor avea maximum 255 de caractere.

Exemplu:
Intrare

3
Len Trexler 100000 55 Spymaster 5554440192 lt@sp.com
Oliver Regina 0 37 Vigilante 1234567890 or@vg.com
Sterling Archer 1000000 43 Agent 8423565491 sa@ag.com
2 +
Ieșire

Sterling Archer 1000000 43 Agent 8423565491 sa@ag.com
Oliver Regina 0 37 Vigilante 1234567890 or@vg.com
Len Trexler 100000 55 Spymaster 5554440192 lt@sp.com
Explicație
S-a sortat crescător după nume(2), și s-au afișat.

## Cod sursă C++

```cpp
#include<bits/stdc++.h>
using namespace std;
struct data
{
    string prenume,nume,functie,email,numar;
    unsigned long long salariu,varsta;
};
data d[1001];
int p;
char c;
bool comp(data i,data j)
{
    if(c=='-')
    {
            if(p==1)
                if(i.prenume>j.prenume)
                    return 1;
            if(p==2)
                if(i.nume>j.nume)
                    return 1;
            if(p==3)
                if(i.salariu>j.salariu)
                    return 1;
            if(p==4)
                if(i.varsta>j.varsta)
                    return 1;
            if(p==5)
                if(i.functie>j.functie)
                    return 1;
            if(p==6)
                if(i.numar>j.numar)
                    return 1;
            if(p==7)
                if(i.email>j.email)
                    return 1;
    }
    else
    {
            if(p==1)
                if(i.prenume<j.prenume)
                    return 1;
            if(p==2)
                if(i.nume<j.nume)
                    return 1;
            if(p==3)
                if(i.salariu<j.salariu)
                    return 1;
            if(p==4)
                if(i.varsta<j.varsta)
                    return 1;
            if(p==5)
                if(i.functie<j.functie)
                    return 1;
            if(p==6)
                if(i.numar<j.numar)
                    return 1;
            if(p==7)
                if(i.email<j.email)
                    return 1;
    }
    return 0;
}
int main()
{
    string s;
    int n,k=0;
    cin>>n;
    cin.get();
    for(int i=1;i<=n;i++)
    {
        getline(cin,s);
        vector<string> v;
        istringstream buffer(s);
        for(string w;buffer>>w;)
            v.push_back(w);
        for(int j=0;j<v.size();j++)
            switch(j)
            {
                case 0: d[k].prenume=v[j]; break;
                case 1: d[k].nume=v[j]; break;
                case 2: d[k].salariu=stoull(v[j]); break;
                case 3: d[k].varsta=stoull(v[j]); break;
                case 4: d[k].functie=v[j]; break;
                case 5: d[k].numar=v[j]; break;
                case 6: d[k].email=v[j]; break;
            }
        k++;
    }
    cin>>p>>c;
    stable_sort(d,d+k,comp);
    for(int i=0;i<k;i++)
        cout<<d[i].prenume<<" "<<d[i].nume<<" "<<d[i].salariu<<" "<<d[i].varsta<<" "<<d[i].functie<<" "<<d[i].numar<<" "<<d[i].email<<'\n';
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/2736)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/2736/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-2736/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
