Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Problemas con bucles do/while (https://www.clubdelphi.com/foros/showthread.php?t=93074)

nico.white 10-05-2018 00:54:30

Problemas con bucles do/while
 
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:
Código Delphi [-]
 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

Código Delphi [-]
(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,
Código:

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

Código Delphi [-]
  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:
Código Delphi [-]
  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

Cita:

Empezado por nico.white (Mensaje 526191)
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

Cita:

Empezado por Casimiro Notevi (Mensaje 526186)
Código Delphi [-](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

Código Delphi [-]
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:
Có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 :)


La franja horaria es GMT +2. Ahora son las 23:25:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi