Realizar un programa que lea palabras hasta que se introduzca "fin".
Siempre he usado el int para parar mis bucles o sino los hacia con for, pero no se como podria hacer un bucle para que escribiendo fin se detuviese el programa, se que con int seria así:
#include<iostream>
using namespace std;
int main(){
int palabra;
while (palabra != 1){cout << "Introduzca palabras<escriba fin para parar el programa>: ";
cin >> palabra;
cout<<endl;}
system("pause");
return 0;
}
la pregunta entera es esta pero solo dudo en eso :
. Realizar un programa que lea palabras hasta que se introduzca "fin",
mostrando una estadística de las longitudes de las palabras, es decir, el número total
de palabras de longitud 1 que se hayan introducido, el total de longitud 2, etc. La máxima
longitud de las palabras deberá ser de 25 caracteres. Una posible salida de este programa sería:
Palabras longitud 1: 0
Palabras longitud 2: 10
...
Palabras longitud 25:
un while se ejecuta hasta que la condición devuelva false o, en su defecto 0. Es decir, no está limitada a enteros.
Tu tienes que hacer una comparación dentro del while para que el bucle se repita hasta que la palabra elegida coincida con "fin". Dado que usas la clase string es tan sencillo como echar mano a los operadores, en concreto el operador != que, curiosamente, retorna un booleano.
El resto te lo dejo a ti, que es como se aprende.
Un saludo.
A lo mejor te interesa el while cin ;D
https://www.youtube.com/watch?v=ZYZQakNhkgM
Palabra no está inicializada cuando llegas al bucle...
Y para variar falta la librería cstdlib para el system ... por no hablar de la indentación y de esa forma tan peculiar de poner las llaves....:huh: :huh: :huh:¡¡¡¡ Saluditos! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
Hay otra forma sutil, aunque elegante de hacerlo. Poniendo la cadena vacía como indicador para el fin del programa (en lugar de la cadena "fin").
Me explico, por ejemplo si usamos en C la función gets(), (ojo peligro, cuidado con desbordamiento de buffer) y al pedir la cadena presionas Enter, pues se recibe la cadena vacía, y finalizas el programa:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char buffer[100];
gets( buffer );
while ( *buffer != '\0' ) {
printf("Usted escribio: %s\n", buffer);
gets( buffer );
}
return 0;
}
Otra forma sería usando la secuencia de fin de archivo EOF para terminar el programa, aunque es algo más complicado, mejor para ti el primer método.
¿Alguien ofrece solución equivalente en C++?
por fuera de las repuestas ya dadas, no se si yo estoy errando viendo la direccion que tomaron las respuestas...
puedes usar un "break;" para romper el ciclo y salir de el o un "return 0;" si estás en main, para cerrar el main y dar por finalizado el programa (al llegar a un return inmediatamente se sale de la función de se está sin importar si terminó o no)
Cita de: yoel_alejandro en 2 Abril 2014, 01:25 AM¿Alguien ofrece solución equivalente en C++?
Ya la indico
eferion: verificar que la lectura sea exitosa y a continuacion comparar la palabra con la literal "fin". Mas o menos asi:
string palabra;
// ...
while (cin >> palabra && palabra != "fin"){
cout << palabra << endl;
// ...
}
Po supuesto hay que agregar el calculo de las frecuencias de las palabras, para ello se puede utilizar un vector.
Un saludo
si me hace el bucle pero para leer las palabras que escribo en la consola me sirve? es decir, que tendria que hacer para que me reconozca las palabras introducidas? supongo que luego seria pasarlo todo por un strlen y compararlos
Cita de: lukaszg_15 en 3 Abril 2014, 17:12 PMsi me hace el bucle pero para leer las palabras que escribo en la consola me sirve?
Si.
Cita de: lukaszg_15 en 3 Abril 2014, 17:12 PMsupongo que luego seria pasarlo todo por un strlen y compararlos
Lo usual en C es utilizar strlen, en el caso de C++ utilizas la función miembro "size", tienen el mismo efecto (resultar en el numero de caracteres de la cadena).
Para las frecuencias declaras un array (o un objeto de la clase vector, depende del enunciado) de 26 elementos (por simplicidad ignoras el primer elemento frec[0]), uno para cada frecuencia: frec[1] almacena el numero de palabras de longitud uno, frec[2] el numero de palabras de longitud dos, etc.
Un saludo
no me viene a la mente como hacer bien el ejercicio, solo me falta que todos sean 0 salvo el de caracteres indicados que se le deberia sumar 1 cada vez que haya una palabra de su dimension, lo tengo hecho de forma que lea los caracteres y me los lee bien pero no se me ocurre la forma correcta.
#include <iostream>
using namespace std;
int main(){
int n;
cout<<"Ingrese cantidad de nombre: ";
cin>>n;
cin.sync();
char nombres [n][25];
for(int k = 0;k<n;k++){
cout<<"Ingrese nombre "<<k+1<<": ";
gets(nombres[k]);
}
cout<<endl;
for(int k=0;k<n;k++)
cout<<"Palabra longitud "<< k+1 <<": "<< strlen(nombres[k]) <<endl;
system("pause");
return 0;
}
Cita de: lukaszg_15 en 3 Abril 2014, 21:33 PMno me viene a la mente como hacer bien el ejercicio, solo me falta que todos sean 0 salvo el de caracteres indicados que se le deberia sumar 1 cada vez que haya una palabra de su dimension, lo tengo hecho de forma que lea los caracteres y me los lee bien pero no se me ocurre la forma correcta.
No deberías hacerlo así. Problemas hay varios como declarar el array "nombres" con un numero de elementos calculado en tiempo de ejecución (si es valido depende del compilador) y el uso de la función gets (no se recomienda, las razones de ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html)).
En el programa lo que debes hacer es leer palabra por palabra hasta que la introducida sea "fin", por cada una actualizas la frecuencia correspondiente. Finalmente imprimes la frecuencia de cada palabra.
Puedes empezar con:
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
#include <string>
using std::string;
int main()
{
unsigned long frec[26] = {0}; // Todos los elementos a cero
string palabra;
while (cin >> palabra && palabra != "fin"){
// Actualizar la frecuencia de la palabra introducida,
// su longitud esta dada por
cout << "palabra.size() == " << palabra.size() << endl;
}
// Imprimir la frecuencia de cada palabra
return 0;
}
Un saludo
eso mas o menos ya lo tenia, pero como coger esa longbitud y tranformarla en un 1?
es decir porque tengo que hacer un bucle si o si y entonces me sale todo 0 :
for (int i =0;i < 25;i++)
cout <<"Palabras longitud "<<i<<": " <<frec[25]<<endl;
entonces si yo escribo una palabra de 5 caracteres, para que Palabras longitud sea = 1 tendria que hacer otro bucle fuera de ese? porque si introduciese 2 palabras con 5 caracteres entonces tendria que ser Palabras longitud 5: 2.
Es que nunca he estudiado este tipo de estadisticas y cuando intento hacer algo con el i o con el frec me sale error, por ejemplo :
if (palabra.size() == 5) frec[4] == 1;
y me pone name lookup of 'i' changed for new ISO 'for' scoping
using obsolete binding at 'i'.
Los dos códigos que han puesto tienen un error, error provocado por escribir muy rápido ;D
En el primer código pones frec[25], no sería frec?
En el segundo código pones == cuando supongo que querrias hacer =.
El error de compilación es porque estás usando la variable i fuera de su contexto (es decir, fuera del for).