¡Hola de nuevo blackburro! Para que veas todo mas claro: en los archivos adjuntos de mi otro mensaje verás que he subido otro .txt de la documentación de la función calcularDiasRestantes. En este archivo de texto he suprimido toda la explicación de como fuy resolviendo el problema para centrarme en explicar como trabaja la función calcularDiasRestantes.
He descrito una funcionImagino que ya lo sabes, pero por si acaso.. Lo primero que tienes que tener claro es el concepto de función. Cuando defines una función correctamente en cualquier lenguaje de programación, o incluso en Pseint, puedes invocarla desde cualquier punto del programa.
La función hará lo que tenga que hacer. A la función que he descrito, la puedes invocar por ejemplo así.
calcularDiasRestantes(2.5)
Ese 2.5 es un número en coma flotante, que se pasa como parámetro a la función. Si te fijas en la documentación de la función, esta necesita un parámetro de entrada para funcionar. Ese valor será asignado a una variable local de la función llamada litrosActuales.
Y ya dentro de la función, esta hará lo que tenga que hacer.
En este caso, la sentencia de la función "calcularDiasRestantes(2.5)" será sustituida por un número 0-X, que representa los días que aguantará la caravana de Homer con ese combustible.
Así que podríamos hacer algo así en el programa principal:
SI (calcularDiasRestantes(200) >= 50) ENTONCES
Escribir "Con 200 litros la caravana de Homer aguantará al menos 50 días"
SINO
Escribir "Necesitas mas de 200 litros para que la caravana de Homer aguante al menos 50 dias"
He usado un pseudocódigo inventado, en lugar de PsintA la hora de crear un programa, sobre todo cuando el progama es muy complicado como puede ser un videojuego, un equipo de analistas y diseñadores se encargan de documentar detalladamente como funcionara el programa. Luego serán los programadores los que se encarguen de traducir ese pseudocodigo a cualquier lenguaje de programación, por ejemplo, te presento el programa en javascript:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximun-scale=1, minimun-scale=1">
<title>¡Working with JavaScript!</title>
</head>
<body>
<script>
// ¿Qué hace la función?
// Retorna cuantos días aguantará la caravana de Homer con el combustible especificado
// y segun unos criterios de consumo internos.
//
// ¿Cúales son los parametros de entrada?
// 1) litrosActuales: Número real. Cantidad de litros restantes de la caravana. Puede tener un rango de 0..X (desconocido)
//
function calcularDiasRestantes(litrosActuales){
var dias = 1;
litrosActuales -= 3.5;
// La comprobación al bucle prohibe la entrada si el combustible ni siquiera aguanta para un día
while(litrosActuales > 0){
// Aumentamos en 1 la cantidad de días que aguanta la caravana
dias++;
// Restamos el combustible correspondiente dependiendo del día
if(dias % 3 == 0) litrosActuales -= 5;
else litrosActuales -= 3.5;
}
return dias-1;
}
if(calcularDiasRestantes(200) >= 50){
document.write('La caravana de Homer aguantará al menos 50 dias con 200 litros de combustible.');
}else{
document.write('La caravana de Homer necesita más de 200 litros para aguantar al menos 50 dias.');
}
</script>
</body>
</html>
Este programa muestra por pantalla lo siguiente:
La caravana de Homer aguantará al menos 50 dias con 200 litros de combustible.
Así que si quieres que funcione en Psint, tendrás que traducir el algoritmo para que Psint lo pueda entender. Porque el pseudocodigo que he utilizado yo, es completamente inventado. (Esta basado en C++)
Pregunta numero 2: empiezo contestando la segundaLa operación (dias % 3) da como resultado el resto, o residuo de la división de la variable dias entre 3.
7 / 3 = 2 (resultado de la división sin decimales)
7 % 3 = 1 (resto de la división)
2 * 3 + 1 = 7
En el número 7, cabe el número 3 dos veces y nos falta 1 para llegar a 7.
¿Por qué hago esto? Porque con esa operación cada tres días (los múltiplos de 3), el resultado del MODULO dara 0
Así que si (dias % 3) == 0, nos encontramos en el caso de que ese día Homer gasta 5 litros en lugar de 3.5
¿Entendido?
Ahora respecto a la pregunta número 1Las únicas variables que utiliza la función son las siguientes:
litrosActuales -> llega como parámetro de entrada
dias -> se crea como variable auxiliar dentro de la función.
Esto:
Dia 0: -3.5l
Dia 1: -3.5l
Dia 2: -3.5l --> Este es el tercer día y deberían de haberse restado 5 litros.
Dia 3: -5l
No son variables. Como sabrás mi función va restando litros a la variable litrosActuales hasta que esta este por debajo de los 0 litros.
Lo que has citado es una explicación de por que nos viene bien que la variable dias empieze en 1, aunque al retornar los días tengamos que restar 1.
Suponiendo que el combustible que tiene la caravana aguanta al menos 4 días, lo que debería pasar es esto:
litrosActuales -= 3.5
litrosActuales -= 3.5
litrosActuales -= 5
litrosActuales -= 3.5
Pero con la función que hemos creado, la comprobación dias % 3 == 0, mostrará lo siguiente en caso de que la variable dias empiece por 0:
litrosActuales -= 3.5 (dias = 0)
litrosActuales -= 3.5 (dias = 1) -> 1 % 3 == 0 // FALSO
litrosActuales -= 3.5 (dias = 2) -> 2 % 3 == 0 // FALSO
litrosActuales -= 5 (dias = 3) -> 3 % 3 == 0 // VERDADERO (Pero es el 4º dia)
...¡Se que es muy extenso! Pero es que no se me ocurre mejor manera de explicarlo todo para que lo puedas entender con facilidad. Mucha suerte con eso y si consigues hacer el programa en Psint compartelo por aquí, a ver como te ha quedado.
Salu2