Tentmen Progrmmeringsteknik II 014-10-4 Skrivtid: 1400 1900 Tänk på följnde Skriv läsligt! Använd inte rödpenn! Skriv r på frmsidn v vrje ppper. Börj lltid ny uppgift på nytt ppper. Lägg uppgiftern i ordning. Skriv uppgiftsnummer och din kod på ll ppper. Skriv inte längst upp i vänstr hörnet - det går inte tt läs där efter smmnhäftning. Fyll i försättssidn fullständigt. Det är principer och idéer som är viktig. Skriv så tt du övertygr rättren om tt du hr förstått dess även om detljer kn vr felktig. Progrmkod skll vr läslig, d.v.s. den skll vr vettigt strukturerd och indenterd. Nmn på vriler, metoder, funktioner, klsser etc. skll vr eskrivnde men kn ändå hålls gnsk kort. Såvid inget nnt nges, får mn ygg på lösningr till föregående uppgifter även om dess inte hr lösts. Det är tillåtet tt inför hjälpmetoder och hjälpklsser. Uttrycket skriv en metod som skll lltså inte tolks så tt lösningen inte får strukturers med hjälp v fler metoder. All uppgifter gäller progrmmeringsspråket Jv och progrmkod skll skrivs i Jv. Koden sk vr läslig, dvs den skll vr vettigt strukturerd och indenterd. Nmn på vriler, metoder, klsser etc skll vr eskrivnde men kn ändå hålls kort. Oserver tt poängvdrg lnd nnt kn görs för icke-privt instnsvriler dålig läslighet upprepning v identisk kod underlåtenhet tt utnyttj given eller egen tidigre skriven metod Uppgiftern kommer inte i svårighetsordning. Lyck till! 1
Uppgifter 1. En hshtell är en mycket nvändr dtstruktur om mn inte kräver tt dt skll hålls sorterde. Dess fördel är ju som eknt sn åtkomst och lgring. Exempel: Nednstående kod ger en dtstruktur enligt vidstående figur med Jvs stndrdklss HshSet. HshSet<Integer> = new Hsh<Integer>();.dd();.dd();.dd(9);.dd(1);.dd(4); 4 9 1 För tt lägg in dt och sök efter dt ehöver vi en hsh-nyckel. Den trnsformerr dt så tt vi får ett tl som ligger i intervllet [0::tellstorlek 1], i dett fll lltså intervllet [0 6]. Eftersom dt i dett fllet är heltl så är en enkel hshnyckel tl%tellstorleken som ger oss ett tl i önskt intervll. I exemplet får vi då följnde 9 1 4 0 Tekniskt så är tellen en rry v osorterde listor. I ovnstående exempel hr vi lltså en rry estående v sju osorterde listor. Uppgiften estår i tt skriv delr v en egen klss HshSet som sk vr en hshtell där vi lgrr strängr (Strings), inte heltl som exemplet ovn. Mn kn få frm en hshnyckel från en sträng exempelvis genom tt dder ll tecken i strängen och sedn pplicer %-opertorn enligt ovn. För tt får frm det i:e tecknet i strängen s nvänds nropet s.chrat(i). Bilgn HshSet innehåller ett skl till en klss som sk implementers. ) Skriv en klss HshSetException som en underklss till RuntimeException. Denn klss skll nvänds vid felktig nvändning v metodern i klssen HshSet. ) Skriv en klss Node som en klss deklrerd inuti klssen HshSet. Den sk nvänds för tt ygg vår listor. c) Skriv metoden hshkey(string s) som producerr en hshnyckel från given sträng. d) Skriv en prmeterlös konstruktor som skpr en tom HshSet med plts för 7 element.
e) Skriv en konstruktor som skpr en tom HshSet med plts för n element, där n ges som rgument till konstruktor se ilgn! f) Skriv en metod remove(string s) som tr ort given sträng ur hshtellen. Om den inte finns skll ett undntg ksts. g) Skriv en metod dd(string s) som lägger in en sträng i hshtellen. Om strängen redn finns skll ett undntg ksts. h) Skriv en metod find(string s) som söker efter en given sträng i tellen och som returnerr snt eller flskt.. i) Skriv en metod tostring() som implementerr tostring i klssen. Tips! Den efintlig koden i ilgn kn ge ledtrådr till hur metodern ovn sk implementers!. Ett Huffmnträd är ett träd som kn nvänds för tt komprimer en textfil genom tt kod tecknen på ett smrt sätt. Normlt representers ju ett tecken i Jv med 16 itr. Tnken med Huffmnkod är tt vnlig tecken sk representers med få itr medn ovnlig tecken kn h längre kod. På dett sätt kn mn spr plts. Ett krv är nturligtvis tt mn kn vkod den komprimerde texten på ett entydigt sätt. Det hel ygger på tt mn skpr en tell där ll tecken som förekommer i texten finns tillsmmns med sin frekvens ( hur mång gånger tecknet finns dividert med totl ntlet tecken). Denn tell är sorterd i fllnde frekvensordning. Lämpligen är vrje element i tellen en trädnod innehållnde tecknet, frekvensen, vänster och högerpekre. Sedn slår mn ihop de två nodern med lägst frekvens. Mn tr då ort dess ur tellen och lägger istället in en ny nod med ett rtificiellt tecken (0) och med den frekvens mn får om mn summerr de två ktuell noderns frekvens. Den ny noden måste sorters in i tellen på rätt plts. De två ktuell nodern lir rn till den ny noden, den med lägst frekvens lir vänsterrn. Sen repeters dett tills det r finns en nod kvr i tellen, då hr vi vårt Huffmnträd Se dett exempel för tt se hur mn gör om vi r hr fyr tecken,,c,d med olik snnolikhet. Vi utgår från en färdig frekvenssorterd tell som vi ygger trädet
ifrån. c d 0. 0. 0.18 0.1 0. 0. 0. De två med lägst snnolikhet slås ihop med en ny nod, summer frekvensen sorter Strtläge d c 0.1 0.18 Sist steget, nu kn t frm teckenkoder. 0. 0. 0. 0. d c 0.1 0.18 Tredje steget 1.0 0. 0. 0. 0. d c 0.1 0.18 = 0 = 10 c =111 d = 110 När vi väl hr trädet kn åde kod och vkod med smm träd. Vänstergrenr får koden 0 och högergrenr koden 1. Sen får vi en ny siffr för vrje steg. Exempelvis lir texten dc kodt 0010011010111 som är 1 itr som kn lgrs i ett tecken istället för de sju som originltexten kräver. Avkodningen görs så tt mn trverserr trädet så tt en noll gör tt mn tr ett steg till vänster, en ett gör tt mn tr ett steg till höger tills mn når ett löv. Då hn mn tecknet. Sen örjr mn om från örjn tills det är slut på input. I exemplet ovn så kommer först en noll, lltså ett steg till vänster, det är ett löv så då får vi tecknet. Vi örjr om i trädet, det kommer en noll till, lltså ett till osv. Bifogt finns en klss Huffmn som du utgår ifrån. Din uppgifter är: ) Skriv ett klss TreeNode som kn representer ett tecken och en frekvens i intervllet [0,1] i ditt träd ) Skriv en konstruktor som skpr en tell v lämplig storlek, prmeter till konstruktorn c) Skriv en metod uildtree som ygger ett Huffmnträd givet en komplett tell med tecken och frekvenser. Den sk lltså genomför de steg som exemplet ovn visr. Slutresulttet lir en tell med ett träd. d) Skriv en metod decodetext som vkodr en itsträng med hjälp v trädet och returnerr en sträng. Bitsträngen är för enkelhets skull en sträng där vrje element innehåller noll eller ett. Vi förutsätter tt ing fel inträffr. Du skll llså utgå från en kodd sträng och t frm originltexten med hjälp v trädet.. I ilgn llshpeclsses finns en sklss Shpe för tt representer geometrisk figurer med underklsser för rektnglr och cirklr. Figurern kn läss in, rits, skrivs och ders yt kn eräkns. Se den givn koden för möjlig opertioner. ) Klssen Shpe är deklrerd som strkt. Förklr vd det inneär och vrför den är deklrerd så. 4
) Klssen Rectngle nvänder nyckelordet super i en v konstruktorern. Förklr vd det inneär och vrför mn gör så. Vrför nvänds inte super i den prmeterlös konstruktorn? c) Vi vill lägg till en metod setcolor(color c). Vr i hierrkin sk den läggs? d) Skriv en klss Tringle för tt representer en tringel. Klssen skll skrivs som en underklss till klssen Shpe. Den sk innehåll konstruktorer så tt det går tt skp ojekt. En tringel representers v sin tre hörnpunkter. Dess position kn vr det först hörnet. Skriv också pint och re-metoden i klssen. red-metoden ehöver inte skrivs. Ytn v en tringel när mn vet sidorns längd kn eräkns med Herons formel. där re = q s (s ) (s ) (s c) s = 1 ( + + c) och, och c är sidorns längd. Mn kn rit en tringel med hjälp v metoden pulic strct void fillpolygon(int[] xpoints, int[] ypoints, int npoints) där mn lägger in x- och y-koordintern och ntl punkter. Os: För tt få poäng skll rv utnyttjs! Du skll lltså r skriv de delr som ehövs för de ny strukturern och inte upprep efintlig kod. Du sk dock skriv konstruktorer till vilk mn kn skick in värden på smtlig instnsvriler i din klsser. Exempel på indt, utskrifter och ritd figur. Indt: 00 00 rectngle 0 40 0 00 0 00 00 0 circle 40 00000 0 circle 100 00 0 00 0 00 80 tringle 00 00 00 0 060 90 exit Utskrifter: > jv DrwTest Stored shpes: Rectngle(0, 40) Circle(40, 0) Circle(100, 00) Tringle(00, 00) Totl re: 68 >