program MaquinaExpendedora;
uses
Crt; {soporte para pascal crtdos en freepascal y crt32 en otros}
const
MaxTipos = 16; {define constantes una 16 y otra de 40}
MaxMonedas = 40;
TYPE
TProducto = record {definicion de tipos en este caso un record}
nombre : String[15];
precio : real;
cant : Integer ;
end;
TMaquina = Array[1..Maxtipos] of TProducto; {En este un array de
1 a 16 registros tproducto}
TMoneda = Record {definicion de tipos en este caso un record}
Nom : String[10];
Valor : real;
unidades : Integer;
End;
TCaixa = Array[1..8] of TMoneda; {En este un array de
1 a 8 registros tmoneda}
Var
Maquina : Tmaquina;
CajaCambio : TCaixa; {Estas son variables globales}
opcion : 0..1;
Procedure IniciaProductos(Var Maq: TMaquina); {procedimiento de inicio
del producto o asignacion de valores al mismo}
Var
i : 1..MaxTipos;
Begin
Maq[1].nombre := 'Lays Jamon';
Maq[2].nombre := 'Lays Queso';
Maq[3].nombre := 'Coca-Cola';
Maq[4].nombre := 'Coca-Cola Zero';
Maq[5].nombre := 'Trina Limon';
Maq[6].nombre := 'Trina Naranja';
Maq[7].nombre := 'Aquarius'; {rellena la variable del registro}
Maq[8].nombre := 'Agua Veri 50cl';
Maq[9].nombre := 'Agua Veri 25cl';
Maq[10].nombre := 'Red Bull';
Maq[11].nombre := 'Kit Kat';
Maq[12].nombre := 'Huevo Kinder';
Maq[13].nombre := 'Funda Movil';
Maq[14].nombre := 'Funda IPhone';
Maq[15].nombre := 'Auriculares';
Maq[16].nombre := 'Rep Mp3';
For i := 1 to 16 do
With Maq[i] do
Begin
precio := (Random(400)+100)/100; {asigna precios y cantidad
de objetos en las variables del registro
aleatoria mentre}
Cant := Random(10)+5;
End;
End;
Function Pmoneda(valor:integer):Integer; {esta vacio no hace nada}
Begin
End;
Procedure IniciaCajetines(Var Caja:TCaixa); {inicia la caja del dinero}
Var
multiplicador , moneda, i : integer;
Begin
multiplicador := 100; {asigna un valor de inicio a ambas variables}
moneda := 2;
for i := 1 to 8 do
Begin
caja[i].Valor := moneda * multiplicador;{asigna el valor}
caja[i].unidades := random(20) + 10; {asigna unidades
aleatoriamente}
Str(caja[i].Valor / 100:4:2,caja[i].Nom); {combierte a
string el valor}
caja[i].Nom := caja[i].Nom + ' Eur'; {le a¤ade Eur}
moneda := moneda div 2; {reduce el valor de moneda }
if moneda = 0 then {si la division causa 0 le asigna 5
y divide el multiplicador}
begin
moneda := 5;
multiplicador := multiplicador div 10;
end;
End;
End;
Procedure MostrarProductos(Var Maq:TMaquina); {muestra el producto
osea los datos tomados anterior mente
sin otra funcion solo presenta}
Var
i,j,k : Integer;
Begin
write('|');
for i := 1 to 4 do
begin
for j := 1 to 18 do
write('-');
write('|');
end;
writeln;
for i := 1 to 4 do
begin
write('|');
for j := 1 to 4 do
write((i - 1) * 4 + j : 2,'-',Maq[(i - 1) * 4 +j].nombre:15,'|');
writeln;
write('|');
for j := 1 to 4 do
write(Maq[(i - 1) * 4 + j].precio:5:2,' Eur - ',Maq[(i-1) * 4+j].cant:2,' un','|':2);
writeln;
write('|');
for k := 1 to 4 do
begin
for j := 1 to 18 do
write('-');
write('|');
end;
writeln;
end;
End;
Procedure MostrarCaja(Caja:TCaixa); {lo mismo de lo anterior
pero para la caja}
Var
i : Integer;
Begin
Writeln;
Writeln ('Monedas cambio');
Write('|');
for i:=1 to 72 do write('-'); writeln('|');
Write('|');
For i:= 1 to 8 do Write(Caja[i].nom:9);
Writeln('|');
Write('|');
For i:= 1 to 8 do Write(caja[i].unidades:4,' un. ');
Writeln('|');
Write('|');
for i:=1 to 72 do write('-'); writeln('|');
Writeln;
End;
procedure compramos; {compramos el producto que queremos}
var
nr, h, k, num : integer; {estas son variables locales}
entrada : real;
resto : real;
monedas : array[1..8] of real; {esta para los cambios}
begin
fillchar(monedas,sizeof(monedas),0); {limpiamos array a 0}
resto := 0.0;
writeln;
write(' Elija Producto : ');
readln(num); {elejimos el producto y presentamos producto y precio}
writeln;
writeln(' El Producto Elejodo Es ',Maquina[num].nombre);
writeln(' EL Precio Es : ',Maquina[num].precio:3:2);
writeln;
write(' Entre Moneda : ');
readln(entrada); {introducimos moneda}
if entrada - Maquina[num].precio >= 0 then {comprobamos la moneda
entrada cumple siendo mayor o igual al precio entonces}
begin
if entrada - Maquina[num].precio = 0 then {acemos esto y sino}
begin
writeln; {el importe es exacto}
writeln(' Importe introducido Exacto ');
writeln(' Pulse Enter');
readln;
end;
if entrada - Maquina[num].precio > 0 then {es mayor}
begin
resto := (entrada - Maquina[num].precio); {tomamos resto}
h := 1;
num := 0;
nr := 1;
writeln;
writeln(' Debolucion = ',resto:3:2); {presentamos resto
al realizar la resta de entrada y precio el resultado que
nos da es un decimal por lo tanto para comparar y dar las
bueltas tenemos que realizar la inversa en el valor puesto
que este es un entero al dividir obtenemos 20,10,0.50,0.20
0.10,0.05,0.02,0.01 si nuestro resto es 0.60 podemos operar}
repeat
num := num + 1;
if resto >= (CajaCambio[num].Valor / 100) then {si es menor o
igual damos buelta y descontamos de resto}
begin
monedas[nr] := CajaCambio[num].Valor / 100; {guardamos la buelta}
nr := nr + 1;
resto := resto - CajaCambio[num].Valor / 100; {descontamos de resto}
num := 0;
end;
h := h + 1;
until (resto <= 0.0) or (h > 20); {si resto menor o igual 0.0
salimos los cambios terminaron h es seguridad para
ebitar cuelges solo}
writeln;
write(' Monedas de : ');
for h := 1 to nr - 1 do {presentamos los cambios dados}
write(' ',monedas[h]:3:2);
write(' Eur');
readln;
end;
end
else
begin {realizamos esto otro si el importe fue menor que el
precio}
writeln;
writeln(' Cantidad Es Incorrecta Pulse Enter :');
readln;
end;
end;
Procedure Pausa; {esto es una pausa solo}
Begin
Write('Pulsa una tecla para continuar ...');
Repeat until keypressed; {espera a que se pulse una tecla}
End;
Begin {inicio}
randomize; {creamos la semilla para el random o numeros aleatorios}
IniciaProductos(Maquina); {ejecutamos los procedimientos}
IniciaCajetines (CajaCambio);
Repeat
clrscr; {limpiamos pantalla}
MostrarProductos(Maquina); {mostramos productos y caja}
MostrarCaja(CajaCambio);
Write('1.Compra':20);
Write('0.salir':20);
Write('Entra opcion ':20);
repeat
opcion := ord(readkey) - 48; {esperamos pulsen una tecla 1 o 0 y}
until opcion in[0,1]; {convertimos el caracter a numero
en este caso si no pulsa 1 o 0 no ace nada}
Case Opcion of {si es 1 as esto y sino lo otro}
1 : Begin
{Pausa;}
compramos; {compramos}
End;
End;
Until opcion = 0; {o salimos segun tecla pulsada}
End.
{A qui tienes todo lo que pides no quite nada solo inserte un procedimiento que controla
la compra del producto solo y en el registro de monedas un integer por real}