/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Contra letras, palabras, vocales... //Arrays// C++

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
lidikat



Registrado: 01 Ene 2013
Mensajes: 23

MensajePublicado: 24/04/2013 9:34 am
Título: Contra letras, palabras, vocales... //Arrays// C++

hola, tengo el siguiente ejercicio y a continuación les dejo lo que tengo de programa porque no sé como tengo que hacerlo, como contar las letras sin tener que ponerlas todas, supongo que tengo que usar un bucle for como en las vocales pero sé como y de la estadística y el tamaño de las palabras no tengo ni idea u.u


Realice un programa que lea una linea completa de teclado (cin.getline(linea, TAM_CADENA)Wink y que nos muestre las siguiente estadísticas:
a) cuantas vocales hay
b) cuantas palabras hay
c) cual es el tamaño de la palabra más larga
d) una estadística de cuantas veces aparece cada letra del abecedario en la linea



Código:

#include <iostream>
using namespace std;
int main ()
{
    char cadena [100];
    cin.getline(cadena,100);
    int contador[25];
    int letra=0, vocal=0, palabra=0;
   
    for(int i=0; i<100; i++)
    {
             if((cadena[i] == 'a')||(cadena[i] == 'e')||(cadena[i] == 'i')||(cadena[i] == 'o')||(cadena[i] == 'u'))
             {
                          vocal++;
                          }
             }
    cout << "La linea tiene " << vocal << " vocales" << endl;
   
     for(int i=0; i<100; i++)
    {
            if(cadena[i] == ' ')
            {
                          palabra++;
                          }
             }
             palabra = palabra-1;
    cout << "La linea tiene " << palabra << " palabras" << endl;
    system("pause");
    return 0;
}
Volver arriba
leosan



Registrado: 19 Abr 2012
Mensajes: 714
Ubicación: GRAN CANARIA

MensajePublicado: 25/04/2013 9:54 am
Título: Re: Contra letras, palabras, vocales... //Arrays// C++

lidikat escribió:

....................................................................
Realice un programa que lea una linea completa de teclado (cin.getline(linea, TAM_CADENA)Wink y que nos muestre las siguiente estadísticas:
a) cuantas vocales hay
b) cuantas palabras hay
c) cual es el tamaño de la palabra más larga
d) una estadística de cuantas veces aparece cada letra del abecedario en la linea



Entiendo que el cuarto apartado querría decir cuantas letras hay en la frase, porque si es lo que dice me cansaría de poner contadores e if.

Es decir, creo que lo que pide es algo como esto:

Código:

Introduzca una frase:
leon san leosan
La linea tiene 6 vocales
La linea tiene 3 palabras
La palabra mas larga tiene  6 letras
La linea tiene 13 letras


Código:
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int main ()
{
    char cadena [100];
    cout << "Introduzca una frase:"<< endl;
    cin.getline(cadena,100);
    int letra=0, vocal=0, palabra=1,cont=1,cont1=0,mayor=0;
    for(int i=0; cadena [i]!='\0'; i++){
        cont1++;
        cont++;
        if((cadena[i] == 'a')||(cadena[i] == 'e')||(cadena[i] == 'i')||(cadena[i] == 'o')||(cadena[i] == 'u'))
            vocal++;
        if(cadena[i] == ' ') {
            cont1--;
            palabra++;
                if(cont>mayor) {
                mayor=cont;
                cont=0;
            }
        }
    }
    cout << "La linea tiene " << vocal << " vocales" << endl;
    cout << "La linea tiene " << palabra << " palabras" << endl;
    cout << "La palabra mas larga tiene  " << mayor << " letras" << endl;
    cout << "La linea tiene " << cont1 << " letras" << endl;
    system("pause");
    return 0;
}


Saluditos .....
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7204
Ubicación: Mexico

MensajePublicado: 26/04/2013 9:58 am
Título: Re: Contra letras, palabras, vocales... //Arrays// C++

lidikat escribió:
Realice un programa que lea una linea completa de teclado (cin.getline(linea, TAM_CADENA);) y que nos muestre las siguiente estadísticas:
...
b) cuantas palabras hay

No es correcto simplemente incrementar el contador de palabras cuando encuentres un espacio. Por ejemplo si la linea solo consiste de 20 espacios el programa reportara 20 palabras.

En su lugar debes buscar el inicio de cada palabra e incrementar solo en ese momento el contador. Un programa de ejemplo:
Código:
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

const int TAM_CADENA = 80;

int main()
{
   char linea[TAM_CADENA];
   if (!cin.getline(linea, TAM_CADENA))
      return 1;
   
   int num_pals = 0;
   int estado = 0;
   for (int i = 0; linea[i] != '\0'; i++)
      if (linea[i] == ' ' || linea[i] == '\t')
         estado = 0;
      else if (estado == 0){
         estado = 1;
         num_pals++;
      }
   cout << "El numero de palabras es " << num_pals << endl;
   
   return 0;
}


lidikat escribió:
c) cual es el tamaño de la palabra más larga

Es un caso similar donde si el carácter es espacio asignas cero a la longitud actual, caso contrario incrementas y comparas contra el maximo. Un ejemplo:
Código:

