Ver Mensaje Individual
  #7 (permalink)  
Antiguo 17/10/2014, 13:50
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Error al comparar dos char en un If

Hola, y no es molestia, claro.

Te muestro una posible solución, relativamente común, aunque quizá no demasiada apta para principiantes, pero hagamos un esfuerzo:

Va el código y después trato de explicarlo
Código C++:
Ver original
  1. #include <string>
  2. #include <map>
  3. #include <set>
  4. #include <functional>  // para std::greater
  5. #include <iostream>
  6.  
  7. // muestra el contenido del alfabeto ordenado por frecuencias, de mayor a menor
  8. void muestra_alfabeto(const std::map<char, int>& alfabeto)
  9. {
  10.     std::set<std::pair<int, char>, std::greater<std::pair<int, char> > > frecuencias;
  11.  
  12.     typedef std::map<char, int>::const_iterator it;
  13.     for(it i=alfabeto.begin(); i!=alfabeto.end(); ++i)
  14.     {
  15.         frecuencias.insert(std::make_pair(i->second, i->first) );
  16.     }
  17.  
  18.  
  19.     typedef std::set<std::pair<int, char>, std::greater<std::pair<int, char> > >::iterator sit;
  20.     for(sit i=frecuencias.begin(); i!=frecuencias.end(); ++i)
  21.         std::cout << i->first << " --> " << i->second << '\n';
  22.  
  23. }
  24.  
  25. int main()
  26. {
  27.     std::string texto1;
  28.     texto1 = "some text asd 123456";
  29.  
  30.     std::map<char, int> alfabeto;
  31.  
  32.     for(std::size_t i = 0; i<texto1.length(); ++i)
  33.         alfabeto[texto1[i]]++;
  34.  
  35.     muestra_alfabeto(alfabeto);
  36.     return 0;
  37. }

La idea acá es armar un contenedor nuevo con el contenido del std::map; se necesita porque un map es un array asociativo organizado en pares (key, value) por definición, y ordenado de acuerdo a la "key" (aunque por defecto esas keys se ordenan de menor a mayor, puede indicarse que se ordenen con cualquier otro criterio que se defina, normalmente, en una función objeto -- ¿Qué qué es una función objeto? Bueno, no queda más remedio que estudiar)

Elegí para el ejemplo un std::set que es otro std::map, sólo que con la particularidad de que en él "key" y "value" son la misma cosa.

Invertí el contenido de los pares que se van insertando, ahora no es más <char, int> como en alfabeto, sino <int, char>, para que el primer criterio de ordenación sea la frecuencia y no el carácter. Y acá sí el orden lo establece la función objeto std::greater, para que los pares en el set se mantengan ordenados de mayor a menor.

Otra forma también podría ser ir agregando los apares a un std::vector, y después ordenar el vector con el mismo criterio.

Quizá quedaría mejor si además de mostrar el alfabeto ordenado por frecuencias, se mostraran también ordenado alfabéticamente; para eso, en lugar de usar el objeto greater, habría que escribir una función objeto propia (que te queda como ejercicio).

Lareto :)