149 lines
5.4 KiB
COBOL
149 lines
5.4 KiB
COBOL
******************************************************************
|
|
* COBOL solution to Angle difference challange
|
|
* The program was run on OpenCobolIDE
|
|
* I chose to read the input data from a .txt file that I
|
|
* created on my PC rather than to hard code it into the
|
|
* program or enter it as the program was executing.
|
|
******************************************************************
|
|
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. ANGLE-DIFFERENCE.
|
|
|
|
ENVIRONMENT DIVISION.
|
|
INPUT-OUTPUT SECTION.
|
|
FILE-CONTROL.
|
|
|
|
SELECT IN-FILE ASSIGN TO 'C:\Both\Rosetta\Angle_diff.txt'
|
|
ORGANIZATION IS LINE SEQUENTIAL.
|
|
|
|
DATA DIVISION.
|
|
|
|
FILE SECTION.
|
|
FD IN-FILE.
|
|
01 IN-RECORD.
|
|
05 ALPHA-BEARING-1 PIC X(20).
|
|
05 FILLER PIC X.
|
|
05 ALPHA-BEARING-2 PIC X(20).
|
|
|
|
WORKING-STORAGE SECTION.
|
|
01 SWITCHES.
|
|
05 EOF-SWITCH PIC X VALUE 'N'.
|
|
|
|
01 COUNTERS.
|
|
05 REC-CTR PIC 9(3) VALUE 0.
|
|
|
|
01 WS-ALPHA-BEARING.
|
|
05 WS-AB-SIGN PIC X.
|
|
88 WS-AB-NEGATIVE VALUE "-".
|
|
05 WS-AB-INTEGER-PART PIC X(6).
|
|
05 WS-AB-DEC-POINT PIC X.
|
|
05 WS-AB-DECIMAL-PART PIC X(12).
|
|
|
|
01 WS-BEARING-1 PIC S9(6)V9(12).
|
|
01 WS-BEARING-2 PIC S9(6)V9(12).
|
|
|
|
01 WS-BEARING PIC S9(6)V9(12).
|
|
01 FILLER REDEFINES WS-BEARING.
|
|
05 WSB-INTEGER-PART PIC X(6).
|
|
05 WSB-DECIMAL-PART PIC X9(12).
|
|
|
|
77 WS-RESULT PIC S9(6)V9(12).
|
|
77 WS-RESULT-POS PIC 9(6)V9(12).
|
|
77 WS-INTEGER-PART PIC 9(6).
|
|
77 WS-DECIMAL-PART PIC V9(12).
|
|
77 WS-RESULT-OUT PIC ------9.9999.
|
|
|
|
PROCEDURE DIVISION.
|
|
000-MAIN.
|
|
PERFORM 100-INITIALIZE.
|
|
PERFORM 200-PROCESS-RECORD
|
|
UNTIL EOF-SWITCH = 'Y'.
|
|
PERFORM 300-TERMINATE.
|
|
STOP RUN.
|
|
|
|
100-INITIALIZE.
|
|
OPEN INPUT IN-FILE.
|
|
PERFORM 150-READ-RECORD.
|
|
|
|
150-READ-RECORD.
|
|
READ IN-FILE
|
|
AT END
|
|
MOVE 'Y' TO EOF-SWITCH
|
|
NOT AT END
|
|
COMPUTE REC-CTR = REC-CTR + 1
|
|
END-READ.
|
|
|
|
200-PROCESS-RECORD.
|
|
MOVE ALPHA-BEARING-1 TO WS-ALPHA-BEARING.
|
|
PERFORM 250-CONVERT-DATA.
|
|
MOVE WS-BEARING TO WS-BEARING-1.
|
|
|
|
MOVE ALPHA-BEARING-2 TO WS-ALPHA-BEARING.
|
|
PERFORM 250-CONVERT-DATA.
|
|
MOVE WS-BEARING TO WS-BEARING-2.
|
|
|
|
COMPUTE WS-RESULT = WS-BEARING-2 - WS-BEARING-1.
|
|
MOVE WS-RESULT TO WS-RESULT-POS.
|
|
MOVE WS-RESULT-POS TO WS-INTEGER-PART.
|
|
COMPUTE WS-DECIMAL-PART = WS-RESULT-POS - WS-INTEGER-PART.
|
|
COMPUTE WS-INTEGER-PART = FUNCTION MOD(WS-INTEGER-PART 360).
|
|
IF WS-RESULT > 0
|
|
COMPUTE WS-RESULT = WS-INTEGER-PART + WS-DECIMAL-PART
|
|
ELSE
|
|
COMPUTE WS-RESULT =
|
|
(WS-INTEGER-PART + WS-DECIMAL-PART) * -1
|
|
END-IF.
|
|
|
|
IF WS-RESULT < -180
|
|
COMPUTE WS-RESULT = WS-RESULT + 360.
|
|
IF WS-RESULT > 180
|
|
COMPUTE WS-RESULT = WS-RESULT - 360.
|
|
COMPUTE WS-RESULT-OUT ROUNDED = WS-RESULT.
|
|
|
|
DISPLAY REC-CTR ' ' WS-RESULT-OUT.
|
|
|
|
PERFORM 150-READ-RECORD.
|
|
|
|
250-CONVERT-DATA.
|
|
MOVE WS-AB-INTEGER-PART TO WSB-INTEGER-PART.
|
|
MOVE WS-AB-DECIMAL-PART TO WSB-DECIMAL-PART.
|
|
IF WS-AB-NEGATIVE
|
|
SUBTRACT WS-BEARING FROM ZERO
|
|
GIVING WS-BEARING
|
|
END-IF.
|
|
|
|
300-TERMINATE.
|
|
DISPLAY 'RECORDS PROCESSED: ' REC-CTR.
|
|
CLOSE IN-FILE.
|
|
|
|
******************************************************************
|
|
* INPUT FILE ('Angle_diff.txt' stored on my PC at:
|
|
* 'C:\Both\Rosetta\Angle_diff.txt'
|
|
******************************************************************
|
|
* +000020.000000000000 +000045.000000000000
|
|
* -000045.000000000000 +000045.000000000000
|
|
* -000085.000000000000 +000090.000000000000
|
|
* -000095.000000000000 +000090.000000000000
|
|
* -000045.000000000000 +000125.000000000000
|
|
* -000045.000000000000 +000145.000000000000
|
|
* +000029.480300000000 -000088.638100000000
|
|
* -000078.325100000000 -000159.036000000000
|
|
* -070099.742338109380 +029840.674378767230
|
|
* -165313.666629735700 +033693.989451745600
|
|
* +001174.838051059846 -154146.664901247570
|
|
* +060175.773067955460 +042213.071923543730
|
|
******************************************************************
|
|
* OUTPUT:
|
|
******************************************************************
|
|
* 001 25.0000
|
|
* 002 90.0000
|
|
* 003 175.0000
|
|
* 004 -175.0000
|
|
* 005 170.0000
|
|
* 006 -170.0000
|
|
* 007 -118.1184
|
|
* 008 -80.7109
|
|
* 009 -139.5833
|
|
* 010 -72.3439
|
|
* 011 -161.5030
|
|
* 012 37.2989
|
|
******************************************************************
|