Autor Tema: EJERCICIO CU00163A bucles mientras repetir en pseudocódigo y uso interruptores  (Leído 4910 veces)

sergioab1985

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Hola a todos. Voy por la lección CU00163A del curso básico.
Antes de ver la solución yo llegué al siguiente resultado:


INICIO

j=1

Mientras condicion_prevista <= 100 hacer
   Leer paquete (i)

   Si dato(j)>600 y dato(j)<700 entonces
      condicion_prevista = condicion_prevista + 1
      Datos_extraidos = Datos_extraidos + 1
   Sino
      Datos_extraidos = Datos_extraidos + 1
   FinSi

   Si j = 100 entonces
      i=i+1
      j=1
   Sino
      j=j+1
   FinSi

Repetir

Mostrar "Se cumple lo previsto."
Mostrar "Se extrajeron", condicion_prevista, "Datos con valores mayores que 600 y menores que 700 de", datos_extraidos, "datos totales revisados."

FIN

Ahora bien, cuando vi la solución publicada observé que el hecho de usar interruptores facilita las cosas, pero hay algunas cosas que no entiendo:

1.  Inicio [Extracción de datos p100]
   2.  n = 1
   3.  Mientras Esperado = Falso Hacer
      3.1  Desde i = n hasta n + 99 Hacer
         Leer Dato(i)
         Si Dato(i) > 600 y Dato(i) < 700 Entonces
            j = j + 1 
         FinSi
      Siguiente
      3.2  Si j > 100 Entonces
         Esperado = Verdadero
      FinSi
      3.3  Si Esperado = Verdadero Entonces
         Mostrar “Se cumple lo previsto habiendo extraído”, j, “datos de un total de”, n + 99, “datos”
      SiNo
      Mostrar “Extracción de un nuevo paquete” 
      n = n + 100 
      FinSi
   Repetir
4.  Fin


No entiendo porqué es necesario manipular el contador de este modo, pues a mi entender, n ya secuentra en el valor necesario en el caso de retomar el bucle o en caso de mostrar el mensaje
¿Cuál es la necesidad de poner
Mostrar “Se cumple lo previsto habiendo extraído”, j, “datos de un total de”, n + 99, “datos”?
Me parece que esto no es adecuado, porque de este modo se está sumando 99 al último valor de n en el bucle...

Lo mismo cuando se dice:

Mostrar “Extracción de un nuevo paquete” 
n = n + 100 

Si se vuelve a ingresar al bucle porque esperado=falso al finalizar el primer paquete, sin esta aclaración el bucle empezaría en n=101, con la instrucción n=n+100 se empezaría en 201...

No lo entiendo del todo... AYUDAAAAAAA!!!!!

a mi me queda asi:


INICIO

n=1
esperado = falso

Mientras esperado = falso hacer
   desde i = n hasta n+99 hacer

      leer Dato(i)
      
      Si dato(i)>600 y dato(o) < 700 entonces
         j=j+1
      FinSi
   Siguiente

      Si j>100 entonces
         esperado = verdadero
      FinSi

      Si esperado = verdadero entonces
         Mostrar "Se cumple lo previsto."
         Mostrar "Se extrajeron", j, "Datos con valores mayores que 600 y menores que 700 de", n, "datos totales revisados."
      Sino
         Mostrar "Extracción de un nuevo paquete de datos"
      FinSi
Repetir

FIN
« Última modificación: 12 de Septiembre 2014, 17:18 por Alex Rodríguez »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:EJERCICIO CU00163A
« Respuesta #1 en: 09 de Noviembre 2012, 09:02 »
Hola Sergio, comentarte varias cuestiones. La primera es que un problema de programación puede tener varias soluciones y varias de ellas ser igual de buenas. Por tanto no tienes que obsesionarte con buscar soluciones perfectas porque no las hay, simplemente se buscan soluciones lo más efectivas posibles gastando el menor tiempo posible, no se busca la solución perfecta.

Vamos ahora al ejercicio que comentas. Quizás es enunciado no está del todo claro, voy a tratar de aclararlo. Cuando dice que se extraen datos en paquetes de 100 unidades significa que el programa comienza y extrae Dato(1), Dato(2), ... Dato(98), Dato(99), Dato(100). Cuando llega a 100, ya ha completado un paquete. Para cada dato se evalúa si cumple las condiciones (que sea mayor que 600 y menor que 700). Si ocurre esto, se añade una unidad a un contador que controla cuántos datos que cumplen la condición han existido.

