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 7 8 ... 32
41
Ya que nuestro 'máster' Kabuto se ha tomado el trabajo de preparar el código (gracias como siempre), me permito subirlo para que pueda ser accedido fácilmente y se mantenga aunque se rompan los links si esto ocurriera.
Si me equivoco en algo corrígeme Kabuto. El proyecto consta de dos packages con diferentes archivos como se indica a continuación:

package batalla: clases BatallaSwing.java (clase con el main) y Pokemon.java
package gui: clases PanelPokemon.java, PanelVS.java y PanelMensajes.java

Para que el código funcione es necesario poner las imágenes en la ruta adecuada y con los nombres adecuados, o bien modificarlo. Las imágenes están referenciadas en las líneas

pnPok1 = new PanelPokemon(pok1, "img/pikachu.png");
pnPok2 = new PanelPokemon(pok2, "img/bulbasaur.png");
ImageIcon imagen = new ImageIcon(PanelVS.class.getClassLoader().getResource("img/vs.png"))


CLASE BatallaSwing

Código: [Seleccionar]
package batalla;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import gui.*;

@SuppressWarnings("serial")
public class BatallaSwing extends JFrame{

    private Pokemon pok1;
    private Pokemon pok2;
    private PanelMensajes pnMensajes;
    private PanelPokemon pnPok1;
    private PanelPokemon pnPok2;

    public BatallaSwing() {

        pok1 = new Pokemon("Pikachu", 100, true);
        pok2 = new Pokemon("Bulbasaur", 100, false);
        pnMensajes = new PanelMensajes();
        pnPok1 = new PanelPokemon(pok1, "img/pikachu.png");
        pnPok1.actualizarPanel();
        pnPok1.agregarAccion(new AccionAtacar());
        pnPok2 = new PanelPokemon(pok2, "img/bulbasaur.png");
        pnPok2.actualizarPanel();
        pnPok2.agregarAccion(new AccionAtacar());

        setLayout(new BorderLayout());

        add(pnMensajes, BorderLayout.NORTH);
        JPanel pnCentro = new JPanel();
        pnCentro.add(pnPok1);
        pnCentro.add(new PanelVS());
        pnCentro.add(pnPok2);
        add(pnCentro, BorderLayout.CENTER);

        setTitle("Batalla Pokemon");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private class AccionAtacar implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {

            if (pok1.suTurno) {
                pok2.perderVida(pok1.atacar());
                pnMensajes.setMensaje(pok1.mensaje);
                pok1.suTurno = false;
                pok2.suTurno = true;
            }
            else {
                pok1.perderVida(pok2.atacar());
                pnMensajes.setMensaje(pok2.mensaje);
                pok1.suTurno = true;
                pok2.suTurno = false;
            }

            pnPok1.actualizarPanel();
            pnPok2.actualizarPanel();

            if (pok1.getVida() <= 0 || pok2.getVida() <= 0) {
                String mensajeFinal = "Juego Terminado\n Ha ganado: ";
                mensajeFinal += pok1.getVida()>0?pok1.getNombre():pok2.getNombre();

                JOptionPane.showMessageDialog(null, mensajeFinal, "Fin del Juego",
                    JOptionPane.INFORMATION_MESSAGE);

                //Valores por defecto para volver a jugar
                pok1.setVida(100);
                pok1.suTurno = true;
                pok2.setVida(100);
                pok2.suTurno = true;
                pnPok1.actualizarPanel();
                pnPok2.actualizarPanel();
                pnMensajes.setMensaje("¡Comienza la batalla!");
            }

        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new BatallaSwing();
                }
            });
    }

}


CLASE Pokemon

Código: [Seleccionar]
package batalla;

import java.util.Random;

