# PBinfo #853 – Cadouri – Rezolvare C++

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

## Enunț

Cerința
Elevii clasei a X-a s-au implicat în strângerea de cadouri pentru Crăciun. Fiecare elev a adus mai multe cadouri, și a trimis prin email șefului clasei o urare, însoțită de lista cadourilor. Fiecare email are forma: 
urare lista_cadouri
urare este un text care nu conţine cifre. Lista cadourilor constă într-o enumerare a cadourilor: 
numar_cadouri denumire_cadou
(numar_cadouri este un număr natural, iar denumire_cadou este un cuvânt scris cu litere mici ale alfabetului englez; numar_cadouri şi denumire_cadou sunt separate prin cel puţin un spaţiu), cadourile din listă fiind separate prin spaţii şi/sau  diverse semne de punctuaţie

Şeful clasei trebuie să centralizeze listele primite. Ajutaţi-l să construiască o listă a care să conţină denumirea fiecărui cadou şi numărul total de cadouri de acel tip (cantitatea). Lista va fi ordonată descrescător după cantitate.

Date de intrare
Fișierul de intrare cadouri.in conține pe prima linie numărul n de elevi din clasa a X-a; fiecare dintre următoarele n linii, conţine câte un email.

Date de ieșire
Fișierul de ieșire cadouri.out va conține pe prima linie numărul de cadouri diferite C; următoarele C linii vor conţine câte un cadou şi cantitatea totală, separate prin exact un spaţiu. Lista cadouri va fi ordonată descrescător după cantitate. Dacă există mai multe cadouri cu aceeaşi cantitate, se va afişa mai întâi cadoul cu denumirea mai mică din punct de vedere lexicografic.

Restricții și precizări

1 ≤ n ≤ 100
fiecare linie a fişierului de intrare conţine cel mult 255 caractere
sunt cel mult 500 de cadouri diferite cu denumirea de cel mult 20 de litere ale afabetului englez
cantitatea din fiecare cadou este cel mult 100.000

Exemplu:
cadouri.in

3
La multi ani! 4 papusi, 15 ciocolate , 20 sosete.
Sarbatori fericite :) ! 3 ciocolate , 10 biscuiti, 5 papusi
Salut. 2 ciocolate , 1 papusi. 1 ciocolate!
cadouri.out

4
ciocolate 21
sosete 20
biscuiti 10
papusi 10

## Cod sursă C++

```cpp
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
ifstream fin("cadouri.in");
ofstream fout("cadouri.out");
int n, cantitate[505];
char denumire[505][21];
bool cifra(char X)
{
	return X >= '0' && X <= '9';
}
bool litera_mica(char X)
{
	return X >= 'a' && X <= 'z';
}
int main()
{
	int m;
	char email[256];
	char p[21];
	fin >> m;
	fin.getline(email , 256);
	for( ; m ; m --)
	{
		fin.getline(email , 256);
		int lg = strlen(email); //vom distruge sirul
		for(int i = 0 ; i < lg ; i ++)
			if( cifra( email[i]) )
			{
				int cnt = 0;
				while(cifra(email[i]))
				{
					cnt = 10 * cnt + email[i] - '0';
					i ++;
				}
				while(email[i] == ' ')
					i ++;
				int j = i;
				while(litera_mica(email[i]))
					i ++;
				email[i] = 0;
				strcpy(p , email + j);
				int poz = -1;
				for(int i = 0 ; i < n && poz == -1 ; i ++)
					if(strcmp(denumire[i] , p) == 0)
						poz = i;
				if(poz != -1)
					cantitate[poz] += cnt;
				else
				{
					strcpy(denumire[n] , p);
					cantitate[n] = cnt;
					n ++;
				}
			}
	}
	for (int i = 0 ; i < n - 1 ; i ++)
		for(int j = i + 1 ; j < n ; j ++)
			if(cantitate[i] < cantitate[j])
			{
				int aux = cantitate[i]; cantitate[i] = cantitate[j] ; cantitate[j] = aux;
				strcpy(p , denumire[i]); strcpy(denumire[i], denumire[j]); strcpy(denumire[j] , p);
			}
			else
				if(cantitate[i] == cantitate[j])
					if(strcmp(denumire[i] , denumire[j]) > 0)
					{
						strcpy(p , denumire[i]); strcpy(denumire[i], denumire[j]); strcpy(denumire[j] , p);
					}
	fout << n << "\n";
	for(int i = 0 ; i < n ; i ++)
		fout << denumire[i] << " " << cantitate[i] << "\n";
	return 0;
}
```

## Resurse

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