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

[SOLUCIONADO] Contar repeticiones de letra?

Estas en el tema de Contar repeticiones de letra? en el foro de C/C++ en Foros del Web. Hola, El problema es este: -Tengo un vector de strings con "x" cantidad de palabras dentro -Debo contar las veces que aparece cada letra en ...

  #1 (permalink)  
Antiguo 30/05/2014, 22:00
 
Fecha de Ingreso: marzo-2014
Mensajes: 41
Antigüedad: 10 años, 8 meses
Puntos: 0
Contar repeticiones de letra?

Hola,
El problema es este:
-Tengo un vector de strings con "x" cantidad de palabras dentro
-Debo contar las veces que aparece cada letra en todas las palabras dentro de ese vector.
-Si por ejemplo la "a" es la que se repite mas usar el numero de palabras en las que aparece para dividirlo entre el numero total de palabras...

Ejemplo:
Vector con casa, carro, mango.
El programa ve que la "a" esta presente en 3 palabras por encima de las demas, entonces toma ese 3 y lo divide por 3 (este 3 seria la cantidad de palabras, 3 en este caso)

Alguien tiene idea de que deberia hacer?

Última edición por newb; 30/05/2014 a las 22:31
  #2 (permalink)  
Antiguo 30/05/2014, 22:36
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Contar repeticiones de letra?

pues que pongas el abecedario dentro de una cadena y las palabras dentro de otra cadena
char abc[tamañoAbecedario];
luego pon las letras en sus posiciones.
abc[0] = 'a';
abc[1] = 'b';
abc[2] = 'c';
...

luego digamos que tienes otra cadena "hola"

char palabra[5];
palabra[0] ='h';
palabra[1] ='o';
palabra[2] ='l';
palabra[3] ='a';

es solo comparar todas las posiciones de la cadena palabra con con la primera posicion de la cadena abc[] que es la letra a

si abc[0]==palabra[0] contadorA++
si abc[0]==palabra[1] contadorA++
si abc[0]==palabra[2] contadorA++
si abc[0]==palabra[3] contadorA++
cada vez que encuentre una letra a que incremente un contador de letras 'a'

claro que eso no lo vas hacer así sino con bucles for doble que es la mejor solución.

Empieza a hacerlo y a la que te vaya apareciendo dudas vas preguntando. ;)
Busca en google ejemplos de como comparar cadenas que ya hay muchos echos y le puedes sacar ideas.
  #3 (permalink)  
Antiguo 30/05/2014, 22:52
 
Fecha de Ingreso: marzo-2014
Mensajes: 41
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Contar repeticiones de letra?

Código:
string diccionario[100];
.
.
.

void calculo(){
        int acum=0;
        for(int i=0; i<diccionario.lenght; i++){
             for(char j='a'; j<='z'; j++)
                  if(diccionario[i]==j)
                      acum++
}
}
Algo asi estuve pensando, pero como hago para sacar el que de mas y que el acumulador no se use para todas las letras sino para la que va dando mas?
Por cierto me parece que en eso que puse acumularia cada vez que "x" letra esta en "x" palabra, entonces no me serviria el metodo, ocupo que cuente la letra solo 1 vez por palabra

Ahora que lo veo no funcionaria porque diccionario[i] lo que tiene es un string, y lo estaria comparando con chars O.o
  #4 (permalink)  
Antiguo 31/05/2014, 04:34
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Contar repeticiones de letra?

pues tendras que usar tantos acumuladores como letras haya ya que las quieres contar por separado.
int contador[tamañoAbecedario];
si abc[0]==palabra[0] contador[0]A++
si abc[0]==palabra[1] contador[0]A++
si abc[0]==palabra[2] contador[0]A++
si abc[0]==palabra[3] contador[0]A++

El mismo indice de abc[i] es el de tu contador[i] en el bucle for ;)

pero la cosa es que si tienes varias palabras vas a tener que que apañar algún sistema como una estructura que creo que seria mejor.
En cada estructura tendrias a una palabra si las quieres mostrar las letras por separado son contadores por separado.
En fin sera un un pedazo de curro. XD Muy bueno para practicar vamos.
yo haría así:
pediría una frase
Luego intentaría dividir la frase en palabras y meterlas cada una en su estructura.
Después es cuando pasaría cada palabra/estructura por los bucles para contar
y al final mostraría una lista con cada palabra y la cantidades de cada letra que contiene
Pero es un curro como dije jeje
Es que son varias palabras y cada una vas a tratar por separado asi que... -_-'

