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.


Temas - Mario R. Rancel

Páginas: [1] 2 3
1
Comunidad / Feliz Navidad y Próspero Año Nuevo para todos
« en: 09 de Diciembre 2023, 14:09 »
Otro año más llegan las fechas navideñas, en esta ocasión parece que ya superada la pandemia y de regreso a la "vida normal". 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, sin ustedes no sería posible que este sitio siguiera abierto.



2
Hola a todos, con el comienzo de mes y comienzo de un nuevo curso académico hemos renovado la imagen de nuestra web. aprenderaprogramar.com es un proyecto web y editorial que lleva funcionando ininterrupidamente desde 2006, que no es un tiempo despreciable. La nueva imagen tiene el color azul y blanco como tema principal, y se adapta a los estándares modernos de diseño y programación. En la anterior imagen eran el verde y el blanco los colores predominantes. Gracias a todos los que nos han apoyado a lo largo de estos años. Para cualquier sugerencia pueden contactar con nosotros por cualquiera de las vías que se indican en el apartado de contacto: https://www.aprenderaprogramar.com/index.php?option=com_contact&view=contact&id=1&Itemid=37

3
Comunidad / ajustes con caídas intermitentes
« en: 23 de Enero 2023, 21:02 »
Estamos realizando algunos ajustes en el sitio web que pueden provocar caídas intermitentes. Disculpas por las molestias.

4
Comunidad / Feliz Navidad y Próspero Año Nuevo para todos
« en: 15 de Diciembre 2022, 09:05 »
Un año más llegan las fechas navideñas, en esta ocasión parece que superando ya la pandemia. 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, sin ustedes no sería posible que este sitio siguiera abierto.



5
Trataremos de responder aquí a la pregunta planteada ¿Es TreeSet o HashSet un tipo de List en Java?

Para saber las clases que son de supertipo List puedes escribir en google "List api java 11" (suponiendo que estás usando versión de java 11) y acceder a la documentación del api de Java https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/List.html

Ahí al principio verás las clases que tienen supertipo List

All Known Implementing Classes: AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector

Estas son las clases de tipo List, por tanto ni TreeSet ni HashSet son de tipo List.

Si quieres saber cuál es el supertipo de TreeSet puedes escribir en google "treeset api java 11" y acceder a https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/TreeSet.html

Ahí te indica la herencia de TreeSet y los supertipos a los que pertenece TreeSet

All Implemented Interfaces: Serializable, Cloneable, Iterable<E>, Collection<E>, NavigableSet<E>, Set<E>, SortedSet<E>

En este caso, con el enfoque con el que estamos trabajando, lo que interesa aquí es que TreeSet es un tipo de Set (conjunto). No aparece que implemente la interface List, por lo tanto no es un tipo de List.

Esta forma de conocer los supertipos, tanto desde "arriba hacia abajo" (buscando List y viendo qué clases la implementan) o desde "abajo hacia arriba" (buscando una clase como TreeSet y viendo qué interfaces implementa) puede ser muy útil para la programación Java.

Nota: obviamente, si un método nos pide un tipo List, no podemos pasarle un TreeSet porque un TreeSet no es un tipo de List.


6
Hola a todos, reproduzco a continuación un tema que fue creado por LordFer y por Kabuto para que pueda ser consultado y servir de ayuda, gracias a ambos.

LordFer: Buenas tardes programadores, escribo en este foro ya que no encuentro solución para terminar mi código. Se trata de crear una agenda de contactos que contenga las siguientes opciones: añadir contacto, eliminarlos, lista de todos los contactos, y buscar contactos, según su apellido, nombre o correo.

Esta ultima parte es la que no se realizar, por eso les pido ayuda, ya que no tengo mucha experiencia en programación.

Les adjunto lo que llevo de código.

No se que escribir en else if (opciones equals("4"))


Main.java -->

Código: [Seleccionar]
import AgendaDef.Contacto;
import AgendaDef.Agenda;
//import AgendaDef.OrdenApellidos;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/* Autores:  */

public class Main{
   
