[Java] Kofferslot

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Dekay
  • Registratie: December 2004
  • Laatst online: 12-10 18:45
Ik moet voor school een java opdracht maken. Ik heb nog niet erg veel kennis op java gebied, ik heb namelijk pas sinds oktober les. Dus, met dat in gedachte is de opdracht als volgt:

De firma Luggage & Co rust haar reiskoffers uit met een kofferslot dat bestaat uit twee letters en 1 cijfer. Mogelijke combinaties zijn bijvoorbeeld BE7, KS2 en ML9.

Er moeten drie klassen zijn: cijfer, letter en kofferslot.

- De klasse Cijfer heeft een private attribute cijfer van type int. Ook is er een constructor Cijfer(). De methode getCijfer() geeft het cijfer uit de klasse terug, en de methode setCijfer(int cijfer) initialiseert het cijfer.
Voor de methode volgende() van de klasse Cijfer geldt: na 0 komt 1, na 1 komt 2, ... et cetera. Na 9 ga je verder met 0.

- De klasse Letter heeft een private attribute letter van type char. Ook is er een constructor Letter(). De methode getLetter() geeft de letter uit de klasse terug, en de methode setLetter(char letter) initialiseert de letter.
Voor de methode volgende() van de klasse Letter geldt: na ‘A’ komt ‘B’, na ‘B’ komt ‘C’,... et cetera. Na ‘Z’ ga je verder met ‘A’.

- De klasse Kofferslot heeft twee private-attributen: (1) een array van twee Letters en (2) een Cijfer. Dit array is verplicht!
Verder heeft de klasse Kofferslot twee constructors namelijk (1) Kofferslot() en (2) Kofferslot(char letter1, char letter2, int cijfer).
De methode setCombinatie(char letter1, char letter2, int cijfer) initialiseert het kofferslot met deze waarden.
De methode volgende() van de klasse Kofferslot genereert de combinaties in deze volgorde:
AA0 AA1 AA2 AA3 .. AA9 -> AB0 .. -> AZ9 -> BA0

Tot zo ver de opdracht. Ik heb volgens mij de klassen cijfer en letter af en kloppen deze ook:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Cijfer {
    
    private int cijfer;
    
    public Cijfer() {
    }
    
    public void volgende() {
        if (cijfer > 9) {
            cijfer = 0;
        } else {
            cijfer++;
        }
    }

    public int getCijfer() {
        return cijfer;
    }

    public void setCijfer(int cijfer) {
        this.cijfer = cijfer;
    }
}


Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Letter {
    
    private char letter;
    
    public Letter() {
    }
    
    public void volgende() {
        if (letter == '[') {
            letter = 'A';
        } else {
            letter++;
        }
    }

    public char getLetter() {
        return letter;
    }

    public void setLetter(char letter) {
        this.letter = letter;
    }
}


Tot zo ver waar ik het nog begreep. Nu komt dus de main klasse, het kofferslot. Hier heb ik het volgende voor:


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
public class Kofferslot {

    
    public static void main(String[] args) {

        Kofferslot slot = new Kofferslot();
        slot.Kofferslot('A', 'A', 0);
    }

    private Letter letters[] = new Letter[2];
    private Cijfer cijfer;

    Kofferslot() {     
    }

    public void Kofferslot(char letter1, char letter2, int cijfer) {
    }

    public void setCombinatie(char letter1, char letter2, int cijfer) {
    }

    public void volgende() {
    }
}


Hier zit ik vast. Wat er volgens mij in moet komende te staan is het zetten van een Kofferslot, bijvoorbeeld AA0 en dan moet het volgende slot worden AA1. Dus eigenlijk wil ik het oude slot printen en vervolgens het nieuwe slot. Ik ben er alleen niet uit waar ik dit moet gaan doen. Verder weet ik dat ik een array moet gebruiken waar twee letters in staan, maar hoe ik die letters er in ga zetten en waarom snap ik niet. Volgens mij moeten Kofferslot() en Kofferslot(char letter1, char letter2, int cijfer) leeg blijven. setCombinatie moet de combinatie maken, dus bijvoorbeeld AA0 en dan maakt de methode volgende() er AA1 van. Echter weet ik niet hoe ik dit moet doen.

Kan iemand mij op weg helpen? Zit ik goed met mijn aannamen?

Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Je bent in ieder geval de overflow vergeten. Wanneer na AA9 AB0 moet komen, moet de Cijfer::volgende() wel op de een of andere manier aangeven dat hij rond is.

Acties:
  • 0 Henk 'm!

  • Jegorex
  • Registratie: April 2004
  • Laatst online: 03-09 23:24
Er zit in elk geval nog een fout in Cijfer.volgende() en Letter.volgende(). Kijk eens wat na 9 en Z komt.

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 01:05
En setCijfer() en setLetter() accepteren ook alles.

