Java - Desarrollar un programa por consola Java que permita la gestión de productos tipo bebidas a una tien

 
Vista:
sin imagen de perfil
Val: 21
Ha aumentado su posición en 22 puestos en Java (en relación al último mes)
Gráfica de Java

Desarrollar un programa por consola Java que permita la gestión de productos tipo bebidas a una tien

Publicado por Ann (12 intervenciones) el 04/03/2021 22:45:57
Desarrollar un programa por consola Java que permita la gestión de productos tipo bebidas a una tienda.

La tienda permite gestionar lo siguiente:

Para la bebida se desea conocer su código, tipo (gaseosa, agua, gas leche), cantidad en bodega, precio y marca.

Se desea tener varios constructores (vacío, con todos los parámetros, con tipo y cantidad, precio y marca).

Los métodos getter y setter.

Las operaciones del almacén son las siguientes:

PrecioTotal(): Permitirá calcular el precio total de todos los productos de la tienda.

rmitir RealizarVenta(): Pe á realizar la venta de una bebida que ofrezca la tienda. Tenga en cuenta que debe existir dos métodos para realizar la venta, uno donde el usuario pueda indicar el código del artículo y la cantidad a vender. El otro que el usuario pueda indicar la marca y la cantidad a vender del artículo.

RealizarDevolucion(): Permitirá realizar la devolución de un artículo. Tenga en cuenta que debe existir dos métodos para devolver, uno donde el usuario pueda indicar el código del artículo y la cantidad a devolver. El otro que el usuario pueda indicar la marca y la cantidad a devolver del artículo.

