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)>