Ik had al even een testje geschreven voor Cijfer:
Java:
1
2
3
4
5
6
7
8
    public static void main(String[] args) {
        Cijfer cijfer = new Cijfer();
        cijfer.setCijfer(0);
        for (int i = 0; i < 10; i++) {
            cijfer.volgende();
            System.out.println(i + ": " + cijfer.getCijfer());
        }
    }


0: 1
1: 2
2: 3
3: 4
4: 5
5: 6
6: 7
7: 8
8: 9
9: 10


Zou je misschien zelf ook eens moeten doet voordat je een klasse als 'kloppen' markeert. :)


Inhoudelijk: je constructors moeten zeker niet leeg blijven. Dat is de plek om Letters en Cijfers te initialiseren en eventuele waarden die je gebruiker (van de klasse) meegeeft in de constructor, door te geven aan de goede Cijfer en Letter klassen.

En die letters en cijfers doorgeven doe je door setCijfer() of setLetter() aan te roepen. Je moet alleen uitvissen hoe je dat doet als die letters in een array staan. :)

Zoals hierboven zou je Kofferslot op de één of andere manier moeten signaleren dat er overflow is. Dit zou je kunnen doen door in Cijfer en Letter een functie overflow() toe te voegen. overflow() retourneert de status via een lokale variabele (zou 'overflow' kunnen heten) en een resetOverflow() om die variabele weer te resetten. Als volgende() dan overflowt, zet 'ie overflow op true. Als cijfer overflowt, moet je dus volgende() aanroepen op letter1, overflowt letter1, dan moet je op letter2 volgende() aanroepen. Overflowt letter2, dan moet 'ie naar AA0.

Hiermee zou je een eind moeten komen. :)

[ Voor 48% gewijzigd door Jaap-Jan op 01-01-2012 21:52 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

Verwijderd

Dat soort fouten kun je voorkomen door handig gebruik te maken van de modulo operator (%).
Als je bijvoorbeeld cijfer %= 10 gebruikt, heeft cijfer altijd een waarde van 0 t/m 9, en kan dit ook niet verkeerd gaan.

Wat de klasse Kofferslot kan doen is heel erg simpel iets in de geest als:

Java:
1
2
3
4
5
6
7
public void volgende() {
  if (this.letter[0].getLetter() > this.letter[0].volgende()) {
    if (this.letter[1].getLetter() > this.letter[1].volgende()) {
      this.cijfer.volgende();
    }
  }
}


Dan moeten die volgende() methods natuurlijk wel de nieuwe waarde returnen en dus geen void zijn.
Eigenlijk heb je met de modulus assignment operator en bovenstaande alles al te pakken en stelt het weinig meer voor. Die modulo kun je namelijk ook gewoon toepassen op de char (minus 65).
Jaap-Jan schreef op zondag 01 januari 2012 @ 21:22:

Zoals hierboven zou je Kofferslot op de één of andere manier moeten signaleren dat er overflow is. Dit zou je kunnen doen door in Cijfer en Letter een functie overflow() toe te voegen. overflow() retourneert de status via een lokale variabele (zou 'overflow' kunnen heten) en een resetOverflow() om die variabele weer te resetten. Als volgende() dan overflowt, zet 'ie overflow op true. Als cijfer overflowt, moet je dus volgende() aanroepen op letter1, overflowt letter1, dan moet je op letter2 volgende() aanroepen. Overflowt letter2, dan moet 'ie naar AA0.
Is een mooie voor The Daily WTF.
De complete logica kan in een paar regels, zoals je net hierboven kunt zien. Het "overflowen" gaat helemaal automagisch.

[ Voor 33% gewijzigd door Verwijderd op 01-01-2012 22:04 ]


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 01:05
Ik ben wat omzichtiger bezig, maar dat is om geen overflowlogica in Kofferslot te proppen. Wat als volgende() moet gaan aftellen (eigenlijk krijg je dan underflow, maar goed), dan moet je aanpassingen gaan maken in Kofferslot zelf. :)

En ik post expres geen code. :)

[ Voor 6% gewijzigd door Jaap-Jan op 01-01-2012 22:09 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Verwijderd schreef op zondag 01 januari 2012 @ 21:57:
Wat de klasse Kofferslot kan doen is heel erg simpel iets in de geest als:

Java:
1
2
3
4
5
6
7
public void volgende() {
  if (this.letter[0].getLetter() > this.letter[0].volgende()) {
    if (this.letter[1].getLetter() > this.letter[1].volgende()) {
      this.cijfer.volgende();
    }
  }
}
Enkel dan andersom natuurlijk om te matchen met de opdracht. Maar ik vind een constructie waarbij je A>B niet kan schrijven als B<A niet zo mooi eigenlijk. ;) Stel dat volgende() gewoon een bool teruggeeft, dan wordt het nog veel simpeler: :p
Java:
1
2
3
    public boolean volgende() {
        return cijfer.volgende() && letters[1].volgende() && letters[0].volgende();
    }