public class Pokemon {

private String nombre;
private int vida;
private Random azar = new Random();

public String mensaje; //Mensaje que se genera tras un ataque
public boolean suTurno; //Indica si es el turno de ataque de este Pokemon

public Pokemon(String nombrePok, int vidaPok, boolean turno) {
nombre = nombrePok;
vida = vidaPok;
mensaje = "";
suTurno = turno;
}

public String getNombre() {
return nombre;
}

public int getVida() {
return vida;
}

public void setVida(int v) {
vida = v;
}

public int atacar() {

mensaje = ""; //Se generará un nuevo mensaje
int ataque = azar.nextInt(11) + 10;

if (esCritico()) {
mensaje += "¡Ataque crítico! ";
ataque =  (int)(ataque * 1.5);
}

mensaje += "Daño: " + ataque + " puntos";
return ataque;
}

public void perderVida(int ataque) {
vida -= ataque;
}

private boolean esCritico() {
int valor = azar.nextInt(100);
/*
* Entre 0 y 100 hay diez valores que son
* múltiplos de 10.
* Es decir, hay un 10% de posibilidades
* de obtener un valor múltiplo de 10.
*/

return valor%10 == 0;
}

@Override
public String toString() {
return "Nombre: " + nombre + "\nVida: " + vida;
}

}


CLASE PanelPokemon

Código: [Seleccionar]
package gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.border.BevelBorder;
import javax.swing.border.TitledBorder;

import batalla.Pokemon;

@SuppressWarnings("serial")
public class PanelPokemon extends JPanel{

    private Pokemon pokemon;
    private JButton btAtacar;
    private JProgressBar barraVida;

    public PanelPokemon(Pokemon pok, String rutaImagen) {

        pokemon = pok;

        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        add(new PanelNombre());
        add(new PanelImagen(rutaImagen));
        add(new PanelVida());
        add(new PanelBoton());

    }

    private class PanelNombre extends JPanel {

        public PanelNombre() {
            JLabel nombre = new JLabel(pokemon.getNombre());
            nombre.setFont(new Font("Consolas", Font.BOLD, 34));
            nombre.setForeground(Color.WHITE);
            add(nombre);
            setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED, Color.WHITE, Color.BLACK));
            setBackground(new Color(23, 151, 238));
        }
    }

    private class PanelImagen extends JPanel {

        public PanelImagen(String rutaImagen) {
            ImageIcon imagen = new ImageIcon(PanelPokemon.class.getClassLoader().getResource(rutaImagen));
            JLabel icono = new JLabel(imagen);
            icono.setBorder(BorderFactory.createLoweredSoftBevelBorder());
            add(icono);
        }
    }

    private class PanelVida extends JPanel {

        public PanelVida() {

            barraVida = new JProgressBar();
            barraVida.setMaximum(pokemon.getVida());
            barraVida.setValue(pokemon.getVida());
            barraVida.setPreferredSize(new Dimension(200, 30));
            barraVida.setForeground(Color.BLUE);
            add(barraVida);
            barraVida.setBorder(BorderFactory.createRaisedSoftBevelBorder());

            TitledBorder bordeTitulado = new TitledBorder("Nivel de Vida");
            bordeTitulado.setTitleFont(new Font("Consolas", Font.ITALIC, 24));
            setBorder(bordeTitulado);
        }
    }

    private class PanelBoton extends JPanel {

        public PanelBoton() {
            btAtacar = new JButton("¡ATACAR!");
            btAtacar.setFont(new Font("Consolas", Font.BOLD, 30));
            add(btAtacar);
            setBorder(BorderFactory.createEmptyBorder(30, 20, 30, 30));
        }
    }

    public void actualizarPanel() {
        barraVida.setValue(pokemon.getVida());
        btAtacar.setEnabled(pokemon.suTurno);
    }

    public void agregarAccion(ActionListener accion) {
        btAtacar.addActionListener(accion);
    }

}


CLASE PanelVS

Código: [Seleccionar]
package gui;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class PanelVS extends JPanel{

    public PanelVS() {
        ImageIcon imagen = new ImageIcon(PanelVS.class.getClassLoader().getResource("img/vs.png"));
        JLabel icono = new JLabel(imagen);
        add(icono);
    }
}


CLASE PanelMensajes

Código: [Seleccionar]
package gui;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;

@SuppressWarnings("serial")
public class PanelMensajes extends JPanel{

    private JLabel mensajes;

