| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
Mijail
Registrado: 02 Jul 2007 Mensajes: 30
| Publicado: 23/08/2007 8:53 am | | | Título: do...while! no goto |
| Bueno, el caso es que me recomendaron que no usase mucho lo del goto y usar mas el do...while y while pero es que no se como hacerlo.
este es el principio del código:
| Código: |
#include <stdio.h> #include <conio.c>
int main() { float distancia; float vel; float horas; float minutos; int horas_ent; int minutos_ent; float seg; int seg_ent; int a; printf("\t\t\tPROYECTO COCHE\n\n\n" ); fflush(stdout); printf( "Escoja una de las siguientes opciones marcando el numero que le corresponde\n\n" ); printf( "\t1.-Calcular tiempo introduciendo la distancia y la velocidad media\n" ); printf( "\t2.-Calcular velocidad mediana introduciendo el tiempo y la distancia\n" ); printf( "\t3.-Calcular la distancia introduciendo el tiempo y la velocidad media" ); printf( "\n\n\nOpcion introducida: " ); scanf( "%i", &a); switch(a) { case 1: clrscr(); printf( "Introduzca distancia a recorrer (en kilometros): " ); fflush(stdout); scanf( "%f", &distancia); printf( "\nIntroduzca velocidad media (en K\\H): " ); scanf( "%f", &vel); horas= distancia / vel; horas_ent= horas; minutos = (horas - horas_ent) * 60; minutos_ent= minutos; seg= (minutos - minutos_ent) * 60; seg_ent= seg; printf("\nEl tiempo total de recorrido es de %i hora\\s, %i minuto\\s y %i segundo\\s.", horas_ent, minutos_ent, seg_ent); break;
|
como puedo volver al menu principal sin usar goto y usando do...while??
Gracias por todo! |
|
| Volver arriba | |
 |
v4r3t
Registrado: 06 Mar 2007 Mensajes: 38
| Publicado: 23/08/2007 10:00 am | | | Título: |
| Pues antes de las opciones a introducir pones el do, y si quieres que haya una opcion de salida o condicion de salida, pones while(condicion), sino pon while(1) mismo para ejecutarse indefinidas veces... ejemplo:
| Código: | do { printf("1.hacer tal cosa..\n"); prinf("2.salir\n"); scanf("%d",&a); switch(a) { ...... } }while (a!=2);
|
No sé si me he explicado bien... |
|
| Volver arriba | |
 |
spesmod
Registrado: 23 Ago 2007 Mensajes: 33
| Publicado: 23/08/2007 10:14 am | | | Título: posible respuesta |
| bueno no he probado tu codigo, ni el de la correccion, pero si el tuyo no tiene errores, el mio va a funcionar bien, las correciones que hice estan en rojo, el do-while va a ejecutar el codigo en su interior comprobando si la condicion if se cumple, si no se cumple se la salta, y luego se comprueba la condicion del do-while y el cuerpo de este se ejecutara hasta que "a = 4" que en el menu corresponde a salir. espero q te sirva, practica!
#include <stdio.h> #include <conio.h> //------>correccion es con "h" no con "c"
int main() { float distancia; float vel; float horas; float minutos; int horas_ent; int minutos_ent; float seg; int seg_ent; int a;
do{ printf("\t\t\tPROYECTO COCHE\n\n\n" ); fflush(stdout); printf( "Escoja una de las siguientes opciones marcando el numero que le corresponde\n\n" ); printf( "\t1.-Calcular tiempo introduciendo la distancia y la velocidad media\n" ); printf( "\t2.-Calcular velocidad mediana introduciendo el tiempo y la distancia\n" ); printf( "\t3.-Calcular la distancia introduciendo el tiempo y la velocidad media" ); printf( "\t4.-Salir" ); printf( "\n\n\nOpcion introducida: " ); scanf( "%i", &a); if(a!=4) { switch(a) { case 1: clrscr(); printf( "Introduzca distancia a recorrer (en kilometros): " ); fflush(stdout); scanf( "%f", &distancia); printf( "\nIntroduzca velocidad media (en K\\H): " ); scanf( "%f", &vel);
horas= distancia / vel; horas_ent= horas;
minutos = (horas - horas_ent) * 60; minutos_ent= minutos;
seg= (minutos - minutos_ent) * 60; seg_ent= seg;
printf("\nEl tiempo total de recorrido es de %i hora\\s, %i minuto\\s y %i segundo\\s.", horas_ent, minutos_ent, seg_ent); getch(); //----------> agregas este getch break; } }while(a!=4); //-----------> mientras q "a" no sea 4 de lo contrario //------------> el menu finaliza _________________ |--A--Q--U--A--|
|
|
| Volver arriba | |
 |
|
Mijail
Registrado: 02 Jul 2007 Mensajes: 30
| Publicado: 23/08/2007 2:25 pm | | | Título: |
| Ok gracias por las respuestas, ya probaré
lo del conio.c nose porque a mi solo me funciona poniendo el .c y no el .h
me olvidé de modificarlo al postearlo
Gracias por todo!!!! |
|
| Volver arriba | |
 |
Mijail
Registrado: 02 Jul 2007 Mensajes: 30
| Publicado: 23/08/2007 3:16 pm | | | Título: |
| Al final lo he conseguido usando un simple bucle for:
| Código: | #include <stdio.h> #include <conio.h>
int main() { float distancia; float vel; float horas; float minutos; int horas_ent; int minutos_ent; float seg; int seg_ent; int a; { for(;EOF && a!=4;) { clrscr(); printf("\t\t\tPROYECTO COCHE\n\n\n" ); fflush(stdout); printf( "Escoja una de las siguientes opciones marcando el numero que le corresponde\n\n" ); printf( "\t1.-Calcular tiempo introduciendo la distancia y la velocidad media\n" ); printf( "\t2.-Calcular velocidad mediana introduciendo el tiempo y la distancia\n" ); printf( "\t3.-Calcular la distancia introduciendo el tiempo y la velocidad media\n" ); printf( "\t4.-Salir" ); printf( "\n\n\nOpcion introducida: " ); scanf( "%i", &a); switch(a) { case 1: clrscr(); printf( "Introduzca distancia a recorrer (en kilometros): " ); fflush(stdout); scanf( "%f", &distancia); printf( "\nIntroduzca velocidad media (en K\\H): " ); scanf( "%f", &vel); horas= distancia / vel; horas_ent= horas; minutos = (horas - horas_ent) * 60; minutos_ent= minutos; seg= (minutos - minutos_ent) * 60; seg_ent= seg; printf("\nEl tiempo total de recorrido es de %i hora\\s, %i minuto\\s y %i segundo\\s.", horas_ent, minutos_ent, seg_ent); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n-----------------------------------Mijail---------------------------------------"); getch(); break; case 2: clrscr(); printf( "Introduzca el tiempo total en el que ha recorrido el trayecto,\nseparando las hora minutos y segundos por espacios: "); getch(); break; } } }
return 0; }
|
En el trozo de codigo:
| Código: | for(;EOF && a!=4;) |
Le digo que haga un bucle si es el final del programa i a no es 4, esto genera que la primera vez en que se ejecute el bucle no ejecute lo de debajo dado que no es el final del programa, entonces se finaliza el programa y como que se finaliza, pues la norma se cumple y ejecute lo de debajo xD no se si me explico.
Bueno esto hace que cada vez que termine un case n vuelva al menu principal.
Cuando acabe el programa ya lo colgaré aqui
Gracias por todo!! |
|
| Volver arriba | |
 |
digies
Registrado: 18 Nov 2005 Mensajes: 241 Ubicación: Cono Sur
| Publicado: 23/08/2007 3:22 pm | | | Título: |
| Hola
Con respecto al conio, te funciona con la extención .c y no con la extensión .h porque estás utilizando un compilador que no es de Borland (no será el Dev-Cpp?). El conio.c emula al conio.h del señor Borland. Acaso no te acuerdas si a tu compilador le instalaste el conio.c??? ¡¡¡Uy que memoria!!!
faq: http://www.conclase.net/c/devcpp.php?art=conio
Un saludo |
|
| Volver arriba | |
 |
|
Mijail
Registrado: 02 Jul 2007 Mensajes: 30
| Publicado: 23/08/2007 3:43 pm | | | Título: |
| xD ay si, es verdad! xD, lo que pasa es que deje el aprendizaje de C por falta de tiempo hace unos meses y he vuelto, y seguía teniendo la mania de poner conio.c en vez de conio.h pero no me acordaba por qué xD.
Y sí, has acertado, uso Dev-c++ jeje. |
|
| Volver arriba | |
 |
v4r3t
Registrado: 06 Mar 2007 Mensajes: 38
| Publicado: 23/08/2007 4:46 pm | | | Título: |
| | ¿Pero te has aclarado con el do...while()? Porque ese era el tema... |
|
| Volver arriba | |
 |
Mijail
Registrado: 02 Jul 2007 Mensajes: 30
| Publicado: 24/08/2007 3:48 am | | | Título: |
| La verdad es que no, al encontrar otra solucion he dejado el tema aparte cosa que no deberia hacer. Si puedes volvermelo a contar con más detalle te lo agradeceré.
Gracias por todo!! |
|
| Volver arriba | |
 |
|
rir3760

Registrado: 01 Oct 2004 Mensajes: 3657 Ubicación: Mexico
| Publicado: 24/08/2007 10:00 am | | | Título: |
| | Mijail escribió: | En el trozo de codigo:
| Código: | for(;EOF && a!=4;) |
Le digo que haga un bucle si es el final del programa |
En buen plan eso esta muy mal ya que no es por esa razon que se ejecuta el bucle. La macro EOF antes de que se compile tu programa se sustituye por una constante entera menor que cero y que usualmente es -1. En otras palabras lo que el compilador recibe es este bucle:
| Código: | for(; -1 && a != 4; ) |
Como todo valor distinto de cero se considera verdadero en C la primera parte del if es verdadera y si se ejecutan las sentencias a continuacion del bucle for depende enteramente del valor que tenga la variable "a", lo que nos lleva al siguiente error ...
... este es que no le das un valor inicial a la variable "a" esto conlleva a que esa variable inicia con un valor no definido o "basura", en tu caso es un valor distinto de cuatro (ya que si no lo fuera no se ejecutaria el bucle).
Ese bucle for lo tendrias que sustituir por otro mas o menos asi:
| Código: | for(a = 0; a != 4; ) |
O si todavia quieres utilizar un bucle do ... while tu programa modificado (el ultimo):
| Código: | #include <stdio.h> #include <stdlib.h> /* EXIT_SUCCESS Y EXIT_FAILURE */
int main(void) { float distancia; float vel;
float horas; float minutos; float seg; int horas_ent; int minutos_ent; int seg_ent; int a; a = 0; do { printf("\t\t\tPROYECTO COCHE\n\n\n" ); printf("Escoja una de las siguientes opciones marcando el numero que le corresponde\n\n" ); printf("\t1.-Calcular tiempo introduciendo la distancia y la velocidad media\n" ); printf("\t2.-Calcular velocidad mediana introduciendo el tiempo y la distancia\n" ); printf("\t3.-Calcular la distancia introduciendo el tiempo y la velocidad media\n" ); printf("\t4.-Salir" ); printf("\n\n\nOpcion introducida: " ); if (scanf("%i", &a) != 1) return EXIT_FAILURE; switch(a){ case 1: printf( "Introduzca distancia a recorrer (en kilometros): " ); fflush(stdout); scanf( "%f", &distancia); printf( "\nIntroduzca velocidad media (en K\\H): " ); scanf( "%f", &vel); horas = distancia / vel; horas_ent = horas; minutos = (horas - horas_ent) * 60; minutos_ent = minutos; seg = (minutos - minutos_ent) * 60; seg_ent = seg; printf("\nEl tiempo total de recorrido es de %i hora\\s, %i minuto\\s y %i segundo\\s.", horas_ent, minutos_ent, seg_ent); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n-----------------------------------Mijail---------------------------------------"); break; case 2: printf( "Introduzca el tiempo total en el que ha recorrido el trayecto,\nseparando las hora minutos y segundos por espacios: "); break; } }while (a != 4); return EXIT_SUCCESS; }
|
Ya por ultimo si el nombre del archivo de inclusion correcto es "conio.h", "conio.c", etc. depende de la version de Dev-C++ que uno utilize ya que el soporte de conio ha variado desde la 4.0 hasta la (al parecer ultima) 5.0 Beta (y que en realidad es la 4.9.9.2).
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
|
| Volver arriba | |
 |
Mijail
Registrado: 02 Jul 2007 Mensajes: 30
| Publicado: 25/08/2007 3:02 am | | | Título: |
| Gracias por contestar
un pregunta, el return EXIT_FAILURE hace que se termine el programa, o que hace?
Gracias de nuevo |
|
| Volver arriba | |
 |
rir3760

Registrado: 01 Oct 2004 Mensajes: 3657 Ubicación: Mexico
| Publicado: 25/08/2007 9:13 am | | | Título: |
| Me imagino que te refieres a esta parte del programa:
| Código: | printf("\n\n\nOpcion introducida: " ); if (scanf("%i", &a) != 1) return EXIT_FAILURE; |
Es una verificacion muy basica, lo que hace es tomar el valor de retorno de scanf y asegurarse de que sea igual a uno. Esto porque scanf devuelve el numero de conversiones que pudo realizar con exito y en el caso de nuestro programa este resultado debe ser forzosamente igual a uno (si no lo es significa que hubo un error o se genero la señal de fin de archivo).
Si ese no es el caso se termina el programa mediante la sentencia "return EXIT_FAILURE;", EXIT_FAILURE es una macro definida en stdio.h que le indica al anfitrion (usualmente un SO) que la aplicacion termino por algun error.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
|
| Volver arriba | |
 |
|
Mijail
Registrado: 02 Jul 2007 Mensajes: 30
| Publicado: 28/08/2007 6:12 am | | | Título: |
| | Ok, gracias!! |
|
| Volver arriba | |
 |
|
|