    public static void main(String [] args)
    {
        Pattern pattern = Pattern
               .compile("^[_A-Za-Z0-9-\\+]+(\\.[_A-Za-Z0-9-]+)*@"
                        + "[A-Za-z0-9-]+(\\.[A-Za-Z0-9]+)*(\\.[A-Za-z]{2,})$");
                       
        /*Esto sirve para poder comprobar el correo mas adelante. Lo sacamos desde este foro
        /es.stackoverflow.com/questions/46067/expresiones-regulares-para-correo-electronico-en-java*/               
       
        imprimirOpciones();
        ControladorContactos agenda = new ControladorContactos();
       
        Scanner usuario = new Scanner(System.in);
        String opciones = usuario.next();
       
        while (opciones.equals("6"))
        {
           
            if (opciones.equals("1"))
            {
            //Aqui es donde se crea el contacto
                System.out.println("********************************");
                System.out.println("Ha seleccionado crear un contacto ");
                System.out.println("");
                System.out.print("\tIntroduce el nombre del contacto: ");
                String nombreContacto = usuario.next();
                System.out.print("\tIntroduce los apellidos del contacto: ");
                String apellidos = usuario.next();
                System.out.print("\tIntroduce el numero de telefono del contacto: ");
                String telefono = usuario.next();
                System.out.print("\tIntroduce el correo electronico de la persona: ");
                String correo = usuario.next();
               
                //Con el codigo de la linea 14 se comprueba el correo//
                Matcher mather = pattern.matcher(correo);
                if (mather.find() == true)
                {
               
                if (agenda.comprobarContacto(correo))
                {
                    Contacto contactoCorrecto = new Contacto (nombreContacto, apellidos, telefono, correo);
                    agenda.anadirContacto(contactoCorrecto);
                    System.out.println("El contacto se ha guardado correctamente. ");
                }
                else
                {
                    System.out.println("No se puede guardar el correo, ya existe uno igual.");
                }
               
                }
            } 
           
            else if (opciones.equals("2"))
            {
                //Eliminar un contacto
                System.out.println("******************************");
                System.out.println("Ha seleccionado eliminar un conctacto");
                System.out.println("");
                System.out.println("\tIntroduce el correo del contacto que quieres borrar: ");
                String correo = usuario.next();
               
                if (agenda.eliminarContacto(correo))
                {
                    System.out.println("El contacto ha sido eliminado.");
                }
               
                else
                {
                    System.out.println("No existe ningun contacto con ese correo");
                }
               
                volverMenu();
            }
             
            else if (opciones.equals("3"))
            {
                //Editar un contacto
                System.out.println("********************************");
                System.out.println("Ha seleccionado editar un contacto");
                System.out.println("");
                System.out.println("\tIntroduzca el correo del contacto que desea editar");
                String correo = usuario.next();
               
                if (agenda.comprobarContacto(correo))
                {
                    System.out.println("Elija que valor desea editar: ");
                    System.out.println("\t a. Cambiar nombre");
                    System.out.println("\t b. Cambiar los apellidos");
                    System.out.println("\t c. Cambiar el telefono");
                    System.out.println("\t d. Cambiar el correo electronico");
                   
                    String opcion = usuario.next();
                    System.out.print("Introduzca de el nuevo valor: ");
                    String valor = usuario.next();
                    agenda.editarContacto(correo, opcion, valor);
                    System.out.println("Se ha actualizado el contacto con exito.");
                }
                else
                {
                    System.out.println("No existe ningun contacto con ese correo");
                }
               
                volverMenu();
            }   
           
            else if (opciones.equals("4"))
            {
                //Buscar un contacto
                System.out.println("********************************");
                System.out.println("Ha seleccionado buscar un contacto");
                System.out.println("");
                System.out.println("\tElija cual es su criterio de busqueda: ");
               
            }
           
           
            else if (opciones.equals ("5"))
            {
                System.out.println("Esta es tu agenda de contactos: ");
                for (Item _Agenda : _Agenda)
                {
                String nombreContacto = _Agenda.getNombreContacto();
                String telefono = _Agenda.getTelefono();
                String apellidos = _Agenda.getApellidos();
                String correo = _Agenda.getCorreo();
               
                System.out.println("Nombre: " + nombreContacto + apellidos + "\tTelefono: " + telefono + "\tCorreo electronico: " + correo);
                }
                System.out.println("---------------");
               
                volverMenu();
            }
            }
        }
    }





Agenda.java -->

Código: [Seleccionar]
package AgendaDef;

import java.util.ArrayList;
//import java.IOException;
import java.util.Comparator;

public final class Agenda{
    ArrayList <Contacto> _Agenda = new ArrayList <>();
    String  Contactos = "agenda.dat";
   
    public Agenda()
    {
    //Aqui es donde se inicia el array list, cuando se anada un contacto
        this._Agenda = new ArrayList <Contacto>();
    }
   
    public void anadirContacto (Contacto contacto_actual)
    {
        this._Agenda.add(contacto_actual);
    }
   
    public boolean eliminarContacto (String correo)
    {
        boolean isRemove = false;
       
        for (int i=0; i < this._Agenda.size(); i++)
        {
            Contacto actual = (Contacto) this._Agenda.get(i);
           
            if (actual.getCorreo().toLowerCase().equals(correo.toLowerCase()))
            {
                System.out.println("\tHemos eliminado: " + actual.getNombreContacto() + " " + actual.getApellidos());
                this._Agenda.remove(i);
                isRemove = true;
            }
        }
    }
   
    public ArrayList<Contacto> consultarContactoPorNombre(String nombreContacto)
    {
        ArrayList<Contacto> contactosConEseNombre = new ArrayList<Contacto> ();
        for (Contacto contactos : Contactos.getNombreContacto)
        {
            if (contactos.getNombreContacto().toLowerCase().equals(nombreContacto.toLowerCase()))
            {
                contactosConEseNombre.add(contactos);
            }
        }
        return contactosConEseNombre;     
    }
   
    public ArrayList<Contacto> consultarContactoPorApellido(String apellidos)
    {
        ArrayList<Contacto> contactosConEseApellido = new ArrayList<Contacto> ();
        for (Contacto contactos : Contactos.getApellidos)
        {
            if (contactos.getApellidos().equals(apellidos))
            {
                contactosConEseApellido.add(contactos);
            }
        }
        return contactosConEseApellido;     
    }
   
    public ArrayList<Contacto> consultarContactoPorEmail(String correo)
    {
        ArrayList<Contacto> contactosConEseEmail= new ArrayList<Contacto> ();
       
        for (Contacto contactos : Contactos.getCorreo)
        {
                if ( correo.getCorreo().equals(correo))
                {
                    contactosConEseEmail.add(contactos);
                }
           
        }
        return contactosConEseEmail;     
    }
   
    public void eliminarContacto(Contacto contactos)
    {
        for (Contacto contactos : Contacto.getNombreContacto)
        {
            if(Contactos.getNombreContacto().contains(contactos))
            {
                contacto.excluirContactoDeGrupo(contactos);
            }
        }
        contactos.remove(Contactos);
    }
   
   
   
}


Contacto.java -->

Código: [Seleccionar]
package AgendaDef;

public class Contacto{
    public String _nombreContacto;
    public String _apellidos;
    public String _telefono;
    public String _correo;
   
   
    public Contacto(String nombreContacto, String apellidos, String correo,  String telefono)
    {
        this._nombreContacto = nomnbreContacto;
        this._apellidos      = apellidos;
        this._telefono       = telefono;
        this._correo         = correo;
    }
   
    //Metodos GET
   
    public String getNombreContacto()
    {
        return this._nombreContacto;
    }
   
    public String getApellidos()
    {
        return this._apellidos;   
    }
   
    public String getTelefono()
    {
        return this._telefono;
    }
   
    public String getCorreo()
    {
        return this._correo;   
    }
   
    //Metodos SET
   
    public void setNombreContacto(String nombreContacto)
    {
        this._nombreContacto = nombreContacto;
    }
   
    public void setApellidos(String apellidos)
    {
        this._apellidos = apellidos;
    }
   
    public void setCorreo(String correo)
    {
        this._correo = correo;
    }
   
    public void setTelefono(String telefono)
    {
        this._telefono = telefono;
    }
}


Errores -->

Código: [Seleccionar]
./Root/AgendaDef/Agenda.java:42: error: cannot find symbol
        for (Contacto contactos : Contactos.getNombreContacto)
                                           ^
  symbol:   variable getNombreContacto
  location: variable Contactos of type String
./Root/AgendaDef/Agenda.java:55: error: cannot find symbol
        for (Contacto contactos : Contactos.getApellidos)
                                           ^
  symbol:   variable getApellidos
  location: variable Contactos of type String
./Root/AgendaDef/Agenda.java:69: error: cannot find symbol
        for (Contacto contactos : Contactos.getCorreo)
                                           ^
  symbol:   variable getCorreo
  location: variable Contactos of type String
./Root/AgendaDef/Agenda.java:71: error: cannot find symbol
                if ( correo.getCorreo().equals(correo))
                           ^
  symbol:   method getCorreo()
  location: variable correo of type String
./Root/AgendaDef/Agenda.java:82: error: cannot find symbol
        for (Contacto contactos : Contacto.getNombreContacto)
                                          ^
  symbol:   variable getNombreContacto
  location: class Contacto
./Root/AgendaDef/Agenda.java:82: error: variable contactos is already defined in method eliminarContacto(Contacto)
        for (Contacto contactos : Contacto.getNombreContacto)
                      ^
./Root/AgendaDef/Agenda.java:84: error: cannot find symbol
            if(Contactos.getNombreContacto().contains(contactos))
                        ^
  symbol:   method getNombreContacto()
  location: variable Contactos of type String
./Root/AgendaDef/Agenda.java:86: error: cannot find symbol
                contacto.excluirContactoDeGrupo(contactos);
                ^
  symbol:   variable contacto
  location: class Agenda
./Root/AgendaDef/Agenda.java:89: error: cannot find symbol
        contactos.remove(Contactos);
                 ^
  symbol:   method remove(String)
  location: variable contactos of type Contacto
./Root/AgendaDef/Contacto.java:12: error: cannot find symbol
        this._nombreContacto = nomnbreContacto;
                               ^
  symbol:   variable nomnbreContacto
  location: class Contacto
./Root/Main.java:21: error: cannot find symbol
        imprimirOpciones();
        ^
  symbol:   method imprimirOpciones()
  location: class Main
./Root/Main.java:22: error: cannot find symbol
        ControladorContactos agenda = new ControladorContactos();
        ^
  symbol:   class ControladorContactos
  location: class Main
./Root/Main.java:22: error: cannot find symbol
        ControladorContactos agenda = new ControladorContactos();
                                          ^
  symbol:   class ControladorContactos
  location: class Main
./Root/Main.java:83: error: cannot find symbol
                volverMenu();
                ^
  symbol:   method volverMenu()
  location: class Main
./Root/Main.java:114: error: cannot find symbol
                volverMenu();
                ^
  symbol:   method volverMenu()
  location: class Main
./Root/Main.java:131: error: cannot find symbol
                for (Item _Agenda : _Agenda)
                                    ^
  symbol:   variable _Agenda
  location: class Main