#include <iostream>
using std::cin;
using std::cout;
using std::endl;

const int TAM_CADENA = 80;

int main()
{
   char linea[TAM_CADENA];
   if (!cin.getline(linea, TAM_CADENA))
      return 1;
   
   int long_actual = 0;
   int long_max = 0;
   for (int i = 0; linea[i] != '\0'; i++)
      if (linea[i] == ' ' || linea[i] == '\t')
         long_actual = 0;
      else if (++long_actual > long_max)
         long_max = long_actual;
   cout << "Longitud maxima: " << long_max << " caracteres" << endl;
   
   return 0;
}


lidikat escribió:
d) una estadística de cuantas veces aparece cada letra del abecedario en la linea

Utilizas un contador por cada letra, en este caso utilizamos un array. Si nos limitamos al caso básico con solo minúsculas y los 26 caracteres del alfabeto ingles solo hay que ajustar la relación carácter-indice. Para ello basta con restar 'a' al carácter:
Código:
'a' - 'a' == 0
'b' - 'a' == 1
'c' - 'a' == 2
...


La implementación es mas o menos así:
Código:
char abc[26] = {0};

// ...

for (int i = 0; linea[i] != '\0'; i++)
   if (linea[i] >= 'a' && linea[i] <= 'z')
      abc[linea[i] - 'a']++;

// ...


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
Volver arriba
lidikat



Registrado: 01 Ene 2013
Mensajes: 23

MensajePublicado: 27/04/2013 4:30 am
Título:

Hola,
muchas gracias a ambos.
El último apartado sí que es diciendo de cada letra yyo he pensado en hacerlo con un subprograma pero no termina de funcionarme.

Código:
#include <iostream>
using namespace std;
unsigned abecedario (int abc, char cadena);
int main ()
{
    char cadena [100];
    cin.getline(cadena,100);
    int cont=1, cont1=0;
    int letra=1, vocal=0, palabra=1, mayor=0;
    int abc;
    char respuesta;
   
    for(int i=0; cadena[i]!='\0'; i++)
    {
            cont++;
            if((cadena[i] == 'a')||(cadena[i] == 'e')||(cadena[i] == 'i')||(cadena[i] == 'o')||(cadena[i] == 'u'))
             {
                          vocal++;
                          }
   
            if(cadena[i] == ' ')
            {
                         cont--;
                          palabra++;
                          if(cont>mayor)
                          {
                                        mayor=cont;
                                        cont=0;
                                        }
                                        }
                          letra++;
             }
             letra = letra-palabra;
     
     cout << "De que letra quieres saber cuanto aparece? ";
     cin >> abc;
     cout << "La letra " << abc << "sale " << abecedario(abc, cadena) << " veces." << endl;
     
     do
     {
          cout << "Quiere saber las veces que aparece otra letra? [S/N] " << endl;
          cin >> respuesta;
          if (respuesta == 'S')
          {
                        cout << "De que letra quieres saber cuanto aparece? ";
                        cin >> abc;
                        cout << "La letra " << abc << "sale " << abecedario(abc, cadena) << " veces." << endl;
                        }
                        }
     while(respuesta != 'N');

    cout << "La linea tiene " << palabra << " palabras y " << letra << " letras" << endl;
    cout << "La linea tiene " << vocal << " vocales" << endl;
    cout << "La palabra más larga tiene " << cont << " letras" << endl;
    system("pause");
    return 0;
}
       
unsigned abecedario (int abc, char cadena)
{
    int i;
    for(int i=0; cadena[i]!='\0'; i++)
    {
              if(cadena[i] == abc)
              {
                           abc++;
                           }
                           }
                           return abc;
                           }
           

Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7204
Ubicación: Mexico

MensajePublicado: 27/04/2013 6:59 am
Título:

Lo primero que debes hacer es darle a la función un nombre mejor.

La función no realiza la operación de forma correcta porque su segundo parámetro debe ser "char cadena[]". Y su primer parámetro debería ser de tipo char. Mas o menos así:
Código:
unsigned contar_reps(char letra, char cadena[])
{
   int num_reps = 0;
   
   for (int i = 0; cadena[i] != '\0'; i++)
      if (cadena[i] == letra)
         num_reps++;
   
   return num_reps;
}


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
Volver arriba
lidikat



Registrado: 01 Ene 2013
Mensajes: 23

MensajePublicado: 28/04/2013 12:14 am
Título:

Sigo tiendo el mismo problema,
me señala esta línea

Código:
out << "La letra " << abc << "sale " << abecedario(abc, cadena) << " veces." << endl;


Y me dice "invalid conversion from 'char' to 'char' "

Un saludo.
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7204
Ubicación: Mexico

MensajePublicado: 28/04/2013 6:58 am
Título:

Ese error se genera porque, como ya te comente, la función la declaras con su segundo parametro de tipo char:
Código:
unsigned abecedario (int abc, char cadena /* <== */) ...


Para solucionarlo solo tienes que cambiar ese parámetro al tipo "char *":
Código:
// De esta forma:
unsigned abecedario (int abc, char *cadena) ...

// O tambien:
unsigned abecedario (int abc, char cadena[]) ...


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
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com