Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: kokokoko en 9 Marzo 2012, 18:44 pm



Título: Contar caracters
Publicado por: kokokoko en 9 Marzo 2012, 18:44 pm
Hola. Estoy aprendiendo a usar el c++ y me estoy metiendo con el tema de los arrays. Ahora estoy intentando hacer un programa que ingreses  una frase  y cuenta el numero de cada tipo de letras pero nose ni por donde empezar. Alguien me podria guiar un poco?


Título: Re: Contar caracters
Publicado por: nirvguy en 9 Marzo 2012, 19:06 pm
Creas un array en el que cada indice represente un caracter (a,b,c,d,e,f,g,h,i,j,etc) y metes de valor la cantidad de veces que se uso. ¿De que tamaño? fijate que si trabajas con chars los chars van de -127 a 127.
Algo asi, por ejemplo
Código
  1. arr[65]=12; /*12 veces se uso la A*/
  2.  
Espero haberte dado una guía.


Título: Re: Contar caracters
Publicado por: Stone20 en 9 Marzo 2012, 20:52 pm
Código
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. int main(){
  8.    string abc= "abcdefghijklmnñopqrstuvwxy";
  9.    vector<int> conta(26);
  10.    string miCadena = "ejemplo de un tio que pregunta en un foro";
  11.  
  12.    for(int i=0;i < miCadena.size();i++)
  13.        for(int j=0;j < abc.size();j++)
  14.            if(miCadena[i] == abc[j]) conta[j]++;
  15.  
  16.  
  17.    for(int k=0;k < conta.size();k++)
  18.        cout << "Letra " << abc[k] << " aparece " << conta[k] << " veces." << endl;
  19.    return 0;
  20. }
  21.  

Algo asi creo que funcionaria.Para que funcione mejor asegurate de convertir la cadena que entres a minusculas.


Título: Re: Contar caracters
Publicado por: kokokoko en 10 Marzo 2012, 15:15 pm
De momento e sacado el numero de letras de la frase. Ahora quiero que me diga si por ejemplo introduzca la letra a me diga hay tantas a.
aqui el codigo.

Código:
#include <stdio.h>
#include <string.h>

#define FRASE 100

int main(void)
{
    char a[FRASE+1];
    int l;
    char q;
    printf ("Introduce una frase: ", FRASE);
    gets(a);
    l = strlen(a);
    printf ("Longitud de la cadena: %d\n", l);
    printf("Que letra quieres contar:");
    scanf("%hh",&q);
    system("pause");
    return 0;
}


Título: Re: Contar caracters
Publicado por: Xandrete en 10 Marzo 2012, 16:00 pm
Creas un array en el que cada indice represente un caracter (a,b,c,d,e,f,g,h,i,j,etc) y metes de valor la cantidad de veces que se uso. ¿De que tamaño? fijate que si trabajas con chars los chars van de -127 a 127.
Algo asi, por ejemplo
Código
  1. arr[65]=12; /*12 veces se uso la A*/
  2.  
Espero haberte dado una guía.

Sólo una cosa. El tipo char tiene asociado el rango [-128,127], no el [-127,127]. Codificación Ca2.

Por otro lado, quisiera recomendar la buena costumbre de utilizar operaciones aritméticas con caracteres. Por ejemplo, si se desea crear un array con una posición para cada letra minúscula. crearlo como int array['z'-'a'+1]. De esta manera quedará más clara la función del array y nos aseguramos de no haber contado mal las letras del abecedario >.<

Y también me gustaría aconsejar usar la directiva define o declarar variables constantes para asignar identificadores:

Código
  1. #define NUMOFLETTERS 'z'-'a'+1
  2. ...
  3. int array[NUMOFLETTERS];
  4.  

Código
  1. int const NUMOFLETTERS = 'z'-'a'+1
  2. ...
  3. int array[NUMOFLETTERS];
  4.  

Cuando haces programas largos, ver un puñado de 27's o 42's por ahí puede ser muy confuso. De cara a la depuración y a la modificación, es más gratificante que cada constante tenga su identificador.