./Root/Main.java:131: error: cannot find symbol
                for (Item _Agenda : _Agenda)
                     ^
  symbol:   class Item
  location: class Main
./Root/Main.java:142: error: cannot find symbol
                volverMenu();
                ^
  symbol:   method volverMenu()
  location: class Main
18 errors



7
Comunidad / Felices fiestas y próspero año nuevo para todos
« en: 24 de Diciembre 2021, 15:25 »
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



8
Hola, hemos recibido y respondido una consulta relativa a las posibilidades y salidas laborales de la programación para trabajadores, que extracto a continuación porque pienso puede ser de interés general.

EXTRACTO CONSULTA

Quiero generar una oportunidad laboral nueva, y estoy pensando en la programación. No sé nada de programación, y me interesa aprender por 2 razones:

La primera es poder trabajar idealmente de forma remota con alguna empresa que me contrate, que pueda manejar mis horarios, ideal sería un trabajo por objetivos, que pueda administrar mi tiempo, para poder seguir haciendo otras cosas.

La segunda es que para mi actividad laboral uso software que permite la programación a cierto nivel.

Entonces si puedo combinar mis 2 objetivos aprender a programar para tener una salida laboral alternativa y que además pueda si lo deseo programar para mi actividad laboral sería lo ideal.

Les consulto cual sería el camino, primero realmente tengo que probar si la programación es para mí y puedo abordarlo económicamente.

Tengo bastante experiencia laboral, pero de programación nada.

Espero puedan orientarme, si mis objetivos son viables, estaba pensando en un horizonte de tiempo de 2 años. Y viendo la web de ustedes entiendo que podría empezar por el curso : CURSO "FUNDAMENTOS DE PROGRAMACIÓN NIVEL I" con eso ver si realmente la programación es para mi y luego si es así, avanzar con más cursos.

Mi duda es pricipalmente si para poder llegar a uno de los objetivos que es que una empresa me pueda contratar para programar como trabajo remoto, lo que no sé, es si estas empresas que contratan programadores, se fijan y buscan  más en la educación formal, me refiero a una carrera universitaria de programación o se puede estudiar por ejemplo con los cursos de ustedes y conseguir igualmente ese tipo de trabajos de programador contratado por empresas? Porque no me interesa ser programador freelancer, entonces entiendo que debo orientarme a lo que la industria está contratando.



EXTRACTO RESPUESTA

La cuestión que planteas es interesante pero a la vez más complicada de responder de lo que puede parecer a primera vista. Hay muchos factores implicados. Creo que para esta consulta vas a encontrar tantas respuestas como personas a las que preguntes. No obstante, a partir de diferentes respuestas quizás puedas llegar a tus propias conclusiones.

La primera cuestión que te comento es que para llegar a un grado de conocimiento de la programación suficiente para que esta se convierta en salida laboral, a la mayoría de las personas les lleva cuatro, cinco ó más años. Es un área de conocimiento muy extensa y adquirir dominio requiere tiempo.

No obstante, adquirir conocimientos de programación tiene otro aliciente: por un lado, comprender mejor cómo funcionan las máquinas y la inteligencia artificial. Por otro lado, la programación se está convirtiendo cada vez más en un conocimiento transversal. Para quienes trabajan en economía, saber programar puede ayudarles a resolver problemas económicos. Para quienes trabajan en medicina, puede ayudarles a resolver problemas médicos. Y así sucesivamente, porque cada vez más todo está apoyado en tecnología y la tecnología tiene detrás software a distintos niveles, pero cada vez es más común que todo tipo de herramientas faciliten entornos de programación para que los usuarios puedan sacarle un mayor partido.

Aprender programación es un camino no sencillo. No a todo el mundo se le da bien la programación. Podríamos decir que es algo similar al dibujo, no a todo el mundo se le da bien. La forma de saber si se te da bien posiblemente sea intentándolo.

Respecto a la educación formal, ciertamente es necesaria si se quiere conseguir un "trabajo de oficina en una empresa", que es el 90% del trabajo que hay. Realizar cursos por libre puede ser útil para aprender, hacer cosas por libre, y como trampolín para luego hacer más cosas, pero no es lo más frecuente que lleve a poder trabajar profesionalmente en el área.

Luego tenemos los casos "excepcionales", que son de personas con altas capacidades que son capaces de resolver en horas o días lo que a las personas normales les lleva días o meses. Esas personas suelen ser captadas por empresas importantes y ganar buenos sueldos, pero que una persona resulte de este tipo es tan probable como que te toque la lotería: es bastante improbable.

Respecto al curso Bases de la programación nivel I de aprenderaprogramar.com, puede ser un buen curso para tomar un primer contacto con la programación. Pero es solo eso, un primer contacto. Para realizar este curso se recomienda tener un nivel de matemáticas igual o superior al de enseñanzas medidas.

Recomendamos leer artículos:

Hilo de los foros sobre fundamentos de programación: https://aprenderaprogramar.com/foros/index.php?topic=1313.0
Artículos de la sección cómo empezar: https://www.aprenderaprogramar.com/index.php?option=com_content&view=category&layout=blog&id=84&Itemid=18

Y con estas y otras opiniones, que cada persona se forme su opinión para su situación personal y profesional

Saludos,

9
En los cursos de fundamentos (bases) de programación generalmente usamos el pseudocódigo y diagramas de flujo para aprender a plantear la solución a problemas. El pseudocódigo no es un lenguaje propiamente dicho, por lo que no se puede ejecutar sobre un computador. No obstante, sí podemos ejecutarlo mentalmente para valorar su corrección y ver si un programa planteado con esa lógica daría los resultados adecuados.

Normalmente se usa un lenguaje para hacer prácticas y ver cómo trasladar a resultados prácticos sobre un computador los planteamientos lógicos. El lenguaje que se usa depende del curso, pero grosso modo podemos pensar en dos tipos de lenguajes:

- "Tradicionales de consola" como C o Pascal tradicional etc.
- "Gráficos con ventanas y botones" como Visual Basic

Hay lenguajes que pueden trabajarse tanto en modo consola como en modo gráfico, pero no vamos a detenernos en esto.

Usar uno u otro tipo de lenguaje tiene ventajas e inconvenientes. Si se trabaja mediante consola, los resultados visualmente son más pobres. Sin embargo, son buenos para empezar porque permiten trasladar el pseudocódigo muy fácilmente a código. No obstante, la pobreza visual en general desmotiva a los alumnos porque les parece que no obtienen resultados "profesionales".

Si se trabaja en un entorno de tipo Visual Basic, los resultados son visualmente más atractivos al usarse ventanas y botones. Esto es motivador y alienta a los alumnos a continuar. Como desventaja podemos indicar que la lógica de estos entornos no es tan lineal, y trasladar el pseudocódigo a código a veces puede no ser tan fácil.

Supongamos que se nos plantea este ejercicio:

1. Crear el pseudocódigo que pida al usuario la base y la altura de un rectángulo, y que a partir de esos datos proporcione el área del rectángulo. Una vez mostrado al usuario, se le debe preguntar al usuario si quiere repetir y realizar otro cálculo (en cuyo caso se le pedirán de nuevo los datos y se realizará y mostrará de nuevo el cálculo) o no (en cuyo caso el algoritmo termina).

Una solución posible para este ejercicio es este pseudocódigo:

1-Inicio
2-Respuesta= ”s”
3-Mientras Respuesta= “s” ó Respuesta= “S” Hacer
3.1-Mostrar "Introduzca la base": Pedir a: Mostrar "Introduzca la altura": Pedir b
3.2-Area = a*b
3.3-Mostrar “El área del rectángulo es”, Area
3.4-Mostrar “Quiere continuar (S/N)”
3.5-Pedir Respuesta
Repetr
4-Fin

Este ejercicio usa un bucle do while para permitir tantas repeticiones como el usuario desee.

Un programa en Visual Basic para implementar lo anterior podría ser este código 1:

Código: [Seleccionar]
Option Explicit
Dim i As Integer
Dim respuesta As Boolean
Dim pregunta As Integer
Dim a%, b As Integer
Dim resultado As Integer

Private Sub Form_Load()
Show
Label1 = "Introduzca base y altura" & vbCrLf
End Sub

Private Sub Command1_Click()
respuesta = False
Label1 = Label1
Do While respuesta = False
a = Val(Text1)
b = Val(Text2)
resultado = a * b
Label1 = Label1 & "El área del rectángulo es" & Space(1) & resultado & vbCrLf
pregunta = MsgBox("¿Desea continuar?", vbQuestion + vbYesNo, "Pregunta")
If pregunta = vbYes Then
respuesta = True
Else
Unload Form1
End
End If
Loop
End Sub


Este programa utiliza un do while con msgbox. Esta forma de escritura se asemeja a la del pseudocódigo, aunque la forma más “natural” de generar un programa de este tipo en Visual Basic sería usar textboxes y un botón para repetir y otro para finalizar. Ambas opciones, dentro de un curso de fundamentos, las consideraríamos correctas para este ejercicio, aunque podemos extendernos en explicar esto un poco si queremos.

La solución planteada anterior en Visual Basic es un poco "farragosa" desde la perspectiva de la forma de programación propia de este entorno, que podemos llamar "programación orientada a eventos". Si nos fijamos en el código 1, se usa un msgBox para preguntar si se quiere continuar o no, y si no se quiere continuar se termina el programa descargando el formulario. Esto es una forma de hacer las cosas poco natural para Visual Basic. Pensemos en cocinar algo: para hacer un potaje de verduras es más natural hacerlo en un caldero (olla) porque su altura nos permite llenarlo de agua y que no se derrame. Pero también podemos hacerlo en una sartén aunque no sea tan natural, y nos puede quedar bien también.

En Visual Basic, lo más natural sería un programa de este tipo, código 2:

Código: [Seleccionar]
Option Explicit
Dim i As Integer
Dim respuesta As Boolean
Dim pregunta As Integer
Dim a%, b As Integer
Dim resultado As Integer

Private Sub Form_Load()
Show
Label1 = "Introduzca base y altura" & vbCrLf
Command1.Text = "Calcular área"
End Sub

Private Sub Command1_Click()
respuesta = False
Label1 = Label1
a = Val(Text1)
b = Val(Text2)
resultado = a * b
Label2 = "El área del rectángulo es" & Space(1) & resultado & vbCrLf
End Sub

¿Qué ha cambiado? El bucle do while ha desaparecido, y ya no se pregunta directamente al usuario si quiere repetir o no.

¿Este programa responde al objetivo que se plantea en el pseudocódigo?

La respuesta es que sí, lo que pasa es que lo hace con otra lógica propia de aplicaciones visuales.

Esto quizás no es tan propio de explicarlo en un curso básico, pero podemos intentarlo.

En las aplicaciones tradicionales de consola, no hay bucle si no se escribe el bucle en el código. En cambio en entornos como Visual Basic hay un "bucle continuo" en segundo plano, que no está escrito en código, sino que se ejecuta por defecto cuando se ejecuta un programa. Este bucle al que me refiero es un bucle de "Captura de eventos". Estos entornos están preparados para detectar lo que hace el usuario con el ratón o con el teclado, y ejecutar algo en respuesta a eso que ha hecho el usuario, lo que llamamos un evento. Por ejemplo si el usuario pulsa un botón se produce un evento. Si pulsa sobre el formulario es otro evento. Si escribe en un textbox es otro evento, etc. Así, se pueden producir muchos eventos en muy poco tiempo.

En este programa, el bucle sería el bucle de segundo plano de captura de eventos al que nos hemos referido, y la ejecución del código ante el evento click sobre el botón de cálculo sería el código que calcula el área y muestra el resultado.

Cada vez que se pulsa el botón, se hace el cálculo y se muestra el resultado. Entre dos pulsaciones de botón el usuario puede cambiar los datos de base y altura. El usuario puede repetir tantas veces como desee.

Sería una lógica como esta:

Inicio
Mientras [Aspa de cierre pulsada == false] hacer
Mostrar el formulario y contenidos
Si usuario pulsa botón
   Hacer cálculos y mostrar resultados
FinSi
Repetir
Fin

Aquí vemos que el programa está en un "bucle infinito" esperando a que el usuario pulse el botón. Si no pulsa el botón, el programa espera. Si pulsa el botón, calcula. Si pulsa el aspa de cierre, se cierra.

Nos encontramos así que tanto el pseudocódigo como el código 1 como el código 2 cumplen los objetivos planteados que eran:
- Que el usuario pueda introducir datos de base y altura y calcular el área de rectángulo tantas veces como quiera
- Que cuando el usuario lo decida, el programa termine

Usar textboxes y un botón es la forma de programar más habitual para hacer algo de este tipo en Visual Basic. Es más natural que usar un msgBox y unload. Pero para un curso de fundamentos nos vale tanto plantearlo de una manera como de otra, porque ambas son formas válidas de implementar la lógica.

Este tipo de cuestiones pueden resultar un tanto complicadas de comprender, por lo que en los cursos de fundamentos no nos detenemos en este tipo de cuestiones normalmente, es preferible dejarlo para un poco más adelante.


10
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





11
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?

12
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



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



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




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


16
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

17
moveTo JavaScript no funciona coordenada y, explicación por monitores

Descripción del problema: al crear una nueva ventana (window.open) y aplicarle el método moveTo(x, y) la ventana sólo se mueve en horizontal pero no en vertical

Código de referencia:

Código: [Seleccionar]
                nuevaVentana = window.open ('', 'miNombre', 'width=250, height=250, resizable=true, menubar=yes');
                nuevaVentana.document.write('<h1>Aprenda a programar ahora. Aproveche la oportunidad</h1>');
nuevaVentana.moveTo(600,200);
                nuevaVentana.focus();


Posible explicación:

Si estás trabajando con dos monitores, moveTo toma el primer monitor o monitor principal como referencia. De modo que las coordenadas x funcionan bien, sin embargo las coordenadas y no funcionan bien si estás trabajando sobre el monitor secundario (principalmente se verá que la ventana se pega a la parte inferior del monitor).

Más información: http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=862:window-javascript-metodos-efectos-confirm-prompt-open-moveby-moveto-focus-resize-close-cu01174e&catid=78:tutorial-basico-programador-web-javascript-desde-&Itemid=206

Saludos

18
Descripción del problema: tras crear una ventana que carga una url determinada, al invocar location.href sobre dicha ventana se obtiene about:blank en lugar de la url de la ventana.

Código de referencia:

Código: [Seleccionar]
var nuevaVentana;
nuevaVentana = window.open ('http://aprendeaprogramar.es', 'miNombre', 'width=300, height=300, resizable=true, menubar=yes');
alert ('url de la ventana es ' + nuevaVentana.location.href);

Posible explicación

The open() method creates a new secondary browser window, similar to choosing New Window from the File menu. The strUrl parameter specifies the URL to be fetched and loaded in the new window. If strUrl is an empty string, then a new blank, empty window (URL about:blank) is created with the default toolbars of the main window.

Note that remote URLs won't load immediately. When window.open() returns, the window always contains about:blank. The actual fetching of the URL is deferred and starts after the current script block finishes executing. The window creation and the loading of the referenced resource are done asynchronously.


Según esto la posible explicación sería que al hacer window open y ejecutarse el código la ventana se crea como about:blank. Sólo posteriormente, asíncronamente, se carga la url indicada dentro de esa nueva ventana.

Esto nos puede parecer poco intuitivo, pero la lógica estaría en que estamos hablando de milisegundos. El código se ejecutaría de forma que la ventana estaría creada y se muestran las propiedades antes de que la url haya comenzado a cargar (incluso es posible que la url no llegue a cargar si el servidor no responde por ejemplo). En realidad se trata de un detalle de implementación que parece podrían haber hecho de otra manera... (y quizás cambien en nuevas versiones de navegadores)

Saludos

19
Ante las diversas consultas que recibimos sobre las diferencias entre versiones de html y la importancia que tiene el usar una u otra versión en este post vamos a tratar de dar una orientación sobre algunas preguntas frecuentes:


Tengo una web creada con HTML 4.01 ¿Debo modificarla para adaptarme a HTML 5?

En principio no. Todos los navegadores reconocen HTML 4 y van a seguir reconociéndolo, por lo tanto si tu web funciona correctamente no debes preocuparte.


Estoy haciendo un curso de HTML que usa HTML 4 ¿es mejor abandonarlo y centrarme en HTML 5?

En principio no. Lo importante es que el curso sea de calidad y tenga buenos contenidos. HTML 5 podemos verlo como una extensión HTML 4, por lo tanto todo lo que aprendas de HTML 4 te va a resultar útil para HTML 5.


No sé nada de HTML, ¿con qué versión debería trabajar?

Con HTML 5.


Soy programador y trabajo desde hace muchos años con HTML 4 ¿debo reciclarme y pasarme a HTML 5?

Esta pregunta tiene diferentes matices:

a) Si creas páginas web para tí y tus páginas funcionan bien, no tienes por qué pasarte a HTML 5. Puedes seguir creando webs con HTML 4 y podrás seguir haciéndolo durante muchos años.

b) Si creas páginas web para empresas, aunque no tienes por qué pasarte a HTML 5 (lo realmente importante es que tus páginas funcionen bien), sí sería adecuado que te recicles y adquieras conocimientos de HTML 5 porque este se va a ir imponiendo progresivamente a lo largo de los próximos años y es posible que las empresas te acaben pidiendo que utilices HTML 5 (de hecho muchas empresas ya lo hacen). Por ello es mejor adelantarse e ir aprendiéndolo antes de que nos obliguen a aprenderlo.


¿Qué implicaciones tiene el cambio de HTML 4 a HTML 5 con vistas al aprendizaje de la programación web?

HTML 5 podemos verlo como una extensión HTML 4, por lo tanto todo lo que aprendas  o hayas aprendido de HTML 4 te va a resultar útil para HTML 5. Todos los fundamentos de la programación web siguen siendo los mismos con HTML 4 y HTML 5. Por tanto los cursos básicos o fundamentos se ven poco afectados por el cambio. Sí existen implicaciones en cambio para cursos avanzados o aspectos avanzados.


¿Es HTML 5 una especificación oficial?

Sí, lo es desde finales de octubre de 2014. No obstante, hay que relativizar el hecho de que sea una especificación oficial. Los navegadores no se ciñen exactamente a las especificaciones oficiales. Y por otro lado, a veces la industria web va por delante de las especificaciones oficiales. Por ejemplo, el HTML 5 fue impulsado sin ser una especificación oficial. Sólo después de coger fuerza se ha convertido en especificación oficial. A las personas que quieran aprender programación web les recomendamos crear páginas web que funcionen bien, aunque no cumplan estrictamente con la especificación oficial.


¿Es HTML un lenguaje de programación?

No. Esto se explica en el curso HTML desde cero de aprenderaprogramar.com disponible en http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=69&Itemid=192


Tengo webs creadas con declaraciones de doctype tipo
 
Código: [Seleccionar]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
¿Debo modificarlas por declaraciones <!DOCTYPE html>?

En principio no debes preocuparte por esto. Tu web va a seguir funcionando igualmente con una declaración u otra.


Estoy consultando en internet y me encuentro webs con declaraciones de doctype tipo

Código: [Seleccionar]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
¿Debo desconfiar de estas webs?

En principio no debes preocuparte por esto. El código y los ejemplos serán tan válidos si llevan un tipo de declaración como si llevan la otra. Sí debes preocuparte de si la web ofrece contenidos de calidad y bien estructurados. Si es así no prestes demasiada atención al doctype. Para el aprendizaje son más importantes los conceptos que los detalles.


¿Es HTML 5 experimental?


No en el sentido de que ya es una especificación oficial. Sí en el sentido de que es una tecnología novedosa y no todos los navegadores soportan todas las características de HTML 5. Además, HTML 5 está en evolución. Podríamos decir que aunque ya no se considera experimental, todavía no se considera una tecnología madura.

20
Ejemplo para describir el método de ordenación de números: ordenar esta serie de números

Caso de estudio:      45   11   32   8   267


EXPLICACIÓN

