PDA

Ver la Versión Completa : Problemas con bucles do/while


nico.white
10-05-2018, 00:54:30
Hola colegas, buenos dias soy bastante nuevo en el tema y no logro encontrar el error en esto.

intente de todo, y no logro darme cuenta del error

el enunciado dice así.
Ingreso la cantidad de km a recorrer y la velocidad crucero.
si la velocidad crucero del auto es menor a 110 km/h
a los 50 litros de combustible con los que empieza el auto se le restaran 0,33litros cada 5 km.
si es mayor a 110 se le restara 0,5 litros cada 5 km
si me quedo sin combustible tengo q mostrar la cantidad de km que recorri

aca va mí código

Variabes:
kmar:real;
velc:integer;
fuel:real;
kmfinal:real;

fuel:=50;
velc:=StrToInt(vel_C.caption);
kmar:=strToInt(km.caption);
if (velc<=110) then
begin
begin
while (fuel>0)do

(fuel-0.33)
kmfinal=kmfinal-5;
end;
end;

showmessage ('km recorridos'(floattostring(kmfinal));
end.

Casimiro Notevi
10-05-2018, 01:17:32
(fuel-0.33)Esa línea no hace nada, ¿no?

nico.white
10-05-2018, 02:09:31
esa linea resta 0,33 litros a los litros iniciales que son 50 litros.

ecfisa
10-05-2018, 04:10:51
Hola.

Esboza la idea en papel y lápiz tratando de seguir paso a paso lo que te solicitan,

PROCEDIMIENTO consumo

VARIABLES
litros, kilometros, velocidad, consumo : FLOTANTE

COMENZAR

litros <- 50
leer (kilometros, velocidad)

si velocidad < 110 entonces
consumo <- kilometros / 5 * 0.33
si no
consumo <- kilometros / 5 * 0.50

escribir ("Combustible consumido:", consumo)
escribir ("Combustible restante :", litros - consumo)

FIN

luego no es tán dificil codificarlo en Pascal.

Saludos :)

nico.white
10-05-2018, 07:30:45
El usuario deberá indicar cuántos km recorrerá.
cada 5 km (a una velocidad constante,llamémosla crucero, menor a 110km/h) que el simulador reduzca 0,33l (l=litro) de
combustible.
Si es mayor (pero constante) que 110km/h, el gasto de combustible debería ser
0,5l por cada 5km.
El nivel de combustible deberá ser full (lleno), con 50l al iniciar el viaje.
necesario que se controle si el tanque alcanza para realizar el viaje propuesto
(y mediante una ventana emergente: indicar tal situación).

el ejercicio debe resolverse con for, while, o repeat a eleccion

f= fuel
fuel =contador

f:=50;
kmfinal:=0;
velc:=StrToInt(vel_C.caption);
kmar:=strToInt(km.caption);
if (velc <=110) then
begin
for fuel:=50 downto 0
do
repeat
f:=f-0.33;
resu:=kmar-5;
until f=0;
kmsr.text:= floatToStr(resu);
showmessage('sin combustible');
showmessage(floattostr(f));
end
else if (velc>110) then
begin
for fuel:=50 downto 0
do
repeat
f:=f-0.5;
resu:=kmar-5;
until f=0;
kmsr.text:= floatToStr(resu);
showmessage('sin combustible');
showmessage(floattostr(f));


end;
end;


entra en un bucle infinito.
me doy por vencido (por hoy)

agradezco su ayuda

Ñuño Martínez
10-05-2018, 11:32:25
Usar el operador de igualdad con flotantes no es muy buena idea. Ten en cuenta que los ordenadores son pésimos haciendo cálculos con fracciones cuyo denominador no es potencia de dos; un ordenador es incapaz de representar con exactitud el valor 0'1, por ejemplo, y menos aún 49'77. Deberías cambiar el "UNTIL f=0" por "UNTIL f <= 0", que es la única manera de asegurarte.

Por otro lado, cuida la indentación; es muy difícil seguir el código tal como tú lo escribes. Te lo reformateo para que veas la diferencia:

