HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL Kandidatnr: Eksamensdato: 18. mai 2006 Varighet: 3 timer (09:00 12:00) Fagnummer: Fagnavn: Klasse(r): LV197D Webprogrammering med PHP FU Studiepoeng: 6 Faglærer(e): Svend Andreas Horgen tlf: 73 55 92 69 Kurskonsulent Siri Wæhre Lien (tlf. 73 55 91 54) Hjelpemidler: Oppgavesettet består av: Vedlegg: Alle skrevne og trykte hjelpemidler tillatt Forsiden og 6 oppgaver, totalt 4 sider. nei Planlegg tiden godt. Hvis du føler det blir vanskelig å skrive kode eller travelt, er det bedre å skissere logikken med pseudokode eller egne ord enn ikke å gjøre noe. Dersom noe virker uklart i oppgavene, må du selv gjøre de nødvendige antagelser og få med disse i besvarelsen. Lykke til! Side 1 av 7
Sudoku-feberen brer om seg. Et standard Sudoku-brett er delt i 9 x 9 ruter, som igjen er inndelt i 9 bokser a 3 x 3 ruter. Når en løser en Sudoku, er noen tall forhåndsutfylte, og utfordringen er å fylle inn de manglende tallene fra 1 9 på riktig sted. Reglene er enkle: Tallene skal bare forekomme én gang i hver rad både loddrett og vannrett og én gang i hver boks. MERK: Dersom du ikke får til enkelte av deloppgavene, så prøv videre på neste oppgave. Det er ikke nødvendigvis slik at oppgavene har stigende vanskelighetsgrad. Det kan for eksempel være at du synes oppgave 6 er lettere enn mange andre. Oppgave 1 (20%) Lag et tomt Sudokubrett Lag et grensesnitt med kode som lager Sudoku-brettet. Det skal være tomt i første omgang. Kriterier: Bruk en tabell med 81 celler (9 rader og 9 kolonner) for å lage brettet. Hver celle i tabellen skal ha ett tekstfelt. I dette tekstfeltet skal de besøkende skrive inn tallene for å løse Sudokuen. Tekstfeltene navngis slik: RadXKolY der X og Y varierer for å reflektere i hvilken celle tekstfeltet ligger. I første kolonne skal tekstfeltene ha navnene Rad1Kol1, Rad2Kol1, Rad3Kol1,, Rad9Kol1. Du ser at her er det X- verdien som varierer. Tilsvarende vil andre kolonne ha tekstfelt med navn Rad1Kol2, Rad2Kol2, Rad3Kol2, Rad9Kol2. Slik fortsetter det. Hvis du får det til, så ta med rad- og kolonneoverskrifter (1-9). Tips: Bruk løkker for å lage skjemaet. Her er et eksempel på brettet du skal lage: Side 2 av 7
Svar: <form method="post"> <?php $antall = 9; echo "<table border='0'>";?> </form> //lager overskriftsrad echo "<th width='50'> </th>"; for ($i=1;$i<=$antall;$i++) echo "<th>$i</th>"; for ($rad=1;$rad<=$antall;$rad++){ echo "<tr>"; echo "<th>$rad</th>"; for ($kol=1; $kol<=$antall;$kol++){ echo "<td align='center'>"; $navn = "Rad". $rad. "Kol". $kol; echo "<input type='text' name='$navn' size='2' maxlength='1' />"; //navngir tekstfeltet $ echo "</td>"; echo "</tr>"; Side 3 av 7
Oppgave 2 (20%) Fyll Sudokubrett med tall fra fil I oppgave 1 skulle du lage et tomt Sudoku-brett. De som har løst Sudoku før vet at brettene skal komme med noen forhåndsutfylte tall. En strategi for å fylle brettet med innhold, er å lese inn tall fra en tekstfil, og så plassere disse i riktig celle. Anta nå at du har en tekstfil som vist i figuren til høyre. Denne filen har 81 tall gruppert sammen i 9 linjer, der hver linje har ett tall og et mellomrom. Etter siste linje, er det en tom linje, og så kommer en ny samling av tall. Hver samling utgjør ett Sudoku-brett. Tallet 0 representerer at cellen skal være tom, mens tallene 1-9 skal plasseres direkte ut på websiden med Sudoku-brettet. Lag et PHP-script som henter første brett (de ni første radene fra fil) og deretter lager et ferdig utfylt Sudoku-brett som i oppgave 1. Dette blir nokså likt med oppgave 1. Du skal ikke kode på nytt igjen, men si hva som må endres i koden (og skrive denne koden). Dersom du ikke fikk til oppgave 1 med kode, så prøv å si noe om hvilken strategi du ville brukt for å få til innlesing av tall fra fil. Her er et eksempel på hvordan brettet kan se ut når det er ferdig utfylt i henhold til første tallgruppe fra tekstfilen: For å få de grå boksene, er rett og slett tekstfeltet satt med attributtet disabled. Da kan ikke brukeren skrive inn noe i tekstfeltet, og det blir grått utseendemessig. Side 4 av 7
Svar: Mye av den samme koden som i oppgave 1. Endringer med fet skrift $antall = 9; echo "<table border='0'>"; //lager overskriftsrad echo "<th width='50'> </th>"; for ($i=1;$i<=$antall;$i++) echo "<th>$i</th>"; //fyller matrise med innhold, alternativet er å lese en og en linje fra fil. $tallene = file("brett.txt"); for ($rad=1;$rad<=$antall;$rad++){ echo "<tr>"; echo "<th>$rad</th>"; $neste_tallrekke = $tallene[$rad-1]; //har formen: "1 2 3 4 5 6 7 8 9" $temp = explode(" ", $neste_tallrekke); for ($kol=1; $kol<=$antall;$kol++){ echo "<td align='center'>"; $navn = "Rad". $rad. "Kol". $kol; echo "<input type='text' align='absmiddle' name='$navn' size='2' maxlength='1' value='"; if ($temp[$kol-1] == 0) echo "' />"; else echo $temp[$kol-1]. "' disabled />";//navngir tekstfeltet og gir det forhåndsdefinert verdi echo "</td>"; echo "</tr>"; Side 5 av 7
Oppgave 3 (10%) Teori Som du ser fra figuren i oppgave 2 kan tekstfilen ha flere brett (tre vises på figuren). Anta at tekstfilen kan ha hundrevis av brett. Beskriv med egne ord hvordan du ville gått frem for å hente et tilfeldig brett fra denne filen. Svar: Les alt inn i en matrise, og fjern tomme linjer. Du har nå X elementer, og det vil si at du har X/9 bokser. Velg et tilfeldig tall mellom 0 og X-1. Dette tallet treffer i en av boksene. Du må finne starten av boksen, og det kan gjøres ved å bruke X modulo ditt_tall og ta differansen fra ditt_tall. Da får du startelementet. Les deretter 9 rader. Andre måter? Må se mer nøye på dette når tid. Oppgave 4 (10%) Teori Det er selvsagt ikke morsomt for besøkende å løse de samme brettene hver eneste gang de kommer til siden, og noen vil sikkert løse flere brett når de først er kommet til siden din. Forklar med egne ord hvordan du ville gått frem for å tilby nye brett i ulike situasjoner. Det fins flere muligheter, beskriv de valg som fins. Svar: Cookie som husker tidligere brett. Sessions som husker brett i denne økten. Kan evt. logge inn. Database for innlogging og lagre resultatene i en tabell. Bør utdype her og si hva som er sterke og svake sider med de ulike løsningene, og ikke minst bruksområdet. Oppgave 5 (20%) Sjekk om Sudoku er riktig utfylt Anta nå at den besøkende ønsker å løse en Sudoku. Det er interessant å kunne sjekke om Sudokuen er riktig utfylt. Lag en løsning der den besøkende kan klikke på en knapp med teksten Sjekk Sudoku og så finne ut om Sudokuen er riktig utfylt eller ikke. Det vil si: Kun tall skal akspeteres. Tallene 1-9 skal forekomme kun én gang i hver rad. Samtidig skal tallene 1-9 forekomme kun én gang i hver kolonne. (Vanskeligere) Tallene 1-9 skal forekomme kun én gang i hver 3x3-kvadrant. Dersom du ikke får til å kode en løsning, så forklar hvordan du ville gått frem. Med 3x3-kvadrant menes cellene fra Rad1Kol1 til Rad3Kol3, Rad1Kol4 til Rad3Kol6, Rad1Kol7 til Rad3Kol9, Rad4Kol1 til Rad6Kol3, og så videre. Siste kvadrant er cellene mellom Rad7Kol7 til Rad9Kol9. Svar: Ikke laget løsning enda. Side 6 av 7
Oppgave 6 (20%) Lagre resultater i en database Når den besøkende har løst en Sudoku, skal han/hun kunne registrere seg i en database med navn og e-post. I tillegg skal tidspunkt registreres. Tegn et skjema for slik registrering og skriv PHP-kode som lagrer resultatet i databasen. Anta bruk av én enkelt tabell, og finn på passende feltnavn selv. Et lite tilleggsspørsmål: Er det mulig å lagre også den tiden (for eksempel 4 minutter og 8 sekunder) som den besøkende brukte på å løse Sudokuen? Forklar i så fall hvordan en kan gå frem for å løse dette (kun tekstlig forklaring). Svar: Vanskelig med PHP, for en har ingen måte å sjekke når utfylling starter. Det er mulig, for eksempel å logge tidspunkt når brett lastes, og lagre tidspunkt til sjekkknappen trykkes. En annen løsning er å benytte et JavaScript som starter en klokke i det første tall skrives inn. Side 7 av 7