Die Sprache, die Banken und Behörden am Laufen hält
Ausführen: Datei hallo.cob speichern, mit cobc -x -free hallo.cob übersetzen und ./hallo starten (GnuCOBOL, z. B. über sudo apt install gnucobol).
DISPLAY zur Ausgabe, STOP RUN zum Beendencobc -x -free datei.cobADD, SUBTRACT, MULTIPLY, DIVIDE, COMPUTEcobc -x -free hallo.cob -o hallo # -x: ausführbares Programm, -free: freies Format
./halloPIC 9 Ziffer, X Zeichen, A Buchstabe, S Vorzeichen, V DezimalpunktZ, ,, ., $, -) formatieren die Ausgabe01, 05); MOVE passt Formate an und kürztREDEFINES für zweite Sicht auf DatenIDENTIFICATION DIVISION.
PROGRAM-ID. DATEN.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 ZAHL PIC 9(5) VALUE 42.
01 PREIS PIC 9(4)V99 VALUE 1234.56.
01 SALDO PIC S9(5)V99 VALUE -75.25.
01 NAME PIC X(10) VALUE "Fortran".
01 BUCHSTABEN PIC A(5) VALUE "Hallo".
01 AUSGABE-1 PIC Z(4)9.
01 AUSGABE-2 PIC ZZZ,ZZ9.99.
01 AUSGABE-3 PIC -9(4).99.
01 AUSGABE-4 PIC $$$9.99.
01 PERSON.
05 P-NAME PIC X(8) VALUE "Mia".
05 P-ALTER PIC 99 VALUE 17.
05 P-ORT PIC X(10) VALUE "Berlin".
PROCEDURE DIVISION.
DISPLAY "ZAHL : [" ZAHL "]".
DISPLAY "PREIS : [" PREIS "]".
DISPLAY "SALDO : [" SALDO "]".
DISPLAY "NAME : [" NAME "]".
MOVE ZAHL TO AUSGABE-1.
DISPLAY "Z-Format : [" AUSGABE-1 "]".
MOVE PREIS TO AUSGABE-2.
DISPLAY "Tausender : [" AUSGABE-2 "]".
MOVE SALDO TO AUSGABE-3.
DISPLAY "Vorzeichen: [" AUSGABE-3 "]".
MOVE 7.5 TO AUSGABE-4.
DISPLAY "Währung : [" AUSGABE-4 "]".
DISPLAY "Gruppe : [" PERSON "]".
DISPLAY "Teilfeld : " P-NAME " / " P-ORT.
STOP RUN.ADD, SUBTRACT, MULTIPLY, DIVIDE (mit GIVING, REMAINDER) und COMPUTE für FormelnROUNDED rundet, ON SIZE ERROR erkennt Überlauf; ohne beides wird abgeschnittenS in der PIC0,1 + 0,2 = 0,3 exaktIDENTIFICATION DIVISION.
PROGRAM-ID. RECHNEN2.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 A PIC 9(4) VALUE 100.
01 B PIC 9(4) VALUE 30.
01 C PIC 9(4) VALUE 7.
01 ERG PIC S9(6)V99.
01 GANZ PIC 9(4).
01 REST PIC 9(4).
PROCEDURE DIVISION.
ADD B TO A.
DISPLAY "A nach ADD B TO A: " A.
ADD 1 2 3 TO C.
DISPLAY "C nach ADD 1 2 3: " C.
ADD A B C GIVING ERG.
DISPLAY "A+B+C = " ERG.
SUBTRACT 10 FROM A.
DISPLAY "A nach SUBTRACT: " A.
SUBTRACT B C FROM A GIVING ERG.
DISPLAY "A-B-C = " ERG.
MULTIPLY 2 BY C.
DISPLAY "C verdoppelt: " C.
MULTIPLY A BY B GIVING ERG.
DISPLAY "A*B = " ERG.
DIVIDE 7 INTO A GIVING GANZ REMAINDER REST.
DISPLAY "A/7 = " GANZ " Rest " REST.
DIVIDE A BY 8 GIVING ERG.
DISPLAY "A/8 = " ERG.
COMPUTE ERG = (A + B) * C / 4 - 2 ** 3.
DISPLAY "COMPUTE: " ERG.
COMPUTE ERG = FUNCTION SQRT(A) + FUNCTION MOD(A B).
DISPLAY "Funktionen: " ERG.
COMPUTE GANZ = FUNCTION INTEGER(A / 7).
DISPLAY "Ganzzahl: " GANZ.
STOP RUN.IF ... ELSE ... END-IF, Verknüpfung mit AND, OR, NOT; EVALUATE ersetzt switchPERFORM n TIMES, PERFORM VARYING ... UNTIL ..., PERFORM UNTILPERFORM NAMEEND-IF/END-PERFORM abschließen, nicht nur mit PunktIDENTIFICATION DIVISION.
PROGRAM-ID. BEDINGUNG.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PUNKTE PIC 999 VALUE 78.
01 TAG PIC 9 VALUE 3.
01 NOTE PIC X(12).
PROCEDURE DIVISION.
IF PUNKTE >= 90
DISPLAY "sehr gut"
ELSE IF PUNKTE >= 75
DISPLAY "gut"
ELSE
DISPLAY "weiter üben"
END-IF
END-IF.
IF PUNKTE > 50 AND PUNKTE < 100
DISPLAY "zwischen 50 und 100"
END-IF.
IF PUNKTE < 10 OR PUNKTE = 78
DISPLAY "kleiner 10 oder genau 78"
END-IF.
IF NOT PUNKTE = 0
DISPLAY "nicht null"
END-IF.
IF PUNKTE IS NUMERIC
DISPLAY "ist numerisch"
END-IF.
EVALUATE TAG
WHEN 1 DISPLAY "Montag"
WHEN 2 THRU 4 DISPLAY "Mitte der Woche"
WHEN 6 THRU 7 DISPLAY "Wochenende"
WHEN OTHER DISPLAY "anderer Tag"
END-EVALUATE.
EVALUATE TRUE
WHEN PUNKTE >= 90 MOVE "A" TO NOTE
WHEN PUNKTE >= 75 MOVE "B" TO NOTE
WHEN OTHER MOVE "C" TO NOTE
END-EVALUATE.
DISPLAY "Note: " NOTE.
STOP RUN.OCCURS n TIMES definiert Tabellen, Zugriff mit Z(i), Indizes ab 1SEARCH durchsucht Tabellen mit Index (INDEXED BY)STRING ... DELIMITED BY, UNSTRING, INSPECT TALLYING/REPLACING/CONVERTINGtext(start:länge), Funktionen mit FUNCTION name(...)IDENTIFICATION DIVISION.
PROGRAM-ID. TABELLEN.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 ZAHLEN.
05 Z PIC 99 OCCURS 5 TIMES.
01 NAMEN.
05 N PIC X(6) OCCURS 3 TIMES.
01 LAGER.
05 ARTIKEL OCCURS 3 TIMES.
10 A-NAME PIC X(8).
10 A-MENGE PIC 999.
01 I PIC 99.
01 SUMME PIC 999 VALUE 0.
01 MAXIMUM PIC 99 VALUE 0.
PROCEDURE DIVISION.
MOVE 12 TO Z(1). MOVE 7 TO Z(2). MOVE 25 TO Z(3).
MOVE 3 TO Z(4). MOVE 18 TO Z(5).
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
ADD Z(I) TO SUMME
IF Z(I) > MAXIMUM
MOVE Z(I) TO MAXIMUM
END-IF
END-PERFORM.
DISPLAY "Summe " SUMME " Maximum " MAXIMUM.
MOVE "Mia" TO N(1). MOVE "Tom" TO N(2). MOVE "Zoe" TO N(3).
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
DISPLAY I ": " N(I)
END-PERFORM.
MOVE "Apfel" TO A-NAME(1). MOVE 40 TO A-MENGE(1).
MOVE "Birne" TO A-NAME(2). MOVE 15 TO A-MENGE(2).
MOVE "Kirsche" TO A-NAME(3). MOVE 8 TO A-MENGE(3).
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
DISPLAY A-NAME(I) " " A-MENGE(I)
END-PERFORM.
STOP RUN.ACCEPT liest Konsole, Datum (FROM DATE YYYYMMDD), Zeit und UmgebungZ, ,, .) in Zeilenstrukturen, DISPLAY oder WRITEIDENTIFICATION DIVISION.
PROGRAM-ID. EINGABE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NAME PIC X(20).
01 ZAHL PIC 9(3).
01 DATUM PIC 9(8).
PROCEDURE DIVISION.
*> Interaktiv wäre: ACCEPT NAME FROM CONSOLE.
*> Hier die Alternative ohne Tastatur:
ACCEPT DATUM FROM DATE YYYYMMDD.
IF DATUM > 20200101
DISPLAY "Datum liegt nach 2020"
END-IF.
ACCEPT ZAHL FROM ENVIRONMENT "GIBT_ES_NICHT".
DISPLAY "Zahl ohne Wert: " ZAHL.
MOVE "Mia Beispiel" TO NAME.
DISPLAY "Willkommen, " NAME.
STOP RUN.SELECT ... ASSIGN, FD, OPEN/READ/WRITE/CLOSE, AT END, FILE STATUSLINE SEQUENTIAL für Textdateien, INDEXED für schlüsselbasierte Dateien (VSAM)CALL "NAME" USING ... und LINKAGE SECTIONROUNDED, ON SIZE ERRORIDENTIFICATION DIVISION.
PROGRAM-ID. DATEIEN.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT KUNDEN-DATEI ASSIGN TO "kunden.dat"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD KUNDEN-DATEI.
01 KUNDEN-SATZ.
05 K-NR PIC 9(4).
05 FILLER PIC X.
05 K-NAME PIC X(10).
05 K-UMSATZ PIC 9(5).
WORKING-STORAGE SECTION.
01 EOF-FLAG PIC X VALUE "N".
88 DATEI-ENDE VALUE "J".
01 GESAMT PIC 9(7) VALUE 0.
01 ANZAHL PIC 99 VALUE 0.
01 MITTEL PIC 9(5)V99.
PROCEDURE DIVISION.
HAUPT.
PERFORM SCHREIBEN.
PERFORM LESEN.
STOP RUN.
SCHREIBEN.
OPEN OUTPUT KUNDEN-DATEI.
MOVE 1001 TO K-NR. MOVE "Mia" TO K-NAME. MOVE 12000 TO K-UMSATZ.
WRITE KUNDEN-SATZ.
MOVE 1002 TO K-NR. MOVE "Tom" TO K-NAME. MOVE 8500 TO K-UMSATZ.
WRITE KUNDEN-SATZ.
MOVE 1003 TO K-NR. MOVE "Zoe" TO K-NAME. MOVE 20300 TO K-UMSATZ.
WRITE KUNDEN-SATZ.
CLOSE KUNDEN-DATEI.
LESEN.
OPEN INPUT KUNDEN-DATEI.
PERFORM UNTIL DATEI-ENDE
READ KUNDEN-DATEI
AT END SET DATEI-ENDE TO TRUE
NOT AT END
DISPLAY K-NR " " K-NAME " " K-UMSATZ
ADD K-UMSATZ TO GESAMT
ADD 1 TO ANZAHL
END-READ
END-PERFORM.
CLOSE KUNDEN-DATEI.
DIVIDE GESAMT BY ANZAHL GIVING MITTEL.
DISPLAY "Anzahl: " ANZAHL " Gesamt: " GESAMT " Mittel: " MITTEL.PERFORM statt Schleifen, PIC statt TypnamenCOMP-3), nie in GleitkommaEND-IF/END-PERFORM und sorgfältig gewählte PIC-Größen IDENTIFICATION DIVISION.
PROGRAM-ID. KONTOSTAND.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL INCLUDE SQLCA END-EXEC.
01 WS-KONTO PIC X(10).
01 WS-SALDO PIC S9(9)V99 COMP-3.
PROCEDURE DIVISION.
MOVE "DE12345678" TO WS-KONTO.
EXEC SQL
SELECT SALDO INTO :WS-SALDO
FROM KONTEN WHERE KONTO_NR = :WS-KONTO
END-EXEC.
IF SQLCODE = 0
DISPLAY "Saldo: " WS-SALDO
END-IF.
STOP RUN.