    public PanelMensajes() {
        JPanel display = new JPanel();
        mensajes = new JLabel("¡Comienza la batalla!");
        mensajes.setFont(new Font("Calibri", Font.PLAIN, 38));
        mensajes.setForeground(new Color(243, 81, 55 ));
        display.add(mensajes);

        setLayout(new GridLayout(1, 1));
        add(display);
        setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(10, 15, 10, 15),
                BorderFactory.createEtchedBorder(EtchedBorder.RAISED)));
        display.setBackground(new Color(230, 234, 160 ));
    }

    public void setMensaje(String mensaje) {
        mensajes.setText(mensaje);
    }

}

42
Comunidad / Feliz Navidad y Próspero Año Nuevo para todos
« en: 20 de Diciembre 2020, 19:51 »
Un año más desde aprenderaprogramar.com les transmitimos nuestros deseos para que todos tengan una

Feliz Navidad y Próspero Año Nuevo.

Gracias a todos los que colaboran o han colaborado con aprenderaprogramar.com





43
La solución que le hemos dado es:

Consideramos que una fecha tiene un valor numérico equivalente entero, por lo que podemos hacer comparaciones entre fechas con los operadores mayor, menor, igual, etc. Esto es posible en la mayor parte de lenguajes de programación y hojas de cálculo.

- Plantear los posibles casos de eventos activos que se pueden dar. Hemos encontrado cuatro casos. Hemos considerado cuatro eventos y un periodo de selección:

Periodo de selección
Fsel = 5/5/2067
Ffinsel = 15/10/2067

Evento 1: del 25/9/2067 al 5/10/2067, empieza antes del comienzo del periodo de selección y termina antes del fin del periodo de selección.
Evento 2: del 06/10/2067 al 12/10/2067, empieza después del comienzo del periodo de selección y termina antes del fin del periodo de selección.
Evento 3: del 11/10/2067 al 20/11/2067, empieza después del comienzo del periodo de selección y termina después del fin del periodo de selección.
Evento 4: del 05/05/2067 al 20/12/2067, comienza antes del comienzo del periodo de selección y termina después del fin del periodo de selección.

Expresado en forma de tabla:

Caso*Finicio*Ffin
1*<Fsel*>Fsel y <Ffinsel
2*>Fsel*<Ffinsel         
3*>Fsel y <Ffinsel*>Ffinsel         
4*<Fsel*>Ffinsel         

Finalmente, ¿cuál es la condición lógica para dada una lista de eventos cada uno de los cuales tiene una fecha de inicio  Finicio y una fecha de terminación Ffin, seleccionar aquellos que están activos en un periodo de selección comprendido entre una fecha inicial Fsel y una fecha final Ffinsel

La condición (Ffin > Fsel y Ffin < Ffinsel) cubre los casos 1 y 2
La condición (Finicio<Ffinsel y Ffin > Fsel) cubre los casos 3 y 4

La condición para poder seleccionar todos los eventos de una lista que estén activos en un periodo de selección determinado sería:



Si (Ffin(i) > Fsel AND Ffin(i) < Ffinsel OR Finicio(i) < Ffinsel AND Ffin(i) > Fsel) entonces
   Mostrar "Evento " nombre(i) " activo en el peridodo de selección"
Sino
   Mostrar "Evento " nombre(i) " no activo en el peridodo de selección"
FinSi



Hasta donde hemos podido probar funciona bien. Si alguien encuentra algo a mejorar comentarlo. Saludos.

44
Hola, voy a exponer un problema que se nos ha planteado y cómo lo hemos solucionado, ya que creo que puede ser interesante para estudiar y resolver como problema de algoritmia.

El problema se formula así:

- Llamamos evento a una actividad tipo espectáculo, mercadillo, feria, congreso, jornadas, encuentros, festivales, etc.

- Un evento es una actividad que puede durar un día o más de un día, siendo siempre días consecutivos. Si los días no fueran consecutivos se considerarían dos eventos.

- Un evento decimos que está activo en un rango de fechas que comprende desde el primer día de actividad o día de comienzo "Finicio", hasta el último día de actividad o día de terminación(Ffin). En un evento de sólo un día ambos coinciden.

Se quieren determinar los eventos que se encuentran activos al menos uno de los días de un intervalo temporal determinado al que se llama periodo de selección, comprendido entre una fecha de selección inicial (Fsel) y una fecha de selección final (Ffinsel).

