Hoofdstuk 4: Maken van eenvoudige programma's
Inleiding
In dit hoofdstuk gaan we eenvoudige programma's schrijven om kleine problemen op te lossen
- berekenen van oppervlakte
- berekenen van een lening
Schrijven van een eenvoudig programma
Stel dat we de oppervlakte willen bereken van een cirkel. We weten uit wiskunde dat de oppervlakte gedefinieerd is als .
- Uit de formule zien we dat we een grootheid nodig hebben om de formule te kunnen bereken.
- We moeten ook de waarde weten van de constante , maar die is algemeen gekend.
- Eens we de formule berekend hebben, kunnen we het resultaat tonen.
Een algoritme om de oppervlakte te berekenen is:
- Vraag de straal van de cirkel.
- Bereken de oppervlakte door het berekenen de formule:
- Toon het resultaat.
Wanneer je programmeert vertaal je het algoritme naar code die de Java compiler kan begrijpen. (De Java compiler kan deze dan omvormen naar bytecode en dan kan de JVM dit vertalen naar machine code.)
- Het omvormen van een beschrijvende algoritme, zoals hierboven, naar een code noemen we ook implementeren. De implementatie is dan de broncode die door de Java compiler zal gecompileerd worden.
- Een mogelijk implementatie voor de berekening van de oppervlakte is
- Wanneer we de straal opvragen (we zien later hoe dit moet), kunnen wij een waarde invullen. Die waarde dien wij te gebruiken in de formule. We weten op voorhand niet wat deze waarde zal zijn. Bijgevolg is die waarde veranderlijk of variabel. We moeten deze waarde ergens opschrijven of opslaan zodat we die kunnen hergebruiken. We kunnen dit doen aan de hand van een variabele. Een variabele stelt een waarde voor die in de computer is opgeslagen.
- De programmeur is vrij te kiezen welke naam hij gaat kiezen voor een variabele, maar we nemen liefst een naam die betekenisvol is. Dus in plaats van variabele
x
ofy
nemen westraal
enòppervlakte
. - Een variabele moet een bepaald type hebben. De computer (en bijgevolg ook Java) dient te weten hoeveel hij geheugen zal nodig hebben om het programma uit te voeren, dus de programmeur dient mee te geven welk soort van gegevens dat het programma mag verwachten. Dit noemt men ook wel het declareren van variabelen. In dit geval moeten Java vertellen dat we met kommagetallen zullen maken. In Java duiden we dat aan door de variabele te declareren als een type
double
. - Toekenning van waarden: als we een waarde willen toekennen aan een variabele dan vertellen we aan Java dat de variabele op dat moment een bepaalde waarde heeft. Het toekennen van een waarde aan een variabele gebeurt door een statement en daarbij gebruiken we het
=
-teken. Dit wordt ook wel de toekenningsoperator of (in het Engels) assignment genoemd:straal = 30;
Getallen invoeren via input
In het vorige programma vroegen we niet om de straal, maar stelden we die in tijdens de declaratie. Als we een oppervlakte willen berekenen met een andere straal dan moeten we een andere waarde toekennen voor
straal
. bv:straal = 10;Om een getal in te voeren in ons programma dient het programma te wachten wanneer een gebruiker getallen invoert. Het interageren met randapparatuur zoals het toetsenbord en wachten op een gebeurtenis zijn ingewikkelde operaties die niet vanzelfsprekend zijn. We roepen daarom de hulp in van een klasse die dit voor ons doet. De naam van die klasse is
Scanner
en is reeds in Java geïmplementeerd. Om dat aan Java duidelijk te maken moeten we bovenaan die klasse 'importeren' in ons programma:import java.util.Scanner;We lopen hier een beetje vooruit op de feiten, maar we hier heel snel over. We maken maken een object van Scanner. Door middel van dat object kunnen we functies aanroepen waardoor de gebruiker de invoer kan geven. Het maken van een object doen we via het sleutelwoord
new
. De invoer moet van ergens komen en die komt van een apparaat dat in JavaSystem.in
genoemd wordt. Dit staat standaard ingesteld op het toetsenbord. Naar analogie,System.out
is het uitvoerapparaat en staat standaard ingesteld op het scherm.//Declaratie van object invoer van het type Scanner Scanner invoer = new Scanner(System.in);Hierdoor kunnen we een functie oproepen zodat de uitvoering van het programma zal wachten tot een gebruiker een waarde heeft ingevoerd. Deze waarde is een komma-getal en zal toegekend worden aan de straal. Dit gebeurt als volgt:
// straal = 10; verandert in straal = invoer.nextDouble();We moeten ook duidelijk maken aan de gebruiker dat hij iets moet invoeren en wat hij moet invoeren.
- Het volledige programma wordt dan:
- Op deze manier hebben we een eenvoudig programma gemaakt dat de oppervlakte berekent, dat het resultaat toont op het scherm en dat van de gebruiker invoer vraagt. Dit kan als startpunt dienen om een programma te maken om de oppervlakte te berekenen wanneer je de diameter vraagt in plaats van de straal. Of wanneer je omtrek van een cirkel moet berekenen. Of wanneer je de oppervlakte moet bereken van een andere geometrische figuur (vierkant, paralellogram,...).
Identifiers
Identifiers zijn namen die een element identificeren, zoals een klasse, methode of een variabele in een programma
- Een identifier dient aan bepaalde regels te voldoen:
- opeenvolging van tekens dat bestaat uit letters, cijfers, underscores (
_
) of dollar teken ($
) - moet starten met een letter, underscore (
_
) of dollar teken ($
), niet met een cijfer - kan niet een sleutelwoord zijn
- kan niet
true
,false
ofnull
zijn - kan om het even welke lengte hebben
- opeenvolging van tekens dat bestaat uit letters, cijfers, underscores (
- Een identifier geeft men best een goed beschrijvende naam. Als je het aantal studenten in een variabele wil steken, dan geef je die variabele met een goede beschrijvende identifier: bv.
aantalStudenten
eerder dann
ofgetal
. Deze laatste identifiers zeggen niets wat de betekenis van de waarde van de variabele. - Java is hoofdlettergevoelig.
oppervlakte
,Oppervlakte
ofOPPERVLAKTE
zijn allemaal verschillende identifiers.
Variabelen
Een variabele wordt gebruikt om waarden voor te stellen die kunnen veranderen tijdens de uitvoering van een programma
- Een variabele kan een andere waarde hebben of de waarde kan veranderd worden door de loop van het programma
Variabelen stellen gegevens voor van een bepaald type. Een declaratie van een variabele vertelt de compiler om de gepaste hoeveelheid geheugen voor te behouden voor de opslag van de waarde die geassocieerd is met de waarde. Een declaratie gebeurt als volgt :
datatype variabeleNaam;
Voorbeelden van een declaratie zijn:
int
endouble
zijn datatypes voor gehele en komma- getallen, respectivelijk. Andere types zijnbyte
,short
,long
,float
,char
enboolean
.Het is ook mogelijk om meerder variabelen van hetzelfde type de declareren als volgt:
datatype variabeleNaam1, variabeleNaam2, ... , variabeleNaamj;
Bijvoorbeeld:
- Het is ook mogelijk een initiële waarde toe te kennen aan de variabele bij declaratie, bv
- Een variabele moet geinitialiseerd worden vooraleer je ze gebruikt
- Elke variabele heeft een bereik. Het bereik van de variabele (Engels: scope) is het deel van het programma waar de variabele kan opgevraagd worden.
Toekenning en toekenningsstatements
Een toekenning plaatst een waarde voor een variabele. Een toekenningsstatement kan gebruikt worden als een uitdrukking in Java.
Toekenning gebeurt via de toekenningsoperator (
=
) en gebeurt in het algemeen als volgt:variabele = uitdrukking;
Een uitdrukking stelt een berekening voor met waarden, variabelen en operatoren en resulteert in een waarde:
- In een uitdrukking kan een variabele zowel in het linkerlid als in het rechterlid voorkomen:
Hierbij wordt de huidige waarde genomen van x en daarbij 1 opgeteld. Daarna wordt het resultaat toegekend aan de diezelfde variabele x. Dit is analoog met de waarde van x met 1 te verhogen of incrementeren.
- Opgelet om een waarde aan een variabele toe te kennen moet de variabele in het linkerlid staan. De volgende uitdrukking is verkeerd:
Constanten
Een constante is een identifier dat een waarde voorstelt dat nooit verandert
- De waarde van een variabele kan veranderen tijdens de uitvoering van een programma, maar de waarde van een constante verandert nooit. Bijvoorbeeld, .
De syntax om een constante waarde te declareren is:
final datatype CONSTANTENAAM = waarde;
Een constante MOET gedeclareerd en geïnitialiseerd worden.
final
is een sleutelwoord in Java. We kunnen dus als volgt declareren:
- We kunnen dan ons programma voor het berekenen van de oppervlakte herschrijven als:
- Er zijn 4 voordelen voor het gebruik van constanten in plaats van van de expliciete waarde
- Je hoeft niet altijd de waarde te hertypen bij meervoudig gebruik
- Als je de waarde van de constante moet veranderen (bv. van 3.14 naar 3.14159 voor PI), kan je dit doen op één plaats.
- Een beschrijvende naam maakt het leesbaar
- Het belet gebruikers van je code de waarde te varanderen.
Conventies in naamgeving
Het gebruik van eenzelfde naamgeving maakt je programma's leesbaar en vermijdt fouten
- Zorg ervoor dat je beschrijvende betekenisvolle namen kiest voor identifiers. Hieronder volgen nog enkele conventies voor namen
- Gebruik kleine letters voor variabelen en methode. Als een naam uit verschillende woorden bestaat, krijgt het eerste woord een kleine letter maar de opeenvolgende woorden starten met een hoofdletter bv:
aantalStudenten
ofoppervlakteVanFiguur
. - De naam van een klasse begint altijd met een hoofdletter, bv:
System
,Scanner
ofWelkom
. - De naam van een constante bestaat uitsluitend uit hoofdletters: bv.
PI
ofMAX_VALUE
.
- Gebruik kleine letters voor variabelen en methode. Als een naam uit verschillende woorden bestaat, krijgt het eerste woord een kleine letter maar de opeenvolgende woorden starten met een hoofdletter bv:
Datatypes
Numerieke datatypes en uitdrukkingen
Java heeft zes numerieke types voor gehele en reële getallen met operaties +, -, *, / en %.
Numeriek types
- Een numeriek type is een datatype waarbij we getallen kunnen opslaan. Voor het soort type en de grootte van de waarde bestaan er verschillende types.
Naam | Bereik | Opslaggrootte |
---|---|---|
byte |
tot (-128 tot 128) | 8-bit signed |
short |
tot (-32768 tot 32767) | 16-bit signed |
int |
tot (-2147483648 tot 2147483647) | 32-bit signed |
long |
tot | 64-bit signed |
float |
tot | 32-bit IEEE 754 |
double |
tot | 64-bit IEEE 754 |
- IEEE 754 staat voor een standaard hoe kommagetallen worden opgeslagen door het Institute of Electrical and Electronics Engineers. De standaard wordt wereldwijd gebruikt.
Invoer van getallen door toetsenbord
- De klasse
Scanner
kan gebruikt worden om een waarde in te lezen. In de voorgaande progamma's hebben we een kommagetal ingelezen via de methodenextDouble()
. Je kan ook andere types inlezen.
Methode | Beschrijving |
---|---|
nextByte() |
leest een geheel getal in van het type byte |
nextShort() |
leest een geheel getal in van het type short |
nextInt() |
leest een geheel getal in van het type int |
nextLong() |
leest een geheel getal in van het type long |
nextFloat() |
leest een getal in van het type float |
nextDouble() |
leest een geheel getal in van het type double |
Numeriek operaties
- Er zijn 5 numerieke operaties: optelling (
+
), aftrekking (-
), vermenigvuldiging (*
), deling (/
) en rest bij deling (%
).
Naam | Betekenis | Voorbeeld | Resultaat |
---|---|---|---|
+ |
Optelling | ||
- |
Aftrekking | ||
* |
Vermenigvuldiging | ||
/ |
Deling | ||
% |
Rest bij deling |
Machtsverheffing
- In Java is er een klass
Math
die kan gebruikt worden om machtsverheffing te doen. De methodeMath.pow(a,b)
kan gebruikt worden om uit te voeren. Voorbeelden:
Numerieke Literals
Een literal is een constante waarde dat direct voorkomt in het programma
- Voorbeelden van numerieke literals zijn
34
en0.305
. In de broncode is dit tekst maar Java kan hieruit de waarde 34 aflezen. Hetzelfde alsof de mens dit ook doen. De mens ziet immers ook het teken3
dat het teken4
voorafgaat, maar leest de waarde 34 en begrijpt ook dat het om een getal gaat.
- Hetzelfde gebeurt ook bij stukjes tekst of String. Als iets tussen dubbele aanhalingstekens staat, dan interpreteert Java direct als een waarde van het type
String
.
Evalueren van uitdrukkingen en voorrangsregels
- Numerieke uitdrukkingen in Java kan gemakkelijk afgeleid worden vanuit de wiskundige uitdrukking. Zo is:
omgezet naar een Java uitdrukking tot:
- Operatoren binnen de haakjes worden eerst uitgevoerd.
- Haakjes kunnen binnen haakjes voorkomen, maar de binnenste haakjes worden eerst uitgevoerd.
- Wanneer meer dan één operator in een uitdrukking is worden de volgorde van uitvoering als volgt:
- Vermeningvuldiging, deling en rest worden eerst toegepast. Als er meerdere vermenigvuldigingen, delingen of restbepalingen zijn worden ze uitgevoerd van links naar rechts
- Optelling en aftrekking worden als laatste uitgevoerd. Bij meerdere optellingen en aftrekkingen, worden ze toegepast van links naar rechts.
Geavanceerde toekenningsoperatoren
De operatoren
+
,-
,*
,/
en%
kunnen gecombineerd worden met de toekenningsoperator=
.
Bij veel toepassingen moeten we de waarde van een variabele verhogen of verlagen met 1, zoals
teller = teller + 1;Java heeft de mogelijkheid om dit te verkorten naar:
teller += 1;Er zijn zo meerdere gecombineerde toekenningsoperatoren
Operator | Naam | Voorbeeld | Equivalent |
---|---|---|---|
+= |
optelling en toekenning | i += 8 |
i = i + 8 |
-= |
aftrekking en toekenning | i -= 8 |
i = i - 8 |
*= |
vermenigvuldiging en toekenning | i *= 8 |
i = i * 8 |
/= |
deling en toekenning | i /= 8 |
i = i / 8 |
%= |
restbepaling en toekenning | i %= 8 |
i = i % 8 |
- De geavanceerde toekenning wordt het laatst uitgevoerd in uitdrukkingen. Bijvoorbeeld:is equivalent metx /= 4 + 5.5*1.5;x = x / (4 + 5.5*1.5);
Increment en decrement operatoren
De incrementoperator (
++
) en decrementoperator (--
) zullen de waarde van een variabele met 1 verhogen of verlagen, respectivelijk.
- Je kan de incrementoperator (
++
) en decrementoperator (--
) zowel voor als na de variabele plaatsen. Na de variabele (bv.i++
ofi--
) wordt ook wel postfix incrementoperator of postfix decrementoperator genoemd. Voor de variabele (bv.++i
of--i
) wordt ook wel prefix incrementoperator of prefix decrementoperator genoemd.
Operator | Naam | Beschrijving | Voorbeeld (i = 1) |
---|---|---|---|
++var |
preincrement | Incrementeer var met 1 en gebruik de nieuwe waarde voor var in de uitdrukking |
int j = ++i; // j is 2, i is 2 |
var++ |
postincrement | Incrementeer var met 1 en gebruik de oorspronkelijk waarde voor var in de uitdrukking |
int j = i++; // j is 1, i is 2 |
--var |
predecrement | Decrementeer var met 1 en gebruik de nieuwe waarde voor var in de uitdrukking |
int j = --i; // j is 0, i is 0 |
var-- |
postdecrement | Decrementeer var met 1 en gebruik de oorspronkelijk waarde voor var in de uitdrukking |
int j = i--; // j is 1, i is 0 |
Conversies naar numerieke types
Kommagetallen kunnen omgezet worden naar gehele getallen
- Java zal bij een uitdrukking waarbij verschillende types betrokken zijn (bv.
3 * 4.5
), het geheel getal omzetten naar kommagetal. - Elk type heeft een bereik. Conversie naar een type met een groter bereik noemt men typeverbreding (bv. van
long
naarfloat
), het omgekeerde is typevernauwing (bv. vandouble
naarint
). - Je kan altijd typeverbreding doen en Java zal dit impliciet doen. Maar typevernauwing moet je expliciet aangeven via typecasting.
- Het omzetten wordt ook typecasten genoemd. De syntax hiervoor is om het type te specifieren naar waar de waarde moet omgezet worden gevolgd door de naar van de variabele of waarde.
- Let op! De omzetting van reëel getal naar geheel getal, gaat gepaard met een verlies van nauwkeurigheid.