$29
In this assignment, we have data about clients and their accounts,
followed by data about transactions. The client data will be put into a
table and then we will use the records of payments and withdrawals to
update the table. The table will be printed and some statistics will be
computed.
In particular, this program will make use of external subroutines,
character data and packed decimal numbers.
*Input*
The input to the program will be a file with an unknown number of
records. The records are in two groups.
In the first group of records, each record represents a single client of
the Odds and Ends Fund and has the following format:
Columns Description
------- -----------
1 - 10 First Name (characters)
11 - 12 blanks
13 - 22 Last Name (characters)
23 - 24 blanks
25 - 32 Client ID Number (characters)
33 - 34 blanks
35 - 41 Account Balance (zoned decimal, dollars and cents)
42 Sign of the Account Balance (C'+' or C'-')
43 - 80 not used (blanks)
A positive balance (C'+') indicates that the client owes us money, and a
negative balance (C'-') indicates that we owe the client money.
The first group of records ends with a delimiter record in the above
format which has ID Number = 'STOPHERE'.
In the second group of records, each record represents a single
transaction and has the following format:
Columns Description
------- -----------
1 - 8 Client ID (characters)
9 - 10 blanks
11 Type of Transaction (1 character: 'D' for deposit,
'W' for withdrawal, or 'B' for balance)
12 - 13 blanks
14 - 20 Payment Amount (zoned decimal, dollars and cents)
or 0 for a Balance query
21 - 22 blanks
23 - 30 Date (zoned decimal, DDMMYYYY)
31 - 80 blanks
Use the following JCL statement to specify the input file:
//FT05F001 DD DSN=KC02314.SPRING18.CSCI360.HW6DATA,DISP=SHR
-----------------------------------------------------------------------
*Processing Requirements*
The main program involves three external subroutines and will carry out
the following steps:
* Call subroutine BUILD to read the first group of records and store
the data in a table.
BUILD needs three parameters:
o the address of the table
o the address of a fullword containing the address of the first
unused entry
o the address of the input buffer
* Call subroutine PRINT to print the contents of the table, using
appropriate page and column headings. The caption in the page
heading should say something like "Odds and Ends Customer Data".
PRINT needs four parameters:
o the address of the table
o the address of a fullword containing the address of the first
unused entry
o the address of a caption to use in the page heading
o the address of the page counter
PRINT also counts the clients and prints:
o the number of clients
o the sum of all balances
o the average balance per client
* Call subroutine TRANS to read the second group of records and carry
out the transactions, updating the table.
TRANS needs four parameters:
o the address of the table
o the address of a fullword containing the address of the first
unused entry
o the address of the input buffer
o the address of the page counter
TRANS should search for the client ID in the table and then carry
out the transaction.
If the transaction is a deposit, subtract the amount from the
client's balance. If the transaction is a withdrawal, add the amount
to the client's balance. If the transaction is a balance query,
there is nothing to do except print the value.
TRANS should print a line about each transaction containing the data
from the record along with whether this was a deposit, withdrawal or
balance query and the new client Balance.
TRANS should count and print the number of successful transactions
and the number of errors.
If the client ID number is not found in the table, TRANS should
print a line with an error message.
* Call subroutine PRINT to print the contents of the table again. The
caption in the page heading should say something like "Odds and Ends
Updated Customer Data".
------------------------------------------------------------------------
*Output*
Each page should have a page heading, centered. The pages should be
numbered.
Column headings should be double-spaced from the page header.
In the output from PRINT, the lines of client information should be
double spaced. Print no more than 15 lines of client information per page.
In the output from PRINT, the summary lines should be triple-spaced
after the last client record. Double-space between summary lines.
In the output from TRANS, the lines of transaction information should be
double spaced.
In the output from TRANS, the summary lines should be triple-spaced
after the last transaction record. Double-space between summary lines.
The output from TRANS should all fit on one page.
------------------------------------------------------------------------
*Other Notes*
1. You may assume that the table needs to hold no more than 40 values.
Each entry should have the following format:
* First Name (10 characters)
* Last Name (10 characters)
* ID Number (8 characters)
* Account Balance (4 packed decimal bytes)
When you read in the sign of the balance, you will need to test
whether it is '-' and adjust the sign of the Balance value
accordingly. (I.e., multiply by =P'-1'.)
2. As in Assignment 5, we are using external subroutines. Each
subroutine and the main routine needs proper entry and exit linkage.
3. As you work on this, you may need to XDUMP all or part of the table
to check your work. Each line of XDUMP prints 32 bytes of data,
starting on a 16-byte boundary, and each table entry is 32 bytes
long. It will be easier to look at a single table entry if it begins
on a 32-byte boundary. Use the following ORG trick to line up your
table on a 32-byte boundary:
ORG MAIN+((*-MAIN+31)/32)*32
TABLE DS 40CL32
(This assumes MAIN is the CSECT name.)
4. Use a DSECT to describe the table entries. It may also be useful to
use DSECTs for the two input record formats.
5. Write this program incrementally, one subroutine at a time. Start
with BUILD and XDUMP the table to see whether BUILD is correct.
After that, write and test PRINT. Once you have PRINT working, you
can go on to TRANS.
6. The JCL for this assignment is the same as the JCL used in
Assignments 4 and 5 except for the line given above to provide the
data.
7. You may not use XDECI or XDECO anywhere in this assignment. The
numbers should all be stored in packed decimal format.
8. When you print amounts of money, print a leading dollar sign, a
decimal point and two digits to the right of the decimal point. If
an amount of money is negative, print _CR_ to the right of the value.
9. When you print a date, print it in the format DD/MM/YYYY.
10. We are making a few simplifying assumptions here. Client balances
may be positive, zero or negative.
11. A good way to approach this is to work from the top down:
1. start with the skeletons of the four CSECTs
2. put in the linkage code for each CSECT
3. write the documentation for each CSECT
4. in the main routine, define your variables and and write the
code to call each subroutine
5. invent the DSECT(s)
Actually making each subroutine do its job will not be hard after
all this.
12. Turn in your work on Blackboard as usual.