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 controlala compra del producto solo y en el registro de monedas un integer por real}