H6 Getallen

Leerdoelen

Na het bestuderen van dit hoofdstuk wordt van je verwacht dat je:

  • weet hoe je in Java variabelen declareert en initialiseert
  • weet wat de primitieven int, long double en float zijn
  • hoe je dezen naar een String kunt converteren om ze bijvoorbeeld op een scherm af te drukken
  • de verschillende operatoren in rekenkundige bewerkingen kent
  • hoe je unaire operatoren gebruikt
  • wanneer en hoe je bij conversie van types typecasting moet toepassen
  • hoe je in Java variabelen (betekenisvolle) namen geeft

Praktijk

int en long

Voor gehele getallen kun je het beste variabelen gebruiken van het type int of long. De keuze tussen de twee typen hangt af van de grootst mogelijke waarde die de variabele moet kunnen bevatten. Over het algemeen zal een int volstaan. Wel moet je ervoor oppassen dat de waarden niet buiten de begin- en eindwaarde komen, want dan krijg je onjuiste en onvoorspelbare resultaten. Als een variabele van het type int een waarde hoger dan 2147483647 krijgt, zal dat vaak resulteren in een negatieve waarde en niet in een positieve waarde.

//Voorbeeld 6.1

import java.awt.*;
import java.applet.*;


public class Reken extends Applet {
    int a;
    int b;
    int c;
    int uitkomst;

    public void init() {
        a = 7;
        b = 8;
        c = 3;
        uitkomst = (a + b) / c;
    }

    public void paint(Graphics g) {
        g.drawString("De uitkomst is: " + uitkomst, 20, 20);
    }
}

Op het scherm komt te staan: De uitkomst is 5

Eerst worden de variabelen "gedeclareerd"

int a;
int b;
int c;
int uitkomst;

Er had ook kunnen staan:

int a, b, c, uitkomst;

In de methode init() worden aan de variabelen waarden toegekend. Dat wordt initialiseren genoemd. Dat moet altijd gebeuren, want anders weet je niet welke waarde in een variabele staat. Dat kan namelijk een waarde zijn van een vorig programma die toevallig dezelfde geheugencellen heeft gebruikt en hoeft dus niet per se 0 te zijn:

a = 7;
b = 8;
c = 3;
uitkomst = (a + b) / c;

Deze opdrachten worden toekenningen of assignments genoemd en het "="-teken heet de assignment-operator.

Vervolgens wordt er een berekening gedaan en de uitkomst van die berekening wordt opgeslagen in de variabele uitkomst. Eerst worden de waarden van a en b bij elkaar opgeteld en vervolgens wordt de som van a en b gedeeld door de waarde in c.

Conversie naar string

Zoals uitgelegd is in hoofdstuk 5, kunnen variabelen van het type int niet naar het scherm geschreven worden. De conversie van int naar string vindt in de volgende regel plaats:

g.drawString("De uitkomst is: " + uitkomst, 20, 20);

"De uitkomst is " en uitkomst zijn twee verschillende typen: namelijk een string en een int. In dit geval zal Java uitkomst automatisch naar een string converteren en achter "De uitkomst is: " plakken. Een double (decimaal getal) kun je op dezelfde manier converteren naar een string. Als alleen het getal in het venster zichtbaar moet worden, dan gebruik je een lege string:

g.drawString("" + uitkomst, 20, 20);

Rekenkundige bewerkingen

Operator Bewerking
* Vermenigvuldigen
/ Delen
% Moduleren
+ Optellen
- Aftrekken

In de tabel zie je de operator staan en de bewerking die erbij hoort. Bij delen moet je er rekening mee houden dat een int door een int delen betekent dat er een int wordt teruggegeven. Dat wil zeggen dat 20 / 6 als uitkomst heeft 3 en niet 3,33333333. 20 % 6 heeft als uitkomst 2, namelijk de rest van de deling 20 / 6.
De prioriteit bepaalt de volgorde van de rekenkundige bewerkingen die worden uitgevoerd. Als een operator een hogere prioriteit heeft, dan wordt de rekenkundige bewerking eerder uitgevoerd. Als operatoren een gelijke prioriteit hebben, dan wordt de berekening van links naar rechts uitgevoerd. De operatoren *, /, % hebben een hogere prioriteit dan de operatoren + en -. De operatoren *, /, % hebben een gelijke prioriteit evenals de operatoren + en -. Door het gebruik van ronde haken kun je een andere prioriteit geven aan een rekenkundige bewerking.

Verder zijn er de volgende unaire operatoren. Unair wil zeggen dat zij op één variabele van toepassing zijn. In onderstaande tabel wordt dit geïllustreerd. Uitgangspunt is dat de a een variabele is van het type int en een waarde van 35 heeft.

Operator Voorbeeld Betekenis Uitkomst
+= a += 30 a = a + 30 65
-= a -= 30 a = a - 30 5
*= a *= 30 a = a * 30 1050
/= a /= 30 a = a / 30 1
%= a %= 30 a = a % 30 5
++ a++ a = a + 1
a += 1
36
-- a-- a = a - 1
a -= 1
34

De laatste twee operatoren worden veelvuldig gebruikt, meestal als er sprake is van een teller.

// Voorbeeld 6.2

import java.awt.*;
import java.applet.*;


public class Teller extends Applet {
    int teller;
	
    public void init() {
        teller = 0;
    }

    public void paint(Graphics g) {
        teller++;
        g.drawString("Scherm is " + teller + 
            " keer ververst.", 50, 60 );
    }
}

In dit programma wordt een teller als een int gedeclareerd:

int teller;
In init() wordt teller geïnitialiseerd:
teller = 0;
In paint() wordt teller met 1 opgehoogd:
teller++;