MostrarInformación: mostramos para cada bebida toda su información.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package bebidastienda;
 
 
    public class Bebida {
 
    private static int idActual = 1;
 
    private int id;
    private double cantidad;
    private double precio;
    private String marca;
 
    public Bebida(double cantidad, double precio, String marca){
 
        this.id=idActual++;
 
        this.cantidad=cantidad;
        this.precio=precio;
        this.marca=marca;
 
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public double getCantidad() {
        return cantidad;
    }
 
    public void setCantidad(double cantidad) {
        this.cantidad = cantidad;
    }
 
    public double getPrecio() {
        return precio;
    }
 
    public void setPrecio(double precio) {
        this.precio = precio;
    }
 
    public String getMarca() {
        return marca;
    }
 
    public void setMarca(String marca) {
        this.marca = marca;
    }
 
    public String Bebida() {
        return  "id=" + id + ", cantidad=" + cantidad + ", precio=" + precio + ", marca=" + marca + " ";
    }
 
}
 
 
public class BebidaGaseosa extends Bebida {
 
 
    public BebidaGaseosa( double id, double cantidad, double precio, String marca) {
        super(cantidad, precio, marca);
 
    }
     public String toString(String BebidaGaseosa) {
        return super.toString() + "Bebida Gaseosa =" + BebidaGaseosa;
 
        }
    }
 
 
 
 
public class AguaGas extends Bebida {
 
     public AguaGas( double id, double cantidad, double precio, String marca) {
        super(cantidad, precio, marca);
 
    }
 
    public String toString(String AguaGas) {
        return super.toString() + "Agua Gas =" + AguaGas;
    }
 
}
 
 
public class Leche extends Bebida {
 
     public Leche( double id, double cantidad, double precio, String marca) {
        super(cantidad, precio, marca);
 
    }
 
    public String toString(String Leche) {
        return super.toString() + "Leche =" + Leche;
    }
 
}



Realmente no se si voy bien, y ya no se como seguir. Agradecería mucho de su ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Desarrollar un programa por consola Java que permita la gestión de productos tipo bebidas a una tien

Publicado por Kabuto (1385 intervenciones) el 05/03/2021 02:01:12
Hola.

Podría solucionarse usando herencia de clases tal y como estás haciendo.
Sin embargo, puesto que las cuatro bebidas son EXACTAMENTE iguales (no tienen distintos métodos o atributos entre ellas) y tan solo cambia el nombre del tipo de bebida, podría ser más eficiente usar una sola clase Bebida y que "tipo de bebida" sea simplemente un atributo.

Dicho atributo puede ser un simple String, pero ya que nos dicen que solo va a tener 4 posibles valores: gaseosa, agua, gas leche se puede usar un enum para predefinir esos 4 valores y así asegurarnos que ese atributo solo podrá tener uno de esos 4 valores.
No es obligatorio hacerlo así, pero puede ser lo ideal en casos como este.

Otra cosa, el atributo cantidad lo has puesto de tipo double, pero lo más lógico sería usar el tipo int.
Las existencias de un almacén siempre van a ser valores enteros. Tendremos 10 botellas de CocaCola, ó 15, ó 100, ó 0... Pero nunca tendremos 1.2 botellas, es decir, no son fraccionarios. O tienes una botella entera, o no la tienes....
Por eso tiene más sentido usar el tipo int.

Esta podría ser la clase Bebida, con todos los distintos constructores que pide el enunciado y usando un enum para el atributo "tipo de bebida".
Si no conoces los enum (es algo que cada vez se enseña menos, a pesar de que apenas se necesita 10 minutos para explicarlo) y te resulta confuso, repito que puedes usar la clase String para ese atributo y listo, no hace falta "complicarlo" más.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
public final class Bebida {
 
	public enum TipoBebida {
		GASEOSA, AGUA, GAS, LECHE
	}
 
	private static int codigoActual = 1;
 
	private int codigo;
	private TipoBebida tipo;
	private int cantidad;
	private double precio;
	private String marca;
 
	//Constructor vacío
	public Bebida() {
		codigo = codigoActual++;
		tipo = null;
		cantidad = 0;
		precio = 0d;
		marca = "";
	}
	//Todos los parámetros(excepto código)
	public Bebida(TipoBebida tipo, int cantidad, double precio, String marca) {
		codigo = codigoActual++;
		this.tipo = tipo;
		this.cantidad = cantidad;
		this.precio = precio;
		this.marca = marca;
	}
	//Tipo y cantidad
	public Bebida(TipoBebida tipo, int cantidad) {
		codigo = codigoActual++;
		this.tipo = tipo;
		this.cantidad = cantidad;
		precio = 0d;
		marca = "";
	}
	//Precio y marca
	public Bebida(double precio, String marca) {
		codigo = codigoActual++;
		tipo = null;
		cantidad = 0;
		this.precio = precio;
		this.marca = marca;
	}
 
	public int getCodigo() {
		return codigo;
	}
	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}
	public TipoBebida getTipo() {
		return tipo;
	}
	public void setTipo(TipoBebida tipo) {
		this.tipo = tipo;
	}
	public int getCantidad() {
		return cantidad;
	}
	public void setCantidad(int cantidad) {
		this.cantidad = cantidad;
	}
	public double getPrecio() {
		return precio;
	}
	public void setPrecio(double precio) {
		this.precio = precio;
	}
	public String getMarca() {
		return marca;
	}
	public void setMarca(String marca) {
		this.marca = marca;
	}
 
	@Override
	public String toString() {
		return "Código: " + codigo + "\nTipo: " + tipo + "\tMarca: " + marca
				+ "\nCantidad: " + cantidad + "\tPrecio: " + precio;
	}
 
}

Bien, ya tendríamos la clase Bebida y se contemplan los 4 tipos de bebidas existentes sin tener que crear varias clases con herencia.

Ahora se podría crear el programa principal, con un ArrayList de bebidas, un menú de opciones y todos los métodos necesarios para cumplir lo que se pide.
Sin embargo, opcionalmente, podemos crear una clase intermedia que se ocupe de la gestión de las bebidas y así la clase principal estaría menos sobrecargada de código.

Esta clase (insisto, es opcional) es la que tendría el ArrayList de bebidas (con algunas bebidas ya predefinidas en el código) y tendría los métodos para vender, devolver, calcular el precio total de todas las bebidas y mostrar un listado de las bebidas existentes.
Es decir, será quien haga el "trabajo duro".
Tanto vender, como devolver, tienen dos variantes. En una reciben como parámetros código y cantidad, y en la otra reciben nombre de la marca y cantidad.

