Gjennomgang av eksamen V99

Like dokumenter
UNIVERSITETET I OSLO

import java.io.*; import java.util.*; import javagently.text;

Gjennomgang av eksamen H99

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

UNIVERSITETET I OSLO

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Løsningsforslag eksamen in105, høsten 2000

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

INF1000: Forelesning 11. Oppgave 2. Oppgave 1. Husk å melde deg på prøveeksamen i INF1000! Ole Christian Lingjærde 7.november 2006

Endret litt som ukeoppgave i INF1010 våren 2004

Eksamen høsten 2003 Den store bøygen i INF1000 er de obligatoriske oppgavene.

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Faglærerne prøver å besøker eksamenslokalet mellom klokka 15 og 16 for å oppklare eventuelle uklarheter og feil i oppgaveteksten.

UNIVERSITETET I OSLO

"Nelsons kaffebutikk"

Litt mer om uttrykk: ++ og -- INF1000 : Forelesning 4. Oppgave. Blokker. 0 udefinert udefinert. Alternativ 2 Postfiks-operator

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Tre måter å lese fra terminal.

De neste ukene. INF1000 Uke 12. Prøveeksamen. Nå - Prøveeksamen. Forelesning om IT og samfunn neste uke (13/11).

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Løsningsforslag til eksamen i INF1000 våren 2006

INF1000 (Uke 4) Mer om forgreninger, While-løkker

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Repetisjon. Mer om forgrening While-løkker

Forelesning inf Java 4

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

UNIVERSITETET I OSLO

INF1000 Forelesning 9. Hashmap Eksempel: Flyreservasjon

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

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; }

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

HashMap. INF1000 Forelesning 9. Ulike versjoner i Java 1.4 (gammel) og Java 1.5/1.6 av HashMap. Objekter lagres med en søkenøkkel

GJØVIK INGENIØRHØGSKOLE

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

UNIVERSITETET I OSLO

Java 4. Mer om easyio Mer om forgreninger Løkker. 7. september 2004

INF1000 : Forelesning 3

UNIVERSITETET I OSLO

Body Mass Index (BMI) INF1000 : Forelesning 3. Ferdig program (forts.) Ferdig program

UNIVERSITETET I OSLO

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

INF1000 (Uke 14) Resten av eksamen H03 + del av V05

Løsningsforslag, inf101, våren 2001

UNIVERSITETET I OSLO

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

Høgskolen i Gjøvik Institutt for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

Eksempel: Body Mass Index (BMI)

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) Løsningsforslag

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

Oblig4 - forklaringer. Arne og Ole Christian

Eksempel: Body Mass Index (BMI) Forelesning inf Java 3. Ferdig program (første del) Ferdig program (siste del)

INF1000 : Forelesning 4

Forelesning inf Java 5

Forelesning inf Java 5

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

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

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

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

Repetisjon: operatorene ++ og -- Java 5. Nøtt. Oppgave 1 (fra forrige gang) 0 udefinert udefinert. Alternativ 1 Prefiks-operator

UNIVERSITETET I OSLO

2 Om statiske variable/konstanter og statiske metoder.

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

KONTINUASJONSEKSAMEN

Forelesning inf Java 3

Forelesning inf Java 3

(MVC - Model, View, Control)

OOP: Et stort eksempel

Administasjon av hopprenn. OOP: Et stort eksempel. Hva er objektene? Klassediagram av hopprenn-systemet

UNIVERSITETET I OSLO

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

UNIVERSITETET I OSLO

Oblig 4Hybelhus litt mer tips enn i oppgaven

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

Oblig4 - obligatorisk oppgave nr. 4 (av 4) i INF1000

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

Gjennomgang av en tenkt eksamensoppgave

UNIVERSITETET I OSLO

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Antall sider (inkl. forsiden): 7. Alle trykte og håndskrevne

Transkript:

Gjennomgang av eksamen V99 Holmenkoll-stafetten DEL 1 Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for Informatikk Universitetet i Oslo Ole Chr Lingjærde Institutt for informatikk 19 april 2001

Forslag til arbeidsplan 1 Les nøye gjennom hele oppgaven 2 Identifiser mulige klasser i systemet: en klasse for datamodell og beregninger og en (eller to) klasse(r) for kontroll og utsyn klasser som representerer (deler av) datastrukturen 4 Finn ut hvilke metoder som trengs i de ulike klassene Her kan det lønne seg å jobbe ovenfra-og-ned, dvs først metodene som kalles av bruker (via ordre) eller som brukes i hovedløkka deretter metodene som kalles av de førstnevnte metodene osv 3 Tegn klasse/objekt-diagram (også kalt mental modell) som inkluderer klasser og objekter (inkl hashtabeller), arrayer, referanser (ofte del av oppgaven) 5 Fyll ut klassene med resterende variable og skriv koden i metodene Ole Chr Lingjærde Institutt for informatikk 19 april 2001

Eksamensoppgave våren 1999 Holmenkollenstafetten - verdens største stafett med cirka 30000 løpere Ole Chr Lingjærde Institutt for informatikk 19 april 2001

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i : IN 105 Eksamensdag : Mandag 7 juni 1999 Tid for eksamen : 0900-1500 Oppgavesettet er på : 6 sider (inkludert vedlegg) Vedlegg : Klassen Stream fra JavaGently Tillatte hjelpemidler : Alle trykte og skrevne (Tilpasset Java 12)