Al terminar la extracción del primer paquete el número de datos que se han extraído es 100 y el número máximo de datos que puede cumplir la condición es 100. La condición para que termine el programa es que haya más de 100 datos que cumplan la condición. Si hemos leído 100 datos exactos y para terminar el programa se requiere que haya más de 100 que cumplan la condición, es imposible que con el primer paquete de datos termine el programa.

Obligatoriamente se pasará al segundo paquete de datos que comprende Dato(101), Dato(102), ... , Dato(199), Dato(200), es decir, obligatoriamente tendrá lugar una segunda pasada por el bucle Mientras

Una vez terminado este segundo paquete de datos ya habremos leído 200 datos, de los cuales cierto número cumplirán la condición de ser mayores de 600 y menores de 700. Supongamos que los datos que cumplen son 30: el programa no termina, se seguirán extrayendo datos. Supongamos que los datos que cumplen son 116: entonces la condición para que termine el programa ya se cumple y esto lo reflejamos en una variable booleana esperado = Verdadero que dará lugar a que ya no se extraigan más datos. (Es decir, que no se vuelva a repetir el bucle).

Ahora veamos lo que tú comentas:


No entiendo por qué es necesario manipular el contador de este modo, pues a mi entender, n ya se encuentra en el valor necesario en el caso de retomar el bucle o en caso de mostrar el mensaje
 


Si te fijas, hay dos contadores: i y j. i cuenta desde el primer dato del paquete de datos hasta el último en un bucle desde ... siguiente. j es un acumulador que va acumulando el número de datos que cumplen la condición.

¿Qué es n? n no es un contador. No siempre que veamos una letra como i, j, k, n... tienen que ser contadores. Hay que fijarse específicamente qué es lo que hacen o significan. n es un índice que nos dice cuál es el primer valor del paquete de datos, así n inicialmente vale 1. i cuenta de 1 a 100. Luego se hace n=n+100 lo cual significa que n=101 que es el índice para el primer elemento del segundo paquete. i contará de 101 a 200. Si hubiera otra repetición de bucle, n sería n=201 e i contaría de 201 a 300...

Durante el primer bucle n vale siempre 1, lo que va cambiando es i. Si no cambiáramos el valor de n, este seguiría siendo 1 al final. Hemos de cambiarlo.

Por tanto: no hay manipulación de contador, lo que se hace es ir estableciendo los índices iniciales que van siendo necesarios.



¿Cuál es la necesidad de poner Mostrar “Se cumple lo previsto habiendo extraído”, j, “datos de un total de”, n + 99, “datos”?
Me parece que esto no es adecuado, porque de este modo se está sumando 99 al último valor de n en el bucle...



La necesidad de mostrar eso: el enunciado dice "indicar el número de datos que se extrajeron frente al total extraído". Lo que se hace es, una vez ha terminado la extracción de un paquete de datos, se evalúa lo que ha ocurrido. Si se verifica la condición de terminación del programa, el valor de n que tenemos es el correspondiente al primer dato del último paquete que se extrajo. ¿Cuál es el índice del último dato del último paquete extraído? n+99, por ejemplo, si es el segundo paquete el primer dato es n=101 y el último dato es n+99, es decir, 200. Lo que nos dice ese mensaje es cuántos valores cumplieron y cuántos fueron leídos en total.

Con la instrucción Mostrar no se está sumando 99 al último valor de n: mostrar es mostrar, no modifica el valor de la variable. Para realizar una modificación tendríamos que escribir n = n+99. El simple hecho de escribir una operación dentro de un mostrar no modifica el valor de la variable. Para modificar el valor de la variable hay que hacerlo con una operación de asignación (usando el =).

 
Otra cosa que comentas:

Si se vuelve a ingresar al bucle porque esperado=falso al finalizar el primer paquete, sin esta aclaración el bucle empezaría en n=101, con la instrucción n=n+100 se empezaría en 201...

Correcto: si lees la explicación anterior verás que esto es exactamente lo que se pretende.

Me he extendido un poco, espero que al menos te sirva de ayuda
Responsable de departamento de producción aprenderaprogramar.com

sergioab1985

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Re:EJERCICIO CU00163A
« Respuesta #2 en: 09 de Noviembre 2012, 21:38 »
Gracias César. Ahora me queda mas claro. Confundí el contador con n

Saludos

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".