Así que se necesitarán dos métodos para cada una de estas acciones. Se les puede dar nombres distintos a cada método, o bien se puede "sobrecargar" los métodos y usar el mismo nombre, cambiando únicamente los parámetros que reciben.
Así tendríamos dos métodos vender() y dos métodos devolver().
Todas tendrán un código muy parecido: buscar en el ArrayList la bebida que tenga el código o marca indicados y cambiar el valor de la cantidad, según si estamos vendiendo o devolviendo.
Sería interesante calcular el importe de venta o abono y mostrarlo en pantalla.

En el caso de las ventas, hay que contemplar la posibilidad de que la cantidad existente sea inferior a la que nos han pedido, o incluso que no quede nada (cantidad == 0)

Te dejo un ejemplo de como podría ser esta clase, que he llamado Almacen.
Estaría bien que intentases escribir tu propia clase, aunque no funcione o te atasques sin poder completarla, pero al menos intentarlo.
En cualquier caso, este ejemplo puede servirte de inspiración. Pregunta lo que no entiendas.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import java.util.ArrayList;
 
import bebidas.Bebida.TipoBebida;
 
public final class Almacen {
 
	private ArrayList<Bebida> bebidas;
 
	public Almacen() {
		bebidas = new ArrayList<Bebida>();
		crearBebidas();
	}
 
	private void crearBebidas() {
		bebidas.add(new Bebida(TipoBebida.AGUA, 34, 0.8, "Aguas Puras"));
		bebidas.add(new Bebida(TipoBebida.GAS, 27, 1.1, "Fuente Magma"));
		bebidas.add(new Bebida(TipoBebida.GASEOSA, 51, 1.25, "CocaCola"));
		bebidas.add(new Bebida(TipoBebida.LECHE, 12, 0.75, "Puleva Entera"));
		bebidas.add(new Bebida(TipoBebida.LECHE, 23, 0.75, "Puleva Desnatada"));
		bebidas.add(new Bebida(TipoBebida.AGUA, 22, 0.55, "Monte Pinos"));
		bebidas.add(new Bebida(TipoBebida.GASEOSA, 4, 1.45, "Sprite"));
		bebidas.add(new Bebida(TipoBebida.AGUA, 23, 0.65, "Bezoya"));
		bebidas.add(new Bebida(TipoBebida.GAS, 30, 1.45, "Pellegrino"));
		bebidas.add(new Bebida(TipoBebida.GASEOSA, 26, 1.30, "CocaCola Zero"));
		bebidas.add(new Bebida(TipoBebida.LECHE, 31, 1.1, "ATO entera con Calcio"));
	}
 
	public double calcularPrecioTotal() {
		double total = 0d;
		//sumamos precios x cantidad de todas las bebidas
		for (Bebida beb: bebidas)
			total += beb.getPrecio() * beb.getCantidad();
 
		return total;
	}
 
	public void vender(int codigo, int cantidad) {
		Bebida solicitada = null;
		//Buscamos la bebida solicitada
		for (Bebida beb: bebidas)
			if (beb.getCodigo() == codigo)
				solicitada = beb;
		//Comprobamos si la hemos encontrado
		if (solicitada == null) //No se ha encontrado
			System.out.println("No existe bebida con código: " + codigo);
		else {//Bebida encontrada
			//Comprobamos si hay existencias suficientes
			if (solicitada.getCantidad() >= cantidad) { //Suficiente, vendemos la cantidad pedida
				//Calculamos precio venta
				double importeVenta = solicitada.getPrecio() * cantidad;
				//Restamos cantidades vendidas
				solicitada.setCantidad(solicitada.getCantidad() - cantidad);
				//Informamos
				System.out.printf("%s X %d = %.2f\n", solicitada.getMarca(), cantidad, importeVenta);
			}
			else if (solicitada.getCantidad() == 0) { //Bebida agotada
				System.out.println("No hay disponibilidad para la bebida seleccionada");
			}
			else { //Cantidad insuficiente, vendemos la cantidad que haya disponible
				double importeVenta = solicitada.getPrecio() * solicitada.getCantidad();
				System.out.println("No hay existencias suficientes para la cantidad solicitada.");
				System.out.printf("%s X %d = %.2f\n", solicitada.getMarca(),
						solicitada.getCantidad(), importeVenta);
				solicitada.setCantidad(0); //Bebida queda agotada
			}
		}
	}
 
