000001 *------------------------
000002 IDENTIFICATION DIVISION.
000003 *------------------------
000004 PROGRAM-ID. ANNUITY.
000005 *------------------------
000006 DATA DIVISION.
000007 *------------------------
// Here we define all the variables necessary for the project, We need to know the total loan amount the interest rate and all the variables needed for the annuity.
000008 WORKING-STORAGE SECTION.
000009 01 TOTAL-LOAN PIC 9(9).
000010 01 INTEREST-RATE PIC 999V99.
000011 01 INTEREST-RATEP PIC 999V99 VALUE ZERO.
000012 01 MONTHS PIC 999 VALUE ZERO.
000013 01 YEARS PIC 999 VALUE ZERO.
000014 01 MONTHLY-PAYMENT PIC 9(9)V9999.
000015
000016 01 TOTAL-LOAN-SHOW PIC Z(9).99.
000017 01 INTSHOW PIC Z(2).999.
000018 01 TOTAL-INTEREST-RATEP-SHOW PIC Z(9).99.
000019 01 MONTHLYSHOW PIC Z(9).999.
000020 01 YEARS-SHOW PIC Z(3).
000021 *------------------------
000022 PROCEDURE DIVISION.
000023 *------------------------
000024 // I use a display version to make sure each of my JCL submission ran successfully
000025 DISPLAY 'VERSION 4.1'
000026
000027 PERFORM OBTAIN-LOAN
000028 PERFORM OBTAIN-INTEREST-RATE
000029 PERFORM OBTAIN-YEARS
000030 PERFORM MAIN-PROCESS
000031 GOBACK.
000032
000033 // This gathers a positive and non zero loan
000034 OBTAIN-LOAN.
000035 PERFORM UNTIL TOTAL-LOAN IS NUMERIC AND TOTAL-LOAN-SHOW > 0
000036 DISPLAY 'ENTER A VALID TOTAL LOAN IN THE FORMAT:XXXXXXXXX
000037 - , (INCLUDE LEADING ZEROS)'
000038 ACCEPT TOTAL-LOAN-SHOW
000039 IF TOTAL-LOAN-SHOW IS ALPHABETIC
000040 DISPLAY 'INPUT IS NON-NUMERIC AND INVALID'
000041 ELSE
000042 COMPUTE TOTAL-LOAN = FUNCTION NUMVAL(TOTAL-LOAN-SHOW)
000043
000044 IF TOTAL-LOAN-SHOW > 0
000045 MOVE TOTAL-LOAN-SHOW TO TOTAL-LOAN
000046
000047 ELSE
000048 DISPLAY 'INPUT IS NOT A POSITIVE NUMBER'
000049 END-IF
000050 END-PERFORM.
// This gathers a positive non zero interest rate
000051 OBTAIN-INTEREST-RATE.
000052 PERFORM UNTIL INTEREST-RATE IS NUMERIC AND INTSHOW > 0
000053 DISPLAY 'ENTER A VALID INTEREST IN THE FORMAT:XXXXX ,
000054 - (INCLUDE LEADING ZEROS)'
000055 ACCEPT INTSHOW
000056 IF INTSHOW IS ALPHABETIC
000057 DISPLAY 'INPUT IS NON-NUMERIC AND INVALID'
000058 ELSE
000059 COMPUTE INTEREST-RATE = FUNCTION NUMVAL(INTSHOW)
000060 IF INTSHOW > 0
000061 MOVE INTSHOW TO INTEREST-RATE
000062 ELSE
000063 DISPLAY 'INPUT IS NOT A POSITIVE NUMBER'
000064 END-IF
000065 END-PERFORM.
000066 OBTAIN-YEARS.
000067 PERFORM UNTIL YEARS IS NUMERIC AND YEARS-SHOW > 0
000068 DISPLAY 'ENTER A VALID NUMBER OF YEARS IN THE FORMAT: XXX
000069 - , (INCLUDE LEADING ZEROS)
000070 ACCEPT YEARS-SHOW
000071 IF YEARS-SHOW IS ALPHABETIC
000072 DISPLAY 'INPUT IS NON-NUMERIC AND INVALID' 000073 ELSE
000074 COMPUTE YEARS = FUNCTION NUMVAL(YEARS-SHOW)
000075 IF YEARS-SHOW > 0
000076 MOVE YEARS-SHOW TO YEARS
000077 ELSE
000078 DISPLAY 'INPUT IS NOT A POSITIVE NUMBER'
000079 END-IF
000080 END-PERFORM
// Here we print the format in which the years and months of the annuity will be displayed. The interest rate and years/months are gathered and plugged into the formula to get the accurate results.
000081 MAIN-PROCESS.
000082 COMPUTE INTEREST-RATEP =
000083 - INTEREST-RATE * 100.
000084 MOVE INTEREST-RATEP TO INTSHOW.
000085 DISPLAY 'TOTAL-LOAN: ' TOTAL-LOAN-SHOW
000086 - ' USD - INTEREST-RATE: ' INTSHOW '%'
000087 DISPLAY ' Y M AMOUNT '
000088 DISPLAY '--- --- -------------'
000089 PERFORM YEARS TIMES
000090 ADD 12 TO MONTHS
000091 COMPUTE MONTHLY-PAYMENT = TOTAL-LOAN
000092 - * FUNCTION ANNUITY( INTEREST-RATE / MONTHS , MONTHS)
000093 COMPUTE YEARS = MONTHS / 12
000094 MOVE MONTHLY-PAYMENT TO MONTHLYSHOW
000095 DISPLAY YEARS ' ' MONTHS ' ' MONTHLYSHOW ' USD'
000096 END-PERFORM.
000097
000098
Reflection: This project was a lot tougher than the last one. Even though the initial code was provided, there were many things that needed to be changed/fixed. The first thing I had trouble with was getting the code to compile. For this I had to reference the spacing guide in the COBOL textbook. I learned that the Data division and procedure division need to follow a specific guideline (for example: no sentence can pass column 72 and must use a continuation line on the next line). I then needed to fix an issue with my annuity function looping infinitely. This was because I was using the wrong input format when accepting input and would print 500 years instead of 5 years causing an infinite loop. I also learned about paragraphs which allowed me to divide the processes taking place into manageable chunks (like methods in java). This included learning to use IF, ELSE and IS statements. Overall I needed help from multiple people and the IBM documentation.