Cuenta palabrasy letras

Iniciado por mc275, 11 Marzo 2017, 05:19 AM

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

mc275

Hola necesito:
Escribir un programa que solicite al usuario ingresar una cadena larga formada por varias palabras, el programa debe determinar lo siguiente:

1-numero de palabras en la cadena
2-cuantas vocales tiene la cadena
3-la letra que aparece en mas palabras (letra y en cuantas palabras)
4-la letra que mas aparece en toda la frase (letra y cuantas veces)

hasta el  momento he logrado los primeros 2 incisos, pero no se como hacer el 3 ni el 4, se los agradecería mucho si me ayudaran un poco.

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

int contar_vocales(char *);

int main(){
char cad[500],*p;
int longi,i,x,b,R,V,longinP,len;

printf("Ingrese un texto: ");
gets(cad);
longi = strlen(cad);

//-------------------------------Contador palabras------------------------------
b=0;
for(x=0;x<longi;x++){ //rrecorre la longitud de la cadena
if(cad[x]==' ' && x!=499 && cad[x+1]!= ' '){
 b++;
 }
}
printf("\nCantidad de Palabras: %d",b+1);
//--------------------------------cantidad------------------------------------

printf("\nCantidad de Vocales: %d",contar_vocales(cad));
V = contar_vocales(cad);
printf("\nCantidad de caracteres: %d",longi-b);
longinP= longi-b;





   getch();
}//Main -CuerpoPrincipal-
//--------------------------------Funcion---------------------------------------
       
int contar_vocales(char *cad){

int cont=0;
char *aux=cad;

while(*aux){
  if(*aux=='a'||*aux=='e'||*aux=='i'||*aux=='o'||*aux=='u')
    cont++;
      aux++;
  }//funcion

return cont;

}//contar_vocales


integeroverflow

Cita de: mc275 en 11 Marzo 2017, 05:19 AM
Hola necesito:
Escribir un programa que solicite al usuario ingresar una cadena larga formada por varias palabras, el programa debe determinar lo siguiente:

1-numero de palabras en la cadena
2-cuantas vocales tiene la cadena
3-la letra que aparece en mas palabras (letra y en cuantas palabras)
4-la letra que mas aparece en toda la frase (letra y cuantas veces)

hasta el  momento he logrado los primeros 2 incisos, pero no se como hacer el 3 ni el 4, se los agradecería mucho si me ayudaran un poco.

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

int contar_vocales(char *);

int main(){
char cad[500],*p;
int longi,i,x,b,R,V,longinP,len;

printf("Ingrese un texto: ");
gets(cad);
longi = strlen(cad);

//-------------------------------Contador palabras------------------------------
b=0;
for(x=0;x<longi;x++){ //rrecorre la longitud de la cadena
if(cad[x]==' ' && x!=499 && cad[x+1]!= ' '){
 b++;
 }
}
printf("\nCantidad de Palabras: %d",b+1);
//--------------------------------cantidad------------------------------------

printf("\nCantidad de Vocales: %d",contar_vocales(cad));
V = contar_vocales(cad);
printf("\nCantidad de caracteres: %d",longi-b);
longinP= longi-b;





   getch();
}//Main -CuerpoPrincipal-
//--------------------------------Funcion---------------------------------------
       
int contar_vocales(char *cad){

int cont=0;
char *aux=cad;

while(*aux){
  if(*aux=='a'||*aux=='e'||*aux=='i'||*aux=='o'||*aux=='u')
    cont++;
      aux++;
  }//funcion

return cont;

}//contar_vocales



para el 3 y el 4 podes hacer un array con la misma cantidad de caracteres del abecedario, en uppercase y lowercase, inicializando todos sus elementos a 0.
entonces recorres la cadena letra por letra y te fijas que letra es, buscas su elemento correspondiente en el array que hiciste y sumas 1.
despues para ver que letra se repitio mas veces, haces una funcion que recorra cada elemento del array que creaste. esta funcion va a tener 2 variables, una de tipo char, y otra de tipo int o short.

por cada iteracion:
chequeamos que el valor del elemento actual del array sea mayor que el valor del int/short de la funcion.
si es mayor, guardamos el valor del elemento actual del array en el int o short.
en el char, guardamos el caracter que corresponde a ese elemento del array.
continuamos.

cuando termines de recorrer todo el array, tendras en char el caracter que mas veces se repitio en la cadena, y el numero de veces que se repitio.

con ese mismo algoritmo, podes separar la frase en palabras y completar el punto 3.

no se si me entendiste, avisa cualquier cosa.
(puede haber alguna forma mas optimizada de realizar eso mismo, por ahora es la unica que se me ocurre)

mc275

Muchas gracias, ahorita mismo trabajare en eso, gracias

integeroverflow

#3
Cita de: mc275 en 15 Marzo 2017, 05:50 AM
Muchas gracias, ahorita mismo trabajare en eso, gracias


estaba aburrido e hice este programa, espero que te sirva de algo:


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

char arreglo[26];

int main(int argc, char **argv)
{
if(!argv[1]) return 0;
memset(arreglo, 0, 26); // inicializamos a 0 todos los elementos del arreglo
while(*argv[1]) // recorremos la cadena introducida
{
if((*argv[1] > 64 && *argv[1] < 91 ) || (*argv[1] > 96 || *argv[1] < 123)) // si es una letra
{
arreglo[tolower(*argv[1])-97] ++; // la tratamos como lowercase y le restamos el codigo ascii de modo que la primer letra minuscula (ascii 97) coincida con el elemento 0 del array, y asi con todas las demas letras.
}
*argv[1]++;
}

char carac = 0;
short veces = 0;
for(int i=0; i<26; i++)
{
if(arreglo[i] > veces) { // si el elemento actual que estamos analizando tiene un valor mayor a el ultimo elemento que asumimos que era el que mas veces estuvo en la cadena, sobreescribimos el anterior con el actual
veces = arreglo[i];
carac = i+97; // le sumamos de nuevo el codigo ascii para recuperar el caracter
}
}

printf("La letra que mas aparece es la letra \'%c\', %d veces.\n", carac, veces);
}


salida:


xxx@XXX:~$ ./a.out aaaaaaaapompomkopk
La letra que mas aparece es la letra 'a', 8 veces.
xxx@XXX:~$ ./a.out aaaaaaaapompomkopkmpmo
La letra que mas aparece es la letra 'a', 8 veces.
xxx@XXX:~$ ./a.out asdoimaspsaoaakjajaajssnma
La letra que mas aparece es la letra 'a', 9 veces.
xxx@XXX:~$ ./a.out asppppppppass
La letra que mas aparece es la letra 'p', 8 veces.
xxx@XXX:~$ ./a.out asppppppppass
La letra que mas aparece es la letra 'p', 8 veces.
xxx@XXX:~$ ./a.out axxxxxxxxxpsapaas
La letra que mas aparece es la letra 'x', 9 veces.
xxx@XXX:~$ ./a.out axxxxxxxxxxxxpsapaas
La letra que mas aparece es la letra 'x', 12 veces.