Beginnende Javascript vraag

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Zironako
  • Registratie: Oktober 2013
  • Laatst online: 04-10 12:08
Mijn vraag
Hallo, ik ben recent begonnen met het leren van Javascript. Nu ben ik een scriptje aan het maken met een if-statement die het Amerikaanse cijfersysteem berekent aan de hand van een score die je invult. Echter, hij geeft bij alles boven de 90 netjes A aan, maar alles daaronder B. Als ik naar de code kijk, snap ik echt niet waarom het niet wilt werken en ik hoop dus dat iemand me hier mee kan ondersteunen. De code is als volgt:

let score = 65

if (score >= 90){
console.log('A')
} else if (score >= 80 || score <= 89){
console.log('B')
} else if (score >= 70 || score <= 79){
console.log('C')
} else if (score >= 60 || score <= 69){
console.log('D')
} else{
console.log('F')
}

Hij geeft dus altijd de waarde van B aan, ondanks dat ik score 65 invul als voorbeeld.

Alle reacties


Acties:
  • +2 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 06-10 09:28
Dat komt omdat je || gebruikt, een logcal OR.
65 is lager dan 89. Dus je 2e conditie evalueert naar true.

Wat je wilt is een logcal AND; &&
De waarde moet hoger zijn dan 80 én lager dan 89.

Maar die lager dan kun je ook weg laten, want je hebt daarvoor al gecontroleerd of hij 90 was of hoger, dus je weet al dat hij 89 is of lager.

[ Voor 56% gewijzigd door frickY op 08-10-2018 13:20 ]


Acties:
  • 0 Henk 'm!

  • Zironako
  • Registratie: Oktober 2013
  • Laatst online: 04-10 12:08
frickY schreef op maandag 8 oktober 2018 @ 13:18:
Dat komt omdat je || gebruikt, een logcal OR.
65 is lager dan 89. Dus je 2e conditie evalueert naar true.

Wat je wilt is een logcal AND; &&
De waarde moet hoger zijn dan 80 én lager dan 89.

Maar die lager dan kun je ook weg laten, want je hebt daarvoor al gecontroleerd of hij 90 was of hoger, dus je weet al dat hij 89 is of lager.
Ah, wat dom zeg! Ik heb net letterlijk een half uur naar de code staan staren met de handen in het haar waarom het niet werkt en dan is de fout zo dom. Hartelijk bedankt!

Acties:
  • 0 Henk 'm!

  • Paul
  • Registratie: September 2000
  • Laatst online: 02:04
Met je code tussen
[code=js][/code]
-tags wordt het wat leesbaarder :)
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
let score = 65

if (score >= 90){
    console.log('A')
} else if (score >= 80 || score <= 89){
    console.log('B')
} else if (score >= 70 || score <= 79){
    console.log('C')
} else if (score >= 60 || score <= 69){
    console.log('D')
} else{
    console.log('F')
}

Als je stap voor stap kijkt wat het doet dan kom je tot dezelfde conclusie als @frickY, (groter of gelijk 80) OF (kleiner of gelijk 89), false OR true == true

Het is wel een beetje dubbel-op, eenmaal bij de C kan het al nooit meer hoger zijn dan 79 (tenzij je iets multi-threaded maakt wat 'score' aanpast, maar dan is dit niet de manier om daar mee om te gaan :P):
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
let score = 65

if (score >= 90){
    console.log('A')
} else if (score >= 80){
    console.log('B')
} else if (score >= 70){
    console.log('C')
} else if (score >= 60){
    console.log('D')
} else{
    console.log('F')
}

[ Voor 31% gewijzigd door Paul op 08-10-2018 13:24 ]

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Acties:
  • 0 Henk 'm!

  • Richh
  • Registratie: Augustus 2009
  • Laatst online: 06-10 12:42
Om het op te lossen zou je dus in plaats van '||', '&&' moeten gebruiken ;)

Je zou voor deze situatie ook eens kunnen kijken naar een switch-case oplossing.

☀️ 4500wp zuid | 🔋MT Venus 5kW | 🚗 Tesla Model 3 SR+ 2020 | ❄️ Daikin 3MXM 4kW