Denne oppgaven dreier seg om å lage to programmer for å effektivisere Holmenkollstafetten I den utstrekning du kjenner til (detalj)opplysninger om Holmenkollstafetten og disse avviker fra det som gis i denne oppgaven, skal du bruke opplysningene som gis i oppgaven De er tilstrekkelige til å løse eksamen ---o 0 o --- Holmenkollstafetten er et gateløp på 15 etapper som løpes av lag i ulike løpsklasser (se fullstendig liste av løpsklasser i oppgave 1) Du skal nå lage to datasystemer for å hjelpe arrangørene til å få en tidsmessig dataløsning: I Et system som kjøres av klubbene som melder på (ett eller flere) lag til løpet Dette systemet skal du lage i oppgave 1) nedenfor Dette systemet produserer en fil (uansett hvor mange lag som meldes på) som klubben sender inn til arrangøren II Et system som kjøres av arrangøren Dette systemet skal (utfyllende opplysninger i hvert oppgavepunkt): a) Motta filer fra de klubbene, lese disse og bygge opp en passende datastruktur for hele løpet b) Kunne rette to typer av opplysninger om lag som en klubb har påmeldt (trekke lag, endre deltagere på etapper på ett lag)

c) Tildele startnummer til de ulike påmeldte lagene (en liste over lagnavn med startnummer og starttidspunkt skal produseres) d) Ta inn løpsresultater for de ulike lagene og skrive ut liste over vinnere i hver klasse og resultatliste for hver klubb Dette er opplagt ikke en fullstendig løsning for Holmenkollstafetten (håndtering av påmeldingsavgift, flere typer av løpsklasser og fullstendige, sorterte resultatlister mangler, men vi tenker oss at dette skal senere utvides til et ekte datasystem)

Oppgave 1 (20 %) Du skal her lage et enkelt system som klubbene skal bruke til å melde på ett eller flere lag til stafetten En klubb kan høyst melde på ett lag i hver løpsklasse Filen programmet skal produsere har følgende format eksempel: Idrettslaget-Koll Aktiv herre B 1 Ole Olsen 09087733925 2 Per Jensen 12317556243 15 Peder Kvikk 07017253891 Aktiv kvinne elite 1 Guri Grei 01017624578 2 Siri Kvikk 12087545348 15 Turid Antonsen 05058082345 ZZZ Filen skal altså starte med en linje som er klubbens navn (anta at det er skrevet som ett ord som ovenfor Hint: Husk at readstring() i Stream leser bare neste ord fram til en blank eller linjeskift), Etter klubbnavnet kommer angivelse av løpsklasse (tillatte verdier: Aktiv herre elite, Aktiv herre B, Aktiv dame elite, Aktiv dame B, Bedrift herre, Bedrift dame, Bedrift blandet ) for første lag som påmeldes Deretter kommer 15 nummererte linjer med løpere og løpernes 11-sifrete personnummer, en linje for hver etappe (du skal anta at det er bare ett fornavn og ett etternavn for hver løper) Dette gjentas for hvert lag som meldes på og det er ingen bestemt rekkefølge man må ha lagene i Filen avsluttes med en string ZZZ på en egen linje

Oppgave 1 Lag et enklest mulig menydrevet hovedprogram og datastruktur som produserer denne filen (ikke legg inn muligheter for rettinger/endringer, men anta at hvis klubben vil endre sin påmelding eller taster feil, taster de bare inn alle opplysningene på nytt) Merk: oppgaven refererer til 11-sifrete personnummer Normalt er det de 5 siste sifrene som kalles personnummer, mens alle 11 sifre kalles fødselsnummer I besvarelsen velger vi likevel å holde oss til oppgavens definisjon av personnummer

Oppgave 2 (80 %) I denne oppgaven skal du lage systemet som arrangøren skal bruke, og som er skissert på tidligere i dette oppgavesettet Oppg 2A Les nøye gjennom de øvrige spørsmålene i oppgave 2 og lag så en tegning av de klasser og viktigste datastrukturene du vil ha i systemet ditt Beskriv også kort (noen få linjer) hva hver klasse skal representere og inneholde Oppg 2B Lag klassen Holmenkollen som inneholder main() I denne klassen skal vi opprette nødvendig datastruktur, skrive ut en meny, motta valg fra brukeren, og så kalle relevante metoder i andre klasser (Dere som løser oppgaven i Simula: Lag et hovedprogram som oppretter nødvendig datastruktur, skriver ut en meny, mottar valg fra brukeren, og så kaller relevante prosedyrer i systemets klasser) Oppg 2C Lag metoden lesfrafil (), som mottar en fil fra en klubb (som beskrevet i oppg1) og som oppdaterer datastrukturene dine med opplysningene på fila Oppg 2D Lag en metode sjekk() som går gjennom alle løpere på ett lag og sjekker at løperne på laget hverken løper flere etapper på dette laget eller deltar på andre lag i hele stafetten (Hint: Bruk personnummeret som er ulikt for alle løpere) Skriv ut passende opplysninger hvis du finner en slik løper