El ejercicio podemos verlo con el siguiente símil: “Tengo 5 cajas que por fuera tienen una etiqueta que pone v(1), v(2), v(3), v(4) y v(5). Dentro de cada caja hay un papel con un número (inicialmente estas cajas tienen como contenido papeles con los números 45, 11, 32, 8 y 267).

Tengo otras 5 cajas que por fuera tienen una etiqueta que pone o(1), o(2), o(3), o(4) y o(5). Dentro de cada caja hay un papel con un número (inicialmente todas estas cajas tienen un papel que no pone nada, lo consideramos como si fuera un cero). Lo que quiero es que en estas cajas al final tenga los números ordenados de mayor a menor, de modo que en la caja o(1) esté el número más grande, en la caja o(2) el siguiente más grande y así hasta terminar.

Paso 1

Queremos escribir un valor en la caja o(1) para ir ordenando los números en estas cajas. En cada paso vamos a escribir en el papel de una caja de orden o(…) analizando una caja de valor v(…) de modo que poco a poco vayamos ordenando los números.

Como la caja que pone o(1) está vacía, escribimos en el papel que contiene lo mismo que pone el papel de la caja v(1), de modo que ahora o(1) = v(1) = 45

Provisionalmente el orden 1, el mayor número, es 45, ya que de momento sólo hemos analizado la caja que pone v(1). Cuando analicemos las otras cajas a lo mejor hay que hacer cambios.

Paso 2

Comparo el papel en la caja que pone o(1) con el que pone la caja v(2). ¿Es mayor el número dentro de la caja que pone o(1) que el número dentro de la caja que pone v(2)? Sí, puesto que en o(1) tenemos un 45 y en la caja v(2) hay un 11. Por tanto el orden 2 será 11, para hacerlo efectivo escribimos en el papel dentro de la caja o(2) el número 11. Ahora tenemos como orden 1 el 45 y como orden 2 el 11 (provisionalmente).


Paso 3

Comparo el papel de la caja que pone o(1) con el que tiene la caja v(3). ¿Es mayor el número dentro de la caja que pone o(1) que el número dentro de la caja que pone v(3)? Sí, por tanto el orden 1 sigue siendo el 45. Ahora comparo el papel de la caja que pone o(2) con el que tiene la caja v(3). ¿Es mayor el número dentro de la caja que pone o(2) que el número dentro de la caja que pone v(3)? No, ya que o(2) tiene 11 mientras que v(3) tiene 32. Queremos asignar un contenido a la caja que pone o(3), pero ya sabemos que este contenido tendrá que ser el número que figuraba en la caja o(2) anteriormente porque hay que escribir otro número dentro de la caja que pone o(2). Entonces, en la caja o(3) escribimos en el papel lo que antes figuraba en la caja o(2), es decir, o(3) = o(2) = 11, esto significa que la caja que pone o(3) ahora tiene escrito en el papel que lleva dentro lo que estaba escrito en la caja que ponía o(2).
Ahora en la caja que pone o(2) escibimos en su papel el número 32 (que es lo que ponía el papel en la caja v(3).

De esta forma en las cajas o(1) nos queda el 45, en la caja o(2) nos queda el 32 y en la caja o(3) nos queda el 11. Vemos cómo nos van quedando ordenados los números.


Paso 4

Comparo el papel de o(1) que pone 45 con el que tiene la caja v(4) que es 8, como o(1) es mayor no hay que hacer cambios. Comparo o(2) con v(4) y también es mayor, no hay que hacer cambios. Comparo o(3) con v(4) y también es mayor. Ahora ya sé que en la caja o(4) puedo escribir 8. Ahora tengo los números ordenados de momento como o(1) = 45, o(2) = 32, o(3) = 11, o(4) = 8


Paso 5

Comparo el papel de o(1) que pone 45 con el que tiene la caja v(5) que es 267. Como v(5) es mayor que o(1) significa que este número se va a convertir en o(1), pero la caja con o(1) tiene un número y no puedo tacharlo directamente porque lo perdería. Lo primero que tengo que hacer es “hacerle sitio” reordenando lo que tiene cada caja y para ello:

Escribo en la caja o(5) lo que ponía la caja o(4), es decir, o(5) = 8  (podemos escribir o(5) = o(4) para indicar que la caja que pone o(5) ahora lleva un papel con lo que ponía la caja o(4)).

Escribo en la caja o(4) lo que tenía la caja o(3), es decir ahora o(4) = 11

Escribo en la caja o(3) lo que tenía la caja o(2), es decir ahora o(3) = 32

Escribo en la caja o(2) lo que tenía la caja o(1), es decir ahora o(2) = 45

Ahora ya puedo tachar el papel de la caja o(1) y escribir en él 267.

Ya no tengo más cajas que analizar (he ido en cada paso analizando una caja v y asignando contenido a una caja o, al haber analizado la última caja, v(5) y asignado el orden o(5) ya no me quedan más cajas.

Podemos escribir que el resultado, los números ordenados, queda así:

o(1) = 267 o(2) =45 o(3) = 32 o(4) = 11 o(5) = 8



Páginas: [1] 2 3

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