Acties:
  • 0 Henk 'm!

  • Zironako
  • Registratie: Oktober 2013
  • Laatst online: 04-10 12:08
Paul schreef op maandag 8 oktober 2018 @ 13:21:
Met je code tussen
~~[code=js]~~[/code]
-tags wordt het wat leesbaarder :)
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
let score = 65

if (score >= 90){
    console.log('A')
} else if (score >= 80 || score <= 89){
    console.log('B')
} else if (score >= 70 || score <= 79){
    console.log('C')
} else if (score >= 60 || score <= 69){
    console.log('D')
} else{
    console.log('F')
}

Als je stap voor stap kijkt wat het doet dan kom je tot dezelfde conclusie als @frickY, (groter of gelijk 80) OF (kleiner of gelijk 89), false OR true == true

Het is wel een beetje dubbel-op, eenmaal bij de C kan het al nooit meer hoger zijn dan 79 (tenzij je iets multi-threaded maakt wat 'score' aanpast, maar dan is dit niet de manier om daar mee om te gaan :P):
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
let score = 65

if (score >= 90){
    console.log('A')
} else if (score >= 80){
    console.log('B')
} else if (score >= 70){
    console.log('C')
} else if (score >= 60){
    console.log('D')
} else{
    console.log('F')
}
Top, bedankt voor de tip ga ik de volgende keer doen!

Acties:
  • +2 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 09:37
En goed leren debuggen. Met staren alleen kom je er meestal niet, want je blijft in je eigen denkpatroon hangen.

Als je de if/else langzaam had opgebouwd door te beginnen met:
JavaScript:
1
2
3
4
5
6
7
let score = 65;

if (score >= 60 || score <= 69){
console.log('D')
} else{
console.log('F')
}

Dan had je gezien dat elk van je condities dezelfde fout had.

Als je de fout dan alsnog niet door had gehad, dan had je de initiële score kunnen afbouwen door bijv. te beginnen bij 100 en dan in een loop naar 0 te gaan. Dan had je ook direct gezien dat hij bij alle waardes onder de 89, richting B was gegaan.

Als laatste had je nog je if/else tijdelijk kunnen omzetten naar meerdere if statements:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
let score = 65

if (score >= 90){
console.log('A')
} 
if (score >= 80 || score <= 89){
console.log('B')
} 
if (score >= 70 || score <= 79){
console.log('C')
} 
if (score >= 60 || score <= 69){
console.log('D')
}

Dan had je ook gezien dat alle condities behalve A altijd als waar evalueerden.

Het zou ook geholpen kunnen hebben je condities zo te herschrijven:
JavaScript:
1
if (60 <= score || score <= 69) ...

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

  • Fontini
  • Registratie: Februari 2012
  • Laatst online: 06-10 17:10
Ik vermoed dat je geen 'is groter of gelijk aan' operator nodig hebt. Een kleiner dan is misschien voldoende. Of zie ik iets over het hoofd? Het blijft overigens nog steeds een good practice om semi-colons ( ; ) te blijven gebruiken (klein voorbeeld waarom hier).

Edit: je kunt natuurlijk 0 - 50 weghalen.
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
let score = 90; // = J

if ( score < 10 ) { // 0 - 9
    console.log('A');
} else if ( score < 20 ) { // 10 - 19
    console.log('B');
} else if ( score < 30 ) { // 20 - 29
    console.log('C');
} else if ( score < 40 ) { // 30 - 39
    console.log('D');
} else if ( score < 50 ) { // 40 - 49
    console.log('E');
} else if ( score < 60 ) { // 50 - 59
    console.log('F');
} else if ( score < 70 ) { // 60 - 69
    console.log('G');
} else if ( score < 80 ) { // 70 - 79
    console.log('H');
} else if ( score < 90 ) { // 80 - 89
    console.log('I');
} else if ( score < 100) { // 90 - 99 hier wil je misschien wel <= gebruiken.
    console.log('J');
}

[ Voor 4% gewijzigd door Fontini op 12-10-2018 14:16 ]

Pagina: 1