varekategori (et felt uten blanke, IKKE case sensitiv)

Like dokumenter
Hvilke tall vises i listboksen etter at programmet er ferdig?

Eksamen i IBE202 Integrasjonslaboratorium Vår 2011 (SVARFORSLAG)

Høgskolen i Molde IBE150 Programmering Kontinuasjonseksamen (løsningsforslag) juni 2013

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

HØGSKOLEN I SØR-TRØNDELAG

Firmaet har tekstfiler som inneholder et varierende antall observasjoner. Et utdrag er f.eks.:

HØGSKOLEN I SØR-TRØNDELAG

Funksjoner og prosedyrer

Leksjon 7. Filer og unntak

Visual Basic. Repetisjon fra mandag

Løsningsforslag Øving 7

UNIVERSITETET I OSLO

** Lag Sub lesutdelinger(f as String, u as Collection) som legger alle utdelinger i f til samlingen u. Dette er litt vanskelig, men her er noen hint:

UNIVERSITETET I OSLO

HØGSKOLEN I SØR-TRØNDELAG

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Eksamen i IBE150 Programmering Høst svarforslag!

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

HØGSKOLEN I SØR-TRØNDELAG

Plan: Parameter-overføring Alias Typer (Ghezzi&Jazayeri kap.3 frem til 3.3.1) IN 211 Programmeringsspråk

Visual Basic. Repetisjon fra onsdag

UNIVERSITETET I OSLO

Jentetreff INF1000 Debugging i Java

Forside slutteksamen

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I)

HØGSKOLEN I SØR-TRØNDELAG

Løsnings forslag i java In115, Våren 1996

Fasit til eksamen høst 2002, applikasjonsutvikling

Eksamen INF1010 V2009 Del B prøveeksamen V2010 Vekt 60 %

INF1000 Prøveeksamen Oppgave 7 og 9

UNIVERSITETET I OSLO

Kapittel 9: Sortering og søking Kort versjon

UNIVERSITETET I OSLO

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Dagens tema Kapittel 8: Objekter og klasser

UNIVERSITETET I OSLO

Sensur-veiledning INF1000 h 2013 (fasit) am - 6. des. 2013

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

INF1000: noen avsluttende ord

UNIVERSITETET I OSLO

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Høgskolen i Molde IBE202 Integrasjonslab Skriftlig slutteksamen (løsningsforslag) våren 2013

Objektorientert programmering i Python

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Forelesning inf Java 5

Løse reelle problemer

Forelesning inf Java 5

Kapittel 8: Sortering og søking

Informasjon Eksamen i IN1000 og IN1001 høsten a) 1 poeng. 1b) 1 poeng. Tid. Oppgavene. Tillatte hjelpemidler. 30. november kl. 14.

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

Beskrivelse av programmeringsspråket Compila15 INF Kompilatorteknikk Våren 2015

UNIVERSITETET I OSLO

Oppgave 1 a. INF1020 Algoritmer og datastrukturer. Oppgave 1 b

INF1010 våren 2018 tirsdag 23. januar

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

2 Om statiske variable/konstanter og statiske metoder.

INF 1010, vår 2005 Løsningsforslag uke 11

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

Leksjon 7. Filer og unntak

Feilmeldinger, brukerinput og kontrollflyt

UNIVERSITETET I OSLO

HØGSKOLEN I SØR-TRØNDELAG

Løse reelle problemer

Øvingsforelesning 5 Python (TDT4110)

Løsningsforslag Eksamen i Programmering i Visual Basic høsten 2003 Laget av Runar Munkhaug

INF1010 våren januar. Objektorientering i Java

Algoritmer og datastrukturer Eksamen

Repitisjonskurs. Arv, Subklasser og Grensesnitt

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

Dagens tema: Sjekking

Eksamensoppgave i IFUD1025 Programmering i Java

Øvingsforelesning 5 Python (TDT4110)

TDT4100 Objektorientert programmering

Repetisjon. INF gruppe 13

UNIVERSITETET I OSLO

Kapittel 9: Sortering og søking Kort versjon

Videregående programmering 6

Læringsmål for forelesningen

Løsningsforslag til eksamen i INF1000 våren 2006

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Abaris-notat Teknisk beskrivelse av kodeverkskomponent for ICPC-2

INF 1000 Prøveeksamen. 23. november Ole Christian og Arne. Oppgave 1 (10 poeng) Er disse programsetningene lovlige i Java? Oppgave 2 (10 poeng)

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

6108 Programmering i Java. Leksjon 5. Tabeller. Roy M. Istad 2015

INF1000 Metoder. Marit Nybakken 16. februar 2004

UNIVERSITETET I OSLO

HØGSKOLEN I SØR-TRØNDELAG

TOD063 Datastrukturer og algoritmer

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

HØGSKOLEN I SØR-TRØNDELAG

Transkript:

1 Innlesing IBE150 Programmering, eksamen høst 2008, Høgskolen i Molde Importøren Tordelli tar inn varer fra Italia til Norge og har varelisten i flere tekstfiler som hver for seg har et varierende antall varer. Et utdrag av en slik fil er f.eks.: 13253443 Utstyr Imperia Imperia SP250 2351-x66a Mat Mutti Pomodoro boks, 400 g 2351-x66b mat Mutti Pomodoro boks, 1000 g REM Skoene skal ha kode som begynner med "7x" 7x-007 Sko Scarpa TGZ 507 Lag funksjonen lesvarefil ( f ) som leser inn en fil med navn f. Hver linje har flere felt som beskriver en enkelt vare: varenummer (et felt uten blanke, casesensitiv) varekategori (et felt uten blanke, IKKE case sensitiv) varenavn (fri tekst med alle slags tegn tillatt) Hvis linjen har for få felt, eller begynner med REM (kommentarlinjer), utelates den. Hvis linjen er OK, kalles nyvare ( nr, kategori, navn) som du skriver i spørsmål 2. Funksjonen skal returnere antall varer som ble innlest fra filen, eventuelt -1 hvis det oppstod feil. Fang feil. Svarforslag: Det sies at REM er starten på kommentarlinje. Under antas det at første feltet da skal være REM, ikke bare at det første feltet starter med REM (da måtte en sjekke delstrengen for de tre første tegn). En student hadde som krav at REM skulle stå fra og med posisisjon 0 (greit nok). Flere studenter åpnet filen "f.txt" og ikke den som kom i parametret f. Og, brorparten hadde varenummer som Double selv om det vitterlig kan inneholde ikketall. Kun få hadde funnet ut varenavnet (som jo er resten av strengen). Og, en enkelt hadde fundert på at kategoriene er case insensitiv og derfor tolower() et denne! Flere hadde brukt svarforslaget for 2007 og presenterte derfor urelevant opptelling av kommentarer og feil som de viste i en msgbox. function lesvarefil (byval f as string) as integer dim antvarer as integer = 0 try dim sr as io.streamreader = io.file.opentext (f) do while sr.peek() <> -1 dim s as string = sr.readline() dim a() as string = sr.split(" "c) dim sistefelt as integer = a.getupperbound(0) if sistefelt > 1 & a(0) <> "REM" then dim varenavn as string = "" for i as integer = 2 to sistefelt 1