Ejemplo: el festival "Europe for music" tiene lugar del 14/11/2067 al 29/11/2067.

¿Está activo en el periodo de selección que comprende del 29/10/2067 al 15/12/2067?

La respuesta es que sí puesto que al menos un día del periodo de selección coincide con el periodo de actividad del evento?

45
Hola, un problema interesante de algoritmia para entretenerse un rato y que que puede solucionarse de múltiples maneras, algunas más matemáticas y otras más intuitivas. Y nada sencillo como ejercicio para iniciarse en programación. Tener en cuenta que una circunferencia sólo tiene una forma, pero una media luna puede dibujarse de muchas maneras. Voy a indicar cómo lo he planteado yo. En primer lugar he empezado estudiando el problema y me he dibujado una media circunferencia de radio r. Para ello he optado por situar el centro de la circunferencia en el origen de los ejes de coordenadas, es decir, en el punto (0, 0), pues eso en principio simplifica un poco la ecuación de la circunferencia. Podría haber pensado en dibujar la luna con forma de C o con forma de D. Yo he optado por dibujarla con forma de C, por lo que me he centrado en "el lado izquierdo" de la circunferencia.

Con esto nos podemos hacer un esquema con unos ejes de coordenadas donde nuestra circunferencia pasa por los puntos (0, r) (-r, 0) y (0, -r)


Con esta representación las coordenadas x van desde -r hasta 0, las coordenadas y van desde r hasta -r, y podemos usar la ecuación de la circunferencia x^2 + y^2 = r^2  Si sqr(a) es la raíz de a podemos escribir x = sqr (r^2-y^2)

Para ver un caso concreto he tomado una circunferencia de radio 3.

Podemos ir sacando puntos de la circunferencia tomando valores de y y obteniendo valores de x. Así tendríamos:

y=3; x = sqr (3^2-3^2) = sqr (9-9) = sqr(0) = 0 obtenemos (0, 3)
y=2; x = sqr (3^2-2^2) = sqr (9-4) = sqr(5) = -2.23 tomando el valor negativo a conveniencia por interesarnos la parte izquierda de la gráfica
y=1; x = sqr (3^2-1^2) = sqr (9-1) = sqr( 8 ) = -2.82 tomando el valor negativo a conveniencia
y=0; x = sqr (3^2-0) = sqr (9) = -3 tomando el valor negativo a conveniencia
y=-1; x = sqr( 8 ) = -2.82 tomando el valor negativo a conveniencia
y=-2; x = sqr(5) = -2.23 tomando el valor negativo a conveniencia
y=-3; x = sqr(0) = 0 obtenemos (0, -3)

La cuestión ahora es cómo representar esto con asteriscos en la consola. La diferencia entre la consola y unos ejes de coordenadas es que en la consola no podemos trabajar con posiciones de caracteres en supuestas coordenadas reales. La consola sólo nos permite definir si un carácter está en posición uno, dos tres, cuatro etc. pero claro, siempre un número entero.

La consola podríamos verla como una matriz de celdas donde el centro de cada celda se corresponde con un par de coordenadas enteras de los ejes cartesianos.


Con esta idea si colocamos un asterisco en la celda (-3,-3) equivaldría a colocar el asterisco con su centro en el punto (-3,-3)

Para nuestra circunferencia de radio 3 tenemos sólo tres puntos con todas las coordenadas enteras: el (0,3), el (-3,0) y el (0,-3) Pero ¿qué hacemos con el (2, -2.23) y el (1, -2.82) Pues no podemos representarlo en la consola. O al menos no podemos representarlo con exactitud. Como solución aproximada he optado por dibujar el asterisco en el entero más próximo a la coordenada deseada. Así pondré el asterisco en (2, -2) y en (1, -3) y así con cualesquiera valores. De ese modo lo que tenemos que resolver es en qué lugar de cada fila colocar el asterisco.

Para la consola voy a suponer que el rango de coordenadas viene dado en función del radio que el usuario elija para la circunferencia. Así, si el usuario elige radio 3 por ejemplo, la primera coordenada de acuerdo con el esquema planteado es (3, -3) ya que los límites de mi espacio de representación considero que vienen dados por el radio. Si el radio fuera 6 la primera posición sería (6, -6) y así sucesivamente.

