"Nelsons kaffebutikk"



Like dokumenter
IN105-javaNelson-2. array, evt. flere dimensjoner. Institutt for informatikk Jens Kaasbøll sept En funksjon om gangen En klasse om gangen

Litt om pakker og mest om data inn og ut

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

Repetisjon. INF gruppe 13

Gjennomgang av eksamen H99

Ta inn og ut av 2D-array. Java 6. Liste over ulike verdier i 2D-array. Det ferdige programmet. Vi skal lage et program som illustrerer hvordan man

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

Løsningsforslag til eksamen i INF1000 våren 2006

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

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

Løsningsforslag eksamen in105, høsten 2000

Objektorientert design av kode. Refaktorering.

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

Spørsmål fra forrige forelesning. INF1000 Forelesning 7. Oppførselen til inword()/inint()/etc. Operator-presedens i Java

INF1000 Forelesning 9. Hashmap Eksempel: Flyreservasjon

Oppgave 1 (Programtolkning) INF1000 Eksamen V06. Oppgave 1 (Programtolkning) Oppgave 1 (Programtolkning)

Løsningsforslag, inf101, våren 2001

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

TOD063 Datastrukturer og algoritmer

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

Gjennomgang av eksamen V99

Inf1000 (Uke 10) HashMap og ArrayList

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

IN1010 våren januar. Objektorientering i Java

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.

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

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

UNIVERSITETET I OSLO

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

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

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

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

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

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

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

Forelesning inf Java 5

Forelesning inf Java 5

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

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

UNIVERSITETET I OSLO

(MVC - Model, View, Control)

UNIVERSITETET I OSLO

Oppgave 1 - Kortsvarsoppgave. INF1000 eksamen V05. Oppgave 1 (c) Oppgave 1 (b) Svar: a = 9, b=10

INF Løsning på seminaropppgaver til uke 8

Gjennomgang prøveeksamen oppgave 1, 2, 4, 5, 7

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

Generelt om oblig 3. Oppgaveteksten kort sammendrag. Deloppgaver/menyvalg 15/03/2010. INF1000 Forelesning 9

UNIVERSITETET I OSLO

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

static int ant_steiner; //antall steiner static int teller2 = 0; //teller for printing til Thread^ murer; //murertråden

Løse reelle problemer

Programmeringsspråk for nybegynnere. Krav til språket. Krav til språket. Krav til språket

INF1010 våren januar. Objektorientering i Java

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

UNIVERSITETET I OSLO

Løsningsforslag til eksamen i INF1000

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

Oversikt. INF1000 Uke 3. Repetisjon Program. Repetisjon Program. Litt repetisjon Program Variabler og Uttrykk Presedens Matematiske funksjoner

Post-it spørsmål fra timen (Arv og subklasser)

UNIVERSITETET I OSLO

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

UNIVERSITETET I OSLO

for (int i=0; i<3; i++) { for (int j=0; j<5; j++) { System.out.print(i*j); System.out.println();

Oppgave 1 a. INF1020 Algoritmer og datastrukturer. Oppgave 1 b

Transkript:

"Nelsons kaffebutikk" et eksempel på systemutvikling med objekter Originale lysark av Jens Kaasbøll - mindre endringer av G. Skagestein og Knut Hegna IN105-javaNelson-1

Nelsons kaffebutikk Området som programmet skal handle om Oppgavene som brukerne (kundene) skal gjøre Testrekkefølge: En funksjon om gangen Brukerevaluering Programutførelse og test Kompilering og retting av syntaksfeil Analyse Hva består området av? Hvilke funksjoner skal programmet dekke? Kravspesifikasjon Design Hvordan skal programmet struktureres? Program og datastruktur Kodingsrekkefølge En funksjon om gangen En klasse om gangen Koding Velge array, evt. flere dimensjoner HashMap Nelsons kaffebutikk modifisert (JavaGently 8.6) IN105-javaNelson-2

Analyse Lageradministrasjon (inventory) Mange kaffeslag (blend, kind, coffee, type): Java, columbiansk, VIP, kenyansk, o Hvert kaffeslag har et navn, en pris, mengde på lager, minimumsnivå, strekkode Hvert kaffeslag leveres i partier (batches) o Hvert parti har en mengde og en utløpsdato Funksjoner o Klargjøre for mottak av partier o Vise data o Sjekke minimumsbeholdning o Sjekke hvor mye tilgjengelig o Endre pris o Legge til et parti til beholdning o Selge kaffe o Fjern for gammel kaffe IN105-javaNelson-3

Analyse: Modell av butikken Ett kaffelager Flere slag (type) Flere partier for hvert slag KaffeLager KaffeSlag KaffeParti mange mange IN105-javaNelson-4

Design: Metoder i KaffeLager-objektet KaffeLager JavaGently side 235 selg() nyttparti() slagene viskaffe() nyttkaffeslag() KaffeLager() utførordre() sjekkutløpsdato() lagerverdi() lesfrafil() skrivpåfil() Det lages bare en instans (et objekt) av denne klassen IN105-javaNelson-5

KaffeSlag Design: Metoder i de øvrige objektene Java JavaGently side 235 KaffeSlag() vispåskjerm() navn KaffeParti sjekkminimumsbeholdning(int dato) endrepris() nyttparti() pris 83.50 parti KaffeParti() double selg() mengde 60.0 Boolean sjekkutløp(int dato) selg() sjekkutløp(int dato) lesfra(stream innfil) skrivpå(stream utfil) vispåskjerm double tilgjengelig() lesfra (Stream innfil) skrivpå (Stream utfil) utløpsdato 19990723 IN105-javaNelson-6

Design: Velge datastruktur Array HashMap Lengde Fast Ubegrenset Ordning 0 til max-1 Ingen 2 og flerdimensjonale Gjennomløp Enkel for-løkke Iteration Sette inn objekt Tilordning put Oppdatere antall Ta ut objekt Tilordning, evt. flytting, remove oppdatere antall Søking Ingen get Kaffeslagene Kaffepartiene 1 Ubegrenset antall 1 Ubegrenset antall 2 Ingen ordning 2 Stadig nye inn og ut 3 Gjennomløpes ved les/skriv på fil 3 Kronologisk ordning 4 Opprette og fjerne 4 Gjennomløpes ved les/skriv på fil 5 Søking etter navnet 5 Opprette nye, fjerne eldste HashMap 6 Ingen søking, ta neste Array best 3 6, HashMap 1 2 IN105-javaNelson-7

Dato og tid Java har klasser for dette i pakken util + Mange muligheter Tungt å sette seg inn i Kan bruke int int dato1, dato 2; dato1 < dato2 ønsker vi skal bety at dato1 kommer før dato2. Leser derfor alle datoer inn fra terminal og fil på formen ååååmmdd IN105-javaNelson-8

KaffeLager KaffeSlag Modellen KaffeParti slagene Kenyan Java Columbian navn pris 83.50 navn pris 78.90 navn pris 62.50 parti parti parti utløpsdato 19990723 mengde 60.0 utløpsdato 19990808 mengde 30.0 utløpsdato 19990601 mengde 20.0 utløpsdato 19991015 mengde 80.0 IN105-javaNelson-9

Kontrolløren KaffeKontroll main KaffeLager kl = new KaffeLager(); kl.utførordreogtavarepådata(); kl IN105-javaNelson-10

KaffeLager Konstruktør og utførordreogtavarepådata KaffeLager() slagene = new HashMap(); in = new Stream (System.in); filnavn = "kaffe.data"; slagene void utførordreogtavarepådata() lesfrafil(); utførordre(); skrivpåfil(); in filnavn kaffe.data IN105-javaNelson-11

Filformat 3 Columbian 62.5 2 300.0 20020101 Antall kaffeslag Navn på kaffeslag Pris Antall partier Mengde Utløpsdato 70.0 20020101 Java 83.5 1 20.0 20000101 Kenyan 78.9 1 80.0 20000601 IN105-javaNelson-12

KaffeLager void lesfrafil() lesfrafil slagene KaffeSlag k; innfil = new Stream (filnavn, Stream.READ ); int antslag = innfil.readint( ); for (int i=1; i<=antslag; i++) { k = new KaffeSlag( ); k.lesfra(innfil); slagene.put(k.navn,k); } // Slutt for filnavn k innfil Java navn pris 83.50 første 1 void lesfra(stream innfil) siste 1 navn = innfil.readstring( ); pris = innfil.readdouble( ); siste = innfil.readint( ); for (int i=1; i<=siste; i++) { parti[i] = new KaffeParti(); parti[i].lesfra( ); innfil } KaffeSlag maxpartier 100 KaffeSlag() parti = new KaffeParti[maxPartier+1]; parti filnavn kaffe.data KaffeParti void lesfra(stream innfil) mengde = innfil.readdouble( ); utløpsdato = innfil.readint( ); innfil mengde 60.0 utløpsdato 19990723 IN105-javaNelson-13

Testing For å teste en funksjon, må vi ha en måte å observere hva den gjør lesfrafil lager endringer i modellen i primærlageret, så vi kan ikke vite hva den gjør før vi lager utskriftsmetoder IN105-javaNelson-14

Etter å ha klarlagt funksjonalitet datastruktur og programstruktur Rekkefølge i koding skal de enkelte metoder defineres og kodes. To veier: En funksjon av gangen med nødvendige metoder i hver klasse for å kunne utføre funksjonen o Eks: Innlesing i personregister + Kan teste hver funksjon hvis vi har utskriftsrutiner Må holde oversikt over variable i mange klasser Vil følge denne rekkefølgen i Kaffebutikken En klasse av gangen med de metodene som trengs for å utføre alle funksjoner + Konsentrasjon om variablene i denne klassen Må kunne forutse hva en metode i en annen klasse kan gjør IN105-javaNelson-15

Organisering av metodene Standard framgangsmåte for koding av en av de ordrene programmet skal utføre er å lage en metode i hvert objekt som gjør sin jobb med å søke / lese av / oppdatere variablene i sitt objekt for denne ordren Metoden i KaffeLager kaller metoden i KaffeSlag som igjen kaller metoden i KaffeParti KaffeLager KaffeSlag KaffeParti selg() mange selg() mange selg() IN105-javaNelson-16

KaffeLager KaffeLager skrivpåfil void skrivpåfil() KaffeSlag k; utfil = new Stream (filnavn, Stream.WRITE); utfil.println(slagene.size()); Iterator it = slagene.values( ).iterator ( ); while (it.hasnext ( )) { k = (KaffeSlag) e.next(); k.skrivpå( utfil ); } utfil.close( ); k slagene filnavn innfil filnavn kaffe.data IN105-javaNelson-17

KaffeSlag og KaffeParti skrivpå Java KaffeSlag navn pris 83.50 første 1 void skrivpå(stream utfil) utfil.println(navn+" "+pris+" "+antallpartier()); for (int i=første; i<=siste; i++) parti[i].skrivpå(utfil); utfil siste 3 maxpartier 100 parti filnavn void skrivpå (Stream utfil) kaffe.data KaffeParti utfil utfil.println(mengde+" "+utløpsdato); mengde 60.0 utløpsdato 19990723 IN105-javaNelson-18

KaffeLager utførordre void utførordre () String ordre="0"; while (!ordre.equals( "A" )) { System.out.println ("Ordre (Vis all kaffen, " + "nytt Kaffeslag, nytt Parti, " + "Selg, sjekk Utløpsdato, " + "Lagerverdi, Avslutt)?" ); ordre = in.readstring( ); if ( ordre.equals ( "V" )) { viskaffe ( ); } else if ( ordre.equals ( "K" )){ nyttkaffeslag( ); } else if ( ordre.equals ( "P" )){ nyttparti( ); } else if ( ordre.equals ( "S" )){ selg( ); } else if ( ordre.equals ( "U" )){ sjekkutløpsdato( ); } else if ( ordre.equals ( "L" )){ lagerverdi( ); } } // Slutt kommando-løkka slagene in IN105-javaNelson-19

KaffeLager KaffeLager viskaffe void viskaffe() KaffeSlag k; Iterator it = slagene.values( ).iterator( ); while ( it.hasnext( )) { k = (KaffeSlag) it.next( ); k.vispåskjerm( ); } k slagene IN105-javaNelson-20

KaffeSlag og KaffeParti vispåskjerm Java KaffeSlag navn pris 83.50 første 1 siste 3 maxpartier 100 void vispåskjerm() System.out.println( ); System.out.println(navn); System.out.print( "Pris: kr" + Stream.format(pris,6,2)); System.out.println(" Antall partier: " + antallpartier( )); System.out.println(" Mengde Utløpsdato"); for (int i = første; i <= siste; i++) parti[i].vispåskjerm( ); } // slutt vispåskjerm parti void vispåskjerm() System.out.println( Stream.format (mengde, 6, 1) + " " + utløpsdato); KaffeParti mengde 60.0 utløpsdato 19990723 IN105-javaNelson-21

KaffeLager nyttkaffeslag KaffeLager void nyttkaffeslag( ) throws IOException System.out.print( "Navn? " ); String navn = in.readstring( ); System.out.print( "Pris? " ); double pris = in.readdouble( ); slagene.put(navn, new KaffeSlag(navn,pris)); pris 72.50 navn slagene Brazilian KaffeSlag må ha en konstruktør som tar verdier gjennom parametre IN105-javaNelson-22

Nytt kaffeslag-objekt Brazilian KaffeSlag navn pris 72.50 første 1 KaffeSlag(String n, double p) siste 0 // Konstruktør som får verdier tilsendt navn = n; pris = p; parti = new KaffeParti[maxPartier+1]; maxpartier 100 parti IN105-javaNelson-23

Design: Invariant for parti-arrayen Nye partier settes inn sist i parti int siste er indeksen for siste (nyeste) parti som er satt inn Gamle partier tas ut fra begynnelsen int første er indeksen for første (eldste) parti som stadig er med int maxpartier er høyeste indeks i parti Invariant: 1<=i<første: KaffeParti[i] = første<=i<=siste: KaffeParti[i]!= siste<i<=maxpartier: KaffeParti[i] = Når siste==maxpartier og det kommer et nytt parti, flyttes alle partiene først i arrayen, slik at første==1 0 1 første siste maxpartier IN105-javaNelson-24 parti

KaffeLager KaffeLager selg void selg() KaffeSlag k; String navn; System.out.print ( "Kaffeslag? " ); navn = in.readstring( ); k slagene // Leter fram kaffeslaget med dette navnet: navn k = (KaffeSlag) slagene.get(navn); if (k!=) { // Et kaffeslag med dette navnet ble funnet Java k.selg( ); } else System.out.println( "Beklager ingen kaffe som heter " + navn ); IN105-javaNelson-25

KaffeSlag selg void selg() navn pris 83.50 Java parti double vilselge; vilselge System.out.print( "Hvor mange kilogram? " ); 100 vilselge = in.readdouble( ); if (vilselge > pålager( )) System.out.println( "Beklager, vi har bare " + pålager( )+ " på lager nå" ); else { double solgtnå = 0, igjenåselge = vilselge; for (int i = første; igjenåselge > 0; i++) { solgtnå = parti[i].selg( igjenåselge ); igjenåselge = igjenåselge - solgtnå; } fjerntommepartier( ); } double pålager() double beholdning=0; for (int i=første; i<=siste; i++) { første 5 siste 9 KaffeSlag maxpartier 100 solgtnå 0 igjenåselge 100 beholdning 0 if (parti[i]!= ) beholdning = beholdning + parti[i].mengde; } // Slutt for return beholdning; 0 1 første siste maxpartier IN105-javaNelson-26

KaffeParti KaffeParti selg Testdata for salg; double selg(double vilselge) Et kaffeparti som double solgt; if (mengde>=vilselge) { mengde = mengde-vilselge; return vilselge; } else { solgt = mengde; mengde = 0; return solgt; } vilselge 60 ikke fins Mer enn på lager Mer enn det er i ett parti Mindre enn det første partiet for salg mengde 60.0 utløpsdato 19990723 IN105-javaNelson-27

KaffeSlag fjerntommepartier Java KaffeSlag navn void fjerntommepartier() 83.50 5 9 100 parti for (int i=første; i<=siste; i++) { if (parti[i]!= ) { // Unødvendig test hvis invarianten holder if (parti[i].mengde==0) { parti[i]=; første = i+1; } } // Slutt if (parti[i]!= ) } // Slutt for 0 1 første siste maxpartier Testes enklest ved å sette maxpartier til 3 eller et annet lite tall IN105-javaNelson-28

KaffeLager KaffeLager sjekkutløpsdato void sjekkutløpsdato( ) int dato; System.out.print( "Dato (ååååmmdd)? " ); dato = in.readint( ); KaffeSlag k; Iterator it = slagene.values( ).iterator( ); while ( it.hasnext( )) { k = (KaffeSlag) it.next( ); k.sjekkutløpsdato(dato); } // slutt while k dato 19990315 slagene IN105-javaNelson-29

KaffeSlag sjekkutløpsdato Java KaffeSlag navn pris 83.50 første 7 double sjekkutløpsdato(int dato) for (int i=første; i<=siste; i++) { if (parti[i].utløpsdato<dato) { parti[i]=; første = i+1; } // Slutt if } // Slutt for siste 9 maxpartier 100 dato 19990315 parti 0 1 første siste maxpartier IN105-javaNelson-30

navn void nyttparti() pris 83.50 Java første 7 KaffeSlag siste 9 maxpartier 100 if (første==1 & siste==maxpartier) { System.out.println("Beklager, programmet er fullt"); } else { if (siste==maxpartier) { // Her er første>1 // Flytter alle objektene slik at de starter i parti[1] for (int i=første; i<=siste; i++) parti[i-første+1] = parti[i]; siste = antallpartier(); første = 1; }; siste++; parti[siste] = new KaffeParti(); parti[siste].lesfraterminal(); } // Slutt else KaffeSlag nyttparti parti 0 1 første siste maxpartier IN105-javaNelson-31

KaffeParti lesfraterminal void lesfraterminal() System.out.print ("Mengde? "); mengde = in.readdouble( ); System.out.print ("Utløpsdato (ååååmmdd)? "); utløpsdato = in.readint( ); mengde 60.0 utløpsdato 19990723 KaffeParti Fullstendig program via programeksempelsida IN105-javaNelson-32