"sopa caliente"
la estructura seria algo asi:
struct Palabra{
string suPalabra;
int contador[];
} estructura 1, estructura 2;

sopa a estructura 1
caliente a estructura 2

todo eso de estoy enseñando de forma manual pero en realidad tendras que hacer de forma automatica ya que ni sabes la cantidad de palabras que vas a tener.

Es todo un proyectillo -_-'
Pero perfecto para practicar c++

Por cierto... un string es una cadena de caracteres.
es solo crear un puntero a la primera letra y tendras una cadena de chars no se si me explico...

string palabra = "Hola";
char *pPalabra = &palabra[0];
o
const char * pPalabra = palabra.c_str();

Luego usas pPalabra como si de un char pPalabra se tratara.

Un array no es mas que un puntero a la primera posición a una cadena de caracteres y justo eso es lo que es un string.
si ya tienes un string solo te falta apuntar al primer carácter como te dije ;) en la misma estructura puedes hacer dicho puntero si lo necesitas.

Última edición por vangodp; 31/05/2014 a las 04:47
  #5 (permalink)  
Antiguo 31/05/2014, 22:23
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 9 meses
Puntos: 5
Respuesta: Contar repeticiones de letra?

hola amigo.
buenola opcion de vangodp si se me hizo un poco larga y en vez de usar estructuras se me ocurrio usar un funcion y se me ocurrio de esta forma no se que les parece.
aqui les dejo el codigo.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3. void contar(char frase[], char diccionario[],int i);
  4. int main ()
  5. {
  6.     char diccionario[26] = "abcdefghijklmnopqrstuvwxyz", frase[30];
  7.     int i, caracteres;
  8.     printf("introduce frase\n");
  9.     fgets(frase, 30, stdin);
  10.    
  11.     caracteres = strlen(frase);
  12.    
  13.     for  (i = 0; i < 25; i++)
  14.         contar(frase, diccionario, i);
  15.     return 0;
  16. }
  17.  
  18. void contar(char frase[], char diccionario[], int i)
  19. {
  20.     int j, num,contador;
  21.     char letra;
  22.     contador = 0;
  23.     num = strlen(frase);
  24.    
  25.     for (j = 0; j < num-1; j++)
  26.     {
  27.         if (frase[j] == diccionario[i])
  28.         {
  29.                 contador+=1;
  30.                 letra = diccionario[i];
  31.         }
  32.        
  33.            
  34.     }
  35.     if (contador != 0)
  36.         printf("el numero de letras %c es %d\n", letra, contador);
  37. }
Saludos.
Drewermerc.
  #6 (permalink)  
Antiguo 01/06/2014, 00:08
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Contar repeticiones de letra?


Vale pero ahora pasa el array de x palabras por tu función sino nada
X puede ser 1, 2,3,100,1000 XDDD
es solo hacer que le metas el aaray de palabras por una punta y salga contado por otra XDD
  #7 (permalink)  
Antiguo 01/06/2014, 19:02
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 9 meses
Puntos: 5
Respuesta: Contar repeticiones de letra?

hola vangodp.

bueno si tienes razon s eme paso es que lo hice de a rapido.
y bueno si es que coinsidimos es que debo poner en parametro de la funcion que catidadde array se va a pasar asi:

Código C:
Ver original
  1. void contar(char frase[30], char diccionario[26], int i);

bueno eso fue lo que te entendi si no es asi espero que me digas a que te referias para corregirlo.
Saludos.
Drewermerc.
  #8 (permalink)  
Antiguo 01/06/2014, 21:03
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Contar repeticiones de letra?

