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

Páginas: 1 ... 6 7 8 9 10 [11] 12 13 14 15 16 ... 50
201
Para el ID único, antes de añadir la nueva persona al ArrayList hay que comprobar si este ya contiene una persona con el mismo ID.
Si ya lo tuviera, pues habría que volver a pedir un nuevo ID al usuario, hasta que finalmente él nos de uno que no exista en el registro.

Citar
    public void Registrar(){
        String id, ape, nom, sex;
        int edad;
        double peso;
        Scanner sc = new Scanner(System.in);
        System.out.print("Id: ");
        id = sc.next();
        System.out.print("Nombre: ");
        nom = sc.next();
        System.out.print("Apellidos: ");
        ape = sc.next();
        System.out.print("Sexo: ");
        sex = sc.next();
        System.out.print("Peso: ");
        peso = sc.nextDouble();
        System.out.print("Edad: ");
        edad = sc.nextInt();
        Persona persona = new Persona(id, nom, ape, sex, peso, edad);
        //No añadimos la persona hasta asegurarnos de que su ID es único
        while (ListaPersonas.contains(persona) {
                System.out.print("Ya existe una persona con este ID, proporcione otro: ");
                persona.setId(sc.next());

        }

        ListaPersonas.add(persona);
    }


Si lo del ID no queremos dejarlo en manos del usuario, se puede hacer lo que hicimos con la clase Producto, que sea esta la que vaya generando los ID cada vez que se registraba un producto.

202
¿La clase Partida es la que guarda la información referente a cada partida jugada?

Es decir, que por ejemplo la clase Usuario podría tener como atributo un array de Partida.
Así cada Usuario tendría su propia colección de partidas.

Aunque mejor un ArrayList, ya que puede ir creciendo su tamaño según se le añaden objetos Partida, cosa que un array primitivo no podría hacer.

203
El problema es que has copiado demasiado literalmente ese método de otro ejercicio sobre "deportistas" (recuerda cambiar el texto de los mensajes que se mostrarán en pantalla) y estás usando un método equivocado para obtener el ID del producto.
Ese método getCodigo() no existe en la clase Producto.

Citar
      Producto buscado = null;
      for (int i = 0; i < productos.size(); i++)
         if (productos.get(i).getCodigo().equals(codigo))
            buscado = productos.get(i);

Para los productos no estamos usando un "código", si no un identificador "ID"-
Que además es un int, no un String como era el código del deportista.

El método borrar() debería quedar algo como esto:
Código: [Seleccionar]
private static void borrar() {
System.out.println("\n\t--ELIMINAR PRODUCTO--");
System.out.print("ID producto: ");
int id = Integer.parseInt(teclado.nextLine());

Producto buscado = null;
for (int i = 0; i < productos.size(); i++)
if (productos.get(i).getId() == id)
buscado = productos.get(i);

if (buscado == null)
System.out.println("\nNo existe producto con el ID: " + id);
else {
productos.remove(buscado);
System.out.println("\nProducto eliminado");
}
}

Está bien buscar ejemplos de otros ejercicios para aplicar la misma lógica, pero no servirá hacer un simplemente copy-paste. Hay que entender esa lógica para poder adaptarla al ejercicio actual.

También es importante saber interpretar los errores que nos da el compilador.
Se supone que el error te habrá mostrado un mensaje similar a "The method getCodigo() is undefined for the type Producto"

Está claro que eso significa que estamos llamando a un método que no ha sido definido para la clase/tipo Producto. Así que al ver ese error, lo que haremos será revisar la clase Producto y comprobar cuál sería el método equivalente al que tenemos que llamar realmente.

Un saludo.



204
Se puede crear una clase llamada Producto con los atributos que queramos inventarnos.
Para el tema de tener un ID único para cada producto, se puede declarar un valor estático que comience con un entero y cada vez que sea crea un producto, se le asigna ese valor y luego se incrementa para que el siguiente producto que se vaya a crear obtenga un ID distinto del anterior.

Para que esto funcione bien hay que declararlo como estático, para que sea un valor asociado a la clase, y no a los objetos de dicha clase.

Además, podemos incluir el método equals() y programarlo para que dos Productos se consideren iguales si tiene el mismo ID.
De esta manera, luego en el programa principal será fácil pedirle al ArrayList que compruebe si ya contiene un producto con el mismo ID que el producto que vayamos a registrar.

Que con el sistema del ID que se va incrementando, es prácticamente imposible que nos encontremos con dos productos usando el mismo ID, pero bueno.

Esta podría ser la clase Producto:
Código: [Seleccionar]
public class Producto {

private static int nuevoID = 100; //Para obtener id's únicos, de 100 en adelante
//Atributos
private int id;
private String nombre;
private int stock;
private double peso;
private String proveedor;

public Producto(String nombre, int stock, double peso, String proveedor) {
asignaID();
this.nombre = nombre;
this.stock = stock;
this.peso = peso;
this.proveedor = proveedor;
}

public void asignaID() {
id = nuevoID++; //Se asigna nuevoID actual y se incrementa para que proximo producto su ID sea distinto
}

public int getId() {
return id;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public int getStock() {
return stock;
}

public void setStock(int stock) {
this.stock = stock;
}

public double getPeso() {
return peso;
}

public void setPeso(double peso) {
this.peso = peso;
}

public String getProveedor() {
return proveedor;
}

public void setProveedor(String proveedor) {
this.proveedor = proveedor;
}

@Override
public String toString() {
return String.format("Id: %d\tnombre: %s\nStock: %s\tPeso: %.2f Kg\nProveedor: %s", id, nombre,
stock, peso, proveedor);
}

@Override
public boolean equals(Object objeto) {
if (objeto instanceof Producto) {
Producto otroProducto = (Producto) objeto;
return id == otroProducto.id; //Dos productos son iguales sin tiene el mismo ID
}
else
return false;
}

}


Luego, escribimos un programa principal que use un ArrayList para almacenar objetos Producto.

Ofrecemos un menú para que el usuario escoja una opción, la cuál analizamos con un switch y llamamos a un método que cumpla la opción escogida.

Dejo un ejemplo comenzado con las opciones de registrar producto e imprimir listado funcionando.
Las otras funciones inténtalas tú. Llega hasta donde puedas y cuando te atasques, muestra tu código para que podamos ayudarte.
Un saludo.

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

public class Tienda {

private static ArrayList<Producto> productos = new ArrayList<Producto>();
private static Scanner teclado = new Scanner(System.in);

public static void main(String[] args) {

int opcion = 0;
do {
System.out.println("\n\t\tMENU TIENDA");
System.out.println("\t\t---- ------\n");
System.out.println("[1] -- Registrar Producto");
System.out.println("[2] -- Buscar Producto");
System.out.println("[3] -- Borrar Producto");
System.out.println("[4] -- Actualizar Producto");
System.out.println("[5] -- Imprimir Lista Productos");
System.out.println("[6] -- SALIR");
System.out.print("Opcion: ");
opcion = Integer.parseInt(teclado.nextLine());

switch(opcion) {
case 1:
registrar();
break;
case 2:
//buscar();
break;
case 3:
//borrar();
break;
case 4:
//actualizar();
break;
case 5:
imprimir();
break;
case 6:
System.out.println("\n\t\tFIN DE PROGRAMA");
break;
default:
System.out.println("\nOpcion equivocada");
}
} while (opcion != 6);

}

private static void registrar() {
System.out.println("\nNUEVO PRODUCTO");
System.out.print("Nombre: ");
String nombre = teclado.nextLine();
System.out.print("Stock: ");
int stock = Integer.parseInt(teclado.nextLine());
System.out.print("Peso(Kg): ");
double peso = Double.parseDouble(teclado.nextLine());
System.out.print("Proveedor: ");
String proveedor = teclado.nextLine();
Producto nuevo = new Producto(nombre, stock, peso, proveedor);

//Mientras ya exista un la lista un producto con el mismo ID..
while (productos.contains(nuevo))
nuevo.asignaID(); //...le asignamos un nuevo ID, hasta obtener uno que no exista en la lista

//Ya tenemos producto con un ID único
productos.add(nuevo);
System.out.println("\nNuevo Producto registrado...");
}

private static void imprimir() {
System.out.println("\nPRODUCTOS REGISTRADOS");
if (productos.isEmpty())
System.out.println("No hay Productos registrados.");
else
for (Producto prd: productos) {
System.out.println("\n*********************************");
System.out.println(prd);
System.out.println("*********************************\n");
}
}

}

205
Hola.
Suponiendo una clase Juego como esta:
Código: [Seleccionar]
public class Juego {

private String nombre;
private String fecha;
private double precio;

public Juego() {
nombre = "";
fecha = "";
precio = 0d;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getFecha() {
return fecha;
}

public void setFecha(String fecha) {
this.fecha = fecha;
}

public double getPrecio() {
return precio;
}

public void setPrecio(double precio) {
this.precio = precio;
}

@Override
public String toString() {
return String.format("Nombre: %s\nFecha: %s\nPrecio: %.2f", nombre, fecha, precio);
}

}

Como nos dicen que solo hay UN JUEGO, y solo uno, en el programa principal puedes declarar un objeto de esa clase, ya sea dentro del método main o como atributo de clase, y trabajar sobre él.

Dejo aquí un ejemplo donde solo he puesto el código para registrar juego, borrar su nombre e imprimir

Código: [Seleccionar]
public class Registro {

private static Juego juego = null;
private static Scanner teclado = new Scanner(System.in);

public static void main(String[] args) {

int opcion = 0;
while (opcion != 8) {
System.out.println("\n[1] -- Registrar Juego");
System.out.println("[2] -- Borrar Nombre");
System.out.println("[3] -- Borrar Fecha");
System.out.println("[5] -- Borrar Precio");
System.out.println("[6] -- Actualizar Nombre y Fecha");
System.out.println("[7] -- Imprimir");
System.out.println("[8] -- SALIR");
System.out.print("Opcion: ");
opcion = Integer.parseInt(teclado.nextLine());

switch(opcion) {
case 1:
System.out.println("\nREGISTRAR JUEGO");
juego = new Juego();
System.out.print("\nIntroduzca nombre: ");
juego.setNombre(teclado.nextLine());
System.out.print("Fecha: ");
juego.setFecha(teclado.nextLine());
System.out.print("Precio: ");
juego.setPrecio(Double.parseDouble(teclado.nextLine()));
break;
case 2:
System.out.println("\nBORRAR NOMBRE");
if (juego == null)
System.out.println("No hay juego registrado");
else {
juego.setNombre("");
System.out.println("Nombre borrado");
}
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
System.out.println("\nDATOS DEL JUEGO\n");
if (juego == null)
System.out.println("No hay juego registrado");
else
System.out.println(juego);
break;
case 8:
break;
default:
System.out.println("\n\t\tFIN DE PROGRAMA");

}
}

}

}

206
No, no es correcto.

Aquí declaras un array, esto está bien:
Código: [Seleccionar]
var nombres = new Array();
Pero aquí, al usar prompt(), ahora "var nombres" ha dejado de ser un array.
Código: [Seleccionar]
nombres = prompt('introduce 3 nombres');Ahora es un string, porque eso es lo que retorna la instrucción prompt().

Por estas cosas soy amante de los lenguajes fuertemente tipados je je.
JavaScript tiene un tipado débil y a la que te despistas, un array pasa a ser un string, un string pasa a ser un dato numérico, un numérico pasa a ser un objeto de clase....

Por otra parte, suponiendo que prompt() hubiera funcionado y te hubiera dado tres nombres para guardar en el array, esos nombres los estarías machacando en las siguientes líneas:
Código: [Seleccionar]
nombres [0] = "";
nombres [1]= "";
nombres [2]= "";
Aquí lo que estás haciendo es colocar cadenas vacías en las tres posiciones del arreglo, así que estarías borrando los nombres, si es que los hubieras conseguido.

Si queremos tres nombres, hay que usar tres prompt().
El string resultante de cada prompt(), lo colocaremos en distintas posiciones del array

Prueba este script:
Código: [Seleccionar]
<script>
var nombres = new Array();
alert('introduce 3 nombres a continuación');
nombres[0] = prompt("Nombre 1:");
nombres[1] = prompt("Nombre 2:");
nombres[2] = prompt("Nombre 3:");
alert("Nombres ingresados: " + nombres);
</script>

207
Aprender a programar desde cero / Re: Código
« en: 12 de Mayo 2022, 12:25 »
Vale, pues olvídate de la clase Pair, no la necesitas.

De hecho, creo que estás haciendo una implementación más complicada de lo que estaría pidiendo el enunciado.

Yo la clase CuentaBancaria la escribiría un poco distinta.
Tu método getDatosCuenta() me parece demasiado complicado al retornar un List de Strings. Si su propósito va a ser simplemente mostrar en pantalla los datos de la cuenta, podemos solucionarlo construyendo un único String con todos esos datos.
Con String.format() se puede hacer de forma sencilla y además hará el redondeo del valor double sin tener que recurrir a otras clases.

El método realizarTransferencia(). Como este método pertenece a la clase CuentaBancaria,es decir, lo vamos a invocar desde un objeto de dicha clase, no es necesario que reciba además dos objetos CuentaBancaria como argumentos entre paréntesis.
Bastaría con recibir uno, que será la cuenta "destino" donde se transferirá el importe. La cuenta "origen", será el propio objeto desde el que vamos a invocar este método.

Por cierto, conviene comprobar si la cuenta origen tiene suficiente saldo para cubrir el importe de la transferencia, a no ser que estemos de acuerdo en que la cuenta pueda tener saldo negativo y estar en deuda con el banco  ::)

Esta sería mi clase CuentaBancaria
Código: [Seleccionar]
import java.util.Random;

public class CuentaBancaria {

private double saldoDeCuenta;
    private String nombreDelTitular;
    private long numeroDeCuenta;
   
    public CuentaBancaria(String nombreDelTitular, double saldoDeCuenta) {
        this.saldoDeCuenta = saldoDeCuenta;
        this.nombreDelTitular = nombreDelTitular;
        Random numAleatorioCuenta = new Random();
        this.numeroDeCuenta = Math.abs(numAleatorioCuenta.nextLong());
    }
   
    public double getSaldo() {
    return saldoDeCuenta;
    }
   
    public String getDatosCuenta() {
    return String.format("CCC: %d\nNombre: %s\nSaldo: %.2f", numeroDeCuenta, nombreDelTitular, saldoDeCuenta);
    }
   
    public void realizarTransferencia(CuentaBancaria otraCuenta, double importe) {
   
    if (importe > saldoDeCuenta)
    System.out.println("Esta cuenta no tiene saldo suficiente para cubrir el importe a transferir");
    else {
    saldoDeCuenta -= importe;
    otraCuenta.saldoDeCuenta += importe;
    }
    }
}

Y ahora, una clase para comprobar que funciona la transferencia de dinero, nos puede servir una tan simple y sencilla como esta:
Código: [Seleccionar]
public class Test {

public static void main(String[] args) {

//Creamos cuentas
CuentaBancaria CCC1 = new CuentaBancaria("Sandra Ramirez", 45000.64);
CuentaBancaria CCC2 = new CuentaBancaria("Antonio Losada", 20000.93);

//Mostramos
System.out.println("Cuentas bancarias:");
System.out.println("\n" + CCC1.getDatosCuenta());
System.out.println("\n" + CCC2.getDatosCuenta());

//Transferencia
System.out.println("\nTransfiriendo un importe de: " + 5000.32);
CCC1.realizarTransferencia(CCC2, 5000.32);

//Mostramos de nuevo
System.out.println("\nCuentas despues de haber hecho transferencia:");
System.out.println("\n" + CCC1.getDatosCuenta());
System.out.println("\n" + CCC2.getDatosCuenta());

}

}

Fíjate en lo que decía antes, para hacer la transferencia, invocamos el método desde la cuenta "origen" y nos basta con pasarle como argumento la cuenta "destino" (y el importe claro)
Código: [Seleccionar]
CCC1.realizarTransferencia(CCC2, 5000.32);Con solo eso, si lo ejecutamos, vemos que todo funciona y básicamente se cumple lo que nos está pidiendo el enunciado:
Citar
Cuentas bancarias:

CCC: 7850162117938004654
Nombre: Sandra Ramirez
Saldo: 45000,64

CCC: 3902791561329441160
Nombre: Antonio Losada
Saldo: 20000,93

Transfiriendo un importe de: 5000.32

Cuentas despues de haber hecho transferencia:

CCC: 7850162117938004654
Nombre: Sandra Ramirez
Saldo: 40000,32

CCC: 3902791561329441160
Nombre: Antonio Losada
Saldo: 25001,25

Bien, pues ya lo tenemos.
Sin embargo, ya que parece que no te gustan las cosas tan simples  ;) podemos hacer una versión algo más avanzada.
Ya que intentabas crear "pares" con claves y valores...., podemos hacer un programa con menú para crear tantas cuenta bancarias como queramos.
Estas cuentas las podemos "mapear" utilizando el código de cuenta bancaria como clave para asociarlas.
Y con otra opción de menú, seleccionar una cuenta origen, otra destino y hacer transferencia.

Para ello, primero quiero modificar levemente la clase CuentaBancaria.
Le vamos a añadir un get para obtener el número de cuenta que se genera aleatoriamente, ya que lo vamos a necesitar para usarlo como clave al "mapear" las cuentas.

Y el método para realizar transferencias, lo vamos a hacer boolean, para que retorne false si no puedo hacerse la transferencia (por falta de fondos) o true si todo salió bien.

Marco en negrita los cambios:
Citar
public class CuentaBancaria {

   private double saldoDeCuenta;
    private String nombreDelTitular;
    private long numeroDeCuenta;
   
    public CuentaBancaria(String nombreDelTitular, double saldoDeCuenta) {
        this.saldoDeCuenta = saldoDeCuenta;
        this.nombreDelTitular = nombreDelTitular;
        Random numAleatorioCuenta = new Random();
        this.numeroDeCuenta = Math.abs(numAleatorioCuenta.nextLong());
    }
   
    public long getNumeroCuenta() {
       return numeroDeCuenta;
    }

   
    public double getSaldo() {
       return saldoDeCuenta;
    }
   
    public String getDatosCuenta() {
       return String.format("CCC: %d\nNombre: %s\nSaldo: %.2f", numeroDeCuenta, nombreDelTitular, saldoDeCuenta);
    }
   
    public boolean realizarTransferencia(CuentaBancaria otraCuenta, double importe) {
       
       if (importe > saldoDeCuenta) {
          System.out.println("Esta cuenta no tiene saldo suficiente para cubrir el importe a transferir");
          return false;
       }
       else {
          saldoDeCuenta -= importe;
          otraCuenta.saldoDeCuenta += importe;
          return true;
       }
    }
}

Y ahora creamos un nuevo programa principal, donde usaremos un HashMap para mapear las cuentas mediante su código de cuenta como clave.
Y con un menú, el usuario podrá escoger opciones.
Código: [Seleccionar]
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Scanner;

public class Test {

private static HashMap<Long, CuentaBancaria> cuentas = new HashMap<Long, CuentaBancaria>();
private static Scanner teclado = new Scanner(System.in);

public static void main(String[] args) {

int opcion = 0;
while (opcion != 4) {
System.out.println("\n\t\tBANCO ORACLE");
System.out.println("\t\t----- ------\n");
System.out.println("[1] -- Crear una Cuenta Bancaria");
System.out.println("[2] -- Listar todas las Cuentas");
System.out.println("[3] -- Hacer una Transferencia");
System.out.println("[4] -- SALIR");
System.out.print("Elija opcion: ");
opcion = Integer.parseInt(teclado.nextLine());

switch(opcion) {
case 1:
crearCuenta();
break;
case 2:
listarCuentas();
break;
case 3:
hacerTransferencia();
break;
case 4:
System.out.println("\n\t\tFIN DE PROGRAMA");
break;
default:
System.out.println("Opcion equivocada");
}
}

}

private static void crearCuenta() {
System.out.println("\n\tNUEVA CUENTA");
System.out.print("Nombre Titular: ");
String nombre = teclado.nextLine();
System.out.print("Saldo inicial: ");
double saldo = Double.parseDouble(teclado.nextLine());
CuentaBancaria nuevaCCC = new CuentaBancaria(nombre, saldo);
cuentas.put(nuevaCCC.getNumeroCuenta(), nuevaCCC);
}

private static void listarCuentas() {
System.out.println("\nLISTADO DE CUENTAS");
if (cuentas.isEmpty())
System.out.println("No hay cuentas bancarias registradas");
else {
for(Entry<Long, CuentaBancaria> ccc: cuentas.entrySet())
System.out.println("\n" + ccc.getValue().getDatosCuenta() + "\n");
}
}

private static void hacerTransferencia() {
System.out.println("\n\tHACER TRANSFERENCIA");
System.out.print("Num. Cuenta ORIGEN: ");
long cccOrigen = Long.parseLong(teclado.nextLine());
System.out.print("Num. Cuenta DESTINO: ");
long cccDestino = Long.parseLong(teclado.nextLine());
System.out.print("Importe: ");
double importe = Double.parseDouble(teclado.nextLine());

//Buscamos las cuentas
CuentaBancaria origen = cuentas.get(cccOrigen);
CuentaBancaria destino = cuentas.get(cccDestino);

//Comprobamos que existen, y si existen, intentamos transferencia
if (origen == null)
System.out.println("No existe cuenta ORIGEN con nº: " + cccOrigen);
else if (destino == null)
System.out.println("No existe cuenta DESTINO con nº: " + cccDestino);
else if (origen.realizarTransferencia(destino, importe))
System.out.println("Transferencia realizada con exito");

}
}

Si lo ejecutamos, vemos que se pueden crear cuentas, seleccionarlas mediante su código y hacer transferencias entre ellas:
Citar
      BANCO ORACLE
      ----- ------

[1] -- Crear una Cuenta Bancaria
[2] -- Listar todas las Cuentas
[3] -- Hacer una Transferencia
[4] -- SALIR
Elija opcion: 1

   NUEVA CUENTA
Nombre Titular: Sara Pelaez
Saldo inicial: 4500.45

      BANCO ORACLE
      ----- ------

[1] -- Crear una Cuenta Bancaria
[2] -- Listar todas las Cuentas
[3] -- Hacer una Transferencia
[4] -- SALIR
Elija opcion: 1

   NUEVA CUENTA
Nombre Titular: Pedro Ramiro
Saldo inicial: 1500.75

      BANCO ORACLE
      ----- ------

[1] -- Crear una Cuenta Bancaria
[2] -- Listar todas las Cuentas
[3] -- Hacer una Transferencia
[4] -- SALIR
Elija opcion: 2

LISTADO DE CUENTAS

CCC: 1790563580212299009
Nombre: Pedro Ramiro
Saldo: 1500,75


CCC: 7698480902857524209
Nombre: Sara Pelaez
Saldo: 4500,45


      BANCO ORACLE
      ----- ------

[1] -- Crear una Cuenta Bancaria
[2] -- Listar todas las Cuentas
[3] -- Hacer una Transferencia
[4] -- SALIR
Elija opcion: 3

   HACER TRANSFERENCIA
Num. Cuenta ORIGEN: 7698480902857524209
Num. Cuenta DESTINO: 1790563580212299009
Importe: 500.45
Transferencia realizada con exito

      BANCO ORACLE
      ----- ------

[1] -- Crear una Cuenta Bancaria
[2] -- Listar todas las Cuentas
[3] -- Hacer una Transferencia
[4] -- SALIR
Elija opcion: 2

LISTADO DE CUENTAS

CCC: 1790563580212299009
Nombre: Pedro Ramiro
Saldo: 2001,20


CCC: 7698480902857524209
Nombre: Sara Pelaez
Saldo: 4000,00


      BANCO ORACLE
      ----- ------

[1] -- Crear una Cuenta Bancaria
[2] -- Listar todas las Cuentas
[3] -- Hacer una Transferencia
[4] -- SALIR
Elija opcion: 4

      FIN DE PROGRAMA



Y ahora sí, ya tenemos un programa un poco más avanzado.
Pregunta lo que no entiendas o pienses que pueda ser incorrecto.

Un saludo.

208
Aprender a programar desde cero / Re: Código
« en: 11 de Mayo 2022, 17:33 »
No dices cuál es el error que te da.  :o

Pero veo que usas la clase Pair de JavaFx. ¿El problema te viene por ahí?
JavaFx ya no está incluido en los JDK oficiales, son librerías que se tratan por separado, así que puede que no las hayas incluido correctamente en tu proyecto. De hecho conseguir incluir JavaFx puede dar tantos quebraderos de cabeza, que yo hace tiempo que lo dejé de lado. Y la verdad es que ahora mismo ni recuerdo como hacerlo.

Puedes intentar evitar el uso de Pair  escribiendo tú mismo una clase que cumpla las mismas funciones.

Otra posibilidad es usar la clase AbstractMap que tiene un clase estática para crear una "entrada simple" de un Map, y viene a ser prácticamente lo mismo que Pair:
Citar
AbstractMap.SimpleEntry<K,V>
Donde K sería la clave y V el valor asociado.
Por Google hay numerosos ejemplos sobre esto.

Si el error que tienes no viene por aquí, dinos que error de compilación te da, a ver si podemos ayudarte mejor.

Un saludo.

209
Sigo sin saber donde/como tienes declarados esos botones.

Hablas de 100 botones.... Si los tienes así declarados, desde el 1 hasta el 100:

Código: [Seleccionar]
private JButton btnDiscos1;
private JButton btnDiscos2;
private JButton btnDiscos3;
private JButton btnDiscos4;
private JButton btnDiscos5;
.....
.....
private JButton btnDiscos100;

Pues ya te digo que mal asunto, es imposible gestionarlo de forma óptima.

En cambio, si los pones en un array como en el ejemplo que yo puse, ya lo tendrías solucionado.
El parámetro "int numeroBoton" que te indica qué archivo imagen hay que escoger del array de imágenes, también te estaría diciendo a cuál botón del array de botones hay que aplicarle esa imagen.

210
Hola.
Pero, si tienes 100 botones, lo normal es que los tengas declarados dentro un array.
Por tanto, basta con recorrer el array y establecer la imagen que toque.

La verdad es que no me queda muy claro el objetivo del programa.
Y el código que has puesto lo veo extraño, pues se declara un array de botones dentro del método (ese array "morirá" cuando el método acabe.
Además es un array de 100 botones pero se recorre con un bucle que va hasta 105, así que seguramente producirá una excepción por salirse del rango del array.

Y de todos modos, ese array no hace nada, porque luego se trabaja sobre un objeto llamado btnDiscos1.

Así que ese código tampoco me sirve para hacerme una idea concreta de lo que se necesita.

Pero pongo aquí un ejemplo muy básico, donde se inicializan 100 botones (están en un array) y se colocan en pantalla.
Al inicializarlo, se les adjudica una imagen. Les he puesto a todos la misma, pero se podría modificar para coger imágenes de una lista creada previamente.

Código: [Seleccionar]
public class CienBotones extends JFrame {

private JButton[] botones;

public CienBotones() {

iniciarBotones();

setLayout(new GridLayout(10, 10, 6, 6));
for (JButton btn: botones)
add(btn);

setTitle("Cien Botones");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}

private void iniciarBotones() {
botones = new JButton[100];
for (int i = 0; i < 100; i++)
botones[i] = new JButton(new ImageIcon(getClass().getClassLoader().getResource("cienBotonesImagen/imagen.png")));
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
new CienBotones();
}
});
}

}

