Forelesningen i dag: Meny for hver omgang. Hovedmenyen. I hovedmenyen skal vi foreta registrering av nye

Like dokumenter
OOP: Et stort eksempel

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

Et program er en modell av verden. En første innføring i objekter og klasser. Ideen bak OOP. Inntil nå i kurset:

INF1000 Uke 10. Klassevariablenes levetid Ikke alt i et objekt bør være synlig fra resten av programsystemet - innkapsling

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

UNIVERSITETET I OSLO

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

Oppgave 1. Oppgave 2. Oppgave 3. 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

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

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

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

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

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

INF Løsning på seminaropppgaver til uke 8

INF Uke 10. Ukesoppgaver oktober 2012

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

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

Gjennomgang av eksamen H99

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

Løsningsforslag til eksamen i INF1000 våren 2006

UNIVERSITETET I OSLO

Oblig4 - forklaringer. Arne og Ole Christian

INF1000 Prøveeksamen Oppgave 7 og 9

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

Repetisjon. INF gruppe 13

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

UNIVERSITETET I OSLO

Praktisk informasjon. I dag. Repetisjon: While-løkker. INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Gjennomgang av eksamen V99

UNIVERSITETET I OSLO

Forelesning inf Java 4

Innlesning fra tastatur med easyio. INF1000 høst Vi må først skrive i toppen av programmet: import easyio.*;

(MVC - Model, View, Control)

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

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

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Praktisk informasjon. Repetisjon: While-løkker. I dag. INF1000 (Uke 5) Mer om løkker, arrayer og metoder. Oblig 2 er lagt ut

løsningsforslag-uke5.txt

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

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

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

TDT4100 Objektorientert programmering

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

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

UNIVERSITETET I OSLO

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

Endret litt som ukeoppgave i INF1010 våren 2004

Oblig4 - forklaringer. Arne og Ole Christian

EKSAMEN 6108/6108N PROGRAMMERING I JAVA Alt trykt og skriftlig materiale.

Løsningsforslag ukeoppg. 3: sep (INF Høst 2011)

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

Uke 11 noen tips og råd + eksempel. Noen muligheter. Valg av datamodell: eksempel. Valg av datamodell: oblig 4

Programmering Høst 2017

Blokker. Uke 4, INF 1000, 13 sept Løkker og arrayer. Eksempel. Deklarasjoner inne i blokker. Institutt for Informatikk Universitet i Oslo

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

UNIVERSITETET I OSLO

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

Løsningsforslag, inf101, våren 2001

IN1010 våren januar. Objektorientering i Java

Blokker og metoder INF1000 (Uke 6) Metoder