(Met natuurlijk volgende wel-correct geïmplementeerd, als in:
Java:
8
9
10
    public boolean volgende() {
        return (cijfer = (cijfer + 1) % 10) == 0;
    }

)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

pedorus schreef op zondag 01 januari 2012 @ 22:29:

Enkel dan andersom natuurlijk om te matchen met de opdracht.
Ah, inderdaad, in mijn voorbeeld worden eerst de letters geroteerd en daarna de cijfers, de if's staan dus binnenstebuiten.
Maar ik vind een constructie waarbij je A>B niet kan schrijven als B<A niet zo mooi eigenlijk. ;) Stel dat volgende() gewoon een bool teruggeeft, dan wordt het nog veel simpeler: :p
Dat is inderdaad wel een mooie oplossing. Of het dan logisch wordt (volgende die bool returnt is niet erg intuïtief) weet ik niet, maar het levert wel lekker korte, elegante code op.
Java:
1
2
3
    public boolean volgende() {
        return cijfer.volgende() && letters[0].volgende() && letters[1].volgende();
    }
Maar dan in de juiste volgorde ;)

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 01:05
Verwijderd schreef op zondag 01 januari 2012 @ 22:38:
[...]

Dat is inderdaad wel een mooie oplossing. Of het dan logisch wordt (volgende die bool returnt is niet erg intuïtief) weet ik niet, maar het levert wel lekker korte, elegante code op.
Begint mijn oplossing toch weer te gloren. :P

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • Dekay
  • Registratie: December 2004
  • Laatst online: 12-10 18:45
Bedankt voor de hulp so far!

Ik heb Letter.volgende(); en Cijfer.volgende(); aangepast naar:

Java:
1
2
3
4
5
6
    public void volgende() {
        letter++;
        if (letter == '[') {
            letter = 'A';
        }
    }

Java:
1
2
3
4
5
6
    public void volgende() {
        cijfer++;
        if (cijfer > 9) {
            cijfer = 0;
        }
    }


en vervolgens getest via de manier die Jaap-Jan aangaf. Dit werkt nu, bij 9 stopt 'ie en gaat door naar 0. Zelfde geldt voor Z, na Z komt A.

Dan Kofferslot.volgende();. Wat ik begrepen heb is dat die methode moet controleren dat wanneer de code AZ9 is, dat hij de eerste letter naar B moet zetten en Z naar A, 9 naar 0? Als dat zo is dan begrijp ik het niet, want dat doen Cijfer.volgende en Letter.volgende toch al?
Jaap-Jan schreef op zondag 01 januari 2012 @ 21:22:
Inhoudelijk: je constructors moeten zeker niet leeg blijven. Dat is de plek om Letters en Cijfers te initialiseren en eventuele waarden die je gebruiker (van de klasse) meegeeft in de constructor, door te geven aan de goede Cijfer en Letter klassen.

En die letters en cijfers doorgeven doe je door setCijfer() of setLetter() aan te roepen. Je moet alleen uitvissen hoe je dat doet als die letters in een array staan. :)
Als ik dat probeer, dus zoiets:
Java:
1
2
3
    Kofferslot() {
        cijfer.setCijfer(0);
    }


dan krijg ik een 'Exception in thread "main" java.lang.NullPointerException'-error. Heb dat gegoogled en het betekend (volgens mij) dat ik een cijfer aanroep wat een null is. Dus het heeft geen waarde. Dan snap ik alleen niet, want ik zeg toch dat het cijfer een 0 moet zijn? :P

[ Voor 36% gewijzigd door Dekay op 02-01-2012 11:50 ]


Acties:
  • 0 Henk 'm!

  • Ghehe
  • Registratie: April 2011
  • Laatst online: 09-10 18:13

Ghehe

400 pound hacker

Dekay schreef op maandag 02 januari 2012 @ 11:41:

Als ik dat probeer, dus zoiets:
Java:
1
2
3
    Kofferslot() {
        cijfer.setCijfer(0);
    }


dan krijg ik een 'Exception in thread "main" java.lang.NullPointerException'-error. Heb dat gegoogled en het betekend (volgens mij) dat ik een cijfer aanroep wat een null is. Dus het heeft geen waarde. Dan snap ik alleen niet, want ik zeg toch dat het cijfer een 0 moet zijn? :P
Als je code nog zoals in de eerste post is dan ben je cijfer vergeten te instantiëren.
code:
1
private Cijfer cijfer;


