| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
lidikat
Registrado: 01 Ene 2013 Mensajes: 23
| Publicado: 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) 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
| Publicado: 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) 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |