while-løkker gjentar instruksjonene så lenge en betingelse er oppfylt [Kurssidene] [ ABI - fagsider bibin ] Michael Preminger (michaelp@hioa.no) 15/09-15 En liten repetisjon Løkker Arrayer (tabeller) Løkker og arrayer Avkryssingsbokser Ordet "while" er semantisk litt misvisende: på norsk kan man si : "Så lenge $i er mindre enn 5, gjenta disse instruksjonene" Eksempel 1: en enkel while-løkke En enkel while-løkke skrives på følgende vis: Programmet beslutter hvilke kodebiter skal og skal ikke utføres, ved å teste på betingelser. Slike betingelser er mer eller mindre kompliserte logiske uttrykk som koker ned til true eller false. Med løkker kan vi gjenta en sekvens av instruksjoner flere ganger. Ofte trenger vi gjenta handlinger for alle studenter i en klasse alle tekstlinjer i en fil alle filer i en mappe Løkker gir oss mulighet til å skrive programkode for en handling (vi skriver den bare én gang) få handlingen gjentatt det nødvendige antallet ganger Ser på to typer løkker. while-løkke for-løkke <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" <h1> En enkel while-løkke </h1> 2. $i=0;//oppstart (også: initiering eller initialisering) 3. while( $i < 5 ){ 5. $i = $i + 1;//oppdatering av $i - variabelen 7. print ("<p>nå er løkken slutt, fordi dollar-i er lik $i</p>"); linje 4 og 5 utføres gjentatte ganger, så lenge fortsettelsesbetingelsen (det logiske uttrykket) stemmer med virkeligheten. Linje 5 oppdaterer variabelen $i for hver omgang. Uten denne linjen blir betingelsen aldri usann (false), og løkken går evig. En enkel while-løkke dollar-i er nå lik 0 dollar-i er nå lik 1 dollar-i er nå lik 2 dollar-i er nå lik 3 dollar-i er nå lik 4 Nå er løkken slutt fordi dollar-i er lik 5 1 of 12 15.09.2015 15:28 2 of 12 15.09.2015 15:28
Eksempel 2: Enda en enkel while-løkke Nedenstående eksempel skiller seg lite fra det forrige. (linje 3 og 5). <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". <h1> Enda en enkel while-løkke </h1> 2. $i=0;//oppstart (også: initiering eller initialisering) 3. while( $i < 10 ){ 5. $i = $i + 2;//oppdatering av $i - variabelen 7. print ("<p>nå er løkken slutt, fordi dollar-i er lik $i</p>"); Enda en enkel while-løkke dollar-i er nå lik 0 dollar-i er nå lik 2 dollar-i er nå lik 4 dollar-i er nå lik 6 dollar-i er nå lik 8 Nå er løkken slutt fordi dollar-i er lik 10 Bruk av logiske uttrykk i if-tester og while-løkker Legg merke til at if-tester og while-løkker bruker nøyaktig samme type logiske uttrykk if-tester, for å finne ut om en gruppe med instruksjoner skal utføres while-løkke for å finne ut om noen linjer skal utføres én gang til (og én gang til og én gang til). for-løkker gjentar instruksjonene et gitt antall ganger. for-løkkens oppbygging: Eksempel 3: en enkel for-løkke <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". 2. print("<p>her kommer en for-løkke</p>"); 3. for ( $i = 0 ; $i < 5 ; $i = $i + 1 ){ 5. } 6. print ("<p>nå er løkken slutt, fordi dollar-i er lik $i</p>"); 7.?> Linje 3 kontrollerer løkkens gang i = 0 oppstart - tellervariabelen $i (testvariabelen) tilordnes en startverdi $i < 5 forsettelsesbetingelsen - et logisk uttrykk. Løkken slutter når denne er true. $i = $i + 1 oppdatering - for hver omgang, oppdateres testvariabelen. Her vokser verdien av $i med 1. Det logiske uttrykket testes hver omgang, for å beslutte om løkken skal utføres en omgang til. resulterer i at følgende skrives til nettleseren: Her kommer en for-løkke dollar-i er nå lik 0 dollar-i er nå lik 1 dollar-i er nå lik 2 dollar-i er nå lik 3 dollar-i er nå lik 4 Nå er løkken slutt fordi dollar-i er lik 5 3 of 12 15.09.2015 15:28 4 of 12 15.09.2015 15:28
En for-løkke er strukturert. All styringen ligger mellom klammene (Oppstart, fortsettelsesbetingelse, oppdatering) er konsentrert i for-parentesen. bare nyttekoden mellom { og }. "Parentesen" i en while-løkke oppgir bare en fortsettelsesbetingelse. Oppstart ordnes før løkkekoden starter (se linje 2 nedenfor) oppdatering ordnes som en del av løkkens "nyttekode" (mellom { og } ). En array er flere variabler som deler et variabelnavn. Flere variabler som er gruppert sammen under sammen navn. Enhver slik variabel kaller vi en array-innførsel ("array item" eller "array entry" på engelsk). Hvorfor trenger vi arrayer? Behandle grupper av studenter, tall, matvarer osv. på en systematisk måte. Nummer-indekserte arrayer (= sekvensielle arrayer): enhver innførsel har et nummer. Begge løkketyper kan, i prinsippet, brukes i alle situasjoner som krever løkker Vi bruker ofte for-løkker når vi vet hvor mange ganger løkken skal kjøres. Vi bruker while-løkker når antallet ganger løkken kjøres avhenger av ting som skjer underveis i løkkekoden. En kommentar: Dere kommer stort sett til å bruke while-løkker i deres arbeid. for-løkken er viktig å kjenne til for de av dere som skal programmere senere. Eksempel 4:(Gjentar eksempel 2 med begge former) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". <h1> Enda en enkel while-løkke </h1> 2. $i=0;//oppstart 3. while( $i < 10 ){ 5. $i = $i + 2;//oppdatering 7. print ("<p>nå er løkken slutt, fordi dollar-i er lik $i</p>"); <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". <h1> Enda en enkel for-løkke </h1> 2. //oppstart og oppdatering i parentesen 3. for ( $i = 0 ; $i < 10 ; $i = $i + 2 ){ 5. } 6. print ("<p>nå er løkken slutt, fordi dollar-i er lik $i</p>"); 7.?> arrayinnførslene skrives på følgende måte: $studenter[0], $studenter[1], $studenter[2] osv. Enhver array-innførsel kan få tilordnet en verdi, uavhengig av de andre innførslene: Eksempel 5 : Fyll noen verdier i arrayen $studenter $studenter[0]="arne"; $studenter[1]="gerd"; $studenter[2]="mona"; En kort notasjon for å befolke en array med verdier Følgende kode befolker en array med noen f å verdier, uten å oppgi indeksene. Verdiene får automatisk indekser fra 0 og oppover. Eksemplet lager samme array som forrige eksempel. $studenter = array ( " Arne ", " Gerd ", " Mona " ); for-løkken er lettere å programmere med, men vanskeligere å forstå. Dette fordi mange av detaljene, som programmereren selv må holde styr på i og rundt while-løkker, "abstraheres vekk" i for-løkken. " Arne " blir $studenter[0], " Gerd " $studenter[1] og " Mona " $studenter[2] 5 of 12 15.09.2015 15:28 6 of 12 15.09.2015 15:28
PHP-kommandoen count ( $array_navn ) Kommandoen count(argument) sørger for at PHP beregner antallet innførsler i arrayen hvis navn oppgis som argument. PHP- legger så resultatet i returvariabelen. I eksempelet nedefor heter denne $hvormangestudenter. Eksempel 6 : Finn ut størrelsen på arrayen $studenter (argumentet her er $studenter) $hvormangestudenter=count($studenter); print("$hvormangestudenter studenter er registrert i arrayen"); Resultat: 3 studenter er registrert i arrayen Legg merke til at når arrayen har 3 innførsler, er det høyeste innførselnummer 2, og ikke 3. ([0], [1] og [2]). Arrayer kan behandles systematisk i løkker. Eksempel 7: Legger inn, og skriv ut tre innførsler i arrayen $studenter. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". 2. $studenter=array("arne", "Gerd", "Mona"); 3. print("<p>her kommer student-utskriften:</p>\n"); 4. $i = 0; 5. $antall = count($studenter); // "count" teller antall inf ørsler i arrayen 6. while ($i < $antall){ 7. print("<p>$i: $studenter[$i]</p>\n"); 8. $i = $i + 1;//øk verdien til $i med èn (inkrementering) 9. } 10. print("<p>ingen flere studenter i arrayen.</p>\n"); 11.?> I nettleservinduet : Avkryssingsbokser- ikke utelukkende verdier som kan henge sammen Avkryssingsboks ligner på radioknapper, men innførslene her er ikke gjensidig utelukkende. Eksemplet nedenfor har 3 avkryssingsbokser som angir matretter det kan velges blant. Eksempel 10: Arrayen $_GET['mat'] i php-programmet respons_cb.php får like mange innførsler som det antallet avkryssingsbokser vi krysser av på. Hvis vi krysser av 2 av matrettene, får arrayen $_GET['mat'] i php-programmet 2 innførsler: $_GET['mat'][0] og $_GET['mat'][1]. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". <form action="respons_cb.php"> Hva spiser du helst? <p>hva spiser du helst? </p> Fisk <p><input type="checkbox" name="mat[]" value="fisk" /> Fisk</p> Lam <p><input type="checkbox" name="mat[]" value="lam" /> Lam</p> Ris <p><input type="checkbox" name="mat[]" value="ris" /> Ris</p> <input type="submit" /> </form> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". 1. <h1> Hva studenten spiser</h1> 2. <?php 3. $i = 0; 4. $antall = count($_get['mat']); 5. print("<p>arrayen dollar-mat har $antall innførsler:</p>"); 6. while ($i < $antall){ 7. print ("<p>$i: {$_GET['mat'][$i]}</p>\n"); 8. $i = $i + 1; 9. } 10.?> Linje 2 og 10 omslutter PHP-blokken Linje 3 tilordner variabelen $i en starverdi 0 (arrayer har 0 som første innførsel). På linje 4 finner programmet antallet avkryssingsbokser brukeren har krysset av Linje 7 og 8 gjentas s å lenge fortsettelsesbetingelsen i linje 6 holder. Her kommer student-utskriften: 0: Arne 1: Gerd 2: Mona ingen flere studenter i arrayen. 7 of 12 15.09.2015 15:28 8 of 12 15.09.2015 15:28
*Inkrementering (på dataspråket) = det å øke et tall med 1. ++ operatoren brukes istedenfor den litt lengre formen $i = $i + 1 $i = $i + 1 (inkrementering) er en meget vanlig handling i php (og andre språk). Den kan også skrives slik: $i++; ++ brukes både i while og for-løkker Eksempel 11: gjentagelse av eksempel 1, men med den nye operatoren <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". 2. $i=0;//oppstart 3. while( $i < 5 ){ 5. $i++ ;//oppdatering av $i 7. print ("<p>nå er løkken slutt, fordi dollar-i er lik $i</p>"); Eksempel 12: gjentagelse av et tidligere eksempel, men med den nye operatoren <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". 2. $studenter=array("arne", "Gerd", "Mona"); 3. print("<p>her kommer student-utskriften:</p>\n"); 4. $i = 0; 5. $antall = count($studenter);// kommandoen count teller antall inførsler i arrayen 6. while ($i < $antall){ 7. print("<p>$i: $studenter[$i]</p>\n"); 8. $i++ //øk verdien til $i med èn (inkrementering) 9. } 10. print("<p>ingen flere studenter i arrayen.</p>\n"); 11.?> Vi kan nøste løkker inn i hverandre for å behandle nøstede strukturer. Anta en høgskole. Går gjennom alle klasser. Innenfor hver klasse skriver ut navnene på alle studenter. studentløkken (8-12) nøsted inn i en klasseløkken (5-14) <?php 1. $antall_klasser=30; 2. //anta at alle klasser er like tallrike 3. $antall_elever_i_klassen=28; 4. $i=0; 5. while ( $i < $antall_klasser ){ //ytre løkke 6. $j=0; 7. skriv ut navnet til den $i te klassen 8. while ( $j < $antal_elever_i_klassen ){ //indre løkke 9. ( innrykk ) skriv ut fornavnet og etternavnet 10. til den $j te eleven 11. $j++; 12. } 13. $i++; 14. }?> Ser slikt ut i utskrift: Klasse 1A Joakim Hansen Harald Jensen Anita Str m Klasse 1B Bernt Myhre Et enklere eksempel på nøsting (om enn ikke så nyttig) er multiplikasjonstabellen. lilla bakgrunn på linje 5 (over) og 8. OBS!! Det heter $i++ (ikke $i = $i++) 9 of 12 15.09.2015 15:28 10 of 12 15.09.2015 15:28
Eksempel 13 : multiplikasjonstabellen i PHP (fritt etter Horgen (2005)) Klikk her for en version som kan brukes direkte i øvelsesoppgave 4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN". <h1>multiplikasjonstabellen</h1> 2. print( "<table>"); 3. $ytre_teller = 1;//oppstart på første rad 4. while ($ytre_teller <= 9) { 5. print("<tr>"); //starter en rad 6. $indre_teller = 1; //oppstart: første kolonne i raden 7. while ($indre_teller <= 9) { //indre, nøstet løkke (kolonnene) 8. $tall = $indre_teller * $ytre_teller; 9. print("<td>$tall</td>"); 10. $indre_teller++; 11. }//lukker den indre, nøstede løkken 12. //er nå ferdig med å lage neste rad 13. print ( "</tr>");//avslutter en rad 14. $ytre_teller++; 15. }//lukker ytre løkke 16. /*ferdig med alle radene, kan avsutte tabellen*/ 17. print ( "</table>"); 1 Dette utelates fra forelesningsstoffet. Interesserte kan lese i kompendiet, avsn. 4.5.1. Følgende skal øves inn: while-løkker for-løkker (*) arrayer basert på avkryssingsbokserbokser Horgen, S. A.(2014). Webprogrammering i PHP. (4. utg.). Trondheim:Tisip Gyldendal akademisk. Sist oppdatert 08/09-15 av Michael Preminger, michael.preminger@jbi.hio.no Programmet går gjennom alle radene i multiplikasjonstabellen. (ytre løkke) I hver rad går programmet gjennom alle kolonnene (indre løkke) avslutter hver rad med </tr> (linje 13) 1 2 3 4 5 6 7 8 9 24 6 8 1012141618 36 9 121518212427 4 8 12 16 20 24 28 32 36 51015202530354045 61218243036424854 71421283542495663 81624324048566472 91827364554637281 11 of 12 15.09.2015 15:28 12 of 12 15.09.2015 15:28