[Java] loopjes / Arrays werken niet goed?!

Pagina: 1
Acties:

  • timmie1
  • Registratie: Juni 2008
  • Laatst online: 10:03
Ik ben als beginnende programmeur begonnen met oefenen met Java.
Ik heb momenteel een klein en simpel programmaatje geschreven om 2 dobbelstenen te simuleren.
Dat ziet er zo uit(let aub niet op de amateuristische manier van bouwen :+):

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
//import java.math.*;
//import java.awt.*;

public class MainClass {
    // De daadwerkelijke resultaatarray
    static double[] dobbelresultarray1;
    //Hoeveel keren ogen 2 t/m 12 gegooid zijn
    static double[] aantalKerenOgen;

    // De 'werkende' methode
    public static void main(String[] args) {

        // 2 Dobbelstenen maken
        Dobbelsteen dobbelsteen1 = new Dobbelsteen();
        Dobbelsteen dobbelsteen2 = new Dobbelsteen();
        // aantal keer gooien, moet user later kunnen invoeren(input)
        int y = 10;
        // een integer voor de 'if(x == y)'
        // int z = 0; -> niet gebruikt
        for (int x = 0; x < y; x++) {
            //Dobbelstenen gooien
            double dob1 = dobbelsteen1.getDobbelsteenOgen();
            System.out.println("dobbelsteen1 heeft " + dob1);
            double dob2 = dobbelsteen2.getDobbelsteenOgen();
            System.out.println("dobbelsteen2 heeft " + dob2);
            //Aantal gegooide ogen van dobbelsteen 1 en 2 bijelkaar optellen
            double dobTotaal = dob2 + dob1;
            //Gooi som van dobbelsteen1+2 in een Array.
            dobbelresultarray1 = new double[y];
            dobbelresultarray1[x] = dobTotaal;
            System.out.println("Het aantal ogen totaal is :" + dobTotaal);
            
            aantalKerenOgen = new double[11];
            aantalKerenOgen[0] = 0; // 2 ogen
            aantalKerenOgen[1] = 0; // 3 ogen
            aantalKerenOgen[2] = 0; // 4 ogen
            aantalKerenOgen[3] = 0; // 5 ogen
            aantalKerenOgen[4] = 0; // 6 ogen
            aantalKerenOgen[5] = 0; // 7 ogen
            aantalKerenOgen[6] = 0; // 8 ogen
            aantalKerenOgen[7] = 0; // 9 ogen
            aantalKerenOgen[8] = 0; // 10 ogen
            aantalKerenOgen[9] = 0; // 11 ogen
            aantalKerenOgen[10] = 0; // 12 ogen
            
            //Zolang x(loop-variabele) niet bij y(aantal gewilde keren gooien-variabele) is, 
            //gooi uitkomst in juiste vakje van Array(if-statements)
            if (x < y) {
                for (int i = 0; i < dobbelresultarray1.length; i++) {
                    

                    if (dobbelresultarray1[i] == 2) {
                        aantalKerenOgen[0] = aantalKerenOgen[0] + 1;
                    } else if (dobbelresultarray1[i] == 3) {
                        aantalKerenOgen[0] = aantalKerenOgen[1] + 1;
                    } else if (dobbelresultarray1[i] == 4) {
                        aantalKerenOgen[0] = aantalKerenOgen[2] + 1;
                    } else if (dobbelresultarray1[i] == 5) {
                        aantalKerenOgen[0] = aantalKerenOgen[3] + 1;
                    } else if (dobbelresultarray1[i] == 6) {
                        aantalKerenOgen[0] = aantalKerenOgen[4] + 1;
                    } else if (dobbelresultarray1[i] == 7) {
                        aantalKerenOgen[0] = aantalKerenOgen[5] + 1;
                    } else if (dobbelresultarray1[i] == 8) {
                        aantalKerenOgen[0] = aantalKerenOgen[6] + 1;
                    } else if (dobbelresultarray1[i] == 9) {
                        aantalKerenOgen[0] = aantalKerenOgen[7] + 1;
                    } else if (dobbelresultarray1[i] == 10) {
                        aantalKerenOgen[0] = aantalKerenOgen[8] + 1;
                    } else if (dobbelresultarray1[i] == 11) {
                        aantalKerenOgen[0] = aantalKerenOgen[9] + 1;
                    } else if (dobbelresultarray1[i] == 12) {
                        aantalKerenOgen[0] = aantalKerenOgen[10] + 1;
                    }
                    
                    //Een samenvatting printen; hoeveel is er van elk mogelijke aantal ogen gegooid?
                    else if (dobbelresultarray1.length == i) {
                        System.out.println("Resultatentabel");
                        System.out.println("Aantal keren 2 ogen: "
                                + aantalKerenOgen[0]);
                        System.out.println("Aantal keren 3 ogen: "
                                + aantalKerenOgen[1]);
                        System.out.println("Aantal keren 4 ogen: "
                                + aantalKerenOgen[2]);
                        System.out.println("Aantal keren 5 ogen: "
                                + aantalKerenOgen[3]);
                        System.out.println("Aantal keren 6 ogen: "
                                + aantalKerenOgen[4]);
                        System.out.println("Aantal keren 7 ogen: "
                                + aantalKerenOgen[5]);
                        System.out.println("Aantal keren 8 ogen: "
                                + aantalKerenOgen[6]);
                        System.out.println("Aantal keren 9 ogen: "
                                + aantalKerenOgen[7]);
                        System.out.println("Aantal keren 10 ogen: "
                                + aantalKerenOgen[8]);
                        System.out.println("Aantal keren 11 ogen: "
                                + aantalKerenOgen[9]);
                        System.out.println("Aantal keren 12 ogen: "
                                + aantalKerenOgen[10]);
                    }
                    
                }

            }

        }

    }
}