varenavn &= a(i) & " " nyvare ( a(0), a(1), varenavn ) antvarer+= 1 loop catch ex as Exception return -1 end try return antvarer end function 2 Intern lagring De innleste varene skal lagres i en tabell i internminnet. 1. Hvordan oppstår kjøretidsfeil ved tabellbruk? Svarforslag: Hvis en adresserer tabellen utenfor dens yttergrenser, eller hvis en utvider tabellen uten at det er tilstrekkelig ledig plass. Noen foreslo at slike feil oppstår hvis en har for liten plass, og det blir for upresist. En student mente at feilen opptrer når en bruker tabellverdier som er Nothing, noe som er noe perifert, da det ikke er en tabellfeil, men bruk av et tomt innhold. 2. Forklar to måter å forholde seg til det at lageret er fullt Svarforslag: En kan a) utvide lageret eller b) ikke utvide. Hvis en utvider må en velge hvor stor utvidelsen skal være (en trenger da en utvidelses-politikk, se under). Hvis en ikke utvider, må en velge hva som skal få ligge på lager når nye varer tilkommer. Skal en ignorere nye varer eller ta ut eldre varer for å få plass til den nye (krever en utbyttings-politikk)? En bør uansett logge forkastede varer og informere på et vis, om at forkasting har skjedd. En students forslag om å lagre til tekstfil istedet, hvis det ikke er plass i tabellen, gjør at programmet blir mye mer komplisert og tungdrevet (fordi det må operere mot den mye tregere disken). 3. Forklar fordel og ulempe med bruk av ReDim i Visual Basic Svarforslag: Hvis en ikke hadde ReDim måtte en selv ordne med utvidelse (eller innskrenkning) av lagerplass. Med ReDim er jo fordelen at dette ordnes for programmereren. Ved endring må jo nytt område allokeres med tilstrekkelig plass, noe som jo ReDim ordner opp i. Ulempen er a) at det tar tid å finne nok plass (og noen må da vente), og b) at det kan ende med feil hvis tilstrekkelig plass ikke er å oppdrive. Det betyr kjøretidsfeil ( no more memory ). For programmereren betyr dette at en bør tenke seg om før en ber om utvidelser. De studenter som har svart at ReDim vedlikeholder seg selv og unngår kjøretidsfeil har bare halvparten rett. En student sa at ulempen med ReDim er at en mister innholdet (hvis en ikke da 2

bruker preserve). Dette stemmer, men er dette alltid en ulempe? Minst to studenter mente det var en ulempe at redim ikke tillot endring av dimensjonaliteten, og det kan jo være sant av og til (et eksempel hadde vært fint). 4. Ved utvidelse av lagerplass har kollega A sagt at vi skal utvide med en fast verdi hver gang, mens kollega B mener vi bør doble størrelsen hver gang vi utvider. Diskuter fordeler og ulemper. Svarforslag: Hvis en vet lite om hvor mye plass som vil komme til å bli bruk for, kan det være greit å utvide med litt i gangen. Ulempen er at hver utvidelse betyr at a) en må finne plass til den nye og deretter b) kopiere dagens over i den nye. Dette tar uansett tid, men hvis det skjer ofte er det kanskje bedre å foreta store utvidelser litt sjeldnere. Hvis en dobler hver gang vil det bli færre og færre utvidelser etterhvert, mens det blir (stegvis) mer og mer ledig plass. Er man i beit for plass er det likevel vanskelig å utvide stort, da man risikerer at det blir mye ubrukt lagerplass (fordi vi ikke vet hvor stort behovet blir). Noen studenter fremhever at det avhenger av den enheten programmet kjører på, og premieres for det. En student sa at utvidelse med fast størrelse gir en mer kontroll med minnebruken, og det var fint sagt. Ingen hadde vist med eksempel hvordan plassen ville utvikle seg (det hadde kanskje hjulpet). 5. Vis med programkode prosedyren nyvare ( nr, kategori, navn ) som ble nevnt i spørsmål 1. En vare skal lagres som et objekt av klasse Vare (opprettes med en konstruktør). Objektet legges inn i tabellen vareliste. Fang feil. Svarforslag: I forslaget under dobles lagerplass hvis fullt. Det gir mange utvidelser i starten (plassen går fra 0 til 1, 1 til 3, 3 til 7, 7 til 17,... ). Og, en leter ikke etter eventuelt ledige plasser, men legger alltid til på slutten (en student ble premiert for initiell leting etter eventuelt ledige plasser, selv om det jo tar tid). Enkelte studenter hadde lagret varer som structure (ikke som objekt av typen vare). En annen hadde ikke utvidet (hvis fullt), men en ser jo heller ikke at det er spurt etter dette i oppgaven. En tredje hadde utvidet i catch-blokken, altså hvis man hadde prøvd å lagre utenfor tabellen. dim antvarer as integer = 0 dim vareliste() as Vare sub nyvare (byval nr as string, byval kat as string, byval navn as string) try if antvarer > vareliste.getupperbound(0) redim preserve vareliste (antvarer*2) vareliste(antvarer) = new Vare (nr, kat, navn) antvarer += 1 catch ex as exception hvis utvidelsen feiler end try 3

end sub 3 Aksessorer Varene skal ha egne aksessorer (getter og setter) for alle sine attributt. 1. Skriv kode (setter) som sikrer at varens navn ikke har mer enn 50 tegn, og ikke har blanke foran og etter, f.eks. " Vetri i Fidenza " skal lagres som "Vetri i Fidenza". Svarforslag: Det er mulig at substring feiler hvis 49 er utenfor yttergrensen. Og, kanskje heter det substr. public class Vare private m_navn as string public property navn() as string set (byval v as string) m_navn = v.trim().substring(0,49) end set end property end class 2. hva er generelt sett fordeler og ulemper med aksessorer Svarforslag: Fordel er at objektet kan regulere sine egne egenskaper for å a) sikre at visse retningslinjer overholdes, og b) at det ikke oppstår feil under kjøring. De som har laget objektet ( klienten ) kan altså ikke direkte endre objektets egenskaper, men må istedet be objektet om å få gjort dette. Dette sikrer datakvaliteten sa en student så fint. Ulempen er (som med all ekstra sikkerhet og kontroll) at det tar mere tid. En student mente at aksessorer gjorde små program utrolig uoversiktlige, eller mer komplisert som en annen sa. Det er dog ikke en ulempe at man ikke har tilgang til private data uten aksessoren det er jo nettopp hemmeligholdet som er poenget. 4 Vising Anta at varene er innlest og ligger i tabellen vareliste (fra spørsmål 2). Og, vi har situasjonen: sub btnles_click () handles dim letetekst as string = inputbox("oppgi letetekst: ") if visvarer ( vareliste, letetekst, lsta ) = 0 then msgbox ("Ingen treff!") 4

