[PHP] Tentamen opdracht

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • SkylerNL
  • Registratie: Juni 2013
  • Laatst online: 04-10 19:17
Hallo,

Vanochtend heb ik mijn tentamen webprogrammeren gehad (HTML, CSS en PHP) en daar kwam de volgende vraag in voor.

Gegeven variabele:
PHP:
1
$instrument = "viool";


Maak de volgende array aan:
MuzikantInstrument
Pietviool
Johannapiano
Hillyviool
Rachelblokfluit
Tamaraharp
Hassanklarinet


PHP:
1
$muzikanten = array("Piet" => "viool", "Johanna" => "piano", "Hilly" => "viool", "Rachel" => "blokfluit", "Tamara" => "harp", "Hassan" => "klarinet");


Vraag: Laat aan de hand van de variabele $instrument zien wie dit bespeelt en hoeveel mensen dit bespelen. Er mogen geen andere functies gebruikt worden dan print()

Voorbeeld uitkomst:

$instrumentOutput
vioolPiet Hilly (2)
pianoJohanna (1)
keyboardNiemand speelt keyboard


Na afloop van het tentamen bleek dat de studenten die ik heb gesproken +-5, deze opdracht ook niet gemaakt hebben omdat ze hier ook niet uitkwamen. Enig idee hoe je dit zou kunnen oplossen?

Acties:
  • +1 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Uiteraard kan dit veel sneller met functies, maar als dat niet mag: loop door de muzikanten-array heen, check de value van de array (het instrument) met $instrument en hoog dan een teller op, print de muzikant en print daarna de teller voor het totaal?

Acties:
  • 0 Henk 'm!

  • SkylerNL
  • Registratie: Juni 2013
  • Laatst online: 04-10 19:17
Radiant schreef op maandag 31 oktober 2016 @ 14:09:
Uiteraard kan dit veel sneller met functies, maar als dat niet mag: loop door de muzikanten-array heen, check de value van de array (het instrument) met $instrument en hoog dan een teller op, print de muzikant en print daarna de teller voor het totaal?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
        /* Gebruik onderstaande variabelen in de uitwerking */
        $instrument = "viool";

        /* Begin uitwerking */
        $muzikanten = array("Piet" => "viool", "Johanna" => "piano", "Hilly" => "viool", "Rachel" => "blokfluit", "Tamara" => "harp", "Hassan" => "klarinet");

        $teller = 0;
        foreach ($muzikanten as $key => $value) {
            if ($instrument == $value) {
                $teller += 1;
                print($key . " ");
            }
        }

        if ($teller > 0) {
            print("(" . $teller . ")");
        }

        if ($teller == 0) {
            print("Niemand speelt " . $instrument);
        }
        /* Einde uitwerking */
        ?>


Heb er even mee zitten stoeien maar dan is het me ook gelukt. Bedankt voor je reactie!

Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Exact zo ja. Ik wou het zelf niet uitschrijven om je zelf te laten nadenken, dat is zo te zien gelukt, mooi :)

$teller++; kan overigens ook ipv. $teller += 1;

Acties:
  • +1 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 05-10 19:42
Ik vind de 'vereiste'
Er mogen geen andere functies gebruikt worden dan print()
nogal vaag.

Met alleen print() kom je er namelijk niet. En of dat feitelijk een function is vind ik nogal twijfelachtig.

[ Voor 16% gewijzigd door RedHat op 31-10-2016 15:47 ]


Acties:
  • 0 Henk 'm!

  • SkylerNL
  • Registratie: Juni 2013
  • Laatst online: 04-10 19:17
RedHat schreef op maandag 31 oktober 2016 @ 15:44:
Ik vind de 'vereiste'


[...]


nogal vaag.

Met alleen print() kom je er namelijk niet.
Dat vondt iedereen dus ook raar ja. Ik ga dit zeker met de docent overleggen bij de inzage.

Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 05-10 19:42
SkylerNL schreef op maandag 31 oktober 2016 @ 15:46:
[...]


