Toon posts:

Java programmeren probleem parameter in BlueJ

Pagina: 1
Acties:

Onderwerpen

Vraag


  • Espedapza2021
  • Registratie: Maart 2021
  • Laatst online: 31-03-2021
Goedemiddag,

Ik heb een probleem met mijn programma dat ik programmeer in BlueJ.

Dit is wat ik heb:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Klanten
{
private String voornaam;
private String achternaam;
private char geslacht;
private int leeftijd;
private int spaarsaldo;
public boolean gotKlantenpas;

public Klanten(char geslacht, String voornaam, String achternaam)
{
this.geslacht = geslacht;
this.voornaam = voornaam;
this.achternaam = achternaam;
leeftijd = 0;
spaarsaldo = 0;
gotKlantenpas = false;

}


Wat ik wil laten gebeuren is dat als 'M' of 'V' ingevuld word bij geslacht. Geslacht 'M' of 'V' wordt, maar als er iets anders wordt ingevuld geslacht 'O' word. Weet iemand hoe ik dit kan programmeren?

Wat ik al heb geprobeert is om verderop in het programma neer te zetten:

Java:
1
2
3
4
5
6
7
public void geslacht()
{
if ((geslacht != 'M') || ( geslacht != 'V')
{
geslacht = 'O';
} 
}


Dit lijkt overigens niet te werken en ik heb geen idee hoe ik het anders zou moeten doen.


Alvast bedankt

[Voor 2% gewijzigd door RobIII op 14-03-2021 14:39. Reden: Code tags toegevoegd]

Beste antwoord (via Espedapza2021 op 14-03-2021 12:41)


  • martyw
  • Registratie: Januari 2018
  • Laatst online: 15:05
In een geval als dit is het handig met encapsulatie te werken, door een get en set methode te definieren bij je private variabelen. Dan is het een goede gewoonte de input te controleren in je setter - je wilt een fout zo snel mogelijk behandelen in je programma. Dan is jouw programma een beetje herschreven
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
Class Klant {
        private String voornaam;
        private String achternaam;
        private char geslacht;

        Klant(char geslacht, String voornaam, String achternaam) {
                setGeslacht(geslacht);
                voornaam = voornaam;
                achternaam = achternaam;
        }

        void setGeslacht(char g) {
                if ((g == 'M') || ( g == 'V')) {
                        geslacht = g;
                }
                else {
                        System.err.println("Verwacht M of V voor geslacht, niet " + g);
                        geslacht = 'O';
                }
        }

        char getGeslacht() {
                return geslacht;
        }

}


Test met
code:
1
2
3
4
5
6
7
8
9
class Main {
        public static void main(String[] args) {
                Klant klant = new Klant('Y', "Truus", "de Mier");
                System.out.println(klant.getGeslacht());

                klant.setGeslacht('V');
                System.out.println(klant.getGeslacht());
        }
}

[Voor 9% gewijzigd door martyw op 11-03-2021 22:57]

Alle reacties


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Je mist een haakje-sluiten in je if. Elke ( moet ook een ) hebben net zoals elke { ook een } heeft.

Als je dat gefixt hebt gaat het nog steeds niet werken. Je krijgt dan bij elke invoer 'O' als geslacht. Probeer eens in gedachte stukje voor stukje na te gaan wat er gebeurt als geslacht begint met bijvoorbeeld 'M'. Met een beetje nadenken kan je dan hopelijk de fout vinden.

Anders:
spoiler:
je wilt NIET("Geslacht 'M' of 'V'"). Dat kan je rechtstreeks naar code vertalen of met Wikipedia: Wetten van De Morgan vertalen naar iets dat heel veel lijkt op wat je nu hebt.

  • YakuzA
  • Registratie: Maart 2001
  • Nu online

YakuzA

Wat denk je nou zelluf hey :X

Je Klanten class mist een ‘}’ aan het einde.

Verder is het iig handig voor de leesbaarheid als je de [code] tags gebruikt.

Wat gaan er nu fout?
Staat geslacht nu altijd op O?
Wordt je nieuwe functie wel aangeroepen? Ook de aanroep staat niet in je voorbeeld.

[Voor 58% gewijzigd door YakuzA op 11-03-2021 21:42]

Death smiles upon us all, all a man can do is smile back.
PSN


Acties:
  • Beste antwoord
  • 0Henk 'm!

  • martyw
  • Registratie: Januari 2018
  • Laatst online: 15:05
In een geval als dit is het handig met encapsulatie te werken, door een get en set methode te definieren bij je private variabelen. Dan is het een goede gewoonte de input te controleren in je setter - je wilt een fout zo snel mogelijk behandelen in je programma. Dan is jouw programma een beetje herschreven
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
Class Klant {
        private String voornaam;
        private String achternaam;
        private char geslacht;

        Klant(char geslacht, String voornaam, String achternaam) {
                setGeslacht(geslacht);
                voornaam = voornaam;
                achternaam = achternaam;
        }

        void setGeslacht(char g) {
                if ((g == 'M') || ( g == 'V')) {
                        geslacht = g;
                }
                else {
                        System.err.println("Verwacht M of V voor geslacht, niet " + g);
                        geslacht = 'O';
                }
        }

        char getGeslacht() {
                return geslacht;
        }

}


Test met
code:
1
2
3
4
5
6
7
8
9
class Main {
        public static void main(String[] args) {
                Klant klant = new Klant('Y', "Truus", "de Mier");
                System.out.println(klant.getGeslacht());

                klant.setGeslacht('V');
                System.out.println(klant.getGeslacht());
        }
}

[Voor 9% gewijzigd door martyw op 11-03-2021 22:57]


  • Gethijsem
  • Registratie: Augustus 2011
  • Laatst online: 09:58
Het is sowieso handig een must om je te houden aan code conventies, zoals indents (zeker als je code deelt met anderen). Wellicht was de missende accolade je dan eerder opgevallen ;-) .
Haal je code eens door deze bijvoorbeeld: https://codebeautify.org/javaviewer

  • bwerg
  • Registratie: Januari 2009
  • Niet online

