Notas2doParciaLogical2doCuat2010

1 view
Skip to first unread message

rodrigo....@gmail.com

unread,
Dec 5, 2010, 10:25:36 PM12/5/10
to logprog...@googlegroups.com
Archivos adjuntos: Notas2doParciaLogical2doCuat2010
Mensaje de rodrigo....@gmail.com:
¡Hola!

Aquí están las notas del segundo parcial de lógica. Las notas están separadas por ejercicio y luego la nota total, una I significa desaprobado. 

Les voy a explicar el por qué de algunos ejercicios desaprobados. El criterio de corrección con respecto a los arreglos fue el siguiente: si un arreglo era accedido si utilizar un FOR, se tomó como mal, porque la idea es que se acceda a través de un FOR. Por ejemplo, muchos hicieron esto:

(que no solo es poco elegante, sino que además, ¿qué hubieran hecho si eran 1000 elementos?)

s = A(0)+A(1)+A(2)+A(3)+A(4)+A(5)+A(6)+A(7)+A(8)+A(9)

Cuando podían hacer esto:

FOR  i = 0 to 9
   s = s + A(i)
next

Por otro lado, vi también soluciones de esta clase:

IF a(0) mod 2 = 1 AND a(1) mod 2 = 1 AND a(2) mod 2 = 1 AND a(3) mod 2 = 1 AND a(4) mod 2 = 1 AND a(5) mod 2 = 1 AND a(6) mod 2 = 1 AND a(7) mod 2 = 1 AND a(8) mod 2 = 1 AND a(9) mod 2 = 1 THEN
 ...
END IF

Cuando esto (y lo repetimos muchas veces en clase) puede ser resuelto de una manera mucho más elegante. Una alternativa es:

cuantos_cumplen = 0

FOR i = 0 to 9
  IF a(i) MOD 2 = 1 THEN cuantos_cumplen = cuantos_cumplen + 1
NEXT

IF cuantos_cumplen = 10 THEN 
 ...
END IF 

O sino, mucho más facil, probar la inversa:

cumple = 1
FOR i = 0 TO 9
   IF NOT a(i) MOD 2 = 1 THEN cumple = 0
NEXT

IF cumple = 1 THEN
  ...
END IF

Por último, cosas como

INPUT a
INPUT b
INPUT c
INPUT d
INPUT e
INPUT f
INPUT g
INPUT h
INPUT i
INPUT j

resulta totalmente inaceptable.

Otra cosa que vi fue la siguiente, por ejemplo, para probar que la mitad del arreglo era creciente, hacían

FOR i = 0 to 5
   IF a(i) < a(i+1) THEN PRINT "Es creciente"
NEXT

Esto repite "Es creciente" cada vez que encuentra un par a(i),a(i+1) que cumple con la propiedad, pero no evalúa la totalidad del arreglo. ¿cómo se puede resolver? con alguno de los métodos vistos arriba, por ejemplo:

es_creciente = 1

FOR i = 0 TO 5
  IF NOT a(i) < a(i+1) THEN es_creciente = 0
NEXT

IF es_creciente = 1 THEN "Es creciente"

Por otro lado, en los enunciados en los que se dice algo como "mostrar un mensaje si un arreglo cumple x e y propiedad" el mensaje debe ser mostrado si el arreglo cumple AMBAS propiedades (es decir x AND y). y no un mensaje para cada una de ellas. Normalmente los consideré como bien, con una advertencia cuando hacían eso.

Para aquellos que no hayan usado un FOR sobre los arreglos, normalmente las soluciones no estaban mal, con lo cual no deben preocuparse mucho para el recuperatorio, sí tienen que practicar el resolver iterando sobre el arreglo.

Para aquellos que tengan que recuperar, voy a intentar averiguar mañana cuándo podemos tener el recuperatorio (después del miercoles). ¿alguno no podría venir ir viernes a la mañana?

Saludos!
rodrigo



Google Docs facilita la creación, el almacenamiento y el uso compartido de hojas de cálculo, presentaciones y documentos online.
Logotipo de Google Docs
Notas2doParciaLogical2doCuat2010.pdf

Leo .

unread,
Dec 5, 2010, 10:42:43 PM12/5/10
to logprog...@googlegroups.com
Hola RODRIGO soy SANTOS LEANDRO, queria saber si por favor puedo ver mi examen,  mepusiste que las 4 y 5 estaban BIen , pero q la 1,2,3 estaban mal y yo me acuerdo que la 1 y la 3 las probe en el programa y me funciono perfectamente y no hice eso de sumar uno por uno sino con 2 for los hice, quisiera saber si puedo vermi examen estoy segurisimo que estaban bien los ejercicios 1,3, quizas no viste las ultimas hojas que lo agrege al final .