Dat vondt iedereen dus ook raar ja. Ik ga dit zeker met de docent overleggen bij de inzage.
Ik ben benieuwd naar de uitkomst. Welke school / opleiding is dit?

Acties:
  • 0 Henk 'm!

  • kaesve
  • Registratie: Maart 2009
  • Laatst online: 16-05 03:04
TS heeft toch gewoon een oplossing nu die werkt, zonder gebruik van andere functies? Verder inderdaad:
print is not actually a real function (it is a language construct) so you are not required to use parentheses with its argument list.
http://php.net/manual/en/function.print.php

Acties:
  • 0 Henk 'm!

  • SkylerNL
  • Registratie: Juni 2013
  • Laatst online: 04-10 19:17
kaesve schreef op maandag 31 oktober 2016 @ 15:51:
TS heeft toch gewoon een oplossing nu die werkt, zonder gebruik van andere functies? Verder inderdaad:


[...]


http://php.net/manual/en/function.print.php
Klopt het is me gelukt :)
RedHat schreef op maandag 31 oktober 2016 @ 15:48:
[...]

Ik ben benieuwd naar de uitkomst. Welke school / opleiding is dit?
HBO-ICT op het Windesheim in Zwolle. Ik zit in het eerste jaar van de opleiding en dit was ons aller eerste tentamen.

[ Voor 34% gewijzigd door SkylerNL op 31-10-2016 15:53 ]


Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 05-10 19:42
kaesve schreef op maandag 31 oktober 2016 @ 15:51:
TS heeft toch gewoon een oplossing nu die werkt, zonder gebruik van andere functies? Verder inderdaad:


[...]


http://php.net/manual/en/function.print.php
In de opdracht staat geen functies buiten print om. Dan mogen if / where, foreach etc ook niet als het tentamen print als een function definieerd.

Acties:
  • 0 Henk 'm!

  • kaesve
  • Registratie: Maart 2009
  • Laatst online: 16-05 03:04
if/where/foreach zijn geen functies. print ook niet, maar die lijkt syntactisch wat meer op functies, en ik zou het best snappen als een student die nuance niet kent.

Acties:
  • +1 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
RedHat schreef op maandag 31 oktober 2016 @ 15:54:
[...]

In de opdracht staat geen functies buiten print om. Dan mogen if / where, foreach etc ook niet als het tentamen print als een function definieerd.
if en foreach zijn language constructs en zijn ook niet vergelijkbaar met het aanroepen van een functie, want ze hebben immers ook een statementblock die conditioneel uitgevoerd word.

Print is inderdaad ook geen echte functie, maar je gebruikt hem meestal wel hetzelfde. Dus zo vreemd is het niet om print als een functie te benoemen in de opdracht.

“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.”


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Woy schreef op maandag 31 oktober 2016 @ 16:00:
Dus zo vreemd is het niet om print als een functie te benoemen in de opdracht.
Zijn "return", "echo" en "exit" dan ook functies?
PHP:
1
2
3
exit(0);
echo('foobar');
return('foobar');


Echt, dat zeg je toch ook niet? En toch zie ik dit heel vaak.