1. Finn klassene (hvilke objekter er det i problemet) 1. Dataene som beskriver problemet (hvilke objekter har vi og hvor mange klasser er det?

UNIVERSITETET I OSLO

Objektorientert Programmering Ekstraordinær eksamen 2014

UNIVERSITETET I OSLO

INF1000 : Forelesning 3

TOD063 Datastrukturer og algoritmer

UNIVERSITETET I OSLO

Innhold. INF1000 Høst Unified Modeling Language (UML) Unified Modeling Language (UML)

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

UNIVERSITETET I OSLO

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.

UNIVERSITETET I OSLO

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF1000 : Forelesning 4

Forelesning inf Java 5

INF1000 Uke 4. Innlesning fra terminal. Uttrykk og presedens. Oversikt

Kort repetisjon av doble (nestede) løkker Mer om 1D-arrayer Introduksjon til 2D-arrayer Metoder

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

UNIVERSITETET I OSLO

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

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

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

UNIVERSITETET I OSLO

I dag. Rep: Oppsummering - variabler. Rep: Datatyper. INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger

Løsnings forslag i java In115, Våren 1996

Ole Christian Lingjærde, 12. september 2013

Seminaroppgaver IN1010, uke 2

Forelesning inf Java 4

INF1000 oppgaver til uke 38 (17 sep 23 sep)

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

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

Transkript:

Forelesningen i dag: Uke 12 - Programeksempel: System for å administrere hopprenn 15 november 2005, Arild Waaler Inst. for informatikk, UiO Gå gjennom et programeksempel i detalj Repetere objekt-orientering Repetere noen vanlige programmerings-konstruksjoner Målet for i dag og neste gang er først og fremst å hjelpe de som synes de ikke har så godt grep om programmeringen! Vi skal først gå gjennom problemet og designe en løsning ovenfra og ned Så spesifiserer vi noen sentrale metoder utenfra og inn 2 Hovedmenyen Meny for hver omgang I hovedmenyen skal vi foreta registrering av nye Deltagere skal registreres med navn og klubb. Det skihoppere og kunne starte omganger: skal foretas en trekning ut fra tilfeldig genererte *** MENY *** 0. Avslutt 1. Registrer ny deltager 2. Trekning av startnummer 3. List alle deltagere 4. Første omgang 5. Andre omgang 6. Generer fiktive deltagere 3 tall, hvoretter deltagere gis et startnummer. Valg (9 for Meny): 1 *** NY DELTAGER *** Navn: Arild Waaler Klubb: UiO Valg (9 for Meny): 1 *** NY DELTAGER *** Navn: Arne Maus Klubb: UiO 4

Meny for hver omgang I hver omgang skal vi foreta registrering av nye hopp, holde orden på hvem som er neste hopper, samt resultatlisten. *** MENY 1. OMGANG *** 0. Tilbake til hovedmenyen 1. Registrer nytt hopp 2. List gjenstående hoppere 3. Resultatliste 4. Simuler resten av omgangen Hoppene skal registreres med lengde og 5 stilkarakterer. Startlisten for 2. omgang lages ved å Det er 4 viktige substantiver i beskrivelsen Konkurranse Skihopper Omgang Hopp Hver av disse danner naturlige klasser i programmet. Fra menyene ser vi videre at en konkurranse inneholder 2 omganger en konkurranse registrerer nye skihoppere en omgang registrerer nye hopp snu resultatlisten for 1. omgang opp ned. 5 6 Grunnleggende datastruktur Hva med en Hashmap? Vi må ha en datastruktur som effektivt tillater å legge inn data om skihoppere assosiere skihoppere med hopp assosiere startlister og resultatlister med skihoppere (men ikke nødvendigvis motsatt) Vi trenger å ha lett tilgang til informasjonen om hopperne Vi trenger å gruppere hoppere i hver omgang Den enkleste løsningen er å gruppere skihoppere i arrayer: arrayene administreres innen hver omgang vi utnytter array-ordningen i startlistene vi kan enkelt lage nye ordninger av hoppere fra gamle, for eksempel å snu resultatlisten fra 1. omgang og la den være startlisten i 2. omgang 7 En (eller flere) Hashmap vil tillate effektiv oppslag på skihoppere. Med den foreslåtte arraystrukturen vil informasjonen om hver hopper ligge lagret i tabeller som evt. må søkes gjennom Men merk at den opprinnelige startlisten støtter de samme operasjonene som en Hashmap når nøkkelen er startnummer. Hvis nøkkelen er navn, kan vi enkelt finne frem til hopperen ved å scanne gjennom startlisten. Siden startlisten uansett blir ganske kort, er det ikke nødvendig med en Hashmap for et slikt søk. 8

class Konkurranse og class Omgang class Skihopper og class Hopp class Konkurranse { Skihopper[] deltager; Omgang førsteomgang, andreomgang; void kommandoløkke() { class Omgang { Skihopper[] startliste; Skihopper[] rekkeflg; boolean førsteomgang; void kommandoløkke() { Poengutskrift fra første og annen omgang behandles forskjellig, og en boolsk variabel viser hvilken omgang som er gjeldende. startliste og førsteomgang angis i konstruktøren rekkeflg lagrer suksessivt resultatlisten sortert på poeng 9 class Skihopper { String navn,idrettslag; int startnr; Hopp førstehopp, andrehopp; class Hopp { double lengde; double[] karakter; double poeng; startnr må angis etter at objektet er opprettet Delegering av ansvar tilsier at vi bør legge rutinen for utskrift av data om skihopperen til skihopperen selv (eller informasjonen som skal skrives ut) Vi må støtte separat utskrift fra både 1. og 2. omgang. Dette kan vi oppnå enten ved å overføre en parameter som sier hvilken omgang vi ønsker utskrift for eller ved separate metoder som kalles fra hver omgang. 10 Top down : kommandoløkken i Konkurranse skrivmeny(); do { valg = tast.inint() Vi må legge inn noen tester før vi kaller metoder, for eksempel: switch(valg){ vi skal ikke kunne opprette case 0: break; andreomgang før førsteomgang er ferdig case 1: registrerdeltager(); break; vi må trekke startnummer før første case 2: trekning(); break; omgang kan starte case 3: listdeltagere(); break; case 4: førsteomgang = new Omgang( deltager, true ); førsteomgang.kommandoløkke(tast); break; case 5: andreomgang = new Omgang( reverser(førsteomgang.rekkeflg), false ); andreomgang.kommandoløkke(tast); break; case 6: autogenerer(); break; case 9: skrivmeny(); break; while (!(valg == 0)); 11 case 1: registrerdeltager(); int antallhoppere = 0; void registrerdeltager(){ deltager[antallhoppere++] = new Skihopper(tast); class Skihopper { Skihopper(In tast){ System.out.println("*** NY DELTAGER ***"); System.out.print(" Navn: "); navn = tast.inline(); System.out.print(" Klubb: "); idrettslag = tast.inline(); Delegering av ansvar: Skihopperobjektet er selv ansvarlig for å innhente opplysinger om seg selv fra brukeren! 12

case 2: trekning (); void stokk() og Random tall-generator void trekning(){ Skihopper[] temp = new Skihopper[antallHoppere]; for( int i=0; i<antallhoppere; i++ ) temp[i] = deltager[i]; deltager = temp; stokk(); for( int i=0; i<antallhoppere; i++ ) deltager[i].startnr = i+1; System.out.println("Trekning ferdig (det kan ikke registreres nye deltagere) "); trukket = true; Her opprettes en full array av alle deltagere. Dette gjøres for å slippe å overføre parameteren antallhoppere (en forenkling vi kan ønske å endre på senere ved utvidelse av programmet!) NB! Vi slipper dette hvis vi bruker Arraylist isteden! Vi oppdaterer så startnumre i Skihopper-objektene (bør ideelt gjøres med via en set-metode!) 13 import java.util.random; Random tall = new Random(); void stokk( ) { int j,k; Skihopper temp; for( int i=0; i<100; i++ ){ j = tall.nextint(deltager.length); k = tall.nextint(deltager.length); temp=deltager[j]; deltager[j]=deltager[k]; deltager[k]=temp; Random-klassen har en rekke funksjoner for å generere tilfeldige data på ulike format. nextint( int max ) gir en int k i intervallet 0>= k < max Her kunne vi unngått å overføre deltager-arrayen som parameter 14 Tall-generatoren kan brukes til å lage testdata case 3: listdeltagere() og metoden tostring() String[] fornavn = { "Odin", "Alf", "Even", "Ulf", "Elg", "Tor", "Rolf" ; String[] suffiks = { "snes", "sen", "svik", "shaug", "sdal", "sbakken", "sli", "sletten" ; String[] klubb = { "TIL", "HIL", "FIL", "BIL", "MIL", "KIL" ; Skihopper generernyhopper(){ String navn = fornavn[tall.nextint(fornavn.length)] +" "+ fornavn[tall.nextint(fornavn.length)] + suffiks[tall.nextint(suffiks.length)]; String idrettslag = klubb[tall.nextint(klubb.length)]; return new Skihopper( navn, idrettslag ); Vi lager en ny konstruktør for class Skihopper som kan ta inn data utenfra. 15 void listdeltagere(){ for(int i=0; i<antallhoppere; i++) System.out.println( deltager[i] ); Her skriver vi ut et Skihopper-objekt direkte i utskriftssetningen. Dette krever at vi har skrevet en metode i class Skihopper med signaturen: public String tostring() class Skihopper { Java-systemet vil automatisk utføre denne metoden når objektet skal skrives ut! public String tostring(){ String s = ""; if( startnr!= UDEFINERT ) s += startnr + " "; s += navn +" "+ idrettslag; return s; 16

Opprettelse av Omgang-objekter case 4: if(!trukket ) break; if( førsteomgang == null ) førsteomgang = new Omgang( deltager, true ); førsteomgang.kommandoløkke(tast); break; case 5: if( førsteomgang == null ) break; if( andreomgang == null ) andreomgang = new Omgang( reverser(førsteomgang.rekkeflg), false ); andreomgang.kommandoløkke(tast); break; Merk at vi via startlisten får tilgang til alle class Omgang { skihopperne som skal starte i denne omgangen. Vi overfører altså hele datastrukturen med Skihopper-objekter. Omgang( Skihopper[] startliste, boolean førsteomgang){ this.startliste = startliste; this.førsteomgang = førsteomgang; rekkeflg = new Skihopper[startliste.length]; 17 Kommandoløkken i Omgang-objektet skrivmeny(); do { System.out.print("\nValg (9 for meny): "); valg = tast.inint(); switch(valg){ case 0: System.out.println(); break; case 1: nestehopp(); break; case 2: skrivgjenstående(); break; case 3: skrivresultat(); break; case 4: simuleromgang(); break; case 9: skrivmeny(); break; default: System.out.println("Du tastet feil"); while (!(valg == 0)); 18 Registrering av nytt hopp Beregning av poengsum (boka seksjon 5.9) void nestehopp(){ if( antall >= startliste.length ) return; Skihopper aktiv = startliste[antall]; System.out.println(" Hopper nr. "+ (antall+1) +": "+ aktiv.navn); Hopp h = new Hopp(); registrerhopp(h); Innlesning av data om hoppet og beregning av poengsum delegeres til Hopp-klassen Når vi registrerer et nytt hopp, øker vi en lokal tellevariabel antall med én og setter en referanse til den aktive hopperen inn i en array rekkeflg slik at den holdes sortert på hoppernes poengsum. For å sikre at Skihopper-objektet returnerer riktig poengsum, overføres den boolske variabelen førsteomgang. registrerhopp() skilles ut som egen metode fordi simulatormetoden også vil trenge denne funksjonen. 19 Oppgave 9 Poengberegningen i skihopp baserer seg dels på hopplengde, dels på stilkarakter. Poengsummen er summen av lengdepoeng og stilpoeng. I unnarennet fins et tabellpunkt (f.eks. 120 meter) og lengdepoengene beregnes i forhold til denne lengden. Et hopp på 120 meter gir 60 lengdepoeng. Dersom hoppet er lengre, gis et tillegg som er antall meter over 120 ganget med en faktor (meterverdi), f.eks. 1.8. Et hopp på 123 meter gir dermed 60 + (123-120)*1.8 = 65.4 lengdepoeng. Hoppes det under 120 meter trekkes det tilsvarende fra. Nøyaktigheten i lengdemåling går til nærmeste halvmeter. Stilkarakterene gis som fem tall mellom 0 og 20, med en nøyaktighet på et halvt poeng. Det høyeste og laveste tallet strykes, og summen av de tre gjenværende utgjør stilpoengene. Stilkarakterene 17.0, 18.0, 18.0, 18.5 og 19.0 gir dermed 54.5 stilpoeng idet 17.0 og 19.0 blir strøket. Lag et program som leser lengde og stilkarakterer fra terminal og beregner poengsummen ut fra et tabellpunkt på 120 meter og en meterverdi på 1.8. 20

Poengberegning kan legges i en egen klasse Begegning av stilkarakterer: kutt laveste og høyeste stilkarakter og summer class Poengberegning { private static double stilsum( double[] karakterer ){ int ant = karakterer.length; private static final int TABELLPUNKT = 120; double[] sortert = new double[ant]; private static final double FAKTOR = 1.8; for (int i=0; i<ant; i++){ private static final int STARTPOENG = 60; sortert[i] = karakterer[i]; int j=i; static double poengsum( double lengde, double[] karakterer ){ while ( j>0 ) { double tillegg = (lengde - TABELLPUNKT)*FAKTOR; if (sortert[j]<sortert[j-1]){ double lengdepoeng = STARTPOENG + tillegg; double temp = sortert[j-1]; sortert[j-1] = sortert[j]; sortert[j] = temp; double sum = lengdepoeng + stilsum( karakterer ); j--; return sum; double sum = 0; for (int i=1; i<ant-1; i++) sum = sum + sortert[i]; 21 return sum; 22 Innlesing av hopp-data i Hopp-klassen Åpenbare mangler ved programmet Hopp() { In tast = new In(); System.out.print(" Lengde: "); lengde = tast.indouble(); karakter = new double[5]; for(int i=0; i<5; i++){ System.out.print(" Dommer " + (i+1) + ": "); karakter[i] = tast.indouble(); Ikke robust: det sjekkes for eksempel ikke på om vi prøver å legge inn flere deltagere enn 60 (programmet vil da terminere med meldingen java.lang.arrayindexoutofboundsexception Ikke fleksibelt: når vi har tastet inn data, kan de ikke endres igjen etterpå. Hva hvis en hopper ikke stiller til start eller får hoppe om igjen? Eller vi taster feil stilkarakter? Ingen data lagres til fil Lite brukervennlig og få funksjoner Ved å la poeng være av double-type, får vi lett avrundingsfeil, slik at to som burde hatt samme poengsum ikke får det. Vi får lett mange uønskede desimaler i utskriften poeng = Poengberegning.poengsum(lengde, karakter); Alt dette kan enkelt rettes på, men antall kodelinjer vil øke. Men objektstrukturen sørger for at programmet meget lett lar seg utvide og forbedre uten at man må redesigne programstrukturen. 23 24

Noen andre funksjoner vi kan implementere Hvordan har en bestemt hopper gjort det i hver omgang? Deler av oppgaven kan delegeres til Skihopper-objektet og Omgang-objektet Hvordan har de ulike dommerne dømt? Vi må scanne gjennom alle skihopperne og finne alle hopp Utvidelse av programmet til å administrere flere ulike årsklasser (for eksempel Gutter 14. år ): Opprett et nytt Konkurranse-objekt for hver årsklasse Tilpassing til kombinert (2 beste av 3 omganger er tellende): Poengrutinene i class Skihopper må endres/utvides 25