gracias

atte: leandro santos.

Date: Mon, 6 Dec 2010 03:25:36 +0000
Subject: Notas2doParciaLogical2doCuat2010
From: rodrigo....@gmail.com
To: logprog...@googlegroups.com
--
Has recibido este mensaje porque estás suscrito al grupo "Lógica de programación" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a logprog...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a logprogramaci...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/logprogramacion?hl=es.

Rodrigo Pelorosso

unread,
Dec 6, 2010, 8:53:27 AM12/6/10
to logprog...@googlegroups.com

Hola Leandro!,

No hay problema, en cuanto estemos en DV podés verlo. Te cuento, en el primer ejercicio, tu resolución es

CLS
FOR i = 0 TO 9
  INPUT NUM(i)
NEXT

FOR i = 0 TO 4
  S = NUM(i)
NEXT

FOR i = 5 TO 9
  D = NUM(i)
NEXT

IF S = -D THEN
   PRINT "Son iguales"
ELSE
   PRINT "No son iguales"
END IF

Que lo que hace es mostrar el mensaje "Son iguales" sólo cuando NUM(5) = -NUM(10), porque

FOR i = 0 TO 4
  S = NUM(i)
NEXT

pisa el valor de S en cada iteración, asignandole NUM(i). Como en la última iteración i = 4, el último valor asignado a S es,cuando i = 5 (la condición de corte), NUM(5).

Algo similar pasa con 

FOR i = 5 TO 9
  D = NUM(i)
NEXT

Aquí, el último valor de i es 9, y por lo tanto el corte del FOR ocurre con i = 10, y por eso el último valor asignado a D es NUM(10). 

Luego, 

IF S = -D THEN
   PRINT "Son iguales"
ELSE
   PRINT "No son iguales"
END IF

es equivalente a

IF NUM(5) = -NUM(10) THEN
   PRINT "Son iguales"
ELSE
   PRINT "No son iguales"
END IF

Que no sólo no comprueba que la 1er mitad del arreglo sea igual a la 2da con signo cambiado, sino que verifica esa condición para un valor dentro del arreglo y para otro fuera. (NUM(5) y NUM(10) respectivamente).

En el 2do ejercicio, tu resolución fue:

CLS

FOR i = 0 TO 9
   INPUT NUMEROS(i)
NEXT

SUMANUMEROS = 0

FOR i = 0 TO 9
    SUMANUMEROS = NUMEROS(0) + NUMEROS(1) + NUMEROS(2) + NUMEROS(3) + NUMEROS(4) +    
    NUMEROS(5) + NUMEROS(6) + NUMEROS(7) + NUMEROS(8) +  NUMEROS(9)
NEXT

FOR i = 0 TO 9
   A = NUMEROS(0) + SUMANUMEROS
   B = NUMEROS(1) + SUMANUMEROS
   C = NUMEROS(2) + SUMANUMEROS
   D = NUMEROS(3) + SUMANUMEROS
   E = NUMEROS(4) + SUMANUMEROS
   F = NUMEROS(5) + SUMANUMEROS
   G = NUMEROS(6) + SUMANUMEROS
   H = NUMEROS(7) + SUMANUMEROS
   I = NUMEROS(8) + SUMANUMEROS
   J = NUMEROS(9) + SUMANUMEROS
NEXT

Aquí, cuando asignás SUMANUMEROS, no estás utilizando un FOR. Esto podría haberse hecho como:

SUMANUMEROS = 0
FOR i = 0 to 9
    SUMANUMEROS = SUMANUMEROS + NUMEROS(i)
NEXT

Por último, cuando hacés 

FOR i = 0 TO 9
   A = NUMEROS(0) + SUMANUMEROS
   B = NUMEROS(1) + SUMANUMEROS
   C = NUMEROS(2) + SUMANUMEROS
   D = NUMEROS(3) + SUMANUMEROS
   E = NUMEROS(4) + SUMANUMEROS
   F = NUMEROS(5) + SUMANUMEROS
   G = NUMEROS(6) + SUMANUMEROS
   H = NUMEROS(7) + SUMANUMEROS
   I = NUMEROS(8) + SUMANUMEROS
   J = NUMEROS(9) + SUMANUMEROS
NEXT