Oppg 2E Oppg 2F Lag en metode som er egnet til å brukes når en klubb vil endre sin påmelding Nå skal du bare tenke deg at klubben ringer inn til arrangøren (inntil 2 uker før start) og enten vil trekke påmeldingen av et lag eller vil sette inn andre løper(e) på en eller flere etapper Lag en tegning som viser tilstanden i datastrukturen før og etter at et lag blitt trukket Du skal nå anta at påmeldinger og rettelser er avsluttet Lag først en metode startnummer(), som går gjennom datastrukturen og skriver ut navn til deltagerklubbene i hver løpsklasse, og som samtidig teller opp antall deltagerklubber i hver løpsklasse, samt gir disse nummer Denne listen skrives ut Du skal bare bruke en nummerserie (1,2,) for hele løpet Oppg 2G Løpet skal starte kl 1200 med de aktive - dameklassene først (elite først, så B), deretter tilsvarende for herrer, og til sist bedriftsklassene for damer, herrer og blandet Alle lag i en løpsklasse starter samtidig Du skal nå skrive ut en liste for starttidspunkter for de ulike løpsklassene ut fra opptelling av antall lag i hver løpsklasse, og at det må være minimum 15 minutter mellom hver start, men at du også må legge til 15 min for start av neste løpsklasse for hvert 100 lag som starter i forrige løpsklasse (dvs hvis det er opp til 99 deltagere i Aktiv dame elite, starter neste klasse Aktiv dame B kl 1215, men er det fra 100 til 200 deltager, starter Aktiv dame B kl 1230, osv) Oppg 2H Lag en metode som brukes av en funksjonær ved registrering av sluttider etter hvert som lagene kommer i mål Han finner tiden ved å se på en klokke Det som skal registreres er lagets startnummer (som løperne har på seg og som følger den nummereringen du fant i pkt 2F) og klokkeslettet for målpassering som tre tall: time, minutt og sekund

Oppg 2I Oppg 2J Lag en metode som skriver ut vinnerlaget i hver løpsklasse Hint Skriv først en metode som for et lag regner ut sluttiden, dvs hvor lang tid laget har brukt fra starttidspunktet (som du regnet ut i 2G) til målpasseringsklokkeslettet (som er registrert i 2H) For hvert av klubbene lager du en rapport som viser hvilken plassering deres lag fikk Plasseringen finner du ved å telle opp hvor mange av de andre lagene i samme løpsklasse som hadde bedre sluttid Oppg 2K Kan puffes Definer først et filformat som lagrer resultatene for hele Holmenkollstafetten ett år, og en metode som skriver ut resultatene på fil på dette formatet Skisser så hvordan du vil legge til i datastrukturen din slik at du kan lese inn resultatene fra flere tidligere år på dette formatet og skrive ut rapporter om hvor godt hvert lag fra en klubb har gjort det tidligere år (og i hvilke år det var) og tilsvarende opplysninger pr løper hvor mange ganger har hun/han deltatt tidligere, på hvilke lag og med hvilket resultat

Innledende kommentarer Alt for lang oppgave - nesten umulig å rekke alt Vanlig misforståelse på oppgave 1 medførte at denne ble svær Tøff start på oppgave 2 To første delpunkter mye å gjøre og svært sentrale for hele oppgaven For å forenkle litt er aksessmodifikatorer (public/private) ikke benyttet i forslaget her Vi kommer istedet til å kommentere dette helt til slutt Ole Chr Lingjærde Institutt for informatikk 19 april 2001

Oppgave 1 Lag et enklest mulig menydrevet hovedprogram og datastruktur som produserer denne filen (ikke legg inn muligheter for rettinger eller endringer, men anta at hvis klubben vil endre sin påmelding eller taster feil, taster de bare inn alle opplysningene på nytt) Her er det kun snakk om å lese inn fra terminal og legge rett ut på fil Det er ikke nødvendig å bygge opp noen datastruktur som holder alle dataene som leses inn Ole Chr Lingjærde Institutt for informatikk 19 april 2001

