En este post sobre Java vamos a resolver un ejercicio para simular una venta (en donde se registran productos) y al final mostrar el ticket de venta. Lo que haremos será dar al usuario la opción para agregar, quitar o aumentar la cantidad de productos.
Cuando el usuario lo requiera, se podrá imprimir el ticket por pantalla, imprimiendo además de la lista de productos, el total.
Clase producto
Para simplificar las cosas haremos una clase que represente al producto de la vida real. Más adelante vamos a crear una lista del mismo para realizar todas las operaciones.
class Producto {
private double precio, cantidad;
private String descripcion;
public Producto(double precio, String descripcion) {
this.cantidad = 1;
this.precio = precio;
this.descripcion = descripcion;
}
public double getSubtotal() {
return cantidad * precio;
}
public double getPrecio() {
return precio;
}
public double getCantidad() {
return cantidad;
}
public void setCantidad(double cantidad) {
this.cantidad = cantidad;
}
public String getDescripcion() {
return descripcion;
}
}
Como ves cada producto tiene precio, cantidad y descripción además de sus respectivos getters y setters. Una cosa importante que notar es el método getSubtotal
que devuelve el subtotal; esto es, multiplicar la cantidad por el precio.
Lista de productos
Ahora que ya tenemos la clase Producto
podemos crear un ArrayList de ese tipo para poder administrar la lista fácilmente.
ArrayList<Producto> productos = new ArrayList<Producto>();
No voy a detallar todas las operaciones de los productos, pues me parece que se explican por sí mismas:
public static void agregarProducto(ArrayList<Producto> productos) {
productos.add(solicitarProducto());
}
public static void cambiarCantidad(ArrayList<Producto> productos) {
int indice = solicitarIndice();
Producto p = productos.get(indice);
Scanner sc = new Scanner(System.in);
System.out.println("Nueva cantidad: ");
double nuevaCantidad = sc.nextDouble();
p.setCantidad(nuevaCantidad);
productos.set(indice, p);
}
public static void quitarProducto(ArrayList<Producto> productos) {
int indice = solicitarIndice();
if (indice < productos.size()) {
productos.remove(indice);
} else {
System.out.println("Número no válido");
}
}
Como puedes ver todos los métodos reciben el ArrayList de los productos; esto es para realizar operaciones sobre la lista de productos que el usuario tiene.
Funciones extras
En algunos puntos el usuario introduce ciertos valores que deben ser solicitados por consola. Para ello he creado algunas funciones que solicitan el valor:
public static int solicitarIndice() {
Scanner sc = new Scanner(System.in);
System.out.println("Ingresa el número de producto: ");
return sc.nextInt();
}
public static Producto solicitarProducto() {
Scanner sc = new Scanner(System.in);
System.out.println("Ingresa descripción");
String descripcion = sc.nextLine();
System.out.println("Ingresa precio:");
double precio = sc.nextDouble();
return new Producto(precio, descripcion);
}
Por ejemplo una de esas funciones se encarga de armar el producto solicitando los datos al usuario por consola.
Imprimir ticket en consola
El método que imprime el total y los productos comprados es el siguiente:
public static void mostrarTicket(ArrayList<Producto> productos) {
System.out.println("-".repeat(85));
System.out.printf("|%-20s|%-20s|%-20s|%-20s|\n", "Descripción", "Precio", "Cantidad", "Subtotal");
System.out.println("-".repeat(85));
double total = 0;
for (Producto p : productos) {
System.out.printf("|%-20s|%-20f|%-20f|%-20f|\n", p.getDescripcion(), p.getPrecio(), p.getCantidad(), p.getSubtotal());
total += p.getSubtotal();
}
System.out.println("-".repeat(85));
System.out.printf("|%83s|\n", "Total: " + String.valueOf(total));
System.out.println(" **Gracias por su compra**");
}
Simplemente hace un foreach y usa printf para alinear el texto. Aquí estamos usando el método getSubtotal
del producto para mostrarlo en la tabla y para así también calcular el total final.
Menú principal
Todas las operaciones de productos (aumentar cantidad, eliminar, agregar) se manejan a través de un simple menú que está dentro de un ciclo while.
Dentro del ciclo, además de solicitar al usuario lo que desea hacer, se imprimen los productos que el usuario ya tiene en su lista:
while (true) {
if (productos.size() > 0) {
System.out.println("-".repeat(106));
System.out.printf("|%-20s|%-20s|%-20s|%-20s|%-20s|\n", "Número", "Descripción", "Precio", "Cantidad", "Subtotal");
System.out.println("-".repeat(106));
}
int contador = 0;
for (Producto p : productos) {
System.out.printf("|%-20d|%-20s|%-20f|%-20f|%-20f|\n", contador, p.getDescripcion(), p.getPrecio(), p.getCantidad(), p.getSubtotal());
contador++;
}
if (productos.size() > 0) {
System.out.println("-".repeat(106));
}
System.out.println("1. Agregar producto\n" +
"2. Cambiar cantidad\n" +
"3. Quitar producto\n" +
"4. Mostrar ticket y terminar venta\n" +
"5. Salir\n" +
"Seleccione: ");
String eleccion = sc.nextLine();
if (eleccion.equals("1")) {
agregarProducto(productos);
} else if (eleccion.equals("2")) {
cambiarCantidad(productos);
} else if (eleccion.equals("3")) {
quitarProducto(productos);
} else if (eleccion.equals("4")) {
mostrarTicket(productos);
break;
} else if (eleccion.equals("5")) {
break;
} else {
System.out.println("Opción no válida");
}
}
Las opciones, como puedes ver, son:
- Agregar producto
- Cambiar cantidad
- Quitar producto
- Mostrar ticket y terminar venta
- Salir
Poniendo todo junto
El código completo para simular una compra agregando y modificando productos además de imprimir el ticket queda como se ve a continuación:
/*
____ _____ _ _ _
| _ \ | __ \ (_) | | |
| |_) |_ _ | |__) |_ _ _ __ _____| |__ _ _| |_ ___
| _ <| | | | | ___/ _` | '__|_ / | '_ \| | | | __/ _ \
| |_) | |_| | | | | (_| | | / /| | |_) | |_| | || __/
|____/ \__, | |_| \__,_|_| /___|_|_.__/ \__, |\__\___|
__/ | __/ |
|___/ |___/
Blog: https://parzibyte.me/blog
Ayuda: https://parzibyte.me/blog/contrataciones-ayuda/
Contacto: https://parzibyte.me/blog/contacto/
Copyright (c) 2020 Luis Cabrera Benito
Licenciado bajo la licencia MIT
El texto de arriba debe ser incluido en cualquier redistribución
*/
import java.util.ArrayList;
import java.util.Scanner;
class Producto {
private double precio, cantidad;
private String descripcion;
public Producto(double precio, String descripcion) {
this.cantidad = 1;
this.precio = precio;
this.descripcion = descripcion;
}
public double getSubtotal() {
return cantidad * precio;
}
public double getPrecio() {
return precio;
}
public double getCantidad() {
return cantidad;
}
public void setCantidad(double cantidad) {
this.cantidad = cantidad;
}
public String getDescripcion() {
return descripcion;
}
}
public class Main {
public static Producto solicitarProducto() {
Scanner sc = new Scanner(System.in);
System.out.println("Ingresa descripción");
String descripcion = sc.nextLine();
System.out.println("Ingresa precio:");
double precio = sc.nextDouble();
return new Producto(precio, descripcion);
}
public static void agregarProducto(ArrayList<Producto> productos) {
productos.add(solicitarProducto());
}
public static int solicitarIndice() {
Scanner sc = new Scanner(System.in);
System.out.println("Ingresa el número de producto: ");
return sc.nextInt();
}
public static void cambiarCantidad(ArrayList<Producto> productos) {
int indice = solicitarIndice();
Producto p = productos.get(indice);
Scanner sc = new Scanner(System.in);
System.out.println("Nueva cantidad: ");
double nuevaCantidad = sc.nextDouble();
p.setCantidad(nuevaCantidad);
productos.set(indice, p);
}
public static void quitarProducto(ArrayList<Producto> productos) {
int indice = solicitarIndice();
if (indice < productos.size()) {
productos.remove(indice);
} else {
System.out.println("Número no válido");
}
}
public static void mostrarTicket(ArrayList<Producto> productos) {
System.out.println("-".repeat(85));
System.out.printf("|%-20s|%-20s|%-20s|%-20s|\n", "Descripción", "Precio", "Cantidad", "Subtotal");
System.out.println("-".repeat(85));
double total = 0;
for (Producto p : productos) {
System.out.printf("|%-20s|%-20f|%-20f|%-20f|\n", p.getDescripcion(), p.getPrecio(), p.getCantidad(), p.getSubtotal());
total += p.getSubtotal();
}
System.out.println("-".repeat(85));
System.out.printf("|%83s|\n", "Total: " + String.valueOf(total));
System.out.println(" **Gracias por su compra**");
}
public static void main(String[] args) {
ArrayList<Producto> productos = new ArrayList<Producto>();
Scanner sc = new Scanner(System.in);
while (true) {
if (productos.size() > 0) {
System.out.println("-".repeat(106));
System.out.printf("|%-20s|%-20s|%-20s|%-20s|%-20s|\n", "Número", "Descripción", "Precio", "Cantidad", "Subtotal");
System.out.println("-".repeat(106));
}
int contador = 0;
for (Producto p : productos) {
System.out.printf("|%-20d|%-20s|%-20f|%-20f|%-20f|\n", contador, p.getDescripcion(), p.getPrecio(), p.getCantidad(), p.getSubtotal());
contador++;
}
if (productos.size() > 0) {
System.out.println("-".repeat(106));
}
System.out.println("1. Agregar producto\n" +
"2. Cambiar cantidad\n" +
"3. Quitar producto\n" +
"4. Mostrar ticket y terminar venta\n" +
"5. Salir\n" +
"Seleccione: ");
String eleccion = sc.nextLine();
if (eleccion.equals("1")) {
agregarProducto(productos);
} else if (eleccion.equals("2")) {
cambiarCantidad(productos);
} else if (eleccion.equals("3")) {
quitarProducto(productos);
} else if (eleccion.equals("4")) {
mostrarTicket(productos);
break;
} else if (eleccion.equals("5")) {
break;
} else {
System.out.println("Opción no válida");
}
}
}
}
Yo lo he ejecutado para probar y se ve así: