Duda con "DO WHILE" y "WHILE"

Iniciado por santibarquero98, 2 Junio 2015, 17:32 PM

0 Miembros y 1 Visitante están viendo este tema.

santibarquero98

Buenas, estoy haciendo ejercicios para resolver algoritmos ya que es algo que necesito practicar y bueno, he logrado hacer el ejercicio, que es el siguiente (copiado y pegado):

Determine el valor de un pasaje en avión , conociendo la distancia a recorrer, el número de días de estancia, y sabiendo que si la distancia a recorrer es superior a 1000 Km y el número de días de estancia es superior a 7, la línea aérea le hace un descuento del 30%. ( el precio por km. es de$35.00)

El código que funciona es el siguiente:

Código (cpp) [Seleccionar]

#include <stdio.h>
int main()
{
/* Se declaran las variables */
int distancia,dias;
int prectotalkm,descuento,valorpasaje;

/* Se pide al usuario la informacion de dos de las variables */
printf("Introduce la distancia.\n"); /* Queda declarada la variable DISTANCIA */
scanf("%d",&distancia);

printf("Introduce el numero de dias. \n"); /* Queda declarada la variable DIAS */
scanf("%d",&dias);
/* Se declaran variables que ya se pueden declarar */
prectotalkm=distancia*35;
descuento=(prectotalkm*30)/100;
valorpasaje=prectotalkm-descuento;

/* COMIENZA EL ALGORITMO */

/*Mientras que la distancia sea menor a 1000 */
while(distancia<1000)
{
printf("El precio del pasaje es %d",prectotalkm);
return 0;
}

/* Mientras que la distancia sea mayor a 1000 */

while(distancia>1000)
{
if(dias>7)
{
printf("El valor del pasaje es %d",valorpasaje);
}
else
{
printf("El valor del pasaje es %d",prectotalkm);
}
return 0;

}
return 0;
}


Pero yo al principio lo he hecho con DO WHILE y no funcionaba, daba siempre el mismo resultado, sin pasar al segundo DO WHILE, siempre hacía el primero y el código "malo" es el siguiente:

Código (cpp) [Seleccionar]

#include <stdio.h>
int main()
{
/* Se declaran las variables */
int distancia,dias;
int prectotalkm,descuento,valorpasaje;

/* Se pide al usuario la informacion de dos de las variables */
printf("Introduce la distancia.\n"); /* Queda declarada la variable DISTANCIA */
scanf("%d",&distancia);

printf("Introduce el numero de dias. \n"); /* Queda declarada la variable DIAS */
scanf("%d",&dias);

/* Se declaran variables que ya se pueden declarar */

prectotalkm=distancia*35;
descuento=(prectotalkm*30)/100;
valorpasaje=prectotalkm-descuento;

/* COMIENZA EL ALGORITMO */

/*Mientras que la distancia sea menor a 1000 */
do
{
printf("El precio del pasaje es %d",prectotalkm);
return 0;
}
while(distancia<1000);

/* Mientras que la distancia sea mayor a 1000 */

do
{
if(dias>7)
{
printf("El valor del pasaje es %d",valorpasaje);
}
else
{
printf("El valor del pasaje es %d",prectotalkm);
}
}
while(distancia>1000);
return 0;
}


¿Alguien me puede explicar porque el primer código con WHILE funciona pero el mismo y con DO WHILE no? Se que DO WHILE comprueba la condición al final pero no se que tiene que ver realmente, debería funcionar, pero eso se lo dejo a los sabios jeje

P.D: ¿Cómo pongo el código con colores para que no sean tan basto de ver? ¿Tengo que hacerlo manual?

Mod: para que el código se vea en colores, debes usar las etiquetas GeSHi, es el cuadro selector que está a la derecha, arriba de los emoticones

pacosn1111

Creo que estás usando el while como si fuese un condicional y no como un bucle, me parece muy mala práctica.

engel lex

efectivamente como dice pacosn1111 usas while mal...

while y do-while son ciclos... sirven para repetir operaciones y las repetirán siempre que la condición se cumpla

esto
Código (cpp) [Seleccionar]
while(distancia<1000)
{
printf("El precio del pasaje es %d",prectotalkm);
return 0;
}

/* Mientras que la distancia sea mayor a 1000 */

while(distancia>1000)
{
if(dias>7)
{
printf("El valor del pasaje es %d",valorpasaje);
}
else
{
printf("El valor del pasaje es %d",prectotalkm);
}
return 0;

}
return 0;

es simplemente absurdo... para que hacer un ciclo que no termina la primera vuelta?

si no es por el return 0, ese ciclo si entra es infinito

para eso existe el if y el if-else

Código (cpp) [Seleccionar]
if(distancia<1000){
printf("El precio del pasaje es %d",prectotalkm);

}else {/* Mientras que la distancia sea mayor o igual a 1000 */

if(dias>7){
printf("El valor del pasaje es %d",valorpasaje);
}else {
printf("El valor del pasaje es %d",prectotalkm);
}
}
return 0;
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

santibarquero98

Y mira que lo he estado pensando mientras escribía el algoritmo...en fin, me quedo con el detalle de repetición porque la verdad que hubiese sido más simple.

Gracias.

edr89

Te recomiendo que utilices constantes para los datos que tienes, sería mejor que declararas el precio y el limite de kilometros, así cuando necesites reajustar los valores solo lo haces en la constante y no en todo el código. Incluso hasta el descuento lo podrias declarar como constante en el preprocesador.

#define PRECIO 35
#define LIMITE 1000 //Kilometros


Me gusta usar ciclos do-while cuando las repeticiones dependen de cierta condición o por ejemplo para validar datos de entrada, si el dato no es correcto repite y repite. ;D