Oppgave 1 (skisse) <import-setninger> class Oppg1Main { public static void main (String [] args) { Oppg1 oppg = new Oppg1(); class Oppg1 { <deklarasjoner> Oppg1 () { <deklarasjoner; åpne fil> <les inn klubbnavn, skriv til fil> <be bruker taste inn løpsklasse, skriv til fil Les inn navn på alle 15 løpere på laget i denne løpsklassen Skriv navnene til fil Gjenta til brukeren vil avslutte> <lukk filen> Ole Chr Lingjærde Institutt for informatikk 19 april 2001

class Oppg1 (skisse) class Oppg1 { <deklarasjoner> Oppg1 () { <deklarasjoner; åpne fil> <les inn klubb-navn og skriv til fil> løpskl = lesløpsklasse (); while (løpskl!= 0) { <skriv løpsklasse til fil> <les inn navn på alle lagets løpere; skriv ut på fil etterhvert> løpskl = lesløpsklasse (); <skriv ut ZZZ på fil og lukk filen> int lesløpsklasse() { <Be bruker taste inn en løpsklasse og returner denne > Ole Chr Lingjærde Institutt for informatikk 19 april 2001

Ferdig program import inf101*; class Oppg1 { Inn tastatur = new Inn(); Ut utfil = new Ut( Holmenkolldata ); String [] løpsklassenavn = {"Aktiv dame elite", "Aktiv dame B", "Aktiv herre elite", "Aktiv herre B", "Bedrift dame", "Bedrift herre", "Bedrift blandet"; Oppg1 () {/* Se eget ark */ int lesløpsklasse () {/* Se eget ark */ Ole Chr Lingjærde Institutt for informatikk 19 april 2001

int lesløpsklasse () { int svar; do { Systemoutprintln(" Velg ny løpsklasse (0 = ferdig): \n"); for (int i = 0; i < 7; i++) Systemoutprintln((i+1) + " - " + løpsklassenavn[i]); svar = tastaturinint(); while (svar < 0 svar > 7); return svar; Ole Chr Lingjærde Institutt for informatikk 19 april 2001

Oppg1 () { String klubbnavn, løperfnavn, løperenavn, løperpnr; int løpskl; Systemoutprint("Tast klubbens navn:"); klubbnavn = tastaturinstringln(); utoutstringln(klubbnavn); løpskl = lesløpsklasse(); while (løpskl!= 0) { utoutstringln(løpsklassenavn[løpskl-1]); for (int i = 1; i < 16; i++) { Systemoutprint("\nGi fornavn på løper " + i +" :"); løperfnavn = tastaturinstring(); Systemoutprint("\nGi etternavn på løper " + i +" :"); løperenavn = tastaturinstring(); Systemoutprint("\nGi personnummer på løper " + i +" :"); løperpnr = tastaturinstring(); utoutstringln( i + " " + løperfnavn + " " + løperenavn + " " + løperpnr); løpskl = lesløpsklasse(); utoutstringln("zzz"); utclose();

Oppgave 2A Les nøye gjennom de øvrige spørsmålene i oppgave 2 og lag så en tegning av de klasser og viktigste datastrukturene du vil ha i systemet ditt Beskriv også kort (noen få linjer) hva hver klasse skal representere og inneholde Fremgangsmåte: Vi går gjennom punktene 2B-2J og lager en liste over det som skal gjøres/lages Hva slags opplysninger må programmet holde rede på? Hvordan holder vi rede på dem? Her er det vesentlig hvilke operasjoner vi ønsker å gjøre på datastrukturen Grupper tingene som skal lages i naturlige enheter (som blir klasser) Beskriv kort klassene Lag et klasse/objekt-diagram Ole Chr Lingjærde Institutt for informatikk 19 april 2001

Liste over det som skal gjøres 2B datastruktur + løkke for innlesing av ordre 2C lese fil fra en klubb og oppdatere datastruktur 2D gå gjennom alle løpere på et lag, sjekke at de (1) bare løper en etappe og (2) bare for dette laget 2E fjerne et lag, endre løpere på et lag 2F skrive ut navn til klubbene i hver løpsklasse + telle opp antall klubber i hver løpsklasse + gi klubbene nummer 2G skrive ut liste med start-tider for de ulike løpsklassene For å bestemme start-tid: må vite antall lag (= antall klubber) i hver løpsklasse 2H Gitt lagnummer (= klubbnummer), finn lag og sett slutt-tid (time, min, sek) 2I For hver løpsklasse, finn laget med lavest slutt-tid 2J For hver klubb, finn alle lagenes plassering (ved å sammenlikne med andre lag i samme løpsklasse) Ole Chr Lingjærde Institutt for informatikk 19 april 2001

De viktigste begrepene Analysér teksten - understrek substantivene, finn de viktigste begrepene (objektene) i problemet (og antall) - Stafett (1 stk) - Løpsklasse (7 stk) - Lag (flere pr løpsklasse, opptil 7 pr klubb - Deltager (15 stk pr lag) - Etappe (15 stk pr stafett) - Klubb (flere i stafetten) Ole Chr Lingjærde Institutt for informatikk 19 april 2001

Begrepsrelasjoner En deltager har et navn (String), et personnr (String) og en etappe (int) Et lag består av 15 deltagere (array), tilhører en klubb (ref) og en løpsklasse (ref), og har et startnr (int), en slutt-tid (int,int,int) og en plassering (int) En klubb består av opptil 7 lag (array) og har et navn (String) og antalllag (int) Ole Chr Lingjærde Institutt for informatikk 19 april 2001

En løpsklasse består av mange lag/klubber (vet ikke hvor mange) og har en tittel (String), et klassenr (int) og en start-tid (int, int, int) Vi kan bruke hashtabell (= HashMap) med lag som nøkkel og klubb som element klubb som nøkkel og lag som element Hvilken velger vi? Vi kommer ikke til å søke (med get) på klubb eller lag i oppgavene 2F, 2G, 2I, kun lage liste (med iterator()) Dermed spiller det ingen rolle hvilken vi velger (vi kan bruke enten keyset() eller values() for å lage liste) Velger i denne besvarelsen å bruke klubb som nøkkel og lag som element

Stafetten har mange lag, klubber og løpsklasser; for å holde orden på alle kan vi bruke Hashtabell (=HashMap) med alle lagene (vet ikke hvor mange) Hashtabell (=HashMap) med alle klubbene (vet ikke hvor mange) Array over alle løpsklassene (7 stk) Trenger vi alle? 2D, 2E: for et gitt lag 2F: for hver klubb 2F, 2G, 2I: for hver løpsklasse Velger å bruke alle tre tabell-former i klassen Stafett Ole Chr Lingjærde Institutt for informatikk 19 april 2001

Hver av punktene ovenfor gir naturlig opphav til en klasse, dvs vi velger å definere klassene class Stafett { class Klubb { class Lopsklasse { class Lag { class Deltager { Nå er vi klare til å tegne et klasse/objekt-diagram Ole Chr Lingjærde Institutt for informatikk 19 april 2001

Klasse/objekt-diagram Holmenkollen Holmenkollen() Stafett lagene Lopsklasse klubbene 0 6 løpsklassene lag Klubb 0 6 lag antalllag Lag 0 14 løpere Deltager pnr navn navn etappe klubb løpsklasse startnr slutt-tid start-tid klassenr tittel plassering st

Oppgave 2B Lag klassen Holmenkollen som inneholder main() I denne klassen skal vi opprette nødvendig datastruktur, skrive ut en meny, motta valg fra brukeren, og så kalle relevante metoder i andre klasser Merk: her er det faktisk snakk om å lage seks klasser: Hovedklassen Holmenkollen som inneholder kontroll/utsyn Klassen Stafett som inneholder datastrukturen Klassene Deltager, Lag, Klubb, Lopsklasse Det eneste vi ikke skal gjøre, er å implementere (gi innmaten i) metodene som det spørres om i oppgavene 2C-2K Ole Chr Lingjærde Institutt for informatikk 19 april 2001

class Deltager { String navn, pnr; int etappe; Deltager (int etappe) {thisetappe = etappe; /* Andre ting */ class Lag { Lopsklasse løpsklasse; Klubb klubb; int startnr, slutttime, sluttmin, sluttsek; Deltager [] løpere = new Deltager[15]; int plassering = 1; Lag (Klubb klubb, Lopsklasse løpsklasse) { thisklubb = klubb; thisløpsklasse = løpsklasse; /* Andre ting */

class Klubb { String navn; int antalllag; Lag [] lag = new Lag[7]; Klubb (String navn) { thisnavn = navn; /* Andre ting */ class Lopsklasse { String tittel; int klassenr; int starttime, startmin, startsek; HashMap lag = new HashMap(); // key = Klubb, elem = Lag Lopsklasse (String tittel, int klassenr) { thistittel = tittel; thisklassenr = klassenr;

class Stafett { // DATAMODELL HashMap klubbene = new HashMap(); // key = String, elem = Klubb HashMap lagene = new HashMap(); // key = Lag, elem = Lag LopsKlasse [] løpsklassene = new LopsKlasse[7]; int lesløpsklasse() { /* OPPGAVE 2C - metode 1 (av 2) */ void lesfrafil(string fnavn) { /* OPPG 2C - metode 2 (av 2) */ void sjekk(lag lag1) { /* OPPGAVE 2D */ void sjekkalle() { /* Egnet for kall fra hovedmeny - 2D */ void endrepåmelding (Inn inn) { /* OPPGAVE 2E */ void startnummer() { /* OPPGAVE 2F */ void gistarttidspunkt() { /* OPPGAVE 2G */ void regslutttider (Inn inn) { /* OPPGAVE 2H */ void finnvinnere() { /* OPPGAVE 2I */ void giklubbeneresultatliste() { /* OPPGAVE 2J */

class Holmenkollen { Holmenkollen () { Stafett st = new Stafett(); /* Løkke for innlesning av ordre */ int lesordre () { /* Les inn ordre fra bruker */ public static void main (String [] args) { Holmenkollen hk = new Holmenkollen(); Ole Chr Lingjærde Institutt for informatikk 19 april 2001

int lesordre (Inn tastatur) { Systemoutprintln("\nVelg funksjon: "); Systemoutprintln("0 - Avslutt "); Systemoutprintln("1 - Les klubbfil"); Systemoutprintln("2 - Sjekk løpere (alle mot alle) "); Systemoutprintln("3 - Trekke lag eller endre løpere "); Systemoutprintln("4 - Gi startnummer "); Systemoutprintln("5 - Gi starttider, skriv startliste "); Systemoutprintln("6 - Registrer slutt-tider "); Systemoutprintln("7 - Finn vinnere i hver løpsklasse "); Systemoutprintln("8 - Gi klubbene resultatliste "); return tastaturinint(); Ole Chr Lingjærde Institutt for informatikk 19 april 2001

Holmenkollen () { Stafett st = new Stafett(); Inn tastatur = new Inn(); int ordre; Systemoutprintln("\n -- Program for Holmenkoll-løpet ---: \n"); ordre = lesordre(tastatur); while (ordre!= 0) { switch (ordre) { case 1: Systemoutprint("Gi klubb-fil navn:"); stlesfrafil(tastaturinstring()); break; case 2: stsjekkalle(); break; case 3: stendrepåmelding(inn); break; case 4: ststartnummer(); break; case 5: stgistarttidspunkt(); break; case 6: stregslutttider(inn); break; case 7: stfinnvinnere(); break; case 8: stgiklubbeneresultatliste(); break; default: Systemoutprintln("Velg et tall mellom 0 og 8"); ordre = lesordre(tastatur); Systemoutprintln("Programmet er ferdig");

Gjennomgang av eksamen V99 Holmenkoll-stafetten DEL 2 Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for Informatikk Universitetet i Oslo Ole Chr Lingjærde Institutt for informatikk 19 april 2001

Oppgave 2C Lag metoden lesfrafil (), som mottar en fil fra en klubb (som beskrevet i oppg1) og som oppdaterer datastrukturene dine Skisse (kun innlesningen fra fil): void lesfrafil (String fnavn) { <diverse deklarasjoner> Inn fil = new Inn(fNavn); klubbnavn = filinstringln(); klassenr = lesløpsklasse(fil); // negativ hvis ZZZ while (klassenr >= 0) { <les data om 15 lagdeltagere fra fil> klassenr = lesløpsklasse(fil); Ole Chr Lingjærde Institutt for informatikk 19 april 2001

Holmenkollen Holmenkollen () Stafett lagene Lopsklasse klubbene 0 6 løpsklassene lag Klubb 0 6 lag antalllag Lag 0 14 løpere Deltager pnr navn navn etappe klubb løpsklasse startnr slutt-tid start-tid klassenr tittel plassering klubb = new Klubb(klubbNavn); klubbeneput(klubbnavn, klubb);

Holmenkollen Holmenkollen () Stafett lagene Lopsklasse klubbene 0 6 løpsklassene lag Klubb 0 6 lag antalllag Lag 0 14 løpere Deltager pnr navn navn etappe klubb løpsklasse startnr slutt-tid start-tid klassenr tittel plassering lag = new Lag(klubb, løpsklassene[klassenr]); lagleslag(fil);

Holmenkollen Holmenkollen() Stafett lagene Lopsklasse klubbene 0 6 løpsklassene lag Klubb 0 6 lag antalllag Lag 0 14 løpere Deltager pnr navn navn etappe klubb løpsklasse startnr slutt-tid start-tid klassenr tittel plassering klubbnyttlag(klassenr, lag); løpsklassene[klassenr]lagput(klubb, lag); lageneput(lag, lag);

Endelig versjon av LesFraFil void lesfrafil (String fnavn) { String klubbnavn, klassenavn, løperfnavn, løperenavn, løperpnr; int klassenr; Klubb klubb; Lag lag; Inn fil = new Inn(fNavn); klubbnavn = filinstringln(); klubb = new Klubb(klubbNavn); klubbeneput(klubbnavn, klubb); klassenr = lesløpsklasse(fil); // negativ hvis ZZZ while (klassenr >= 0) { lag = new Lag(klubb, løpsklassene[klassenr]); lagleslag(fil); klubbnyttlag(klassenr, lag); løpsklassene[klassenr]lagput(klubb, lag); lageneput(lag, lag); klassenr = lesløpsklasse(fil); Ole Chr Lingjærde Institutt for informatikk 19 april 2001

int lesløpsklasse (Inn fil) { // Leser indeksen til løpsklassen fra fil // Aktiv dame elite = 0, Aktiv dame B = 1, osv // ZZZ returnerer -1 String s; int svar = 0; s = filinstringln(); if (sequals( ZZZ )) svar = -1; else if (sequals("aktiv dame elite")) svar = 0; else if (sequals("aktiv dame B")) svar = 1; else if (sequals("aktiv herre elite"))svar = 2; else if (sequals("aktiv herre B")) svar = 3; else if (sequals("bedrift dame")) svar = 4; else if (sequals("bedrift herre")) svar = 5; else if (sequals("bedrift blandet")) svar = 6; return svar;

I klassen Lag: void leslag (Inn fil) { for (int i=0; i<15; i++) { løpere[i] = new Deltager(i); // i = etappe-nummer løpere[i]les(fil); // les opplysninger om deltager I klassen Klubb: void nyttlag (int klassenr, Lag laget) { lag[klassenr] = laget; // bruk lagets løpsklasse som pos i arrayet antalllag++; // NB: slik nyttlag er programmert, kan arrayet lag ha huller, dvs vi kan feks ha at lag[0]==null, lag[1]==et lag, lag[2]==null, osv

I klassen Deltager: void les (Inn fil) { int etappenr; String linje; StringTokenizer st; etappenr = filinint(); navn = filinstring() + " " + filinstring(); pnr = filinstring(); Ole Chr Lingjærde Institutt for informatikk 19 april 2001

Oppgave 2D Lag en metode sjekk() som går gjennom alle løpere på et lag og sjekker at løperne på laget hverken løper flere etapper på dette laget eller deltar på andre lag i hele stafetten Her velger vi å gjøre noen egne forutsetninger Metoden sjekk() slik den er beskrevet over er tungvint å bruke fra hovedmenyen i programmet (må gi ny ordre for hvert lag som skal sjekkes) Bedre: lage metoden sjekk() som over (naturligvis) og i tillegg lage metode sjekkalle() som kalles fra hovedmenyen, og som benytter sjekk() Ole Chr Lingjærde Institutt for informatikk 19 april 2001

void sjekk (Lag lag1) { String pnr1, pnr2; Lag lag2; Deltager løper1, løper2; for (int i=0; i<15; i++) { løper1 = lag1løpere[i]; // Se på en løper på lag1 pnr1 = løper1fåpnr(); Iterator it = lagenevalues()iterator(); while (ithasnext()) { // gå gjennom alle lagene i stafetten lag2 = (Lag) itnext(); // lag2 er et av disse lagene for (int j=0; j<15; j++) { løper2 = lag2løpere[j]; // Se på en løper på lag2 pnr2 = løper2fåpnr(); if (!løper1equals(løper2) && pnr1equals(pnr2)) { // To forskjellige løpere med samme personnr, dvs // samme person løper mer enn en gang! Skriv feilmelding: Systemoutprintln( Personen: + løper1fånavn() +, med pnr: + pnr1 + løper mer enn en gang! )

void sjekkalle() { Lag lag; Iterator it = lagenevalues()iterator(); while (ithasnext()) { lag = (Lag) itnext(); sjekk(lag); I klassen Deltager: String fånavn() { return navn; String fåpnr() { return pnr; I klassen Klubb: String fånavn() { return navn;

Oppgave 2E Lag en metode som er egnet til å brukes når en klubb vil endre sin påmelding Nå skal du bare tenke deg at klubben ringer inn til arrangøren (inntil 2 uker før start) og enten vil trekke påmeldingen av et lag eller vil sette inn andre løper(e) på en eller flere etapper Lag en tegning som viser tilstanden i datastrukturen før og etter at et lag blitt trukket For å finne et bestemt lag trengs klubbens navn løpsklasse For å finne en bestemt løper trengs i tillegg løperens personnummer Ole Chr Lingjærde Institutt for informatikk 19 april 2001

Skisse: void endrepåmelding (Inn tastatur) { Systemoutprint( Ønsket endring (T=trekke lag, E=endre lag): ); switch (tastaturinchar()) { case T : trekklag(tastatur); break; case E : endrelag(tastatur); break; default: Systemoutprintln( Ulovlig kommando ); break; void trekklag (Inn tastatur) { <deklarasjoner> <les inn klubbnavn og løpsklasse> <fjern laget fra datastrukturen> void endrelag (Inn tastatur) { <deklarasjoner> <les inn klubbnavn og løpsklasse> <les inn personnr på person som skal byttes ut> while <flere som skal byttes ut> { <les inn navn og personnr på person som skal inn> <finn deltager-objektet som skal endres> <endre deltager-objektet> <les inn personnr på person som skal byttes ut (0=ferdig)>

Å fjerne et lag Stafett klubbene løpsklassene 0 6 lagene Holmenkollen Holmenkollen() Klubb lag antalllag 0 navn 6 Lopsklasse lag tittel klassenr start-tid Lag løpsklasse løpere 0 klubb startnr 14 slutt-tid Deltager navn pnr etappe plassering lageneremove(lag); løpsklassene[klassenr]lagremove(klubb); klubblag[klassenr] = null; klubbantalllag--; if (klubbantalllag == 0) klubbeneremove(klubbnavn); Ole Chr Lingjærde Institutt for informatikk 19 april 2001

void fjernlag (Inn tastatur) { String klubbnavn; Klubb klubb; Lag lag; int klassenr; // Finn klubb, klassenr og lag Systemoutprint( Klubbens navn: ); klubbnavn = tastaturinstring(); klubb = (Klubb) klubbeneget(klubbnavn); Systemoutprintln( Løpsklasser: ); for (int i=0; i<7; i++) Systemoutprintln((i+1) + + løpsklassene[i]tittel); Systemoutprint( Velg løpsklasse (1-7): ); klassenr = tastaturinint() - 1; lag = (Lag) løpsklassene[klassenr]lagget(klubb); if (lag == null) Systemoutprintln( Klubben har ikke meldt på lag i den klassen!"); else { // Fjern laget lageneremove(lag); løpsklassene[klassenr]lagremove(klubb); klubblag[klassenr] = null; klubbantalllag--; if (klubbantalllag == 0) klubbeneremove(klubbnavn);

Å endre et lag Stafett klubbene løpsklassene 0 6 lagene Holmenkollen Holmenkollen() Klubb lag antalllag 0 navn 6 Lopsklasse lag tittel klassenr start-tid Lag løpsklasse løpere 0 klubb startnr 14 slutt-tid Deltager navn pnr etappe plassering lagløpere[i]skrivnavn(navn); lagløpere[i]skrivpnr(pnr); Ole Chr Lingjærde Institutt for informatikk 19 april 2001

void endrelag (Inn tastatur) { String klubbnavn, pnr, navn; Klubb klubb; Lag lag; int klassenr; <Finn klubb, klassenr og lag akkurat som i fjernlag ()> Systemoutprint( Personnr til løper som skal ut: ); pnr = tastaturinstring(); while (!pnrequals( 0 )) { int i=0; while (i<15 &&!lagløpere[i]lespnr()equals(pnr)) i++; if (i<15) { // Fant en løper med dette personnummeret Systemoutprint( Navn på ny løper (fornavn etternavn): ); navn = tastaturinstringln(); lagløpere[i]skrivnavn(navn); Systemoutprint( Personnr til ny løper: ); pnr = tastaturinstring(); lagløpere[i]skrivpnr(pnr); else Systemoutprintln( Ingen med dette personnummeret! ); Systemoutprint( Personnr til løper som skal ut (0=ferdig): ); pnr = tastaturinstring();

Oppgave 2F Lag først en metode startnummer(), som går gjennom datastrukturen og skriver ut navn til deltagerklubbene i hver løpsklasse, og som samtidig teller opp antall deltagerklubber i hver løpsklasse, samt gir disse nummer Denne listen skrives ut Du skal bare bruke en nummerserie (1,2, ) for hele løpet Vi skal altså produsere en utskrift omtrent som følger for hver løpsklasse: Løpsklasse: Aktiv herre elite Antall lag: 84 Startnummer Klubb 1 klubbnavn1 2 klubbnavn2 Ole Chr Lingjærde Institutt for informatikk 19 april 2001

void startnummer() { int nummer; Lopsklasse løpskl; Lag lag; nummer = 1; for (int i=0; i<7; i++) { løpskl = løpsklassene[i]; Systemoutprintln("Løpsklasse: " + løpskltittel()); Systemoutprintln("Antall lag: " + løpskllagsize()); Systemoutprintln( Startnummer Klubb"); Iterator it = løpskllagvalues()iterator(); while (ithasnext()) { lag = (Lag) itnext(); Systemoutprintln( + nummer + " " + lagklubbnavn); lagstartnr = nummer; nummer ++;

Oppgave 2G Du skal nå skrive ut en liste for starttidspunkter for de ulike løpsklassene ut fra opptelling av antall lag i hver løpsklasse [ ] void gistarttidspunkt() { Lopsklasse løpskl; int forsinkelse; // Forsinkelse (i minutter) fra kl 1200 String s; forsinkelse = 0; // Første pulje starter presis kl 1200 for (int i=0; i<7; i++) { løpskl = løpsklassene[i]; løpsklstarttime = 12 + forsinkelse / 60; løpsklstartmin = forsinkelse % 60; forsinkelse += 15 + 15 * (løpskllagsize()/100); if (løpsklstartmin == 0) s = "00"; else s = StringvalueOf(løpsklstartMin); Systemoutprintln(løpskltittel + " starter kl" + løpsklstarttime + "" + s + "00"); Ole Chr Lingjærde Institutt for informatikk 19 april 2001

Oppgave 2H Lag en metode som brukes av en funksjonær ved registrering av sluttider etter hvert som lagene kommer i mål Han finner tiden ved å se på en klokke Det som skal registreres er lagets startnummer (som løperne har på seg og som følger den nummereringen du fant i pkt 2F) og klokkeslettet for målpassering som tre tall: time, minutt og sekund void regslutttider (Inn tastatur) { <deklarasjoner> <les inn startnummer fra terminal (0 = ferdig)> while <startnummer ulik 0> { <løp gjennom alle lagene helt til du finner det laget som har samme startnummer som det innleste nummeret>; if (<lag med samme nr ikke funnet>) <skriv feilmelding>; else <les inn slutt-tid fra terminal og registrer>; <les inn nytt startnummer fra terminal (0 = ferdig)> Ole Chr Lingjærde Institutt for informatikk 19 april 2001

void regslutttider (Inn tastatur) { int startnr; boolean found; Lag lag; Systemoutprint("Startnummer (avslutt med 0): "); startnr = tastaturinint(); while (startnr > 0) { found = false; Iterator it = lagenevalues()iterator(); while (ithasnext() &!found) { lag = (Lag) itnext(); if (lagstartnr == startnr) found = true; if (!found) Systemoutprintln( Ulovlig start-nummer"); else { Systemoutprint("Gi slutt-tid (time min sek): "); lagslutttime = tastaturinint(); lagsluttmin = tastaturinint(); lagsluttsek = tastaturinint(); Systemoutprint("Startnummer (avslutt med 0): "); startnr = tastaturinint();

Oppgave 2I Lag en metode som skriver ut vinnerlaget i hver løpsklasse Hint: skriv først en metode som for et lag regner ut sluttiden, dvs hvor lang tid laget har brukt fra starttidspunktet til målpasserings-klokkeslettet void finnvinnere () { Lag lag, bestelag; int bestetid; for (int i=0; i<7; i++) { bestetid = 10000000000; // Garantert større enn noen slutt-tid Iterator it = løpsklassene[i]lagvalues()iterator(); while (ithasnext()) { lag = (Lag) itnext(); if (lagslutttid() < bestetid) { bestetid = lagslutttid(); bestelag = lag; Systemoutprintln( Vinner i klassen + løpsklassene[i]tittel + er: + bestelagklubbnavn; Ole Chr Lingjærde Institutt for informatikk 19 april 2001

Ole Chr Lingjærde Institutt for informatikk 19 april 2001 Oppgave 2J For hver av klubbene lager du en rapport som viser hvilken plassering deres lag fikk Plasseringen finner du ved å telle opp hvor mange av de andre lagene i samme løpsklasse som hadde bedre sluttid void giklubbeneresultatliste () { Lag lag, lag2; int slutttid; for (int i=0; i<7; i++) { Iterator it = løpsklassene[i]lagvalues()iterator(); while (ithasnext()) { lag = (Lag) itnext(); slutttid = lagslutttid(); Iterator it2 = løpsklassene[i]lagvalues()iterator(); while (it2hasnext()) { lag2 = (Lag) it2next(); if (lag2slutttid() < slutttid) lagplassering ++; <gå gjennom alle klubbene, og skriv for hver klubb ut en resultatliste for alle klubbens lag (overlates til leseren)>