Programmeren in COBOL/Inleiding/LaTeX
Uiterlijk
Dit is de LaTeX versie van het hoofdstuk inleiding van het boek Programmeren in COBOL. Verander a.u.b. niets aan de inhoud van deze LaTeX-code doe dit in het desbetrefende hoofdstuk. U mag wel LaTeX-syntax veranderen. De inhoud komt overeen met de versie, die gemaakt werd door Sephiroth op 11 mrt 2008 20:11.
LaTeX-code: {{{Titel}}}
\chapter{Inleiding}
\paragraph{}
Dit is de inleiding van Programmeren in COBOL. COBOL is niet hoofdlettergevoelig dus een \textquotedbl a\textquotedbl betekent hetzelfde als een \textquotedbl A\textquotedbl. Voor de overzichtelijkheid wordt aangeraden om bepaalde regels te volgen, sleutelwoorden(syntax) worden in hoofdletters geschreven en velden(variabelen) met kleine letters. Natuurlijk is de inhoud van een veld wel hoofdlettergevoelig.
\section{Indeling van een programma}
\paragraph{}
Een programma in COBOL wordt ingedeeld in 4 delen of divisies.
\begin{lstlisting}[title={Indeling},frame=single]
IDENTIFICATION DIVISION.
ENVIRONMENT DIVISION.
DATA DIVISION.
PROCEDURE DIVISION.
\end{lstlisting}
\paragraph{}
Met de volgende betekenis:
\paragraph{}
\emph{IDENTIFICATION DIVISION} geeft informatie over het programma. Bijvoorbeeld wat de naam is van het programma of wie het gemaakt heeft.
\paragraph{}
De \emph{ENVIRONMENT DIVISION} is voornamelijk voor het gebruiken van bestanden door het programma.
\paragraph{}
In de \emph{DATA DIVISION} komen al de verschillende soorten velden(variabelen) die het programma gebruikt.
\paragraph{}
In de \emph{PROCEDURE DIVISION} staat de werkelijke programmacode.
\paragraph{}
Let op: de divisies moeten worden geschreven vanaf de 8ste positie. M.a.w. als je dit zou typen in een editor moet je voor je bijvoorbeeld \emph{IDENTIFICATION DIVISION} typt, 7 spaties laten. Dit gebruik stamt nog uit de tijd toen COBOL op papier werd geschreven. Achter deze divisies moet een punt komen. Wat ook belangrijk is om te weten, is dat alleen \emph{IDENTIFICATION DIVISION} en \emph{PROCEDURE DIVISION} verplicht zijn in een programmacode. De andere twee moet je alleen schrijven als je het werkelijk gebruikt.
\begin{lstlisting}[title={Positie},frame=single]
1 2 3
123456789012345678901234567890123456789
IDENTIFICATION DIVISION.
\end{lstlisting}
\section{Hello World! (DISPLAY)}
\paragraph{}
Laten we ons eerste programma schrijven en het traditionele "Hello World!" op het scherm tonen.
\begin{lstlisting}[title={Hello World!},frame=single]
IDENTIFICATION DIVISION.
PROGRAM-ID. Hello World.
PROCEDURE DIVISION.
hoofd.
DISPLAY "Hello World!"
STOP RUN
.
\end{lstlisting}
\paragraph{}
Zoals eerder werd gezegd geeft \emph{IDENTIFICATION DIVISION} informatie over het programma zelf. \emph{PROGRAM-ID}. (let op de punt) is een onderdeel van deze divisie, die geeft aan hoe het programma heet. Na een naam te hebben gegeven, moet ook een punt komen.
\paragraph{}
Programma's kunnen worden ingedeeld in deelprogramma's (zie hoofdstuk deelprogramma's). \emph{hoofd.} kun je in dit geval vergelijken met \emph{main()} in bijvoorbeeld java. Dit geeft gewoon aan dat dit het belangrijkste stukje code is van het programma. Je kunt \textit{hoofd.} echter vervangen door een andere naam.
\paragraph{}
De werkelijke programmacode wordt pas geschreven vanaf de 12de positie.
\paragraph{}
\textit{DISPLAY} laat iets zien op het scherm. Wil je zoals in dit programma gewoon tekst tonen, dan moet je de tekst tussen aanhalingstekens plaatsen (\textquotedbl\textquotedbl).
\paragraph{}
\textit{STOP RUN.} (let op de punt) geeft aan dat je aan het einde van het programma zit.
\section{Commentaar}
\paragraph{}
Het zou natuurlijk handig zijn als je commentaar kon plaatsen in een programma. Daarmee kun je later zien wat bijvoorbeeld bepaalde delen van een programma doen.
\begin{lstlisting}[title={Hello World!},frame=single]
1 2 3
123456789012345678901234567890123456789
*Dit is commentaar
\end{lstlisting}
\paragraph{}
Om commentaar te vermelden, moet je gebruik maken van een asterisk (*) op de 7de positie (dus voor de asterisk moet je 6 spaties laten). De hele regel wordt dan gezien als commentaar.
\section{Velden(variabelen)}
\paragraph{}
Variabelen worden in \textit{COBOL} velden genoemd en gedeclareerd in de \textit{DATA DIVISION}. Meer bepaald bij \textit{WORKING-STORAGE SECTION}.
\subsection{Numerieke velden}
\begin{lstlisting}[title={Numerieke velden},frame=single]
DATA DIVISION.
WORKING-STORAGE SECTION.
77 getal PIC 9 VALUE 1.
\end{lstlisting}
\paragraph{}
Dit is een voorbeeld van een numeriek veld. Een veld begint op de 8ste positie. Het begint met het getal 77. 77 is het zogenaamde niveaunummer. Nu uitleggen wat het is zou zinloos zijn, aangezien dit nog maar de basis is. Naast 77 zou je ook 01 kunnen gebruiken. Het niveaunummer wordt gevolgd door de naam die je wilt geven aan het veld. Vaak wordt de naam van het veld vanaf de 12de positie geschreven. Daarna wordt het gevolgd door \textit{PIC}(of \textit{PICTURE}) dat bepaalt welk soort veld het is. De \textquotedbl 9\textquotedbl staat voor een numeriek veld. Het aantal negens bepaalt hoeveel cijfers het veld maximum mag bevatten, 10 keer een 9 schrijven betekent dus een numeriek veld van 10 tekens lang. Als je een waarde aan een veld wilt toevoegen, kun je \textit{VALUE} gebruiken, maar dit is niet verplicht. Vergeet opnieuw de punt op het einde niet.
\begin{lstlisting}[title={Numerieke velden},frame=single]
DATA DIVISION.
WORKING-STORAGE SECTION.
77 getal PIC 9(10).
\end{lstlisting}
\paragraph{}
In plaats van bijvoorbeeld \textit{\textquotedbl 77 getal PIC 9999999999.\textquotedbl}" om de lengte te bepalen, kan je evengoed gewoon \textit{\textquotedbl PIC 9(10)\textquotedbl} schrijven om aan te geven dat het getal uit 10 cijfers zal bestaan. Beide hebben hetzelfde effect.
\paragraph{}
Als je bijvoorbeeld het getal 7 in een variabele zet met \textit{\textquotedbl PIC 999\textquotedbl} dan krijg je op het scherm \textquotedbl 007\textquotedbl te zien. Dus waar geen getal komt wordt 0 geplaatst. Later zullen we zien hoe je dit kunt wegwerken(zie hoofdstuk editing).
\subsection{Alfanumerieke velden}
\paragraph{}
Dit is natuurlijk te vergelijken met een String in de programmeertaal Java. Je kunt zo'n veld declareren met \textit{\textquotedbl PIC X\textquotedbl}. De X geeft opnieuw het soort variabele en zijn maximale lengte aan.
\begin{lstlisting}[title={Alfanumeriek velden},frame=single]
DATA DIVISION.
WORKING-STORAGE SECTION.
77 tekst PIC X(10).
\end{lstlisting}
\paragraph{}
Ook hier kan \textit{VALUE} worden gebruikt, alleen moet de inhoud nu tussen aanhalingstekens komen ("string" of 'string').
\begin{lstlisting}[title={Alfanumeriek velden},frame=single]
DATA DIVISION.
WORKING-STORAGE SECTION.
77 tekst PIC X(13) value "dit is tekst!".
\end{lstlisting}
\section{Een simpel programma}
\begin{lstlisting}[title={Getal},frame=single]
IDENTIFICATION DIVISION.
PROGRAM-ID. getal.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 tekst PIC X(18) VALUE "Dit is een getal:".
77 getal PIC 9(3) VALUE 7;
PROCEDURE DIVISION.
hoofd.
DISPLAY tekst " " getal
STOP RUN
.
\end{lstlisting}
\begin{lstlisting}[frame=single]
Dit is een getal: 007
\end{lstlisting}
\paragraph{}
Je kunt dus makkelijk 2 velden in dezelfde \textit{DISPLAY} tonen. Dit zorgt er wel voor dat de twee velden naast elkaar komen te staan. Om een spatie tussen de twee velden te hebben, kun je gewoon " " doen. Wil je dat ze onder elkaar komen dan zet je ze gewoon in 2 \textit{DISPLAY}’s.
\begin{lstlisting}[title={DISPLAY},frame=single]
PROCEDURE DIVISION.
hoofd.
DISPLAY tekst
DISPLAY getal
STOP RUN.
\end{lstlisting}
\begin{lstlisting}[frame=single]
Dit is een getal:
007
\end{lstlisting}
\section{ACCEPT}
\paragraph{}
Het zou natuurlijk leuk zijn moest de gebruiker input kunnen geven. Dit gebeurt via \textit{ACCEPT}, na \textit{ACCEPT} moet je het veld geven waarin de gebruiker iets voor moet ingeven.
\begin{lstlisting}[title={ACCEPT},frame=single]
IDENTIFICATION DIVISION.
PROGRAM-ID. getal.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 getal PIC 9(3).
PROCEDURE DIVISION.
hoofd.
DISPLAY "Geef een getal:"
ACCEPT getal
DISPLAY "Dit is uw getal: " getal
STOP RUN.
\end{lstlisting}
\begin{lstlisting}[frame=single]
Geef een getal:
7
Dit is uw getal: 007
\end{lstlisting}
\paragraph{}
Het vreemde aan \textit{ACCEPT} is dat wanneer de gebruiker iets ingegeven heeft, de computer een biep-geluid geeft. Om dit te vermijden kunt je \textit{NO BEEP} gebruiken.
\begin{lstlisting}[title={NO BEEP},frame=single]
ACCEPT getal NO BEEP
\end{lstlisting}
\section{MOVE}
\paragraph{}
Met behulp van \textit{MOVE} kun je makkelijk data overbrengen van het ene veld naar een andere. Maar je kunt ook gewoon een getal of tekst via \textit{MOVE} naar een veld overbrengen.
\begin{lstlisting}[title={MOVE},frame=single]
PROCEDURE DIVISION.
hoofd.
ACCEPT input NO BEEP
MOVE input TO output
MOVE 6 TO getal
MOVE "Dit is tekst" TO tekst
STOP RUN
.
\end{lstlisting}
\section{Decimale getallen}
\paragraph{}
Het stukje over numerieke velden ging alleen over gehele getallen en dus geen decimale. In COBOL moet je als je een decimaal getal wilt gebruiken dat ook zo declaren.
COBOL-code: Decimale getallen
\begin{lstlisting}[title={Numerieke velden},frame=single]
DATA DIVISION.
WORKING-STORAGE SECTION.
77 getal PIC 99V9.
PROCEDURE DIVISION.
hoofd.
DISPLAY "Geef een getal:"
ACCEPT getal NO BEEP
DISPLAY "Hier is uw getal: " getal
STOP RUN
.
\end{lstlisting}
\paragraph{}
De\textit{ V} na \textit{PIC} geeft aan waar je de decimale punt wilt hebben. Als je een decimaal getal wilt ingeven, moet je een punt(.) gebruiken en geen komma(,). Dit is omdat COBOL ontwikkeld is in Amerika, waar een decimaal getal wordt aangegeven met een punt. Als je het getal echter toont op het scherm, komt er geen punt te staan. De \textit{V} is alleen voor het inlezen van een getal en om er mee te rekenen. Wil je toch een punt hebben, dan moet je een extra variabele declareren (zie hoofdstuk editing).
\begin{lstlisting}[title={Decimale getallen},frame=single]
DATA DIVISION.
WORKING-STORAGE SECTION.
77 invoer PIC 99V9.
77 uitvoer PIC 99.9.
PROCEDURE DIVISION.
hoofd.
DISPLAY "Geef een getal:"
ACCEPT invoer NO BEEP
MOVE invoer TO uitvoer
DISPLAY "Hier is uw getal:"
DISPLAY uitvoer
STOP RUN.
\end{lstlisting}
\paragraph{}
Het veld "uitvoer" zal gebruikt worden om het op het scherm te laten zien. Het verschil is dat de V vervangen werd door een punt. Bij dit veld moet je de inhoud kopiëren vanuit het veld "getal" door middel van MOVE.
\section{Negatieve getallen}
\paragraph{}
Er geldt ook iets gelijkaardigs voor negatieve getallen, alleen is het hier erger. Als je negatieve getallen wilt gebruiken, moet je die ook eerst declareren.
\begin{lstlisting}[title={Negatieve getallen},frame=single]
DATA DIVISION.
WORKING-STORAGE SECTION.
77 getal PIC S999.
PROCEDURE DIVISION.
hoofd.
DISPLAY "geef een getal"
ACCEPT getal NO BEEP
DISPLAY " "
DISPLAY getal
STOP RUN
.
\end{lstlisting}
\paragraph{}
Als je dus een negatief getal wilt, moet je na PIC S999 zetten. S betekent sign (teken) en geeft aan dat het een negatief getal mag zijn. Dit geeft echter een probleem, zoals hieronder te zien is in de schermtekst als je het programma uitvoert.
\begin{lstlisting}[frame=single]
Geef een getal
-888
88Q
\end{lstlisting}
\paragraph{}
88Q is dus niet het getal dat we hebben ingegeven. Hier kun je echter perfect mee rekenen, maar zoals bij een decimaal getal moet je er iets speciaal mee doen. Je hebt weer een extra veld nodig.
\begin{lstlisting}[title={Negatieve getallen},frame=single]
77 uitvoer PIC -999.
\end{lstlisting}
\paragraph{}
De \textquotedbl -\textquotedbl geeft aan waar je het teken wilt (zie hoofdstuk Editing). Opgelet, dit betekent niet dat er altijd een - zal staan; bij een positief getal zal er geen teken staan. Gebruik je daarentegen PIC +999 dan staat er altijd een teken, hetzij +, hetzij -, afhankelijk van de inhoud. Gebruik opnieuw MOVE om de inhoud van getal naar uitvoer te kopiëren.