java

Java: productos con ticket de venta (ejercicio)

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í:

Ticket de venta con productos en Java – Ejercicio por consola

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.