[ Voor 10% gewijzigd door DJMaze op 31-10-2016 16:47 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
DJMaze schreef op maandag 31 oktober 2016 @ 16:46:
[...]

Zijn "return", "echo" en "exit" dan ook functies?
PHP:
1
2
3
exit(0);
echo('foobar');
return('foobar');


Echt, dat zeg je toch ook niet? En toch zie ik dit heel vaak.
echo zou ik zeker nog wel als functie durven bestempelen binnen deze opdracht. Het is namelijk gewoon een "call" die je doet, die geen invloed op de flow van het programma heeft.

return en exit hebben invloed op de flow van je programma dus dat is een ander verhaal. Het is verder ook niet zo interessant voor de opdracht of print wel/niet een functie is. Het gaat erom dat je geen andere functies mag gebruiken. Dus aangezien print geen echte functie is mag je gewoon geen functies gebruiken. Language constructs wel.

Het gaat voor een beginners opdracht veel te ver om meteen uit te leggen dat print geen functie is.

“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.”


Acties:
  • 0 Henk 'm!

  • XyritZz
  • Registratie: Augustus 2003
  • Laatst online: 06-10 15:09
SkylerNL schreef op maandag 31 oktober 2016 @ 14:40:
[...]


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
        /* Gebruik onderstaande variabelen in de uitwerking */
        $instrument = "viool";

        /* Begin uitwerking */
        $muzikanten = array("Piet" => "viool", "Johanna" => "piano", "Hilly" => "viool", "Rachel" => "blokfluit", "Tamara" => "harp", "Hassan" => "klarinet");

        $teller = 0;
        foreach ($muzikanten as $key => $value) {
            if ($instrument == $value) {
                $teller += 1;
                print($key . " ");
            }
        }

        if ($teller > 0) {
            print("(" . $teller . ")");
        }

        if ($teller == 0) {
            print("Niemand speelt " . $instrument);
        }
        /* Einde uitwerking */
        ?>


Heb er even mee zitten stoeien maar dan is het me ook gelukt. Bedankt voor je reactie!
Op het einde moet je hebben "Niemand speelt" . $key ipv $instrument, anders print je altijd "Niemand speelt viool".

I think there is a world market for maybe five computers. - Thomas Watson (1874-1956), Directeur van IBM (1943)


Acties:
  • 0 Henk 'm!

  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 23-09 14:00
XyritZz schreef op maandag 31 oktober 2016 @ 17:00:
[...]


Op het einde moet je hebben "Niemand speelt" . $key ipv $instrument, anders print je altijd "Niemand speelt viool".
Nee, dat wordt alleen weergegeven als er niemand is die viool speelt. En dat is toch precies wat je wilt?

Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 05-10 19:42
Woy schreef op maandag 31 oktober 2016 @ 16:00:
[...]

if en foreach zijn language constructs en zijn ook niet vergelijkbaar met het aanroepen van een functie, want ze hebben immers ook een statementblock die conditioneel uitgevoerd word.

Print is inderdaad ook geen echte functie, maar je gebruikt hem meestal wel hetzelfde. Dus zo vreemd is het niet om print als een functie te benoemen in de opdracht.
Ik snap best hoe het werkt, ik spreek ook alleen in relatie tot het noemen dat print een functie is.

Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

XyritZz schreef op maandag 31 oktober 2016 @ 17:00:
[...]


Op het einde moet je hebben "Niemand speelt" . $key ipv $instrument, anders print je altijd "Niemand speelt viool".
$key is de naam van de muzikant... Je bedoelde misschien $value. Wat overigens verder onjuist is omdat dat gewoon het laatste instrument uit de array is. $instrument is het enige juiste in dit geval.

Acties:
  • 0 Henk 'm!

  • Ofyles2
  • Registratie: Februari 2010
  • Laatst online: 11-01-2024
@TS: kan ik je naast if ook else en elseif aanbieden?

Geen afbouwende kritiek overigens.

Acties:
  • 0 Henk 'm!

  • SkylerNL
  • Registratie: Juni 2013
  • Laatst online: 04-10 19:17
Ofyles2 schreef op maandag 31 oktober 2016 @ 20:08:
@TS: kan ik je naast if ook else en elseif aanbieden?

Geen afbouwende kritiek overigens.
Ja ik zie nu inderdaad dat dat zou kunnen! Dank voor de input :)

Ik programmeer net 8 weken :9

Acties:
  • 0 Henk 'm!

  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
Even terzijde, de slordigheid in de opdracht geeft me kriebels. In de inputtabel worden hoofd- en kleine letters gemixt ('viool' vs 'Piano') Dat zijn belangrijke details - misschien niet voor deze opdracht maar voor programmeren absoluut wel.
Als je als docent besluit dat zoiets nog niet aan bod hoeft te komen, moet je zorgen dat het ook niet nodig is. Het is binnen de opdracht fundamenteel onmogelijk om de outputtabel te genereren, want als je exact doet wat er staat krijg je op 'piano' dat er 0 spelers zijn. Dergelijke slordigheden horen NIET in een opdracht van een vak waar dat soort dingen heel belangrijk zijn.