Als antwoord krijg ik keurig in de console terug:

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
28
29
30
dobbelsteen1 heeft 1.0
dobbelsteen2 heeft 6.0
Het aantal ogen totaal is :7.0
dobbelsteen1 heeft 1.0
dobbelsteen2 heeft 1.0
Het aantal ogen totaal is :2.0
dobbelsteen1 heeft 6.0
dobbelsteen2 heeft 1.0
Het aantal ogen totaal is :7.0
dobbelsteen1 heeft 4.0
dobbelsteen2 heeft 6.0
Het aantal ogen totaal is :10.0
dobbelsteen1 heeft 1.0
dobbelsteen2 heeft 6.0
Het aantal ogen totaal is :7.0
dobbelsteen1 heeft 1.0
dobbelsteen2 heeft 4.0
Het aantal ogen totaal is :5.0
dobbelsteen1 heeft 5.0
dobbelsteen2 heeft 5.0
Het aantal ogen totaal is :10.0
dobbelsteen1 heeft 3.0
dobbelsteen2 heeft 6.0
Het aantal ogen totaal is :9.0
dobbelsteen1 heeft 5.0
dobbelsteen2 heeft 3.0
Het aantal ogen totaal is :8.0
dobbelsteen1 heeft 3.0
dobbelsteen2 heeft 5.0
Het aantal ogen totaal is :8.0


Het is echter ook de bedoeling dat hij die "Het aantal ogen totaal is :10.0"(die 10.0 alleen) in de Array1 stopt, het aantal keren 2 t/m 12 ogen telt uit desbetreffende array1 en die totalen vervolgens in een nieuwe Array2 stopt. Vervolgens heb ik geprobeerd om een kleine samenvatting(bestaande uit String + resultaat uit Array2) te printen, hij doet dat echter allemaal niet.

Ik zie niet meer wat het probleem is en Eclipse geeft geen Syntax-errors. Nu heb ik uit een eerder project geleerd dat het verstandig is om anderen jouw code te laten lezen, zij zien sneller fouten. Bij deze dus: Zou iemand een tip/hint/whatever kunnen geven over wat ik verkeerd heb gedaan? De frustratiemeter loopt momenteel erg op :9
Alvast vriendelijk bedankt!

Spiegeltje, spiegeltje aan de wand, wie heeft de mooiste telefoon van het land?


  • Qaatloz
  • Registratie: Januari 2009
  • Laatst online: 21-11 21:27
Je reset in je for-loop elke keer je array. Bij elke worp wordt dus het oude resultaat weer naar 0 geschreven regel 33-44

Regel 33-44 moet je dus uit je for-loop halen.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Heb je al gedebugged, en gewoon door de code heen gestept? Zo niet, dan is dat de belangrijkste fout die je gemaakt hebt ;)

Verder zie ik sowieso dat je heel veel code herhaalt, met als enige verschil de index ( Bv regel 34 t/m 44 en 52 t/m 75 en 77 t/m 100 ), hoezo maak je daar ook niet gebruik van een loopje.

Verder zou ik de code wat meer opdelen in verschillende methodes. Op die manier wordt je code veel overzichtelijker, en is het makkelijker om fouten op te sporen.

