Salstentamen måndag 2 juni OOP14
Uppgiften består i att skriva ett grafiskt javaprogram som chiffrerar och dechiffrerar ett meddelande enligt nedan. Programmet ska fungera och inte krascha men i övrigt ställs inte höga krav på programmet. Datastrukturer och algoritmval är valfria. Vid redovisning ska du kunna redogöra för hur programmet skulle kunna förbättras och utökas för att t.ex. avkoda/dekoda fler saker. Läs hela tentan innan du börjar.
Uppgift 1
Skriv javakod som kan chiffrera/dechiffrera enligt nedanstående två chiffer.
Chiffer 1
Skriv ett program som chiffrerar genom att "flytta" alfabetet ett eller flera steg. Exempel:
A kodas som B
B -> C
C -> D
Ö -> A
ALEXANDER kodas som BKFYBOEFS
Hur du löser specialtecken som punkt och komma får du bestämma själv. Antal steg ska vara valbart (en parameter).
Chiffer 2
I det antika Grekland användes en dekrypteringspinne för att avkoda hemliga meddelanden skrivna på en remsa skinn. Avsändaren och mottagaren har varsin pinne av samma diameter. Avsändaren lindar skinnremsan som en spiral runt pinnen och skriver sitt meddelande längs med pinnen. Remsan blir då obegriplig tills den hamnar i mottagarens händer.
Skriv ett program som fungerar på ett liknande sätt. Använd en matris och fyll matrisen med det hemliga meddelandet rad för rad. Det kodade meddelandet läses kolumnvis. Exempel för en matris med 10 kolumner: "TSARENS KURIR ANKOMMER VID MIDNATT"
TSARENS KU
RIR ANKOMM
ER VID MID
NATT
"TSARENS KURIR ANKOMMER VID MIDNATT" kodas som "TRENSIRAAR TR VTEAINNDSK OMKMIUMD". Antal kolumner ska vara valbart.
Tänk på att det är lite bökigt när matrisen inte går jämnt upp med meddelandet. I exemplet ovan räknas inte tecknen efter "NATT" med. Det kan man man åstadkomma med en if-sats i den inre matrisloopen. En annan lösning är att fylla ut med mellanslag så att man får en kvadratisk matris men då måste man komma ihåg att mata in det där sista mellanslaget vid dechiffrering.
Uppgift 2
Skriv ett kommandoradsprogram som kan chiffrera eller dechiffrera en fil enligt ovan. Programmet ska styras med kommandoradsparametrar. Man ska kunna ange vilken chiffreringsmetod, antal steg/kolumner samt vilken fil som ska chiffreras/dechiffreras. Resultatet skrivs ut i terminalfönstret. Testa att chiffrera och dechiffrera.
Uppgift 3
Skriv ett grafiskt gränssnitt som kan chiffrera och dechiffrera med hjälp av en av chiffermetoderna ovan. Så här skulle det kunna se ut:
Man skriver in texten som ska chiffreras och trycker sedan på knappen. Om man klistrar in det dechifrerade meddelandet och trycker på decipher så ska ursrungsmeddelandet komma fram.
Till din hjälp får du källkoden till programmet ovan. Du får naturligtvis skriva egen bättre grafikkod. Vid redovisningen ska du redogöra för hur din kod kan förbättras.
Uppgift 4
Utöka ditt grafiska program så att man kan chiffrera och dechiffrera med båda metoderna. Du får bestämma grafiska gränssnittet själv. Det behöver inte vara snyggt, bara det fungerar. Vid redovisningen ska du redogöra för hur din kod kan förbättras.
Uppgift 5
OBS: utföres endast i mån av tid. Lägg till en grafisk komponent så att man kan välja antal steg (chiffer1) eller antal kolumner (chiffer2). Om du inte hinner med denna uppgift så ska du vid redovisningen förklara hur det skulle implementeras och vilka skillnader som det skulle innebära i din kod.
Uppgift 3-5 kan lösas i ett enda gemensamt steg.
Redovisning
Vid redovisning ska du reflektera över vad som kan göras bättre. Går det att organisera koden på något bra sätt? Hur kan programmet utökas? Kan man tänka sig fler typer av kodning/dekodning ditt program t.ex. huffman, zip ...? Är det tydligt för användaren vad programmet gör, hur kan man förbättra användargränssnittet?
Efter redovisningen muntas du på nedanstående begrepp som gåtts igenom på föreläsningar samt finns beskrivna i anteckningar/länkar/bok. Det är tillåtet att använda sig av medhavda anteckningar vid muntan. De muntliga frågorna ska besvaras relativt kort och med självförtroende.
Munta
Objektorienterad design
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