maakt het symbolische adres (waarschijnlijk niet echt het juiste woord :+ ) cijfer aan maar je geeft nog geen waarde aan cijfer. (cijfer is nu gelijk aan null) Dat doe je door te instantieren in je Constructor bijvoorbeeld.
Java:
1
2
3
4
    Kofferslot() {
        cijfer = new Cijfer();
        cijfer.setCijfer(0);
    }


Quelque chose comme ça. :)

code:
1
2
3
4
5
6
7
8
9
10
11
12
public class Kofferslot {

    
    public static void main(String[] args) {

        Kofferslot slot = new Kofferslot();
        slot.Kofferslot('A', 'A', 0);
    }
...
    public void Kofferslot(char letter1, char letter2, int cijfer) {
    }
}


Dat is ook niet echt de manier...
Doe eens die "void" weg in de "public void Kofferslot(...). Dan heb je twee constructors en kan je in je main-methode gewoon dit doen:
code:
1
Kofferslot slot = new Kofferslot('A', 'A', 0);

[ Voor 20% gewijzigd door Ghehe op 02-01-2012 12:03 ]


Acties:
  • 0 Henk 'm!

  • Dekay
  • Registratie: December 2004
  • Laatst online: 12-10 18:45
I see, merci. Nu nog de letters zetten. Ik heb namelijk het zelfde probleem (Nullpointer) als ik een letter probeer te zetten
Java:
1
letters[0].setLetter('A');
Wat ik volgens mij doe is in de array letters, op plek 0, de letter A zet. Hoe kan ik dan die null error krijgen?
Ghehe schreef op maandag 02 januari 2012 @ 11:58:
[...]
code:
1
2
3
4
5
6
7
8
9
10
11
12
public class Kofferslot {

    
    public static void main(String[] args) {

        Kofferslot slot = new Kofferslot();
        slot.Kofferslot('A', 'A', 0);
    }
...
    public void Kofferslot(char letter1, char letter2, int cijfer) {
    }
}


Dat is ook niet echt de manier...
Doe eens die "void" weg in de "public void Kofferslot(...). Dan heb je twee constructors en kan je in je main-methode gewoon dit doen:
code:
1
Kofferslot slot = new Kofferslot('A', 'A', 0);
Hmm, nu ik dat void heb weggehaald heb ik die Nullpointer error niet meer, klopt het dan wel wat ik gedaan heb? :P

[ Voor 61% gewijzigd door Dekay op 02-01-2012 12:22 ]


Acties:
  • 0 Henk 'm!

  • Arie-
  • Registratie: December 2008
  • Niet online
Een nullpointer wil zeggen dat je een methode wil aanroepen op een object wat niet bestaat. Bestaat jouw Array letters[] wel?

Acties:
  • 0 Henk 'm!

  • Ghehe
  • Registratie: April 2011
  • Laatst online: 09-10 18:13

Ghehe

400 pound hacker

Dekay schreef op zondag 01 januari 2012 @ 19:20:
Java:
1
2
3
4
public class Kofferslot {
    private Letter letters[] = new Letter[2];
    
}
Je moet goed weten wat je doet. Wat denk je dat deze code doet?


(Antwoord: Het maakt een lege array aan die later 2 objecten van het type Letter kan bevatten. Er zitten dus nog geen Letterobjecten in!)

Vandaar ook je NullPointerException. Je moet dus eerst je array vullen, voor je er Letter methodes op kunt aanroepen.

Acties:
  • 0 Henk 'm!

  • KopjeThee
  • Registratie: Maart 2005
  • Niet online
Verwijderd schreef op zondag 01 januari 2012 @ 22:38:
Dat is inderdaad wel een mooie oplossing. Of het dan logisch wordt (volgende die bool returnt is niet erg intuïtief) weet ik niet, maar het levert wel lekker korte, elegante code op.
[...]
Maar dan in de juiste volgorde ;)
Ik denk dat de &&-en eigenlijk ||-en moeten zijn.
Die "volgende" methodes moeten volgnes mij dan true geven als er geen overflow is, en anders false.

Acties:
  • 0 Henk 'm!

  • Dekay
  • Registratie: December 2004
  • Laatst online: 12-10 18:45
Ghehe schreef op maandag 02 januari 2012 @ 12:56:
[...]


Je moet goed weten wat je doet. Wat denk je dat deze code doet?


(Antwoord: Het maakt een lege array aan die later 2 objecten van het type Letter kan bevatten. Er zitten dus nog geen Letterobjecten in!)

Vandaar ook je NullPointerException. Je moet dus eerst je array vullen, voor je er Letter methodes op kunt aanroepen.
Dus ik moet de array vullen met letters1 en letters2
Java:
1
2
    public void setCombinatie(char letter1, char letter2, int cijfer) {
    }

van deze methode? En hier vervolgens letters1 en 2 gelijk maken aan Letter.setLetter?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Doe eens gek en probeer 't eens :? Of blader eens terug in je studiemateriaal? We willen je best op weg helpen maar voor handjes houden zit je in PRG verkeerd ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
KopjeThee schreef op maandag 02 januari 2012 @ 13:02:
[...]

Ik denk dat de &&-en eigenlijk ||-en moeten zijn.
Die "volgende" methodes moeten volgnes mij dan true geven als er geen overflow is, en anders false.
Volgorde ging over 0/1-element omdraaing (voor edit), maar het is inderdaad mooier om juist false terug te geven bij een overflow (als in, er was geen volgende). :)
Dekay schreef op maandag 02 januari 2012 @ 13:09:
Dus ik moet de array vullen met letters1 en letters2
Java:
1
2
    public void setCombinatie(char letter1, char letter2, int cijfer) {
    }

van deze methode? En hier vervolgens letters1 en 2 gelijk maken aan Letter.setLetter?
Het makkelijkst is gebruikmaken van een array initializer, dan heb je geen last van null-waardes in de array.
Java:
1
2
3
4
    public void setCombinatie(char letter1, char letter2, int cijfer) {
        letters = { new Letter(letter1), new Letter(letter2) };
        ...
    }

Ik ga er hier vanuit dat je een constructor public Letter(char letter) hebt.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 01:05
pedorus schreef op maandag 02 januari 2012 @ 14:28:

Ik ga er hier vanuit dat je een constructor public Letter(char letter) hebt.
Die is er niet volgens de opdracht, dus dat moet op een andere manier. :)

Ik heb de opdracht zelf ook gemaakt, maar met een meer OO- insteek:

Java:
1
2
3
4
5
public interface Overflowable {
    public void volgende();
    
    public void registreer(Overflowable o);
}


Letter en Cijfer zijn nu Overflowables en als er overflow is, wordt er o.volgende() aangeroepen op de geregistreerde Overflowable (of NullObject indien er geen één geregistreerd is). :)

[ Voor 42% gewijzigd door Jaap-Jan op 02-01-2012 14:34 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Jaap-Jan schreef op maandag 02 januari 2012 @ 14:30:
Die is er niet volgens de opdracht, dus dat moet op een andere manier. :)
Het lijkt me dat de opdracht minimumeisen geeft, geen maximumeisen, dus ik zie het probleem niet :p Ook is het niet consistent om wel een constructor bij een Kofferslot te hebben, maar niet bij Teken/Letter.
Ik heb de opdracht zelf ook gemaakt, maar met een meer OO- insteek:
Is het niet logischer om een abstracte superclasse CombinatieTeken te hebben? Bij registreer vraag ik me af of dat wel een taak van die klasse is om de volgende() van een ander object aan te roepen.. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Dekay
  • Registratie: December 2004
  • Laatst online: 12-10 18:45
Ik heb van alles geprobeerd, maar ik kom domweg niet verder. Wat ik tot nu toe kan is een cijfer zetten in m'n Kofferslot(); en deze uitprinten, en ik kan in diezelfde methode cijfer.volgende(); er bij zetten en dan print 'ie het volgende getal uit (zet cijfer 4, print 5 etc). Ik weet wat ik in Kofferslot.volgende ongeveer moet zetten, maar die andere twee zijn een raadsel.

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
public class Kofferslot {

    public static void main(String[] args) {

        Kofferslot slot = new Kofferslot();
        slot.printCombinatie();
        
    }
    
    private Letter letters[]; 
    private Cijfer cijfer;

    Kofferslot() {
        cijfer = new Cijfer();
        cijfer.setCijfer(4);
        cijfer.volgende();
    }

    Kofferslot(char letter1, char letter2, int cijfer) {    
    }

    public void setCombinatie(char letter1, char letter2, int cijfer) {  
    }
    
    public void volgende(){
        cijfer.volgende();
    }

    public void printCombinatie() {
        System.out.println(this.cijfer.getCijfer());
    }
}


Bij veel dingen die ik probeer krijg ik een 'dereferenced' error.

Acties:
  • 0 Henk 'm!

  • Ghehe
  • Registratie: April 2011
  • Laatst online: 09-10 18:13

Ghehe

400 pound hacker

Je moet nu net zoals je voor het cijfer hebt gedaan in de constructor, dit ook doen voor de 2 letters en die dan in je array zetten.

In de constructor met de parameters, maak je ook een cijfer en 2 letters aan maar geef je de waarde van de parameter aan het cijfer/letterobject.

In de methode setCombinatie heb je al je cijfer en letter objecten aangemaakt dus daar moet je gewoon de waarde van de objecten veranderen naar de waarde van parameters.

