Practico 8 ejercicio 3 parte a

Practico 8 ejercicio 3 parte a

de Gonzalo Cabrera Quintero -
Número de respuestas: 4
No logro llegar a la salida que plantea la solucion que es la misma que da el compilador:

el razonamiento que hice es el siguiente: 
num := 1; aux := 0; temp := 0; (se inicializan con ese valor)
pascal (num, temp); = pascal (1, 0);

en el procedimiento es:
temp := 2 * num + suma = 2*1 + 0 = 2
aux := temp * suma = 2*0 = 0
num := num + 1 = 1 + 1 = 2
suma := suma + num = 0 + 2 = 2
writeln (temp, aux, num, suma) = writeln (2, 0, 2, 2)

luego volvemos al programa principal:
writeln (num, aux, temp) = writeln (1, 0, 2) {temp pasa a valer 2 ya que en el procedimiento fue pasada por referencia y num = 1 ya que no se modifico en el procedimiento porque fue pasada por valor}
temp := temp + 1 = 2 + 1 = 3
pascal (temp, num) = pascal (3, 1)

en el procedimiento es:
temp := 2 * num + suma = 2*3 + 1 = 7
aux := temp * suma = 7*1 = 7
num := num + 1 = 3 + 1 = 4
suma := suma + num = 1 + 4 = 5
writeln (temp, aux, num, suma) = writeln (7, 7, 4, 5)

volvemos al programa principal:
writeln (num, aux, temp) = wirteln (5, 0, 3)

osea que la salida en si seria:
2 0 2 2
1 0 2
7 7 4 5
5 0 3

sin embargo cuando compilo da lo siguiente: 
4 4 2 4
1 0 4
11 11 6 7
7 0 11

¿cual seria el error que estoy cometiendo?

Saludos, Gonzalo

En respuesta a Gonzalo Cabrera Quintero

Re: Practico 8 ejercicio 3 parte a

de Guillermo Rey Martusciello -
Buenas.
En la primera parte del razonamiento que haces, cuando llamas por primera vez al procedimiento pascal lo llamas con num y temp. A num lo pasas por valor, es decir que mientras se ejecuta el metodo se crea una nueva variable que tiene el valor que tenia num en ese momento. Con temp no pasa lo mismo, temp lo pasan por parametro, es decir, dentro del procedimiento cuando usas la variable suma, estas referenciando a la variable del programa principal llamada temp, por lo tanto "aux := temp * suma = 2*0 = 0" es incorrecto, ya que cuando en la instruccion de arriba hiciste "temp :=2*num+suma" temp quedo con el valor 2 y con esto suma tambien (porque ambos identificadores referencian al mismo espacio de memoria, son la misma variable) quedo con valor 2. Entonces "aux := temp * suma = 2*2 = 4". Luego cuando haces "suma := suma + num" en realidad es igual a  "2 + 2 = 4" resultando en que cuando haces el writeln(temp, aux, num, suma) te da 4 4 2 4.
Cuando termina el procedimiento y volves al codigo, temp vale 4, por lo tanto en el writeln (num, aux, temp) se escribe 1 0 4.
En el ultimo paso de tu razonamiento arrastras error, ya que temp se pasa con valor 5.

Fijate si con esa explicacion te queda un poco mas claro, si no es el caso volve a preguntar!
Saludos.
En respuesta a Guillermo Rey Martusciello

Re: Practico 8 ejercicio 3 parte a

de Gonzalo Cabrera Quintero -
La explicacion me genera dudas.
procedure pascal (num : integer; var suma : integer);
var aux : integer;
begin
temp := 2 * num + suma;
aux := temp * suma;
num := num + 1;
suma := suma + num;
writeln (temp, aux, num, suma)
end

si suma es igual a temp ya que temp fue pasada por referencia y su valor se le asignó a suma, entonces como temp := 0, suma tambien, no? 
En respuesta a Gonzalo Cabrera Quintero

Re: Practico 8 ejercicio 3 parte a

de Gonzalo Cabrera Quintero -
o lo que pasa es que cuando temp := 2*num + suma = 2*1 + 0 = 2, la variable suma se actualiza como suma := 2? pero aunque fuese asi, temp seguiria valiendo 2 y cuando aplicas el writeln, seria writeln(2, 4, 2, 4) y no (4, 4, 2, 4)
En respuesta a Gonzalo Cabrera Quintero

Re: Practico 8 ejercicio 3 parte a

de Guillermo Rey Martusciello -
Es casi lo que decis en este mensaje, la diferencia es que no lo pensaria como que "se actualiza la variable suma", ya que en esa parte de la ejecucion suma es lo mismo que temp, exactamente lo mismo. Luego cuando decis que seguiria siendo 2 no es correcto, ya que antes del writeln haces "suma := suma + num" por lo tanto suma (y temp, porque es exactamente lo mismo) pasa a ser 4, resultando en que el writeln(temp, aux, num, suma) imprima 4 4 2 4.