En in de volgende regel wordt teller op het scherm gezet met tekst erbij. Het programma telt het aantal keren dat het venster van de applet getekend wordt. Anders gezegd: Het programma telt het aantal keren dat de methode paint() wordt aangeroepen en uitgevoerd.

double en float

Double en float zijn primitieve typen die gebruikt worden voor gebroken getallen. Omdat float een precisie heeft van hooguit 7 cijfers en double een precisie heeft van 15 cijfers, gaat de voorkeur uit naar double. Bij float leidt de lagere precisie al snel tot afkappingen en dat heeft onnauwkeurigheid tot gevolg. Net zoals bij integers kun je bij doubles de operatoren *, /, %, +, - gebruiken. Voor deze operatoren gelden dezelfde prioriteiten als bij ints.

//Voorbeeld 6.3

import java.awt.*;
import java.applet.*;


public class Reken extends Applet {
    double a, b, c, uitkomst;
	
	
    public void init() {
        a = 8;
        b = 8;
        c = 3;
        uitkomst = (a + b) / c;
    }

    public void paint(Graphics g) {
        g.drawString("De uitkomst is: " + uitkomst, 20, 20);
    }
}

Op het scherm komt te staan: De uitkomst is: 5,333333333333333. Vergelijk dat maar eens met voorbeeld 6.1.

Conversie

De conversie van een int naar een double gaat redelijk makkelijk, omdat een double een groter bereik heeft dan een int. De int 8 kan zonder informatieverlies worden geconverteerd naar double 8.0. De volgende code wordt daarom probleemloos door de compiler geaccepteerd.

//Dit gaat zonder meer goed
int geheel;
double gebroken;
gebroken = geheel;

Bij de conversie van double naar int kan wel informatie verloren gaan. De conversie van 8.3 naar een int zou immers 8 opleveren. Dit wordt niet zonder tegensputteren geaccepteerd.

 //Dit levert een foutmelding op
int geheel;
double gebroken;
geheel = gebroken;
 

De volgende foutmelding krijg je te zien:
found: double
required: int

Om toch conversie van double naar int af te dwingen moet er "typecasting" plaatsvinden. Hiermee zegt de programmeur als het ware tegen de compiler dat hij zich er van bewust is dat er informatie verloren kan gaan, maar dat hij dat accepteert.

//Typecasting
int geheel;
double gebroken;
geheel = (int) gebroken;
 

De double die achter (int) staat, beschouwt de compiler nu als een geheel getal. Dat betekent dat de compiler de cijfers achter de decimale punt weghaalt. Er kan dus sprake zijn van informatieverlies.

Namen van variabelen

In de voorbeelden hierboven zijn eenvoudige nietszeggende namen gebruikt: a of b. Het is verstandig in de broncode van een programma de namen van variabelen betekenisvolle namen te geven, zodat je meteen kunt zien wat de inhoud van een variabele is. Zo is de naam gemiddelde een betekenisvolle naam want aan de naam zie je dat de inhoud van de variabele een gemiddelde is. Geef variabelen dus logische namen.

Namen van variabelen mogen bestaan uit kleine letters, hoofdletters, cijfers en de underscore. Namen van variabelen mogen echter nooit met een cijfer beginnen. Verder mogen er in namen van variabelen geen leestekens voorkomen. Begin de namen van variabelen altijd met een kleine letter en begin eventueel een tweede of volgend woord met een hoofdletter. Bijvoorbeeld:
gemiddeldCijfer.

Vragen

1. Waarom is initialiseren van variabelen noodzakelijk?

2. Waarom is er typecasting noodzakelijk bij de conversie van een double naar een int?

//Voorbeeld 6.4

import java.awt.*;
import java.applet.*;


public class Reken extends Applet {
    int a, b, c;
    double uitkomst;
	
	
    public void init() {
        a = 8;
        b = 8;
        c = 3;
        uitkomst = (a + b) / c;
    }

    public void paint(Graphics g) {
        g.drawString("De uitkomst is: " + uitkomst, 20, 20);
    }
}

3. Wat is de uitvoer van dit programma? Geef een verklaring.

4. In de regel uitkomst = (a + b) / c; laat je de ronde haken weg. De regel ziet er dan als volgt uit:

uitkomst = a + b / c;

5. Wat is de uitvoer van dit programma? Geef een verklaring.

Opdracht 6.1

Met z'n vieren (Jan, Ali, Jeannette en jij) hebben jullie een karwei verricht en daarmee 113 euro verdiend. Schrijf een applet waarin je een berekening maakt om het geld zo eerlijk mogelijk te verdelen. In het venster van de applet komen de vier namen onder elkaar te staan met daarachter het bedrag dat een ieder krijgt.

Opdracht 6.2

Schrijf een applet, waarin berekend wordt hoeveel seconden er in een uur, dag en jaar gaan en de uitkomst van de berekening in het venster van de applet toont.

Opdracht 6.3

Schrijf een applet waarin je twee ints met positieve waarden bij elkaar optelt en er een negatieve int uit komt.

Praktijkopdracht

Een cursist heeft drie cijfers behaald: 5,9; 6.3; 6,9.
Schrijf een applet in Java, waarin van de bovenstaande cijfers het gemiddelde wordt uitgerekend en dat gemiddelde met één decimaal op het scherm wordt getoond. Op het scherm komt te staan: Het gemiddelde is: 6.3. Het gemiddelde mag afgekapt worden en hoeft niet afgerond te worden. Als je klaar bent, lever je de broncode in bij je docent.

Aanwijzing: Als je het gemiddelde hebt uitgerekend, komt er te staan 6.366666666... Door gebruik te maken van de eigenschappen van double en int kun je afkappen. Je moet het gemiddelde met 10 vermenigvuldigen en daarna converteren naar een int. Vervolgens terugconverteren naar een double en door 10 delen.