f := 50;
kmfinal := 0;
velc := StrToInt (vel_C.Caption);
kmar := StrToInt (km.Caption);
IF velc <= 110 THEN
BEGIN
FOR fuel := 50 DOWNTO 0 DO
REPEAT
f := f - 0.33;
resu := kmar - 5
UNTIL f <= 0; { <-- ¿Flotante? }
kmsr.Text := FloatToStr (resu);
ShowMessage ('sin combustible');
ShowMessage (FloatToStr (f))
END
ELSE { IF velc > 110 THEN <-- Este IF no es necesario. }
BEGIN
FOR fuel := 50 DOWNTO 0 DO
REPEAT
f := f - 0.5;
resu := kmar - 5
UNTIL f <= 0; { <-- ¿Flotante? }
kmsr.Text := FloatToStr (resu);
ShowMessage ('sin combustible');
ShowMessage (floattostr (f))
END
END;

ecfisa
10-05-2018, 13:05:51
El usuario deberá indicar cuántos km recorrerá.
cada 5 km (a una velocidad constante,llamémosla crucero, menor a 110km/h) que el simulador reduzca 0,33l (l=litro) de
combustible.
...

¡Ha!, pero ese es un planteo muy diferente al que hiciste en el primer mensaje...

Saludos :)

ElDioni
10-05-2018, 14:16:46
Código Delphi [-] (https://www.clubdelphi.com/foros/#)(fuel-0.33)

Esa línea no hace nada, ¿no?


Supongo que a lo que se refería el compañero Casimiro es que debería ser

fuel:=fuel-0.33

para que vaya acumulandose la resta en la misma variable.

engranaje
10-05-2018, 14:18:42
Entiendo que el ejercicio es para que practiques los bucles, para resolver el problema indicado realmente no haría falta ninguno. Fijate en que en el enunciado se te fuerza a utilizar una entre 3 posibilidades (for,while,repeat). Solo necesitas utilizar uno, aunque para familiarizarte con ellos creo que estaría bien que resolvieses el problema de las tres formas posibles, una con cada bucle.

Creo que el problema que tienes es que aún no los entiendes bien. Temo que cualquier pista que podamos darte te desvie del proposito del problema que es que te esfuerces en encontrar una solución y aprendas en el proceso. Se ve que te esfuerzas en aprender por como has planteado la pregunta y porque has puesto lo que llevas averiguado. Intentalo un poco más, te recomiendo de veras que utilices un solo bucle en el proceso, el que tu quieras, pero solo 1.

Una cosilla mas, si ves que hay partes del código que son iguales y repites 2 veces, intenta cambiar el código para escribirlas una sola vez.

De veras que lo mas dificil y divertido de esto de programar es pelearse con un problema hasta encontrarle la solución. Por aquí hay unos cuantos hilos que lo demuestran.

ecfisa
10-05-2018, 17:08:10
Hola.

De la última consulta entiendo que el combustible incial es constante (50) y debes ingresar los kilometros que pretendes lograr así como la velocidad a que conduciras.
El algorítmo debe ir mostrando el kilometraje realizado y el combustible restante (o el consumido para el caso es lo mismo) y de terminarse el combustible antes de realizar el kilometraje pretendido debe avisarlo con un mensaje. ¿ Es correcto ?

Claro está que conociendo el consumo a la velocidad ingresada sabemos a priori si podrá realizar el kilometraje pretendido, de todos modos a modo de guía un ejemplo en pseudocódigo:

PROCEDIMIENTO consumo

VARIABLES
litros, velocidad, consumo: FLOTANTE
kilometros, aux: ENTERO

COMENZAR
litros <- 50
aux <- 0;

leer (kilometros, velocidad)

si velocidad < 110 entonces
consumo = 0.33
si no
consumo = 0.5

mientras ( aux <= kilometros ) ^ ( litros >= 0 ) hacer
comenzar
si litros < consumo entonces
escribir("¡ Tanque vacío ! recorrio:", aux, "km")
si no
escribir("km:", aux, "lt:", litros) { km y litros restantes }
aux = aux + 5;
litros = litros - consumo;
fin

FIN


Saludos :)