Lección 20 · 20 de 20
Proyecto: la factura de una tienda · Pascal
Un pequeño proyecto en Pascal que reúne records, arrays, bucles, procedimientos y Format para imprimir la factura de una tienda de informática.

Este programa junta lo visto en el curso. Cada línea de la factura es un record TLine con el producto, la cantidad y el precio, y la factura entera es un array constante de cuatro líneas, escritas con la forma (Product: 'Mouse'; Qty: 2; Price: 12.50).
VatRate es una constante con el 21 % de IVA: si cambia, se toca en un solo sitio. El procedimiento Row escribe cualquier fila de la factura, con un texto a la izquierda y un importe a la derecha, gracias a Format('%-26s%9.2f', ...); su parámetro caption es const.
El bucle `for line in Invoice` recorre las líneas una a una. Para cada una se prepara el texto con otro Format (producto, cantidad y precio) y se pasa a Row junto con el importe, line.Qty * line.Price, que también se va sumando en subtotal.
subtotal es una variable con valor inicial, Double = 0. Al terminar el bucle, tres llamadas a Row escriben el subtotal, el IVA y el total, todos alineados en la misma columna.
Es la misma lógica que hay detrás de una aplicación de escritorio con Lazarus, como la demo de Odoo sin conexión de DMarlon Studio: allí las líneas salen de una base de datos y se ven en una rejilla, pero las cuentas son las mismas. Para probar este programa, ábralo con el destino Consola y pulse F9.
Código · main.pas
program main;uses SysUtils;type TLine = record Product: String; Qty: Integer; Price: Double; end;const VatRate = 0.21; Invoice: array[1..4] of TLine = ( (Product: 'Keyboard'; Qty: 1; Price: 24.90), (Product: 'Mouse'; Qty: 2; Price: 12.50), (Product: 'USB cable'; Qty: 3; Price: 4.99), (Product: 'Monitor'; Qty: 1; Price: 139.00));procedure Row(const caption: String; amount: Double);begin WriteLn(Format('%-26s%9.2f', [caption, amount]));end;var line: TLine; subtotal: Double = 0;begin for line in Invoice do begin Row(Format('%-10s %2d x %6.2f', [line.Product, line.Qty, line.Price]), line.Qty * line.Price); subtotal := subtotal + line.Qty * line.Price; end; Row('Subtotal', subtotal); Row('VAT 21%', subtotal * VatRate); Row('TOTAL', subtotal * (1 + VatRate));end.Salida · fpc main.pas && ./main
Keyboard 1 x 24.90 24.90 Mouse 2 x 12.50 25.00 USB cable 3 x 4.99 14.97 Monitor 1 x 139.00 139.00 Subtotal 203.87 VAT 21% 42.81 TOTAL 246.68
Para recordar
- Un array de records guarda datos con forma de tabla.
- Las constantes evitan repetir números como el IVA.
- Un procedimiento con
Formatmantiene alineadas todas las filas. for ... inrecorre un array sin manejar índices.
Ejercicio
Aplique un 5 % de descuento si el subtotal pasa de 150 euros: calcúlelo con un if, escríbalo con Row en negativo y calcule el IVA y el total sobre el importe ya rebajado.