Al ejecutarlo, se crean 100 botones con imagen, sin importar su nombre. Porque de hecho no tienen "nombre", están agrupados en un array, ya que es la única forma de trabajar cómodamente con tantos botones.



A ver si te sirve de inspiración para optimizar tu código.
Si lo crees necesario, comparte aquí tu código (puedes adjuntarlo como archivo .zip) y/o tal vez una imagen de como debería quedar el resultado.

Un saludo.

211
Pero ahí no estás usando ningún ArrayList.
Estás usando un arreglo primitivo:
Citar
   public static void main(String[] args) {
      // TODO Esbozo de método generado automáticamente
     
      Scanner read = new Scanner(System.in);

           double []notas;
           int aprobados = 0;
           int reprobados = 0;
           int numNotas;

Un ArrayList para recoger valores double, se declararía de esta manera:
Código: [Seleccionar]
ArrayList<Double> notas = new ArrayList<Double>();
Fíjate que el tipo "Double" lo escribimos en mayúscula. Esto es porque ArrayList no trabaja con tipos primitivos: int, double, float, byte, char...

ArrayList solo trabaja almacenando objetos de clases: Integer, Double, Float, Byte, Character,...

Otra característica del ArrayList es que es dinámico, es decir, no tiene un tamaño fijo como los arreglos primitivos. El ArrayList puede ir creciendo o menguando según insertamos o retiramos objetos.

Así que ni siquiera hace falta preguntar previamente al usuario cuantas notas quiere introducir, podemos ir pidiéndolas y que el usuario decida cuándo quiere terminar.
Esta decisión podemos hacerla preguntando si "quiere continuar (si/no)" o simplificándola aún más mediante alguna condición especial, por ejemplo terminar cuando introduzca un valor negativo (ya que además un valor negativo no serviría como nota para una calificación)

Una vez tenemos las notas insertadas, volvemos a recorrer el ArrayList y por cada nota preguntamos si supera o no la calificación necesaria para aprobar.
Si la supera, contamos un aprobado. Si no, pues contaremos un reprobado.

Terminado este proceso, mostramos los contadores en pantalla.

Si por ejemplo las notas fueran de 0 a 10, siendo necesario un 5 para aprobar, este podría ser el código:
Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Scanner;

public class Notas {

public static void main(String[] args) {

Scanner read = new Scanner(System.in);

ArrayList<Double> notas = new ArrayList<Double>();
int aprobados = 0, reprobados = 0;

//Pedimos notas hasta que introduzcan un valor negativo
double nuevaNota = 0;
while (nuevaNota >= 0) {
System.out.print("Introduzca nueva nota(valor negativo para terminar): ");
nuevaNota = read.nextDouble();
//solo aceptamos la nota si NO es valor negativo
if (nuevaNota >= 0)
notas.add(nuevaNota); //Insertamos en ArrayList
}

//Ya tenemos las notas, recorremos el ArrayList evaluando las notas y contando aprobados/reprobados
//Podemos usar un FOR EACH
for (double nota: notas)
if (nota < 5)
reprobados++;
else
aprobados++;

//Listo, mostramos resultados
System.out.println("\n\nAprobados: " + aprobados);
System.out.println("Reprobados: " + reprobados);
System.out.println("\n\t\tFIN DE PROGRAMA");
read.close();
}

}

Al ejecutarlo, en pantalla vemos que se piden notas hasta que se introduce un valor negativo. Entonces se muestra el conteo de aprobados/reprobados:
Citar
Introduzca nueva nota(valor negativo para terminar): 6
Introduzca nueva nota(valor negativo para terminar): 3
Introduzca nueva nota(valor negativo para terminar): 8
Introduzca nueva nota(valor negativo para terminar): 9
Introduzca nueva nota(valor negativo para terminar): 1
Introduzca nueva nota(valor negativo para terminar): 2
Introduzca nueva nota(valor negativo para terminar): 5
Introduzca nueva nota(valor negativo para terminar): 5
Introduzca nueva nota(valor negativo para terminar): -2


Aprobados: 5
Reprobados: 3

      FIN DE PROGRAMA

Cualquier duda, vuelve a preguntar.
Un saludo.

212
Aprender a programar desde cero / Re: POO con Ciclo y Arrays
« en: 03 de Mayo 2022, 17:58 »
Vamos por partes.

La clase Estudiante, contiene un error grave:
Citar
public Estudiante() {
        this.nombre = "";
        this.apellido = "";
        this.telefono = Integer.parseInt("");
    }

Ahí le estás pidiendo que convierta una cadena vacía, en un valor numérico.
Eso es imposible.
Cuando ponemos un constructor "por defecto" sin parámetros, los atributos de tipo String si podemos inicializarlos con cadenas vacías, pero los datos numéricos (int, float, double,...) hay que inicializarlos con un número, por costumbre, el 0.

Así que la clase Estudiante, podría quedar así, añadiendo además getters y setteres para cada atributo:
Código: [Seleccionar]
public class Estudiante {

private String nombre;
    private String apellido;
    private int telefono;
   
    public Estudiante() {
        this.nombre = "";
        this.apellido = "";
        this.telefono = 0;
    }
   
public Estudiante(String nombre, String apellido, int telefono) {
this.nombre = nombre;
this.apellido = apellido;
this.telefono = telefono;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getApellido() {
return apellido;
}

public void setApellido(String apellido) {
this.apellido = apellido;
}

public int getTelefono() {
return telefono;
}

public void setTelefono(int telefono) {
this.telefono = telefono;
}

}

Volviendo al programa principal, ahora que se ha vuelto más complejo, hay que hacer algunos cambios a lo que hicimos antes.
Se supone que de esa clase Estudiante, vamos almacenar objetos en el arreglo. Así que este ya no será de tipo String, si no de tipo Estudiante

Citar
   public static void main(String[] args) {
      
      Estudiante[] estudiantes = null;
      int cantidad = 0;
      boolean validado = false;
      
      //Este bucle se repite hasta que logremos inicializar el arreglo con una cantidad válida
      while (!validado) {
         try {
            //Pedimos cantidad de alumnos contendrá el arreglo
            cantidad = Integer.parseInt(JOptionPane.showInputDialog(null, "Indique cantidad de Estudiantes:"));
            //Validamos la cantidad, si está fuera de límites lanzamos excepción
            if (cantidad < 5 || cantidad > 20)
               throw new Exception("ERROR: Cantidad alumnos no puede ser inferior a 5 ni superior a 20");
            else {
               estudiantes = new Estudiante[cantidad];
               validado = true; //Todo ha ido bien, esto pondrá fin al bucle while
            }
         }
         catch(NumberFormatException nfe) {//Aquí capturamos excepción en caso de fallar el parseInt()
            JOptionPane.showMessageDialog(null, "ERROR: Introduzca un valor numérico");
         }
         catch(Exception ex) {//Aquí capturamos cualquier excepción, principalmente la que lanzamos si cantidad está fuera de rango
            JOptionPane.showMessageDialog(null, ex.getMessage());
         }
      }
   
      //Bucle while terminado, ya tenemos arreglo
      JOptionPane.showMessageDialog(null,
            "Lista estudiantes inicializada. Cantidad de alumnos: " + estudiantes.length);

   }

Bien, se nos dice que ahora hay que mostrar un menú para buscar estudiantes, modificarlos,....
Pero, en nuestro programa no hemos creado ningún estudiante. Hemos creado un arreglo donde se pueden insertar estudiantes, pero no hemos escrito nada que permita insertarlos y por tanto va a ser imposible buscar o modificar estudiantes..., porque no los hay.

Así que, antes de mostrar ese menú, habrá que crear un proceso donde se soliciten datos para crear esos estudiantes.
En este proceso, mediante un bucle, pediremos nombre, apellidos y un teléfono por cada estudiante.
De nuevo, con try catch, podemos controlar que los datos tengan cierta validez, al menos que los campos de nombre y apellido no los dejen en blanco sin rellenar y que el teléfono esté compuesto de cifras numéricas.
Cuando tengamos esos datos validados, construimos un nuevo estudiante y lo insertaremos en el arreglo

Así que justo a continuación de lo que teníamos escrito, añadimos esto:
Código: [Seleccionar]
//Ahora, hay que registrar estudiantes
for (int i = 0; i < estudiantes.length; i++) {
Estudiante nuevo = null; //Referencia temporal para construir el nuevo estudiante antes de insertar en arreglo
while (nuevo == null) { //Mientras no se haya logrado construir un objeto Estudiante...
//Pedimos datos, controlando posibles excepciones
try {
String nombre = JOptionPane.showInputDialog(null, "Nombre:", "Estudiante para posicion #" + i, JOptionPane.QUESTION_MESSAGE);
if (nombre.isBlank())
throw new Exception("El campo Nombre no puede estar vacío");
String apellido = JOptionPane.showInputDialog(null, "Apellido:", "Estudiante para posicion #" + i, JOptionPane.QUESTION_MESSAGE);
if (apellido.isBlank())
throw new Exception("El campo Apellido no puede estar vacío");
int telefono = Integer.parseInt(JOptionPane.showInputDialog(null, "Teléfono:", "Estudiante para posicion #" + i, JOptionPane.QUESTION_MESSAGE));
//Si llegados a esta línea no se han lanzado excepciones, podemos construir un Estudiante
nuevo = new Estudiante(nombre, apellido, telefono);
//insertamos en arreglo, en la posición que indica el índice del bucle FOR
estudiantes[i] = nuevo;
}
catch(NumberFormatException nfe) {
JOptionPane.showMessageDialog(null, "El teléfono ha de estar compuesto solo de cifras numéricas");
}
catch(Exception ex) {
JOptionPane.showMessageDialog(null, ex.getMessage());
}
}
}

Ya tenemos el código necesario para crear un arreglo de estudiantes y rellenarlo con datos.

Ahora sí, es cuando podemos mostrar el menú de opciones para buscar o modificar estudiantes.

Este menú se ha de repetir hasta que el usuario escoja la opción de salir (opción 3), así que podemos usar un bucle while cuya condición sea que se repita mientras que la variable "option" sea distinta de 3.
Y para evaluar la opción introducida, en lugar de usar varios if else, recomienda usar un switch, para que quede mejor estructurado:
Código: [Seleccionar]
//Ya tenemos estudiantes, podemos mostrar menú de opciones
String[] options = {"Buscar Estudiante", "Buscar por puesto", "Modificar nombre estudiante", "Salir"};
int option = 0;
while (option != 3) { //3 es la opcion de "Salir"
        option = JOptionPane.showOptionDialog(null, "Seleccione una opcion",
                "Seleccione una opcion",
                JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, options[0]);
        //Usamos un switch para evaluar la opcion escogida
        switch(option) {
        //Buscar por nombre
        case 0:
        String nombre = JOptionPane.showInputDialog(null, " Ingrese el Nombre del estudiante");
        //Falta código para buscar por nombre...
       
        break;
        //Buscar por puesto/posición en el arreglo
        case 1: 
        int puesto = Integer.parseInt(JOptionPane.showInputDialog(null, "Ingrese el Numero de Puesto"));
        //Falta código para buscar por puesto...
       
        break;
        //Buscar por puesto y cambiar el nombre
        case 2:
        //Falta código para buscar por puesto y cambiar el nombre...
       
        break;
        //Salir del programa
        case 3:
        JOptionPane.showMessageDialog(null, "Cerrando su sesion");
        }
}

Como ves, el código no está terminado.
Para cada caso del switch, hay que escribir el código necesario para conseguir lo que pide el menú.
Inténtalo y ya nos cuentas como te va.

Por cierto, de ser posible, aquí lo que interesaría sería "modular" el programa escribiendo distintos métodos para cada opción del menú.
Un método para buscar por nombre, otro para buscar por puesto y otro para cambiar el nombre de un estudiante seleccionado.
Así no tendremos un único código enorme, si no varios códigos más pequeños, con lo cuál es más fácil de leer y mantener.

No se si te han enseñado ya a programar con una estructura modular, si no es así, pues nada..., tocará escribirlo todo junto.

Un saludo


213
La expresión a construir es compleja, precisamente para practicar a tope este tema.

Cuando una expresión está compuesta de varias "subexpresiones", lo mejor es encerrar estas subexpresiones en sus propios paréntesis. Así nos aseguramos de que se cumplan las prioridades sobre qué partes se han de evaluar primero y además se entiende mejor luego al leerlo a simple vista.

Las destaco con colores, para que aún se vea mejor:

SI -->  Si el diámetro es superior a 1.4 con un grosor inferior a 0.4
o
SI--> si el diámetro es menor o igual a 1.4 pero mayor que 0.8, con un grosor inferior a 0.25


Citar
if ( (diametro > 1.4 && grosor < 0.4) || ( (diametro <= 1.4 && diametro > 0.8 ) && grosor < 0.25) )
    alert('El grosor para esta rueda es inferior al recomendado');

214
Aprender a programar desde cero / Re: Ejercicio Estudiantes
« en: 01 de Mayo 2022, 12:35 »
Hola.
Puedes usar un "multicatch", es decir, que el try tenga dos catch:
- Uno para cuando el usuario introduzca un valor que no es numérico y falle el parseInt, que producirá un NumberFormatException
- Otro, para capturar una excepción que podemos lanzar "manualmente" en el caso de que el valor introducido esté fuera de los límites entre 5 y 20.

Todo esto, podemos encerrarlo dentro de un bucle while  y usar una variable de tipo boolean que permanezca con valor false hasta que hayamos conseguido una cantidad que supere la "validación" y podamos inicializar el arreglo de estudiantes.

Esta podría ser una solución, si algo no lo entiendes o crees que no sería la solución más adecuada, indícalo y lo comentamos.
Un saludo.
Código: [Seleccionar]
public class Estudiantes {

public static void main(String[] args) {

String[] estudiantes = null;
int cantidad = 0;
boolean validado = false;

//Este bucle se repite hasta que logremos inicializar el arreglo con una cantidad válida
while (!validado) {
try {
//Pedimos cantidad de alumnos contendrá el arreglo
cantidad = Integer.parseInt(JOptionPane.showInputDialog(null, "Indique cantidad de Estudiantes:"));
//Validamos la cantidad, si está fuera de límites lanzamos excepción
if (cantidad < 5 || cantidad > 20)
throw new Exception("ERROR: Cantidad alumnos no puede ser inferior a 5 ni superior a 20");
else {
estudiantes = new String[cantidad];
validado = true; //Todo ha ido bien, esto pondrá fin al bucle while
}
}
catch(NumberFormatException nfe) {//Aquí capturamos excepción en caso de fallar el parseInt()
JOptionPane.showMessageDialog(null, "ERROR: Introduzca un valor numérico");
}
catch(Exception ex) {//Aquí capturamos cualquier excepción, principalmente la que lanzamos si cantidad está fuera de rango
JOptionPane.showMessageDialog(null, ex.getMessage());
}
}

//Bucle while terminado, ya tenemos arreglo
JOptionPane.showMessageDialog(null,
"Lista estudiantes inicializada. Cantidad de alumnos: " + estudiantes.length);

}

}

215
Hola.

Veamos:
Citar
Operador ++ (anterior): ++a * b == 10
(Ahora el valor de a es: 5)
Ahí se están realizando dos operaciones:
- un incremento(una suma) sobre a
- una multiplicación de a * b.

Si primero hacemos el incremento y luego la multiplicación, tendremos un resultado.
Pero, si primero multiplicamos y el incremento lo hacemos después, el resultado será distinto.

Entonces, cuando se usa "incremento anterior", primero se hace el incremento y luego se multiplica.
Eso es lo que ocurre aquí:
Citar
a = 4, b = 2
Operador ++ (anterior): ++a * b == 10
(Ahora el valor de a es: 5)
La a se incrementa en valor 5, y luego se multiplica por b que es 2. Resultado =  10.

En cambio, si se usa el "incremento posterior", entonces primero se hace la multiplicación y el incremento ocurre después.
Citar
a = 4, b = 2
Operador ++ (posterior): a++ * b == 8  //¿pq de este resultado??
(Ahora el valor de a es: 5)
Aquí se multiplica la a que vale 4 por b que es dos. Resultado = 8.
Y después, se hace el incremento, por lo que la a pasa a valer 5.
Pero ese 5 no interviene en la multiplicación, porque esta ya terminó.

En ambos casos, la a termina valiendo 5. La diferencia es que en el primer caso se multiplica después de adoptar el valor 5.
Y en el segundo caso, la multiplicación ocurre antes de que adopte valor 5

En los console.log(), ocurre lo mismo:
Citar
var a = 2;
console.log(a++); //me da 2
console.log(++a); // me da 4

En la primera línea, la de color azul, se usa el "incremento posterior".
Es decir, ocurra lo que ocurra, lo último será la suma.

Entonces, esa línea azul lo primero que hace es mostrarte el valor de a, que es 2.
Y lo último que hace es el incremento, así que la a pasa a valer 3.
Pero ese 3, tú no lo ves en pantalla, porque cuando el log() mostró el valor de a, aún no se había incrementado.

La siguiente línea, la verde, hace un "incremento anterior", es decir, lo primero que va a ocurrir es la suma. Luego ya pasará lo que tenga que pasar.
Por tanto, la línea verde lo primero que hace es incrementar la a, que valía 3 y ahora pasa a valer 4.
Y tras esto, te muestra en pantalla su valor, que ya es 4.

Espero que ahora haya quedado un poco más claro la diferencia que hay entre estos dos tipos de incrementos (y decrementos).

Saludos.

216
Hola.
Las respuestas las puedes predefinir declarando variables con var.
Sin embargo, sería más correcto declararlas como "constantes" con la instrucción const
¿Por qué?
Porque esas respuestas no vamos a querer que varíen a lo largo de la ejecución del programa (por muy simple que este sea), así que las podemos declarar como constantes.
De ese modo, están "protegidas" y no hay riesgo de que, por error, en las siguientes líneas de código machaquemos esas respuestas usando un prompt o algo.
En un programa tan sencillo de pocas líneas difícilmente vamos a cometer ese error, y si lo cometemos, pues es fácil de corregir.
Pero en un programa más complejo, sí podríamos cometer ese error y luego tener que revisar cientos de líneas de código hasta comprender donde hemos metido la pata.

Por eso es "buena costumbre" declarar como constantes las variables que no queremos que varíen.

Luego, para comparar las respuestas correctas con las que de el usuario, hay que tener en cuenta que a lo mejor el usuario teclea las letras todas en minúsculas, o todas en mayúsculas, o quien sabe...
Y eso puede provocar errores, porque "Quito" no es lo mismo que "quito" ni tampoco que "QUITO".
Así que nuestro programa puede dar como fallo a una respuesta que en realidad si es correcta, solo que no ha sido escrita como esperábamos.

Para evitar esto, lo más cómodo es predefinir las respuestas completamente en minúsculas.
Y luego, las respuestas del usuario, también las transformaremos a minúsculas (invocando la función toLowerCase()) para hacer la comparación con la respuesta correcta.
De esta forma conseguimos evaluar las respuestas sin que importe cómo se han escrito.

Para contar las respuestas correctas, usas una variable contador inicializada a 0.
Con un if comparas la respuesta del usuario con la respuesta predefinida, si coinciden, aumentamos el contador.

Luego al final, muestra el resultado del contador.

Este podría ser el código, con solo dos preguntas. Añade tú las otras tres:
Código: [Seleccionar]
<script>
//Respuestas correctas
const capital1 = "quito", capital2 = "washington"
//Contador de respuestas acertadas
var acertadas = 0;

var pregunta1 = prompt("¿Capital de Ecuador?");
if (pregunta1.toLowerCase() == capital1)
    acertadas++;
   
var pregunta2 = prompt("¿Capital de EEUU?");
if (pregunta2.toLowerCase() == capital2)
    acertadas++;
   
alert("Respuestas acertadas: " + acertadas);
</script>

Luego más adelante, verás que en lugar de tener que declarar cinco constantes y recoger las respuestas en otras cinco variables, se puede hacer mejor y más elegante utilizando "arreglos", que son algo así como variables que en lugar de un único valor, pueden contener varios valores juntos.

Pero eso ya lo verás cuando toque.

217
Hola.
Eso ocurre porque los prompt() te dan cadenas de caracteres:
Código: [Seleccionar]
            var adcon3 = prompt("introduce un numero entero ");
            var adcon4 = prompt("introduce otro numero");

Entonces, si luego con esas variables haces operaciones aritméticas con los operadores de división multiplicación, resta o módulo, dichos operadores trabajan únicamente con valores numéricos.
En ese caso, JS no tiene dudas de que pretendes hacer una operación matemática con ellos, así que él mismo convierte esas cadenas que te han dado los prompt a valores numéricos y hace una operación aritmética.

Sin embargo, el operador de suma aritmética, es el mismo que el de "concatenar" cadenas.
Aquí JS ya no puede deducir cuál es tu intención y lo que hace es "respetar" el tipo de dato original de las variables, que en este caso son cadenas, por eso te está haciendo una concatenación.

Puedes solucionarlo transformando tú mismo las cadenas a números, con la función Number()
Código: [Seleccionar]
            suma = Number(adcon3) + Number(adcon4) ;
            alert('la adiccion es  ' + suma);
De este modo, JS ya no tiene dudas de que tu deseo es hacer una suma aritmética

218

Para usar simultáneamente comillas simples y dobles, no es necesario usar backlash.
Sin embargo, si quisieras usarla para, como dices, intentar clarificar la lectura, deberías usarlas así:
Código: [Seleccionar]
'\"aprendemos\"'Es decir, la barra backlash siempre tiene que ir delante del carácter que queremos escapar. En este caso, queremos escapar las comillas dobles para que sean consideradas como caracteres y no como delimitadores.


Conocer la longitud de una cadena tiene innumerables utilidades, tantas como nuestra imaginación sea capaz de ingeniar.
Por ejemplo, supón que hacemos una página donde la gente se registra con un nombre de usuario y una contraseña.
Por seguridad, vamos a exigir que la contraseña tenga como mínimo 8 caracteres.
Pues gracias a .length, podremos comprobar si el valor introducido por el usuario para escoger contraseña está cumpliendo o no la exigencia de un mínimo de 8 caracteres.
Código: [Seleccionar]
if (campoPassword.length < 8)
   alert("La contraseña no es válida. Ha de tener un mínimo de 8 caracteres.");

También puede servir para validar otros datos, por ejemplo un número de teléfono o un número de DNI, ya que sus longitudes tienen unos mínimos y unos máximos.
Aunque para comprobar estos datos suelen usarse "expresiones regulares" que son más eficientes.

O supón que queremos programar una especie de analizador gramatical, de manera que la página pueda leer un archivo .txt y agrupar las palabras que lo componen según su longitud.

O imagina que conseguimos programar un juego tipo Scrabble donde los jugadores construyen palabras en un tablero con las letras que van recibiendo.
Para saber cuántos puntos están ganando en cada turno, hay que identificar la longitud de la palabra que han conseguido construir.

No es extraño necesitar saber que longitud tiene una cadena. Es una herramienta de la que conviene disponer.

Twitter limita sus mensajes a 280 caracteres, para ello, necesita conocer el .length de lo que está escribiendo el usuario.

No solo Twitter, por ejemplo cada mensaje que escribimos aquí en este foro, también están limitados a un tope máximo de caracteres, los cuáles se comprueban antes de permitir que nuestro mensaje se publique o no.

219
Creo que eso lo genera automáticamente el programa phpMyAdmin cuando por ejemplo le pides que exporte a SQL el código necesario para crear las tablas de una base de datos.

220
Sí.
Cuando en CSS creamos una clase(class) es porque sabemos que vamos a tener en el documento HTML varios elementos que van a tener unos atributos comunes.

Por ejemplo, si vamos a tener 5 div con el mismo color de fondo y la misma fuente de texto, entonces no vamos a crear 5 estilos por separado para cada div.
Como sabemos que es un único estilo compartido por todos esos div, entonces crearemos una única clase CSS y se la podremos aplicar a los 5 div.

En realidad se le podría aplicar a cualquier elemento HTML al que queramos dotarle de ese estilo.
Si además de esos 5 dv, tenemos una tabla, unos cuantos encabezados <h1/>, unos párrafos..., a los que queremos que tengan el mismo fondo verde y el mismo tipo de letra, a todos ellos le podemos aplicar esa única clase CSS.
Código: [Seleccionar]
<h1 class="miClase">Encabezado</h1>
<p class="miClase">Párrafo</p>
<div class="miClase">div1</div>
<div class="miClase">div2</div>
<div class="miClase">div3</div>
<div class="miClase">div4</div>
<div class="miClase">div5</div>

Lo que NO se puede repetir son los id
Código: [Seleccionar]
<div id="miDiv">div1</div>
<div id="miDiv">div2</div>
<div id="miDiv">div3</div>
<div id="miDiv">div4</div>
<div id="miDiv">div5</div>
Los identificadores (id) son únicos para cada elemento, si los repetimos, no tendremos el resultado esperado.

Así que en lo que respecta a los estilos CSS, usaremos los id cuando queramos aplicar un estilo que va a ser exclusivo de un único elemento del documento.
Y usaremos class para estilos que van a ser compartidos por varios elementos del documento, incluso aunque se traten de elementos de distinta naturaleza.

Páginas: 1 ... 6 7 8 9 10 [11] 12 13 14 15 16 ... 50

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