zichtbaarheid lokale variabele

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben pas begonnen met java, en daarom ook nieuw op dit forum ;)

Ik heb een simpele vraag m.b.t. declaratie en zichtbaarheid van een lokale variabele:
Waarom werkt onderstaande opdracht niet wanneer ik de variabelen "fizz" en "buzz" direct na "getal" declareer? Ik heb begrepen dat ze dan net als getal binnen de hele opdracht zichtbaar zijn, maar toch worden dan alleen alle getallen van 0 tot 100 getoond. Uiteraard heb ik al verschillende boeken doorgespit, en op internet gekeken. Maar blijkbaar ben ik blind voor het antwoord ;)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public void speel(){
    int getal = 0;
    
while(getal < 100){
      boolean fizz = getal > 4 && (getal % 5 == 0);
      boolean buzz = getal > 6 && (getal % 7 == 0);
      
    if(fizz == true && buzz == false){
      System.out.println("Fizz");
    }
    
      else if(buzz == true && fizz == false){
      System.out.println("Buzz");
    }
    
      else if (fizz == true && buzz == true){
      System.out.println("FizzBuzz");
    }
    
      else{
      System.out.println(getal);
    }
    getal = getal + 1; 
  }

[ Voor 9% gewijzigd door Verwijderd op 19-03-2016 09:22 ]

Beste antwoord (via Verwijderd op 19-03-2016 09:33)


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Met enkele = sla je eenmalig het resultaat vd expressie aan rechterkant op in de variabele. Als je dat buiten de loop doet, wordt dat dus niet steeds opnieuw berekend.

edit:
maar cyber zei dit al 1 tikje beknopter ;)

[ Voor 14% gewijzigd door Voutloos op 19-03-2016 09:38 . Reden: Credits ]

{signature}

Alle reacties


Acties:
  • 0 Henk 'm!

  • azerty
  • Registratie: Maart 2009
  • Laatst online: 09:51
Hmm, met
code:
1
[code][/code]
tags zou het toch wat leesbaarder zijn ;)

Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Als je de declaratie verschuift zoals die is, omdat die code dan maar 1x uitgevoerd wordt.

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
CyBeR schreef op zaterdag 19 maart 2016 @ 09:19:
Als je de declaratie verschuift zoals die is, omdat die code dan maar 1x uitgevoerd wordt.
Maar de code bijft toch uitgevoerd worden zolang getal kleiner is dan 100? In principe zou dan ook naar "fizz" en "buzz" gekeken moeten worden, want dat staat binnen de loop opdracht (en de waarden zijn zichtbaar).

Acties:
  • 0 Henk 'm!

  • azerty
  • Registratie: Maart 2009
  • Laatst online: 09:51
Verwijderd schreef op zaterdag 19 maart 2016 @ 09:27:
[...]


Maar de code bijft toch uitgevoerd worden zolang getal kleiner is dan 100? In principe zou dan ook naar "fizz" en "buzz" gekeken moeten worden, want dat staat binnen de loop opdracht (en de waarden zijn zichtbaar).
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void speel(){
        int getal = 0;
    
        while(getal < 100){
            boolean fizz = getal > 4 && (getal % 5 == 0);
            boolean buzz = getal > 6 && (getal % 7 == 0);
      
            if(fizz == true && buzz == false){
                System.out.println("Fizz");
            } else if(buzz == true && fizz == false){
                System.out.println("Buzz");
            } else if (fizz == true && buzz == true){
                System.out.println("FizzBuzz");
            } else{
                System.out.println(getal);
            }
            getal = getal + 1; 
        }
    }



Werkt gewoon bij mij hoor :?

[ Voor 16% gewijzigd door azerty op 19-03-2016 09:30 ]


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Met enkele = sla je eenmalig het resultaat vd expressie aan rechterkant op in de variabele. Als je dat buiten de loop doet, wordt dat dus niet steeds opnieuw berekend.

edit:
maar cyber zei dit al 1 tikje beknopter ;)

[ Voor 14% gewijzigd door Voutloos op 19-03-2016 09:38 . Reden: Credits ]

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
azerty schreef op zaterdag 19 maart 2016 @ 09:28:
[...]