¿para qué hacer un FOR si no lo usás para nada? lo único que estás haciendo con el FOR es repetir 

   A = NUMEROS(0) + SUMANUMEROS
   B = NUMEROS(1) + SUMANUMEROS
   C = NUMEROS(2) + SUMANUMEROS
   D = NUMEROS(3) + SUMANUMEROS
   E = NUMEROS(4) + SUMANUMEROS
   F = NUMEROS(5) + SUMANUMEROS
   G = NUMEROS(6) + SUMANUMEROS
   H = NUMEROS(7) + SUMANUMEROS
   I = NUMEROS(8) + SUMANUMEROS
   J = NUMEROS(9) + SUMANUMEROS

10 veces.

Por otro lado, el enunciado decía "...dado el arreglo A de 10 elementos, sume a cada uno de ellos la suma de todos los elementos del arreglo", donde "a cada uno de ellos" se refiere a los elementos del arreglo, y por lo tanto hay que escribir en el arreglo.

La solución sería

FOR i = 0 TO 9
   NUMEROS(i) = NUMEROS(i) + SUMANUMEROS
NEXT

Vos no estás sumandole SUMANUMEROS a cada elemento del arreglo, sino que estás escribiendo los resultados de sus sumas en A, B, C,..., J.

En el ejercicio 3, tu código fue

FOR i = 0 TO 9
  INPUT NUM(i)
NEXT

FOR i = 0 TO 4
   IF NUM(i) MOD 2 = 0 THEN
      PRINT "SON PARES"
   ELSE
      PRINT "NO SON PARES"
   END IF
NEXT

FOR i = 5 TO 9
   IF NUM(i) MOD 2 = 0 THEN
      PRINT "NO SON IMPARES"
   ELSE
      PRINT "SON IMPARES"
   END IF
NEXT

Ahora bien, este código, lejos de decirme, cito al enunciado "con UN mensaje, si los primeros 5 elementos son pares, y los últimos 5 impares", me indica para cada uno de los elementos, si son impares o pares. Por ejemplo, si yo ejecuto el código para el arreglo 1,2,3,4,5,6,7,8,9,10, imprimirá en pantalla

NO SON PARES
SON PARES
NO SON PARES
SON PARES
SON IMPARES
NO SON IMPARES
SON IMPARES
NO SON IMPARES
SON IMPARES
NO SON IMPARES

Cuando debía decirme que "El arreglo no cumple con la propiedad", o "El arreglo no cumple", o cualquier mensaje que me indique que no pasaba que primeros 5 eran pares y los últimos 5 impares.

Si el arreglo tiene los valores 2,2,2,2,2,3,3,3,3,3. El programa indica en pantalla

SON PARES
SON PARES
SON PARES
SON PARES
SON PARES
SON IMPARES
SON IMPARES
SON IMPARES
SON IMPARES
SON IMPARES

que si bien me muestra la paridad de cada elemento, no me indica, con UN mensaje, que el arreglo cumple con la propiedad de tener los 5 primeros pares y los últimos 5 impares.

La solución podría haber sido, con dos FORs, así:

pares = 1
FOR i = 0 to 4 
    IF NOT NUM(i) MOD 2 = 0 THEN pares = 0
NEXT

impares = 1
FOR i = 5 to 9 
    IF NOT NUM(i) MOD 2 = 1 THEN impares = 0
NEXT

IF impares = 1 AND pares = 1 THEN PRINT "El arreglo cumple con la propiedad"

O sino, con un sólo FOR

pares = 1
impares = 1

FOR i = 0 to 4 
    IF NOT NUM(i) MOD 2 = 0 THEN pares = 0
    IF NOT NUM(i+5) MOD 2 = 1 THEN impares = 0
NEXT

IF impares = 1 AND pares = 1 THEN PRINT "El arreglo cumple con la propiedad"

Bueno, es por eso que los ejercicios 1, 2 y 3 fueron considerados mal.

Espero que haya aclarado tus dudas, cualquier cosa avisame!

saludos!
rodrigo

2010/12/6 Leo . <leo...@hotmail.com>

Leo .

unread,
Dec 6, 2010, 11:00:41 AM12/6/10
to logprog...@googlegroups.com
ah, listo queria saber eso, porque no entendia sino como hacelro bien, el 2do si ya sabia q estaba mal pero pense q los primeros estaban bien, ahora, CUANDO ES EL RECUPERATORIO, porq miercoles es FERIADO :S !


Date: Mon, 6 Dec 2010 13:53:27 +0000
Subject: Re: quisiera ver mi examen.....................
From: rodrigo....@gmail.com
To: logprog...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages