Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Mario R. Rancel

Páginas: [1] 2 3 4 5 6 ... 29
1
Comunidad / Re:Agradecido de encontrar esto.
« : 09 de Junio 2020, 11:03 »
Hola José Ramón, agradecemos tus palabras y esperamos que los contenidos de la web y la ayuda que puedas obtener en los foros te sean útiles. Un abrazo para Venezuela desde España.

2
Se plantea a continuación un enunciado y solución para un ejercicio simple de uso de ArrayList con objetos en Java.

Enunciado del ejercicio:

- Crea una clase DirectorCine con los atributos nombre (String), apellidos (String) y edad (int). Crea los métodos get y set para los atributos.

- Crea una clase testEjercicio con el método main y sigue los siguientes pasos:
 
-En el main, crea tres objetos DirectorCine que tengan como atributos respectivamente: Pedro, Gómez, 31. Juan, Suárez, 55. Elena, Albucar, 29.
 
-Crea un ArrayList de objetos DirectorCine.
 
-Añade los tres objetos DirectorCine al ArrayList usando el método add
 
-Procede a mostrar los datos de los tres directores creados usando un bucle for. Para ello el esquema que debes seguir es el siguiente (aunque hay otras formas de hacerlo)
           
                DirectorCine directorRecuparado; //Para almacenar datos
                String nombreRecuperado; String apellidosRecuperados; int edadRecuperada; //Para almacenar los datos
                Bucle desde i=0 hasta nombreDelArrayList.size()-1
                                               Recuperar el objeto de la lista
                                               //Por ejemplo DirectorRecuperado = listadoDirectores.get(i);
                                               Recuperar el nombre de ese director
                                               //Por ejemplo: nombreRecuperado = DirectorRecuperado.getNombre();
                                               Mostrar el nombre de ese director
                                               //Por ejemplo System.out.println("El nombre del director número "+i+1+ " es "+nombreRecuperado;
                                               Hacer lo mismo con los apellidos y con la edad
                Fin del bucle
 
9. Comprueba que al ejecutar el método main se muestren por pantalla los nombres, apellidos y edad de los tres directores
 
Una cosa importante a tener en cuenta es que System.out.println invocado sobre un objeto nos devuelve la referencia en memoria del objeto, cosa que en general carece de utilidad. Para poder mostrar atributos de un objeto hemos de recuperarlos si son tipos primitivos y proceder a mostrarlos (como en este ejercicio), o bien recuperarlos a través de un método del objeto (un método como "mostrarInformacion", "listarDatos" o como se quiera llamarlo. Más adelante veremos que hay una forma estandarizada para hacer esto que es el método toString pero esto no es necesario usarlo ahora).


Solución del ejercicio

Clase DirectorCine

Código: [Seleccionar]
public class DirectorCine{
   
    private String nombre;
    private String apellidos;
    private int edad; //Paso 1 y 2 pedido ejercicio
   
    public DirectorCine(){
        nombre="";
        apellidos="";
        edad=0; }
   
    public DirectorCine(String nombre,String apellidos, int edad){
        this.nombre=nombre;
        this.apellidos=apellidos;
this.edad = edad; //Paso 3 constructor pedido ejercicio
}
   
   //Métodos Get
    public String getNombre(){
        return nombre;}
   
    public String getApellidos(){
        return apellidos;}

       
    public int getEdad(){
        return edad;} //Paso 3 método get pedido ejercicio

   //Métodos set
    public void setNombre(String nombre){
        this.nombre=nombre;}
   
    public void setApellidos(String apellidos){
        this.apellidos=apellidos;}

    public void setEdad(int edad){
        this.edad=edad;} //Paso 3 método set pedido ejercicio
       
   
    public void visualizarDirector(){
        System.out.println("Nombre : "+nombre+", "+"Apellidos : "+apellidos + " Edad: "+edad);}
         
}//fin clase

Clase testEjercicio

Código: [Seleccionar]
import java.util.ArrayList;

public class testEjercicio { //Paso 4 clase pedida ejercicio

    public static void main (String[] Args){

        //Paso 5 pedido ejercicio
        DirectorCine director1 = new DirectorCine("Pedro", "Gómez", 31);
        DirectorCine director2 = new DirectorCine("Juan", "Suárez", 55);
        DirectorCine director3 = new DirectorCine("Elena", "Albucar", 29);

        //Declaramos el ArrayList de directores de cine Paso 6 pedido ejercicio
        ArrayList<DirectorCine> listaDirectores = new ArrayList<DirectorCine>();

        //Declaramos el ArrayList de directores de cine Paso 7 pedido ejercicio
        listaDirectores.add(director1);
        listaDirectores.add(director2);
        listaDirectores.add(director3);

        //Paso 8 pedido ejercicio
        DirectorCine directorRecuparado; //Para almacenar datos
        String nombreRecuperado; String apellidosRecuperados; int edadRecuperada; //Para almacenar los datos
        for (int i=0; i<listaDirectores.size(); i++) {
            directorRecuparado = listaDirectores.get(i);
            nombreRecuperado = directorRecuparado.getNombre();
            apellidosRecuperados = directorRecuparado.getApellidos();
            edadRecuperada = directorRecuparado.getEdad();
            System.out.println("Datos para el director "+(i+1)+" Nombre: "+nombreRecuperado + " Apellidos: "+apellidosRecuperados + " Edad: "+edadRecuperada);
        }
    }
}



3
Comunidad / Felices fiestas y próspero año 2020
« : 15 de Diciembre 2019, 12:21 »
Aprovechamos las fechas para desearles a todos felices fiestas y un próspero año 2020. Nuestro agradecimiento especial para quienes altruistamente ayudan a mantener los foros. ¡Felicidades!


4
Comunidad / Re:Presentación
« : 19 de Mayo 2019, 22:00 »
Hola Vierja, los foros están abiertos a cualquier persona, sea cual sea su edad y su nivel de conocimientos, tanto para preguntar como para responder, comentar, opinar, etc. Como complemento a lo que te ha indicado Kabuto, léete el hilo https://aprenderaprogramar.com/foros/index.php?topic=1460.0 donde tienes unas indicaciones generales sobre cómo participar en los foros. Respecto a las consultas que se reciben, ten en cuenta no siempre obtienen respuesta porque la participación en estos foros es altruista y no puede garantizarse nada salvo la voluntad, que tenerla la tenemos. Cordial saludo.

5
Comunidad / agradecimiento a Kabuto y feliz año nuevo
« : 31 de Diciembre 2018, 14:24 »
Nuestro agradecimiento a Kabuto por la ayuda que presta altruistamente en los foros. Y nuestra bienvenida como "moderador", rol que tiene a partir de hoy. Feliz año nuevo para todos.




6
Buenas tardes, el autor indica que el curso está en revisión continua y se encuentra vigente, por tanto puedes poner como fecha de publicación la fecha actual.

Saludos

7
Buenas tardes, procedo a cambiar el tema al foro "C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más". A alfredoDSK recomedarle que lea el hilo de normas, sugerencias y políticas en https://aprenderaprogramar.com/foros/index.php?topic=1460.0

Saludos

8
Hola Pedro, yo lo veo todo correcto. Aprovecho para agradecerte una vez más tu colaboración en los foros. Un abrazo,

9
Ya están corregidas las erratas indicadas. Gracias por colaborar en mejorar la página. Saludos.

10
Si hemos desarrollado el segundo paso habremos llegado a una solución similar a la siguiente.

Pseudocódigo

0. Inicio

     1. Mostrar “Control de cajero”
     2. Limiteexcedido = falso
     3. Mientras Limiteexcedido = falso Hacer         
         Mostrar “Introduzca la cantidad en euros a retirar”
         Pedir Retiro
         Totalretiros = Totalretiros + Retiro
         Si Totalretiros > = 600 Entonces
         Limiteexcedido = verdadero     
         FinSI   
         Repetir
4.Mostrar "Se ha excedido el límite permitido
5. Fin



Código Visual-Basic

Código: [Seleccionar]
Option Explicit On
'Control de cajero
Public Class Form1
    REM Declaración de variables
    Dim Totalretiros As Integer
    Dim Retiro As Integer
    Dim Limiteexcedido As Boolean
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Text = "Control de cajero"
Limiteexcedido = False
        Do While Limiteexcedido = False
            Retiro = InputBox("Introduzca la cantidad en euros a retirar", "Dato Retiro")
            Totalretiros = Totalretiros + Retiro
            If Totalretiros >= 600 Then
                Limiteexcedido = True
            End If
        Loop
        Label1.Text = vbCrLf & "La cantidad retirada ha excedido el limite." & vbCrLf & "Cajero fuera de servicio. Acuda al más cercano."
    End Sub
End Class

Aquí la variable Limiteexcedido (variable booleana) decimos que funciona como elemento auxiliar y que es un interruptor, en el sentido de que cuando está en "ON" (verdadero) ocurre lo contrario a cuando está en "OFF" false.

Con esto hemos cumplido lo que pedía el enunciado. Comprobémoslo:

a) Programa que vaya registrando la cantidad extraida en cada ocasión durante un día: la cantidad de cada extracción se registra en la variable Retiro

