Previous topic |
Ada Home Page |
Index
Direct files - Example
------------------------------------------------------------
-- Program to update a file of bank account balances
-- when a withdrawal is made.
--
-- Uses a direct file to contain the balance records.
--
-- Adapted from Skansholm pp 527-8.
--
------------------------------------------------------------
with TEXT_IO, DIRECT_IO; use TEXT_IO, DIRECT_IO;
procedure make_transaction is
type account_record is record
number : POSITIVE;
balance : FLOAT;
end record;
package account_io is new DIRECT_IO (account_record);
use account_io;
package int_io is new INTEGER_IO(INTEGER); use int_io;
accfile : account_io.FILE_TYPE; -- account records
acc : account_record; -- working storage
target : POSITIVE; -- account no sought
amount : FLOAT; -- withdrawal amount
found : BOOLEAN; -- right record found?
first : account_io.count; -- for binary chop
last : account_io.count; -- for binary chop
mid : account_io.count; -- for binary chop
begin
OPEN (accfile, INOUT_FILE, "accounts.dat");
PUT ("Enter account number : ");
GET (target); SKIP_LINE;
-- use binary chop to find the record in the file
found := false;
first := 1;
last := SIZE (accfile);
while (not found) and (first <= last) loop
mid := (first + last) / 2;
READ (accfile, acc, mid);
if target = acc.number then
found := true;
elsif target < acc.number then
last := mid - 1;
else
first := mid + 1;
end if;
end loop;
if found then
PUT ("Balance is ");
PUT (acc.balance, EXP=>0,FORE=>7,AFT=>2); NEW_LINE;
PUT ("Enter amount to withdraw: ");
GET (amount); SKIP_LINE;
if amount < balance then
acc.balance := acc.balance - amount;
WRITE (accfile, acc, mid);
PUT ("Resulting balance = ");
PUT (acc.balance, EXP=>0,FORE=>7,AFT=>2);
NEW_LINE;
else
PUT_LINE ("Not enough funds available");
end if;
else
PUT_LINE ("No such account found");
end if;
CLOSE (accfile);
end make_transaction;
Previous topic |
Ada Home Page |
Index
c-lokan@adfa.oz.au / 23 Feb 96