Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ordenar cantidad de repeticion de caracteres

Estas en el tema de Ordenar cantidad de repeticion de caracteres en el foro de C/C++ en Foros del Web. Saludos. pues como veran, lo que estoy haciendo, estoy tratando de ordenar los caracteres, bueno mejor dicho ordenar la cantidad de veces que aparece un ...
  #1 (permalink)  
Antiguo 02/08/2015, 15:34
 
Fecha de Ingreso: julio-2015
Ubicación: San Juan
Mensajes: 7
Antigüedad: 8 años, 9 meses
Puntos: 0
Sonrisa Ordenar cantidad de repeticion de caracteres

Saludos.


pues como veran, lo que estoy haciendo, estoy tratando de ordenar los caracteres, bueno mejor dicho ordenar la cantidad de veces que aparece un caracter, siendo de mayor a menor. Estaba intentando mover la cantidad que yiene cada caracter y a la vez que eso se de, tambien hacer el mismo intercambio en la cadena, tal que a la hira de imprimir, no se imprima una loquera. Igual ni me sale:

Este es el codigo:
Código:
int main()
{
     char texto[128], caracteres[256] = {0};
     int i;

     printf("Ingrese una frase o texto: ");
     gets(texto);

     for(i = 0; texto[i] != '\0'; i++)
          caracteres[(int)texto[i]]++;

     for(i = 0; i < 256; i++)
          if(caracteres[i] > 0)
               printf("\n%c = %d", i, caracteres[i]);

     getchar();
     getchar();
     return 0;
}
  #2 (permalink)  
Antiguo 04/08/2015, 05:15
 
Fecha de Ingreso: julio-2015
Ubicación: San Juan
Mensajes: 7
Antigüedad: 8 años, 9 meses
Puntos: 0
Respuesta: Ordenar cantidad de repeticion de caracteres

Bueno logré ordenarlo, pero ahora no se porque diablos las letras aparecen en algunos simbolos, algo convertí mal, por favor si alguien puede ver que me pasó, miren:



este es el código:

[CODE] int main()
{
char texto[128], caracteres[256] = {0};
int i, h, mayor, elmayor;

printf("Ingrese una frase o texto: ");
gets(texto);

for(i = 0; texto[i] != '\0'; i++){
caracteres[(int)texto[i]]++;}

//Para letras
for(i = 0; i < 128; i++){
for(h=i+1; h < 128; h++){
if(texto[i]>= texto[h]){
elmayor= texto[i];
texto[i]=texto[h];
texto[h]=elmayor;}
}
}



//para numeros
for(i = 0; i<256; i++){
for(h =i+1; h <256; h++){
if(caracteres[i]>= caracteres[h]){
mayor= caracteres[i];
caracteres[i]=caracteres[h];
caracteres[h]=mayor;}
}
}






for(i = 0; i < 256; i++){
if(caracteres[i] > 0){

printf("\n%c = %d", i, caracteres[i]);}}

getchar();
getchar();
return 0;
}
[\CODE]
  #3 (permalink)  
Antiguo 24/08/2015, 04:29
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Ordenar cantidad de repeticion de caracteres

Si pretendes ordenar el resultado en función del número de apariciones... primero tienes que calcular el número de apariciones de cada caracter...

Para eso necesitas un array de tipo int de 256 posiciones... conveniente inicializado a 0. Entonces iteras sobre la cadena y, para cada caracter, incrementas el valor que le corresponda a cada caracter:

Código C:
Ver original
  1. int apariciones[256]; // hay que inicializarlo
  2. char* puntero;
  3. for( puntero = texto; *puntero; ++puntero )
  4.   apariciones[ *puntero ]++;

Si prefieres usar otro algoritmo para recorrer la cadena eres libre de modificar el código.

Bueno, al lío. Una vez tienes calculadas el total de apariciones tienes que presentar los resultados ordenados. Si intentas ordenar esos números tal cual tendrás un problema y es que una vez ordenados no tendrás forma de saber a qué caracter se corresponde cada resultado.

En este punto deberías plantearte guardar los datos de forma diferente... quizás en una estructura para poder mantener el par caracter-apariciones. Algo del estilo:

Código C:
Ver original
  1. struct pareja
  2. {
  3.   char caracter;
  4.   int apariciones;
  5. };

Entonces podrías crear un array estático y ordenarlo a conveniencia:

Código C:
Ver original
  1. struct pareja elementos[256];

Para ordenar los elementos no olvides usar una variable temporal:

Código C:
Ver original
  1. struct pareja temporal = elementos[3];
  2. elementos[3] = elementos[5];
  3. elementos[5] = temporal;

Otra opción es hacer uso de una lista enlazada. Para no modificar la estructura puedes anidarlas:

Código C:
Ver original
  1. struct Nodo
  2. {
  3.   struct Nodo* siguiente;
  4.   struct pareja datos;
  5. };

Entonces, haciendo uso de malloc (o calloc, como prefieras) para reservar memoria y de free para liberarla posteriormente puedes ir componiendo la lista de elementos.

Y poco más que contar, lo primero que tienes que hacer es decantarte por una forma en concreto, después pegarte con esa solución y luego pasarte por aquí si tienes nuevas dudas.

Ah si, por favor te lo pido... antes de enviar un mensaje al foro invierte un par de minutos en leerlo y corregir las faltas de ortografia y demás errores gramaticales. Además, si apañas el texto para que tenga sentido mejor que mejor.

Un saludo.

Etiquetas: algoritmos, arreglos, cadenas, logica, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:34.