In de methode volgende ga je gewoon nakijken "Staat cijfer op 9 en Letter2 op Z roep dan de volgende op bij alledrie, staat cijfer op 9 maar letter2 op iets anders dan Z doe dan volgende() bij letter2 en cijfer". Ofzoiets (ik heb niet echt diep nagedacht dus het kan zijn dat er wel nog een foutje inzit :+ )

*Met Letter2 de tweede letter van links. :O

[ Voor 36% gewijzigd door Ghehe op 02-01-2012 16:08 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Dekay schreef op maandag 02 januari 2012 @ 15:56:
Bij veel dingen die ik probeer krijg ik een 'dereferenced' error.
Snap je waarom je "this" gebruikt?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Dekay
  • Registratie: December 2004
  • Laatst online: 12-10 18:45
Ik ben weer een stapje verder, ik heb het volgende nu staan:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    Kofferslot() {
        letters = new Letter[2]; //Array van twee plaatsen
        
        cijfer = new Cijfer(); //Set cijfer #
        cijfer.setCijfer(9);
        
        Letter letterEen = new Letter(); //Set eerste letter 
        letterEen.setLetter('A');
        letters[0] = letterEen;
        
        Letter letterTwee = new Letter(); //Set tweede letter
        letterTwee.setLetter('Z'); 
        letters[1] = letterTwee;
    }


En kan het ook uitprinten met
Java:
1
2
3
    public void printCombinatie() {
        System.out.println(letters[0].getLetter() + "" + letters[1].getLetter() + "" + cijfer.getCijfer());
    }


en dat zonder die NullPointerException O-). Ik had voordat ik de "" gebruikte trouwens als Output '66'. Wat betekent dat? Of vraag ik nu iets heel stoms. :P
pedorus schreef op maandag 02 januari 2012 @ 17:16:
[...]

Snap je waarom je "this" gebruikt?
Volgens mij is het zo dat wanneer je bijvoorbeeld
Java:
1
2
Kofferslot(char letter1, char letter2, int cijfer) {
}

hebt, en je gebruikt this.letter1 dat je het over letter1 hebt uit die methode (als parameter) en niet de letter1 die eerder gebruikt is. Ofzoiets.

Overigens snap ik niet helemaal waarom het zo 'moeilijk' moest met die Letter/Cijfer.volgende. Het enige wat ik gedaan heb om het werkende te krijgen is de if statement en teller++ omdraaien.


edit:
Ik ben weer verder en heb volgens mij de opdracht af, echter heb ik Kofferslot(char letter1, char letter2, int cijfer) en setCombinatie niet gebruikt:

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
public class Kofferslot {

    public static void main(String[] args) {

        Kofferslot slot = new Kofferslot();
        slot.printCombinatie();
        slot.volgende();
        slot.printCombinatie();
        
    }
    
    private Cijfer cijfer;
    private Letter letters[]; 
    
    Kofferslot() {
        letters = new Letter[2]; //Array van twee plaatsen
        
        Letter letterEen = new Letter(); //Set eerste letter 
        letterEen.setLetter('B');
        letters[0] = letterEen;
        
        Letter letterTwee = new Letter(); //Set tweede letter
        letterTwee.setLetter('Z'); 
        letters[1] = letterTwee;
        
        cijfer = new Cijfer(); //Set cijfer #
        cijfer.setCijfer(8);
    }

    Kofferslot(char letter1, char letter2, int cijfer) {
    }

    public void setCombinatie(char letter1, char letter2, int cijfer) {  
    }
    
    public void volgende(){
        if (cijfer.getCijfer() == 9) {
            if (letters[1].getLetter() == 'Z') {
                letters[0].volgende();
                letters[1].setLetter('A');
            } else {
                letters[1].volgende();
            }

            cijfer.setCijfer(0);
        } else {
            cijfer.volgende();
        }
    }

    public void printCombinatie() {
        System.out.println(letters[0].getLetter() + "" + letters[1].getLetter() + "" + cijfer.getCijfer());
    }
}


Als ik AZ9 set en deze laat printen, dan krijg ik netjes BA0 als volgende output. Heb ik onbewust iets gedaan wat eigenlijk niet de bedoeling was of iets dergelijks? Of zijn die twee dingen die ik nu niet heb gebruikt eigenlijk helemaal niet nodig?

[ Voor 48% gewijzigd door Dekay op 02-01-2012 18:16 ]


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 01:05
Wat je doet in volgende() klopt helemaal. Nou moet je ervoor zorgen dat setCombinatie() wat doet en de constructors enkel laten doen wat nodig is om het object te initialiseren. Je constructor met argumenten zou ergens setCombinatie() aan kunnen roepen.

Het gaat er niet alleen om dat het werkt, het gaat erom dat het werkt zoals de opdrachtgever het wil. :)

