Tentamen OOP 2013

Tillåtna hjälpmedel

Det är otillåtet att fråga någon annan, därför är mobiltelefoner, epost, facebook, chat m.m. otillåtet under tentan. Du får inte kopiera någon annans lösning under tentan. I övrigt är alla medel tillåtna.

Uppgift

Skriv ett program som kan läsa in ett par kanalers TV-tablåer ett par dagar framåt och presentera dem några i taget för användaren. Skriv därefter ett interaktivt program där man kan välja att spela in ett eller flera program. Om man väljer att spela in t.ex. Aktuellt på SVT1 och Molanders som går samtidigt på SVT2 ska ditt program hantera detta. Man ska kunna ångra sig och "avboka" inspelningar. Programmet ska vara robust och klara felaktig inmatning. Det är tillåtet att skriva ett grafiskt gränssnitt. Programmet ska komma ihåg vad man vill spela in mellan körningar. Det ska vara enkelt att ändra koden och läsa TV-tablå från annan slags fil/databas.

Till din hjälp finns två filer svt1.txt samt svt2.txt. Det är tillåtet att ändra formatet i filerna bara man inte ändrar tablån.

Så här skulle en körning av slutliga programmet kunna se ut:

Hej och välkommen till TV
Vad vill du göra?
  1) Visa tablå för SVT1
  2) Visa tablå för SVT2
  3) Visa och hantera inspelningar
  Q) Avsluta
Om man väljer 1) skulle det kunna se ut så här:
Måndag den 11:e mars
 1) 10:00 Melodifestivalen 2013
 2) 10:45 Sverige	      
 3) 11:15 Sportspegeln	      
 4) 11:45 The big C	      
 5) 12:15 Skavlan	      
 N) ... nästkommande program
 0) Återgå till huvudmenyn

Välj program att spela in genom att trycka på motsvarande siffra eller
välj N för att se nästföljande program i denna kanal eller välj 0 för 
att återgå till huvudmenyn.

Väljer man N) skulle det kunna se ut så här:
Måndag den 11:e mars
 1) 13:15 Gårdarna runt sjön
 2) 15:05 Gomorron Sverige  
 3) 15:35 Familjehemligheter
 4) 16:30 VM-rally 2013	   
 5) 17:30 Sverige idag	   
 N) ... nästkommande program
 0) Återgå till huvudmenyn

Välj program att spela in genom att trycka på motsvarande siffra eller
välj N för att se nästföljande program i denna kanal eller välj 0 för 
att återgå till huvudmenyn.

Väljer man 3) skulle det kunna se ut så här:
 15:35 Familjehemligheter (55 minuter) ska spelas in
 Tryck [RETUR] för att fortsätta
Därefter återgår man dit man var. Om man i huvudmenyn väljer 3) Hantera inspelningar så skulle det kunna se ut så här:
Program som ska spelas in:
 1) 15:35 Familjehemligheter (55 minuter) ska spelas in
 0) Återgå till huvudmenyn 

Tryck 0 för att återgå till huvudmenyn eller tryck [siffra] för att ta
bort inspelning.

Diverse kravlättnader

Du behöver inte hantera att spela in sista programmet då sluttiden är okänd. Om du redovisar innan klockan 11 måste du ta hänsyn till tiden då man kör programmet och inte visa passerade program/inspelningar. Kraven kan komma att lätta efter klockan 13 t.ex. att endast hantera ett datum och/eller inte hantera dåligt indata..

Tips

Man kan använda Date, SimpleDateFormat och split för att få in tid och programnamn.
    SimpleDateFormat dp =
        new SimpleDateFormat("yyyy-MM-dd-HH:mm");

    String s1 = "2013-03-11-01:35 Rapport";
    Date d1 = dp.parse(s1.split(" ", 2)[0]);  // 
    String what = s1.split(" ", 2)[1];

För att ta reda på hur länge ett program pågår kan man ta differensen av två Date via getTime som returnerar antal millisekunder från 1970.

        String s2 = "2013-03-11-01:40 Antikrundan";
        Date d2 = dp.parse(s2.split(" ", 2)[0]);
        long diff_i_minuter = ( d2.getTime() - d1.getTime() ) / 60000;  // 60 * 1000 ms
Eller om man vill ha sista minuten innan nästa program börjar kan man använda Calendar
   Calendar c = Calendar.getInstance();
   c.setTime(d2);
   c.add(Calendar.MINUTE, -1);
   Date endtime = c.getTime();

Den här koden går igenom svt1.txt och listar programmen och dess längd vartefter.

        SimpleDateFormat dp =
            new SimpleDateFormat("yyyy-MM-dd-HH:mm");
        SimpleDateFormat out =
            new SimpleDateFormat("E HH:mm");

        Calendar cal = Calendar.getInstance();
        Scanner scanner =  new Scanner(new File("./svt1.txt"));
        String s = scanner.next();
        Date prev = dp.parse(s);
        String prg = scanner.nextLine();
        int i = 1;
        while (scanner.hasNextLine()){
            s = scanner.next();
            Date next = dp.parse(s);
            long length = ( next.getTime() - prev.getTime() ) / 60000;
            cal.setTime(next);
            cal.add(Calendar.MINUTE, -1);
            Date endtime = cal.getTime();
            
            System.out.println(prg + " from " + out.format(prev) + " to " + out.format(endtime) + " length=" + length + " minuter");
            prev = next;
            prg = scanner.nextLine();
            i += 1;
            if (i % 4 == 0) {
                System.out.println("\nTryck [RETUR] för att fortsätta");
                Scanner keyboard = new Scanner(System.in);
                keyboard.nextLine();
            }
        }
Utskriften blir
 Rapport from Mon 01:35 to Mon 01:39 length=5 minuter
 Antikrundan from Mon 01:40 to Mon 02:39 length=60 minuter
 Rapport from Mon 02:40 to Mon 02:44 length=5 minuter
 Så ska det låta from Mon 02:45 to Mon 03:44 length=60 minuter

Tryck [RETUR] för att fortsätta
...

Man kan jämföra Date med metoden after eller compareTo.

På något sätt måste man få in datat i datastrukturer. Rita och tänk efter innan du börjar. Lös och testa din krockhantering separat.

Java har inbyggd funktionalitet för att läsa och spara objekt på fil. Du kan använda denna för att läsa/spara din datastruktur med inspelningar. Testa med ett litet separat program. Alternativt kan du spara och läsa på samma format som TV-tablån.

Munta

Efter att tentan godkänts av handledare ska följande begrepp muntas i separat rum.
Arv
Klassdiagram
Aggregat
Arv (är en slags, is a)
	Association (har en)
	Aggregat (har/består av)
	Komposition/aggregat (består av)	
Åtkomst (private/public ...)
Medlemsvariabel/attribut
Paket (package)

Abstrakt datatyp, Interface
	Problemställning: för små, för stora?

Överlagra (överladda/överskriva i anteckningarna)
Dynamisk bindning
Polymorfi

Programmeringsteknik

Typkonvertera
Typparametrisering

Undantag (exceptions)
Trådar

Enhetstestning

Algoritmer och datastrukturer

Vektor vs länkad lista
Associative array
Hashning
Binärt sökträd
Binär sökning
Sorteringsalgoritmer
	Quicksort
	Mergesort
	Räknesortering (distribution sort)
	Valfri enkel kvadratisk sortering

Designprinciper

Single Responsibility
Abstraction (luta sig mot)
Liskov's Substitution Principle

MVC – model, view, controller
Observer pattern
Singleton

Open/Closed Principle (utökning vs modifiering)
Dependency Inversion Principle