Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Variables.

Estas en el tema de Variables. en el foro de C/C++ en Foros del Web. Hola buenas que hay, me presento, que soy nuevo por aqui. Veran estoy realizando un curso de programacion a distancia y la verdad necesito la ...
  #1 (permalink)  
Antiguo 20/12/2007, 13:17
 
Fecha de Ingreso: diciembre-2007
Mensajes: 7
Antigüedad: 16 años, 5 meses
Puntos: 0
Variables.

Hola buenas que hay, me presento, que soy nuevo por aqui.
Veran estoy realizando un curso de programacion a distancia y la verdad necesito la ayuda de alguien. Debo realizar un proyecto, el cual tengo terminado, solo necesito "perfilar" determinados asuntos. Para no colgaros el problema entero, os pongo diversos ejemplos en los que tengo dudas y se lo hago mucho mas simple al que quiera ayudarme.

En c++, cuando hacemos una comparacion con un if, tal que:

#include <iostream>

using namespace std;
void prueba(int &a);

int main()
{
int a;
int b;
cout<<"Mete un numero"<<endl;
cin>>a;
cout<<"otro numero"<<endl;
cin>>b;
prueba(a);
cout<<a<<endl;
cout<<b<<endl;
}
void prueba(int &a)
{
int multiplicando;
int c;
cout<<"Introduce multiplicando"<<endl;
cin>>multiplicando;
cout<<"introduce c"<<endl;
cin>>c;
if (multiplicando==2){
a=c*multiplicando;}
else{
a=76;}
}
y aparece en la consola:
Mete un numero:
4
otro numero
5
Introduce multiplicando
a
introduce c
76
5

No llego a introducir la letra c. Esto puede parecer una tonteria, pero en el problema real no lo es, me crea un buen fallo que no se como resolver.
Alguien sabria decirme, como puedo arreglar esto?

nota: Me exigen que el programa este a prueba de bomba xD. Es decir, si en el lugar donde debo meter un entero, meto una letra, no se me cuelgue el programa ni nada por el estilo.

Saludos y gracias.

Última edición por jared; 20/12/2007 a las 14:07
  #2 (permalink)  
Antiguo 20/12/2007, 13:37
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: Variables.

La falla que tienes es porque esta escribiendo el caracter 'a' cuando está esperando un entero, la mejor forma de hacer eso es leerlo como un string y luego verificar si ese string contiene caracteres que no correspondan a números.

Supongo que la llave que te falta para cerrar el cuerpo del main es error de copy & paste.

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #3 (permalink)  
Antiguo 20/12/2007, 14:07
 
Fecha de Ingreso: diciembre-2007
Mensajes: 7
Antigüedad: 16 años, 5 meses
Puntos: 0
Re: Variables.

En efecto, la llave que falta es error de copy paste
Es justo a eso lo que me referia, quiero que cuando espere un entero, y le introduzca un caracter, no haya fallos. Dices que lo puedo arreglar con un string, lo cual no tenia ni idea de que existiera xD. Dame alguna idea, ya que sobre string hay bastante pero no se por donde cojerlo :S

Última edición por jared; 20/12/2007 a las 14:20
  #4 (permalink)  
Antiguo 20/12/2007, 15:18
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: Variables.

Comienza tratando de verificar si la cadena que leíste contiene solo caracteres que representen números y luego vas con lo demás. Recuerda que la clase string de C++ te permite acceder a cada elemento tal como si lo hicieras con un arreglo.

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #5 (permalink)  
Antiguo 20/12/2007, 17:23
 
Fecha de Ingreso: diciembre-2007
Mensajes: 7
Antigüedad: 16 años, 5 meses
Puntos: 0
Re: Variables.

Gracias de nuevo, ya tengo arreglado esa parte. Lo hice como dijistes, declarando un string, y comparando. Ahora os propongo el otro dilema que tenia.
Dada la funcion:
int main()
{
char a[900]; int i;
for(i=0; i<899; i++){
a[i]=0;}
cout<<"Introduzca el texto"<<endl;
cin.getline(a, '\n');
for(i=0; i<899; i++){
cout<<a[i];}
}
muestra en pantalla la consola:
Introduzca el texto
hola gente
hola genthola gent











(el espacio en blanco, lo muestra realmente)
Porque solo guarda hasta 9 caracteres?
Saludos.
  #6 (permalink)  
Antiguo 21/12/2007, 08:23
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: Variables.

Si, porque estas imprimiendo un montón de caracteres nulos '\0' o 0, pero mejor usa la funcion strlen() para obtener la longitud de la cadena. No es necesario que inicialices todo en 0, ya que solo vas a usar la cantidad de caracteres que escriba el usuario.

Ya que estás programando en C++ recomiendo que uses la clase string.

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #7 (permalink)  
Antiguo 22/12/2007, 08:13
Avatar de Tera_Byte  
Fecha de Ingreso: junio-2006
Ubicación: Cochabamaba-Bolivia
Mensajes: 55
Antigüedad: 17 años, 10 meses
Puntos: 0
Re: Variables.

Cita:
Iniciado por jared Ver Mensaje
.......
cout<<"Introduzca el texto"<<endl;
cin.getline(a, '\n');
for(i=0; i<899; i++){
cout<<a[i];}
}
muestra en pantalla la consola:
Introduzca el texto
hola gente
hola genthola gent



(el espacio en blanco, lo muestra realmente)
Porque solo guarda hasta 9 caracteres?
Saludos.
Bueno.... la verdad es que no acabo de entender lo que realmente quieres hacer..... creo que seria mejor que expliques lo que quieras hacer en tu program. pero lo q veo, es que quieres imprimir 900 veces lo que escribas en teclado...
yo lo solucionaria
.......

char *Palabra; //asigna una cadena de caracteres de forma dinamica que termina con el retorno de carro o "ENTER"
cout<<"introduzca el texto: "<< endl;
gets(Palabra);
for(int i=0; i<900; i++)
puts(Palabra);
getch();
  #8 (permalink)  
Antiguo 22/12/2007, 08:30
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: Variables.

Cita:
Iniciado por Tera_Byte Ver Mensaje
char *Palabra; //asigna una cadena de caracteres de forma dinamica que termina con el retorno de carro o "ENTER"
cout<<"introduzca el texto: "<< endl;
gets(Palabra);
for(int i=0; i<900; i++)
puts(Palabra);
getch();
jared si se te ocurre usar esa solucion no te olvides de usar memoria dinamica - new/malloc + delete/free - ya que en el codigo ese solo tenes un puntero a caracter (char*) cuyo valor esta indefinido (gets escribira en una direccion invalida casi con toda seguridad y dara una excepcion no controlada cerrando el programa).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #9 (permalink)  
Antiguo 22/12/2007, 08:52
Avatar de Solenbum  
Fecha de Ingreso: noviembre-2007
Mensajes: 45
Antigüedad: 16 años, 5 meses
Puntos: 0
Re: Variables.

porque si usa los flujos cout <<
no usa los mismos de cin >> o el metodo getline de cin en ves de "gets" ??

no entendí eso.
  #10 (permalink)  
Antiguo 22/12/2007, 15:37
 
Fecha de Ingreso: diciembre-2007
Mensajes: 7
Antigüedad: 16 años, 5 meses
Puntos: 0
Re: Variables.

Uff vaya lo siento por no responder, soy un descuidado xP.
Respondo a Tera_Byte, no se trata de un determinado problema, solo os puse ese codigo para probar un caso que si ocurria en mi problema(programa), no exactamente de esa forma, pero que tras varias pruebas averigue que residia ahi el "conflicto". Ten en cuenta que aun estoy verdecillo en el tema.
He probado lo que me comentastes, pero por simple curiosidad, porque se supone que aun no se nada de punteros (son los siguientes temas), y debo solucionarlo sin memoria dinamica y tal...
Gracias a todos, os propongo otra duda, y me parece que tiene mucho que ver con mi primera pregunta que os hice. veran, por varios manuales que he leido, no puedo entender porque ocurre. Sea el programa:
int main()
{
char a[200];
int i;
cout<<"Introduce i: "<<endl;
cin>>i;
cout<<"Introduzca a: "<<endl;
cin.getline(a, 200, '\n');
cout<<i<<endl;
cout<<" os muestro "<<a<<endl;
}
ocurre en pantalla:
Introduce i:
2
Introduzca a:
os muestro 2

Por que siempre que introduzcas algun valor con un cin>>, si despues quisieras introducir otro valor con un cin.getline, se salta una accion(linea)?
Conoceis algun funcion tipo cin.getline, pero para arrays de enteros?(el cin.getline no me deja usarlo con arrays de enteros :S)
He intentado, con lo poco que se probar varias cosas, pero no hay forma :S.
Saludos, y gracias de nuevo.
  #11 (permalink)  
Antiguo 22/12/2007, 15:46
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: Variables.

Cita:
Iniciado por jared Ver Mensaje
Por que siempre que introduzcas algun valor con un cin>>, si despues quisieras introducir otro valor con un cin.getline, se salta una accion(linea)?
Conoceis algun funcion tipo cin.getline, pero para arrays de enteros?(el cin.getline no me deja usarlo con arrays de enteros :S)
He intentado, con lo poco que se probar varias cosas, pero no hay forma :S.
Saludos, y gracias de nuevo.
Me parece que Solenbum pregunto practicamente lo mismo en este hilo.

En tu caso me imagino que gets devuelve una cadena vacia al encontrarse con el fin de linea, probalo pero supongo que podes usar tanto ignore como get antes de getline para solucionarlo.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #12 (permalink)  
Antiguo 22/12/2007, 17:22
 
Fecha de Ingreso: diciembre-2007
Mensajes: 7
Antigüedad: 16 años, 5 meses
Puntos: 0
Re: Variables.

Mil disculpas, y mil gracias a la vez. Por fin, me traia loco. Muchas gracias de nuevo, pedazo de solucion elegante xD==> cin.get();

Saludos.
  #13 (permalink)  
Antiguo 22/12/2007, 17:55
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: Variables.

Cita:
Iniciado por jared Ver Mensaje
Mil disculpas, y mil gracias a la vez. Por fin, me traia loco. Muchas gracias de nuevo, pedazo de solucion elegante xD==> cin.get();
Seguramente haya alguna forma mas elegante (tal vez incluso prescindiendo de ignore) pero este no es mi campo, lee la documentacion y puede que la encuentres.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:09.