Eksamen i IBE150 Programmering Høst 2010 -- svarforslag! Eksamensdag : 10.12.2010 Tid : 0900-1300 Faglærer/telefonnummer : Ketil Danielsen, 712 14212 Hjelpemidler Antall sider inkl. forsiden : 4 Målform : PC med internett, alle trykte og skrevne, kalkulator med minne. Se neste ark : Bokmål Noen generelle råd: Kladdeark skal ikke leveres. Disse blir ikke sensurert.
Les dette før du begynner (hvis du ikke har lest det; det er samme tekst som i prøveeksamen) HJELPEMIDLER: Alle trykte og skrevne, PC med ubegrenset tilgang til Internett og hjemmeområder, kalkulator med minne. SAMARBEID: Høgskolens eksamensregler tillater ikke eksamensfusk. Samarbeid med andre anses som fusk. Du får ikke lov å studere naboens dataskjerm, sende papirlapper, bruke mobiltelefon, epost, MSN, Facebook eller annet som lar deg stå i kontakt med andre personer. Datanettet overvåkes for de aktuelle chattemønstre, samt TCP-porter og serveradresser for å avdekke fusk. REFERANSE: Det anses også som fusk hvis man bruker materiale i en besvarelse, uten å gi referanse til kilden. Programkode, tekster og bilder som er laget av andre, kan du «klippe og lime inn» i ditt svar, men du MÅ gi en klar referanse til kilden. Hvis du har latt deg inspirere av skrifter eller program, SKAL du også vise til dette med referanse til kilden. En kilde er en URL (http://... o.s.v.), navnet på forfatter(e) og gjerne en tittel på materialet. Referansene skriver du for enkelhets skyld inn der de er aktuelle, gjerne i paranteser (slik at sensor lett kan sjekke de). Høgskolen har også et automatisk verktøy som kan kobles inn for å sjekke en besvarelse opp mot store tekstdatabaser. (Les mer her: http://kvalitet.himolde.no/ks_unl126) BESVARELSE Svar på papir leveres eksamensvaktene (kladdark skal ikke leveres). Digitalt svar leverer du som zippet fil i ClassFronter: Lag ei mappe på disken din (kall den MittNavn-IBE150-eksamen2010 ). I denne mappa lagrer du denne Wordfila. Du kan skrive svarene rett inn under hver oppgave! Hvis du også vil levere Visual Studio-prosjekt skal de ligge i denne mappa Lag zipfil av mappen. Denne skal leveres i ClassFronter.
Oppgave 1. Matoppskrifter (50 %) Du skal lage diverse program om matlaging. Matoppskrifter lagres på tekstfil, som i eksemplet under, en brennende pastarett. DETTE ER KUN ET EKSEMPEL. PROGRAMMENE SKAL FUNGERE FOR ANDRE RETTER OGSÅ!!!!!!! linjenr hva slags data: eksempelfil: allarrabiata.txt 1 navn på retten Penne all Arrabiata 2 antall porsjoner 4 3 1. ingrediens 400, g, penne 4 2. ingrediens 500, g, tomat 5 3. ingrediens,, peperoncino 6 4. ingrediens 1, fedd, hvitløk 7 5. ingrediens,, olivenolje......... m m+1... tegn på at ingrediensene er ferdig listet veiledning (vil gå over 0, 1 eller flere linjer),, SLUTT Fres hvitløk i olje, tilsett peperoncino og salt, og tomat (hakket). La syde et kvarter. Press gjennom et dørslag, eller bruk stavmikser (skal bli som en pure). Tilsett nesten ferdigkokt pasta, som skal få koke ferdig i sausen. Krav 1 (20 %): Lag lesoppskrift() som leser filen og legger detaljene inn i variabler og tabeller. Hver ingrediens er en struktur som legges i tabellen Ingredienser. Filens formatet er gitt over, ingrediensene starter på linje 3 og kan variere, frem til det står SLUTT (linje m). De resterende linjer (fra m+1) er veiledning i fritekst. Liten detalj: Du ser at filen fra linje nummer tre har en (1) ingrediens per linje (CSV, kommaseparert). Hvis du heller vil anta tre linjer per ingrediens er det greit (LSV, linjeseparert). Dette har vi snakket om på forelesning. Avtalen var at dere fikk velge. ---start svar: Dim rettensnavn As String Dim antallporsjoner As Integer Structure ingrediens Dim mengde As Double Dim enhet As String Dim vare As String End Structure Dim ingr(10) As ingrediens Dim antingr As Integer = 0 Dim filnavn As String = "arrabiata.txt" ' eller noe annet Sub lesoppskrift() Dim sr As IO.StreamReader = IO.File.OpenText(filnavn) rettensnavn = sr.readline() antallporsjoner = CInt(sr.readline())
Do While sr.peek <> -1 Dim felt() As String = sr.readline.split(","c) If felt.getupperbound(0) <> 2 Then Continue Do If felt(2) = "SLUTT" Then Exit Sub ' XXX burde kanskje lese veiledningen? If antingr > ingr.getupperbound(0) Then ReDim Preserve ingr(ingr.getupperbound(0) + 10) Dim nyi As Ingrediens nyi.mengde = CDbl(felt(0).trim) nyi.enhet = felt(1).trim nyi.vare = felt(2).trim ingr(antingr) = nyi antingr += 1 Loop End Sub ---slutt svar Krav 2 (10 %): Lag funksjonen viskort () som svarer med rettens navn og en sortert liste over ingredienser, for eksempel Pasta all Arrabiata: hvitløk, olivenolje, peperoncino, tomat. ---svar Function viskort() As String ' sorter tabellen ingr på varefeltet med shell eller boble Dim msg As String = rettensnavn & ": " For i = 0 To ingr.getupperbound(0) Msg &= ingr(i).vare & ", " Next Return msg End Function ---slutt svar Krav 3 (20 %). Lag prosedyren visoppskrift(n) som viser oppskrift skalert for N porsjoner. Ingredienser som bare er nevnt, uten mål og mengde, skal listes på siste linje. Her er resultatet av visoppskrift (4) Navn: Penne all Arrabiata Ingredienser (4 porsjoner): 400 g penne 500 g tomat 1 fedd hvitløk peperoncino, olivenolje Eller om en har bare to til bords: visoppskrift(2): Navn: Penne all Arrabiata Ingredienser (2 porsjoner) 200 g penne 250 g tomat 0,5 fedd hvitløk peperoncino, olivenolje Prosedyren visoppskrift() skal lese ingrediensene fra tabellen Ingredienser og ikke fra filen. ---Svar: Sub visoppskrift(byval n As Integer) Dim msg As String = "Navn: " & rettensnavn & vbcrlf & _ "Ingredienser (" & antallporsjoner & ") porsjoner" Dim andreingr As String = "" For i = 0 To ingr.getupperbound(0) If ingr(i).mengde > 0 And ingr(i).enhet <> "" Then
msg &= ingr(i).mengde * CStr((n / antallporsjoner)) & _ " " & ingr(i).enhet & " " & ingr(i).vare & vbcrlf Else andreingr &= ingr(i).vare & ", " Next MsgBox(msg & vbcrlf & andreingr) End Sub ---Slutt svar
Oppgave 2 (50 %). OPPTAKSKONTOR Opptakskontoret på en skole må si ja eller nei basert på søkerens bokstavkarakterer. Opptaksgrensen er derimot et desimaltall. Skolen har karakteromregning og opptaksgrense lagret på fila karakterregler.txt. Hver tillatte bokstavkarakter vil i denne filen ha et desimaltall som skal brukes ved omregning. Krav 1 (20 %): Lag prosedyren lesomregninger() som leser fila og legger omregningen og opptaksgrensen i tabeller og variabler for bruk senere i programmet. Fila kan se ut som i de følgende tre eksempel (opptaksgrensen i første linje). eks. 1 eks. 2 eks. 3 3,9 3,75 1,4 A 1 A 1 X 1 B 2 B 2,5 Y 1,5 C 3 C 3,0 Z 3,0 D 4 F 6,0 E 5 D 3,5 F 6 E 5,0 Her anbefales en tabell Omregninger med strukturen omregning. Liten detalj: I stedet for en (1) linje per omregning, kan du bruke to linjer (en for bokstav, en for tall), du bestemmer. --Svar: Dim opptaksgrense As Double Structure omregning Dim kar As String Dim verdi As String End Structure Dim omregninger(10) As omregning Dim antomregninger As Integer = 0 Sub lesomregninger() Dim sr As IO.StreamReader = IO.File.OpenText(filnavn) opptaksgrense = CDbl(sr.readline) Do While sr.peek <> -1 Dim f() As String = sr.readline.split Dim o As omregning o.kar = f(0) o.verdi = CDbl(f(1)) If antomregninger > omregninger.getupperbound(0) Then ReDim Preserve omregninger(omregninger.getupperbound(0) * 2) omregninger(antomregninger) = o antomregninger += 1 Loop End Sub ---slutt svar. Krav 2 (10 %). Lag funksjonen karverdi (s) som returnerer -1 hvis parameter s er en ukjent karakter, eller den tallverdi karakteren som s skal regnes om til. ---svar Function karverdi(byval s As String) As Integer For i = 0 To antomregninger - 1 If omregninger(i).kar = s Then Return omregninger(i).verdi Next Return -1
End Function ---slutt svar. Krav 2 (30 %) Lag ei løkke der bruker oppgir en streng med bokstaver (eller Ferdig ) og får regnet ut snitt og annet (se eksemplene under). Bokstavene fra bruker er atskilt med 0, 1 eller flere blanke. Ukjente bokstaver skal ignoreres og varsles om. Bruk karverdi(s) for hver bokstav i utregningen av snitt. Opptak krever at snitt er lavere eller lik opptaksgrensen. Eksempel der A=1, B=2, C=3, D=4, E=5 og F=6: Brukeren oppgir AB C. Svaret blir Innleste karakterer: A, B og C. Snitt: 2.0. Opptaksgrense: 3.9. Resultat: GODKJENT. Bruker oppgir FG EX. Svaret blir Innleste karakterer: F, E (ukjent: G, X). Snitt: 5.5. Opptaksgrense: 3.9. Resultat: AVSLÅTT. Bruker oppgir HMM : Svaret blir Innleste karakterer: (ukjent: H, M). Snitt: 0,0. Opptaksgrense: 3,9. Resultat: AVSLÅTT. Bruker oppgir Ferdig : Svaret blir Ha det. Jeg gjorde 17 omregninger. ---Svar: Sub leskarakterer() Dim antrunder As Integer = 0 Do While True antrunder += 1 Dim inn As String = InputBox("gi karakterer eller skriv Ferdig: ") If inn = "Ferdig" Then Exit Do Dim ukjent As String = "" Dim karakterer As String = "" Dim antverdier As Integer = 0 Dim sumverdi As Double = 0 For i = 0 To inn.length - 1 Dim kar As String = inn.substring(i, 1) Dim verdi As Double = karverdi(kar) If verdi = -1 then If ukjent.indexof(kar) = -1 Then ukjent &= kar & ", " Else sumverdi += verdi karakterer &= kar & ", " antverdier += 1 Next antomregninger += 1 Dim Msg As String = "Innleste karakterer: " & karakterer If ukjent <> "" Then Msg &= "(ukjent: " & ukjent & ")" Dim snitt As Double = sumverdi / antverdier Msg &= ". Snitt: " & CStr(snitt) & ". Resultat: " If snitt <= opptaksgrense Then Msg &= "GODKJENT" Else Msg &= "AVSLÅTT" MsgBox(Msg) Loop MsgBox("Ha det. Jeg gjorde " & antrunder & " omregninger") End Sub