bwerg

Internettrol

Ik kan gewoon een lap code geven die werkt, maar een zinnigere hint is hoe je dit zelf uit kan vinden...

Met je eerste stuk code wordt geslacht ook al op een bepaalde waarde gezet. Met die waarde ben je schijnbaar niet tevreden, dus kijk naar waar die waarde gezet wordt, en verander dat. Je eerste poging was om wat logica in een aparte methode te zetten, maar je moet een methode wel aanroepen voordat het wordt uitgevoerd.

Verder ben ik zelf wel voorstander van zo vroeg mogelijk leren hoe een debugger werkt, want dan zie je gewoon wat je code doet. Driekwart van de vragen die je als beginnende programmeur hebt zijn in de categorie "ik wil X, ik had verwacht dat mijn code Y dat zou doen, maar schijnbaar niet, dus waarom niet?". Met een debugger zie je gewoon concreet wat Y doet, en dan kun je zelf bedenken wat je moet aanpassen, in plaats van dat je vastloopt. Waarmee ik niet wil zeggen dat zo nu en dan een vraag stellen verkeerd is.

[Voor 7% gewijzigd door bwerg op 12-03-2021 08:39]

Heeft geen speciale krachten en is daar erg boos over.


  • Espedapza2021
  • Registratie: Maart 2021
  • Laatst online: 31-03-2021
Super bedankt allemaal. Het is me nu eindelijk gelukt.

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Dan nog even terugkomen op je originele if:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// vanuit je omschrijving
if (!(geslacht == 'M' || geslacht == 'V')) {
    geslacht = 'O';
}

// De Morgan
if (!(geslacht == 'M') && !(geslacht == 'V')) {
    geslacht = 'O';
}

// vereenvoudiging
if (geslacht != 'M' && geslacht != 'V') {
    geslacht = 'O';
}


Je had dus een && (EN/AND) nodig en geen || (OF/OR). Dus: Als het geslacht geen M is EN geen V is, dan wordt het O.

Acties:
  • +2Henk 'm!

  • ShitHappens
  • Registratie: Juli 2008
  • Laatst online: 13:26
Dit benadrukt ook nog maar weer eens het belang van Rubber Duck Testing.

Als je jezelf hardop hoort zeggen: "Geslacht wordt [onmiddellijk] O, zodra 1 van de volgende stellingen waar is: 1) geslacht is niet gelijk aan M of 2) geslacht is niet gelijk aan V", dan zou er een belletje moeten gaan rinkelen.
Op het moment dat die methode dan wordt aangeroepen met V als argument, is geslacht niet gelijk aan M en wordt check 2 niet eens gedaan, uitkomst is false. In zo'n if statement, zodra ook maar 1 vergelijking false oplevert, wordt de rest overgeslagen en meteen het hele if-blok niet uitgevoerd.

Nog een andere manier om zoiets te ondervangen:
Java:
1
2
3
if(!"M,V".contains(geslacht)) {
    geslacht = "O";
}

Maar dan zou ik zelf toch echt eens naar Enums gaan kijken :+ En genderidentiteit, AVG, Lombok annotaties enz, maar ach, schoolopdrachtje :)

  • Merethil
  • Registratie: December 2008
  • Laatst online: 15:36
ShitHappens schreef op vrijdag 12 maart 2021 @ 18:35:

Nog een andere manier om zoiets te ondervangen:
Java:
1
2
3
if(!"M,V".contains(geslacht)) {
    geslacht = "O";
}

Maar dan zou ik zelf toch echt eens naar Enums gaan kijken :+ En genderidentiteit, AVG, Lombok annotaties enz, maar ach, schoolopdrachtje :)
Dit houdt in dat mijn geslacht wel "," mag zijn, wat natuurlijk nergens op slaat :+