Werkt gewoon bij mij hoor :?
Klopt, maar het gaat erom waarom de code niet werkt wanneer ik onderstaande doe.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public void speel(){
    int getal = 0;
    boolean fizz = getal > 4 && (getal % 5 == 0);
    boolean buzz = getal > 6 && (getal % 7 == 0);
    
   while(getal < 100){
           
    if(fizz == true && buzz == false){
      System.out.println("Fizz");
    }
    
      else if(buzz == true && fizz == false){
      System.out.println("Buzz");
    }
    
      else if (fizz == true && buzz == true){
      System.out.println("FizzBuzz");
    }
    
      else{
      System.out.println(getal);
    }
    getal = getal + 1; 
  }

Acties:
  • 0 Henk 'm!

  • azerty
  • Registratie: Maart 2009
  • Laatst online: 09:51
Verwijderd schreef op zaterdag 19 maart 2016 @ 09:31:
[...]


Klopt, maar het gaat erom waarom de code niet werkt wanneer ik onderstaande doe.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public void speel(){
    int getal = 0;
    boolean fizz = getal > 4 && (getal % 5 == 0);
    boolean buzz = getal > 6 && (getal % 7 == 0);
    
   while(getal < 100){
           
    if(fizz == true && buzz == false){
      System.out.println("Fizz");
    }
    
      else if(buzz == true && fizz == false){
      System.out.println("Buzz");
    }
    
      else if (fizz == true && buzz == true){
      System.out.println("FizzBuzz");
    }
    
      else{
      System.out.println(getal);
    }
    getal = getal + 1; 
  }
Voutloos vat het perfect samen ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voutloos schreef op zaterdag 19 maart 2016 @ 09:30:
Met enkele = sla je eenmalig het resultaat vd expressie aan rechterkant op in de variabele. Als je dat buiten de loop doet, wordt dat dus niet steeds opnieuw berekend.
Bedankt!!! :)

Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Verwijderd schreef op zaterdag 19 maart 2016 @ 09:27:
[...]


Maar de code bijft toch uitgevoerd worden zolang getal kleiner is dan 100? In principe zou dan ook naar "fizz" en "buzz" gekeken moeten worden, want dat staat binnen de loop opdracht (en de waarden zijn zichtbaar).
Alleen de code in de loop wordt opnieuw uitgevoerd. De code die 'fizz' en 'buzz' aanpast staat dan niet in de loop.

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • dipje2
  • Registratie: Juni 2006
  • Laatst online: 23-07 23:31
Dus je krijgt inderdaad nog steeds getallen 0 t/m 100 omdat je nog steeds een loop hebt. Daar is niks aan veranderd.

Maar als je de declaratie omhoog schuift 'bereken' je fizz en buzz maar 1x bij het begin van de loop, en daarna nooit meer.

Dus beetje uitleg bovenop het antwoord van Voutloos: Je laat 'fizz' en 'buzz' de hele tijd met rust omdat het buiten de loop staat, die veranderen dus nooit, je 'berekent' ze nooit opnieuw.

Je mag best de declaratie buiten de loop doen, maar dan moet je in de loop nog steeds wel opnieuw bepalen of fizz en buzz nu true of false zijn.

code:
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
public void speel(){
    int getal = 0;
    boolean fizz = false;
    boolean buzz = false;
    
    while(getal < 100){
        fizz = getal > 4 && (getal % 5 == 0);
        buzz = getal > 6 && (getal % 7 == 0);
        
        if(fizz == true && buzz == false){
            System.out.println("Fizz");
        }
        
        else if(buzz == true && fizz == false){
            System.out.println("Buzz");
        }
        
        else if (fizz == true && buzz == true){
            System.out.println("FizzBuzz");
        }
        
        else{
            System.out.println(getal);
        }
        getal = getal + 1; 
    }
}


Je kan dit doen omdat je bijvoorbeeld nog bij fizz en buzz wil komen na de loop (om bijvoorbeeld de laatste waardes te checken toen de loop stopte of zoiets)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Iedereen bedankt voor het reageren! Het is me duidelijk wat mijn denkfout was. Op naar de volgende opdracht;-)

Acties:
  • +2 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Nog een tip:

Java:
1
if (fizz == true && buzz == false) {

kan je ook zo schrijven:
Java:
1
if (fizz && !buzz) {

Acties:
  • 0 Henk 'm!

  • Particlebox
  • Registratie: September 2014
  • Laatst online: 12-12-2023
Ook misschien handig om te weten:

Het stukje waar je
Java:
1
getal = getal + 1;

hebt staan kan afgekort worden naar:
Java:
1
getal += 1;

of nog beter:
Java:
1
getal++;


Maar inderdaad dat de variabele niet veranderd komt doordat je ze declared maar ook assigned buiten de loop.

Om een voorbeeld te geven:
code:
1
2
3
    //int a > dit is de declaratie
    //= 10 > dit is de assignment
    int a = 10;


Wat betekent dit nu? Met een declaration maak je een variabele aan met een naampje. Er wordt een stukje geheugen gedeclareerd op je RAM waar in dit geval een Integer komt te staan. De naam 'a' verwijst naar deze plek.

Met behulp van de zogenaamde assignment operator, oftewel het '=' teken kun jij een waarde op die plek zetten. Wat er in jouw loopje moet gebeuren is dat er elke keer aan het begin een waarde moet worden gegeven aan de booleans. Als je ze buiten de loop zet doe je dit maar één keer en ook buiten de loop.

Om even een simpel voorbeeld te geven:

code:
1
2
3
4
5
6
7
8
9
    int a = 0;
    int b = 0;

    for(int i = 0; i <= 10; ++i) {
        b = i; //hier wordt de waarde van b veranderd maar a niet
    }

    //a is nog steeds 0
    //b is 10


Wat er feitelijk gebeurd met jouw programma is hetzelfde. Zoals aangegeven moet de assignment gedaan worden in de loop om de nieuwe waarde van de variabele te bepalen. In het voorbeeld wordt alleen b veranderd in de loop. Let op dat je niet opnieuw int voor b hoeft te zetten, dat komt omdat b al bestaat en er bekend is dat het een int is, hij is al 'declared' of 'gedeclareerd'.

Kortom de code wordt als volgt:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static void speel(){
        int getal = 0;
        boolean fizz = false;
        boolean buzz = false;
    
        while(getal < 100){
            fizz = getal > 4 && (getal % 5 == 0);
            buzz = getal > 6 && (getal % 7 == 0);
      
            if(fizz && !buzz){
                System.out.println("Fizz");
            } else if(buzz && !fizz){
                System.out.println("Buzz");
            } else if (fizz && buzz){
                System.out.println("FizzBuzz");
            } else{
                System.out.println(getal);
            }
            getal++; 
        }
    }




Nu komt wat extra uitleg voor als je het interessant vindt

Zoals aangegeven kun je ook de if functie aanpassen. Maar wat is nu het verschil tussen bijvoorbeeld if(fizz == false) if if(fizz). Hieronder een voorbeeld:

code:
1
2
if(fizz == true) //als fizz waar is
if(fizz) //als fizz waar is


De compiler weet dat je met if(fizz) bedoelt wat erboven staat. Dat betekend dus dat je de '== true' kan weglaten.

Maar wat is nu die uitroepteken? Dat is de zogenaamde logical complement operator. Deze draait de waarde om (op bit-niveau maar dat is een heel ander verhaal). Als fizz dus false is dan is !fizz true. Dat klinkt wazig, dus daarom maar even een voorbeeld:

code:
1
2
   if(fizz == false) //als fizz gelijk is aan false
   if(!fizz) //als fizz niet gelijk aan true is


Zoals je ziet zorgt het voor een stuk kortere code.
Er zit wel verschil tussen de manier waarop het 'omschreven' staat en er zit dus ook meer achter. Uitzoeken wat je er voor de rest mee kan laat ik aan jou over als oefening. :+

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Geweldig wanneer mensen de moeite nemen om zo uitgebreid te reageren! Ik ga er verder mee stoeien;-)
Pagina: 1