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 A=π×r2 A = \pi \times r^2 .

    • 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 π\pi, maar die is algemeen gekend.
    • Eens we de formule berekend hebben, kunnen we het resultaat tonen.
  • Een algoritme om de oppervlakte te berekenen is:

    1. Vraag de straal van de cirkel.
    2. Bereken de oppervlakte door het berekenen de formule: oppervlakte=straal×straal×π oppervlakte = straal \times straal \times \pi
    3. 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
public class BerekenOppervlakte{ public static void main(String[] args){ // Declaratie van variabelen double straal = 0; double oppervlakte = 0; // 1. Vraag de staal van de cirkel straal = 30; // 2. Bereken de oppervlakte oppervlakte = straal * straal * 3.14159; // 3. Toon het resultaat? System.out.println("De oppervlakte is " + oppervlakte); } }
  • 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 of y nemen we straal 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 Java System.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.

System.out.println("Voer de waarde in van de straal: "); straal = invoer.nextDouble();
  • Het volledige programma wordt dan:
import java.util.Scanner; public class BerekenOppervlakte{ public static void main(String[] args){ // Declaratie van variabelen double straal = 0; double oppervlakte = 0; Scanner invoer = new Scanner(System.in); // 1. Vraag de staal van de cirkel System.out.println("Voer de waarde van de straal in:") straal = invoer.nextDouble(); // 2. Bereken de oppervlakte oppervlakte = straal * straal * 3.14159; // 3. Toon het resultaat? System.out.println("De oppervlakte is " + oppervlakte); } }
  • 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 of null zijn
    • kan om het even welke lengte hebben
  • 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 dan n of getal. Deze laatste identifiers zeggen niets wat de betekenis van de waarde van de variabele.
  • Java is hoofdlettergevoelig. oppervlakte, Oppervlakte of OPPERVLAKTE 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
straal = 1.0; oppervlakte = straal * straal * 3.14159 System.out.println("De oppervlakte is " + oppervlakte + " voor straal " + straal); straal = 2.0; oppervlakte = straal * straal * 3.14159 System.out.println("De oppervlakte is " + oppervlakte + " voor straal " + straal);
  • 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 aantal; //Declareert aantal om een geheel getal te zijn double straal; //Declareert straal om een komma-getal te zijn double interestVoet; //Declareert interestVoet om een komma-getal te zijn
  • int en double zijn datatypes voor gehele en komma- getallen, respectivelijk. Andere types zijn byte, short, long, float, char en boolean.

  • Het is ook mogelijk om meerder variabelen van hetzelfde type de declareren als volgt: datatype variabeleNaam1, variabeleNaam2, ... , variabeleNaamj;

  • Bijvoorbeeld:

int xcoordinaat, ycoordinaat, zcoordinaat; //Declareert 3 variabelen om een geheel getal te zijn
  • Het is ook mogelijk een initiële waarde toe te kennen aan de variabele bij declaratie, bv
int aantal = 1; //Declareert aantal om een geheel getal te zijn en initialiseert de waarde op 1 double straal = 3.5; //Declareert straal om een komma-getal te zijn en initialiseert de waarde op 3.5
  • 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:

int y = 1; //kent de waarde 1 toe aan variabele y double straal = 1.0; //kent de waarde 1.0 toe aan variabele straal int x = 5 * (3 / 2); //kent de waarde van de uitdrukking toe aan x x = y + 1; //kent de waarde door optelling van de waarde van y en 1 toe aan x
  • In een uitdrukking kan een variabele zowel in het linkerlid als in het rechterlid voorkomen:
x = x + 1;

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:
1 = x; //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, π\pi.
  • 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 π\pi als volgt declareren:

final double PI = 3.14159;
  • We kunnen dan ons programma voor het berekenen van de oppervlakte herschrijven als:
import java.util.Scanner; public class BerekenOppervlakte{ public static void main(String[] args){ // Declaratie van constanten final double PI = 3.14159; // Declaratie van variabelen double straal = 0; double oppervlakte = 0; Scanner invoer = new Schanner(System.in); // 1. Vraag de staal van de cirkel System.out.println("Voer de waarde van de straal in:") straal = invoer.nextDouble(); // 2. Bereken de oppervlakte oppervlakte = straal * straal * PI; // 3. Toon het resultaat? System.out.println("De oppervlakte is " + oppervlakte); } }
  • 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 of oppervlakteVanFiguur.
    • De naam van een klasse begint altijd met een hoofdletter, bv: System, Scanner of Welkom.
    • De naam van een constante bestaat uitsluitend uit hoofdletters: bv. PI of MAX_VALUE.

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 27-2^7 tot 2712^7 - 1 (-128 tot 128) 8-bit signed
short 215-2^{15} tot 21512^{15} - 1 (-32768 tot 32767) 16-bit signed
int 231-2^{31} tot 23112^{31} - 1 (-2147483648 tot 2147483647) 32-bit signed
long 263-2^{63} tot 26312^{63} - 1 64-bit signed
float 3.402×1038-3.402\times 10^{38} tot 3.402×10383.402\times 10^{38} 32-bit IEEE 754
double 1.7976×10308-1.7976\times 10^{308} tot 1.7976×103081.7976\times 10^{308} 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 methode nextDouble(). 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 34+1 34 + 1 3535
- Aftrekking 34.00.1 34.0 - 0.1 33.9 33.9
* Vermenigvuldiging 30030 300 * 30 9000 9000
/ Deling 1.0/2.0 1.0 / 2.0 0.5 0.5
% Rest bij deling 20%3 20 \% 3 2 2

Machtsverheffing

  • In Java is er een klass Math die kan gebruikt worden om machtsverheffing te doen. De methode Math.pow(a,b) kan gebruikt worden om aba^b uit te voeren. Voorbeelden:
System.out.println(Math.pow(2,3)); //Toont 8.0 System.out.println(Math.pow(4,0.5)); //Toont 2.0 System.out.println(Math.pow(2.5,2)); //Toont 6.25 System.out.println(Math.pow(2.5,-2)); //Toont 0.16

Numerieke Literals

Een literal is een constante waarde dat direct voorkomt in het programma

  • Voorbeelden van numerieke literals zijn 34 en 0.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 teken 3 dat het teken 4 voorafgaat, maar leest de waarde 34 en begrijpt ook dat het om een getal gaat.
int aantalJaar = 34; double gewicht = 0.305;
  • 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.
String tekst = "Hallo Wereld!"; System.out.println(tekst);

Evalueren van uitdrukkingen en voorrangsregels

  • Numerieke uitdrukkingen in Java kan gemakkelijk afgeleid worden vanuit de wiskundige uitdrukking. Zo is: 3+4x510(y5)(a+b+c)x+9(4x+9+xy) \frac{3+4x}{5} - \frac{10(y-5)(a+b+c)}{x} + 9(\frac{4}{x} + \frac{9+x}{y})

omgezet naar een Java uitdrukking tot:

(3 + 4 * x) / 5 - 10 * (y - 5) * (a + b + c) / x + 9 * (4 / x + (9 + x) / y)
  • 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:
    x /= 4 + 5.5*1.5;
    is equivalent met
    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.

int x = 3, y = 3; x++; // x wordt 4 y--; // y wordt 2
  • Je kan de incrementoperator (++) en decrementoperator (--) zowel voor als na de variabele plaatsen. Na de variabele (bv. i++ of i--) 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 naar float), het omgekeerde is typevernauwing (bv. van double naar int).
  • 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.
System.out.println((int)1.7); int temperatuur = 18.7; System.out.println((int)temperatuur);
  • Let op! De omzetting van reëel getal naar geheel getal, gaat gepaard met een verlies van nauwkeurigheid.

results matching ""

    No results matching ""