UNIVERSITETET I OSLO

Like dokumenter
UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1000: noen avsluttende ord

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1000: noen avsluttende ord

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

Oversikt. INF1000 Uke 6. Objekter, pekere og null. Lese og skrive fra/til fil. Litt om objekter, pekere og null Filer og easyio. Litt mer om tekster

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Leksjon 7. Filer og unntak

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

EKSAMEN I EMNET INF100/INF100-F Grunnkurs i programmering (Programmering 1) Fredag 16. desember 2005 Tid: 09:00 14:00

Endret litt som ukeoppgave i INF1010 våren 2004

Det matematisk-naturvitenskapelige fakultet

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

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

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

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

Oblig 4Hybelhus litt mer tips enn i oppgaven

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

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

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

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

Forelesningsquiz. Forelesning inf Java 5. Sett dere to (eller tre) sammen og besvar de fire spørsmålene på utdelt ark. Tid: 15 min.

Oblig4 - forklaringer. Arne og Ole Christian

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

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

UNIVERSITETET I OSLO

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

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

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

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Gjennomgang av eksamen H99

UNIVERSITETET I OSLO

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 v2008

Bruk av class Scanner, FileWriter og Formatter som alternativ til EasyIO i INF1000.

UNIVERSITETET I OSLO

AVDELING FOR INGENIØRUTDANNING EKSAMENSOPPGAVE. Antall sider (Inkl forsiden): 8. Alle trykte og håndskrevne

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

. Ved sensur vl1 ahe bokstaverte deloppgaver (a, b, c,...) telle like mye.

EKSAMEN I INF244: OBJEKTORIENTERT PROGRAMVAREUTVIKLING I BACHELORSTUDIET I IT OG INFORMASJONSSYSTEMER BACHELORSTUDIET I IT OG ENTREPRENØRSKAP

IN Notat om I/O i Java

UNIVERSITETET I OSLO

Ole Christian Lingjærde, 12. september 2013

Forelesning inf Java 4

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

81,9(56,7(7(7,26/2 'HWPDWHPDWLVNQDWXUYLWHQVNDSHOLJHIDNXOWHW

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 v2009

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

INF1000 Prøveeksamen Oppgave 7 og 9

Oversikt. Filer. Litt mer om tekster. INF1000 Uke 6. Lese og skrive fra/til fil. Eksempel. Vi importerer pakken easyio. Klassene In og Out i easyio

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

UNIVERSITETET I OSLO

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 h2006

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

Eksamen IN1010/INF1010 våren 2018

Transkript:

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i : Eksamensdag : Lørdag 5. juni 2004 Tid for eksamen : 09.00 15.00 Oppgavesettet er på : Vedlegg : Tillatte hjelpemidler : INF1010 Objektorientert programmering 5 sider + 5 sider vedlegg Utdrag av dokumentasjon av klassen InExp fra easyio Alle trykte og skrevne, ingen elektroniske. Les gjennom hele oppgaven før du begynner å løse oppgaven. Kontroller at oppgavesettet er komplett før du begynner å besvare det. Dersom du savner opplysninger i oppgaven, kan du selv legge dine egne forutsetninger til grunn og gjøre rimelige antagelser, så lenge de ikke bryter med oppgavens ånd. Gjør i så fall rede for forutsetningene og antagelsene du gjør. Du kan fritt nytte klasser fra Javas klassebibliotek, men oppgavene legger ikke opp til at du bruker mer enn det som står i læreboka og i vedlegget. Del I: Varesystem for matvaregiganten Strudel (80 %) Du skal i det etterfølgende hjelpe til å lage et system for administrasjon av varer for matvaregiganten Strudel, som nå vil etablere seg i Norge. Det er ikke et fullt ferdig system du skal lage noen viktige deler vil mangle. Pass derfor på at du bare løser de spørsmål du blir bedt om å løse. Dette systemet du lager viktige deler av, skal kjøres sentralt i Strudels norsk hovedkvarter, og de salgsopplysningene de trenger fra hver butikk for hver dag, får hovedkvarteret sendt over linje om kvelden etter at butikkene har avsluttet salget (hvis intet er galt i butikkens datasystem eller med linja se oppgave 3, 4 og 5). Når det i det etterfølgende står dagens salg eller dagens omsetning, menes den siste avsluttede salgsdagen. Strudel vil i første omgang sette opp K varelagre (nummerert 1,2,..K) og N butikker (nummerert 1,2, N) i Norge. Hvert varelager betjener nøyaktig 30 butikker. Vi skal bruke K=5 og N = 150, men innfør disse som navngitte konstanter i programmet ditt for senere mulige utvidelser. Strudel opererer med et vareutvalg på 750 vareslag i hver butikk og 1000 vareslag i hvert varelager. Det er samme vareutvalg i hvert varelager, men det er ikke nødvendigvis helt det samme vareutvalget som selges i hver butikk. Hver butikk har en fil VarerButikkX.dat med 750 linjer som beskriver de varene som for tiden selges i Butikk nummer X (X = 1, 2,, 150). Formatet på denne filen er linjer med: varenummer (som er entydig), varenavn, utsalgspris (moms inkludert), vektperenhet (i kg), 1

antallperdag. Denne siste opplysningen er antall enheter man forventer solgt av denne varen per dag. Eksempel på to linjer av en slik fil: 1311 Gulost-halvfet 45.50 0.5 30 0304 Toalettpapir 9.50 1.1 76 Strudel ønsker en høy omløphastighet på varene i butikkene sine. Når butikkene etableres og etter hver gang det er etterfylt en bestemt vare, er det forventet salg for 3 dager som totalt er i hyllene. Regelen for etterfylling er slik at hvis antall enheter som er igjen i hyllene av en bestemt type etter at butikken stenger om kvelden synker under 1 dags forventet salg, så skal systemet sende en ordre på flere varer av denne typen til varelageret (se oppgave 6). Strudel har en fast prosentsfortjeneste på 20 % før moms. Utsalgsprisen kalkuleres følgelig av Strudel som: selvkostprisen for varen + 20 % av selvkosten som fortjeneste, og til sist 12 % moms på dette beløpet (se oppgave 3). For hver butikk vil kassaapparatene lokalt til sammen lage en fil over dagens salg, SalgX.dat med én linje for hvert salg av en varetype for butikk nummer X (=1,2,...,N). En ny lik fil vil da overskrive en gammel fil fra samme butikk. Første linje i denne fila inneholder to tall, først butikkens nummer og deretter et nummer for hvilken dag denne omsetningen gjelder for (dagene er nummerert etter den dagen Strudel åpnet butikkene sine i Norge). Hver linje etter det inneholder et varenummer og antall solgte enheter av denne varen. Flere linjer i denne fila kan godt referere til samme varenummer. De tre første linjene fra butikk 54 for dag 12 etter at Strudel åpnet, kan være: 54 12 2311 3 0307 1 Merk at varenumrene er firesifrete og godt kan være større enn 1000. Ved hvert av varelagrene er det et tilstrekkelig antall lastebiler som hver kan laste inntil 10 tonn for å frakte varene til butikkene. Men for å spare penger, vil Strudel ikke sende en lastebil (den siste lastbilen til en bestemt butikk den dagen) av gårde med mindre den er minst halvfull (5 tonn). De varene som butikkene på denne måten eventuelt ikke får, må bestilles om igjen neste dag (se oppgave 6). N.B. I dette systemet er det i mange av metodene en parameter idag, som alltid skal være dagens dag (=siste avsluttede salgsdag, og du kan anta at dette tallet er riktig ved alle kall. Systemet skal altså bare kunne huske siste dags salg. Grunnen til å ha denne parameteren er å fange feil som at man for eksempel nytter gale (gamle) salgsfiler eller oppdaterer en butikk flere ganger med samme salgfil. Oppgave 1 (5 %) UML - diagram Lag et UML-klassediagram av Strudel-systemet ditt som er i stand til å løse samtlige oppgaver i oppgavesettet. Sørg for å navngi de assosiasjonene du trenger mellom klassene og få på antall på disse assosiasjonene. Ta også med i diagrammet ditt de ulike metodene du skal skrive i oppgavene 3-7. 2

Oppgave 2 (10 %) Deklarer klassene med data og innlesning av varefilene til butikkene Deklarer de klassene du laget diagram for i oppgave 1. Ta også med deklarasjon av de objekt- og klasse-variable du vil trenge i disse klassene. I den klassen som representerer butikkene i ditt system, skal du også skrive en konstruktør som leser inn varefilen for vedkommende butikk. Oppgave 3 (10 %) fortjeneste per vareslag og oppdatering for én butikk a) Lag en metode double fortjeneste( ) i den klassen som holder data for ett vareslag, og som regner ut fortjenesten for Strudel ved å selge en enhet av denne varen. b) Lag en metode void oppdater(int idag,..) som for butikk nummer X leser dagens salgsfil: SalgX.dat og oppdaterer datastrukturen for hvor mange enheter det er igjen av hvert vareslag i butikken, og registrerer samtidig hvor mye som er solgt av hver vare i dag (trengs senere). De parametere du eventuelt trenger til i tillegg til dagen nummer idag, spesifiserer du selv. Metoden skal kaste et unntak om den ikke greier å åpne filen, om filen har galt dagsnummer, om den ikke finner ett eller flere vareslag fra fila i butikken, eller om denne metoden kalles mer enn en gang per dag for en butikk. Et slikt unntak skal metoden eventuelt bare kaste etter at den er ferdig med alle data i salgsfila som den greier å behandle. Av unntaket skal det fremgå hvilken type feil som har skjedd. Hint: Les filen med klassen InExp fra easyio. Oppgave 4 (10 %) oppdatering i hele Strudel Norge Lag en metode void oppdateralle(int idag)som kaller oppdater( ) for samtlige butikker i Strudel Norge AS for dagens omsetning. Parameteren angir siste salgsdag dagens dagsnummer. Metoden skal gå videre selv om noen av filene manglet eller det er andre feil. For de av filene som den eventuelt på disse måtene mangler data for, skal metoden skrive ut en liste over hvilke butikker det gjelder. Listen skal skrives ut med System.out.println. Metoden skal selv kaste et egendefinert unntak hvis en eller flere av de butikkene den kaller oppdater(..) for, allerede er oppdatert for dagens omsetning. Dette skal sikre oss mot dobbelt oppdatering av data. Dette unntaket skal den eventuelt bare kaste etter at den er ferdig med alle kallene. 3

Oppgave 5 (10 %) fortjeneste per butikk og varelager a) Lag en metode double regnutdagensfortjeneste(int idag), som går gjennom data registrert i en bestemt butikk og regner ut dagens fortjeneste uten å bruke salgsfilen for den dagen, men bare bruker data registrert med oppdater( ) b) Lag en metode double sumvarelagerforjeneste(int idag) som returnerer dagens fortjeneste for et bestemt varelager dvs. summen av fortjenesten til alle butikkene tilknyttet dette varelageret. Heller ikke denne metoden skal nytte salgsfilene. Denne metoden skal når den er ferdig med alle butikkene den som tilhører dette varelageret, kaste et unntak hvis ikke oppdater(..) er kjørt for en eller flere av disse. Klassen for dette unntaket skal du deklarere selv. Stringen i unntaket skal da inneholde hvilke butikker dette gjelder atskilt med komma. Oppgave 6 (25 %) bestilling og vareliste for bilene Du skal nå lage bestilling av varer for en butikk fra varelageret. Skriv en metode: void lagbestillingsfil(int x), som lager en bestillingsfil: BestillingX.dat for butikk X fra sitt varelager. Den fila skal ha et format som er delt opp etter de biler som i dag skal kjøres til butikken, og har følgende format: Bil 1 0312 14 1107 33. Bil 2 0777 88. Tallene som kommer etter linjene med Bil..., er bestillinger med varenummeret som bestilles sammen med antallet som bestilles av den varen. Metoden skal sørge for at ingen bil er overlastet (ikke mer enn 10 tonn) og at siste bil som bestilles minst er halvfull. Det kreves bare delvis sortering av disse ordrene ved at det først skal bestilles de varene som det er helt tomt for i hyllene, men så kreves det ingen spesiell rekkefølge på de resterende ordrene. Fyll bilene med bestiller av vareslag fortløpende så lenge det er plass uten å forsøke å optimalisere slik at hver bil blir så full som mulig. Et vareslag skal ikke splittes over to biler. Oppgave 7 (10 %) Enkelt grafisk brukergrensesnitt for Strudel-systemet Lag et enkelt grafisk brukergrensesnitt som kan kalle de ulike metodene med brukervalgte parametere i oppgave 3-6. Du skal bruke JOptionPane for all brukerkommunikasjonen (for å gjøre oppgaven enklere), og velg da den varianten som gir en rullegardinmeny for å velge blant de metodene du har skrevet. Du skal altså ikke nytte JFrame eller JPanel. 4

Del II : Fischersjakk (20 %) (Denne oppgaven er hentet fra sjakk, men det er ikke nødvendig å kunne noe om sjakk for å løse den.) Fischer-sjakk er en variant av sjakk der brikkenes startoppstilling varierer fra parti til parti. Vi skal her se på plasseringen av hvits konge (K), to springere (S), to løpere (L), to tårn (T) og en dronning (D). Disse åtte brikkene skal plasseres på førsteraden, som på et sjakkbrett ser slik ut: For en lovlig Fischer-oppstilling gjelder følgende to begrensninger: 1. de to løperne skal plasseres på felt med ulik farge. 2. kongen skal plasseres på et felt mellom de to tårnene. For eksempel vil TSLDKLST (standardoppstillingen) og LSTLSDKT være lovlige oppstillinger, mens LSTSLKDT og TSLTDKLS ikke vil være det (bryter henholdsvis 1 og 2). Lag et program som genererer (og skriver ut) alle slike Fischer-oppstillinger. Merk at vi ikke skiller mellom like brikker (de to tårnene, eller de to løperne, eller de to springerne) slik at en sekvens som for eksempel LSTLSDKT bare skal skrives ut en gang. En rett fram løsning er å generere alle mulige plasseringer av brikkene og så bare skrive ut de plasseringene som tilfredsstiller reglene. Ekstrapoeng vil bli gitt til løsninger som bruker reglene helt eller delvis til avskjæring av generering av løsningsforslagene. ---------------------ooo0ooo--------------------------- 5

Vedlegg deler av dokumentasjonen av klassen InExp fra easyio: easyio Class InExp java.lang.object +--easyio.inexp Direct Known Subclasses: In public class InExp extends Object Klasse for lesing fra tastatur og fil, til støtte av boken "Rett på Java". Inneholder metoder for å lese tegn, ord, tall og linjer med tekst. Eksempler på bruk: try { // åpner en fil med navn "filnavn" for lesing. InExp inn = new InExp("filnavn"); // leser et heltall fra filen. int i = inn.inint(); // leser resten av linja. String linje = inn.inline(); catch (IOException e) {... } Eksempel på lesing av linjer: try { while (!inn.endoffile()) { System.out.println(inn.nextLine()); } } catch (IOException ioe) { System.err.println("Feil, linje: " + inn.getlineno()); } Eksempel på lesing av ord (blanke tegn blir borte): int i = 1; try { while (!inn.endoffile()) { System.out.println("Ord nr. " + i + inn.intext()); } } catch (IOException e) { 6

}... Eksempel på lesing av ett og ett tegn: try { while (!inn.endoffile()) { System.out.print(inn.inChar()); } catch... Version: 1.1 In Constructor Detail InExp public InExp() Konstruktør for lesing fra tastatur. InExp public InExp(String filnavn) Konstruktør for lesing av fil. Parameters: filnavn - navn på filen som skal leses. IOException - hvis en feil oppstår (f.eks at filen ikke finnes) Method Detail close public void close() Lukker lesing fra tastatur/fil. IOException - hvis en feil oppstår inline public String inline() Leser en linje med tekst. Hvis noe av linja allerede er lest (ved kall på f.eks inword() returneres resten av linja frem til linjeskift, slik at første uleste tegn etter metoden returnerer et linjeskift (men suksessive kall på inline fjerner linjeskift). Denne metoden er nextline. en String med teksten på linja, untatt linjeskifttegn, eller null hvis slutten på fila er nådd. 7

nextline(), BufferedReader.readLine() nextline public String nextline() Leser en linje med tekst. Hvis noe av linja allerede er lest (ved kall på f.eks inword() returneres resten av linja frem til linjeskift, slik at første uleste tegn etter metoden returnerer et linjeskift (men suksessive kall på inline fjerner linjeskift). Denne metoden er lik inline. en String med teksten på linja, untatt linjeskifttegn, eller null hvis slutten på fila er nådd. Since: versjon 1.1 BufferedReader.readLine() intext public String intext() Leser inn et ord eller en linje med tekst. Blanke tegn før og etter teksten kastes. Bruk denne metoden i stedet for inword ved innlesing fra tastatur. en String med teksten på linja eller null hvis slutten på fila er nådd. Since: versjon 1.1 In.inWord() inint public int inint() throws NumberFormatException, IOException Leser inn og returnerer heltall i titallssystemet. en int med sist leste heltall. IOException - hvis en feil oppstår ved lesing. NumberFormatException - hvis innlest tekst ikke kan tolkes som et heltall. Integer.parseInt(String) indouble public double indouble() throws NumberFormatException, 8

IOException Som for @link{inint()} men tallet som leses inn er et reelt tall av typen double. en double med sist leste tall. NumberFormatException - hvis innlest tekst ikke kan tolkes som et reelt tall av typen double. Double.parseDouble(String s). inword public String inword() Hopper frem til første ikke-hvite tegn og returnerer deretter de påfølgende tegnene frem til første hvite tegn. Resultatet er at den returnerer ett ord. en String med sist leste ord eller null hvis det ikke er flere ikke-hvite tegn å lese. StringTokenizer skipwhite public void skipwhite() Gjør at neste uleste tegn vil være et ikke-blankt tegn. lastitem public boolean lastitem() Som for lastitem(string), men ser på hvite tegn. true hvis alle ikke-hvite tegn er lest. IOException - hvis en feil oppstår under innlesing. endofline public boolean endofline() true hvis siste ikke-blanke tegn på linja er lest. endofline public boolean endofline(string sep) 9

Som for endofline(), men istedet for hvite tegn ses det på tegn spesifisert i sep. Parameters: sep - tekst med tegn som skal ignoreres. endoffile public boolean endoffile() true hvis siste ikke-hvite tegn er lest. getlineno public int getlineno() Returnerer linjenummeret på sist leste tegn, ord, tall osv. nummeret på siste leste linje. 10