Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[PHP] for, while en do while met hetzelfde resultaat*

Pagina: 1
Acties:

Verwijderd

Topicstarter
Als school opdracht moet ik een figuur maken dmv een for, while en do while lus.

figuur:

123456
o12345
oo1234
ooo123
oooo12
ooooo1

Ik heb even een "o" gebruikt ipv een spatie.

Als for lus heb ik hem nu voor elkaar maar ik krijg de while lus niet goed.

For lus:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
        for ($rij = 6; $rij > 0; --$rij)
        {
            for ($spatie = 0; $spatie < 6 - $rij; ++$spatie)
            {
                echo "O";
            }
            for ($getal = 1; $getal <= $rij; ++$getal)
            {
                echo "$getal";
            }
            echo "<br />";
        }
?>


While lus:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
        $rij = 6;
        while ($rij > 0) 
        {
            --$rij;
            $spatie = 0;
            while ($spatie < 6 - $rij)
                {
                ++$spatie;
                echo "O";
                $getal = 1;
                while ($getal <= $rij)
                    {
                    ++$getal;
                    echo "$getal";
                    echo "<br />";
                    }
                }
        }
?>

Mijn while lus doet nu allemaal vreemde dingen en ik kom er niet achter waarom...

[ Voor 3% gewijzigd door Verwijderd op 24-03-2013 08:22 ]


  • kutagh
  • Registratie: Augustus 2009
  • Laatst online: 09:23
Je hebt nu de getallen while in de spatie while staan terwijl ze in je for na elkaar komen.

Verwijderd

Topicstarter
kutagh schreef op zondag 24 maart 2013 @ 08:39:
Je hebt nu de getallen while in de spatie while staan terwijl ze in je for na elkaar komen.
Ik heb hem er nu buiten gezet maar hij klopt nog niet.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        $rij = 6;
        while ($rij > 0) 
                {
            --$rij;
            $spatie = 0;
            while ($spatie < 6 - $rij) 
                {
                ++$spatie;
                echo "O";
                }
            $getal = 1;
            while ($getal <= $rij) 
                {
                ++$getal;
                echo "$getal";
                echo "<br />";
                }
                }


Ondertussen pier ik er nog even mee verder.

  • Big Womly
  • Registratie: Oktober 2007
  • Laatst online: 01-09 13:39

Big Womly

Live forever, or die trying

In je for lus wordt de --$rij op het einde van je iteratie uitgevoerd. In je while lus wordt die in het begin van je iteratie uitgevoerd.

When you talk to God it's called prayer, but when God talks to you it's called schizophrenia


Verwijderd

Topicstarter
Big Womly schreef op zondag 24 maart 2013 @ 08:58:
In je for lus wordt de --$rij op het einde van je iteratie uitgevoerd. In je while lus wordt die in het begin van je iteratie uitgevoerd.
Zou je dat wat specifieker uit willen leggen?
Ik zit nu al een tijdje met die code te schuiven maar het werkt gewoon niet, php is ook nieuw voor mij.

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 15:54

Onbekend

...

Tip: Probeer eens de for-lus te maken met $rij-- i.p.v. --$rij. Doe dit dan meteen ook met $getal en $spatie in de andere for-lussen.

Als dit is gelukt, probeer dan op basis van deze forlussen dit om te zetten in while-loops.

Speel ook Balls Connect en Repeat


  • Groentjuh
  • Registratie: September 2011
  • Laatst online: 16:00
Laat ik big womly's reactie even duidelijker maken door de loop even uit te schrijven.

Bij jouw for-loop krijg je:
PHP:
1
2
3
4
5
6
7
8
9
10
11
$rij = 6;
if ($rij > 0) {
    //Doe andere dingen die je moet doen om die regel te krijgen
    echo $rij;
    $rij--;
}
if ($rij > 0) {
    //Doe andere dingen die je moet doen om die regel te krijgen
    echo $rij;
    $rij--;
}

etc etc etc etc
Output: 654321

Bij jouw while-loop krijg je:
PHP:
1
2
3
4
5
6
7
8
9
10
11
$rij = 6;
if ($rij > 0) {
    $rij--;
    //Doe andere dingen die je moet doen om die regel te krijgen
    echo $rij;
}
if ($rij > 0) {
    $rij--;
    //Doe andere dingen die je moet doen om die regel te krijgen
    echo $rij;
}

