Está en la página 1de 3

Solución.

#include <iostream>
#include <array>
using namespace std;

const int MAX_MONTONES = 15;


typedef array<int, MAX_MONTONES> Tarray;

const int MAX_FRECUENCIAS = 10; // PARA 10 VALORES: DEL 0 AL 9


typedef array<int, MAX_FRECUENCIAS> Tfrecuencias;

//----------------------
void leer_montones(Tarray & a, int & t)
{
cout << "Indique cuántos montones desea crear: ";
cin >> t;
cout << "Introduzca el número de cartas de cada uno de esos " << t
<< " montones: ";
for(int i=0; i<t; i++){
cin >> a[i];
}
}

//----------------------
void mostrar(const Tarray & a, int tam)
{ cout << " [ ";
for(int i=0; i<tam; i++){
cout << a[i] << " ";
} cout << "]" << endl;
}

//----------------------
void quitar_carta(Tarray & a, int tam)
{
for(int i=0; i<tam; i++){
if (a[i] > 0){
a[i]--;
}
}
}

//----------------------
bool hay_vacios(const Tarray & a, int tam)
{
int i=0;
while(i<tam and a[i]!=0){
i++;
}
return (i<tam); // SI i<tam -> encontrado uno vacio (con un 0)
}

//----------------------
void eliminar_vacios(Tarray & a, int & tam)
{
int j = 0; // j apuntará a la casilla donde tocaría escribir (y
siempre será igual o menor a la posición por donde se vaya leyendo)
for(int i=0; i<tam; i++){ // i apuntará a la casilla donde toca
leer
if(a[i] > 0){
a[j] = a[i];
j++;
}
}
tam = j;
}

//----------------------
void calcular_frecuencias(const Tarray & a, int tam, Tfrecuencias &
f)
{
for(int i=0; i<MAX_FRECUENCIAS; i++){
f[i] = 0;
}
for(int i=0; i<tam; i++){
f[ a[i] ]++;
}
}

//----------------------
void mostrar_frecuencias(const Tfrecuencias & f)
{
for(int i=0; i<MAX_FRECUENCIAS; i++){
if (f[i] > 0){
cout << "De tamaño " << i << " hay " << f[i] << endl;
}
}
}

//----------------------
int main()
{
Tarray m = {9, 3, 3, 6, 3, 5, 7, 6, 8, 3} ;
int tam_m;

leer_montones(m, tam_m);
mostrar(m, tam_m);
// cout << "Inicialmente hay " << tam_m << " montones, cada uno
con las cartas siguientes: " << endl;
// mostrar(m, tam_m);

cout << "A continuación se va a quitar una carta de cada montón,


hasta que (al menos) uno se quede sin cartas: " << endl;
do{
quitar_carta(m, tam_m);
mostrar(m,tam_m);
}while( not hay_vacios(m,tam_m) ); // O BIEN: while(
hay_vacios(m,tam_m) == false );

eliminar_vacios(m,tam_m);
cout << "Quedan " << tam_m << " montones no vacios, con las cartas
siguientes: " << endl;
mostrar(m,tam_m);

Tfrecuencias f;
cout << "Montones de cada tamaño: " << endl;
calcular_frecuencias(m, tam_m, f );
mostrar_frecuencias(f);

return 0;
}

También podría gustarte