Rekenen met hele getallen |
Dit programma berekent de oppervlakte van een rechthoek uit de gegeven lengte en breedte
// Dit programma rekent het oppervlak uit van een ingevoerde lengte en breedte
// Oppervlak.java
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
public class Oppervlak extends Applet implements ActionListener {
int lengte, breedte;
int oppervlak;
Label vraagLengte, vraagBreedte;
TextField invoerLengte, invoerBreedte;
// Plaats de componenten
public void init() {
// Stap1 creatie van de componenten
vraagLengte = new Label( "Geef de lengte: " );
vraagBreedte = new Label( "Geef de breedte: " );
invoerLengte = new TextField( 10 );
invoerBreedte = new TextField( 10 );
// Stap2: aanmelden bij de layoutmanager
add( vraagLengte );
add( invoerLengte );
add( vraagBreedte);
add( invoerBreedte );
// Stap3: als breedte is ingevoerd wordt een event gegenereerd
invoerBreedte.addActionListener(this);
}
// Verwerk de invoer in het invoervelden
public void actionPerformed( ActionEvent e) {
// Stap4 en 5: lezen en converteren
lengte = Integer.parseInt( invoerLengte.getText() );
breedte = Integer.parseInt( invoerBreedte.getText() );
// Stap6 aanroepen van de paint methode
repaint();
}
public void paint(Graphics g) {
// Stap7: de vermenigvuldiging
oppervlak = lengte * breedte;
// Stap8: het afdrukken van het resultaat
g.drawString ("De oppervlakte is: " + oppervlak, 60, 80);
}
}
|
de deeltaken
Een korte analyse leert ons dat we de uit te voeren taak
kunnen verdelen in drie deeltaken.
Deeltaak 1 kunnen we nog verder opdelen (we noemen dat 'verfijnen') in de deeltaken. Er ontstaan dan de volgende programmastappen:
stap1 In de init methode wordt geheugen gealloceerd voor de componenten Label en TextField.
stap2: Met add worden deze componenten toegevoegd aan de Layoutmanager.
stap3: Alleen het invoerveld van de breedte wordt verbonden met de ActionListener, zodat pas na het invoeren van de breedte het oppervlak berekend wordt.
De actionPerformed methode
stap4: Hier worden de TextField's uitgelezen met getText.
stap5: De verkregen Strings worden geconverteerd naar integers. Hier kan op een vreemde manier iets mis gaan. Als bij één van de textFields geen getal wordt ingevoerd, maar niets of een willekeurige tekst. Dan wordt er een NumberFormatException geworpen. Dit heeft als gevolg dat het programma uit zijn huidige verloop springt naar een exception handler. Omdat deze niet voorhanden is wordt alleen de huidige methode verlaten zonder dat de verder instructies worden uitgevoerd. Dus in dit geval wordt repaint niet uitgevoerd.
stap6: De repaint methode roept de paint methode aan opdat het berekende oppervlak op het scherm wordt afgedrukt.
De paint methode
stap7: In de paint methode wordt de oppervlak berekent. oppervlak = lengte * breedte;
stap8: In drawString zien we hoe twee
tekststring worden samengevoegd met het + teken. De integer
oppervlak wordt impliciet geconverteerd naar een String door
het + teken, die hier twee Strings samenvoegt.
De variabele oppervlak hadden we niet nodig gehad als de
vermenigvuldiging van lengte en breedte als expressie in de
drawString methode had gestaan.
g.drawString ("De oppervlakte is: " + lengte * breedte, 60, 80);
Er zijn hier geen haakjes nodig omdat het sterretje een hoger prioriteit dan het + teken heeft.
Hint: Een mogelijke fout
Als er had gestaan een plusteken + voor een optelling in
plaats van een sterretje. * voor een vermenigvuldiging
g.drawString ("De oppervlakte is: " + lengte + breedte, 60, 80);
Dan had het resultaat geen optellen gegeven, maar het plus-teken had de drie strings achter elkaar geschreven. Bijvoorbeeld was de lengte 3 en de breedte 4, dan was het afgedrukte resultaat: De oppervlakte is: 34
Dit is te voorkomen door haakjes rondom de echte optelling te zetten
g.drawString ("De oppervlakte is: " + (lengte + breedte), 60, 80);