Toon posts:

[JAVA] Hoe te nesten?

Pagina: 1
Acties:
  • 60 views sinds 30-01-2008

Verwijderd

Topicstarter
Hoi allen,

Ik ben bezig een simpel rekenmachientje te maken in JAVA. Nu schijn ik problemen te hebben met wat wanneer wordt uitgevoerd. Oftewel, wanneer ik een 'if' (conditie?) inbouw kan ik dan meerdere gevolgen opnemen en vervolgens verder gaan naar de volgende 'if', of dien ik de conditie voor ieder gevolg afzonderlijk aan te geven?

Bijgevoegd mijn brouwsel tot op heden. Indien mogelijk een reactie op wat ik hier fout doe...... Niet allemaal tegelijk ;)

Dank!!!!!

/*
* Calculator.java
*
* Created on 14 september 2004, 20:21
*/
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

/**
*
* @author DrDwarf
*/
public class Calculator extends Applet implements ActionListener {

private Button x1, x2, x3, x4, x5, x6, x7, x8, x9, x0, xClear, xPlus, xMinus, xIs;
private int memory = 0;
private int value = 0;
private int sign = 1;

public void init() {

x1 = new Button("1");
add(x1);
x1.addActionListener(this);

x2 = new Button("2");
add(x2);
x2.addActionListener(this);

x3 = new Button("3");
add(x3);
x3.addActionListener(this);

x4 = new Button("4");
add(x4);
x4.addActionListener(this);

x5 = new Button("5");
add(x5);
x5.addActionListener(this);

x6 = new Button("6");
add(x6);
x1.addActionListener(this);

x7 = new Button("7");
add(x7);
x7.addActionListener(this);

x8 = new Button("8");
add(x8);
x8.addActionListener(this);

x9 = new Button("9");
add(x9);
x9.addActionListener(this);

x0 = new Button("0");
add(x0);
x0.addActionListener(this);

xClear = new Button("Clear");
add(xClear);
xClear.addActionListener(this);

xPlus = new Button("+");
add(xPlus);
xPlus.addActionListener(this);

xMinus = new Button("-");
add(xMinus);
xMinus.addActionListener(this);

xIs = new Button("=");
add(xIs);
xIs.addActionListener(this);
}

public void actionPerformed(ActionEvent e) {
if (e.getSource() == x1)
value = value * 10 + 1;

if (e.getSource() == x2)
value = value * 10 + 2;

if (e.getSource() == x3)
value = value * 10 + 3;

if (e.getSource() == x4)
value = value * 10 + 4;

if (e.getSource() == x5)
value = value * 10 + 5;

if (e.getSource() == x6)
value = value * 10 + 6;

if (e.getSource() == x7)
value = value * 10 + 7;

if (e.getSource() == x8)
value = value * 10 + 8;

if (e.getSource() == x9)
value = value * 10 + 9;

if (e.getSource() == x0)
value = value * 10;

if (e.getSource() == xPlus)
sign = 1;
memory = value;
value = 0;

if (e.getSource() == xMinus)
sign = -1;
memory = value;
value = 0;

if (e.getSource() == xIs)
value = value * sign;
value = value + memory;

if (e.getSource() == xClear)
memory = 0;
value = 0;

repaint();
}

public void paint (Graphics g) {
g.drawString (""+value, 40, 150);
}
}

Verwijderd

zet even [ code=java ] voor je code en [ /code ] aan het eind (maar dan zonder die spaties tussen blokhaak en tekst.
Oftewel, wanneer ik een 'if' (conditie?) inbouw kan ik dan meerdere gevolgen opnemen en vervolgens verder gaan naar de volgende 'if', of dien ik de conditie voor ieder gevolg afzonderlijk aan te geven?
Het if-statement is als volgt:
Java:
1
2
if(conditie=true) 
   runStatement;

Heb je echter meerdere statements, moet je ze met pijlhaken tot één statement maken:
Java:
1
2
3
4
5
6
if(conditie=true){
  runStatement1;
  runStatement2;
  runStatement3;
  runStatementx;
}

Omdat er nu pijlhaken {} om je statements staan, kun je ze zien als één groot statement en is het dus in feite weer:
Java:
1
2
if(conditie=true)
   alDieStatementsAlsEen

Is dat wat je bedoelde?

[ Voor 85% gewijzigd door Verwijderd op 14-09-2004 22:28 ]


Verwijderd

Stukje van jouw voorbeeld erbij ter verduidelijking
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//begin if-statement
if (e.getSource() == x0)
  value = value * 10;
//eind if-statement

//begin if-statement
if (e.getSource() == xPlus)
  sign = 1;
//eind if-statement
memory = value;
value = 0;


/*****laatste nog een keer goed******/
 //begin if-statement
if (e.getSource() == xPlus){
  sign = 1;
  memory = value;
  value = 0;
}
//eind if-statement


(tis wel erg basic allemaal, volgens mij niet helemaal binnen de doelstelling van dit forum, next time beetje meer zelf uitzoeken en wat geavanceerdere/interessantere dingen voor tweakers overhouden :P )
Desalnietemin, wees welkom :)

[ Voor 12% gewijzigd door Verwijderd op 14-09-2004 22:34 ]


  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 21-05 22:50
Verwijderd schreef op 14 september 2004 @ 22:23:
Het if-statement is als volgt:
Java:
1
2
if(conditie=true) 
   runStatement;
Uhm, de boolean evaluation is toch met '==' ipv '=', Of ben ik nou in de bonen?
Java:
1
2
if(conditie == true) 
   runStatement;

Anders heb je een boolean assignment, en dat wil je niet op die plek hebben tenzij je weet wat je doet...

[ Voor 17% gewijzigd door DaCoTa op 14-09-2004 22:47 ]


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Err, The_Tzar, dat is niet wat bedoeld wordt met nesting lijkt me.

In jouw geval maakt het niet uit of je nou if-statements gaat nesten door middel van if{}else if{} else of dat je deze manier blijft gebruiken. Dit omdat e.getSource() altijd alleen zal matchen op één van jouw if-statements en er dus geen onbedoelde if-statements uitgevoerd gaan worden omdat de methode al had moeten jumpen. Maar echt netjes blijft het niet.

Om het in jouw geval alleen wat op te knappen kun je enkele dingen doen:
* gebruik een switch
* gebruik losse ActionListener objecten

Echter antwoord gevend op je vraag eigenlijk; matchen op niet uitsluitende tests doe je als volgt
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if( isNull( l_var) ) {

   if( NULL_ALLOWED ) {

      // doe iets
    } else {

      // doet iets anders
   }
} else { 

   if( l_var == CONS_1 ){ someThing(); }
   else if( l_var == CONS_2){ someThingElse(); }
   else{ bla(); }
}

See http://java.sun.com/docs/...java/nutsandbolts/if.html for more info
DaCoTa schreef op 14 september 2004 @ 22:46:
[...]

Uhm, de boolean evaluation is toch met '==' ipv '=', Of ben ik nou in de bonen?
Java:
1
2
if(conditie == true) 
   runStatement;

Anders heb je een boolean assignment, en dat wil je niet op die plek hebben tenzij je weet wat je doet...
Java:
1
 if( conditie )
voldoet al

[ Voor 15% gewijzigd door Glimi op 14-09-2004 22:48 ]


Verwijderd

DaCoTa schreef op 14 september 2004 @ 22:46:
[...]

Uhm, de boolean evaluation is toch met '==' ipv '=', Of ben ik nou in de bonen?
Java:
1
2
if(conditie == true) 
   runStatement;

Anders heb je een boolean assignment, en dat wil je niet op die plek hebben tenzij je weet wat je doet...
Je hebt helemaal gelijk, even niet opgelet (net vakantie gehad hè :) ).
Maarja, bij true hoef je het hele == true er niet achter te zetten, dus het stond er toch al voor de aardigheid :P

@Glimi
Ik weet dat wat ik zei geen nesting was, maar kijkend naar de code van de TS en de vraag proberen te begrijpen, nam ik aan dat de topicstarter datgene bedoelde te vragen wat ik uitlegde. Als ik het mis had heeft hij nu zijn antwoord bij jou :)
edit:
elseif is op zich ook wel wat netter dan if if if inderdaad, dus die kan hij sowieso meenemen

[ Voor 32% gewijzigd door Verwijderd op 14-09-2004 22:53 ]


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Helaas kan je in Java alleen switchen op int's en niet op objecten, anders had ik altijd switches gebruikt voor event handling.

"Beauty is the ultimate defence against complexity." David Gelernter


  • momania
  • Registratie: Mei 2000
  • Laatst online: 21-05 06:42

momania

iPhone 30! Bam!

Macros schreef op 14 september 2004 @ 23:15:
Helaas kan je in Java alleen switchen op int's en niet op objecten, anders had ik altijd switches gebruikt voor event handling.
Dan maak je wat constants ints aan die je als String opgeeft als actioncommand van elke button.

Dan kan je in je actionPerformed gewoon de actionCommand parsen en toch de switch gebruiken :)

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
interface Contants {
  
  public static int BUTTON_1 = 1;
  public static int BUTTON_2 = 2;
  public static int BUTTON_3 = 3;
  public static int BUTTON_4 = 4;
  public static int BUTTON_MULTIPLY = 4;
  public static int BUTTON_ETC = 5;
  // enz...
}

class Bla implements Constants, ActionListener {
  
  Button but_1 = new Button("1");
  but_1.setActionCommand(new String(BUTTON_1));

  public void actionPerformed(ActionEvent e) {

    int command = Integer.parseInt(e.getActionCommand());
    
    switch(command) {

      case BUTTON_1:
        // doe iets
        break; 
      case BUTTON_2:
        // doe iets
        break; 
      default:
        // doe iets
    }
  }
}


Mooier blijft natuurlijk je verschillende mogenlijke acties aparte event handlers te geven :)


Maar ik denk dat de topicstarter eerst wel eens een goed boek over java mag openslaan voordat hij met GUI zaken bezig moet gaan. Op deze manier leer je de taal niet...

Neem je whisky mee, is het te weinig... *zucht*


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Macros schreef op 14 september 2004 @ 23:15:
Helaas kan je in Java alleen switchen op int's en niet op objecten, anders had ik altijd switches gebruikt voor event handling.
Eventuele omweg met hashing is mogelijk voor een switch, maar niet echt lekker in dit geval :)
Maar om nou te zeggen dat dit overzichtelijker zou worden met een switch? Nah, het blijft een hoop data van losstaande acties. Waarom niet gewoon mooi los in een Action of ActionListener stoppen

Verwijderd

En bouw meteen even een final state machine en zet die uitgetekend op papier zodat je geen spaghettie code krijgt, en omdat een rekenmachine een gedefineerde taal kent. (Grammatica)

Als je nu bv 3+3*(5-9) doet wat zegt je programma dan, kent ie al haakjes...

zodra die de 3 heeft gezien ziet ie de + operator, dan moet ie naar de + state gaan, vanuit de + state kan ie weer een getal krijgen, of een operator, als het zoals in dit geval een getal is, gaat ie weer naar de getallen state, vanuit de getallen state kan ie weer een operator zoals die * krijgen en geen getal. enz...

[ Voor 58% gewijzigd door Verwijderd op 14-09-2004 23:52 ]


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Verwijderd schreef op 14 september 2004 @ 23:49:
En bouw meteen even een final state machine en zet die uitgetekend op papier zodat je geen spaghettie code krijgt, en omdat een rekenmachine een gedefineerde taal kent. (Grammatica)

Als je nu bv 3+3*(5-9) doet wat zegt je programma dan, kent ie al haakjes...
Zou dat niet een beetje overkill/harsh zijn voor een programmeur welke al moeite heeft met het nesten van if condities?

Verwijderd

Glimi schreef op 14 september 2004 @ 23:51:
[...]

Zou dat niet een beetje overkill/harsh zijn voor een programmeur welke al moeite heeft met het nesten van if condities?
Neeh, hoe eenvoudig een rekenmachine ook lijkt, als je het niet aanpakt met een final state machine, heb je iets wat op een rekenmachine lijkt, maar het niet is.

Een rekenmachine moet geen dingen geven als 3+3*(4+9)= 6*(4+9) waarbij ik alleen het begin 3+3 heb omgezet in 6.

In dat geval is een rekenmachine maken als geheel overkill en hebben we allebei gelijk.

[ Voor 9% gewijzigd door Verwijderd op 14-09-2004 23:55 ]


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

DrDwarf: Welkom op GOT.

Lees voordat je een topic opent even onze FAQ door en dan vooral de regels aangaande hoe je een goede topic start.

Helaas voldoet jouw topic dus niet aan de regels en moet ik daardoor een slotje op je topic zetten, probeer de volgende keer als je een vraag hebt de regels nauwkeuriger na te leven..

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR

Pagina: 1

Dit topic is gesloten.