increíble muchísimas gracias si yo modifico para submenus eso si puedo, quería preguntarte por la observación de precio final como lo implemento porque al pegarlo en la parte precio final me da un error
Sobre el precio.
Yo lo que haría sería eliminar los métodos calcularSubtotal() y calcularIva().
Y escribiría el método calcularPrecioFinal() en la clase
Electrodomestico de esta manera:
public double calcularPrecioFinal(int cantidad) {
return precio * cantidad * 1.12;
}
Por tanto deja de ser un método abstracto.
El único método que si interesa que se abstracto es mostrarDetalles(), porque este si va a ser distinto según cada clase hija.
Aunque de este método, eliminaría la línea que muestra el "valor a pagar por el electrodoméstico", ya que lo que mostraba era el precio de comprar TODAS las unidades existentes.
Y ya luego, en la clase
Main donde hacemos la venta, ahora podemos calcular el precio final de esa venta llamando al nuevo método que hemos escrito:
//Calculamos importe a facturar, actualizamos stock producto e informamos en pantalla
double facturar = solicitado.calcularPrecioFinal(unidades);
solicitado.setCantidad(solicitado.getCantidad() - unidades);
System.out.printf("\nImporte a pagar: %.2f\n", facturar);
System.out.println("Gracias por su compra");
hola me olvide decir que cual era la manera de hacer una funcion que agregue producto y elimine producto y como incluyo los datos de una persona me toca hacer una clase persona para eso ? si una persona quiere comprar mas de 1 producto osea una cocina, una refrigerador y asi se puede integrar eso al programa?
Para hacer todo eso
bien hecho, habría que usar ArrayList o una base de datos, es decir, colecciones dinámicas que puedan crecer o reducir su tamaño.
Como solo nos permiten usar arreglos, que no son los adecuados para estos menesteres, pues se puede intentar hacer algo parecido, algo que simule esas funcionalidades.
Añadir o eliminar productos. Como ya dijimos, estamos limitados a los elementos con los que inicializamos el arreglo.
Hemos puesto 10 y ese es nuestro límite.
Podemos poner 20, ó 100, ó 1000.... eso nos da más margen, pero seguiremos teniendo un límite concreto.
Sin embargo, podemos hacer algo que parezca que añdimos/eliminamos productos. En el arreglo, para eliminar un producto podemos asignar valor
null a la posición que ocupa y así tendríamos una posición libre para añadir otro producto.
Vamos a la clase
Inventario, la que gestiona el arreglo, y la dotamos con estos tres métodos:
public boolean eliminarElectrodomestico(String codigo) {
//Buscamos por codigo, si lo encontramos, asignamos valor null a la posicion.
for (int i = 0; i < productos.length; i++) {
if (productos[i].getCodigo().equals(codigo)) {
productos[i] = null; //Producto eliminado
return true; //Informamos que se ha eliminado con exito
}
}
//Bucle FOR no ha retornado TRUE, no se ha encontrado el producto buscado
return false;
}
public int buscaPosicionLibre() {
for (int i = 0; i < productos.length; i++) {
if (productos[i] == null) //Esta posicion esta libre
return i; //Retornamos la posicion
}
return -1; //Significa que no hay posiciones libres
}
public boolean agregarElectrodomestico(Electrodomestico nuevo) {
int libre = buscaPosicionLibre();
if (libre == -1)
return false; //No hay espacio para añadir nada
else {
productos[libre] = nuevo; //Añadimos
return true; //Informamos que todo OK
}
}
No requieren demasiada explicaciones creo.
El primero elimina un producto según el código indicado.
El segundo busca una posición libre en arreglo y la retorna. Si no la hay, retorna -1.
El tercero añade un nuevo
Electrodomestico al arreglo, si es que hay espacio libre.
Y ahora vamos al
Main y ampliamos el menú con una nueva opción:
public static void main(String[] args) {
int opcion = 0;
do {
System.out.println("\nELECTRODOMESTICOS ELECTROHOGAR");
System.out.println(" MENU DE OPCIONES");
System.out.println("1 = Listar Inventario");
System.out.println("2 = Venta");
System.out.println("3 = Facturacion");
System.out.println("4 = Gestion Inventario");
System.out.println("0 = Salir");
System.out.print("Elija la opcion: ");
opcion = Integer.parseInt(teclado.nextLine());
switch(opcion) {
case 1:
listar();
break;
case 2:
venta();
break;
case 3:
facturacion();
break;
case 4:
gestion();
break;
case 0:
System.out.println("\n\t\tFIN DE PROGRAMA");
break;
default:
System.out.println("Opcion equivocada");
}
} while(opcion != 0);
}
Y tenemos que escribir un nuevo método para llevar a cabo esta gestión.
Aquí mostraremos un submenú para que el usuario elija entre añadir un nuevo Electrodoméstico o eliminar uno existente.
private static void gestion() {
int opcion = 0;
do {
System.out.println("\n\t\tGESTION INVENTARIO\n");
System.out.println("1 == Añadir Electrodomestico");
System.out.println("2 == Eliminar Electrodomestico");
System.out.println("0 == Regresar Menu Principal");
System.out.print("Opcion: ");
opcion = Integer.parseInt(teclado.nextLine());
switch(opcion) {
case 1:
System.out.println("\nIndique la CLASE de Electrodomestico para añadir");
System.out.print("CLASE: ");
nuevoElectrodomestico(teclado.nextLine());
break;
case 2:
System.out.println("\nIndique CODIGO del Electrodoméstico a eliminar.");
System.out.print("CODIGO: ");
String codigo = teclado.nextLine();
if (inventario.eliminarElectrodomestico(codigo))
System.out.println("\nElectrodomestico eliminado.");
else
System.out.println("\nNo existe electrodomestico con CODIGO: " + codigo);
break;
case 0:
System.out.println("\nRegresando a menu principal...");
break;
default:
System.out.println("Opcion equivocada");
}
}while(opcion != 0);
}
He marcado en azul la invocación a otro método.
El proceso de crear un nuevo electrodoméstico requiere bastante código, porque hay que pedir muchos datos. Pero es que encima esos datos son distintos según la clase de electrodoméstico que vamos a registrar. Y hay cuatro diferentes....
Por eso mejor escribir todo esto en otro método independiente.
De nuevo, vamos a dar por hecho que el usuario nos va a dar una clase correcta, aunque vamos a ser "tolerantes" con las mayúsculas y minúsculas.
El método lo que hará será pedir primero los datos que son comunes a TODOS los electrodomésticos.
Y luego, según la clase indicada, pedirá los datos específicos de cada tipo de electrodoméstico.
Una vez recopilados esos datos, añadiremos el producto al inventario.
Pero, antes de hacer todo esto, comprobaremos primero si hay espacio libre, porque si no lo hay..., pues para que vamos a pedir ningún dato...
private static void nuevoElectrodomestico(String clase) {
//Comprobamos si hay espacio libre
if (inventario.buscaPosicionLibre() == -1)
System.out.println("\nNo hay espacio para añadir un nuevo Electrodomestico");
else {
Electrodomestico nuevo = null;
//Pedimos datos comunes
System.out.print("\nNombre: ");
String nombre = teclado.nextLine();
System.out.print("Codigo: ");
String codigo = teclado.nextLine();
System.out.print("Marca: ");
String marca = teclado.nextLine();
System.out.print("Cantidad: ");
int cantidad = Integer.parseInt(teclado.nextLine());
System.out.print("Precio: ");
double precio = Double.parseDouble(teclado.nextLine());
//Pedimos datos específicos, según la clase indicada
switch(clase.toLowerCase()) {
case "cocina":
System.out.print("Nº de Hornillas: ");
int hornillas = Integer.parseInt(teclado.nextLine());
System.out.print("Tiene Horno(Si/No): ");
boolean tieneHorno = teclado.nextLine().equalsIgnoreCase("si");
System.out.print("Sistema de Coccion: ");
String coccion = teclado.nextLine();
nuevo = new Cocina(nombre, codigo, marca, cantidad, precio, hornillas, tieneHorno, coccion);
break;
case "refrigeradora":
System.out.print("Pies: ");
double pies = Double.parseDouble(teclado.nextLine());
System.out.print("Nivel Congelamiento: ");
int nivel = Integer.parseInt(teclado.nextLine());
nuevo = new Refrigeradora(nombre, codigo, marca, cantidad, precio, pies, nivel);
break;
case "televisor":
System.out.print("Pulgadas: ");
int pulgadas = Integer.parseInt(teclado.nextLine());
System.out.print("Resolucion: ");
String resolucion = teclado.nextLine();
System.out.print("Tipo Pantalla: ");
String pantalla = teclado.nextLine();
nuevo = new Televisor(nombre, codigo, marca, cantidad, precio, pulgadas, resolucion, pantalla);
break;
case "lavadora":
System.out.print("Velocidad: ");
int velocidad = Integer.parseInt(teclado.nextLine());
System.out.print("Capacidad de Lavado: ");
String capacidad = teclado.nextLine();
System.out.print("Ciclos: ");
int ciclos = Integer.parseInt(teclado.nextLine());
nuevo = new Lavadora(nombre, codigo, marca, cantidad, precio, velocidad, capacidad, ciclos);
break;
}
//Nuevo electrodomestico construido, lo añadimos
if (nuevo == null)
System.out.println("\nERROR. No existen Electrodomesticos de la clase " + clase);
else if (inventario.agregarElectrodomestico(nuevo))
System.out.println("\nNuevo Electrodomestico registrado");
else
System.out.println("\nNo se pudo registrar Electrodomestico."
+ " Puede que no haya espacio libre en el Inventario.");
}
}
Y listo, si lo ponemos a prueba, vemos que al comenzar el programa no deja añadir nada porque no hay espacio libre.
Pero si eliminamos algo, ya podemos añadir nuevo electrodoméstico, y comprobarlo en el listado:
ELECTRODOMESTICOS ELECTROHOGAR
MENU DE OPCIONES
1 = Listar Inventario
2 = Venta
3 = Facturacion
4 = Gestion Inventario
0 = Salir
Elija la opcion: 4
GESTION INVENTARIO
1 == Añadir Electrodomestico
2 == Eliminar Electrodomestico
0 == Regresar Menu Principal
Opcion: 1
Indique la CLASE de Electrodomestico para añadir
CLASE: Lavadora
No hay espacio para añadir un nuevo Electrodomestico
GESTION INVENTARIO
1 == Añadir Electrodomestico
2 == Eliminar Electrodomestico
0 == Regresar Menu Principal
Opcion: 2
Indique CODIGO del Electrodoméstico a eliminar.
CODIGO: LAV-0115
Electrodomestico eliminado.
GESTION INVENTARIO
1 == Añadir Electrodomestico
2 == Eliminar Electrodomestico
0 == Regresar Menu Principal
Opcion: 1
Indique la CLASE de Electrodomestico para añadir
CLASE: lavadora
Nombre: Lavatronic 2000
Codigo: LAV-1010
Marca: Zanussi
Cantidad: 4
Precio: 119.90
Velocidad: 950
Capacidad de Lavado: 12Kg
Ciclos: 3
Nuevo Electrodomestico registrado
GESTION INVENTARIO
1 == Añadir Electrodomestico
2 == Eliminar Electrodomestico
0 == Regresar Menu Principal
Opcion: 0
Regresando a menu principal...
ELECTRODOMESTICOS ELECTROHOGAR
MENU DE OPCIONES
1 = Listar Inventario
2 = Venta
3 = Facturacion
4 = Gestion Inventario
0 = Salir
Elija la opcion: 1
Indique la clase que quiere listar.
Pulse ENTER con el campo vacio para listar todas las clases.
Clase: Lavadora
LISTADO DE LAVADORA
***********************
Clase Lavadora
Marca: Whirlpool
Precio 109.9
Cantidad: 4
Capacidad de Lavado: 18Kg
Ciclos: 8
Velocidad: 1200
***********************
Clase Lavadora
Marca: Zanussi
Precio 119.9
Cantidad: 4
Capacidad de Lavado: 12Kg
Ciclos: 3
Velocidad: 950
***********************
ELECTRODOMESTICOS ELECTROHOGAR
MENU DE OPCIONES
1 = Listar Inventario
2 = Venta
3 = Facturacion
4 = Gestion Inventario
0 = Salir
Elija la opcion: 0
FIN DE PROGRAMA
Sobre lo de incluir una persona.
A ver, si quieres guardar un registro de "clientes", pues sí, necesitarás una clase
Persona y una clase similar a
Inventario que gestione un arreglo de tipo
Persona.
Pero si solo quieres reflejar su nombre y algún dato más en la facturación, pues bastaría con pedirlos en el momento de la venta e incluirlos en la línea que se añade al StringBuilder en cada venta.
Hombre, la primera opción es más interesante.
Una clase que podría llamarse
Agenda y gestione un arreglo de clase
Persona.
Que haga lo mismo que
Inventario: añadir personas, eliminar, listar todas las personas, listar por DNI/cédula, .....
Incluso, la clase
Persona que escribas, podría incluir como atributo otro StringBuilder como el que usamos en la clase
Main.
Así cada
Persona tendría su propio registro de lo que se le factura y por tanto tendrías la posibilidad de mostrar TODA la facturación (la registrada en el
Main) o solo la facturación de un determinado cliente(la registrada en clase
Persona)
Todo esto supone hacer crecer más el código con más menús, más clases, más líneas en el proceso de venta (pedir un cliente, comprobar que existe, registrarle lo que se le factura...)
Si tienes tiempo y ganas, adelante...