	public void vender(String marca, int cantidad) {
		Bebida solicitada = null;
		for (Bebida beb: bebidas)
			if (beb.getMarca().equals(marca))
				solicitada = beb;
 
		if (solicitada == null)
			System.out.println("No existe bebida de la marca: " + marca);
		else {
			if (solicitada.getCantidad() >= cantidad) { //Suficiente, vendemos la cantidad pedida
				double importeVenta = solicitada.getPrecio() * cantidad;
				solicitada.setCantidad(solicitada.getCantidad() - cantidad);
				System.out.println("Importe a pagar:");
				System.out.printf("%s X %d = %.2f\n", solicitada.getMarca(), cantidad, importeVenta);
			}
			else if (solicitada.getCantidad() == 0) {
				System.out.println("No hay disponibilidad para la bebida seleccionada");
			}
			else {
				double importeVenta = solicitada.getPrecio() * solicitada.getCantidad();
				System.out.println("No hay existencias suficientes para la cantidad solicitada.");
				System.out.println("Importe a pagar:");
				System.out.printf("%s X %d = %.2f\n", solicitada.getMarca(),
						solicitada.getCantidad(), importeVenta);
 
				solicitada.setCantidad(0);
			}
		}
	}
 
	public void devolver(int codigo, int cantidad) {
		Bebida solicitada = null;
		for (Bebida beb: bebidas)
			if (beb.getCodigo() == codigo)
				solicitada = beb;
 
		if (solicitada == null)
			System.out.println("No existe bebida con código: " + codigo);
		else {
			double importeAbono = solicitada.getPrecio() * cantidad;
			System.out.println("Importe a abonar:");
			System.out.printf("%s X %d = %.2f\n", solicitada.getMarca(), cantidad, importeAbono);
			solicitada.setCantidad(solicitada.getCantidad() + cantidad);
		}
	}
 
	public void devolver(String marca, int cantidad) {
		Bebida solicitada = null;
		for (Bebida beb: bebidas)
			if (beb.getMarca().equals(marca))
				solicitada = beb;
 
		if (solicitada == null)
			System.out.println("No existe bebida de la marca: " + marca);
		else {
			double importeAbono = solicitada.getPrecio() * cantidad;
			System.out.println("Importe a abonar:");
			System.out.printf("%s X %d = %.2f\n", solicitada.getMarca(), cantidad, importeAbono);
			solicitada.setCantidad(solicitada.getCantidad() + cantidad);
		}
	}
 
	public void mostrarInformacion() {
		System.out.println("\t\tLISTADO DE BEBIDAS");
		System.out.println("\t\t------- -- -------");
		for (Bebida beb: bebidas)
			System.out.println("\n-> " + beb);
	}
 
}

Y ahora que ya tenemos un Almacen de Bebidas, solo queda crear la clase principal para que el usuario pueda escoger acciones.

Para esto basta con mostrar un menú, dejar que el usuario elija, pedir los datos que se puedan necesitar para cumplir su elección y pedir al Almacen que actúe según cada caso.

Dejo aquí otro ejemplo. Fíjate que la clase principal tiene un código muy reducido. Esto es gracias a que el "trabajo duro" lo hace la clase Almacen y es quien tiene mayor carga de código.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import java.util.Scanner;
 
public class GestionBebidas {
 
	private static Almacen almacen = new Almacen();
	private static Scanner teclado = new Scanner(System.in);
 
