Ver Mensaje Individual
  #25 (permalink)  
Antiguo 07/06/2014, 13:22
Avatar de leosansan
leosansan
 
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años, 6 meses
Puntos: 49
Respuesta: Contar repeticiones de letra?

Antes que nada una corrección a mi anterior código:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. int main (){
  7.   string diccionario[]={"casas","perros","computadoras","arroz","wwomam"};
  8.   int acum, acum_mayor=0, i, j, mayor, letra, tam = sizeof diccionario / sizeof diccionario[0];
  9.   char letras[] = "abcdefghijklmnopqrstuvwxyz";
  10.   for( letra = 0 ; letras[letra] ; letra++){
  11.     for( i = 0 , acum = 0 ; i < tam ; i++)
  12.         for( j =0 ; diccionario[i][j] ; j++) /** Ó: for(j =0;j<diccionario[i].size();j++) **/
  13.             if( diccionario[i][j] == letras[letra] )
  14.               acum++;
  15.     if( acum != 0 ){
  16.       cout << letras[letra] << " se repite " << acum << endl;
  17.       if ( acum > acum_mayor ){
  18.         mayor = letra;
  19.         acum_mayor = acum ;
  20.       }
  21.     }
  22.   }
  23.   cout << endl<< letras[mayor] << " da el mayor valor de ( n = "  << acum_mayor << " ) / (  N = " << tam << " ) = "<< (float) acum_mayor/tam << endl;
  24.   return 0;
  25. }

Pero en dicho código tuve en cuenta las apariciones totales de cada letra, no en cuántas palabras aparecía dicha letra que es lo que he visto que querías.

En el siguiente código ya tengo en cuenta ese detalle y, como te comenté antes, no veo necesario el usar un array, basta ir guardando el valor mayor de la "chorizada": -n/N*(log(n/N)/log2).

Te dejo desactivado un cout, actívalo si quieres ver los otros valores:

Cita:

a aparece en 4 palabras.
c aparece en 1 palabras.
d aparece en 1 palabras.
e aparece en 1 palabras.
k aparece en 1 palabras.
m aparece en 2 palabras.
n aparece en 1 palabras.
o aparece en 4 palabras.
p aparece en 3 palabras.
r aparece en 3 palabras.
s aparece en 3 palabras.
t aparece en 1 palabras.
u aparece en 1 palabras.
w aparece en 1 palabras.
z aparece en 1 palabras.

m da el mayor valor de -n / N*( log( n / N )/ log2 = 0.528771
Y efectivamente, tal como comentastes, no el que más apariciones tiene es el valor que produce el mayor valor de
-n/N*(log(n/ N)/log2):

Código C++:
Ver original
  1. #include <iostream>
  2. #include <string>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. int main (){
  8.   string diccionario[]={"kansas","perros","computadoras","arroz","pwwomam"};
  9.   int i, j, mayor, letra ;
  10.   float acum, acum_mayor=0,tam = sizeof diccionario / sizeof diccionario[0] ;
  11.   char letras[] = "abcdefghijklmnopqrstuvwxyz";
  12.   for( letra = 0 ; letras[letra] ; letra++){
  13.     for( i = 0 , acum = 0 ; i < tam ; i++){
  14.       for( j =0 ; diccionario[i][j] ; j++) /** Ó: for(j =0;j<diccionario[i].size();j++) **/
  15.         if( diccionario[i][j] == letras[letra] ){
  16.           acum++;
  17.           break;
  18.         }
  19.     }
  20.     if( acum != 0 ){
  21.       cout << letras[letra] << " aparece en " << acum << " palabras." << endl;
  22.       if ( -(acum/tam)*(log10(acum/tam)/log10(2)) > acum_mayor ){
  23.         mayor = letra;
  24.         acum_mayor = -(acum/tam)*(log10(acum/tam)/log10(2)) ;
  25.         ///cout << acum_mayor <<endl; /** por si quieres ver los otros valores **/
  26.       }
  27.     }
  28.   }
  29.   cout << endl<< letras[mayor] << " da el mayor valor de -n / N*( log( n / N )/ log2 = "  << acum_mayor << endl;
  30.   return 0;
  31. }

O a lo breve:

Cita:

m da el mayor valor de -n / N*( log( n / N ) / log2 = 0.528771

Código C++:
Ver original
  1. #include <iostream>
  2. #include <string>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. int main (){
  8.   string diccionario[]={"kansas","perros","computadoras","arroz","pwwomam"};
  9.   int i, j, mayor, letra ;
  10.   float acum, acum_mayor=0,tam = sizeof diccionario / sizeof diccionario[0] ;
  11.   char letras[] = "abcdefghijklmnopqrstuvwxyz";
  12.   for( letra = 0 ; letras[letra] ; letra++){
  13.     for( i = 0 , acum = 0 ; i < tam ; i++){
  14.       for( j =0 ; diccionario[i][j] ; j++)
  15.         if( diccionario[i][j] == letras[letra] ){
  16.           acum++;
  17.           break;
  18.         }
  19.     }
  20.     if ( -(acum/tam)*(log10(acum/tam)/log10(2)) > acum_mayor ){
  21.       mayor = letra;
  22.       acum_mayor = -(acum/tam)*(log10(acum/tam)/log10(2)) ;
  23.     }
  24.   }
  25.   cout << endl<< letras[mayor] << " da el mayor valor de -n / N*( log( n / N ) / log2 = "  << acum_mayor << endl;
  26.   return 0;
  27. }

¡¡¡Saluditos!!!


Última edición por leosansan; 07/06/2014 a las 13:42