No tengo ni idea Drewermerc, no estoy en ello XD.
pero si tu función funciona para un string es solo pasar la frase a la función y imprimir creo XD
Puesto que dijo que las tiene en un array de x posiciones suponemos que que quiere decir matriz[][]
La verdad no se realmente XD.
Eso es lo que pasa cuando formulan una respuesta tan liosa XD
un array de x palabras eso no tiene sentido. O es un array de x letras o una matriz de x palabras pero tampoco seria tan malo lo de matriz de x posición por que no pide nada especial solo que la contemos las letras de cada palabra.
Si lograste con una pues con otra no seria muy distinto.
seria ir enviando a la función cada una de las palabras para que las contara.
La cosa se complicaría si pidiera que entrara una frase de varias palabras y contar una a una todas ellas las letras, y después guardarlas todo. Entonces... -_-'
  #9 (permalink)  
Antiguo 01/06/2014, 21:11
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 9 meses
Puntos: 5
Respuesta: Contar repeticiones de letra?

si tienes razon amigo y bueno pues creo que con eso se podra dar mejor una idea si es que aun lo esta haciendo y bueno pues si como no se especifica bien yo entendi eso y fue lo que hice pero bueno creo que ya lo orientamos.
Saludos.
Drewermerc.
  #10 (permalink)  
Antiguo 01/06/2014, 21:24
 
Fecha de Ingreso: marzo-2014
Mensajes: 41
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Contar repeticiones de letra?

Cita:
Iniciado por vangodp Ver Mensaje
Puesto que dijo que las tiene en un array de x posiciones suponemos que que quiere decir matriz[][]
La verdad no se realmente XD.
Eso es lo que pasa cuando formulan una respuesta tan liosa XD
un array de x palabras eso no tiene sentido. O es un array de x letras o una matriz de x palabras pero tampoco seria tan malo lo de matriz de x posición por que no pide nada especial solo que la contemos las letras de cada palabra.
Es un array de tipo string (contiene una cadena de caracteres en cada posicion del array)... Entonces en cada posicion tendra una palabra distinta
ej:

diccionario[0]="casa"
diccionario[1]="forosdelweb"
diccionario[2]="mercado"
.
.
.
  #11 (permalink)  
Antiguo 01/06/2014, 22:45
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 9 meses
Puntos: 5
Respuesta: Contar repeticiones de letra?

bueno pues con el codigo que te di y la opcion de estructura que te dio vangodp lo podrias hacer aqu te dejoun ejemplo en si no se cambia casinada el codigo solo se agrega la estructura aun tiene algun detalles pero eso ya lo pudes arreglar tu.
Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. struct datos{
  5.     char frase[30];
  6. };
  7.  
  8.  
  9. void contar(struct datos *nombre, char diccionario[],int i, int l);
  10.  
  11. int main ()
  12. {
  13.     struct datos nombres[3];
  14.     char diccionario[26] = "abcdefghijklmnopqrstuvwxyz";
  15.     int i = 0, caracteres, l = 0;
  16.     for (i = 0; i<3; i++)
  17.     {
  18.     printf("introduce frase\n");
  19.     fgets(nombres[i].frase, 30, stdin);
  20.     }
  21.     for (l = 0; l < 3; l++)
  22.         for  (i = 0; i < 25; i++)
  23.             contar(nombres[0].frase, diccionario, i, l);
  24.  
  25.  
  26.     return 0;
  27. }
  28.  
  29. void contar(struct datos *nombre, char diccionario[], int i, int l)
  30. {
  31.     int j, num,contador, max = 0;
  32.     char letra;
  33.     contador = 0;
  34.     num = strlen(nombre[l].frase);
  35.     for (j = 0; j < num-1; j++)
  36.     {
  37.        
  38.         if ( (nombre[l].frase[j]) == diccionario[i])
  39.         {
  40.                 contador+=1;
  41.                 letra = diccionario[i];
  42.         }
  43.        
  44.            
  45.     }
  46.     if (contador != 0)
  47.         printf("el numero de letras %c es %d\n", letra, contador);
  48.  
  49.    
  50. }
Saludos.
Drewermerc.
  #12 (permalink)  
Antiguo 05/06/2014, 14:02
 
Fecha de Ingreso: marzo-2014
Mensajes: 41
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Contar repeticiones de letra?

Hola,
la verdad es que no les entiendo mucho de lo que ponen... porque a como me estan enseñando es totalmente diferente (por ejemplo nunca he visto cosas como struct datos *nombre... fgets, printf, etc)

Pero bueno, ahora lo que tengo duda es con como se hace para buscar una letra en un array de string?
El problema que tengo es que obviamente no puedo comparar string con char... Entonces cuando trato de buscar la "a" por ejemplo como se hace?


