Eksamensoppgavene er utgitt av Utdanningsdirektoratet. Første nedlasting kjører en bot-sjekk i nettleseren (Vercel BotID) — mer i personvernerklæringen.
5 timer — alle hjelpemidler12 oppgaver
Oppgave 1·Hva som ikke kjennetegner pseudokode
Hjelpemiddelkrav: For hånd
Hvilket av følgende er ikke et typisk kjennetegn på pseudokode?
Fasit
Den kan kjøres direkte på en datamaskin.
LøsningsforslagKI-generert
Pseudokode er en uformell beskrivelse av en algoritme. Den blandes med vanlig språk og følger ingen fast syntaks, så den brukes til å planlegge et program før det skrives.
Nettopp fordi syntaksen er uformell, finnes det ingen kompilator eller tolk som kan kjøre pseudokode. Den må oversettes til et programmeringsspråk først. Derfor er «Den kan kjøres direkte på en datamaskin» ikke et kjennetegn på pseudokode. De tre andre alternativene er typiske kjennetegn.
Hvilken av de følgende påstandene er riktig om for- og while-løkker innen programmering?
Fasit
En for-løkke er best egnet når du vet hvor mange ganger du vil at løkken skal kjøre.
LøsningsforslagKI-generert
En for-løkke går gjennom en kjent sekvens: et tallområde, elementene i en liste eller tegnene i en tekst. Den passer derfor best når antall gjentakelser er kjent på forhånd.
De andre påstandene er gale:
En for-løkke kan også gå gjennom lister, tekster og andre samlinger, ikke bare tallsekvenser.
En while-løkke kjører så lenge betingelsen er sann. Antall gjentakelser er derfor ofte ikke kjent på forhånd.
En while-løkke kan godt bruke en teller, for eksempel INCREMENT i inne i løkken.
Oppgave 3·Hovedprinsippet bak objektorientert programmering
Hjelpemiddelkrav: For hånd
Hva er hovedprinsippet bak objektorientert programmering (OOP)?
Fasit
Å representere data og funksjoner som objekter.
LøsningsforslagKI-generert
I objektorientert programmering samles data (egenskaper) og funksjonene som virker på dataene (metoder) i objekter. En klasse beskriver hvordan objektene av den typen ser ut. Objektene er konkrete forekomster av klassen.
De andre alternativene beskriver ikke OOP:
Lineær, sekvensiell kode kjennetegner enkel prosedyreorientert programmering.
Å bryte ned et problem i funksjoner er hovedideen i funksjonell eller prosedyreorientert programmering.
Et system som beregner billettprisen avhengig av kjøperens alder, bruker følgende regler for billettkategorier:
Hvis brukeren er 15 år gammel eller yngre, skal brukeren få barnebillett til 30 kroner.
Hvis brukeren er 16 år gammel eller eldre, skal brukeren få voksenbillett til 50 kroner.
Hvis brukeren er 67 år gammel eller eldre, skal brukeren få pensjonistbillett til 35 kroner.
Lag et flytdiagram for et program der brukeren skriver inn alderen på kjøperen og programmet regner ut og skriver ut riktig billettpris.
Lag flytdiagrammet i et egnet program, og lagre det i et allment lesbart format (f.eks. pdf).
Fasit
Flytdiagram med innlesing av alder, testen «alder ≤ 15?» (barnebillett, 30 kr), deretter «alder ≥ 67?» (pensjonistbillett, 35 kr), ellers voksenbillett (50 kr), og utskrift av prisen.
LøsningsforslagKI-generert
Reglene overlapper: en person på 70 år er både «16 år eller eldre» og «67 år eller eldre». Pensjonistregelen må derfor gjelde foran voksenregelen. Vi tester først om kjøperen er barn og så om kjøperen er pensjonist. Alle andre får voksenbillett.
Flytdiagrammet bruker standardsymbolene:
oval for start og slutt
parallellogram for inndata og utdata
rombe for valg (ja/nei)
rektangel for en handling
Aldersgrensene gir disse tre tilfellene:
Alder
Kategori
Pris
15 år eller yngre
barnebillett
30 kr
16–66 år
voksenbillett
50 kr
67 år eller eldre
pensjonistbillett
35 kr
Det er ikke nødvendig å teste «alder ≥ 16» for voksenbillett. Når vi kommer til den siste grenen, vet vi allerede at kjøperen er mellom 16 og 66 år.
Et fullstendig svar kan også sjekke at alderen er gyldig. Det gjøres med en rombe «alder < 0?» rett etter innlesingen, som gir en feilmelding.
Oppgave 6·Finne det nest største tallet i en liste
Du får i oppgave å finne det nest største tallet i en liste (array) med tall. Dersom det finnes flere like tall som er størst, skal ingen av disse regnes som nest størst. Under finner du fire alternative løsninger for denne oppgaven skrevet i pseudokode.
Løsning 1
SET størst TO negativt uendelig tallFOR hvert tall i listen IF tall GREATER THAN størst SET størst TO tall ENDIFENDFORFjern størst fra listenSET nestStørst TO negativt uendelig tallFOR hvert tall i listen IF tall GREATER THAN nestStørst SET nestStørst TO tall ENDIFENDFORDISPLAY nestStørst
Løsning 2
SET størst TO første tall i listenSET nestStørst TO andre tall i listenIF nestStørst GREATER THAN størst Bytt størst og nestStørstENDIFFOR hvert tall i listen med start fra tredje tall IF tall GREATER THAN størst SET nestStørst TO størst SET størst TO tall ELSEIF tall GREATER THAN nestStørst AND tall NOT EQUAL TO størst SET nestStørst TO tall ENDIFENDFORDISPLAY nestStørst
Løsning 3
SET størst TO negativt uendelig tallSET nestStørst TO negativt uendelig tallFOR hvert tall i listen IF tall GREATER THAN størst SET nestStørst TO størst SET størst TO tall ELSEIF tall GREATER THAN nestStørst SET nestStørst TO tall ENDIFENDFORDISPLAY nestStørst
Løsning 4
Sorter listen i synkende rekkefølgeFOR hvert tall i listen IF tall NOT EQUAL TO neste tall i listen DISPLAY neste tall i listen avbryt for-løkken ENDIFENDFOR
a)Hjelpemiddelkrav: For hånd
Hvilke to løsninger er riktige?
b)Hjelpemiddelkrav: For hånd
Vurder og sammenlign de to løsningene du valgte i punkt a.
Fasit
a)
Løsning 1 og løsning 4. Løsning 1 forutsetter at «Fjern størst fra listen» fjerner alle forekomstene av det største tallet.
b)
Begge er riktige. Løsning 1 går gjennom listen to ganger (lineær tid), mens løsning 4 sorterer først og er tregere på store lister, men kortere og enklere å lese. Begge endrer listen, og begge må håndtere lister der alle tallene er like.
LøsningsforslagKI-generert
a)
Vi tester løsningene med to lister: [3, 7, 5] (ingen like tall) og [5, 5, 3]. I den siste listen er 5 størst to ganger, så det riktige svaret er 3.
Løsning
[3, 7, 5]
[5, 5, 3]
1
5
3 (hvis alle femmerne fjernes)
2
5
5 (feil)
3
5
5 (feil)
4
5
3
Løsning 1 finner det største tallet, fjerner det fra listen og finner deretter det største av tallene som er igjen. Det blir riktig så lenge alle forekomstene av det største tallet fjernes. Fjernes bare én forekomst (som liste.remove(x) i Python), blir resultatet det samme som i løsning 3.
Løsning 2 har en sjekk for like tall (tall NOT EQUAL TO størst) inne i løkken. Den starter likevel med de to første tallene uten å sjekke om de er like. For [5, 5, 3] blir både størst og nestStørst 5 før løkken starter, og tallet 3 endrer ikke dette. Løsningen feiler hver gang listen begynner med to like tall og det ikke kommer et større tall senere.
Løsning 3 mangler sjekken for like tall. Når samme største tall kommer en gang til, er det større enn nestStørst, og det blir satt som nest størst.
Løsning 4 sorterer listen synkende. Da ligger alle forekomstene av det største tallet først. Det første tallet som er ulikt tallet foran seg, er det nest største. For [5, 5, 3] er rekkefølgen etter sortering 5, 5, 3, og løkken skriver ut 3.
De to riktige løsningene er derfor 1 og 4.
b)
Hvordan de virker. Løsning 1 bruker to vanlige gjennomganger av listen og finner det største tallet hver gang. Løsning 4 overlater mesteparten av arbeidet til en sorteringsalgoritme og trenger bare å se på tallene øverst i den sorterte listen.
Effektivitet. Løsning 1 går gjennom listen to ganger. I tillegg må den finne og fjerne forekomstene av det største tallet. Tidsbruken vokser proporsjonalt med antall tall (lineær tid). Å sortere en liste tar mer tid, typisk proporsjonalt med med en god sorteringsalgoritme. Løsning 4 blir derfor tregere enn løsning 1 for store lister. For lister med noen hundre eller tusen tall merkes ikke forskjellen.
Lesbarhet og hvor lett de er å implementere. Løsning 4 er kortest. De fleste språk har en innebygd sorteringsfunksjon, så løsningen kan skrives med få linjer. Løsning 1 er også enkel, men lengre. Den krever at vi vet hvordan listefunksjonen for å fjerne elementer virker, siden remove i mange språk fjerner bare den første forekomsten.
Sideeffekter. Begge løsningene endrer listen: løsning 1 fjerner elementer, og løsning 4 endrer rekkefølgen. Trenger programmet den opprinnelige listen senere, må begge jobbe på en kopi.
Spesialtilfeller. Hvis alle tallene i listen er like, finnes det ikke noe nest største tall:
Løsning 1 ender med en tom liste og viser «negativt uendelig tall». Det må håndteres særskilt.
Løsning 4 finner ikke to ulike naboer og viser ingenting.
I løsning 4 finnes det heller ikke noe «neste tall» når løkken kommer til det siste tallet. Løkken må derfor stoppe på det nest siste tallet, ellers gir programmet en feil (indeks utenfor listen).
Konklusjon. Løsning 4 er enklest å skrive og lese og passer godt for små og mellomstore lister. Løsning 1 er mer effektiv for store datamengder. Den beste løsningen for store lister er én gjennomgang som ligner løsning 2, men som også tar hensyn til like tall helt fra starten.
Elementene i en indeksert variabel (liste/array) skal sorteres i stigende rekkefølge etter følgende algoritme: Man sammenligner hvert element fra venstre til høyre i listen med neste element, og hvis elementet er større enn neste element, bytter de plass. Deretter går man videre til neste element og sammenligner på nytt frem til hele listen er gjennomgått. Dette gjentas til hele listen gjennomgås uten at det forekommer noen ombyttinger.
Under finner du deler av pseudokoden for denne algoritmen. Her er a en liste med n elementer, og a[i] er elementet på plass i i listen.
SET i TO 0FOR hver i LESSER THAN n - 1 IF a[i] GREATER THAN a[i+1] CALL byttPlass() ENDIFENDFOR
Presisering: byttPlass() er en funksjon som bytter plass på to naboelementer i listen.
a)Hjelpemiddelkrav: For hånd
Hva blir innholdet i listen etter at vi har kjørt programmet representert ved pseudokoden over for listen a = [8, 5, 2, 6, 12], som har n = 5 elementer?
b)Hjelpemiddelkrav: For hånd
Utvid pseudokoden slik at programmet den representerer, sorterer ferdig listen a i stigende rekkefølge etter algoritmen som er vist øverst. Forklar endringene du gjør. Obs! Du må også lage pseudokode for funksjonen byttPlass().
c)Hjelpemiddelkrav: Krever PC
Implementer pseudokoden fra punkt b i ditt programmeringsspråk. Listen skal leses inn automatisk, og den ferdig sorterte listen skal skrives til konsollet eller vises i programmet.
Fasit
a)
[5, 2, 6, 8, 12]
b)
En ytre løkke (REPEAT … UNTIL) gjentar gjennomgangen til en hel runde går uten ombyttinger. Et flagg byttet settes til FALSE ved starten av hver runde og til TRUE ved hver ombytting. byttPlass(a, i) bytter a[i] og a[i+1] ved hjelp av en hjelpevariabel.
LøsningsforslagKI-generert
a)
Pseudokoden går gjennom listen én gang og sammenligner hvert element med naboen til høyre:
i
Sammenligning
Bytte?
Listen etterpå
0
8 > 5
ja
[5, 8, 2, 6, 12]
1
8 > 2
ja
[5, 2, 8, 6, 12]
2
8 > 6
ja
[5, 2, 6, 8, 12]
3
8 > 12
nei
[5, 2, 6, 8, 12]
Etter én gjennomgang er listen [5, 2, 6, 8, 12]. Det største tallet som ikke står på riktig plass, «bobler» mot høyre, men listen er ikke ferdig sortert, siden 5 og 2 står i feil rekkefølge.
b)
Algoritmen sier at gjennomgangen skal gjentas til en hel gjennomgang skjer uten ombyttinger. Vi trenger derfor
en ytre løkke som gjentar gjennomgangen
en variabel byttet som husker om det har skjedd en ombytting i denne runden
en funksjon byttPlass() som vet hvilke elementer den skal bytte
FUNCTION byttPlass(a, i) SET temp TO a[i] SET a[i] TO a[i+1] SET a[i+1] TO tempENDFUNCTIONREPEAT SET byttet TO FALSE SET i TO 0 FOR hver i LESSER THAN n - 1 IF a[i] GREATER THAN a[i+1] CALL byttPlass(a, i) SET byttet TO TRUE ENDIF ENDFORUNTIL byttet EQUAL TO FALSEDISPLAY a
Forklaring av endringene:
Ytre løkke. Den opprinnelige for-løkken er én gjennomgang. Den er lagt inne i en REPEAT … UNTIL-løkke. Vi må alltid gjennom listen minst én gang for å vite om den er sortert, og derfor passer REPEAT … UNTIL, som sjekker betingelsen til slutt. En WHILE byttet EQUAL TO TRUE-løkke virker også hvis byttet settes til TRUE før løkken.
Flagget byttet. Det settes til FALSE ved starten av hver gjennomgang og til TRUE hver gang to elementer bytter plass. Er det fortsatt FALSE etter en hel gjennomgang, er listen sortert, og løkken stopper.
Funksjonen byttPlass(a, i). Funksjonen må vite hvilken liste og hvilken plass den skal jobbe med. Derfor får den a og i som parametere. Vi trenger en hjelpevariabel temp. Uten den ville vi overskrevet a[i] før verdien var flyttet til a[i+1].
For listen i a) blir gjennomgangene:
Gjennomgang
Listen etterpå
byttet
1
[5, 2, 6, 8, 12]
TRUE
2
[2, 5, 6, 8, 12]
TRUE
3
[2, 5, 6, 8, 12]
FALSE
Etter tredje gjennomgang har det ikke skjedd noen ombytting, så programmet stopper og viser den sorterte listen.
Mulig forbedring: Etter hver gjennomgang står det største av de usorterte tallene på riktig plass bakerst. Den indre løkken kan derfor stoppe ett element tidligere for hver gjennomgang. Det er ikke nødvendig for at algoritmen skal virke.
Hvorfor kan godt personvern bli viktig for finanssektoren i framtiden?
Fasit
Antallet aktører som behandler personopplysninger, vil øke.
LøsningsforslagKI-generert
Ifølge rapporten fra Datatilsynet vil opplysninger om privatøkonomien vår «bli behandlet på nye måter og av langt flere aktører enn i dag». Med betalingstjenestedirektivet PSD2 mister bankene monopolet på kundenes transaksjonsopplysninger. Med samtykke fra kunden kan nye aktører få innsyn i kontoer og transaksjoner. Det er ofte små, nyetablerte selskaper som ikke nødvendigvis har like høye krav til sikkerhet som bankene.
Når informasjon som tidligere ble håndtert av noen få, deles med mange, blir det vanskeligere for kunden å ha oversikt. Risikoen for misbruk og datainnbrudd øker også. Derfor blir godt personvern viktig.
De andre alternativene handler ikke om personvern:
Krav om digital tilgang handler om brukervennlighet.
Hvorfor bør forsikringsselskaper gjøre risikovurderinger før de samarbeider med leverandører av Internet of things (IoT)-produkter?
Fasit
For å forsikre seg om at produktene er trygge og overholder personvernregelverket.
LøsningsforslagKI-generert
Forsikringsselskapene samarbeider med produsenter av sensorer i bil, hjem og på kroppen, for eksempel aktivitetsarmbånd, for å kunne prise forsikringen etter hvordan hver enkelt lever. Rapporten fra Datatilsynet peker på at sammenstilling og analyse av slike data kan avsløre nye og sensitive opplysninger som kunden ikke har samtykket til å dele. Risikoen er særlig stor med kroppsnær teknologi. Rapporten konkluderer med at forsikringsselskaper «må derfor gjennomføre gode risikovurderinger før de tar i bruk slike produkter som aktivitetsarmbånd eller tilsvarende».
Forsikringsselskapet er ansvarlig for personopplysningene det behandler, også når dataene samles inn via en samarbeidspartner. En risikovurdering skal avdekke om produktet er sikkert (kryptering, tilgangsstyring, sårbarheter) og om datainnsamlingen oppfyller personvernforordningen (GDPR), for eksempel kravene om dataminimering, formålsbegrensning og gyldig samtykke.
De andre alternativene handler om pris, popularitet og rabatter, ikke om risiko for kundene.
Beskriv og forklar en endring i finanssektoren som er forårsaket av utviklingen av informasjonsteknologi.
b)Hjelpemiddelkrav: For hånd
Drøft et personverndilemma som er skapt av denne endringen.
Fasit
a)
For eksempel åpen bank (PSD2): Med kundens samtykke kan nye aktører (fintech-selskaper) få tilgang til kontoinformasjon og transaksjoner og tilby tjenester som samler kontoer fra flere banker eller setter i gang betalinger. Et annet eksempel er bruksbasert forsikring med sensordata.
b)
Dilemmaet står mellom nyttige, persontilpassede og billigere tjenester på den ene siden og kartlegging, tap av kontroll og økt risiko for misbruk av opplysninger på den andre. En god drøfting tar for seg argumenter på begge sider og ender i en begrunnet konklusjon.
LøsningsforslagKI-generert
Svarene nedenfor er eksempler. Kandidaten kan velge andre endringer, så lenge endringen skyldes informasjonsteknologi og dilemmaet henger sammen med den.
a)
Åpen bank og nye betalingstjenester (PSD2). Tidligere var det bare banken som hadde tilgang til kundens kontoer og transaksjoner. Betalingstjenestedirektivet PSD2 (2018) krever at bankene, når kunden samtykker, åpner for at andre aktører kan hente ut kontoinformasjon og sette i gang betalinger via standardiserte grensesnitt (API-er).
Dette har gitt nye typer tjenester:
Kontoinformasjonstjenester samler kontoer fra flere banker i én app, lager budsjett og gir råd om privatøkonomien basert på transaksjonene.
Betalingsinitieringstjenester lar en nettbutikk eller en app betale direkte fra kundens konto uten kort.
Endringen skyldes informasjonsteknologi. Smarttelefoner, skytjenester, API-er og dataanalyse gjør det mulig for små teknologiselskaper (fintech) å bygge tjenester «på toppen av» bankenes data og infrastruktur. Konkurransen øker, og kundene har fått raskere og mer brukervennlige tjenester, jf. rapporten fra Datatilsynet.
Andre mulige endringer: forsikring priset etter sensordata fra bil, hjem eller aktivitetsarmbånd, kredittvurdering med kunstig intelligens, og mobilbetaling (Vipps).
b)
Dilemmaet. Når nye aktører får tilgang til transaksjonene våre, får kunden bedre og billigere tjenester, men mister samtidig oversikt og kontroll over hvem som vet hva om privatøkonomien. Begge sider har gode argumenter.
For å dele dataene:
Kunden får bedre oversikt over egen økonomi, persontilpassede råd og kan lettere sammenligne og bytte tilbydere.
Økt konkurranse gir lavere priser og nye tjenester.
Tilgangen krever samtykke, og PSD2 og GDPR stiller krav til sikker identifisering, formålsbegrensning og innsyn. Kunden bestemmer i prinsippet selv.
Mot å dele dataene:
Transaksjonene røper svært mye: hvor vi er, hva vi handler, helse (apotek, lege), religion, fagforening og vaner. Ved sammenstilling kan selskapene trekke slutninger som kunden aldri har samtykket til å dele.
Informasjon som før lå hos noen få banker, spres til mange små aktører. Hver av dem kan bli en vei inn for kriminelle, og ved en datalekkasje er skaden stor.
Samtykket er ofte lite reelt. Mange godtar vilkårene uten å lese dem. Gratis tjenester kan være betalt med data, og det kan bli «bli sporet eller betal»: den som ikke vil dele, får dårligere eller dyrere tilbud.
Profilering kan føre til forskjellsbehandling, for eksempel at noen får dårligere lånevilkår basert på handlemønster.
Konklusjon. Åpen bank gir reelle fordeler, og det er ikke ønskelig å stanse utviklingen. Personvernet må likevel ivaretas av aktørene, ikke bare av kunden. Tjenestene bør bare hente de dataene de trenger (dataminimering), være åpne om bruken, gjøre det enkelt å trekke tilbake samtykket og tilby alternativer uten deling. Da kan kunden velge fritt, og tilliten som finanssektoren er avhengig av, blir bevart.
Du skal lage et program som leser inn informasjon fra et datasett og presenterer den. Datasettet inneholder statistikk om YouTube-kanaler fra ulike land, i CSV- og JSON-format. Du kan velge hvilket av formatene du vil bruke. Last ned datasettet her: datasett (csv og json).
Datasettet er kodet med et ukjent tegnsett. Det kan være nødvendig å angi tegnsett og/eller gjøre andre tilpasninger når du skal lese datasettet med programmering.
Separatoren i CSV-filen er komma, og nøklene er listet på første linje i datasettet. Feltene i CSV-filen er ikke kodet med datatyper.
I JSON-filen må du håndtere at en del datafelter er kodet som tekststrenger, selv om de inneholder numeriske verdier.
Tips: Du står fritt til å velge hvordan programmet skal presentere informasjonen, så lenge presentasjonen er godt egnet til å vise det oppgaven spør etter. Du kan også velge om du besvarer a og b i en samlet oversikt eller lager en oversikt for hvert oppgavepunkt.
Programmet du lager i denne oppgaven, skal inneholde en flerlinjet kommentar øverst som beskriver de vurderingene og valgene du har gjort for å vaske og forberede datasettet til bruk med programmet ditt.
a)Hjelpemiddelkrav: Krever PC
Lag et program som finner og presenterer de ti landene i datasettet som har flest YouTube-kanaler.
b)Hjelpemiddelkrav: Krever PC
Utvid programmet til å regne ut og presentere gjennomsnittlig antall abonnenter og videovisninger per kanal for hvert av disse landene.
I denne oppgaven skal du utvikle et spill som heter Manic Mansion.
I Manic Mansion styrer spilleren et menneske som prøver å hente hjem sauene sine en etter en. På veien må mennesket ta seg forbi hindringer og unngå å bli tatt av spøkelser.
Spillet starter med et spillebrett, et menneske, et spøkelse, tre hindringer og tre sauer. Mennesket skal styres av spilleren, og målet med spillet er å komme seg over på den andre siden av brettet og hente en sau flest mulig ganger uten å være i kontakt med noen av spøkelsene.
Krav
Ved oppstart skal spillet bestå av et spillebrett, et menneskeobjekt, et spøkelsesobjekt, tre hindringsobjekter og tre saueobjekter.
Det skal være en liten frisone både på venstre og høyre side av spillebrettet hvor kun mennesker og sauer kan oppholde seg, mens det ikke kan være spøkelser eller hindringer der.
Spøkelses- og hindringsobjektene plasseres på tilfeldige steder på spillebrettet, menneskeobjektet i frisonen på venstre side av spillebrettet og sauene på tilfeldige steder i frisonen på høyre side av spillebrettet. Ingen objekter skal være oppå hverandre.
Ulike typer objekter skal være visuelt forskjellige.
Menneskeobjektet starter i ro og kan bevege seg i rolig hastighet opp, ned, til venstre eller til høyre. Retningen styres med piltaster (alternativt tastene W, S, A og D).
Spøkelsesobjektene starter på et tilfeldig sted på spillebrettet, men altså ikke i noen av frisonene. Spøkelsesobjektene beveger seg med konstant fart i en tilfeldig retning. Spøkelsesobjektene kan bevege seg på skrå i flere forskjellige vinkler. Når et spøkelse treffer kanten av spillebrettet eller kanten på en av frisonene, endrer spøkelset retning. Spøkelset blokkeres ikke av hindringer eller av andre spøkelser, men går tvers gjennom dem.
Når menneskeobjektet treffer en hindring eller kanten av spillebrettet, blokkeres menneskeobjektet helt til retningen endres.
Når menneskeobjektet treffer et saueobjekt, skal det følgende skje:
Saueobjektet fjernes fra spillebrettet (dette representerer at mennesket bærer sauen). (Alternativt: Saueobjektet «festes» til menneskeobjektet og følger menneskeobjektets bevegelser.)
Farten til menneskeobjektet reduseres.
Fram til saueobjektet er levert på den andre siden, vil en kollisjon mellom menneskeobjektet og et annet saueobjekt føre til at spillet stoppes.
Når menneskeobjektet kommer tilbake til startsonen på venstre side av spillebrettet, skal det følgende skje:
Spilleren får et poeng.
Farten til menneskeobjektet økes til samme fart som ved spillets start.
Et nytt saueobjekt plasseres et tilfeldig sted i frisonen til høyre på spillebrettet.
Et nytt spøkelsesobjekt og et nytt hindringsobjekt plasseres på tilfeldige steder på spillebrettet.
Når menneskeobjektet, med eller uten sau, treffer et spøkelsesobjekt, skal spillet stoppes.
Oppdrag
På figuren under ser du et forslag til en objektorientert modell for spillet.
a)Hjelpemiddelkrav: For hånd
Forklar modellen.
b)Hjelpemiddelkrav: Krever PC
Ta utgangspunkt i modellen, gjør tilpasninger av egenskaper og metoder der du mener det er nødvendig, og implementer spillet slik det er beskrevet i kravene. Tilpasningene du gjør, skal dokumenteres med kommentarer i programkoden.
Fasit
a)
Abstrakt superklasse SpillObjekt med posisjon og metodene plassering og flytt. Fire subklasser arver fra den: Menneske, Spøkelse, Hindring og Sau. Spillebrett har størrelse og en liste med spillobjekter (komposisjon) og metoder for å legge til og fjerne objekter.
LøsningsforslagKI-generert
a)
Oversikt. Modellen er et UML-klassediagram med seks klasser. Hver boks har tre felt: klassenavnet, egenskapene (attributter med datatype) og metodene (med parametertyper).
Arv.SpillObjekt er superklassen. Navnet er skrevet i kursiv, som betyr at klassen er abstrakt. Det skal ikke lages objekter av selve SpillObjekt, bare av subklassene. Pilene med hul trekant peker fra Menneske, Spøkelse, Hindring og Sau til SpillObjekt. Det betyr at de fire klassene arver fra superklassen. Alle spillobjektene får dermed egenskapene xPosisjon og yPosisjon og metodene plassering(int, int) og flytt(int, int). Felles kode skrives én gang, og brettet kan behandle alle objektene likt.
Komposisjon. Linjen mellom SpillObjekt og Spillebrett har en fylt rombe ved Spillebrett og teksten «inneholder». Det er komposisjon: spillebrettet består av spillobjekter. Objektene lever bare så lenge brettet finnes. Spillebrett har egenskapene høyde, bredde og objekter (en liste med SpillObjekt). Metodene leggTilObjekt og fjernObjekt legger til nye objekter (ny sau, nytt spøkelse og ny hindring etter poeng) og fjerner objekter (sau som blir hentet).
Subklassene:
Menneske har fart, poeng og bærerSau. Metodene er beveg(int, retning) for styring med piltastene, reduserFart og økPoeng, bærSau(Sau) når mennesket henter en sau, og sjekkKollisjon() som finner ut om mennesket treffer en hindring, en sau, et spøkelse eller kanten.
Spøkelse har endreRetning(), som brukes når spøkelset treffer kanten av brettet eller en frisone.
Hindring har ingen egne egenskaper. Den står stille.
Sau har blirBåret og metodene blirLøftet() og fjernSau().
Polymorfi.plassering(int, int) står i superklassen og igjen i alle subklassene. Det betyr at subklassene overstyrer metoden. Reglene for startplassering er ulike: mennesket i venstre frisone, sauene tilfeldig i høyre frisone, og spøkelser og hindringer tilfeldig utenfor frisonene.
Svakheter som kan rettes i b).Spøkelse mangler egenskaper for fart og retning (for eksempel dx og dy), selv om spøkelset beveger seg med konstant fart på skrå. sjekkKollisjon() kunne ligget i SpillObjekt, siden kollisjonstesten er den samme for alle objekter. Sau har både blirBåret og Menneske.bærerSau, så den samme informasjonen lagres to steder. Modellen har heller ingen klasse eller metode som styrer selve spillet (spill-løkke, tastetrykk, poengvisning og avslutning).