end sub Lag visvarer ( vl, ss, lb) som skriver en vare per linje i listbox lb, ut fra treff på ss i varelisten vl. Eksempel: visvare( vareliste, "utti", lsta ) viser varer som har utti i enten varenummer, varenavn eller varekategori. Sjekk lb s brukbarhet. Funksjonen skal returnere antall varer som ble vist, eller -1 hvis feil. Hvis du ikke klarer dette, lag noe som viser alle varene. Svarforslag: Her lages en treff-funksjon som sentraliserer avgjørelsen om hva som er et treff. Denne er ikke casesensitiv (oppgaven sier intet om dette). Det gir litt merarbeid med konvertering. Etter litt tenking ser en at kanskje varen selv burde avgjøre om dette er et treff (at funksjonen flyttes til klassen Vare), men det gjøres altså ikke under. I forslaget sjekkes at varen er noe (ikke bare nothing). Det er viktig at listboksen overføres som referanse! function treff (dim v as vare, dim b as string) as boolean b = b.toupper() if v.navn.toupper().indexof (b) <> -1 or v.kategori.toupper().indexof (b) <> -1 or v.nummer.toupper().indexof (b) <> -1 then return true else return false end function alt II: Mer kompakt, men er den raskere? Ide fra en av studentene! function treff (dim v as vare, dim b as string) as boolean dim o as string = v.navn & " " & v.kategori & " " & v.nummer return o.toupper().indexof( b.toupper() ) <> -1 end function function visvarer (byval vl() as vare, byval ss as string, byval lb as listbox) as integer dim anttreff as integer = 0 if lb is nothing return -1 lb.items.clear() for i as integer = 0 to vl.getupperbound() if not vl(i) is nothing and treff (vl(i), ss) then lb.items.add( i & ": " & vl(i).nr & " " & vl(i).navn ) anttreff += 1 return anttreff 5

end function 5 Sortering I tillegg til vareliste trenges en tabell sortertevarer som er sortert på varens navn: Dim vareliste() as Vare Dim sortertevarer() as Vare sortervareliste ( vareliste, sortertevarer ) 1. Lag prosedyren sortervareliste ( innl, utl ) som lager tilstrekkelig plass i utl, og deretter bygger opp en utl sortert på varenavn. Merk: innl skal ikke forandres! Svarforslag: Antar at sorteringen skal være stigende. Hvis plassallokering feiler fanges det, men det vet jo ikke klienten noe om (ingen varsling). Boblesortering er valgt, men sjelden optimalt hvis store varelister. Endel studenter brukte Array.sort() uten at det ville virke så enkelt. Det antas at tabellen er fylt med varer (vil feile hvis deler peker til Nothing). sub sortervareliste (byref innl() as vare, byref utl() as vare) try utl = innl antar at utl gis lik kapasitet og innhold som innl dim sistevare as integer = utl.getupperbound(0) for i as integer = sistevare to 1 step -1 boblesorter for j as integer = 0 to i-1 if utl(i).navn > utl(i+1).navn then bytt (vil ha stigning) dim tmp as vare = utl(i) utl(i) = utl(i+1) utl(i+1) = tmp catch hvis feil i utl=innl eller ikke-varer end try end sub 2. Diskuter for og mot at tabellene overføres som verdi eller som referanse Svarforslag: Som verdi (byval) må en kopi av originalen lages (noe som tar tid å allokere, hvis tabellen er stor, og deretter kopiere inn i). Dette kan også feile hvis det er for lite ledig plass. Som referanse (byref) sendes peker til originalen, slik at en slipper å allokere og kopiere. Men, en risikerer at originalen endres feilaktig 6

(hvis det er slik at mottakeren faktisk har lov å endre, men i VB er det vanligvis slik). Vil en ha sikkerhet for innholdet foretrekkes kanskje overføring som verdi. 7