{ Assignment 8 }
{ Written by Bryan Bridges }

program assign08;
uses Crt;

{ Declare Constants }
const
   Title1 = '               Gheresus'' Gourmet Restaurant';
   Title2 = '               *****************************';
   Title3 = '                We Cook it and you Eat it';
   Title4 = '                -------------------------';
   Title5 = '                        HAPPY MEAL';
   Title6 = '                        $$$$$$$$$$';
   Title7 = 'Amount    Amount    Total       Change Type and Number';
   Title8 = ' Owed    Tendered   Change   1c 5c 10c 25c $1 $5 $10 $20';
   Divider = '------------------------------------------------------------';
   penny = 0.01;
   nickel = 0.05;
   dime = 0.10;
   quarter = 0.25;
   single = 1.00;
   five = 5.00;
   ten = 10.00;
   twenty = 20.00;

{ Declare Variables }
var
   owed, tendered, change : real;
   pennies, nickels, dimes, quarters, singles, fives, tens, twenties : integer;
   Output : text;

procedure coins_and_bills (w_change : real);
{ Change Format Calculations }
   begin
   while w_change >= twenty do
      begin
        w_change := w_change - twenty;
        twenties := 1 + twenties;
      end;
   while w_change >= ten do
      begin
        w_change := w_change - ten;
        tens := 1 + tens;
      end;
   while w_change >= five do
      begin
        w_change := w_change - five;
        fives := 1 + fives;
      end;
   while w_change >= single do
      begin
        w_change := w_change - single;
        singles := 1 + singles;
      end;
   while w_change >= quarter do
      begin
        w_change := w_change - quarter;
        quarters := 1 + quarters;
      end;
   while w_change >= dime do
      begin
        w_change := w_change - dime;
        dimes := 1 + dimes;
      end;
   while w_change >= nickel do
      begin
        w_change := w_change - nickel;
        nickels := 1 + nickels;
      end;
   while w_change >= penny do
      begin
        w_change := w_change - penny;
        pennies := 1 + pennies;
      end;
   end;

procedure reset;
{ Reset Number of Coins & Bills }
   begin
   twenties := 0;
   tens := 0;
   fives := 0;
   singles := 0;
   quarters := 0;
   dimes := 0;
   nickels := 0;
   pennies := 0;
   end;

{ Start Main Program }
begin

{ Assign Output Files }
  assign (Output, 'D:\FILES\BAB''S\PASCAL\ASSIGN08.OUT');
  rewrite (Output);

{ Write Output Header }
  writeln (Output, Title1);
  writeln (Output, Title2);
  writeln (Output);
  writeln (Output, Title3);
  writeln (Output, Title4);
  writeln (Output);
  writeln (Output, Title5);
  writeln (Output, Title6);
  writeln (Output);
  writeln (Output, Divider);
  writeln (Output, Title7);
  writeln (Output, Title8);
  writeln (Output, Divider);

{ 1st Transaction Input Via Keyboard }
   clrscr;
   writeln (Title1);
   writeln (Title2);
   writeln;
   write ('Enter amount owed: ');
   readln (owed);
   write ('Enter amount tendered: ');
   readln (tendered);

{ Transaction Calculations }
while owed <> 0.00 do
  begin
  { Change Decisions }
  change := tendered - owed;
  if change < 0 then
     begin
     write (Output, owed:5:2, tendered:10:2, change:10:2, '    Please pay ');
     change := change * (-1); { To Make Positive for Output Sentence }
     write (Output, change:4:2);
     change := change * (-1); { To Make Negative Again for Future Decisions }
     writeln (Output, ' or wash dishes.');
     end;
  if change = 0 then
     begin
     writeln (Output, owed:5:2, tendered:10:2, change:10:2, '    Thank you very much - Come again.');
     end;
  if change > 0 then
     begin
     coins_and_bills (change); { Change Format Calculations }
     write (Output, owed:5:2, tendered:10:2, change:10:2);
     writeln (Output, pennies:5, nickels:3, dimes:3, quarters:4, singles:4, fives:3, tens:3, twenties:4);
     reset; { Reset Number of Coins & Bills }
     end;

  { Subsequent Transaction Input Via Keyboard }
  writeln;
  write ('Enter amount owed: ');
  readln (owed);
  write ('Enter amount tendered: ');
  readln (tendered);
  end;

{  Output File Closing}
  writeln (Output, divider)

{ End Main Program }
end.