Código:
int contador=0;
string vec[3]={"casa","coche","camisa"};
if(vec[0]=='a') /*aqui estaria buscando en la posicion 0 (casa) la letra 'a' pero como vec[0] es un string no lo puedo comparar con 'a' que es un char... 
Y si lo pongo asi: "a" como un string lo que buscaria es si casa es igual a "a" lo que obviamente es incorrecto*/
contador++
  #13 (permalink)  
Antiguo 05/06/2014, 16:26
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 9 meses
Puntos: 5
Respuesta: Contar repeticiones de letra?

bueno pues printf en c++ lo susituyes por cout y fgets lo puedes sustitur po cin y struct tendrias queinvesticar estructuras en c++ que son casi iguales.

Bueno con respecto a tu problema bueno en realida cuando usar array de string lo usas como si fuera un matriz por lo tanto lo debes de tomarias asi.

casa
perro
arbol

para saber si el primer carcater de la palabra casa es "c" su coordenada seria 0,0.
pero si queiremos saber si la palabra arbol tiene el caracter "o" su coordenada seria 2,4.
asi susesibamente.

buenoaqui te dejo un ejemplo de como seria.
Código C++:
Ver original
  1. int contador;
  2.     string vec[3]={ "casa",
  3.                     "perro",
  4.                     "arbol"};
  5. /*aqui se quiere verificar si en la palbra perro en la posicion 1,4 esta la letra o*/
  6.     if(vec[1][4] == 'o')
  7.         contador++;
  8.        
  9.     cout << contador<<"\n";
  10.     return 0;
buenoe espeor que me hayas entendido sino comenta tus dudas.
Saludos.
Drewermerc.
  #14 (permalink)  
Antiguo 05/06/2014, 20:48
 
Fecha de Ingreso: marzo-2014
Mensajes: 41
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Contar repeticiones de letra?

Muchas gracias, me sirvio de mucho eso, la verdad no lo sabia...

hasta ahora tengo esto funcionando, que seria buscar la letra a en todas las palabras y mostrar las el numero de palabras donde esta presente esa letra (no las repeticiones totales, por eso pongo en 0 al acumulador cada vez que entra al primer bucle)...
Código:
string diccionario[100]={"casa", "perro", "carro", "computadora", "cabana", "coche", "mer", "sfefef"};
	int acum1=0, acum2=0;

		for(int b=0;b<8;b++){
			acum1=0;
			for(int c=0;c<diccionario[b].length();c++){
			if(diccionario[b][c]=='a')
				acum1++;}
			if(acum1>0)
				acum2++;}
			cout<<acum2<<endl;




Pero ahora ocupo buscar todas las veces que aparece cada letra del alfabeto... por lo que pense que seria bueno ir guardando el acum2 en un array antes de cambiar a la siguiente letra... pero no me esta saliendo bien, en este caso me esta dando el numero 34 repetido...
De casualidad sabes donde esta el error?

Código:
string diccionario[100]={"casa", "perro", "carro", "computadora", "cabana", "coche", "mer", "sfefef"};
	int vec[27];
	int acum1=0, acum2=0;
	  for(char a='a';a<='z';a++)
		for(int b=0;b<8;b++){
			acum1=0;
			for(int c=0;c<diccionario[b].length();c++){
			if(diccionario[b][c]==a)
				acum1++;}
			if(acum1>0)
				acum2++;
		for(int i=0;i<27;i++)
			vec[i]=acum2;}
	  
	  for(int i=0;i<27;i++)
		  cout<<vec[i]<<endl;

Última edición por newb; 06/06/2014 a las 12:57
  #15 (permalink)  
Antiguo 06/06/2014, 17:50
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Contar repeticiones de letra?

Una solución que puede mejorarse: http://ideone.com/OyNvLA

Disculpen la poca eficiencia en el código, hace mucho que no toco C++.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #16 (permalink)  
Antiguo 06/06/2014, 21:26
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 14 años, 3 meses
Puntos: 13
Respuesta: Contar repeticiones de letra?

Cita:
Iniciado por Alexis88 Ver Mensaje
Una solución que puede mejorarse: http://ideone.com/OyNvLA