etc etc etc etc
Output: 543210

De plek waar je je tellers ophoogt is dus belangrijk!

Verwijderd

Topicstarter
Denk dat het meer geluk is dan wijsheid maar hij werkt.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        $rij = 6;
        while ($rij > 0) 
            {
            $spatie = 0;
            $rij--;
            while ($spatie < 5 - $rij) 
                {
                $spatie++;
                echo "O";
                }
                    $getal = 0;
                    while ($getal <= $rij) 
                        {
                        $getal++;
                        echo "$getal";
                        }
            echo "<br />";
            }


Heel erg bedankt voor de reacties!

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 30-10 12:53

Douweegbertje

Wat kinderachtig.. godverdomme

Verwijderd schreef op zondag 24 maart 2013 @ 10:17:
Denk dat het meer geluk is dan wijsheid maar hij werkt.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        $rij = 6;
        while ($rij > 0) 
            {
            $spatie = 0;
            $rij--;
            while ($spatie < 5 - $rij) 
                {
                $spatie++;
                echo "O";
                }
                    $getal = 0;
                    while ($getal <= $rij) 
                        {
                        $getal++;
                        echo "$getal";
                        }
            echo "<br />";
            }


Heel erg bedankt voor de reacties!
Ik vind dat je een goede oplossing heb gemaakt gezien de opdracht.
Nu vraag ik mij op zich wel af wie deze opdracht in godsnaam heeft bedacht want je leert er namelijk geen ruk van. Ik heb er ook even naar gekeken en het probleem ligt hem gewoon in het feit dat je juist geen goede keuze mag maken tussen:
for, while en do while if, else, else if.

En dat is best jammer, natuurlijk kan het allemaal wel.. maar juist één principe van het programmeren is 'KISS' : Wikipedia: KISS-principe en dat missen we hier.

Nu vind ik het tof dat je zelf zo goed doorgaat met het leren, en dat je ons niets voor laat kauwen. Daarom ben ik zo vrij om je nog wat tips te geven.

Probeer na zo'n opdracht eens een goede oplossing te bedenken met alle kracht die PHP heeft.
Hou wat standaarden in je hoofd, met name het itereren. Dat maak het voor je bij complexere dingen al een stuk makkelijker.

code:
1
for ($rij = 6; $rij > 0; --$rij)


Je wilt liever iets zien dat je optelt.

code:
1
for ($i=0; $i < 6; $i++;)


En in feite wil je, afhankelijk van het onderwerp je 'iteratie' apart houden van je 'variabelen'.
Je weet dat jij 6 karakters moet hebben, zorg dan dat je 6x een loop maakt, dus defineer het als iteraties en niet als rijen, letters of wat dan ook.

Tenzij je al weet wat je hebt, maar dat je dit moet verdelen.
code:
1
2
3
4
5
for ($monden < $eten)
{
 echo "voed mond";
 $monden++; //doe nog maar een mond, er is nog eten
}


Daar zit dus wel een verschil in, en op basis van wat je weet kun je ook een goede keuze maken hoe je iets wilt laten loopen.

Dan als extra heb ik ook even je opdracht uitgewerkt, met een PHP feature wat op zich wel handig is.
Het verwijderd één extra while loop:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
       $i = 0; // iteratie beginnen we op 0
        while ($i < 6)   // kleiner dan 6 (0 naar kleiner dan 6 = 6x)
        { 
            $ii = $i; // defineren van de tweede iteratie die we kleiner maken
            while($ii < 0)  // als de 2e iteratie groter is dan 0 
            {
             echo "o";  // doe dan een echo 'spatie'
             $ii--; // en maak de 2e kleiner
            }
            echo substr("123456", 0, -$i); // pak het aantal karaters MIN het aantal iteraties
            $i++; // en +1 voor onze hoofd iteratie
            echo "<br />";  // line breakje
        }


succes verder!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

douweegbertje schreef op zondag 24 maart 2013 @ 23:12:
[...]

code:
1
for ($rij = 6; $rij > 0; --$rij)


Je wilt liever iets zien dat je optelt.

code:
1
for ($i=0; $i < 6; $i++;)
Met de rest van je post ben ik het wel eens, maar deze wilde ik toch wel even aanstippen. :P Niet mogen aftrekken is onzin, soms wil je dat juist wel. Bijvoorbeeld als je een dropdown nodig hebt met jaartallen waarin je dit jaar en de 4 jaar daarvoor hebben wil. Dan zou het nogal gek zijn om niet zoiets te doen:
PHP:
1
2
for ($year = date('Y'); $year > date('Y') - 4; $year--)
    echo "<option>{$year}</option>";

Ik negeer even templating engines omdat die voor het principe niets veranderen. ;)

Dus hoewel je in veel gevallen wel wil incrementen en niet decrementen is het absoluut geen harde regel dat het niet mág ofzo. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 14-10 13:38

dusty

Celebrate Life!

Verwijderd schreef op zondag 24 maart 2013 @ 08:15:
[...]
Als for lus heb ik hem nu voor elkaar maar ik krijg de while lus niet goed.
[...]
Dat je for lus de juiste oplossing geeft is natuurlijk goed.

Er is echter natuurlijk altijd een kans aanwezig* dat er een andere oplossing voor de for lus is. Misschien een waar je geen andere lus(sen) binnen je hoofdlus hoeft te doen.

Als je zo'n oplossing kunt vinden* zal je merken dat het herschrijven ervan naar een while en een do while lus een stuk makkelijker zal zijn.

* en die is er..
douweegbertje schreef op zondag 24 maart 2013 @ 23:12:
[...]
Ik vind dat je een goede oplossing heb gemaakt gezien de opdracht.
Nu vraag ik mij op zich wel af wie deze opdracht in godsnaam heeft bedacht want je leert er namelijk geen ruk van. Ik heb er ook even naar gekeken en het probleem ligt hem gewoon in het feit dat je juist geen goede keuze mag maken tussen:
for, while en do while if, else, else if.
[...]
Je kunt gelijksoortige dingen oplossen met een for, while en do while. Juist door het te gebruiken voor hetzelfde probleem zal men de verschillen tussen de verschillende methodes leren en dus ook leren in welk geval welke oplossing makkelijker werkt.

Het probleem hier is in iedergeval juist NIET de keuze van for/while/do while.

[ Voor 39% gewijzigd door dusty op 24-03-2013 23:54 ]

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 30-10 12:53

Douweegbertje

Wat kinderachtig.. godverdomme

NMe schreef op zondag 24 maart 2013 @ 23:40:
[...]

Met de rest van je post ben ik het wel eens, maar deze wilde ik toch wel even aanstippen. :P Niet mogen aftrekken is onzin, soms wil je dat juist wel. Bijvoorbeeld als je een dropdown nodig hebt met jaartallen waarin je dit jaar en de 4 jaar daarvoor hebben wil. Dan zou het nogal gek zijn om niet zoiets te doen:
PHP:
1
2
for ($year = date('Y'); $year > date('Y') - 4; $year--)
    echo "<option>{$year}</option>";

Ik negeer even templating engines omdat die voor het principe niets veranderen. ;)

Dus hoewel je in veel gevallen wel wil incrementen en niet decrementen is het absoluut geen harde regel dat het niet mág ofzo. :)
Ik bedoel het ook niet direct als harde regel, meer als dat het vaak - meestal - etc gemakkelijker is om het gewoon +1 te doen.

PHP:
1
2
3
4
for($year=1900; $year > date("Y"); $year++)
{
   echo "<option>{$year}</option>";
}


Dat vind ik persoonlijk duidelijker. Je ziet precies dat je start bij 1900, en stopt bij het huidige jaar.
of in jou geval:

PHP:
1
2
3
4
for($year = date('Y')-4; $year > date("Y"); $year++)
{
   echo "<option>{$year}</option>";
}


Dit is natuurlijk ook gewoon per situatie, maar ik vind dat je een loop zo duidelijk moet neer zetten over wat het doet. Dan (misschien ligt het aan mij) lijkt mijn voorbeeld makkelijker te lezen.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

douweegbertje schreef op maandag 25 maart 2013 @ 10:03:
[...]

Ik bedoel het ook niet direct als harde regel, meer als dat het vaak - meestal - etc gemakkelijker is om het gewoon +1 te doen.

PHP:
1
2
3
4
for($year=1900; $year > date("Y"); $year++)
{
   echo "<option>{$year}</option>";
}


Dat vind ik persoonlijk duidelijker. Je ziet precies dat je start bij 1900, en stopt bij het huidige jaar.
of in jou geval:

PHP:
1
2
3
4
for($year = date('Y')-4; $year > date("Y"); $year++)
{
   echo "<option>{$year}</option>";
}
....en vervolgens is je dropdown verkeerdom gesorteerd omdat jij om een of andere arbitraire reden denkt dat ++ duidelijker is dan --, voor zover die überhaupt gevuld wordt door de >/<-fout. ;)

[ Voor 14% gewijzigd door NMe op 25-03-2013 10:42 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:58

.oisyn

Moderator Devschuur®

Demotivational Speaker

douweegbertje schreef op maandag 25 maart 2013 @ 10:03:
Dan (misschien ligt het aan mij) lijkt mijn voorbeeld makkelijker te lezen.
Het ligt idd aan jou. Waar het misgaat is denken dat een for-loop altijd itereert van x naar y met x<y en stapgrootte 1. Maar je zegt het zelf al, dat gebeurt niet altijd maar meestal. En puur door het feit dat het dus soms niet zo gebeurt kun je automatisch al de aanname niet meer maken "dat het wel zo zal zijn".

Als ik een for-loop zie dan zie ik een taalconstructie met een initialisatiegedeelte, evaluatiegedeelte en incrementgedeelte. Wat die gedeeltes precies doen hangt van de code af, en dus moet daar goed naar gekeken worden.

[ Voor 17% gewijzigd door .oisyn op 25-03-2013 11:19 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 30-10 12:53

Douweegbertje

Wat kinderachtig.. godverdomme

hm duidelijk :D
Thx voor de input, weer wat erbij geleerd :P

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Die opdracht is overigens helemaal niet waardeloos. Het is een goede eerste les in semantiek. Het is alleen jammer dat je op een HBO waarschijnlijk nooit daadwerkelijk de formele semantiek krijgt uitgelegd.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Grijze Vos schreef op maandag 25 maart 2013 @ 11:04:
Die opdracht is overigens helemaal niet waardeloos. Het is een goede eerste les in semantiek. Het is alleen jammer dat je op een HBO waarschijnlijk nooit daadwerkelijk de formele semantiek krijgt uitgelegd.
Mwoah, ik zou persoonlijk gekozen hebben voor een opdracht die laat zien in welke situatie je welke control structure gebruikt, en niet voor een opdracht waarin je 2 structuren hebt die minder handig zijn dan die ene die wél optimaal is. :P Dus drie kleine opdrachtjes waarin je zelf als student de meest logische control structure moet kiezen, niet eentje die je onbewust aanleert dat de drie structuren altijd interchangeable zijn. Nou zijn ze dat ook wel, maar meestal is er toch echt eentje handiger dan de andere twee. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 14-10 13:38

dusty

Celebrate Life!

NMe schreef op maandag 25 maart 2013 @ 11:23:
[...]
Mwoah, ik zou persoonlijk gekozen hebben voor een opdracht die laat zien in welke situatie je welke control structure gebruikt, en niet voor een opdracht waarin je 2 structuren hebt die minder handig zijn dan die ene die wél optimaal is. :P Dus drie kleine opdrachtjes [...]
En dat zijn waarschijnlijk de volgende opdrachten

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 30-10 12:53

Douweegbertje

Wat kinderachtig.. godverdomme

dusty schreef op maandag 25 maart 2013 @ 13:14:
[...]

En dat zijn waarschijnlijk de volgende opdrachten
Niet altijd te veel vertrouwen hebben :p
In mijn tijd werkte ik met php 5.x en moest uiteindelijk een PHP toets maken. De computerbak was voor geïnstalleerd met van alles.. echter met php 4.x :+

Vaak is dat de staat van menig applicatieontwikkelaars opleiding ;w

  • Big Womly
  • Registratie: Oktober 2007
  • Laatst online: 01-09 13:39

Big Womly

Live forever, or die trying

Onbekend schreef op zondag 24 maart 2013 @ 09:27:
Tip: Probeer eens de for-lus te maken met $rij-- i.p.v. --$rij. Doe dit dan meteen ook met $getal en $spatie in de andere for-lussen.

Als dit is gelukt, probeer dan op basis van deze forlussen dit om te zetten in while-loops.
Dat maakt in de uitvoering toch geen verschil wanneer de --$rij of $rij-- als enige instrucite op die lijn staat?!
Groentjuh schreef op zondag 24 maart 2013 @ 10:03:
Laat ik big womly's reactie even duidelijker maken door de loop even uit te schrijven.
Bedankt om het even over te nemen :)
Verwijderd schreef op zondag 24 maart 2013 @ 10:17:
Denk dat het meer geluk is dan wijsheid maar hij werkt.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        $rij = 6;
        while ($rij > 0) 
            {
            $spatie = 0;
            $rij--;
            while ($spatie < 5 - $rij) 
                {
                $spatie++;
                echo "O";
                }
                    $getal = 0;
                    while ($getal <= $rij) 
                        {
                        $getal++;
                        echo "$getal";
                        }
            echo "<br />";
            }


Heel erg bedankt voor de reacties!
Ok, het werkt, maar alvast een goede raat: Zorg ervoor dat je indentatie correct staat. Het leest eens zo aangenaam omdat het een pak overzichtelijker wordt. Nu lijkt op het eerste zicht dat je derde while een onderdeel is van je tweede.

When you talk to God it's called prayer, but when God talks to you it's called schizophrenia


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Big Womly schreef op maandag 25 maart 2013 @ 14:33:
[...]

Dat maakt in de uitvoering toch geen verschil wanneer de --$rij of $rij-- als enige instrucite op die lijn staat?!
Dat maakt inderdaad geen fluit uit. Een forloop is niet meer dan een verkorte schrijfwijze voor een while met een bepaalde structuur. Deze twee zijn synoniem:
PHP:
1
2
3
4
5
6
7
8
for ($i = 0; $i < 10; $i++)
    echo $i;

$i = 0;
while ($i < 10) {
    echo $i;
    $i++;
}

Omdat die $i++ altijd aan het einde van de loop uitgevoerd wordt op zijn eigen regel boeit het geen fluit of je een pre- of een post-increment doet. Dat geldt eigenlijk altijd tenzij je nog iets anders in je incrementgedeelte van de for doet, en in dat geval kunnen zowel pre- als post-increments zinnig zijn afhankelijk van wat je precies doet.

[ Voor 13% gewijzigd door NMe op 25-03-2013 14:39 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 14-10 13:38

dusty

Celebrate Life!

Grijze Vos schreef op maandag 25 maart 2013 @ 11:04:
[...] Het is alleen jammer dat je op een HBO waarschijnlijk nooit daadwerkelijk de formele semantiek krijgt uitgelegd.
Zo ongeveer 20 jaar geleden was dus wel het geval dat het compleet uitgelegd werd. (HBO)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 15:54

Onbekend

...

Jullie hebben gelijk. Toen ik mijn post opschreef bedoelde ik totaal iets anders, maar zoals ik het nu teruglees lijkt het nergens op. |:(

Speel ook Balls Connect en Repeat


  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 06-11 13:54
Algemene tip: Om meer inzicht te krijgen in wat een stuk code doet en waar het fout gaat, is het handig om je programma in een debugger stap voor stap uit te voeren. Dat geeft een stuk meer inzicht dan willekeurig met code te schuiven.
Welke debugger je het beste voor php kunt gebruiken weet ik niet. Ik vind het raar dat voor dit soort opdrachten php gebruikt wordt, maar mijn php-dev-omgeving (~10 jaar geleden) was een texteditor en een browser. Niet echt vriendelijk voor beginners. Ik hoop dat jij iets beters tot je beschikking hebt ;).

  • spleethoven
  • Registratie: Oktober 2010
  • Laatst online: 24-01-2024
Om php te debuggen kun je Xdebug gebruiken. Veel ides dat dit ondersteunen, al dan niet met een plugin.
Pagina: 1