fbpx

Problema #2736 – Baza – Rezolvari PBInfo

de Mihai-Alexandru

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 [email protected]
Oliver Regina 0 37 Vigilante 1234567890 [email protected]
Sterling Archer 1000000 43 Agent 8423565491 [email protected]
2 +

Ieșire

Sterling Archer 1000000 43 Agent 8423565491 [email protected]
Oliver Regina 0 37 Vigilante 1234567890 [email protected]
Len Trexler 100000 55 Spymaster 5554440192 [email protected]

Explicație

S-a sortat crescător după nume(2), și s-au afișat.

#include <bits/stdc++.h>


using namespace std;

int n , p;
char c;
struct poz
{
    char prenume[80] , nume[80] , tel[80] , email[80] , fct[80];
    unsigned long long salariu , varsta , pozz;
}a[256];

int comp_prenume(poz a , poz b){return strcmp(a.prenume , b.prenume) < 0 || strcmp(a.prenume , b.prenume) == 0 && a.pozz < b.pozz;}
int comp_nume(poz a , poz b){return strcmp(a.nume , b.nume) < 0 || strcmp(a.nume , b.nume) == 0 && a.pozz < b.pozz;}
int comp_tel(poz a , poz b){return strcmp(a.tel , b.tel) < 0 || strcmp(a.tel , b.tel) == 0 && a.pozz < b.pozz;}
int comp_email(poz a , poz b){return strcmp(a.email , b.email) < 0 || strcmp(a.email , b.email) == 0 && a.pozz < b.pozz;}
int comp_fct(poz a , poz b){return strcmp(a.fct , b.fct) < 0 || strcmp(a.fct , b.fct) == 0 && a.pozz < b.pozz;}
int comp_salariu(poz a , poz b){return a.salariu < b.salariu || a.salariu == b.salariu && a.pozz < b.pozz;}
int comp_varsta(poz a , poz b){return a.varsta < b.varsta || a.varsta == b.varsta && a.pozz < b.pozz;}

int comp_prenume1(poz a , poz b){return strcmp(a.prenume , b.prenume) > 0 || strcmp(a.prenume , b.prenume) == 0 && a.pozz > b.pozz;}
int comp_nume1(poz a , poz b){return strcmp(a.nume , b.nume) > 0 || strcmp(a.nume , b.nume) == 0 && a.pozz > b.pozz;}
int comp_tel1(poz a , poz b){return strcmp(a.tel , b.tel) > 0 || strcmp(a.tel , b.tel) == 0 && a.pozz > b.pozz;}
int comp_email1(poz a , poz b){return strcmp(a.email , b.email) > 0 || strcmp(a.email , b.email) == 0 && a.pozz > b.pozz;}
int comp_fct1(poz a , poz b){return strcmp(a.fct , b.fct) > 0 || strcmp(a.fct , b.fct) == 0 && a.pozz > b.pozz;}
int comp_salariu1(poz a , poz b){return a.salariu > b.salariu || a.salariu == b.salariu && a.pozz > b.pozz;}
int comp_varsta1(poz a , poz b){return a.varsta > b.varsta || a.varsta == b.varsta && a.pozz > b.pozz;}
int main()
{
    cin >> n;
    for(int i = 1 ; i <= n ; i++)
    {
        cin >> a[i].prenume >> a[i].nume >> a[i].salariu >> a[i].varsta >> a[i].fct >> a[i].tel >> a[i].email;
        a[i].pozz = i;
    }

    cin >> p >> c;
    if(c == '+')
    {
        if(p == 1) sort(a + 1 , a + n + 1 , comp_prenume);
        else if(p == 2) sort(a + 1 , a + n + 1 , comp_nume);
        else if(p == 3) sort(a + 1 , a + n + 1 , comp_salariu);
        else if(p == 4) sort(a + 1 , a + n + 1 , comp_varsta);
        else if(p == 5) sort(a + 1 , a + n + 1 , comp_fct);
        else if(p == 6) sort(a + 1 , a + n + 1 , comp_tel);
        else if(p == 7) sort(a + 1 , a + n + 1 , comp_email);
        for(int i = 1 ; i <= n ; i++)
            cout << a[i].prenume << " " << a[i].nume << " " << a[i].salariu << " " << a[i].varsta<< " " << a[i].fct << " " << a[i].tel << " " << a[i].email << '\n';
    }
    else if(c == '-')
    {
        if(p == 1) sort(a + 1 , a + n + 1 , comp_prenume1);
        else if(p == 2) sort(a + 1 , a + n + 1 , comp_nume1);
        else if(p == 3) sort(a + 1 , a + n + 1 , comp_salariu1);
        else if(p == 4) sort(a + 1 , a + n + 1 , comp_varsta1);
        else if(p == 5) sort(a + 1 , a + n + 1 , comp_fct1);
        else if(p == 6) sort(a + 1 , a + n + 1 , comp_tel1);
        else if(p == 7) sort(a + 1 , a + n + 1 , comp_email1);
        for(int i = 1 ; i <= n ; i++)
            cout << a[i].prenume << " " << a[i].nume << " " << a[i].salariu << " " << a[i].varsta<< " " << a[i].fct << " " << a[i].tel << " " << a[i].email << '\n';
    }

}
Comentarii

S-ar putea sa iti placa