Ya pasando a la codificación tendremos que pedir el radio al usuario, recorrer con un for exterior todas las filas de la matriz que se corresponden con las coordenadas y posibles y que en el caso de radio 3 serían 3, 2, 1, 0, -1, -2, -3 que equivale a un (for y=3; y>=-3; y--)

Dentro de una fila tengo que decidir en qué posición pongo el asterisco y esto lo he hecho con una variable stop1 = -round(sqrt(r*r-y*y)); El round me da el entero más próximo. El signo negativo lo tomo a conveniencia ya que la raíz de un número es +- algo y en mi representación me interesa el signo negativo.

Una vez obtenido el stop, recorro las columnas de la matriz de posiciones con un for(x = -(r); x <= 0; x++) parando en cero porque sólo nos interesa media circunferencia. En cada iteración se van colocando espacios hasta llegar a la posición del stop en la fila, y en ese momento insertamos el asterisco. En ese momento si solo quisiéramos dibujar la media circunferencia podríamos hacer un break.

Pero falta dibujar la curva que forma la media luna. Aquí podría hacerse de distintas maneras. Yo he pensado en una curva que pase por (0,r) y (0,-r) y por un punto intermedio entre (-3,0) y (0,0) aunque podría hacerse de otras maneras. La curva podría hacerse con una hipérbola. O con una circunferencia. Si la circunferencia es de igual radio tendríamos que desplazarla, pero además no pasaría por los puntos deseados.


Podríamos solucionarlo eliminando algunos puntos sobrantes o agrandando el diámetro de la circunferencia. Tomando una circunferencia de mayor radio sí podemos hacerla pasar por esos puntos, pero obtener la ecuación de una circunferencia que pasa por tres puntos no es trivial.

Como esto iba complicando todo y no se trata de un dibujo para la NASA, lo más sencillo me ha parecido plantear que la curva para y=0 pase por el punto medio entre el (0, -r) y el (0,0) que es el (0, -r/2). Y como colocando cada asterisco para la forma de la media luna a mitad de distancia podía generarse la forma, pues listo. Lo que tenemos que hacer entonces es definir dos posiciones para asteriscos: el de la media circunferencia stop1 y el que crea la forma de media luna stop2 que está a la mitad: stop2 = stop1/2; y dibujar asteriscos en ambas posiciones, y si no, un espacio en blanco con if (x == stop1 || x == stop2) {printf("*");} else printf(" ");}

El código, para cualquier radio, mucho más simple que toda esta explicación:

Código: [Seleccionar]
#include <stdlib.h>
#include<stdio.h>
#include <math.h>

// Dibujar una media luna con asteriscos lenguaje C
// Ecuación circunferencia x^2 + y^2 = r^2
// https://aprenderaprogramar.com/foros/index.php?topic=7781.0
    int main(){
        //stop1 indica la coordenada x donde debe insertarse el asterisco para una coordenada "y" determinada para el círculo exterior
        // stop2 idem para la curva interior de la luna
        int r, x, y, spc, stop1, stop2;
        printf("Introduzca el radio de la luna: ");
        scanf("%d", &r);

        for(y = r; y >= -r; y--){
                stop1 = -round(sqrt(r*r-y*y));
                stop2 = stop1/2;

            for(x = -(r); x <= 0; x++){
                if (x == stop1 || x == stop2) {printf("*");} else printf(" ");}

        printf("\n");
    }
    }

Saludos

46
De acuerdo con lo indicado por Zebulon, debe existir un elemento raíz en cualquier documento XML y en este caso no estaba definido. Gracias por la observación. Saludos

47
Este hilo de los foros se crea a modo de agradecimiento y reconocimiento a las personas que han hecho y hacen posible estos foros.

