h09 konte - Høgskolen i Molde

Download Report

Transcript h09 konte - Høgskolen i Molde

IBE150 Programmering, konteeksamen sommeren 2010, Høgskolen i Molde
Oppgavene har ulik vekt. Du kan f˚
a opptil 100 poeng.
1. (5 poeng)
• Hvilke tall vises i listboksen etter at programmet er ferdig?
dim x as integer
for j = 2 to 4
x = 0
for i = j to 4
lstA.items.add( cstr (x) )
x += (i + j )
next
next
svarforslag: Tallene som vises er: 0, 4, 9, 0, 6 og 0.
• Hva vises etter at kallet vis (4) er ferdig?
sub vis (byval n as integer)
lstA.items.add ( _
"heisan".substring (n, 1) & _
chr (asc (’a’) + n) & _
cstr (n / 2) )
if n > 0 then
vis (n - 2)
end if
end sub
svarforslag: Det som vises er: ae2, ic1 og ha0.
2. (5 poeng) Hva er problemene med prosedyren lagMelding (m,x) (se under),
og gi forslag til korreksjon. Denne skal forandre m, slik at denne blir et stigende
meldingsnummer etterfulgt av parametret x. Hvis det 107de kallet har x lik “Solen
skinner” blir klientens m alts˚
a “107: Solen skinner”.
sub lagMelding (byval m as string, byval x as string)
dim mldNummer as integer
mldNummer += 1
m = cstr(mldNummer) & ": " & x
end sub
svarforslag: Parameter m er lokal og endringen blir ikke gjort hos klienten (korreksjon: Bruk byval). Meldingsnummer blir alltid lik 1 fordi det er lokalt (korreksjon: Deklarer den globalt). De fleste kandidatene hadde svart med ren avskrift
av svarforslaget fra oppgave 2, høsten 2009 (bare delvis korrekt).
3. (30 poeng) Lag et program som summerer opp antall blankseparerte ord i en fil.
Kun annenhver linje regnes med. Ord er casesensitive, alts˚
a er “hei” og “hEi” ikke
samme ordet. Etter tellingen gis informasjon om antall ord og linjer, hvor lange
1
IBE150 Programmering, konteeksamen sommeren 2010, Høgskolen i Molde
Oppgavene har ulik vekt. Du kan f˚
a opptil 100 poeng.
de lengste ordene var (antall tegn), antall ord som hadde denne makslengden, og
gjennomsnittlig antall ord per opptelt linje. Ved I/O-feil gis feilmelding.
svarforslag: De fleste hadde ren avskrift av svarforslaget til oppgave 3 fra høsten
2009. Her var litt som kunne brukes, inkludert en syntaksfeil (variabel ord i stedet
for felt), men mye var annerledes. Svarforslaget under er ikke testet.
sub tellFil (byref fn as string)
dim mld as string = fn & ": "
try
dim inn as io.file.streamreader = io.file.opentext(fn)
dim antOrd, antLinjer, antTegn as integer
dim lengsteOrd as string = ""
dim antLengsteOrd as integer = 0
do while inn.peek() <> -1
dim linje as string = inn.readline()
if inn.peek() <> -1 then
dim linje2 as string
linje2 = inn.readline() ’ skal kastes
end if
antLinjer += 1
dim felt() as string = linje.split()
for i = 0 to felt.getupperindex(0)
if felt(i).length > 0
antTegn += felt(i).length
antOrd += 1
if felt(i).length > lengsteOrd.length then
lengsteOrd = felt(i)
antLengsteOrd = 1
else if felt(i).length = lengsteOrd.length then
antLengsteOrd += 1
end if
end if
next
loop
mld &= cstr(antLinjer) & " linjer, " & _
cstr(antOrd) & " ord, " &_
cstr(antTegn / antOrd) & " tegn per ord. " & _
"Lengste ord hadde " & cstr(lengsteOrd.length) & _
"tegn. Antall lengste ord : " & cstr(antLengsteOrd)
catch ex as io.exception
mld &= ex.message()
finally
visMelding (mld)
end try
end sub
2
IBE150 Programmering, konteeksamen sommeren 2010, Høgskolen i Molde
Oppgavene har ulik vekt. Du kan f˚
a opptil 100 poeng.
4. (30 poeng) Lag en funksjon antallObservasjoner (x) som svarer med hvor
mange ganger den har mottatt tallet x som parameter. Feilmelding skal gis ved
kjøretidsfeil. Lag deklarasjoner og prosedyrer. Forklar eventuelle forutsetninger
du tar.
svarforslag: De færreste hadde noe brukbart her. Det er tydelig at frekvenstelling
er ukjent. I forslaget under lages en begrenset tellertabell som global variabel.
Svaret -1 betyr at tallet ikke kan telles eller at en kjøretids-feil oppstod!
dim min_x as integer = -500
dim max_x as integer = 1500
dim antall(max_x - min_x + 1) as integer
function antallObservasjoner ( byval x as integer ) _
as integer
try
if x < min_x or x > max_x then
return -1
else
antall(min_x + x) += 1
return antall(min_x + x)
end if
catch e as exception
msgbox ("feil: " & e.message())
return -1
end try
end function
5. (30 poeng) Lag prosedyren sorterOrd (o, s, m, n) som Shell-sorterer tabellen
o stigende (hvis det boolske s er True) eller synkende. Merk: o er en referanse
(ikke en verdi). Et krav: Hvis n og m begge har positive verdier skal kun radene
mellom n og m sorteres. Forklar hvordan du vil behandle at n<m, n>m og n=m.
Sorteringen skal ikke gi kjøretidsfeil!
svarforslag: Antar at det er original-tabellen som skal sorteres (derfor byref. Algoritmen for Shell-sortering er fra s. 370 i Schneider. Hvis m eller n er positiv
skal kun deler av tabellen sorteres.
sub sorterOrd ( byref o() as string, _
byval s as boolean, _
byval m as integer, _
byval n as integer )
dim gap as integer
dim ferdig as boolean
dim start, slutt, antall as integer
dim temp as string
3
IBE150 Programmering, konteeksamen sommeren 2010, Høgskolen i Molde
Oppgavene har ulik vekt. Du kan f˚
a opptil 100 poeng.
if m < n then
start = m
slutt = n
elseif m > n then
start = n
slutt = m
elseif m = 0 ’ sorter hele tabellen
start = 0
slutt = o.getupperbound(0)
else
exit sub ’ kun 1 linje: trenger ikke sortere
end if
antall = slutt - start + 1
gap = antall / 2
do while gap >= 1
do
ferdig = true
for i as integer = start to slutt - gap
if (s = true and o(i) > o(i + gap)) or _
(s = false and o(i) < o(i + gap)) then
temp = o(i)
o(i) = o(i + gap)
o(i + gap) = temp
ferdig = false
end if
next
loop until ferdig
gap = int ( gap / 2 )
loop
end sub
4