Never explain with stupidity where malice is a better explanation


Acties:
  • 0 Henk 'm!

  • SkylerNL
  • Registratie: Juni 2013
  • Laatst online: 04-10 19:17
incaz schreef op maandag 31 oktober 2016 @ 20:15:
Even terzijde, de slordigheid in de opdracht geeft me kriebels. In de inputtabel worden hoofd- en kleine letters gemixt ('viool' vs 'Piano') Dat zijn belangrijke details - misschien niet voor deze opdracht maar voor programmeren absoluut wel.
Als je als docent besluit dat zoiets nog niet aan bod hoeft te komen, moet je zorgen dat het ook niet nodig is. Het is binnen de opdracht fundamenteel onmogelijk om de outputtabel te genereren, want als je exact doet wat er staat krijg je op 'piano' dat er 0 spelers zijn. Dergelijke slordigheden horen NIET in een opdracht van een vak waar dat soort dingen heel belangrijk zijn.
Heb het voor je aangepast ;)

Acties:
  • 0 Henk 'm!

  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
Ah, daar slaap ik stukken beter van :) Als het een fout bij het overtypen was dan neem ik mijn kritiek aan de docent terug :)

Never explain with stupidity where malice is a better explanation


Acties:
  • 0 Henk 'm!

  • SkylerNL
  • Registratie: Juni 2013
  • Laatst online: 04-10 19:17
incaz schreef op maandag 31 oktober 2016 @ 20:21:
Ah, daar slaap ik stukken beter van :) Als het een fout bij het overtypen was dan neem ik mijn kritiek aan de docent terug :)
Haha, ja dat heb ik uit de opdracht overgetypt. Mijn fout :)

Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 23:09

The Eagle

I wear my sunglasses at night

incaz schreef op maandag 31 oktober 2016 @ 20:15:
Even terzijde, de slordigheid in de opdracht geeft me kriebels. In de inputtabel worden hoofd- en kleine letters gemixt ('viool' vs 'Piano') Dat zijn belangrijke details - misschien niet voor deze opdracht maar voor programmeren absoluut wel.
Als je als docent besluit dat zoiets nog niet aan bod hoeft te komen, moet je zorgen dat het ook niet nodig is. Het is binnen de opdracht fundamenteel onmogelijk om de outputtabel te genereren, want als je exact doet wat er staat krijg je op 'piano' dat er 0 spelers zijn. Dergelijke slordigheden horen NIET in een opdracht van een vak waar dat soort dingen heel belangrijk zijn.
Iets wat een goede programmeur ongetwijfeld afvangt door zijn strings om te katten naar upper() of lower(). Afhankelijk van de casus uiteraard, soms wil je juist wel case sensitive zijn :)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
The Eagle schreef op maandag 31 oktober 2016 @ 20:38:
[...]

Iets wat een goede programmeur ongetwijfeld afvangt door zijn strings om te katten naar upper() of lower(). Afhankelijk van de casus uiteraard, soms wil je juist wel case sensitive zijn :)
Als je case insensitive wil comparen ga dan vooral niet lopen kloten met to_upper/to_lower, maar doe gewoon een case insensitive string compare. Het converteren van casing is namenlijk culture afhankelijk.

“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.”


Acties:
  • 0 Henk 'm!

  • XyritZz
  • Registratie: Augustus 2003
  • Laatst online: 06-10 15:09
EddoH schreef op maandag 31 oktober 2016 @ 19:44:
[...]


$key is de naam van de muzikant... Je bedoelde misschien $value. Wat overigens verder onjuist is omdat dat gewoon het laatste instrument uit de array is. $instrument is het enige juiste in dit geval.
Je hebt gelijk, ik las het verkeerd. Punt blijft dat $instrument op regel 1 wordt gezet als 'viool' en daarna nooit meer wordt overschreven dus er wordt enkel geteld hoeveel mensen viool spelen.

De uitwerking klopt dus niet helemaal.

Edit; ah ik had de OP ook verkeerd gelezen en dat dat het voorbeeld output tabelletje ook hetgeen was dat gegenereerd moest worden :). Dat was dus niet de bedoeling, enkel voor het instrument dat aan $instrument geassigned is moet geteld worden hoeveel mensen het bespelen.

Dan klopt die eerdere uitwerking helemaal.

Wat een rotopdracht :)

[ Voor 23% gewijzigd door XyritZz op 01-11-2016 08:43 ]

I think there is a world market for maybe five computers. - Thomas Watson (1874-1956), Directeur van IBM (1943)


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Nog een tipje om je code beter leesbaar te krijgen:
SkylerNL schreef op maandag 31 oktober 2016 @ 14:40:
[...]


PHP:
1
2
3
4
<?php
        $muzikanten = array("Piet" => "viool", "Johanna" => "piano", "Hilly" => "viool", "Rachel" => "blokfluit", "Tamara" => "harp", "Hassan" => "klarinet");

        foreach ($muzikanten as $muzikant => $instrument) {
Noem de variabelen in de foreach naar wat het is :)

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 23-09 14:00
Guillome schreef op woensdag 02 november 2016 @ 14:41:
Nog een tipje om je code beter leesbaar te krijgen:


[...]


Noem de variabelen in de foreach naar wat het is :)
Maar i, j, k, v e.d. zijn sneller te typen :+

Acties:
  • +3 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Burn in hell :P

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
Guillome schreef op woensdag 02 november 2016 @ 14:41:
Nog een tipje om je code beter leesbaar te krijgen:


[...]


Noem de variabelen in de foreach naar wat het is :)
Note dat deze benaming conflicteert met de oorspronkelijke variabele $instrument die aangeeft op welk instrument er gezocht moet worden.

(En je mag de oorspronkelijke variabele vermoedelijk niet van naam veranderen.)

Toen was mijn inspiratie op - soms kan ik echt geen goede varnaam verzinnen.

Never explain with stupidity where malice is a better explanation


Acties:
  • 0 Henk 'm!

  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 23-09 14:00
incaz schreef op woensdag 02 november 2016 @ 15:56:
[...]


Note dat deze benaming conflicteert met de oorspronkelijke variabele $instrument die aangeeft op welk instrument er gezocht moet worden.

(En je mag de oorspronkelijke variabele vermoedelijk niet van naam veranderen.)

Toen was mijn inspiratie op - soms kan ik echt geen goede varnaam verzinnen.
Dat is dus een nadeel van het niet hebben van een scope (voor variabelen), zoals in PHP. Niet dat het anders wel een slim idee was om dat te doen, maar dan overschrijf je niet per ongeluk een variabele in een hogere scope buiten de scope.

Acties:
  • 0 Henk 'm!

  • jbdeiman
  • Registratie: September 2008
  • Laatst online: 13:21
Guillome schreef op woensdag 02 november 2016 @ 14:41:
Nog een tipje om je code beter leesbaar te krijgen:


[...]


Noem de variabelen in de foreach naar wat het is :)
Dat heeft hij toch? De eerste is de key van de array, en de 2e is de value die behoort bij die key. :+

Acties:
  • 0 Henk 'm!

  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
ThomasG schreef op woensdag 02 november 2016 @ 16:17:
[...]
Dat is dus een nadeel van het niet hebben van een scope (voor variabelen), zoals in PHP. Niet dat het anders wel een slim idee was om dat te doen, maar dan overschrijf je niet per ongeluk een variabele in een hogere scope buiten de scope.
Dat heeft niks met scope te maken. Er is geen scope die ooit iets zinnigs kan maken van een
PHP:
1
 if ($instrument == $instrument)
binnen de foreach. Kan gewoon niet.

(En er wordt verder in mijn IDE keurig gewaarschuwd voor 'multiple assignments' - en al bij schrijven en niet pas runtime, dus of php het nou wel of niet accepteert, onopgemerkt hoeft het niet voorbij te gaan.)

Never explain with stupidity where malice is a better explanation


Acties:
  • 0 Henk 'm!

  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 23-09 14:00
incaz schreef op woensdag 02 november 2016 @ 16:53:
[...]


Dat heeft niks met scope te maken. Er is geen scope die ooit iets zinnigs kan maken van een
PHP:
1
 if ($instrument == $instrument)
binnen de foreach. Kan gewoon niet.
Dat zeg ik ook niet. Ik zeg dat $instrument van de foreach nu een $instrument die een scope hoger zit overschrijft. In elke zelf respecterende taal is dat niet zo. Bijvoorbeeld:
C++:
1
2
3
4
int foo = 5;
if (true) {
    int foo = 3;
}
In C++ is foo na het verlaten van de if gewoon (weer) 5, zoals het hoort. In PHP is dit 3.

Daarbij:
C++:
1
2
3
4
int foo = 3;
if (...) {
   int bar = 42;
}
Wanneer je de if verlaat bestaat bar niet (meer) in C++. In PHP wel, want het kent geen variabele scope.

[ Voor 12% gewijzigd door ThomasG op 02-11-2016 18:04 ]


Acties:
  • 0 Henk 'm!

  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
ThomasG schreef op woensdag 02 november 2016 @ 18:03:
[...]
Dat zeg ik ook niet. Ik zeg dat $instrument van de foreach nu een $instrument die een scope hoger zit overschrijft. In elke zelf respecterende taal is dat niet zo.
Ja, maar dat is helemaal niet relevant want je hebt dan gewoon nog steeds het probleem niet opgelost en nog steeds een flinke bug.
ThomasG schreef op woensdag 02 november 2016 @ 18:03:

C++:
1
2
3
4
int foo = 5;
if (true) {
    int foo = 3;
}
In C++ is foo na het verlaten van de if gewoon (weer) 5, zoals het hoort. In PHP is dit 3.
Dat is toch afschuwelijk verwarrende code? Dergelijke inner scopes lijken mij gewoon bad practice die net zo goed leiden tot vervelende bugs. Bijvoorbeeld omdat je binnen de scope geen toegang meer hebt tot de oorspronkelijke foo=5, terwijl je die juist in het voorbeeld van de TS wel nodig hebt.

Just don't do it.

Never explain with stupidity where malice is a better explanation


Acties:
  • 0 Henk 'm!

  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 23-09 14:00
incaz schreef op woensdag 02 november 2016 @ 18:30:
[...]


Ja, maar dat is helemaal niet relevant want je hebt dan gewoon nog steeds het probleem niet opgelost en nog steeds een flinke bug.


[...]


Dat is toch afschuwelijk verwarrende code? Dergelijke inner scopes lijken mij gewoon bad practice die net zo goed leiden tot vervelende bugs. Bijvoorbeeld omdat je binnen de scope geen toegang meer hebt tot de oorspronkelijke foo=5, terwijl je die juist in het voorbeeld van de TS wel nodig hebt.

Just don't do it.
Ik heb ook al aangegeven dat het niet handig is, maar het kan wel. In PHP creëer je met de volgende code een onbedoelde bug:
PHP:
1
2
3
4
$foo = 'aap noot mies';
foreach ($array as $foo => $bar) {
   // ...
}
Want als je de scope van de foreach verlaat heeft $foo als waarde de sleutel van het laatste element in $array voordat de foreach om welke reden dan ook verlaten werd. En dat zou nooit zo mogen zijn.

[ Voor 3% gewijzigd door ThomasG op 02-11-2016 18:40 ]


Acties:
  • 0 Henk 'm!

  • Lye
  • Registratie: Januari 2010
  • Laatst online: 19:26

Lye

ThomasG schreef op woensdag 02 november 2016 @ 18:36:
[...]
Want als je de scope van de foreach verlaat heeft $foo als waarde de sleutel van het laatste element in $array voordat de foreach om welke reden dan ook verlaten werd. En dat zou nooit zo mogen zijn.
Python heeft hetzelfde euvel, dit komt omdat er geen keyword is om een variabele te declareren, waardoor het niet duidelijk is of de huidige variabele, of de variabele uit een hogere scope bedoeld wordt.

Echter moet ik eerlijk zeggen dat ik dit redelijk normaal gedrag vind (vanwege het gebrek aan een declaratie keyword), en sluit ik mij bij Incaz aan, dat het anders behoorlijk verwarrende code op kan leveren.

Acties:
  • +1 Henk 'm!

  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
ThomasG schreef op woensdag 02 november 2016 @ 18:36:
[...]
Ik heb ook al aangegeven dat het niet handig is, maar het kan wel.
Ja, het kan. Iedere taal geeft je eindeloos veel mogelijkheden om erg domme dingen te doen.
Maar omdat beide invullingen in dit concrete geval bugs opleveren, is het volstrekt irrelevant.

Laat ik het even vertalen naar deze daadwerkelijke situatie.

De php-bug:
PHP:
1
2
3
4
5
6
7
$instrument = "piano";
foreach( $muzikanten as $muzikant => $instrument)
{  
   if( $instrument == $instrument){
     // geheel evalueert altijd naar true: BUG
} 
}


C++:
1
2
3
4
5
6
7
8
var instrument = "piano";
for( int i = 0; i < muzikanten.length(); i++){
   var muzikant = muzikanten[i].muzikant;
   var instrument = muzikanten[i].instrument;
   if( instrument = instrument){
     //evalueert altijd naar true: BUG
   }
}


Scoping is volstrekt niet relevant in de context van dit verhaal: scoping lost namelijk het probleem wat werd aangestipt niet op.

Ik snap prima hoe scoping werkt, maar het is hier gewoon helemaal niet relevant.

Daarnaast is de niet-scoping van php gewoon niet echt beter dan de wel-scoping van cpp. Beide vormen zijn keurig gedefinieerd en binnen hun context logisch. Beide vormen leveren ook onbedoelde bugs op (in tegenstelling tot bedoelde bugs?) als je er geen rekening mee houdt en iets fout declareert. Per ongeluk een scoped variabele aanmaken die een variabele daarbuiten overschrijft en dat niet doorhebben is in cpp echt prima voorstelbaar en mij ook gebeurd (en ik kan me eigenlijk niet voorstellen dat het anderen niet is overkomen.)

De oplossing is simpel: je stelt je IDE zo in dat 'ie waarschuwt als je binnen de functie twee keer dezelfde varname declareert, zelfs al is het legaal.

Dat is exact dezelfde oplossing als in php: stelt je IDE zo in dat 'ie waarschuwt bij multiple assignments. Zelfs al is dat legaal.

Het gaat alleen echt mis als je cpp-verwachtingen op php projecteert. Ja, php zal altijd minder goed zijn in 'cpp zijn' dan cpp. Dat geloof ik wel. Maar dat maakt de variant van cpp niet beter of minder goed, maar vooral meer cpp en minder php.

Never explain with stupidity where malice is a better explanation


Acties:
  • 0 Henk 'm!

  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 23-09 14:00
Het hele probleem is: je overschrijft een variabele in een hogere scope op een onbedoelde manier. Het voorbeeld dat jij aanhaalt heeft daar niets mee te maken, want op het moment dat je instrument declareert in de lokale scope, bestaat de instrument een scope hoger niet in de huidige scope. Dat doet precies zoals je dat in elke programmeertaal zult verwachten. Het omgekeerde is echter totaal onlogisch, en een bron van onbedoelde bugs.

Acties:
  • 0 Henk 'm!

  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
ThomasG schreef op woensdag 02 november 2016 @ 19:39:
Het hele probleem is: je overschrijft een variabele in een hogere scope op een onbedoelde manier.
Nou nee, dat is het probleem dus niet, lees het topic even terug.
Het voorbeeld dat jij aanhaalt heeft daar niets mee te maken,
Het voorbeeld dat ik aanhaalde is de situatie waar het hier in dit topic om gaat.

Guillome adviseert om ipv $key => $value te kiezen voor $muzikant => $instrument. Op zich een verstandig advies, maar in dit geval werkt het niet, zeg ik, omdat je al een variabele $instrument hebt.

Jij zegt als reactie daar weer op dat het jammer is dat php geen scoping heeft, maar zoals ik uitleg lost scoping het probleem niet op. Het probleem is namelijk dat je binnen je loop zowel de binnenste als de buitenste $instrument nodig hebt, en dat er geen scoping ter wereld is die dat op kan lossen.

Jij komt vervolgens met hele andere voorbeelden, maar die gaan niet over de situatie hier in dit topic.
Dat doet precies zoals je dat in elke programmeertaal zult verwachten. Het omgekeerde is echter totaal onlogisch, en een bron van onbedoelde bugs.
Nope, ik verwacht het gedrag van php prima hoor :)

Never explain with stupidity where malice is a better explanation


Acties:
  • 0 Henk 'm!

  • RagingPenguin
  • Registratie: December 2012
  • Niet online
ThomasG schreef op woensdag 02 november 2016 @ 19:39:
Dat doet precies zoals je dat in elke programmeertaal zult verwachten. Het omgekeerde is echter totaal onlogisch, en een bron van onbedoelde bugs.
Dat is natuurlijk maar net wat je verwacht en gewend bent. Er zijn nog zat andere talen die scoping op de 'PHP'-manier geïmplementeerd hebben.

Acties:
  • 0 Henk 'm!

  • Montaner
  • Registratie: Januari 2005
  • Laatst online: 13:14
Wat een hoop onzinnige toevoegingen, n.a.v. iemand die alleen maar onbedoeld de naam van een variabele gebruikt die in de OP al was toegewezen :D. Volgens mij is het probleem ondertussen wel opgelost. Alleen nog benieuwd naar wat de docent onder functies verstaat ;).

Acties:
  • 0 Henk 'm!

  • BarôZZa
  • Registratie: Januari 2003
  • Laatst online: 15:31
De docent had juist bonuspunten moeten geven als je de juiste array functies had gebruikt ipv een vieze loop. Onnodige loops gebruiken zijn juist een ding die ik mezelf af heb moeten afleren.

Nu verbied je de nette oplossing en blijft de vieze methode hangen 8)7

Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

BarôZZa schreef op vrijdag 04 november 2016 @ 02:37:
De docent had juist bonuspunten moeten geven als je de juiste array functies had gebruikt ipv een vieze loop. Onnodige loops gebruiken zijn juist een ding die ik mezelf af heb moeten afleren.

Nu verbied je de nette oplossing en blijft de vieze methode hangen 8)7
Het gaat natuurlijk om het leren van het toepassen van loops, lijkt me.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
EddoH schreef op vrijdag 04 november 2016 @ 07:21:
[...]


Het gaat natuurlijk om het leren van het toepassen van loops, lijkt me.
Net alsof iemand die array_keys snapt niet snapt hoe je een loop kan gebruiken..

Ik vind het een beroerde opdracht:
  • data staat verkeer opgeslagen, iemand kan meer dan 1 instrument bespelen normaal gesproken
  • functies verbieden is verkeerd aanleren
  • "Er mogen geen andere functies gebruikt worden dan print()" is niet correct aangezien print technisch gezien geen functie is of andere language constructs zijn dat dan ook
Ik zou de opdracht flink herschrijven. Iets als:

Gegeven variabele:
PHP:
1
$amount = 251;


Maak de volgende associatieve array aan met de naam $monsters_per_player:
PlayerMonsters
Piet12
Johanna432
Hilly54
Rachel1
Tamara323
Hassan0


Vraag: Laat zien wie minimaal $amount monsters heeft en hoeveel mensen dit in totaal zijn. Gebruik print().

Voorbeeld uitkomst: vrijwel hetzelfde ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

pedorus schreef op zaterdag 05 november 2016 @ 12:51:
[...]

Net alsof iemand die array_keys snapt niet snapt hoe je een loop kan gebruiken..
:?
Als je een cursus programmeren geeft en je lesstof for-loops behandeld, dan heeft het toch geen zin om array_keys te gebruiken in een opdracht?

Verder met je eens dat de kwaliteit van de opdracht beter kan.
Pagina: 1