EKSAMEN Emnekode: Emne: ITF10208 Webprogrammering 1 Dato: Eksamenstid: 08/12-2009 09.00-13.00 Hjelpemidler: 2 A4 ark (4 sider) med egenproduserte notater (håndskrevne/maskinskrevne) Faglærer: Tom Heine Nätt Eksamensoppgaven: Oppgavesettet består av 12 sider inklusiv denne forsiden, og er inndelt i 4 deler med henholdsvis 10, 2, 2 og 3 oppgaver. Du er selv ansvarlig for å kontrollere at oppgavesettet er komplett. Det er på hver del og oppgave angitt hvor mye disse teller av totalen. Karakter fastsettes dog på basis av en helhetsvurdering av besvarelsen. Les gjennom alle oppgavene før du begynner. Husk at det ikke er gitt at oppgavene står sortert etter økende vanskelighetsgrad. Det er alltid bedre å svare noe, om så bare hvordan du ser for deg at oppgaven kunne vært løst, enn å ikke svare noe i det hele tatt. God jul, og takk for et hyggelig semester! Lykke til! Sensurdato: 08/01-2010 Karakterene er tilgjengelige for studenter på studentweb senest 2 virkedager etter oppgitt sensurfrist. Følg instruksjoner gitt på: www.hiof.no/studentweb Side 1 av 12
Del 1 Kodeforståelse (20 %) Her skal du kun svare på selve spørsmålet, og du trenger ikke forklare hvordan du kommer frem til svaret. NB! Les koden og selve spørsmålet nøye, for det kan være mange feller å gå i her... Oppgave 1.1 (2 %) $a = 2 + 4; $b = 2 + $a; $a = 3; $c = $a + $b; $c += $c; echo $a. " ". $b. " ". $c; Oppgave 1.2 (2 %) $a = 23; $b = 15; if($a < 40) echo "A"; if($b <30) echo "B"; else echo "C"; Side 2 av 12
Oppgave 1.3 (2 %) $a = (3<7); $b =!$a; if($a==true && $b==true) echo "A"; if($a==true $b==true) echo "B"; if($a!= $b) echo "C"; Oppgave 1.4 (2 %) for($i=2;$i<4;$i++) echo "A"; Oppgave 1.5 (2 %) for($i=0;$i<7;$i++) if($i<3) echo "A"; else echo "B"; Side 3 av 12
Oppgave 1.6 (2 %) $t = 0; for($i=4;$i>=0;$i-=2) $t+=$i*2; echo $t; Oppgave 1.7 (2 %) $h = array(3,5,2,6,7); $p=0; foreach($h as $e) $p = $e; echo $p; Oppgave 1.8 (2 %) function test($liste) $a = 0; foreach ($liste as $e) if($e > $a) $a = $e; return $a; $arr = array(3,5,2,3); echo test($arr); Side 4 av 12
Oppgave 1.9 (2 %) function tull($u) return $u+$u; function ball($p,$q) return $p-$q; echo tull(ball(8,3)); Oppgave 1.10 (2 %) function magisk($tall) if($tall%2==0) return $tall; else return 0; for($i=1;$i<5;$i++) echo magisk($i); Slutt Del 1 Side 5 av 12
Del 2 Grunnleggende programmering (15 %) Oppgave 2.1 (9 %) Skriv ferdig følgende funksjoner: a) En funksjon som returnerer om et tall er partall eller ei function partall($tall) b) En funksjon som returnerer summen av en liste function sum($liste) c) En funksjon som returnerer om to lister (parameterne) har samme sum (Tips: Benytt funksjonen fra deloppgave b) function sammesum($listea,$listeb) Oppgave 2.2 (6 %) Gå ut i fra at du har følgende variabler definert i et program (verdiene er eksempelverdier) som forteller om ulike sider ved været for foregående time (gjennomsnittsverdier). $temperatur = 12.3; // i C $vindhastighet = 4.6; // i m/s $vindretning = "NØ" // forkortelse for NordØstlig $nedbor = 3.7 // i antall mm Skriv logiske uttrykk for følgende påstander: a) Det regner og er vindstille b) Det blåser nord-, nordøst- eller nordvestlig vind c) Det regner mer enn 5 mm ELLER det er frost og sørøstlig vind d) Det er kuling (13.9-17.1 m/s) ELLER orkan (over 32.6 m/s) Slutt Del 2 Side 6 av 12
Del 3 Databaser og PHP (15 %) Oppgave 3.1 (8 %) En foreleser ønsker å ha en oversikt over sine "Top Gear"-klipp som benyttes til "pauseunderholdning". Han har registrert klippene i følgende databasetabell med navn klipp, men trenger litt hjelp til å lage spørringer: klipp: id tittel morsomhet lengde 1 Reliant Robin space shuttle 10 590 2 Car Dart 6 319 Her er morsomhet en skala fra 1 til 10 (10=morsomst), og lengde er tid målt i antall sekunder. Lag følgende spørringer (SELECT-setninger): a) Tittel og lengde på klipp som er morsommere enn 5. b) All informasjon om klipp som vi rekker å vise i en pause (maks 900 sekunder) sortert slik at de morsomste kommer først. c) Total lengde på alle "Top Gear"-klipp (dvs. hvor mye videomateriale har foreleseren). d) Total lengde for hvert morsomhetsnivå (dvs. hvor mye videomateriale har foreleseren på hvert av nivåene 1-10). Oppgave 3.2 (7 %) Ved hjelp av et PHP-script, list ut informasjon om alle klipp på en webside med følgende form, der klippene er sortert synkende på morsomhet: Reliant Robin space shuttle(590) 10 Car Dart (319) 6 osv... Databasen har følgende tilkoblingsinformasjon: Kjøres på "localhost" i forhold til PHP-scriptet. Brukernavn: foreleser Passord: drossap Databasenavn: topgear Slutt Del 3 Side 7 av 12
Del 4 Skjemaer og filbehandling (50 %) En foreleser skulle prøve ut et nytt system for innleveringer i faget sitt. Dette innebar at studentene skulle evaluere hverandres oppgaver. Etter hvert innså foreleseren at mye av hans arbeidstid gikk med til å behandle dette systemet, så han ønsket å automatisere det. Det er her du kommer inn i bildet, da du (heldig som du er) har fått i oppgave å lage deler av dette systemet. Hovedelementet i systemet vil være en webside som presenterer status for ukesoppgavene. Denne statussiden kan se slik ut: Gruppe 1 Uke 1 Uke 2 Uke 3 Uke 4 Uke 5 Uke 6 Uke 7 Uke 8 Uke 9 Uke 10 Gruppe 2 Gruppe 3 Foreleseren har imidlertid sagt at han selv skal lage denne statussiden. Det du skal gjøre er å lage omkringliggende funksjoner. Dette består i tre oppgaver der du først skal lage et registreringsskjema for å registrere status, så lage en hjelpefunksjon for statussiden og til slutt lage en side som automatisk genererer lister over hvilke grupper som skal evaluere hvilke. Disse tre oppgavene kan løses uavhengig av hverandre. Merk deg at godkjent/ikke godkjent registreres på gruppenivå. Tross dine iherdige forsøk på å overbevise foreleseren om at en database ville være en bedre løsning for dette, tviholder han på at du skal benytte filer til å lagre statusen for de ulike gruppene. NB! Hver av oppgavene vil inneholde mange opplysninger om løsningen. Pass på å lese oppgavene så grundig at du løser alle de problemene som oppgaveteksten ber deg om. NB! Informasjon som gis i en deloppgave kan være viktig også i påfølgende deloppgaver. Side 8 av 12
Oppgave 4.1 (20 %) Foreleseren ønsker et webbasert skjema, der gruppene selv kan registrere godkjenningene. Dette skjemaet skal se ut som følger (enkel layout): Registreringen foregår ved at en fil med navnet gruppenummer.ukenummer.dat blir opprettet. Typisk kan filnavnet være 7.4.dat, dersom registreringen gjelder gruppe 7 i uke 4. Innholdet i denne fila vil være G eller IG for hhv. godkjent og ikke godkjent. Systemet bygger i stor grad på tillitt, men en gruppe skal ikke kunne registrere noe på seg selv (dvs. gruppenummer og evaluert av må være ulike). Derfor krever websiden en kontroll av evaluert av mot passord. Logisk sett blir denne sjekken da som følger: Dersom gruppenummer er det samme som evalueringsgruppe => Feilmelding Dersom evaluert av ikke stemmer med passord => Feilmelding I alle andre tilfeller => Utfør skriving til fil Kontrollen av passord foregår ved å kalle funksjonen passordok i funksjonsbiblioteket hjelpefunksjoner.inc. Denne funksjonen returnerer en boolsk verdi: function passordok($gruppenummer,$passord) Husk å ta stilling til hvordan du åpner fila for skriving, da en gruppe skal kunne endre sin oppfatning av godkjent/ikke godkjent dersom besvarelsen blir forbedret. Du kan gå ut i fra at skjemaet er definert med følgende kode, og dermed kun skrive koden i fila skjemabehandler.php: <form action="skjemabehandler.php" method="post"> Gruppenummer: <input type="text" name="gruppenummer" /><br /> Godkjent: <input type="radio" name="godkjent" value="ja" checked="true">ja</input> <input type="radio" name="godkjent" value="nei" >Nei</input><br /> Ukenummer: <input type="text" name="ukenummer" /><br /> Evaluert av: <input type="text" name="evalgruppe" /><br /> Passord: <input type="password" name="passord" /><br /> <input type="submit" name="registrer" value="registrer" /> </form> Side 9 av 12
Oppgave 4.2 (20 %) Foreleseren har sagt at han skal lage opplistingen av statusen til ukesoppgavene selv, men trenger hjelp av deg til å lage en bestemt funksjon for funksjonsbiblioteket hjelpefunksjoner.inc. Denne funksjonen skal benyttes for å hente ut status for en bestemt gruppe på en bestemt ukesoppgave: function hentstatuskode($gruppenummer,$ukenummer) Skriv derfor en funksjon som returner følgende tallverdier: 1 dersom oppgaven er godkjent 2 dersom oppgaven ikke er godkjent 3 dersom det ikke finnes informasjon om oppgaven (dvs. fila gruppenummer.ukenummer.dat ikke finnes) Funksjonen ordner med andre ord alt av fillesing osv. Tips 1: Siden du vet at det kun er én linje i fila du skal lese, kan du droppe while-løkka og kun skrive noe lignende dette: $data = fgets($filreferanse); Tips 2: For å sjekke om en fil eksisterer kan du benytte koden: if(file_exists($filnavn)==true)... Tips 3: For enklest mulig kode, kan det være lurt å starte med sjekken på om fila ikke finnes (utfall 3), og deretter sjekke utfall 1 og 2 dersom fila fantes. Side 10 av 12
Oppgave 4.3 (10 %) En kjedelig side av dette innleveringssystemet er å hver uke generere nye "rettelister" slik at hvem som evaluerte hvem blir rotert. Du skal derfor automatisere dette. Hver retteliste er bestemt ved å "forskyve" gruppene et visst antall plasser (en såkalt offset). Selve genereringen foregår gjennom en parameter som gir en nettadresse lik dette: http://www.it.hiof.no/webprog1/retteliste.php?offset=1 Websiden vil med denne parameterverdien og 6 grupper, der gruppe 4 er blitt borte i løpet av året, bli seende slik ut: Gruppe 1 vurderer gruppe 2 Gruppe 2 vurderer gruppe 3 Gruppe 3 vurderer gruppe 5 Gruppe 5 vurderer gruppe 6 Gruppe 6 vurderer gruppe 7 Gruppe 7 vurderer gruppe 1 Sentralt i systemet vil en fil kalt grupper.dat være. Denne fila inneholder alle aktive gruppenummer, og kan se slik ut: 1 2 3 5 6 7 Merk deg altså at gruppenumrene ikke nødvendigvis er en kontinuerlig liste med tall, men snarere en registrering av "aktive" grupper. Du må derfor håndtere hver linje i fila som et "element" og ikke som et siffer. I teorien kunne vi gitt gruppene navn istedenfor nummer, og systemet skulle fungert like bra. Du kan med andre ord også gå ut i fra at fila inneholder elementene i samme rekkefølge som de skal listes opp (og forskyves). Ingen sortering er altså nødvendig. MERK: Du trenger kun ta høyde for en positiv offset i denne oppgaven. NB! Fortsetter neste side Side 11 av 12
Du skal få noen tips til en mulig løsning på denne oppgaven: 1. Les inn alle linjene (gruppenumrene) i en array 2. Iterer gjennom denne arrayen og skriv ut elementet, samtidig som du skriver ut elementet som er "offset" elementer unna. Her kan det lønne seg å benytte en forløkke, slik at du har tilgang til index. 3. Håndter flippingen rundt listen (f.eks. gruppe 7 evaluerer gruppe 1) ved å teste om indeksen går utenfor gyldige indekser i arrayen, og gjør i så tilfelle et fratrekk i indeksen tilsvarende listens lengde. Eksempel med offset=1 og den samme grupper.dat-fila Index Element i array Index med offset Element i array 0 $array[0]: 1 0+1 = 1 $array[1]: 2 1 $array[1]: 2 1+1 = 2 $array[2]: 3 2 $array[2]: 3 2+1 = 3 $array[3]: 4 3 $array[3]: 5 3+1 = 4 $array[4]: 6 4 $array[4]: 6 4+1 = 5 $array[5]: 7 5 $array[5]: 7 5+1 = 6 NB! Trekk fra lengde(6) = 0 $array[0]: 1 Tips: Følgende kode leser inn alle linjer i en fil som en array (trenger ingen lukking osv.): $grupper = file("grupper.dat"); Slutt Del 4 Side 12 av 12