Disculpen la poca eficiencia en el código, hace mucho que no toco C++.

Saludos
Aquí mi solución a tu código mucho más optimizada

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <stdlib.h>
  4.  
  5. #define MAX_CHARS 33 /* Letras en el diccionario. */
  6.  
  7. int main (void)
  8. {
  9.     const char *str = "I have only right. - Tolkien.";
  10.  
  11.     unsigned char dchar[MAX_CHARS] = {0};
  12.     size_t schars[MAX_CHARS] = {0};
  13.  
  14.     int i, j = 0;
  15.  
  16.     while ( *str != '\0')
  17.     {
  18.         if ((size_t) *str < 0x41 || (size_t) *str > 0x7A) {
  19.             str++;
  20.             continue;
  21.         }
  22.  
  23.         unsigned char charlw = tolower(*str);
  24.  
  25.         for (i = 0; i < MAX_CHARS; i++) {
  26.             if (dchar[i] == charlw)
  27.                 schars[i] += 1;
  28.             else if (dchar[i] == 0) {
  29.                 dchar[i] = charlw;
  30.                 schars[i] += 1;
  31.  
  32.                 break;
  33.             }
  34.         }
  35.  
  36.         str++;
  37.     }
  38.  
  39.     for (; j < MAX_CHARS; j++)
  40.         if (dchar[j] != 0)
  41.             printf("Hay %i letra/as %c\n", schars[j], dchar[j]);
  42.  
  43.     return EXIT_SUCCESS;
  44. }

Un problema fundamental eran las mayúsculas y minúsculas, como podrás ver lo que hice con tolower, pero está otro problema, que no esta incluido en el código pero su solución es fácil, que trata de ASCII extendido, a lo que me refiero, si un usuario tecleó una cadena con algunas letras con tilde, no lo identificará por que aquí los estoy filtrando

Código C:
Ver original
  1. if ((size_t) *str < 0x41 || (size_t) *str > 0x7A)

Solo quedaría ver un poco la tabla de ASCII extendido y modificar esto.


Un saludos.
__________________
Si me equivoco, corríjanme sin piedad.
  #17 (permalink)  
Antiguo 06/06/2014, 22:51
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 9 meses
Puntos: 5
Respuesta: Contar repeticiones de letra?

hola guzzano.
bueno pues creo que lo que el quiere es que sean palabras aparte no en una misma oracion si no que por ejemplo se introducan tres frases o palabra y que haga el procedimiento para todas las palabras.

bueno a mi se me ocurrio esta forma espero que te sirva y que sea lo que estas buscando.

Código C++:
Ver original
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. int main ()
  7. {
  8.     string diccionario[20]={    "casa",
  9.                                 "perro",
  10.                                 "computadora"};
  11.     int acum1=0, acum2=0;
  12.     int x = 0, b = 0, a = 0, valor1 = 0, valor2 = 0, valor3  = 0, valor4 = 0;
  13.     char vec[27] = "abcdefghijklmnopqrstuvwxyz";
  14.     for (x = 0; x<20;x++)
  15.         if (diccionario[x] != "")
  16.             valor3++;
  17.         else
  18.             x = 21;
  19.     for(b=0;b<valor3;b++)
  20.     {
  21.         valor1 = diccionario[b].length();
  22.         if( valor1 > valor2)
  23.             valor2 = valor1;
  24.     }
  25.     for( a= 0; a<26;a++)
  26.       {
  27.         for(b=0;b<valor3;b++)
  28.         {
  29.             if(diccionario[b][x] != ' ')
  30.                 for(x =0; x<valor2; x++)
  31.                     if((diccionario[b][x] == vec[a]))
  32.                         acum1++;
  33.  
  34.         }
  35.             if((acum1 != 0))
  36.                 cout<<vec[a]<<" se repite "<<acum1<<"\n";
  37.             acum1 = 0;
  38.       }
  39.        
  40. }

bueno si alguien ve algun detalle o algo mal que me lo haga saber para coregirlo.
Saludos.
Drewermerc.
  #18 (permalink)  
Antiguo 07/06/2014, 01:47
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Contar repeticiones de letra?

