# PBinfo #2802 – Clasa – Rezolvare C++

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

## Enunț

Cerința
Se citește de la tastatură numărul n și un număr p cu valoarea 1 sau 2 și apoi n șiruri de tip nume prenume media1 media2 media3 separate prin spații.

Pentru p=1, se va afișa numărul elevilor care au media generală mai mare sau egală decât media clasei.

Pentru p=2, se va afișa pe primul rând media clasei și pe următoarele n rânduri, numele, prenumele și media generală a fiecărui elev, separate printr-un singur spațiu, sortat descrescător după medie; la medii egale se sortează crescător după nume, iar la nume egale crescător după prenume.

Date de intrare
Programul citește de la tastatură numerele n p, iar apoi de pe câte o linie cele n structuri de forma specificată în enunț.

Date de ieșire
Dacă p=1 programul va afișa pe ecran numărul elevilor care au media generală mai mare au egală decât media clasei.

Dacă p=2 programul va afișa pe primul rând media clasei și pe următoarele n rânduri, numele, prenumele și media generală ale elevilor, separate printr-un singur spațiu, sortate conform cerinței.

Restricții și precizări

1 ≤ n ≤ 100
numele și prenumele au cel mult 100 de caractere
toate mediile clasei se vor afișa cu două zecimale, rezultatul afișat este considerat valid dacă diferența în valoare absolută dintre acesta și cel corect este cel mult 0.01.
media generală a unui elev este media aritmetică celor trei medii date.
media clasei este media aritmetică a mediilor generale ale elevilor.
pentru datele reale se recomandă folosirea tipurilor de date în dublă precizie (tipul C/C++ double)

Exemplul 1:
Intrare

5 1
Juro Muro 2 3 5
San Hill 7 5 9
Barbarigo San 9 2 4
Ezio Marbo 2 6 3
Gorbo Borbo 2 4 6
Ieșire

2
Exemplul 2:
Intrare

5 2
Juro Muro 2 3 5
San Hill 7 5 9
Barbarigo San 9 2 4
Ezio Marbo 2 6 3
Gorbo Borbo 2 4 6
Ieșire

4.60
San Hill 7.00
Barbarigo San 5.00
Gorbo Borbo 4.00
Ezio Marbo 3.67
Juro Muro 3.33

## Cod sursă C++

```cpp
#include<bits/stdc++.h>
using namespace std;
struct order
{
    string nume,prenume;
    double medie1,medie2,medie3,medieg;
};
int comp(order i,order j)
{
    if(i.medieg>j.medieg)
        return 1;
    if(i.medieg==j.medieg && i.nume<j.nume)
        return 1;
    if(i.medieg==j.medieg && i.nume==j.nume && i.prenume<j.prenume)
        return 1;
    return 0;
}
int main()
{
    order w[101];
    string s;
    int n,p;
    double g=0;
    cin>>n>>p;
    cin.get();
    for(int i=0;i<n;i++)
    {
        vector<string> v;
        getline(cin,s);
        istringstream buffer(s);
        for(string word;buffer>>word;)
            v.push_back(word);
        for(int j=0;j<v.size();j++)
            switch(j)
            {
                case 0: w[i].nume=v[j]; break;
                case 1: w[i].prenume=v[j]; break;
                case 2: w[i].medie1=stoi(v[j]); break;
                case 3: w[i].medie2=stoi(v[j]); break;
                case 4: w[i].medie3=stoi(v[j]); break;
            }
        w[i].medieg=(w[i].medie1+w[i].medie2+w[i].medie3)/3;
        g+=w[i].medieg;
    }
    g/=n;
    if(p==1)
    {
        int ap=0;
        for(int i=0;i<n;i++)
            if(w[i].medieg>=g)
                ap++;
        cout<<ap;
    }
    else
    if(p==2)
    {
        cout<<fixed<<setprecision(2)<<g<<'\n';
        sort(w,w+n,comp);
        for(int i=0;i<n;i++)
            cout<<w[i].nume<<" "<<w[i].prenume<<" "<<fixed<<setprecision(2)<<w[i].medieg<<'\n';
    }
}
```

## Resurse

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