Contar caracters

Iniciado por kokokoko, 9 Marzo 2012, 18:44 PM

0 Miembros y 1 Visitante están viendo este tema.

kokokoko

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?

nirvguy

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 (cpp) [Seleccionar]

arr[65]=12; /*12 veces se uso la A*/

Espero haberte dado una guía.
Todas mis letras han sido pedazos de poesía y los pedazos de poesía se toman de poemas que comúnmente no tienen sentido
en primer termino.
               Kurt Cobain

Stone20

#2
Código (cpp) [Seleccionar]
#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main(){
    string abc= "abcdefghijklmnñopqrstuvwxy";
    vector<int> conta(26);
    string miCadena = "ejemplo de un tio que pregunta en un foro";
   
    for(int i=0;i < miCadena.size();i++)
        for(int j=0;j < abc.size();j++)
            if(miCadena[i] == abc[j]) conta[j]++;


    for(int k=0;k < conta.size();k++)
        cout << "Letra " << abc[k] << " aparece " << conta[k] << " veces." << endl;
    return 0;
}


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

kokokoko

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.

#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;
}

Xandrete

#4
Cita de: 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 (cpp) [Seleccionar]

arr[65]=12; /*12 veces se uso la A*/

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 (cpp) [Seleccionar]
#define NUMOFLETTERS 'z'-'a'+1
...
int array[NUMOFLETTERS];


Código (cpp) [Seleccionar]
int const NUMOFLETTERS = 'z'-'a'+1
...
int array[NUMOFLETTERS];


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.

Cita de: Stone20 en  9 Marzo 2012, 20:52 PM
Código (cpp) [Seleccionar]
#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main(){
   string abc= "abcdefghijklmnñopqrstuvwxy";
   vector<int> conta(26);
   string miCadena = "ejemplo de un tio que pregunta en un foro";
   
   for(int i=0;i < miCadena.size();i++)
       for(int j=0;j < abc.size();j++)
           if(miCadena[i] == abc[j]) conta[j]++;


   for(int k=0;k < conta.size();k++)
       cout << "Letra " << abc[k] << " aparece " << conta[k] << " veces." << endl;
   return 0;
}


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

kokokoko

#5
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:
#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;
}

Stone20

#6
Cita de: Xandrete en 10 Marzo 2012, 16:00 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.

Cita de: 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:
#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).

kokokoko

#7
entonces que tengo que poner?, es que nose que funcion puede contar el número de cada letra para que luego lo imprima..

Sagrini


#include <stdio.h>
#include <string.h>

int main ()
{ char buffer [32], letra; int i=0, cont=0;
printf ("Cadena: "); read (0, buffer, 32); for (i=0; buffer[i] != '\0' && buffer[i] != '\n' && i!=32; i++); buffer [i]='\0';
printf ("Letra: "); read (0, &letra, 1);
for (i=0; i<strlen (buffer); i++) if (buffer[i]==letra) cont++;
printf ("La letra %c aparace %d veces\n", letra, cont); return 0;
}

rir3760

Advierto: para variar me voy a pasar de "pesadito" (mas bien [CENSORED]).

Cita de: Xandrete en 10 Marzo 2012, 16:00 PMSó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.

Cita de: Xandrete en 10 Marzo 2012, 16:00 PMPor 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 (cpp) [Seleccionar]
#define NUMOFLETTERS 'z'-'a'+1
...
int array[NUMOFLETTERS];
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:
int array[NUMOFLETTERS * 2];
Se presenta un error lógico.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language