Autor Tema: Curso bases de la programación nivel I ejercicio 8 semana 7 bucles y arrays  (Leído 3484 veces)

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Orientaciones para realizar el ejercicio 8 de la semana 7 del curso Bases de la programación nivel I.

Citar
3. Se está realizando un estudio estadístico de los clientes que entran a un supermercado en cada hora a partir de su hora de apertura durante un día. El supermercado abre 8 horas al día y los datos de cuántas personas han entrado al supermercado en cada hora se encuentran almacenados en un array definido como personasEntran(1), personasEntran(2), … hasta personasEntran( 8 ). Se desea desarrollar el pseudocódigo y el diagrama de flujo para un programa que usando “Desde … Siguiente” y “Si … Entonces” determine:

a) El total de personas que entraron al supermercado en el día.
b) Cuántas horas no entró ninguna persona y cuáles fueron.
c) Cuál fue la hora en la que entró el mayor número de personas.
d) El número medio de personas por hora que entraron al supermercado.

Importante: en este tipo de ejercicios usamos arrays combinándolos con bucles desde … siguiente de forma que para recorrer el array usamos un bucle, nunca escribimos una por una las variables que forman el array excepto si tenemos que asignarles un valor inicial.

Nota: en lugar de personasEntran(1), personasEntran(2), … hasta personasEntran( 8 ) podemos usar personasEntran(0), personasEntran(1), … personasEntran(7).


8. Crear un programa en Visual Basic que realice la tarea planteada en el ejercicio 3. Los datos de partida se deben incorporar en el propio código al principio del programa. Para ello tendrás que hacer las declaraciones de variables o arrays oportunas. Como respuesta a este ejercicio se debe entregar el texto que conforma el código y una captura de pantalla con el programa mostrando resultados.

La lógica del programa a crear es análoga a la del ejercicio 18 (página 159 del libro) relativo a un conteo de coches.

Una cosa a tener en cuenta es que el enunciado del ejercicio nos indica: "Los datos de partida se deben incorporar en el propio código al principio del programa."

Esto quiere decir que en lugar de pedir los datos de partida al usuario o leerlos desde un archivo, simplemente los incluiremos directamente al inicio del programa (si estamos con Visual Basic en el form_load, para que se carguen nada más iniciarse el programa).

Ejemplo:

Código: [Seleccionar]
Public Class Form1
    Dim personasEntran(8) As Integer, personasTotal%, transitoCero%, maxTransito%, horaMaxTransito%

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        personasEntran(0) = 0
        personasEntran(1) = 32
        personasEntran(2) = 47
        personasEntran(3) = 22
        personasEntran(4) = 0
        personasEntran(5) = 31
        personasEntran(6) = 0
        personasEntran(7) = 87

'Aquí podemos procesar los datos usando un bucle for

'Aquí podemos mostrar los resultados usando labels

    End Sub

    End Class

Nota: aquí hemos usado índices para el array comprendidos entre 0 y 7. Otra opción es usar índices entre 1 y 8.

Nota: los datos que hemos tomado son los propuestos en el ejercicio 4.

Citar
4. Indica cuáles serían los resultados que obtendríamos con el pseudocódigo anterior si en la primera hora entraron 0 personas, en la segunda 32 personas, en la tercera 47 personas, en la cuarta 22 personas, en la quinta 0 personas, en la sexta 31 personas, en la séptima 0 personas y en la octava 87 personas.

La escritura del programa en Visual Basic seguirá una lógica similar a la del ejercicio 77 en la página 520, con las siguientes diferencias:

- No necesitamos un botón para leer datos desde un archivo, ya que los datos los hemos incluido directamente en el programa
- No necesitamos las instrucciones de apertura de archivo ni de lectura de datos de archivo ni de cierre de archivo, ya que los datos los hemos incluido directamente en el programa
- No necesitamos un botón calcular. Podemos realizar todo el proceso en el form_load si queremos.
- Hemos de tener cuidado con los índices. Si usamos los índices de 0 a 7, tener cuidado (en el libro los índices se han tomado comenzando en 1), por ejemplo los bucles serán del tipo for i=0 to 7 en lugar de for i=1 to 8.


Otra opción sería incluir un botón de modo que el proceso no se ejecute al iniciarse el programa, sino al pulsar el botón. En ese caso tendríamos que incluir los datos de partida tras el button_click para que estén accesibles.

Puede ser de interés consultar el código en http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=279:ejercicios-resueltos-en-visual-basic-ejemplos-leer-datos-desde-ficheros-bucles-for-next-if-then-cu00330a&catid=37:curso-aprender-a-programar-visual-basic-desde-cero&Itemid=61

Aquí hay que tener en cuenta las mismas consideraciones que hemos comentado anteriormente.


Recomendación: para quien no se sienta seguro, comenzar desarrollando procesos básicos. Una forma de empezar sería la siguiente:

Crear un programa básico (programa nº1) que realice lo siguiente:

a) Cargar los datos
b) Usando un bucle for mostrar los datos en un formato similar al siguiente:

En la hora 1 entraron 0 personas
En la hora 2 entraron 32 personas
En la hora 3 entraron 47 personas
En la hora 4 entraron 22 personas
En la hora 5 entraron 0 personas
En la hora 6 entraron 31 personas
En la hora 7 entraron 0 personas
En la hora 8 entraron 87 personas

Una vez tengamos este programa funcionando, lo guardamos y a continuación crearemos un programa donde ampliaremos los procesos que se realizan.

Saludos
« Última modificación: 12 de Septiembre 2016, 08:18 por Mario R. Rancel »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Re:Curso bases de la programación nivel I ejercicio 8 semana 7 bucles y arrays
« Respuesta #1 en: 05 de Septiembre 2016, 13:01 »
Para resolver el ejercicio simplificado expliquemos primero unos conceptos previos.

EL CONCEPTO DE BUCLE

Un bucle es una instrucción que indica "repetir un proceso n veces" ¿Cuántas veces? Tantas como indique el bucle. Por ejemplo si el bucle dice For i=1 to 10 el proceso se repetirá 10 veces. En cada ocasión en que se repite el proceso, el valor de la variable de control del bucle (a la que podemos llamar de cualquier manera, por ejemplo i, ó contador) irá cambiando.

Veamos un pequeño ejemplo:

Código: [Seleccionar]
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim i As Integer
        For i = 1 To 5
            Label1.Text = Label1.Text & "Hola" & vbCrLf
        Next
    End Sub
End Class

Este código hace que se repita 5 veces en un label el mensaje "Hola".

Hay un detalle importante, el proceso se repite 5 veces, pero si en cada ocasión anuláramos lo realizado en la vez anterior sólo veríamos el resultado de la última ejecución. ¿Por qué? Porque las 4 veces anteriores quedarían anuladas por la primera.

Por ejemplo:

Código: [Seleccionar]
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim i As Integer
        For i = 1 To 5
            Label1.Text = "Hola" & vbCrLf
        Next
    End Sub
End Class

Este código daría lugar a que sólo aparezca 1 vez el mensaje "Hola". ¿Por qué una vez si el proceso se ha repetido 5 veces? Porque Label1.Text = "Hola" & vbCrLF significa que se establezca que el contenido del Label es Hola (anulando lo que anteriormente hubiera en el Label). Es como si escribiéramos algo, luego borráramos con una goma, lo volviéramos a escribir, lo volviéramos a borrar con una goma, etc. ¿Qué sería lo que veríamos finalmente? Lo último escrito, porque todo lo anterior lo hemos borrado con la goma. Otra cosa sería si escribiéramos algo y luego en la línea siguiente ampliáramos lo escrito añadiendo otra cosa.

Si no queremos anular lo que anteriormente hubiera hemos de escribir Label1.Text = Label1.Text & "Hola" & vbCrLf , esto equivale a decir, el contenido de Label1.Text será el contenido existente anteriormente ampliado con el mensaje "Hola" y un salto de línea. Usando esto, en cada repetición del bucle, el mensaje se amplía sin anular lo que hubiera anteriormente.

Ahora vamos a interesarnos por el papel del índice en el bucle. El índice podemos utilizarlo para mostrarlo por pantalla, como índice de elementos de un array, para hacer cálculos matemáticos, etc. Veamos este ejemplo:

Código: [Seleccionar]
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim i As Integer
        For i = 1 To 5
            Label1.Text = Label1.Text & "Hola el índice ahora es " & i & " y el doble es " & i * 2 & vbCrLf
        Next
    End Sub
End Class

El resultado será similar a esto:

Hola el índice ahora es 1 y el doble es 2
Hola el índice ahora es 2 y el doble es 4
Hola el índice ahora es 3 y el doble es 6
Hola el índice ahora es 4 y el doble es 8
Hola el índice ahora es 5 y el doble es 10

Es importante dónde se ubica una instrucción. Si está dentro del bucle, significará que se repetirá n veces. Si está fuera del bucle, sólo se ejecutará una vez. Por ejemplo este código:

Código: [Seleccionar]
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim i As Integer
        For i = 1 To 5
            Label1.Text = "Hola" & vbCrLf
        Next
        Label1.Text = Label1.Text & "Hola el índice ahora es " & i & " y el doble es " & i * 2 & vbCrLf
    End Sub
End Class

Nos produce como resultado:

Hola
Hola el índice ahora es 6 y el doble es 12


¿Por qué aparece solo un Hola si el bucle se repite 5 veces? Porque solo aparece el resultado de la última repetición porque en cada repetición estamos anulando lo que anteriormente hubiera en el label.

¿Por qué aparece solo una vez el mensaje "Hola el índice es ahora..."? Porque está fuera del bucle, lo que esté fuera de un bucle solo se ejecuta una vez.

¿Por qué aparece el mensaje "Hola el índice ahora es 6 y el doble es 12"? Porque el bucle va repitiéndose hasta que i es mayor que 5, en ese momento i vale 6 y el bucle termina con i=6, y continúa la ejecución del programa.


USO DE LOS ÍNDICES DEL CONTADOR CON ARRAYS

Un array es una variable (como si fuera una caja grande) compuesta de varios elementos (varias cajas numeradas dentro de la caja grande). Como el array usa índices y un bucle for también usa índices, combinar ambas cosas puede ser muy útil para la programación.

Supongamos que escribimos este ejemplo:

Código: [Seleccionar]
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim i As Integer
        Dim Persona(5) As String
        Persona(1) = "Juan" : Persona(2) = "Pedro" : Persona(3) = "Alberto" : Persona(4) = "Luis" : Persona(5) = "Fran"
        For i = 1 To 5
            Label1.Text = "La persona " & i & " se llama " & Persona(i) & vbCrLf
        Next
    End Sub
End Class

El resultado es que se muestra por pantalla "La persona 5 se llama Fran" ¿Por qué solo me muestra esto y no todos los nombres? Porque hemos escrito Label1.Text = "La persona " & i & " se llama " & Persona(i) & vbCrLf que equivale a que en cada repetición borramos lo anterior (como si borráramos con una goma lo escrito).

Para ver los cinco nombres necesito mantener lo escrito anteriormente y esto lo hacemos con Label1.Text = Label1.Text & "La persona " & i & " se llama " & Persona(i) & vbCrLf

El código sería:

Código: [Seleccionar]
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim i As Integer
        Dim Persona(5) As String
        Persona(1) = "Juan" : Persona(2) = "Pedro" : Persona(3) = "Alberto" : Persona(4) = "Luis" : Persona(5) = "Fran"
        For i = 1 To 5
            Label1.Text = Label1.Text & "La persona " & i & " se llama " & Persona(i) & vbCrLf
        Next
    End Sub
End Class

Y el resultado:
La persona 1 se llama Juan
La persona 2 se llama Pedro
La persona 3 se llama Alberto
La persona 4 se llama Luis
La persona 5 se llama Fran

Con esto ya debemos ser capaces de plantear y entender el programa simplificado a realizar.


Nota: al igual que para ampliar un label hemos de escribir Label1.Text = Label1.Text & otraCosa, para sumar algo a una variable sin anular el contenido anterior hemos de escribir nombreVariable = nombreVariable + otraCosa;

Ejemplo: NumHorasEntranCero = 1 establece que la variable tome el valor 1 anulándose todo lo que tuviera previamente. Por ejemplo si antes valía 43 ahora pasa a valer 1.

NumHorasEntranCero = NumHorasEntranCero + 1 establece por contra que la variable vale una unidad más de lo que valía anteriormente. Por ejemplo si antes valía 43 ahora pasa a valer 44.

Con cada asignación hemos de plantearnos lo que queremos hacer: si anular el contenido anterior o si ampliarlo de alguna manera.

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Re:Curso bases de la programación nivel I ejercicio 8 semana 7 bucles y arrays
« Respuesta #2 en: 06 de Septiembre 2016, 10:16 »
Con lo visto hasta ahora habremos llegado a un código similar a este:

Código: [Seleccionar]
'Estadística de personas que entran en un supermercado en las 8 horas que permanece abierto
Option Explicit On
Public Class Form1
    REM Declaración de variables
    Dim PersonasEntranHora(8) As Integer
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Text = "Estadística de personas que entran en un supermercado en las 8 horas que permanece abierto"
        Dim Contador As Integer
        PersonasEntranHora(1) = 0
        PersonasEntranHora(2) = 32
        PersonasEntranHora(3) = 47
        PersonasEntranHora(4) = 22
        PersonasEntranHora(5) = 0
        PersonasEntranHora(6) = 31
        PersonasEntranHora(7) = 0
        PersonasEntranHora(8) = 87
        For Contador = 1 To 8
        Label1.Text = Label1.Text "En la hora " & Contador & " entraron" & PersonasEntranHora(Contador) &  "personas" & vbCrLf     
        Next Contador
    End Sub
End Class

Con un resultado que será como este:

En la hora 1 entraron 0 personas
En la hora 2 entraron 32 personas
En la hora 3 entraron 47 personas
En la hora 4 entraron 22 personas
En la hora 5 entraron 0 personas
En la hora 6 entraron 31 personas
En la hora 7 entraron 0 personas
En la hora 8 entraron 87 personas


Manteniendo el código anterior, que vamos a ampliar, vamos a plantear ahora lo que denominaremos ejercicio simplificado nº2, en el que resolveremos el apartado a) que nos pedía lo siguiente:

a) El total de personas que entraron al supermercado en el día.

Para resolver esto declararemos una variable de tipo entero (ya que el número de personas que entran al supermercado cada día es un número entero, la suma también será un número entero) a la que pondremos un nombre similar a totalPersonasDia.

Como primer paso, estableceremos que el total de personas sea cero (valor de partida).

Seguidamente, en cada repetición del bucle le añadiremos a la variable el número de personas que entraron en cada hora. ¿Para qué nos sirve el bucle? Para poder recorrer todas las horas sin necesidad de escribir línea a línea repetitivamente.

Recordar que para ir añadiendo hemos de realizar una asignación del tipo totalPersonasDia = totalPersonasDia + x

Donde x es lo que queramos añadir. En nuestro caso lo que querremos añadir es la cantidad de personas que entraron en cada hora, cosa que ya sabemos cómo obtener.

Finalmente, una vez calculado el total de personas que entraron al supermercado en el día, mostraremos un mensaje por pantalla informando de ello.

Importante: hay que pensar si el mensaje debe estar dentro del bucle o fuera del bucle y por qué. También hay que pensar si el mensaje "amplía" un mensaje ya existente, o si por el contrario borra contenidos previos y muestra un nuevo contenido, y razonar el por qué procedemos de una manera o de otra.

Una vez tengamos este programa funcionando, lo guardamos y a continuación crearemos un programa donde ampliaremos los procesos que se realizan.

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Re:Curso bases de la programación nivel I ejercicio 8 semana 7 bucles y arrays
« Respuesta #3 en: 09 de Septiembre 2016, 08:41 »
Con lo visto hasta ahora habremos llegado a un código similar a este:

Código: [Seleccionar]
'Estadística de personas que entran en un supermercado en las 8 horas que permanece abierto
Option Explicit On
Public Class Form1
    REM Declaración de variables
    Dim TotalPersonasDia As Integer
    Dim PersonasEntranHora(8) As Integer
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Text = "Estadística de personas que entran en un supermercado en las 8 horas que permanece abierto"
        Dim Contador As Integer
        PersonasEntranHora(1) = 0
        PersonasEntranHora(2) = 32
        PersonasEntranHora(3) = 47
        PersonasEntranHora(4) = 22
        PersonasEntranHora(5) = 0
        PersonasEntranHora(6) = 31
        PersonasEntranHora(7) = 0
        PersonasEntranHora(8) = 87
        For Contador = 1 To 8
            Label1.Text = Label1.Text & " En la hora " & Contador & " entraron en el supermercado " & PersonasEntranHora(Contador) & " personas" & vbCrLf
            TotalPersonasDia = TotalPersonasDia + PersonasEntranHora(Contador)
        Next Contador
        Label2.Text = " El total de personas que entraron en el día en el supermercado fue de " & TotalPersonasDia
    End Sub
End Class

Aquí hay un par de cosas intereresantes que nos pueden dar pie a plantear algunas reflexiones.


¿Es necesario usar un Label2 ó podríamos haber mostrado el total del personas que entraron también en el Label1?

No es estrictamente necesario usar un Label2, lo podemos hacer si queremos, pero no es "estrictamente necesario". Es como si estuviéramos escribiendo en un folio. Si queremos, podemos escribir en otro, pero siempre podríamos haber seguido usando el primero (siempre que nos quede espacio para añadir texto en él).

Si hubiéramos querido continuar usando el Label1 (suponiendo que tuviéramos espacio) podríamos haberlo hecho así:

Label1.Text = Label1.Text & vbCrLf & vbCrLf & " El total de personas que entraron en el día en el supermercado fue de " & TotalPersonasDia

Fijémonos en dos cosas: para ampliar el contenido del Label1 tenemos que poner siempre Label1.Text = Label1.Text & ... ; si simplemente escribiéramos Label1.Text = ... lo que haríamos sería eliminar el contenido anterior y poner uno nuevo, no sería una ampliación.

Otra cosa: para que quede una separación clara entre los mensajes en este caso hemos introducido dos saltos de línea introduciendo & vbCrLf & vbCrLf & ... ¿Cuántos saltos de línea podemos introducir? Todos los que queramos. A más saltos de línea, más separación introducimos.


¿Qué diferencia hay entre que una instrucción esté dentro del bucle o fuera del bucle?

Si nos fijamos Label1.Text = Label1.Text & " En la hora " & ... está dentro del bucle. Esto da lugar a que se ejecute 8 veces, con lo cual aparecen 8 líneas sobre el Label1 (ya que en cada ocasión ampliamos el contenido del Label1 ya que escribimos Label1.Text = Label1.Text & ...

En cambio Label2.Text = ... está fuera del bucle y solo se ejecuta una vez.

Manteniendo el código anterior, que vamos a ampliar, vamos a plantear ahora lo que denominaremos ejercicio simplificado nº3, en el que resolveremos el apartado b) que nos pedía lo siguiente:

b) Cuántas horas no entró ninguna persona y cuáles fueron.

Esto podemos subdividirlo en dos:

b.1) Determinar cuántas horas no entró ninguna persona: esto requerirá declarar una variable adicional a la que podemos llamar horasNoEntraronPersonas. Ahora en cada hora con un condicional (if) hemos de comprobar si entró alguien o no. En caso de no haber entrado nadie, tendremos que sumar 1 a la variable, de modo que tras revisar todas las horas la variable nos diga cuántas horas no entró nadie. ¿Cómo revisamos hora a hora si entró alguien? Ya estamos revisando hora a hora para mostrar el mensaje de las personas que entraron en cada hora y para realizar la suma de total de personas, por tanto es el bucle quien nos está permitiendo recorrer todas las horas y con la misma filosofía que hemos empleado deberemos introducir el condicional de comprobación oportuno, dentro del bucle, e ir realizando la suma oportuna. Recordar que para no eliminar el contenido previo de una variable sino añadirle algo, hemos de usar nombreVariable = nombreVariable + x donde x es lo que queremos añadir.

El resultado a mostrar deberá ser algo como: "El total de horas en que no entró ninguna persona fueron: 3 horas"

¿Cuántas veces hemos de mostrar el mensaje? Una, y para tener el dato necesitamos haber recorrido todas las horas, por tanto lo más lógico será mostrar este mensaje una vez terminado el bucle (fuera del bucle) cuando ya hemos recorrido todas las horas.

b.2) Determinar cuáles fueron las horas en las que no entró ninguna persona.

Aquí realmente no nos está dando una instrucción específica de cómo hacerlo. Podemos resolverlo entonces como mejor estimemos. Por ejemplo una forma de resolverlo sería mostrar por pantalla:

En la hora 1 no entró nadie
En la hora 5 no entró nadie
En la hora 7 no entró nadie

Otra forma de resolverlo sería mostrar por pantalla: En las horas 1, 5 y 7 no entró nadie

O también: Las horas en las que no entró nadie fueron: 1, 5, 7

Bien, esto hay varias formas de resolverlo. Vamos a exponer una de ellas, aunque podrían plantearse otras.

Usamos el bucle para recorrer todas las horas y conocer cuántas personas entraron en cada hora. ¿Podemos dentro del bucle mostrar un mensaje cada vez que detectemos que no entró nadie e informar de a qué hora fue? Sí

El bucle se repite 8 veces, entonces, ¿cómo mostrar el mensaje sólo cuando sea procedente? Pues haciendo una comprobación con un condicional If. Si se cumple que no entró nadie, mostraremos el mensaje "En la hora" & contador & "no entró nadie". Si no se cumple, no aparecerá mensaje.

¿Dónde mostrar el mensaje? Podemos usar un Label existente o uno nuevo. Lo único a tener en cuenta será que debemos ir ampliando el contenido sin eliminar el contenido anterior.

Una vez tengamos este programa funcionando, lo guardamos y a continuación crearemos un programa donde ampliaremos los procesos que se realizan.

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Re:Curso bases de la programación nivel I ejercicio 8 semana 7 bucles y arrays
« Respuesta #4 en: 10 de Septiembre 2016, 13:57 »
Con lo visto hasta ahora habremos llegado a un código similar a este:

Código: [Seleccionar]
'Estadística de personas que entran en un supermercado en las 8 horas que permanece abierto
Option Explicit On
Public Class Form1
    REM Declaración de variables
    Dim TotalPersonasDia As Integer
    Dim PersonasEntranHora(8) As Integer
    Dim HorasNoEntraronPersonas As Integer
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Text = "Estadística de personas que entran en un supermercado en las 8 horas que permanece abierto"
        Dim Contador As Integer
        PersonasEntranHora(1) = 0
        PersonasEntranHora(2) = 32
        PersonasEntranHora(3) = 47
        PersonasEntranHora(4) = 22
        PersonasEntranHora(5) = 0
        PersonasEntranHora(6) = 31
        PersonasEntranHora(7) = 0
        PersonasEntranHora(8) = 87
        For Contador = 1 To 8
            Label1.Text = Label1.Text & " En la hora " & Contador & " entraron en el supermercado " & PersonasEntranHora(Contador) & " personas" & vbCrLf
            TotalPersonasDia = TotalPersonasDia + PersonasEntranHora(Contador)
            If PersonasEntranHora(Contador) = 0 Then
                HorasNoEntraronPersonas = HorasNoEntraronPersonas + 1
                Label4.Text = Label4.Text & " En la hora " & Contador & " No entraron personas en el supermercado " & vbCrLf
            End If
        Next Contador
        Label2.Text = " El total de personas que entraron en el día en el supermercado fue de " & TotalPersonasDia
        Label3.Text = " El número de horas en que no entraron personas fue de " & HorasNoEntraronPersonas
    End Sub
End Class

Nota: como ya hemos comentado, es tan válido usar distintos Label como usar un solo Label e ir añadiéndole contenido. Podemos hacerlos según consideremos más conveniente.

Manteniendo el código anterior, que vamos a ampliar, vamos a plantear ahora lo que denominaremos ejercicio simplificado nº4, en el que resolveremos el apartado c) que nos pedía lo siguiente:

c) Cuál fue la hora en la que entró el mayor número de personas.

Esto requerirá declarar dos variables adicionales a las que podemos llamar:

horaMaximaAfluencia para representar la hora de máxima afluencia
maximaAfluenciaHoraria para representar el número de personas que entraron a la hora de mayor afluencia


Para saber la hora de máxima afluencia tendremos que comprobar cuántas personas entraron en cada hora (cosa que hacemos con el bucle) y elegir la de máxima afluencia y guardarla para mostrarla una vez terminada el  bucle. No podemos mostrarla durante el recorrido del bucle porque no sabemos cuál va a ser, puede ser cualquiera de ellas (cuando nos lleguen unos datos aleatorios correspondientes a un día aleatorio, que es el caso general. Es decir, el programa tiene que funcionar con cualesquiera datos, no solo con unos datos específicos).

Inicialmente podemos establecer:

horaMaximaAfluencia = 0. Esto significará que desconocemos cuál es la hora de máxima afluencia.
maximaAfluencia = 0. Esto significará que desconocemos cuál es la máxima afluencia.

Ahora en el recorrido del bucle cada hora con un condicional (if) hemos de comprobar si el número de personas que han entrado es mayor que la maximaAfluencia. En caso de ser así, debemos establecer dos cosas:

a) horaMaximaAfluencia: se corresponderá con la hora que estemos comprobando
b) maximaAfluencia: se corresponderá con la afluencia en la hora que estamos comprobando

¿En este caso debemos reemplazar el contenido de las variables o ampliarlo? En este caso debemos reemplazarlo: si la hora de maxima afluencia inicialmente es la cero, cuando detectetemos que en la hora 2 entraron 32 personas por ejemplo, la nueva hora de máxima afluencia deberá ser la 2, y la nueva máxima afluencia será la 32. Ahora no estamos ampliando el contenido de las variables, sino sustituyendo el que tuvieran anteriormente. Si detectamos que en la hora 3 entraron 47 personas tendremos que hacer lo mismo: una sustitución de valores (no ampliación). En cambio si en la hora 4 entraron 22 personas, esta afluencia no supera a la máxima registrada hasta el momento (47), y no debemos hacer cambios (esto lo controlaremos con un condicional if).

El resultado final será que una vez terminado el bucle tendremos en las variables cuál fue la hora de máxima afluencia y cuál fue la máxima afluencia.

Ya fuera del bucle podremos mostrar un mensaje informativo que podría ser:

"La máxima afluencia se dio en la hora .... y el número de personas que entraron en esa hora fue ..."

Realmente el ejercicio solo nos pide que digamos cuál fue la hora de máxima afluencia con lo que puede bastar con indicar esto.

Una vez tengamos este programa funcionando, lo guardamos y a continuación crearemos un programa donde ampliaremos los procesos que se realizan.

Nota: una vez alcanzado lo anterior tan solo nos falta realizar el apartado

d) El número medio de personas por hora que entraron al supermercado.

Como ya habíamos calculado el total de personas que entraron en el día, resolver este apartado será sencillo y podemos hacerlo una vez resuelto lo anterior si lo deseamos.
« Última modificación: 12 de Septiembre 2016, 08:20 por Mario R. Rancel »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Re:Curso bases de la programación nivel I ejercicio 8 semana 7 bucles y arrays
« Respuesta #5 en: 12 de Septiembre 2016, 08:24 »
Con lo visto hasta ahora habremos alcanzado la solución al ejercicio, que puede ser un código similar a este:

Código: [Seleccionar]
'Estadística de personas que entran en un supermercado en las 8 horas que permanece abierto
Option Explicit On
Public Class Form1
    REM Declaración de variables
    Dim TotalPersonasDia As Integer
    Dim PersonasEntranHora(8) As Integer
    Dim HorasNoEntraronPersonas As Integer
    Dim HoraMaximaAfluencia As Integer
    Dim MaximaAfluenciaHoraria As Integer
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Text = "Estadística de personas que entran en un supermercado en las 8 horas que permanece abierto"
        Dim Contador As Integer
        PersonasEntranHora(1) = 0
        PersonasEntranHora(2) = 32
        PersonasEntranHora(3) = 47
        PersonasEntranHora(4) = 22
        PersonasEntranHora(5) = 0
        PersonasEntranHora(6) = 31
        PersonasEntranHora(7) = 0
        PersonasEntranHora(8) = 87
        For Contador = 1 To 8
            Label1.Text = Label1.Text & " En la hora " & Contador & " entraron en el supermercado " & PersonasEntranHora(Contador) & " personas" & vbCrLf
            TotalPersonasDia = TotalPersonasDia + PersonasEntranHora(Contador)
            If PersonasEntranHora(Contador) = 0 Then
                HorasNoEntraronPersonas = HorasNoEntraronPersonas + 1
                Label4.Text = Label4.Text & " En la hora " & Contador & " No entraron personas en el supermercado " & vbCrLf
            End If
            If PersonasEntranHora(Contador) > MaximaAfluenciaHoraria Then
                MaximaAfluenciaHoraria = PersonasEntranHora(Contador)
                HoraMaximaAfluencia = Contador
            End If
        Next Contador
        Label2.Text = " El total de personas que entraron en el día en el supermercado fue de " & TotalPersonasDia
        Label3.Text = " El número de horas en que no entraron personas fue de " & HorasNoEntraronPersonas
        Label5.Text = " La máxima afluencia de personas se dio en la hora " & HoraMaximaAfluencia
        Label6.Text = " El número de personas que entraron en el supermercado en la hora de máxima afluencia fue de " & MaximaAfluenciaHoraria
        Label7.Text = " La media de personas que entraron en el supermercado por hora fue de " & TotalPersonasDia / 8
    End Sub
End Class

En el desarrollo de este código hemos visto algo importante: el desarrollo paso a paso e incremental de un programa. Cuando un programa tiene cierta complejidad puede ser preferible dividirlo en partes. A su vez, cada parte se puede subdividir en pasos. El grado de subdivisión necesario depende de la complejidad del programa y de la experiencia del programador. Cada vez que damos un paso tenemos que comprobar que todo sea correcto antes de dar el siguiente paso.

Para quien quiera practicar por su cuenta, planteo una posible modificación (con la que no deberíamos tener problema), que consistiría en modificar el programa para que se cumplan estas premisas:

a) Utilizar índices de 0 a 7 en lugar de 1 a 8
b) Mostrar todos los mensajes sobre un único label (es decir, siempre usar el mismo label e ir ampliando progresivamente sus contenidos).

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".