Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: lukaszg_15 en 1 Abril 2014, 20:02 PM

Título: bucle con char
Publicado por: lukaszg_15 en 1 Abril 2014, 20:02 PM
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í:

Código (cpp) [Seleccionar]
#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:
Título: Re: bucle con char
Publicado por: eferion en 1 Abril 2014, 20:31 PM
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.
Título: Re: bucle con char
Publicado por: vangodp en 1 Abril 2014, 20:46 PM
A lo mejor te interesa el while cin  ;D
https://www.youtube.com/watch?v=ZYZQakNhkgM
Título: Re: bucle con char
Publicado por: amchacon en 1 Abril 2014, 22:26 PM
Palabra no está inicializada cuando llegas al bucle...
Título: Re: bucle con char
Publicado por: leosansan en 2 Abril 2014, 01:01 AM

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)
Título: Re: bucle con char
Publicado por: Yoel Alejandro en 2 Abril 2014, 01:25 AM
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:

Código (cpp) [Seleccionar]

#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++?
Título: Re: bucle con char
Publicado por: engel lex en 2 Abril 2014, 03:27 AM
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)
Título: Re: bucle con char
Publicado por: rir3760 en 2 Abril 2014, 03:34 AM
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:
Código (cpp) [Seleccionar]
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
Título: Re: bucle con char
Publicado por: lukaszg_15 en 3 Abril 2014, 17:12 PM
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
Título: Re: bucle con char
Publicado por: rir3760 en 3 Abril 2014, 17:41 PM
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
Título: Re: bucle con char
Publicado por: lukaszg_15 en 3 Abril 2014, 21:33 PM
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.

Código (cpp) [Seleccionar]
#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;

}
Título: Re: bucle con char
Publicado por: rir3760 en 4 Abril 2014, 04:08 AM
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:
Código (cpp) [Seleccionar]
#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
Título: Re: bucle con char
Publicado por: lukaszg_15 en 4 Abril 2014, 17:22 PM
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 :

Código (cpp) [Seleccionar]
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 :

Código (cpp) [Seleccionar]
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'.
Título: Re: bucle con char
Publicado por: amchacon en 6 Abril 2014, 00:35 AM
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).