[ Voor 17% gewijzigd door Jaap-Jan op 02-01-2012 18:30 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Dekay schreef op maandag 02 januari 2012 @ 17:41:
Java:
1
letters[0].getLetter() + "" + letters[1].getLetter()

Ik had voordat ik de "" gebruikte trouwens als Output '66'. Wat betekent dat?
De '+' doet wat magie onder water omdat het werkt op verschillende numerieke waarden (optellen), maar ook op strings (aan elkaar plakken). Characters zijn eigenlijk ook nummers (zie Char.getNumericValue). Ik denk dat deze twee characters dus naar nummers omgezet zijn, dan opgeteld, en vervolgens als nummer naar string omgezet zijn zodat het aan de string geplakt kan worden.

De haakjes van plus staan van links naar rechts, dus vergelijk:
Java:
1
2
3
4
int a = 4;
int b = 3;
(a + b) + "bla"            // 7bla
((a + "") + b) + "bla"   // 43bla

Zie eventueel: operator precedence.

[ Voor 26% gewijzigd door Infinitive op 02-01-2012 18:37 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Dekay schreef op maandag 02 januari 2012 @ 17:41:
Volgens mij is het zo dat wanneer je bijvoorbeeld
Java:
1
2
Kofferslot(char letter1, char letter2, int cijfer) {
}

hebt, en je gebruikt this.letter1 dat je het over letter1 hebt uit die methode (als parameter) en niet de letter1 die eerder gebruikt is. Ofzoiets.
Klinkt mij vreemd in de oren. http://docs.oracle.com/ja.../java/javaOO/thiskey.html
Als ik AZ9 set en deze laat printen, dan krijg ik netjes BA0 als volgende output. Heb ik onbewust iets gedaan wat eigenlijk niet de bedoeling was of iets dergelijks? Of zijn die twee dingen die ik nu niet heb gebruikt eigenlijk helemaal niet nodig?
Je hebt nu de default constructor 'bevuilt' met troep die er niet in moet. Daar moet ofwel niks gebeuren omdat alles al goed staat gedefinieerd, of je moet daar zorgen dat letters[] en cijfer default waardes krijgen. Een probleempje hier is dat Letter() geen goede default constructor heeft.

Die testcode hoort op zeg regel 6, waar je dan bijv. slot.setCombinatie('D','U',5); gebruikt of de niet-default constructor gebruikt.
Infinitive schreef op maandag 02 januari 2012 @ 18:30:
De '+' doet wat magie onder water omdat het werkt op verschillende numerieke waarden (optellen), maar ook op strings (aan elkaar plakken).
Nou ja, magie... '+' telt 2 chars op, maar een string en een char wordt een string. Een keer een "" gebruiken op het begin is dan ook voldoende als je eens string wil (als in "" + 'd' + 'u' + 5).

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Dekay
  • Registratie: December 2004
  • Laatst online: 12-10 18:45
Bedankt voor de uitleg, dat '.this' en '+' is nu duidelijk(er). Ik had al zo'n vermoeden dat + het bij elkaar optelde.

Ik heb nu het volgende:
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
public class Kofferslot {

    public static void main(String[] args) {

        Kofferslot slot = new Kofferslot();
        slot.setCombinatie('C', 'Z', 9);
        slot.printCombinatie();
        slot.volgende();
        System.out.println("Volgende moet zijn:");
        slot.printCombinatie();
        
    }
    
    private Cijfer cijfer;
    private Letter letters[]; 
    
    Kofferslot() {
        letters = new Letter[2]; //Array van twee plaatsen
        
        Letter letterEen = new Letter(); //Set eerste letter 
        letters[0] = letterEen;
        
        Letter letterTwee = new Letter(); //Set tweede letter
        letters[1] = letterTwee;
        
        cijfer = new Cijfer(); //Set cijfer #
    }

    Kofferslot(char letter1, char letter2, int cijfer) { 
    }

    public void setCombinatie(char letter1, char letter2, int cijfer) {
        letters[0].setLetter(letter1);
        letters[1].setLetter(letter2);
        this.cijfer.setCijfer(cijfer);
    }
    
    public void volgende(){
        if (cijfer.getCijfer() == 9) {
            if (letters[1].getLetter() == 'Z') {
                letters[0].volgende();
                letters[1].setLetter('A');
            } else {
                letters[1].volgende();
            }

            cijfer.setCijfer(0);
        } else {
            cijfer.volgende();
        }
    }

    public void printCombinatie() {
        System.out.println(letters[0].getLetter() + "" + letters[1].getLetter() + "" + cijfer.getCijfer());
    }
}


Ik kan nu setCombinatie gebruiken en daar dus de combinatie in de main zetten in plaats van in Kofferslot();. Klopt het nu? Of moet ik nog steeds iets in de Kofferslot(char letter1, char letter2, int cijfer) zetten?

Acties:
  • 0 Henk 'm!

  • Ghehe
  • Registratie: April 2011
  • Laatst online: 09-10 18:13

Ghehe

400 pound hacker

Dekay schreef op dinsdag 03 januari 2012 @ 12:15:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Kofferslot {

    public static void main(String[] args) {

        Kofferslot slot = new Kofferslot();
        slot.setCombinatie('C', 'Z', 9);
        ...
        
    }
    
    private Cijfer cijfer;
    private Letter letters[]; 

    Kofferslot(char letter1, char letter2, int cijfer) { 
    }

    public void setCombinatie(char letter1, char letter2, int cijfer) {
        letters[0].setLetter(letter1);
        letters[1].setLetter(letter2);
        this.cijfer.setCijfer(cijfer);
    }
}


Of moet ik nog steeds iets in de Kofferslot(char letter1, char letter2, int cijfer) zetten?
Het moet niet maar het is wel een goede oefening want later ga je dit waarschijnlijk wel doen. :P Je main-methode bevat nu 2 regels voor het instantiëren van een klasse. Je roept eenmaal de constructor op om je object te maken en eenmaal om dingen goed te zetten in die instantievariabelen.

Net daarvoor is een constructor (het goed instantiëren van een object en waarden/variabelen in dat object). En daarom heb je ook een constructor met parameters om dat meteen te doen via 1 methode-aanroep.

Maar het "moet" niet, het is alleen best practice. :)

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 01:05
Misschien een tip voor je: verplaats alles wat je in je default constructor hebt staan naar de andere constructor en roep vanuit de default constructor de andere constructor aan en geef wat default- waarden mee (ik heb ze geïnitialiseerd op 'A', 'A', 0, zou je met setCombinatie() kunnen doen, of anders pedorus' tip gebruiken van de extra constructors voor Cijfer en Letter). Je weet nu wat het 'this'- keyword is, dan zou je ook moeten weten hoe je een andere constructor kan aanroepen vanuit een constructor.

[ Voor 8% gewijzigd door Jaap-Jan op 03-01-2012 13:03 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • Bartjeh
  • Registratie: September 2010
  • Laatst online: 13-10 11:55
Ghehe schreef op dinsdag 03 januari 2012 @ 12:36:
[...]
snip
Maar het "moet" niet, het is alleen best practice. :)
Daarbij heeft het aanwezig zijn van de parameterized constructor ook weinig geen zin als je er niks mee doet :)

@TS: Gezien ik zelf student ben, zou ik er maar vanuit gaan dat de bedoeling van de opdracht ook is dat je iets doet met die constructor :)

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Jaap-Jan schreef op dinsdag 03 januari 2012 @ 12:45:
Misschien een tip voor je: verplaats alles wat je in je default constructor hebt staan naar de andere constructor en roep vanuit de default constructor de andere constructor aan en geef wat default- waarden mee
Ik vraag me af of dit echt mooier is. Stel dat de default waarde van een letter ooit veranderd (zeg we gaan kleine letters gebruiken ipv grote) dan moet je dit op meerdere plekken veranderen. Het zou mooier zijn als Kofferslot geen enkele constante bevat (dus ook niet in volgende()). :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

pedorus schreef op dinsdag 03 januari 2012 @ 13:26:
[...]

Ik vraag me af of dit echt mooier is. Stel dat de default waarde van een letter ooit veranderd (zeg we gaan kleine letters gebruiken ipv grote) dan moet je dit op meerdere plekken veranderen. Het zou mooier zijn als Kofferslot geen enkele constante bevat (dus ook niet in volgende()). :p
For the record (en interesting voor onze scholier :) ): Dit word een "telescoping" constructor genoemd. Dit pattern word soms inderdaad als een anti-pattern gezien; Het builder pattern is een populair alternatief. Als je dan toch meerdere constructors gebruikt zou ik hem zelf volgens het telescoping pattern gebruiken.

Een rede om in de constructor de default waardes mee te geven is zodat je ook in de JavaDoc van de constructor makkelijk kan documenteren met wat voor defaults het object geconstruct word. Als je dit uit elkaar trekt door het in constants te doen word het naar mijn idee juist lastiger om te onderhouden.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Het probleem met de documentatie lijkt me op te lossen door gewoon te verwijzen naar standaardwaardes. In Oracle's documentatie laten ze het soms ook gewoon in het midden (voorbeeld: welke encoding?).

Ik dacht trouwens niet aan een keuze tussen telescoping/builder/factory (waarbij eigenlijk optional parameters ontbreken in java), omdat het hier maar om 2 constructors gaat. Voor 2 constructors van zo'n 2 regels lijkt het me ook niet zo nodig dat de een de ander aanroept, duidelijker wordt het er niet echt op. De java tutorial schrijft ze ook gewoon uit. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1