b)  y use un acumulador para registrar el total. El acumulador es Totalretiros

c) A su vez, mediante un interruptor se debe controlar cuándo se excede la cantidad máxima permitida y en ese momento mostrar el mensaje “Se ha excedido la cantidad máxima permitida”. El interruptor (variable booleana) es quien controla cuándo se excede la cantidad máxima permitida. Cuando esto ocurre, se produce la salida del bucle y se muestra el mensaje.

11
Buenas tardes Papazot3

He intentado compilar tu código, pero no me ha sido posible (el compilador indica que faltan clases, por ejemplo la clase Lista. Para recabar ayuda sería importante que aportaras el código de todas las clases que intervienen.

Para la petición de dato estás usando un String, y por tanto todo lo que introduzca el usuario se considera String y luego se parsea con el método que invocas a otro dato. Para realizar una validación más exigente tendrías que realizar la captura del dato sobre otro tipo de dato (por ejemplo Integer para valores numéricos), o realizar una validación sobre el String.

En estos cursos se explican los conceptos de Java:

http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188

http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=58&Itemid=180

Saludos cordiales

12
Si hemos desarrollado el primer paso habremos llegado a una solución similar a la siguiente:

Pseudocódigo:

0. Inicio
      1. Mostrar “Control de cajero”
      2. Mientras TotalRetirado < 600 Hacer
          Mostrar “Introduzca la cantidad en euros a retirar”
          Pedir RetiroActual
          TotalRetirado = TotalRetirado + RetiroActual
           Repetir
       3. Mostrar "La cantidad retirada ha excedido el limite.Cajero fuera de servicio."
4. Fin



Código Visual Basic:

Código: [Seleccionar]
Option Explicit On
'Control de cajero
Public Class Form1
    REM Declaración de variables
    Dim TotalRetirado As Integer
    Dim RetiroActual As Integer
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Text = "Control de cajero"
        Do While TotalRetirado < 600
            RetiroActual = InputBox("Introduzca la cantidad en euros a retirar", "Dato RetiroActual")
            TotalRetirado = TotalRetirado + RetiroActual
        Loop
        Label1.Text = vbCrLf & "La cantidad retirada ha excedido el limite." &
        vbCrLf & "Cajero fuera de servicio. Acuda al más cercano."
    End Sub
End Class

Con este programa simulamos el que se vaya retirando dinero progresivamente hasta que si se alcanza que el dinero total retirado es de 600 euros o superior ya no se permite continuar retirando dinero y se muestra un mensaje de advertencia. El programa podría mejorarse pero no vamos a entretenernos en ello por el momento.

Pasemos al segundo paso, que vamos a plantear en estos términos:

Declararemos una variable booleana a la que podemos poner un nombre como limiteExcedido ó limiteSobrepasado o similar.

Inicialmente haremos que esa variable booleana sea false (recordar que las variables booleanas solo pueden tomar dos valores, true ó false o en castellano verdadero ó falso).

Ahora el bucle en lugar de estar controlado por la condición TotalRetirado < 600 deberá estar controlado por la variable booleana con una condición del tipo "Mientras limiteExcedido sea igual a falso, entramos en el bucle. En caso contrario, no entramos", de modo que si la variable booleana vale false se debe entrar en el bucle, y si vale true no se debe entrar.

Dado que inicialmente hemos dicho que la variable booleana valdrá false, tendremos que establecer un condicional (un Si-Entonces o If-Then) para detectar, después de cada retirada de dinero, si la variable booleana debe cambiarse a true (verdadero) para evitar la repetición del bucle.

De este modo, después de una retirada de dinero tendremos que:

- Actualizar el valor de TotalRetirado
- Comprobar si TotalRetirado es igual o superior a 600 (que es el límite para repetir la petición de retirada de dinero o no). Si TotalRetirado es igual o superior a 600 debemos cambiar el valor de la variable booleana a true (que significa que se ha excedido el límite disponible). Si no es igual o superior a 600 no hemos de hacer nada: al no hacer nada la variable booleana seguirá siendo false y se volverá a pedir al usuario que introduzca una cantidad de dinero a retirar.

Debemos plantear el pseudocódigo, e igualmente escribir el código.

Nota: para comprobar que el pseudocódigo sea correcto se recomienda "traducirlo" a Visual Basic y comprobar que todo funcione correctamente.

Finalmente conviene comparar el código del paso 1 y el del paso 2 y reflexionar ¿en qué ha consistido el cambio? ¿supone un cambio en el funcionamiento del programa o realmente el funcionamiento es el mismo diferiendo solo el planteamiento?

Una vez tengamos este paso completado daremos orientaciones adicionales.

13
Buenos días Bettu, felicitarte por el trabajo desarrollado. Es correcto tanto generar un objeto vacío y luego establecer sus propiedades con set, como generar el objeto directamente con sus datos utilizando un constructor. En realidad, puede ser preferible esta última forma ya que haces en un solo paso lo que de la otra forma haces en dos pasos.

Una mejora que podrías hacer a tu ejercicio es introducir una clase intermedia para agrupar características comunes: una "abstracción".

Esto puedes verlo en distintos ejercicios del foro, por ejemplo en http://www.aprenderaprogramar.com/foros/index.php?topic=2342.0 la clase ProductoRefCong es una abstracción.

Otra cosa que debes mejorar es esta:

        productoCongeladoAgua1.mostrarDatosProducto();
        productoCongeladoAgua1.muestraInfoProdCongelado();


La herencia te permite reutilizar el código de forma que no tengas que duplicar llamadas. Fíjate en cómo se plantea en el ejercicio que te he indicado antes:

   public void imprimirCongeladoPorNitrogeno(){
      imprimirProductoC();
      System.out.println("Metodo de congelacion: " + getMetodoCongelacion() + "\nTiempo de exposicion al nitrogeno: " + getTiempoExposicion());
   }

De este modo no es necesario hacer una llamada a mostrar los datos de producto y luego mostrar info de producto congelado. En la propia clase puedes reutilizar el código de sus superclases. Esto es importante comprenderlo en programación orientada a objetos.

Busca el código CU00687B en el buscador del foro y fíjate en las distintas formas de planteamiento que han ofrecido distintos compañeros y compáralo con tus planteamientos, esto te puede ayudar a mejorar.

Saludos,

14
Vamos a estudiar cómo usar una variable booleana para controlar un bucle.

El enunciado que se nos plantea es el siguiente:

5. Un cajero automático permite extraer distintas cantidades de dinero en un día hasta alcanzar el límite de 600 euros. Se quiere plantear un programa que vaya registrando la cantidad extraida en cada ocasión durante un día y use un acumulador para registrar el total. A su vez, mediante un interruptor se debe controlar cuándo se excede la cantidad máxima permitida y en ese momento mostrar el mensaje “Se ha excedido la cantidad máxima permitida”. Desarrollar el pseudocódigo.

Ejemplo de ejecución:
Introducir la cantidad extraida: 200
Introducir la cantidad extraida: 300
Introducir la cantidad extraida: 400
Se ha excedido la cantidad máxima permitida [Fin]



Primer paso:

Vamos a plantear un pseudocódigo sin hacer uso de variables booleanas (para empezar de una forma simplificada, luego las introduciremos) de modo que nuestro objetivo ahora es que se pida al usuario la cantidad a retirar y cuando se supere que el acumulado retirado es mayor de 600 euros, nos muestre un mensaje de aviso informando de que se ha superado el límite.

Una vez planteado el pseudocódigo, escribir un pequeño programa en Visual Basic para probarlo. Para pedir los datos en Visual Basic usaremos InputBox. Para ver un ejemplo de uso de inputbox podemos consultar http://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=203:funcion-val-con-visual-basic-convertir-texto-textbox-inputbox-en-valores-numericos-ejemplos-cu00318a&catid=37:curso-aprender-a-programar-visual-basic-desde-cero&Itemid=61

Tareas a realizar:

1) Definir los nombres de variables que vamos a utilizar y su significado (de momento solo necesitamos una variable para acumular el resultado y si lo deseamos, alguna variable auxiliar más. De momento no usaremos variables booleanas)
2) Definir el pseudocódigo
3) Escribir un pequeño programa en Visual Basic para probar este pseudocódigo
4) Si hay problemas, corregir el pseudocódigo y repetir la prueba hasta que tanto el pseudocódigo como el pequeño programa en Visual Basic podamos considerar que son correctos.

Podríamos pensar en escribir directamente el código saltándonos el pseudocódigo. Eso sería una mala práctica: sería como empezar a construir una casa sin planos. Antes de hacer hay que pensar-planificar. Ese es el papel que juega el pseudocódigo. Para aprender a planificar, corregimos nuestra planificación haciendo uso de un pequeño programa en Visual Basic que nos dirá si hemos planificado correctamente o no.

Una vez tengamos este pseudocódigo y el código de Visual Basic asociado, pasaremos al siguiente paso.


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

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

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

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

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

20
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

Páginas: [1] 2 3 4 5 6 ... 29
Esto es un laboratorio de ideas...
Aprender a programar

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