[ Voor 59% gewijzigd door Woy op 12-06-2014 14:29 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • timmie1
  • Registratie: Juni 2008
  • Laatst online: 10:03
Qaatloz schreef op donderdag 12 juni 2014 @ 14:25:
Je reset in je for-loop elke keer je array. Bij elke worp wordt dus het oude resultaat weer naar 0 geschreven regel 33-44

Regel 33-44 moet je dus uit je for-loop halen.
Dus ik moet regel 33-44(initialisatie van de Array) de for-loop uitgooien? Maar waar zou ik hem dan kunnen plaatsen, direct na aanmaak van de Dobbelsteen objecten?

edit:helaas werkt dat niet :/

[ Voor 3% gewijzigd door timmie1 op 12-06-2014 14:39 ]

Spiegeltje, spiegeltje aan de wand, wie heeft de mooiste telefoon van het land?


  • timmie1
  • Registratie: Juni 2008
  • Laatst online: 10:03
Kan het misschien zijn omdat de arrays als static gedefinieerd zijn?

Spiegeltje, spiegeltje aan de wand, wie heeft de mooiste telefoon van het land?


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je weet wat static betekent?

Heb je al een keer gewoon door je code heen gestapt met een step-through debugger, en vergeleken wat de waardes van de variabelen zijn, en wat je op dat moment verwacht dat ze zijn?

[ Voor 76% gewijzigd door Woy op 12-06-2014 15:33 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • timmie1
  • Registratie: Juni 2008
  • Laatst online: 10:03
Woy schreef op donderdag 12 juni 2014 @ 15:32:
Je weet wat static betekent?

Heb je al een keer gewoon door je code heen gestapt met een step-through debugger, en vergeleken wat de waardes van de variabelen zijn, en wat je op dat moment verwacht dat ze zijn?
Ik heb de debugger van Eclipse uitgeprobeerd, maar ik moet toegeven dat dat niet helemaal gelukt is. :9
Bovendien kan ik toch niet echt voorspellen wat voor waardes er komen? Het is immers Math.random-getal.

Edit: Er staat we l<terminated, exit value: 0>C:\Program Files\Java\jdk1.8.0\bin\javaw.exe (12 jun. 2014 15:43:24). Kan ik daaruit concluderen dat hij op 0 eindigt en daarom laatste stuk niet meeneemt?

[ Voor 17% gewijzigd door timmie1 op 12-06-2014 15:44 ]

Spiegeltje, spiegeltje aan de wand, wie heeft de mooiste telefoon van het land?


  • Merethil
  • Registratie: December 2008
  • Laatst online: 09:03
timmie1 schreef op donderdag 12 juni 2014 @ 15:40:
[...]


Ik heb de debugger van Eclipse uitgeprobeerd, maar ik moet toegeven dat dat niet helemaal gelukt is. :9
Bovendien kan ik toch niet echt voorspellen wat voor waardes er komen? Het is immers Math.random-getal.

Edit: Er staat we l<terminated, exit value: 0>C:\Program Files\Java\jdk1.8.0\bin\javaw.exe (12 jun. 2014 15:43:24). Kan ik daaruit concluderen dat hij op 0 eindigt en daarom laatste stuk niet meeneemt?
Juist met de debugger kan je er doorheen "steppen" en elke waarde afzonderlijk bekijken nadat Math.random hem heeft toegewezen.
Exit-code 0 is gewoon goed, dat houdt in dat het programma correct is doorlopen en afgesloten.

Mocht je niet weten hoe je er doorheen kan debuggen, zoek dan even eclipse debugging tutorials op, zoals deze:
http://www.vogella.com/tu...pseDebugging/article.html

  • timmie1
  • Registratie: Juni 2008
  • Laatst online: 10:03
Merethil schreef op donderdag 12 juni 2014 @ 15:46:
[...]


Juist met de debugger kan je er doorheen "steppen" en elke waarde afzonderlijk bekijken nadat Math.random hem heeft toegewezen.
Exit-code 0 is gewoon goed, dat houdt in dat het programma correct is doorlopen en afgesloten.

Mocht je niet weten hoe je er doorheen kan debuggen, zoek dan even eclipse debugging tutorials op, zoals deze:
http://www.vogella.com/tu...pseDebugging/article.html
Ik heb nu gedebugged zoals in die tutorial staat. Echter heb ik nog steeds niks vreemds kunnen vinden. :(
Kan het misschien een bug in eclipse zijn?

Spiegeltje, spiegeltje aan de wand, wie heeft de mooiste telefoon van het land?


  • Caelorum
  • Registratie: April 2005
  • Nu online
Ik denk niet dat je snel tegen een bug aan gaat lopen in java en eclipse. In ieder geval niet met dit soort eenvoudige code :)

Ik zou zeggen loop er stap-voor-stap doorheen en kijk goed naar de instructies en de uitwerking ervan op de waardes van de variabelen.

[ Voor 35% gewijzigd door Caelorum op 12-06-2014 16:17 ]


  • naitsoezn
  • Registratie: December 2002
  • Niet online

naitsoezn

Nait Soez'n!

Schrijf je in regel 52-73 nu elke keer op positie [0] de nieuwe waarde?

't Het nog nooit, nog nooit zo donker west, of 't wer altied wel weer licht


  • timmie1
  • Registratie: Juni 2008
  • Laatst online: 10:03
naitsoezn schreef op donderdag 12 juni 2014 @ 16:23:
Schrijf je in regel 52-73 nu elke keer op positie \[0] de nieuwe waarde?
Klopt inderdaad. Dit is niet de bedoeling, het moet in plaats 0 t/m 10 worden geschreven. Bedankt voor het melden! Helaas heeft dit her probleem nog niet opgelost en zit ik weer vast... :(

Spiegeltje, spiegeltje aan de wand, wie heeft de mooiste telefoon van het land?


  • xleeuwx
  • Registratie: Oktober 2009
  • Laatst online: 09-11 23:39

xleeuwx

developer Tweakers Elect
Zoals @Woy ook al schreef begin eerst eens met je code wat overzichtelijker te krijgen en in methods te zetten. Dit lost waarschijnlijk al het probleem op omdat je hiervoor zelf goed naar je code moet kijken.

  • Puch-Maxi
  • Registratie: December 2003
  • Laatst online: 21-11 21:50
Wat bij mij nog wel eens wil helpen is het programma gewoon even uitschrijven (eventueel in pseudocode) dan zie je al gauw waar je de mist in gaat, stap voor stap doorlopen.

My favorite programming language is solder.


  • Orion84
  • Registratie: April 2002
  • Laatst online: 21-11 17:47

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

Kijk ook eens naar de structuur van je ifjes en for loopjes en waar je het ene blok nu precies afsluit en het volgende begint.

Zo heb je op regel 48 "if (x < y) { ", terwijl je daar nog binnen for loop zit waar die conditie sowieso geldt (als ik me niet vergis)?

En daarna komt er een hele bak met else if statements, met op het eind nog een losse grote else-if, die qua conditie helemaal niet lijkt te passen bij het voorgaande blok, terwijl hij daar qua nesting wel bij wordt betrokken. En de conditie kan nooit true zijn aangezien hij conflicteert met de conditie van de omliggende for loop.

Dus denk nog eens goed na over de structuur van je code en welke stukken nu wel en niet binnen bepaalde loopjes horen. Want daar zit 'm een groot deel van de fouten zo te zien.

Dat grote blok met else if's klopt sowieso niet, want elke regel schrijft naar positie 0 in de array, maar dat had iemand anders ook al opgemerkt. Wellicht handig als je de verbeteringen die mensen hebben aangegeven en die je al verwerkt hebt ook even in een nieuwe versie van de code post (in een nieuwe post, anders is het voor nieuwe lezers van dit topic wellicht wat moeilijk om bepaalde reacties te kunnen volgen).

[ Voor 8% gewijzigd door Orion84 op 12-06-2014 18:30 ]

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


  • timmie1
  • Registratie: Juni 2008
  • Laatst online: 10:03
Ik heb de code iets netter gemaakt, wat meer methodes. Geprobeerd wat meer for-loops te gebruiken, eentje teruggedraaid omdat het dan nog maar half klopte. Ik heb in de nieuw gemaakte methode "arrayInitializeLoop" een oneindige for-loop gemaakt en een String laten uitprinten om te testen. Conclusie: Hij pakt die methode dus helemaal niet.
Edit: ik weet niet precies waarom ik opeens verplicht elke methode en variabele static moet maken. Kan iemand mij misschien zeggen waarom dat moet? Al vanaf het begin geeft Eclipse bij alles syntaxerrors die alleen oplosbaar zijn door static te 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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//import java.math.*;
//import java.awt.*;

public class MainClass {
    // De daadwerkelijke resultaatarray
    public static double[] dobbelresultarray1;
    // Hoeveel keren ogen 2 t/m 12 gegooid zijn
    public static double[] aantalKerenOgen;
    public static int y = 12;
    public static boolean done = false;
    public static int i = 0;

    public MainClass() {
        aantalKerenOgen = new double[11];
    }

    public static void main(String[] args) {

        // 2 Dobbelstenen maken
        Dobbelsteen dobbelsteen1 = new Dobbelsteen();
        Dobbelsteen dobbelsteen2 = new Dobbelsteen();
        // aantal keer gooien, moet user later kunnen invoeren(input)
        for (int x = 0; x < y; x++) {

            double dob1 = dobbelsteen1.getDobbelsteenOgen();
            System.out.println("dobbelsteen1 heeft " + dob1);
            double dob2 = dobbelsteen2.getDobbelsteenOgen();
            System.out.println("dobbelsteen2 heeft " + dob2);
            // Aantal gegooide ogen van dobbelsteen 1 en 2 bijelkaar optellen
            double dobTotaal = dob2 + dob1;

            dobbelresultarray1 = new double[y];
            dobbelresultarray1[x] = dobTotaal;
            System.out.println("Het aantal ogen totaal is :"
                    + dobbelresultarray1[x]);
            if (dobbelresultarray1.length == y) {
                done = true;

            }

        }
        arrayInitializeLoop();

    }

    public static void arrayInitializeLoop() {

        for (int i = 0; i > 0; i++) {

            if (dobbelresultarray1[i] == 2) {
                aantalKerenOgen[0]++;
            } else if (dobbelresultarray1[i] == 3) {
                aantalKerenOgen[1]++;
            } else if (dobbelresultarray1[i] == 4) {
                aantalKerenOgen[2]++;
            } else if (dobbelresultarray1[i] == 5) {
                aantalKerenOgen[3]++;
            } else if (dobbelresultarray1[i] == 6) {
                aantalKerenOgen[4]++;
            } else if (dobbelresultarray1[i] == 7) {
                aantalKerenOgen[5]++;
            } else if (dobbelresultarray1[i] == 8) {
                aantalKerenOgen[6]++;
            } else if (dobbelresultarray1[i] == 9) {
                aantalKerenOgen[7]++;
            } else if (dobbelresultarray1[i] == 10) {
                aantalKerenOgen[8]++;
            } else if (dobbelresultarray1[i] == 11) {
                aantalKerenOgen[9]++;
            } else if (dobbelresultarray1[i] == 12) {
                aantalKerenOgen[10]++;
            } else {
                printResults();
                System.out.println("Test........ ");
            }
        }
    }

    public static void printResults() {

        // Een samenvatting printen; hoeveel is er van elk mogelijke
        // aantal ogen gegooid?

        System.out.println("Resultatentabel");
        System.out.println("Aantal keren 2 ogen: " + aantalKerenOgen[0]);
        System.out.println("Aantal keren 3 ogen: " + aantalKerenOgen[1]);
        System.out.println("Aantal keren 4 ogen: " + aantalKerenOgen[2]);
        System.out.println("Aantal keren 5 ogen: " + aantalKerenOgen[3]);
        System.out.println("Aantal keren 6 ogen: " + aantalKerenOgen[4]);
        System.out.println("Aantal keren 7 ogen: " + aantalKerenOgen[5]);
        System.out.println("Aantal keren 8 ogen: " + aantalKerenOgen[6]);
        System.out.println("Aantal keren 9 ogen: " + aantalKerenOgen[7]);
        System.out.println("Aantal keren 10 ogen: " + aantalKerenOgen[8]);
        System.out.println("Aantal keren 11 ogen: " + aantalKerenOgen[9]);
        System.out.println("Aantal keren 12 ogen: " + aantalKerenOgen[10]);
    }

}

[ Voor 3% gewijzigd door timmie1 op 12-06-2014 20:27 ]

Spiegeltje, spiegeltje aan de wand, wie heeft de mooiste telefoon van het land?


  • Orion84
  • Registratie: April 2002
  • Laatst online: 21-11 17:47

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

Pff, daar is het niet beter mee geworden. Je loop condities en de condities in je if else constructie kloppen nog steeds niet.

For i=0; i > 0 wordt natuurlijk niet uitgevoerd, want bij het starten van de forloop geef je i de waarde 0 en is de conditie dus false. De conditie wordt aan het begin van elke ronde gecheckt, de i++ wordt aan het eind van elke ronde uitgevoerd.

De else op het eind van de else if serie zal nooit worden uitgevoerd, omdat alle mogelijke waardes van het resultaat al in een van de voorgaande else if's worden afgevangen. Die hele else if boom is überhaupt overbodig als je het verband tussen het gegooide resultaat en de op te hogen positie in de array doorziet.

Verder initialiseer je nog steeds je resultaatarray in de dobbelsteengooien-loop (array = new double[]). Terwijl je het ophogen van het aantal keer dat een bepaalde combi gegooid is nu juist buiten de for loop doet.

Kortom, zoals ik al zei: kijk nog eens grondig naar de structuur van je loops en condities, want daar klopt weinig van.

Zoals iemand eerder al aangaf: schrijf het gewenste gedrag eens in normale taal, of pseudocode op (zonder naar je huidige code te kijken) en leidt daar vervolgens een programma van af.

[ Voor 21% gewijzigd door Orion84 op 12-06-2014 20:50 ]

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


  • Caelorum
  • Registratie: April 2005
  • Nu online
En geef de moed niet op! Dit is een van de lastigste dingen die je kan leren als beginner. Ik heb meerdere mensen dagenlang (zo niet weken, maar kan ook uren) zien blijven hangen op deze reeks aan concepten. Als het eenmaal valt dan sla je jezelf voor de kop (nadat je hebt staan juichen ^^). In ieder geval heb je er al goed aan gedaan hier te komen, zodat we je de weg kunnen wijzen en je zo helpen het zelf uit te vogelen.

[ Voor 21% gewijzigd door Caelorum op 12-06-2014 21:15 ]


  • diondokter
  • Registratie: Augustus 2011
  • Laatst online: 20-11 12:14

diondokter

Dum spiro, spero

Inderdaad!, ik heb nog niet zo heel lang geleden in jouw schoenen gestaan. En dan kom je eindelijk tot een punt dat je het op een forum vraagt, en dat je dan overrompelt word door allerlei termen. Ik ken het.

Maar, ik moet je zeggen, hoe meer je te weten komt, hoe leuker je het gaat vinden.

In je nieuwe versie vind ik de plek van printResults(); (r.73) erg vreemd... Heb je die daar echt bedoeld?


Ik heb aan jouw code wat commentaar toegevoegd. Hopelijk heb je hier wat aan :)

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
//import java.math.*; 
//import java.awt.*; 

public class MainClass { 
    public static double[] dobbelresultarray1; 
    public static double[] aantalKerenOgen; 
    public static int y = 12; 
    public static boolean done = false; 
    public static int i = 0; 

    public MainClass() { 
        aantalKerenOgen = new double[11]; 
    } 

    public static void main(String[] args) { 
        Dobbelsteen dobbelsteen1 = new Dobbelsteen(); 
        Dobbelsteen dobbelsteen2 = new Dobbelsteen(); 

        for (int x = 0; x < y; x++) { 

            double dob1 = dobbelsteen1.getDobbelsteenOgen(); 
            System.out.println("dobbelsteen1 heeft " + dob1); 
            double dob2 = dobbelsteen2.getDobbelsteenOgen(); 
            System.out.println("dobbelsteen2 heeft " + dob2); 
            double dobTotaal = dob2 + dob1; 

            dobbelresultarray1 = new double[y]; //Elke keer als je door de for-loop heen gaat reset je je array. Dit moet je voor de for-loop doen.
            dobbelresultarray1[x] = dobTotaal; 
            System.out.println("Het aantal ogen totaal is :" 
                    + dobbelresultarray1[x]); 
            if (dobbelresultarray1.length == y) { //Dit is een stukje code dat vroeger denk ik wel fuctie had, maar nu niet meer. Om alles overzichtelijk te houden zou ik dit weghalen.
                done = true; 

            } 

        } 
        arrayInitializeLoop(); 

    } 

    public static void arrayInitializeLoop() { //Een beetje een vreemde naam, aangezien je de array hier niet initialized...

/* Wat je zou kunnen doen is:
for(int i = 0; i < dobbelresultarray1.length; i++)
{
    for(int j = 0; j < 13; j++)
    {
        if (dobbelresultarray1[i] == j) { 
                aantalKerenOgen[j - 2]++; 
        }
    }
}
Volgens mij zou dit moeten werken :) */

        for (int i = 0; i > 0; i++) { // Groter dan nul? Hij begint op nul, dus zal hij nooit loopen

            if (dobbelresultarray1[i] == 2) { 
                aantalKerenOgen[0]++; 
            } else if (dobbelresultarray1[i] == 3) { 
                aantalKerenOgen[1]++; 
            } else if (dobbelresultarray1[i] == 4) { 
                aantalKerenOgen[2]++; 
            } else if (dobbelresultarray1[i] == 5) { 
                aantalKerenOgen[3]++; 
            } else if (dobbelresultarray1[i] == 6) { 
                aantalKerenOgen[4]++; 
            } else if (dobbelresultarray1[i] == 7) { 
                aantalKerenOgen[5]++; 
            } else if (dobbelresultarray1[i] == 8) { 
                aantalKerenOgen[6]++; 
            } else if (dobbelresultarray1[i] == 9) { 
                aantalKerenOgen[7]++; 
            } else if (dobbelresultarray1[i] == 10) { 
                aantalKerenOgen[8]++; 
            } else if (dobbelresultarray1[i] == 11) { 
                aantalKerenOgen[9]++; 
            } else if (dobbelresultarray1[i] == 12) { 
                aantalKerenOgen[10]++; 
            } else { 
                printResults(); //vreemde plek?
                System.out.println("Test........ "); 
            } 
        } 
//Is dit niet de plek waar je printResults(); wil hebben?
    } 

    public static void printResults() { //opzich prima... Dit zou je kunnen verbeteren met een for-loop
        System.out.println("Resultatentabel"); 
        System.out.println("Aantal keren 2 ogen: " + aantalKerenOgen[0]); 
        System.out.println("Aantal keren 3 ogen: " + aantalKerenOgen[1]); 
        System.out.println("Aantal keren 4 ogen: " + aantalKerenOgen[2]); 
        System.out.println("Aantal keren 5 ogen: " + aantalKerenOgen[3]); 
        System.out.println("Aantal keren 6 ogen: " + aantalKerenOgen[4]); 
        System.out.println("Aantal keren 7 ogen: " + aantalKerenOgen[5]); 
        System.out.println("Aantal keren 8 ogen: " + aantalKerenOgen[6]); 
        System.out.println("Aantal keren 9 ogen: " + aantalKerenOgen[7]); 
        System.out.println("Aantal keren 10 ogen: " + aantalKerenOgen[8]); 
        System.out.println("Aantal keren 11 ogen: " + aantalKerenOgen[9]); 
        System.out.println("Aantal keren 12 ogen: " + aantalKerenOgen[10]); 
    } 

}

[ Voor 80% gewijzigd door diondokter op 13-06-2014 15:52 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
timmie1 schreef op donderdag 12 juni 2014 @ 20:21:
Edit: ik weet niet precies waarom ik opeens verplicht elke methode en variabele static moet maken. Kan iemand mij misschien zeggen waarom dat moet? Al vanaf het begin geeft Eclipse bij alles syntaxerrors die alleen oplosbaar zijn door static te gebruiken...
Dit is precies de reden waarom ik eerder al vroeg of je wist wat static betekent. Blijkbaar is dat dus inderdaad niet het geval.

de static modifier zorgt er voor dat iets in de scope van een class leeft, in plaats van in de scope van een instance. Als je binnen je class definitie een static variabele hebt zal die binnen het programma maar 1 keer zijn. Terwijl een variabele die zonder static gedefinieerd heeft per instantie van een class zal bestaan. Een static variabele/methode roep je dan ook aan op de class, en een non-static op een variabele die naar een instance van de class verwijst.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Test
{
    public static int staticInt;

    public int instanceInt;
}

Test.staticInt = 10; //Gaat goed, je roept de variabele op class nivo aan
Test.instanceInt = 10; //Compiler error, want je hebt geen instance

Test myTestInstance1 = new Test();
Test myTestInstance2 = new Test();

myTestInstance1.instanceInt = 10;
myTestInstance2.instanceInt = 20;
//Nu heb je 2 instances die beide een verschillende waarde van instanceInt hebben.

Als je in een static functie zit, kan je dus niet zomaar non-static variabelen/methoden aanroepen, want op dat moment heb je geen verwijzing naar een instance van de class. Binnen een non-static methode worden alle bewerkingen op de variabelen van die instance gedaan. De 'this' variabele wijst dan ook naar de instance waar je mee bezig bent.

Aangezien jouw code allemaal in de static main methode aangeroepen wordt, en je dus geen instance van een of andere class aangemaakt hebt, moeten alle methodes die je aanroept ook static zijn. In je code maak je bijvoorbeeld wel een instance aan van de class Dobbelsteen, en daar roep je dan ook de instance methode getDobbelsteenOgen op aan. Aangezien je die op een instance aanroept hoeft hij niet static te zijn.

Over het algemeen kun je static beter niet te veel gebruiken, want vaak komt het er op neer dat je je global scope aan het verbuilen bent met state die eigenlijk helemaal niet in de global scopte thuis hoort. Het is vooral voor methodes die geen state hoeven bij te houden.

[ Voor 16% gewijzigd door Woy op 12-06-2014 22:17 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Lethalis
  • Registratie: April 2002
  • Niet online
Als je makkelijk even van alle static rommel af wil, dan kun je het volgende doen:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package javatestapplication;

public class JavaTestApplication {

    public static void main(String[] args) {
        JavaTestApplication app = new JavaTestApplication();
        app.start();
    }
    
    public void start()
    {
        System.out.println("Hello world");
    }
    
}


Gewoon in de static main een instance maken en die dan vervolgens gebruiken.

Ask yourself if you are happy and then you cease to be.


  • conara
  • Registratie: Februari 2010
  • Nu online
Zelf heb ik geen ervaring met java, maar kan wel redelijk in C++ programmeren. En als ik dan je code bekijkt is het ten eerste niet erg netjes opgebouwd, maar dat terzijde. Daarnaast viel me op dat als je in java een object met new aanmaakt je geen pointer krijgt (had het even opgezocht, want anders had je hele programma niet gewerkt).

Ik denk zelf dat het probleem hier zit. Ik vind het iig raar en kan er dan ook wel inkomen dat het daar fout gaat:

code:
1
2
dobbelresultarray1 = new double[y]; 
dobbelresultarray1[x] = dobTotaal;


Oftewel je gaat steeds opnieuw die array initialiseren, je moet dat buiten je for loop doen. Zal straks eens verder kijken, maar dit viel mij op.

Overigens zijn er ook viel zaken die veel simpeler kunnen, maar daar kan je over nadenken als alles het doet.

EDIT: zie dat je onderhand de code al hebt veranderd. Ik zal daar nog eens naar kijken. Oh ik zie nu dat iemand deze opmerking al eerder had opgemerkt.

[ Voor 19% gewijzigd door conara op 13-06-2014 13:28 ]


  • conara
  • Registratie: Februari 2010
  • Nu online
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
for (int i = 0; i > 0; i++) { // Groter dan nul? Hij begint op nul, dus zal hij nooit loopen 

            if (dobbelresultarray1[i] == 2) {  
                aantalKerenOgen[0]++;  
            } else if (dobbelresultarray1[i] == 3) {  
                aantalKerenOgen[1]++;  
            } else if (dobbelresultarray1[i] == 4) {  
                aantalKerenOgen[2]++;  
            } else if (dobbelresultarray1[i] == 5) {  
                aantalKerenOgen[3]++;  
            } else if (dobbelresultarray1[i] == 6) {  
                aantalKerenOgen[4]++;  
            } else if (dobbelresultarray1[i] == 7) {  
                aantalKerenOgen[5]++;  
            } else if (dobbelresultarray1[i] == 8) {  
                aantalKerenOgen[6]++;  
            } else if (dobbelresultarray1[i] == 9) {  
                aantalKerenOgen[7]++;  
            } else if (dobbelresultarray1[i] == 10) {  
                aantalKerenOgen[8]++;  
            } else if (dobbelresultarray1[i] == 11) {  
                aantalKerenOgen[9]++;  
            } else if (dobbelresultarray1[i] == 12) {  
                aantalKerenOgen[10]++;  
            } else {  
                printResults(); //vreemde plek? 
                System.out.println("Test........ ");  
            }


dit kan je ook vereenvoudigen tot (gaat even om wat in de for loop staat, niet om de for loop zelf):

Java:
1
2
3
for (int i = 0; i > 0; i++) { // Groter dan nul? Hij begint op nul, dus zal hij nooit loopen 
            aantalKerenOgen[dobbelresultarray1[i] - 2]++;
}


Veel mooier toch? Let op dat er geen controle meer in zit (jou else statement), maar je kan er natuurlijk nog een if omheen zetten. Bijvoorbeeld:

Java:
1
2
3
4
5
6
7
8
for (int i = 0; i > 0; i++) { // Groter dan nul? Hij begint op nul, dus zal hij nooit loopen 
            if (dobbelresultarray1[i] < 12 || dobbelresultarray1[i] > 0) {
                   aantalKerenOgen[dobbelresultarray1[i] - 2]++;
            }
            else {
               // doe iets anders
            }
}


EDIT: Trouwens waarom gebruik je een double? Het zijn hele getallen, dus waarom gebruik je geen int? Gebruik van een double is hier eigenlijk gewoon fout.

EDIT: code aangepast naar aanleiding van de reactie hieronder

[ Voor 4% gewijzigd door conara op 14-06-2014 10:35 ]


  • Orion84
  • Registratie: April 2002
  • Laatst online: 21-11 17:47

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

conara schreef op vrijdag 13 juni 2014 @ 13:44:
Veel mooier toch? Let op dat er geen controle meer in zit (jou else statement), maar je kan er natuurlijk nog een if omheen zetten. Bijvoorbeeld:

Java:
1
2
3
4
5
6
7
8
for (int i = 0; i > 0; i++) { // Groter dan nul? Hij begint op nul, dus zal hij nooit loopen 
            if (dobbelresultarray1[i] > 11 || dobbelresultarray1[i] < 0) {
                   aantalKerenOgen[dobbelresultarray1[i] - 2]++;
            }
            else {
               // doe iets anders
            }
}
Als je het dan letterlijk gaat voorkauwen, zorg dan in elk geval dat het foutloos is. Volgens mij doet je if condition exact het tegenovergestelde van wat je van plan was...

[ Voor 9% gewijzigd door Orion84 op 13-06-2014 14:28 ]

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


  • conara
  • Registratie: Februari 2010
  • Nu online
Excuses. Iedereen zegt dat bepaalde zaken efficiënter en netter gedaan kunnen worden. Ik dacht laat ik een concreet voorbeeld zien. Ik hoop dat hij dan inziet dat die nog eens goed naar z'n code moet kijken. Er zijn nog zat andere zaken te verbeteren, maar dit voorbeeld zet hem misschien wel tot nadenken. Daarnaast is het geen schoolopdracht (volgens mij), waarbij het misschien ongewenst is om grote dingen voor te zeggen. Alhoewel dit nou niet bepaald een heel groot belangrijk iets is.

Maar dan het belangrijkste gedeelte namelijk over dat het niet foutloos is: Dat zou kunnen ben ook maar een mens dat wilt helpen. Geef dan wel aan waarom het fout is (desnoods via pm als je niet zeker bent), want nu weet ik niet wat je bedoeld.

Ik heb nogmaals naar mijn code gekeken en je hebt gelijk. Slordig foutje... Uiteraard gaat het om het principe, maar dat is natuurlijk geen excuus voor degelijke foutjes.

[ Voor 9% gewijzigd door conara op 14-06-2014 19:20 ]


Verwijderd

Ik denk dat het een goed idee is om het programma eens in pseudo-code te schrijven. Als ik zo naar de huidige code kijk, vermoed ik dat je de volgorde van de operaties niet goed op je netvlies hebt zitten.

Als je dat gedaan hebt, kun je de pseudo-code naar Java omzetten. Ik zou beginnen met alles in de Main methode te doen (dit maakt het allemaal veeeeel makkelijker) en ervoor te zorgen dat je variabelen defineerd en initialiseerd voor je aan een for-loop begint.

Inhoudelijk vraag ik me af waarom je het nodig vind om twee for-loops te gebruiken. Je hebt namelijk aan 1 for-loop genoeg. Een tweede for-loop zou door mij gebruikt worden om de array met het aantal keer dat er x ogen gegooit zijn uit te printen, niet om die array te vullen.

  • Euwas
  • Registratie: Juli 2009
  • Nu online
conara schreef op vrijdag 13 juni 2014 @ 13:44:
Java:
1
2
3
4
5
6
7
8
for (int i = 0; i > 0; i++) { // Groter dan nul? Hij begint op nul, dus zal hij nooit loopen 
            if (dobbelresultarray1[i] < 12 || dobbelresultarray1[i] > 0) {
                   aantalKerenOgen[dobbelresultarray1[i] - 2]++;
            }
            else {
               // doe iets anders
            }
}


EDIT: Trouwens waarom gebruik je een double? Het zijn hele getallen, dus waarom gebruik je geen int? Gebruik van een double is hier eigenlijk gewoon fout.

EDIT: code aangepast naar aanleiding van de reactie hieronder
Ook na de aanpassing doet de code nog niet helemaal wat je wilt. Er staat nu een OR (||) wat betekend dat als hij kleiner dan 12 is of groter dan 0 voert hij de code uit. Wat als je nu -1 of 13 hebt? Die index klopt niet in de array en is dus fout. Oplossing is de AND (&&) waardoor de range beperkt wordt (1-12). De range van de array is 0-10 zoals hij nu staat, dus een betere optie is:

code:
1
2
// Range is 0 - 10 (including) but shifted by 2 (2-12)
if (dobbelresultarray1[i] >= 2 && dobbelresultarray1[i] <= 12) {
Pagina: 1