Table of ontents Inf1010 oppgavesamling.. 1 Subklasser... 1 Grensesnitt.. 2 Rekursjon... 3 Datastrukturer... 3 GUI. 4 Sortering... 6 Tråder... 6 Inf1010 oppgavesamling Subklasser Klassehirarki for dyr Lag fire klasser Virveldyr, Pattedyr, Primat og Fisk. Lag et fornuftig klassehieraki av disse klassene ved å gjøre noen klasser til subklasser av andre klasser. Fyll klassene med passende variabler og metoder. Tegn et klassediagram som viser forholdet mellom klassene og hva de inneholder. (Trenger ikke være korrekt UML notasjon). Motorkjøretøydata Du skal lage et program som skal holde styr på data om motorkjøretøy av ulike slag (busser, personbiler og varebiler) og deres eiere. For hvert kjøretøy - uansett slag - skal følgende data lagres: Registreringsnummer (String) Fabrikkmerke (String) Eierens navn (String) lle kjøretøy har ulike registreringnummer. nta også at alle eiere har ulike navn. Programmet skal håndtere kjøretøy av følgende slag: Busser. I tillegg til det som lagres for alle kjøretøy, skal det for hver buss lagres antall sitteplasser. Biler av to ulike slag: Personbiler. Med antall sitteplasser. Varebiler. Med maksimal lastevekt. For hver bil skal programmet kunne beregne årsavgift, som for personbiler er konstant lik 3000 kroner, mens den for varebiler er lik 4*(maksimal lastevekt). Tegn et UML klassediagram med alle klassene vi behøver (ta en titt på oppgave B samtidig). 1
B Deklarer klassene Kjøretøy, Buss, Bil, Personbil og Varebil med deklarasjoner av passende attributter (husk subklasser). lle klassene skal inneholde metoder for å lese inn og skrive ut data. For hver bil skal også årsavgiften skrives ut. Lag et kommando-styrt program som holder styr på data om kjøretøy. Programmet skal kunne håndtere følgende kommandoer: NyttKjøretøy. Registrerer nytt kjøretøy, etter å ha spurt brukeren om typen kjøretøy. SkrivlleKjøretøy. SkrivKjøretøy. Ber bruken om et registreringsnummer, og skriver alle data om kjøretøyet hvis det finnes. SummerRegavgift. Ber brukeres om navnet på en eier/et firma, og summerer registreringsavgiften for alle biler registrert på dette navnet. Grensesnitt Stabelgrensesnitt B En 'Stabel', eller 'Stack', er som navnet sier en stabel med et eller annet. Tenk på det som tallerkener som ligger oppå hverandre. Det er da slik at hvis man vil legge til en ny tallerkern i stabelen må den legges helt på toppen, og hvis man vil fjerne en tallerken fra stabelen må man også ta den øverste, med andre ord den som sist ble lagt på. Stabler kalles derfor også LIFO-lister; Last In First Out. Tenk litt over hva som ville skjedd hvis køer for eksempel i butikker eller i billettluka på kino hadde fungert som en stabel. God idé? Finner du noen eksempler på stabler i verden? Skriv et interface 'Stack' som skal definere en stabel med noe. Interfacet skal ha metodene: Object pop(); Object top(); void push(object ob); boolean isempty(); Tar av øverste element i stabelen og returnerer dette. Returnerer øverste element uten å fjerne dette. Legger til elementet 'ob' øverst i stabelen. Forteller om stabelen er tom eller ikke. Skriven implementasjon 'rraystack' av stabelen din, altså 'class rraystack implements Stack {... ' Objektene i stabelen skal her lagres i et Object[] (Object-array) på en slik måte at metodene i grensesnittet blir riktige. NB: Dersom man prøver å bruke 'pop()' eller 'top()' når stabelen er tom, skal det kastes et 'EmptyStackException'-unntak. Mobiltlf i Uqbar En mobiltelefonprodusent i Uqbar har ansatt deg for at du skal lage et nytt datasystem som skal holde orden på alle mobiltelefonene firmaet produserer. 2
Rekursjon Springer Systemet skal ha følgende egenskaper: En mobiltelefon (av klassen Mobiltelefon) er kjennetegnet av en identi#kasjon (et heltall). En musikkspiller må kunne fortelle hvor mange Mbyte lagringskapasitet den har (et heltall). Et kamera må kunne fortelle hvor mange bildepunkter kameraet har (et heltall). Noen mobiltelefoner (av klassen MobMus) er også en musikkspiller, andre mobiltelefoner (av klassen MobKa) er også et kamera, mens noen mobiltelefoner (av klassen MobMusKa) er også både musikkspiller og kamera. Skriv først klassen Mobiltelefon og grensesnittene (interface) Musikk- spiller og Kamera. Skriv deretter klassene MobMus, MobKa og MobMusKa basert på Mobiltelefon, Musikkspiller og Kamera. Vi skal lage et program som finner en måte å bevege en hest (springer) på sjakkbrett, slik at den er innom alle ruter en og bare en gang. En hest kan gå to skritt frem (i vilkårlig retning) og ett til siden. Oppgaven skal løses for et n x n brett, og hesten skal starte i en gitt posisjon. HINT: Lag først en rekursiv prosedyre som genererer alle hesteturer av lengde n * n (også utenfor brettet). Legg så inn avskjæring slik at den:. holder seg innenfor brettet B. aldri besøker en rute to ganger Datastrukturer Liste og binært søketre Gitt dette interfacet: /** simple collection interface. * Defines a small subset of java.util.ollection. * * @param <E> The type of element to put in the collection (a class name). public interface Simpleollection<E> { /** dd an element to the collection. * @param e The element. * @return true if this collection changed as a result of the the call. public boolean add(e e); /** heck if the collection contains one or more of the specified element. * @param e The element. * @return true if the element is in the collection and false if not. public boolean contains(e e); /** Remove the first occurrence of the specified element from the collection. 3
* @param e The element. * @return true if the collection contained the element. public boolean remove(e e);. Lag en enkelt-lenket liste som implementerer interfacet. B. Lag et binært søketre som implementerer interfacet. Merk at fjerning fra binært søketre ikke er pensum og derfor kan utelates.. Implementer java.lang.iterable interfacet i liste klassen du lagde i oppgave. Køer Gitt dette interfacet: /** simple queue interface. * This is a subset of the Queue interface in the java api. * @param <E> The type of element to put in the queue (a class name). public interface SimpleQueue<E> { /** dd an element to the collection. * @param e The element. * @return true if this collection changed as a result of the the call. public boolean add(e e); /** Remove and return one element from the queue. * @return a element or null if the queue is empty. public E poll();. Lag en FIFO og en LIFO kø som implementerer interfacet. B. Implementer java.lang.iterable interfacet i liste klassene du lagde i oppgave.. Legg til andre metoder som du mener er nyttige å ha i en kø. GUI ddressebok gui I en addressebok applikasjon trengen vi en GUI for å registrere og redigere informasjon om en person. Vi er ute etter denne informasjonen: Fornavn Etternavn Telefonnummer Email Ett eller flere ord, men ikke mer enn 30 tegn Samme regler som for fornavn. Skal kun innehode heltall Må inneholde @, men skal ikke starte eller slutte med @. 4
Om En litt lenger tekst om personen. Lag en Person klasse med variabler for å lagre informasjon om en person. B Lag GUI for å registrere en person: 1. Lag en subklasse av JPanel med felter for å registrere informasjon om en person. Klassen skal hete RegisterPersonInfoPanel. Lag en metode som henter ut inforasjonen og returnere et Person objekt. 2. Lag en subklasse av JFrame som inneholder/viser et objekt av RegisterPersonInfoPanel. Lag GUI for å vise en person: 1. Lag en subklasse av JPanel som kan vise informasjon om en person. Klassen skal hete ShowPersonInfoPanel. Konstruktøren til klassen skal ta et objekt av klassen Person som argument til konstruktøren. 2. Lag en subklasse av JDialog som inneholder/viser et objekt av ShowPersonInfoPanel. D Legg til validering av verdiene: 1. Lag metoder i Person klassen for å endre verdier. 2. Utvid metodene slik at de gir en exception hvis verdien er ugyldig (formatet er spesifisert lenger opp i oppgaven). E Oppdater JFrame subklassen fra oppgave b med en knapp som: 1. viser dialogen fra oppgave hvis alle feltene validerer. 2. viser en feilmelding til brukeren hvis ikke feltene validerer. F Oppdater metoden som kalles av knappen i oppgave E slik at hvert felt valideres i en egen tråd og metoden returnerer når alle feltene er validert. GUI for binært søketre Du skal lage en GUI som tegner binærtrær. Tenk over hvilke metoder du må kunne kalle i treet (og nodene?) for å få til å tegne det opp. Samle disse til ett eller flere grensesnitt som vil sikre at du kan tegne opp treet med programmet ditt. 5
B Tenk over hvordan du vil gjøre selve opptegningen av treet. Lag en skisse, og finn ut hvordan du kan regne ut de ulike posisjonene du vil får bruk for for å lage en god tegning. Hint: På dybde 'k' må det være plass til '2^k' noder. Hvis du vil sentrere disse på en enkel måte kan du dele inn i '2^(k+1)' like deler, og plassere node nr. 'n' fra venstre på plass '2*n-1'. Sortering Skriv programmet som tegner opp treet! Husk å overskrive paintomponent(graphics g) der det trengs. Pseudokode for sorteringsalgoritmer Skriv pseudokode for innstikksortering og quicksort. Implementer sorteringsalgoritmer Tråder Skriv metoder i java som implementerer pseudokoden fra forrige oppgave. Producer & onsumer B D I denne oppgaven skal vi løse et kjent problem innen tråd-programmering, nemlig produsent-konsument problemet. Det er som følgende: Et sett med produsenter produserer enheter. Et sett med konsumenter konsumerer enheter. Hovedproblemet er at konsumentene ikke kan konsumere enheter som ikke er produsert. I tillegg kan vi legge begrensninger på hvor mange ukonsumerte enheter vi kan ha i omløp. ktiviteten til produsentene og konsumentene må synkroniseres. Til dette kan vi f.eks. bruke et synkronisert buffer. Lag et generisk trådsikkert buffer. Bufferet må ha en indre datastruktur, en limit, samt synkroniserte addog get-metoder. Bruk wait() og notify() for å forhindre at to tråder samtidig jobber på bufferet. Kast InterruptedException'en ut av add- og get-metodene. Buffer-regler: Hvis bufferet er fult, må man vente med å legge inn sin ferdigproduserte enhet. Hvis bufferet er tom må man vente til en enhet legges inn i bufferet. Lag to kjørebare klasser (dvs Runnable eller Thread) Producer og onsumer. Begge tar inn et objekt av klassen vi laget i a) (Pass på generics!). Producer tar i tillegg inn hvor mange enheter den skal produsere. Skriv run-metodene i Producer og onsumer. Hint: en for-løkke og en while(true)-løkke? Skriv klassen Produceronsumer som lager og starter opp et gitt antall produsenter og konsumenter. Klassen kan også godt ta inn et buffer, som skisert i a) og antall enheter som skal produseres per produsent. 6
Sørg for å interrupte alle tråder når programmet avsluttes. Hint: klassen Thread har en metode som heter interrupt(). E Sett antallprodusenter = 8, antallkonsumenter = 1 og antallenheterperprodusent = 4. Gjennomfør noen kjøringer, og obsrver om programmet henger seg. Prøv å forklar det som skjer, samt implementer en løsning som fikser problemet. F Bruk java-klassene/interfacene: java.util.concurrent.locks.ondition; java.util.concurrent.locks.lock; java.util.concurrent.locks.reentrantlock; til å skrive et trådsikkert buffer med to ventende køer. Idèen er at et objekt fra den ene køen gir låsen/ monitoren videre til et objekt fra den andre køen. Finn minste tall i array Du skal hjelpe et firma med å lage et program som arbeider i parallell på mange deler av en tabell (array) ved hjelp av tråder. Som et første ledd i dette skal du skrive et lite demonstrasjonsprogram. Fyll ut alle manglende deler av programmet på neste side slik at det blir et program som virker. Tabellen på 640000 elementer skal deles i 64 like deler, der 64 tråder skal lete etter minste verdi i hver sin del. Når en tråd har funne den minste verdien i sin del, kaller den metoden giminsteverdi i Minst-objektet. giminsteverdi skal sjekke om den verdien den nå får er den minste til nå, og hvis den nye verdien er minst skal den lagres i variablen minsttilna. Metoden vent skal vente (ved hjelp av wait()), til alle de 64 trådene er ferdig med å lete. Husk at den må vekkes opp ved hjelp av notify(). For å lage et rimelig realistisk testprogram fylles noen tall inn i tabellen. lle tallene som fylles inn er større eller lik 100, med unntak av det minste tallet som er 77, og som ligger på et tilfeldig sted i tabellen. Hvis programmet er riktig skal det derfor skrive ut 77 som minste verdi. Programmet du skal fylle ut alle de manglende delene i ser du nedenfor. Fyll ut alle steder det står "". Er det tvil om hvor i programmet du er, vis til linjenumrene for å forklare hvor de forskjellige programdelene skal inn. Programmet du skal fylle ut class Minst { int minsttilna = Integer.MX_VLUE; int [] tabell; public static void main(string[ ] args) { new Minst(); public Minst ( ) { tabell = new int[640000]; for (int in = 0; in< 640000; in++) tabell[in] = in+100; 7
// fylltabellen med tall int tilfeldig = (int)(math.random()*640000); // tilfeldig = 639999; System.out.println("Minste index: " + tilfeldig); tabell[tilfeldig] = 77; for (int i = 0; i< 64; i++) // Lag og start 64 tråder new MinstTrad(...).start(); vent(); System.out.println("Minste verdi var: " + minsttilna); synchronized void vent() { synchronized void giminsteverdi (int minverdi) { class MinstTrad extends Thread { MinstTrad() { public void run(){ // slutt MinstTrad Trådbasert iterator Tenk deg at du vil skrive en iterator som baserer seg på tråder. Du har en samling med objekter,, og du vil at en egen tråd T skal løpe gjennom alle objektene i og stoppe for hvert objekt. Når du kaller next() i iteratoren (fra main-tråden e.l.) skal du returnere objektet T har "stoppet ved", og så skal T gå videre til neste objekt. Du må også huske å implementere hasnext() på en skikkelig måte. remove() kan du foreløpig la være å tenke på.. Hvor mye av dette kan gjøres helt generelt, uten tanke på hvordan ser ut? Tenk ut en abstrakt klasse som inneholder all felles kode, og som definerer abstrakte (eller tomme) metoder for det som må overskrives for hver spesielle. Skriv klassen din. B. Bruk klassen du har lagd i forige deloppgave til å skrive en iterator for et array, en lenket liste og et binærtre. (Hvis du har gjort forige deloppgave på en god måte vil du her kun behøve å utvide klassen derfra, og overskrive én eller to metoder). Hva må gjøres for at remove() også skal kunne brukes? Gjør endringer slik at også dette blir mulig. 8