Buena, guzzano, era más o menos lo que me hubiera gustado hacer, pero como dije, hace mucho que no toco C++, ahora estoy abocado a la web y probablemente en PHP o JS lo hubiera hecho en menos de 10 líneas.

Drewermerc, creo que la solución propuesta es viable, solo sería cuestión de iterar sobre el array de frases u oraciones y aplicar la función a cada elemento.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #19 (permalink)  
Antiguo 07/06/2014, 09:12
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años, 5 meses
Puntos: 49
Respuesta: Contar repeticiones de letra?

Cita:
Iniciado por Drewermerc Ver Mensaje
hola guzzano.
bueno pues creo que lo que el quiere es que sean palabras aparte no en una misma oración si no que por ejemplo se introduzcan tres frases o palabra y que haga el procedimiento para todas las palabras.

bueno a mi se me ocurrió esta forma espero que te sirva y que sea lo que estas buscando.
.........................................
Creo que sí, que esa era la idea pero no sé por qué aparece la w.

El código un poco adelgazado de variables innecesarias y otras minucias:

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","wwomm"};
  8.   int acum, i, j, 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.   }
  18.   return 0;
  19. }

¡¡¡Saluditos!!!


Última edición por leosansan; 07/06/2014 a las 09:38
  #20 (permalink)  
Antiguo 07/06/2014, 10:32
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Contar repeticiones de letra?

No sé tú, pero creo que para comparar cadenas/caracteres, lo más adecuado es utilizar la función strcmp, aunque de igual hacerlo con el signo de igualdad doble.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #21 (permalink)  
Antiguo 07/06/2014, 10:45
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años, 5 meses
Puntos: 49
Respuesta: Contar repeticiones de letra?

Cita:
Iniciado por Alexis88 Ver Mensaje
No sé tú, pero creo que para comparar cadenas/caracteres, lo más adecuado es utilizar la función strcmp, aunque de igual hacerlo con el signo de igualdad doble.
..........................
Para comparar cadenas sí, pero en este caso se trata de caracteres con lo que es válido y creo que más eficiente, ya que no se usa función alguna, el uso de "==".

¡¡¡Saluditos!!!

  #22 (permalink)  
Antiguo 07/06/2014, 10:54
 
Fecha de Ingreso: marzo-2014
Mensajes: 41
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Contar repeticiones de letra?

Excelente leosansan... Pero ocupo meterlo en un array cada resultado para luego aplicarle esta formula a cada una de las letras presentes en "diccionario": -n/N * ( log (n/N) / log (2.0) )
Donde n=numero de palabras donde aparece la letra y N=numero total de palabras... Y luego de hacer esa formula debo decir cual de las letras es la que dio mayor resultado

Intente meterlo en un array con lo que compartiste, pero no me funciono

Código:
 string diccionario[]={"casas","perros","computadoras","arroz","wwomm"};
  int acum, i, j, letra, tam = sizeof diccionario / sizeof diccionario[0];
  char letras[] = "abcdefghijklmnñopqrstuvwxyz";
  int arr[27];
  for(int f=0;f<27;f++)
	  vec[f]=0;

  for( letra = 0 ; letras[letra] ; letra++){
    for( i = 0 , acum = 0 ; i < tam ; i++)
        for( j =0 ; diccionario[i][j] ; j++) /** Ó: for(j =0;j<diccionario[i].size();j++) **/
            if( diccionario[i][j] == letras[letra] )
              acum++;
    if( acum != 0 )
		for(int k=0;k<5;k++)
			arr[k]=acum;
  }
  for(int k=0;k<5;k++)
  cout<<arr[k]<<endl;
  #23 (permalink)  
Antiguo 07/06/2014, 11:55
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años, 5 meses
Puntos: 49
Respuesta: Contar repeticiones de letra?

No creo que sea necesario el uso de un array, entendiendo que lo que buscas es sólo el mayor valor de n/N.

Una salida a lo que pretendes sería:

Cita:

a se repite 6
c se repite 2
d se repite 1
e se repite 1
m se repite 3
o se repite 5
p se repite 2
r se repite 5
s se repite 4
t se repite 1
u se repite 1
w se repite 2
z se repite 1

a da el mayor valor de ( n = 6 ) / ( N = 5 ) = 1.2
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, i, j, mayor, letra, tam = sizeof diccionario / sizeof diccionario[0];
  9.   float cont=0;
  10.   char letras[] = "abcdefghijklmnopqrstuvwxyz";
  11.   for( letra = 0 ; letras[letra] ; letra++){
  12.     for( i = 0 , acum = 0 ; i < tam ; i++)
  13.         for( j =0 ; diccionario[i][j] ; j++) /** Ó: for(j =0;j<diccionario[i].size();j++) **/
  14.             if( diccionario[i][j] == letras[letra] )
  15.               acum++;
  16.     if( acum != 0 ){
  17.       cout << letras[letra] << " se repite " << acum << endl;
  18.       if ( acum / tam > cont ){
  19.         cont = (float) acum/tam;
  20.         mayor = letra;
  21.         acum_mayor = acum ;
  22.       }
  23.     }
  24.   }
  25.   cout << endl<< letras[mayor] << " da el mayor valor de ( n = "  << acum_mayor << " ) / (  N = " << tam << " ) = "<< cont << endl;
  26.   return 0;
  27. }

Con el valor calculado ya le puedes aplicar la fórmula que quieras.

¡¡¡Saluditos!!!

  #24 (permalink)  
Antiguo 07/06/2014, 12:40
 
Fecha de Ingreso: marzo-2014
Mensajes: 41
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Contar repeticiones de letra?

Claro la logica seria esa, pero esa formula que puse es del algoritmo id3, que es utilizado en inteligencia artificial para calcular probabilidades... En este caso que letra escoger... Un ejemplo de porque ocupo utilizar esa formula:

aplicando la formula -n/N * ( log (n/N) / log (2.0) ):

91/100= 0.12
86/100= 0.18
71/100= 0.35
70/100= 0.36
60/100= 0.44
55/100= 0.47
23/100= 0.48
32/100= 0.5260
41/100= 0.5273

Puedes ver que cuando aplico la formula el 23 es sugerido por sobre una letra que se repita 32 o 41 veces (yo la verdad no le veo sentido pero que se le va a hacer...)

Por eso queria meterlo en un array y luego irle aplicando la formula a cada elemento del array y que me retorne el menor luego de aplicar la formula... Pero ahora pensando sobre eso como voy a hacer para saber si es la 'a' o 'd' o cualquier otra si lo que voy a tener en el array es el numero de palabras donde se repite esa letra....
  #25 (permalink)  
Antiguo 07/06/2014, 13:22
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años, 5 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
  #26 (permalink)  
Antiguo 07/06/2014, 14:14
 
Fecha de Ingreso: marzo-2014
Mensajes: 41
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Contar repeticiones de letra?

Muchisimas gracias!!!
Una ultima pregunta, para que sirve el break ahi? yo lo he visto en switch pero aqui para que usa?
  #27 (permalink)  
Antiguo 07/06/2014, 15:24
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Contar repeticiones de letra?

Para terminar el ciclo, o sea, para salir del bucle sin que haya necesidad de realizar el resto de iteraciones pendientes.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #28 (permalink)  
Antiguo 08/06/2014, 04:29
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años, 5 meses
Puntos: 49
Respuesta: Contar repeticiones de letra?

Cita:
Iniciado por newb Ver Mensaje
Muchisimas gracias!!!
Una ultima pregunta, para que sirve el break ahi? yo lo he visto en switch pero aqui para que usa?
En este caso para que cuente sólo una letra por palabra. Por ejemplo en "kansas" al contar una "a" actúa el break y ya no cuenta la segunda "a", con lo que obtengo en la variable "acum" el número de palabras en que aparece la "a", mientras que sin el break obtenía el total de apariciones.

¡¡¡Saluditos!!!

  #29 (permalink)  
Antiguo 08/06/2014, 05:20
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Contar repeticiones de letra?

jeje que fiera leo ;)
  #30 (permalink)  
Antiguo 08/06/2014, 05:31
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años, 5 meses
Puntos: 49
Respuesta: Contar repeticiones de letra?

Cita:
Iniciado por vangodp Ver Mensaje
jeje que fiera leo ;)
Gracias de corazón por los ánimos, amigo vangodp.

Menos mal que aquí se puede colgar código," no como en otros sitios".

Un fuerte abrazo campeón.

Etiquetas: repeticiones, 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 15:26.