UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i : IN 105 Eksamensdag : Mandag 7. juni 1999 Tid for eksamen : 09.00-15.00 Oppgavesettet er på : 6 sider (inkludert vedlegg) Vedlegg : Klassen Text fra JavaGently Tillatte hjelpemidler : Alle trykte og skrevne Kontroller at oppgavesettet er komplett før du begynner å besvare det. Les gjennom hele settet før du begynner med besvarelsen. Denne oppgaven er ment å kunne løses både i Java (slik det har vært forelest våren 1999) og i Simula for studenter som har fulgt forelesningene tidligere semestre og foretrekker Simula. For de studenter som besvarer oppgaven i Simula, skal det skrives en prosedyre der oppgaven ber om en metode, og der oppgaveteksten snakker om klassen Text fra JavaGently, kan du bruke vanlig inn/ut-lesning og Utilities i Simula. Du kan selvsagt også nytte Settools. Andre forskjeller vil bli kommentert i teksten. På oppgave 2K står det Kan puffes og med det menes at du ikke får strykkarakter på det punktet hvis du ikke besvarer det. 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).
Eksamen i IN 105 7. juni 1999 Side 2 av 6 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ølgene 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 Text 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 kvinne elite, Aktiv kvinne B, Bedrift herre, Bedrift kvinne, 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).
Eksamen i IN 105 7. juni 1999 Side 3 av 6 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 Oppg. 2B Oppg. 2C Oppg. 2D Oppg. 2E Oppg. 2F Oppg. 2G Oppg. 2H 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. 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.) Lag metoden lesfrafil (..), som mottar en fil fra en klubb (som beskrevet i oppg.1) og som oppdaterer datastrukturene dine med opplysningene på fila. 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 passene opplysninger hvis du finner en slik løper. Lag en metode som er egnet til å brukes når en klubb vil endre sin påmelding. Nå skal du bare tenke oss 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. Løpet skal starte kl. 12.00 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 12.15, men er det fra 100 til 200 deltager, starter Aktiv dame B kl. 12.30,.. osv). 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.
Eksamen i IN 105 7. juni 1999 Side 4 av 6 Oppg. 2I Oppg. 2J Oppg. 2K 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. 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.
Eksamen i IN 105 7. juni 1999 Side 5 av 6 Vedlegg : package javagently; import java.io.*; import java.util.*; import java.text.*; public class Text { public Text () {; /* The All New Famous Text class by J M Bishop Aug 1996 * revised for Java 1.1 by Alwyn Moolman Aug 1997 * revised for efficiency by J M Bishop Dec 1997 * * Provides simple input from the keyboard and files. * Now also has simple output formatting methods * and file opening facilities. * * public static void prompt (String s) * public static int readint (BufferedReader in) * public static double readdouble (BufferedReader in) * public static String readstring (BufferedReader in) * public static char readchar (BufferedReader in) * public static String writeint (int number, int align) * public static String writedouble (double number, int align, int frac) * public static BufferedReader open (InputStream in) * public static BufferedReader open (String filename) * public static PrintWriter create (String filename) */ private static StringTokenizer T; private static String S; public static BufferedReader open (InputStream in) { return new BufferedReader(new InputStreamReader(in)); public static BufferedReader open (String filename) throws FileNotFoundException { return new BufferedReader (new FileReader (filename)); public static PrintWriter create (String filename) throws IOException { return new PrintWriter (new FileWriter (filename)); public static void prompt (String s) { System.out.print(s + " "); System.out.flush(); public static int readint (BufferedReader in) throws IOException { if (T==null) refresh(in); return Integer.parseInt(T.nextToken()); catch (NumberFormatException e2) { System.out.println("Error in number, try again.");
Eksamen i IN 105 7. juni 1999 Side 6 av 6 public static char readchar (BufferedReader in) throws IOException { if (T==null) refresh(in); return T.nextToken().trim().charAt(0); public static double readdouble (BufferedReader in) throws IOException { if (T==null) refresh(in); String item = T.nextToken(); return Double.valueOf(item.trim()).doubleValue(); catch (NumberFormatException e2) { System.out.println("Error in number, try again."); public static String readstring (BufferedReader in) throws IOException { if (T==null) return T.nextToken(); private static void refresh (BufferedReader in) throws IOException { S = in.readline (); if (S==null) throw new EOFException(); T = new StringTokenizer (S); // Write methods // ------------- private static DecimalFormat N = new DecimalFormat(); private static final String spaces = " "; public static String writedouble (double number, int align, int frac) { N.setGroupingUsed(false); N.setMaximumFractionDigits(frac); N.setMinimumFractionDigits(frac); String num = N.format(number); if (num.length() < align) num = spaces.substring(0,align-num.length()) + num; return num; public static String writeint (int number, int align) { N.setGroupingUsed(false); N.setMaximumFractionDigits(0); String num = N.format(number); if (num.length() < align) num = spaces.substring(0,align-num.length()) + num; return num;