	public static void main(String[] args) {
		int cantidad = 0, codigo = 0;
		String marca = "";
		int opcion = 0;
 
		do {
			System.out.println("\n\n\t\tGESTION DE BEBIDAS");
			System.out.println("\t\t------- -- -------");
			System.out.println("[1] -- Vender por CODIGO");
			System.out.println("[2] -- Vender por MARCA");
			System.out.println("[3] -- Abonar por CODIGO");
			System.out.println("[4] -- Abonar por MARCA");
			System.out.println("[5] -- Calcula PRECIO TOTAL de todas las bebidas");
			System.out.println("[6] -- LISTADO de todas las bebidas\n");
			System.out.println("[9] -- SALIR del programa");
			System.out.print("Opcion: ");
			opcion = Integer.parseInt(teclado.nextLine());
 
			switch (opcion) {
			case 1:
				System.out.print("\nIndique codigo: ");
				codigo = Integer.parseInt(teclado.nextLine());
				System.out.print("Indique cantidad: ");
				cantidad = Integer.parseInt(teclado.nextLine());
				almacen.vender(codigo, cantidad);
				break;
			case 2:
				System.out.print("\nIndique marca: ");
				marca = teclado.nextLine();
				System.out.print("Indique cantidad: ");
				cantidad = Integer.parseInt(teclado.nextLine());
				almacen.vender(marca, cantidad);
				break;
			case 3:
				System.out.print("\nIndique codigo: ");
				codigo = Integer.parseInt(teclado.nextLine());
				System.out.print("Indique cantidad: ");
				cantidad = Integer.parseInt(teclado.nextLine());
				almacen.devolver(codigo, cantidad);
				break;
			case 4:
				System.out.print("\nIndique marca: ");
				marca = teclado.nextLine();
				System.out.print("Indique cantidad: ");
				cantidad = Integer.parseInt(teclado.nextLine());
				almacen.devolver(marca, cantidad);
				break;
			case 5:
				System.out.printf("Precio total de bebidas: %.2f\n", almacen.calcularPrecioTotal());
				break;
			case 6:
				almacen.mostrarInformacion();
				break;
			case 9:
				System.out.println("\n\t\tFIN DE PROGRAMA");
				break;
			default:
				System.out.println("Opción no válida");
			}
 
		}while(opcion != 9);
 
	}
 
}


Espero haber aclarado tus dudas.
Insisto, mejor si intentas continuar por tu parte, lo logres o no.
Y cualquier cosa que no entiendas de lo que he publicado, solo tienes que preguntar.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 21
Ha aumentado su posición en 22 puestos en Java (en relación al último mes)
Gráfica de Java

Desarrollar un programa por consola Java que permita la gestión de productos tipo bebidas a una tien

Publicado por Ann (12 intervenciones) el 05/03/2021 02:51:47
Muchísimas gracias por explicarme, ahora entendí mucho mejor, pero no se si es mucha molestia de que me puedas explicar el Integer.parseInt(teclado.nextLine()) es que aún no lo he visto y me gustaría saber si función. ¡Millones de gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Desarrollar un programa por consola Java que permita la gestión de productos tipo bebidas a una tien

Publicado por Kabuto (1385 intervenciones) el 05/03/2021 11:58:05
Te explico lo de del : Integer.parseInt(teclado.nextLine())

Con la clase Scanner podemos leer cadenas de texto con el método nextLine() y podemos leer números enteros con nextInt()

Pero hay un problema, cuando en un mismo programa queremos hacer los dos tipos de lectura como ocurre en este caso, las lecturas con nextInt() pueden entorpecer las siguientes lecturas que hagamos con nextLine().
En este hilo lo expliqué hace unos días.

Entonces, para evitar este problema, una solución es leer SIEMPRE usando nextLine(). Esto nos va a devolver un String, ¿qué pasa si queremos un número entero y no una cadena de texto?
Pues le pasamos ese String a la clase Integer y le pedimos que la parsee (transforme) a un valor int.

Eso es lo que hace esta línea:
1
int numero = Integer.parseInt(teclado.nextLine())
Leemos por teclado con nextLine(), el String que obtenemos se lo damos a la clase Integer para que lo parsee y entonces ya sí puede ser asignado a una variable de tipo int.

Si en lugar de un int, quisiéramos un double:
1
double numero = Double.parseDouble(teclado.nextLine())


Esta forma de leer datos, aunque parezca "rara", evita problemas en programas donde se leen valores numéricos y cadenas de texto.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 21
Ha aumentado su posición en 22 puestos en Java (en relación al último mes)
Gráfica de Java

Desarrollar un programa por consola Java que permita la gestión de productos tipo bebidas a una tien

Publicado por Ann (12 intervenciones) el 05/03/2021 13:07:11
¡Muchas gracias! Ahora entiendo mucho mejor, me fue de gran ayuda su explicación. Feliz día.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar