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.
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.
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.
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.
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.
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:
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í:
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…
Esta web usa cookies.