Oh, en @Espedapza2021 let even op het verschil tussen == en .equals als het om Strings gaat. De eerste checkt of beide objecten gelijk zijn, terwijl de tweede de inhoud van de string checkt.

  • ShitHappens
  • Registratie: Juli 2008
  • Laatst online: 13:26
Ahja, dat zijn beide inderdaad dingen waar ik ook nog wel eens in ben gestoken 😅

  • martyw
  • Registratie: Januari 2018
  • Laatst online: 15:05
Espedapza2021 schreef op vrijdag 12 maart 2021 @ 16:38:
Super bedankt allemaal. Het is me nu eindelijk gelukt.
Het is leuk als je je oplossing met ons deelt!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 01-06 19:20
Merethil schreef op vrijdag 12 maart 2021 @ 18:46:
Oh, en @Espedapza2021 let even op het verschil tussen == en .equals als het om Strings gaat. De eerste checkt of beide objecten gelijk zijn, terwijl de tweede de inhoud van de string checkt.
Iets generieker nog; dat geldt voor alle objecten. Dus alleen de primitive types vergelijk je normaliter met ==, de rest eigenlijk altijd met .equals tenzij je een specifieke reden hebt om te willen weten of het hetzelfde object is.

(Ik weet dat jij 't weet, maar di's vooral voor de OP/andere lezers).

https://niels.nu


  • Espedapza2021
  • Registratie: Maart 2021
  • Laatst online: 31-03-2021
Dit is mijn uiteindelijke resultaat:

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
public class Klanten
{
    private String voornaam;
    private String achternaam;
    private char geslacht;
    private int leeftijd;
    private int spaarsaldo;
    public boolean gotKlantenpas;
    
public Klanten(char geslacht, String voornaam, String achternaam)
    {
        setGeslacht(geslacht);
        this.voornaam = voornaam;
        this.achternaam = achternaam;
        leeftijd = 0;
        spaarsaldo = 0;
        gotKlantenpas = false;
    }
    private void setGeslacht(char g)
    {
        if ((g == 'M') || ( g == 'V')) 
        {
            geslacht = g;
        }
        else 
        {
            geslacht = 'O';
        }
    }

[Voor 1% gewijzigd door RobIII op 14-03-2021 14:39. Reden: Code tags toegevoegd]


  • Tubby
  • Registratie: Juni 2001
  • Laatst online: 14:16

Tubby

or not to be

ok, beetje mosterd na de maaltijd, maar leuk om wat feedback te geven in een poging om wat actiever te worden hier :)

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Klanten {
    private static final List<Character> ALLOWED_GESLACHT = Arrays.asList('M', 'V', 'O');

    // set defaults here if possible (better readable / easy understandable)
    private String voornaam;
    private String achternaam;
    private char geslacht;
    private int leeftijd = 0;
    private int spaarsaldo = 0;
    private boolean gotKlantenpas = false;

    public Klanten(char geslacht, String voornaam, String achternaam) {
        // variable naming shows intention 
        this.geslacht = ALLOWED_GESLACHT.contains(geslacht) ? geslacht : 'O';
        this.voornaam = voornaam;
        this.achternaam = achternaam;
    }

    // generate getters and setters (supported by any IDE) and/or use Lombok
    // no logic is expected by other dev in getters and setters
}


doe ermee wat je wil :)

[Voor 4% gewijzigd door Tubby op 17-03-2021 11:22]

tubby.nl - Artes Moriendi - q1 - bf1942 - WoT - pubg - LinkedIN


  • Hydra
  • Registratie: September 2000
  • Laatst online: 01-06 19:20
@Tubby als je suggesties gaat geven...
  • Je zou een Set gebruiken ipv een List
  • Natuurlijk is een enum hier gewoon veel beter dan een dergelijke check als dat jij voorstelt

https://niels.nu


  • Tubby
  • Registratie: Juni 2001
  • Laatst online: 14:16

Tubby

or not to be

agree; t eerste sowieso, het tweede maakt de wijziging wel groter naar buiten deze class, maar in essentie: ja

tubby.nl - Artes Moriendi - q1 - bf1942 - WoT - pubg - LinkedIN


  • bwerg
  • Registratie: Januari 2009
  • Niet online

bwerg

Internettrol

En als we toch bezig zijn zou ik bij een onbekend geslacht gewoon een exception gooien in plaats van het stilletjes als 'O' te accepteren. Zometeen vult iemand 'm' in in plaats van 'M' en je programma slikt dat alsof er niks aan de hand is. Met een enum gaat dat natuurlijk automatisch goed omdat er geen onbekende geslachten meer bestaan.

(Al weet ik dat ik dan de eisen uit de topicstart aan het veranderen ben, maar toch.)

Heeft geen speciale krachten en is daar erg boos over.


  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Niet helemaal gerelateerd aan Java programmeren, maar het verwerken van geslachten lijkt me niet nodig voor dit domein.
Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee