Test 2 OOP - Prøveeksamen 2007 - Viktig: Jobb med oppgavene som om det var eksamen Ikke snakk med sidemann, ta korte pauser, benytt kun skriftlige hjelpemidler du hadde tenkt til å hatt med på eksamen. Det er ingen vits i å lure deg selv!! Husk pseudokode, der dere står fast.
Oppgave 1 (30%) Forklar kort og presis. Benytt gjerne egne eksempler. Du må forklare med egne ord, og ikke skrive av! Oppgave 1.1 (5%) Hva er fordelen med å bruke interfaces? Oppgave 1.2 (5%) Hvorfor tillater ikke java multiple arv? Hvilke ulemper/fordeler har dette for språket? Oppgave 1.3 (5%) Forklar forskjellen mellom interface Comparable og Comparator. Hvilke fordeler har Comparator fremfor Comparable? Oppgave 1.4 (5%) Hvilke fordeler/ulemper er det ved å lagre til database fremfor filer? Oppgave 1.5 (5%) Hvordan er dynamiske datatrukturer organisert i java? Hvorfor bygger dette på arv? Oppgave 1.6 (5%) Hvorfor et det så stilig å programmere objektorientert ( dvs å skille programmet ut i mange klasser), og hva mener du er viktig å passe på når man lager klasser (svar gjerne i punktliste) Slutt Oppgave 1
Oppgave 2 (40%) Vi har nå lyst til å lage et automatisk (automagisk?) program som sender ut epost til personer på en mailingliste. Epostadressene er i en fil med navn receivers.dat, som er som følger: truls.trulsen@trulseland.no post@toreland.com kari.karisen@kariland.se osv (regner med at du har skjønt poenget nå..) Oppgave 2.1 (10%) Skriv en metode som leser inn dataene fra fil, og som returnerer en LenkaListe (epostadressene vil være lagt i lista som strenger): public LinkedList<String> lesinn(string filnavn) Oppgave 2.2 ( 10%) Vi har nå lyst å plukke ut et visst antall epostadresser som passer til et gitt regulærutrykk. Skriv en funksjon, som tar en liste med adresser, og et regexp-pattern og returnerer en liste med de som passet public LinkedList<String> filter(linkedlist<string> liste,string pattern) Oppgave 2.3 ( 10 %) a) Skriv kode som forsøker å sende en mail til e-postadresser i en liste. Koden skal ligge i funksjonen (id argumentet til funksjonen brukes i b-oppgaven): public void sendmail(linkedlist<string> liste,string id,string tittel,string melding,string fra) For å sende mail, kan du benytte funksjonen i den ferdige klassen Email (returnerer true om det gikk å sende, false ellers): public static boolean sendmail(string from,string to,string subject,string message)
b) Utvid koden slik at den skriver til en fil, som har navnet id.dat (altså id'n på mailen som skulle sendes): de mailadressene (en på hver linje) for alle mailer som ikke kunne sendes. Oppgave 2.4 ( 10%) Skriv et lite program som kan startes slik: java sentcheck mailid Programmet skal åpne fila som hører til aktuelle mailid ( altså fila som ble skrevet i oppgave 2.3b), og skrive ut antall eposter som ikke kunne sendes ( og hvilke de var) Slutt Oppgave 2
Oppgave 3 (30%) Vi skal nå ta utgangspunkt i programmet ConnectionMonitor2 som vi så på. Klassen er nå skrevet helt om, slik at den jobber helt av seg selv. Den vil sjekke url'ene ved hjelp av Threads ( dermed kan vi sjekke mange samtidig og uavhengig av hverandre) Klassen tilbyr nå følgende metoder: ConnectionMonitor(); registerserver(string url,int interval) Oppgave 3.1 (10%) Skisser hva som må gjøres for å legge til et lyttersystem, som forteller lytterne hvilken server og hvilket svar hver gang en sjekk ble utført. Lytteren bør ha en metode public void checkperformed(string url,boolean success) Oppgave 3.2 ( 10%) Vi ønsker at hver sjekk skal logges i en database. Skriv en klasse DBLogger, som "abbonenerer på" lytteren du laget i oppgave 1, som logger data i en databasetabell (ServerLogg) som ser slik ut: Tid Server Respons 2007-03-29 12:19:00 http://www.tomheine.net OK 2007-03-29 12:21:00 http://www.hiof.no IKKE OK 2007-03-29 12:22:00 http://www.tomheine.net OK 2007-03-29 12:22:00 http://www.hiof.no OK CREATE TABLE ServerLogg ( tid DATETIME, server VARCHAR(255), respons CHAR(10), PRIMARY KEY(tid,server) );
Oppgave 3.3 (10 %) Vi ønsker nå å printe ut disse dataene i ulike formater. Systemet er laget slik at det klarer å benytte ulike "printere" (dvs klasser som implementerer ett visst interface: ReportPrinter) Vi har en klasse som heter CreateReport, som har følgende metode public void printreport(reportprinter rp) Denne metoden gjør da all jobben for oss med selve printingen, forutsatt at ReportPritneren vi har lager formatterer rapporten. Interfacet ser slik ut: public intercafe ReportPrinter { //Metoden gir deg alle LoggLine-objektene for den spesielle url'en som hovedprogrammet vil lage en rapport for public String formatreport(arraylist<loggline> al,string url); } En loggline er definert som følger: public class LoggLine { public String date=""; public boolean ok=false; } Selve oppgaven er nå at du skal lage en klasse, som heter Reliability, som returnerer følgende tekst fra formatreport-metoden: Oppeprosent : xx % (altså hvor stor prosent av tiden var serveren OK)