Código
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. int main(){
  8.    string abc= "abcdefghijklmnñopqrstuvwxy";
  9.    vector<int> conta(26);
  10.    string miCadena = "ejemplo de un tio que pregunta en un foro";
  11.  
  12.    for(int i=0;i < miCadena.size();i++)
  13.        for(int j=0;j < abc.size();j++)
  14.            if(miCadena[i] == abc[j]) conta[j]++;
  15.  
  16.  
  17.    for(int k=0;k < conta.size();k++)
  18.        cout << "Letra " << abc[k] << " aparece " << conta[k] << " veces." << endl;
  19.    return 0;
  20. }
  21.  

Algo asi creo que funcionaria.Para que funcione mejor asegurate de convertir la cadena que entres a minusculas.

No es necesario desplegar esa maquinaria para saber si un carácter es una letra. Para saber si un carácter c es una letra (minúscula, pongamos, para simplificar), basta con comparar si es mayor o igual que 'a' y menor o igual que 'z'. No hace falta, pues, meter otro bucle dentro del primer for, y te ahorras ese string abc. En la librería cctype hay una función que te hace esto ya. Se llama isalpha() y recibe un parámetro de tipo char. Devuelve true si el parámetro es una letra, ya sea minúscula o mayúscula y falso en caso contrario.

Saludos


Título: Re: Contar caracters
Publicado por: kokokoko en 10 Marzo 2012, 18:32 pm
Ahora e seguido un poco más pero me da un error cuando introduzco una letra porque en el contador solo me sale 1. miren:
Código:
#include<stdio.h>
#define FRASE 100

main()
{
      char b[29]= "qwertyuiopasdfghjklñçzxcvbnm";
      char a[FRASE+1];
      int l,d;
      printf("Introduce una frase:",FRASE);
      gets(a);
      l=strlen(a);
      printf("longitud de la frase:""%d\n",l);
      printf("Introduce una letra:",b);
      gets(b);
      d=strlen(b);
      printf("La cantidad de la letra es:""%d\n",d);
      system("pause");
      return 0;
}


Título: Re: Contar caracters
Publicado por: Stone20 en 10 Marzo 2012, 19:35 pm
No es necesario desplegar esa maquinaria para saber si un carácter es una letra. Para saber si un carácter c es una letra (minúscula, pongamos, para simplificar), basta con comparar si es mayor o igual que 'a' y menor o igual que 'z'. No hace falta, pues, meter otro bucle dentro del primer for, y te ahorras ese string abc. En la librería cctype hay una función que te hace esto ya. Se llama isalpha() y recibe un parámetro de tipo char. Devuelve true si el parámetro es una letra, ya sea minúscula o mayúscula y falso en caso contrario.

Saludos

No lo hago para saber si es una letra,sino para saber que letra es,osea a que contador sumarle +1.Imagino que habrá mejores maneras,era un ejemplo.

EI: juntando mensajes.

Ahora e seguido un poco más pero me da un error cuando introduzco una letra porque en el contador solo me sale 1. miren:
Código:
#include<stdio.h>
#define FRASE 100

main()
{
      char b[29]= "qwertyuiopasdfghjklñçzxcvbnm";
      char a[FRASE+1];
      int l,d;
      printf("Introduce una frase:",FRASE);
      gets(a);
      l=strlen(a);
      printf("longitud de la frase:""%d\n",l);
      printf("Introduce una letra:",b);
      gets(b);
      d=strlen(b);
      printf("La cantidad de la letra es:""%d\n",d);
      system("pause");
      return 0;
}

Cuando introduces una letra la guarda en b y entonces strlen(b) solo te devuelve uno(has introducido una letra).


Título: Re: Contar caracters
Publicado por: kokokoko en 10 Marzo 2012, 21:37 pm
entonces que tengo que poner?, es que nose que funcion puede contar el número de cada letra para que luego lo imprima..


Título: Re: Contar caracters
Publicado por: Sagrini en 10 Marzo 2012, 21:56 pm
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main ()
  5. { char buffer [32], letra; int i=0, cont=0;
  6. printf ("Cadena: "); read (0, buffer, 32); for (i=0; buffer[i] != '\0' && buffer[i] != '\n' && i!=32; i++); buffer [i]='\0';
  7. printf ("Letra: "); read (0, &letra, 1);
  8. for (i=0; i<strlen (buffer); i++) if (buffer[i]==letra) cont++;
  9. printf ("La letra %c aparace %d veces\n", letra, cont); return 0;
  10. }
  11.  


Título: Re: Contar caracters
Publicado por: rir3760 en 11 Marzo 2012, 01:55 am
Advierto: para variar me voy a pasar de "pesadito" (mas bien [CENSORED]).

Sólo una cosa. El tipo char tiene asociado el rango [-128,127], no el [-127,127]. Codificación Ca2.
No exactamente. Es mas complicado.

Para empezar el tipo "char" es equivalente a "signed char" (lo usual, al menos en PCs de escritorio) o "unsigned char" y, aquí el problema, eso es "implementation defined". Por ello el rango valido del tipo "char" es CHAR_MIN  .. CHAR_MAX (ambas macros cortesía del encabezado <limits.h>).

En el caso del tipo "signed char" y considerando que el mínimo numero de bits que lo componen es ocho su rango mínimo garantizado es -127 .. 127. Ello porque el estándar de C no especifica como serán representados los números negativos. De nuevo lo usual es complemento a dos pero bien puede utilizarse complemento a uno o magnitud con signo y en ese caso se debe considerar al (inútil) cero negativo.

Por otro lado, quisiera recomendar la buena costumbre de utilizar operaciones aritméticas con caracteres. Por ejemplo, si se desea crear un array con una posición para cada letra minúscula. crearlo como int array['z'-'a'+1]. De esta manera quedará más clara la función del array y nos aseguramos de no haber contado mal las letras del abecedario >.<

Y también me gustaría aconsejar usar la directiva define o declarar variables constantes para asignar identificadores:

Código
  1. #define NUMOFLETTERS 'z'-'a'+1
  2. ...
  3. int array[NUMOFLETTERS];
  4.  
Cuando las macros resultan en expresiones la convención es colocarlas delimitadas por paréntesis, de no hacerlo se pueden presentar casos donde la expresión termina con resultados no deseados, por ejemplo si declaramos un array con el doble de elementos:
Código
  1. int array[NUMOFLETTERS * 2];
Se presenta un error lógico.

Un saludo


Título: Re: Contar caracters
Publicado por: Xandrete en 11 Marzo 2012, 14:37 pm
Advierto: para variar me voy a pasar de "pesadito" (mas bien [CENSORED]).
No exactamente. Es mas complicado.

Para empezar el tipo "char" es equivalente a "signed char" (lo usual, al menos en PCs de escritorio) o "unsigned char" y, aquí el problema, eso es "implementation defined". Por ello el rango valido del tipo "char" es CHAR_MIN  .. CHAR_MAX (ambas macros cortesía del encabezado <limits.h>).

En el caso del tipo "signed char" y considerando que el mínimo numero de bits que lo componen es ocho su rango mínimo garantizado es -127 .. 127. Ello porque el estándar de C no especifica como serán representados los números negativos. De nuevo lo usual es complemento a dos pero bien puede utilizarse complemento a uno o magnitud con signo y en ese caso se debe considerar al (inútil) cero negativo.
Cuando las macros resultan en expresiones la convención es colocarlas delimitadas por paréntesis, de no hacerlo se pueden presentar casos donde la expresión termina con resultados no deseados, por ejemplo si declaramos un array con el doble de elementos:
Código
  1. int array[NUMOFLETTERS * 2];
Se presenta un error lógico.

Un saludo

No, tampoco [CENSORED]  :D. Es bueno que te corrijan.

Saludos.