Los foros se crearon en 2011 y han sido posibles gracias a por un lado personas que se encargaron de montarlos, mantener el servidor, etc. pero sobre todo han sido posibles gracias a todas las personas que han participado y participan en ellos. Como no podemos nombrarlas a todas, los responsables de la web hemos creido oportuno crear este hilo, donde nombraremos a usuarios que han destacado por algún motivo dentro de los foros. Creemos que lo más destacable es que detrás de cada usuario hay una persona y por tanto un lado humano. Este lado humano se traduce en innumerables historias asociadas a la web y los foros: personas que se han formado de forma autodidacta o mediante cursos tutorizados en la programación, estudiantes que han complementado su formación, titulados que se han reciclado o actualizado, programadores que simplemente han querido colaborar ayudando a otros, personas que después de la ayuda recibida han encontrado trabajo y nos han hecho llegar mensajes de agradecimiento, personas que han mostrado su agradecimiento realizando aportaciones económicas para el mantenimiento de la web y los foros, y un sin fin de historias humanas que no hay espacio para enumerar.

Este hilo no puede ser preciso ni completo ya que son muchísimas las personas que habría que nombrar. Intentaremos irlo modificando y ampliando para recoger sugerencias, cambios, incorporaciones, etc. a medida que pase el tiempo. 

Si alguna persona cree que falta, o alguna citada quiere modificar su descripción, añadir algún comentario o algún link a una web o proyecto personal, puede contactar con nosotros a través de los correos electrónicos que aparecen en el apartado de "Contacto" de la web.



PERSONAS (USUARIOS) CON NUESTRO ESPECIAL RECONOCIMIENTO Y AGRADECIMIENTO, POR ORDEN ALFABÉTICO

Alex Rodríguez: fundador y moderador que participa desde la creación de los foros. Ha ayudado a innumerables usuarios tanto en cuestiones técnicas como en la valoración y corrección de respuestas a ejercicios propios de cursos de la web. Alex Rodríguez

César Krall: moderador que participa desde la creación de los foros, siempre de buen talante y ayudando a otras personas con orientación o resolución de dudas. Su lema: "No vales por lo que dices, sino por lo que haces." César Krall

Dan_SB: desde Panamá siguió con brillantez diversos cursos de la web, aportando su solución para numerosos ejercicios. Dan_SB

Dimitar Stefanov: ha sido alumno de diferentes cursos de la web y ha aportado su solución para gran cantidad de ejercicios de estos cursos. También ha colaborado ayudando a otros usuarios a resolver dudas o a valorar respuestas planteadas para ejercicios. Dimitar Stefanov

Erik_Escriche: ha sido alumno de cursos de la web aportando su solución a numerosos ejercicios, y ha sido benefactor de la web colaborando con ella.  Erik_Escriche

Kabuto: comenzó como usuario consultando, luego pasó a ayudar a otros a resolver sus dudas y finalmente se convirtió en un magnífico moderador, uno de los mejores por la claridad y paciencia en sus explicaciones. Kabuto

Lorenzo31: ha sido alumno de diferentes cursos de la web y ha aportado su solución para gran cantidad de ejercicios de estos cursos. También ha colaborado ayudando a otros usuarios a resolver dudas y ha sido benefactor de la web colaborando con ella. Lorenzo31

Mario R. Rancel: fundador de la web y de los foros, autor de diferentes cursos y libros sobre programación y algoritmia. Su último proyecto ha sido Didac-Prog Cartesia: aplicación para la enseñanza de la programación a niños. Mario R. Rancel

Ogramar: moderador que participa desde la creación de los foros, ha destacado por su constancia, perseverancia y buen nivel de conocimientos, con especial atención a personas que han planteado sus soluciones a los ejercicios de los cursos propuestos en la web para orientarlos respecto a lo adecuado de sus propuestas de solución. Ogramar

pedro,,: comenzó como alumno realizando ejercicios de diferentes cursos de la web, que completó con brillantez. Después pasó a ayudar a otros y se convirtió en un magnífico moderador, apreciado por su paciencia y magníficas explicaciones. pedro,,

toni_apr: comenzó como alumno destacando por su constancia e interés. Después pasó a ser moderador ayudando a muchísimos otros usuarios a formarse y mejorar su capacitación. toni_apr



48
Comunidad / Re:Agradecido de encontrar esto.
« en: 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.

49
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);
        }
    }
}



50
Comunidad / Re:Presentación
« en: 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.

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




52
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

53
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

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

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

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

57
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

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

59
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 https://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,

60
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 https://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.


Páginas: 1 2 [3] 4 5 6 7 8 ... 32

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