Övning 1. Abstrakta datatyper. 1. Stacken

Relevanta dokument
Övning 1. Abstrakta datatyper. 1. Stacken. class Stack: """A representation of a last-in-first-out (LIFO) stack of objects."""

Övning 1. Abstrakta datatyper. 1. Stacken. class Stack: """A representation of a last-in-first-out (LIFO) stack of objects."""

Övning 1 - Abstrakta datatyper

Länkade listor, stackar och köer

Grundläggande datalogi - Övning 2

Sätt att skriva ut binärträd

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Grundläggande datalogi - Övning 3

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Övning 2. (Länkade) Listor, noder

Övning 0. Python för den som kan MATLAB. Lättare att läsa färdig kod än att skriva själv Det krävs övning för att automatiskt få detaljerna rätt:

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

Python. Datatyper. Mer om datatyper. Heltal - 3 Flyttal - 2,456 Listor - [1,2,3,4] Strängar - spam!

Grundläggande datalogi - Övning 1

Python. Vi har ofta behov av att behandla datastrukturer på ett enhetligt sätt så att vi kan göra samma sak i flera olika program.

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Kodexempel från Programmering 2 Tobias Wrigstad, Ph.D.

TDP002 - Imperativ programmering

Föreläsning 13 och 14: Binära träd

Sammanfattning. Listor. List-manipulering. Matris. /home/lindahlm/activity-phd/teaching/11dd1310/exercise3/exercise3.py September 13, 20111

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Grundläggande datalogi - Övning 4

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 14-16

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Föreläsning 3. Stack

Övning 6. Ali Tofigh 24 Oktober, 2006

Classes och Interfaces, Objects och References, Initialization

Digitalitet. Kontinuerlig. Direkt proportionerlig mot källan. Ex. sprittermometer. Elektrisk signal som representerar ljud.

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Datastrukturer och algoritmer

TDP002 - Imperativ programmering

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

729G04 Programmering och diskret matematik. Föreläsning 7

Introduktion till programmering SMD180. Föreläsning 8: Listor

729G04 Programmering och diskret matematik. Python 3: Loopar

729G04 Programmering och diskret matematik

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Att skriva till och läsa från terminalfönstret

Länkade strukturer. (del 2)

Föreläsning 5. Rekursion

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Strängar. TDDD64 Programmering i Python Föreläsning 4. Peter Dalenius Institutionen för datavetenskap

Abstrakta datatyper Laboration 2 GruDat, DD1344

729G04 Programmering och diskret matematik

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 17-19

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Datalogi för E Övning 3

Föreläsning 8 Programmeringsteknik och Matlab DD1312. Klassmetod. Egen modul

Föreläsning 8: Exempel och problemlösning

Idag: Centrerad utskrift. Granskning. DD1311 Programmeringsteknik med PBL. Granskning Felhantering GUI. Föreläsning 15.

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Avbildningar och hashtabeller. Koffman & Wolfgang kapitel 7, mestadels avsnitt 2 4

Tentamen i Introduktion till programmering

Dagens föreläsning. Diverse Common Lisp. Konstanter, parametrar, globala variabler

Sekvensdatatyper, ASCII och chiffer. Linda Mannila

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

TDP002 - Imperativ programmering

Övning 3. Problemträd, breddenförst, djupetförst, hashning. Skriv ett program som läser personers namn och födelsedag från fil.

Föreläsning 3. Stack

Laboration: Whitebox- och blackboxtesting

Föreläsning 2 Programmeringsteknik och C DD1316

Lösningar Datastrukturer TDA

Pythons standardbibliotek

Övningsuppgifter kapitel 8

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

Översikt 5 delar. 1: Fysisk representation. Binär, oktal och hexadecimal representation

Hur man programmerar. Exempel på problemlösning i Python

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Språket Python - Del 1 Grundkurs i programmering med Python

Tommy Färnqvist, IDA, Linköpings universitet

Styrteknik: Binära tal, talsystem och koder D3:1

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Schenker Privpak AB Telefon VAT Nr. SE Schenker ABs ansvarsbestämmelser, identiska med Box 905 Faxnr Säte: Borås

TDP002 - Imperativ programmering

Introduktion till programmering SMD180. Föreläsning 7: Strängar

12. Relationer och funktioner

Erfarenheter från labben

Tentamen. 5DV105, Programmeringsteknik med Python och Matlab 5DV106, Programmering i Python. 27 oktober 2009

Föreläsning 5 Programmeringsteknik DD1310. Modulen doctest. Exempel. Doctest Dictionary Filhantering

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Introduktion till programmering SMD180. Föreläsning 9: Tupler

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Lösningsförslag till exempeltenta 2

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

DD1314 Programmeringsteknik

Schenker Privpak AB Telefon VAT Nr. SE Schenker ABs ansvarsbestämmelser, identiska med Box 905 Faxnr Säte: Borås

Introduktion till programmering D0009E. Föreläsning 9: Tupler och dictionaries

Föreläsning 5. Rekursion

Tecken och strängar i Java

Datalogi, grundkurs 1

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

729G04 Programmering och diskret matematik. Python 2: Villkorssatser, sanningsvärden och logiska operatorer

Den klassiska programmodellen. Introduktion till programmering D0009E. Föreläsning 11: Filer och undantag. Filsystem. Interaktiva program.

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

EnKlass. Instans 3 av EnKlass. Instans 2 av EnKlass

Transkript:

Per Sedholm DD1320 (tilda13) 2013-09-04 Övning 1 Abstrakta datatyper 1. Stacken Rita bilder som visar hur det ser ut när man lägger in ett nytt element i stacken. Rita bilder som visar hur det ser ut när man tar bort ett element från stacken. Skriv kommentarer till koden nedan! Skriv ett program som använder två stackar för att lösa något problem. #!/usr/bin/python3 # -*- coding: utf-8 -*- """Classroom exercise 1, example 1.""" class Stack: """A representation of a last-in-first-out (LIFO) stack of objects.""" def init (self): """Create an empty stack.""" self.top = None def push(self,x): """Push an item onto the top of this stack.""" ny = Node(x) ny.next = self.top self.top = ny def pop(self): """Remove the top object from this stack and return it.""" x = self.top.value self.top = self.top.next return x def isempty(self): """Test if this stack is empty.""" ## The naïve solution (below) is unnecessary: # if self.top == None: # return True # else: # return False return self.top == None class Node: """An entry in a linked structure (e.g. Stack).""" def init (self, x): """Create a node linked to the given element.""" self.value = x self.next = None 1

$ python3 -i ovn1-01.py >>> help(stack) Help on class Stack in module main : class Stack(builtins.object) A representation of a last-in-first-out (LIFO) stack of objects. Methods defined here: init (self) Create an empty stack. isempty(self) Test if this stack is empty. pop(self) Remove the top object from this stack and return it. push(self, x) Push an item onto the top of this stack. >>> help(node) Help on class Node in module main : class Node(builtins.object) An entry in a linked structure (e.g. Stack). Methods defined here: init (self, x) Create a node linked to the given element. Användning data = "pining for the fjords" s1 = Stack() for word in data.split(): print("pushing on s1:", word) s1.push(word) s2 = Stack() while not s1.isempty(): word = s1.pop() print("pushing " + word + " on stack s2") s2.push(word) 2

$ python3 ovn1-01.py pushing on s1: pining pushing on s1: for pushing on s1: the pushing on s1: fjords pushing fjords on stack s2 pushing the on stack s2 pushing for on stack s2 pushing pining on stack s2 $ python2 ovn1-01.py ( pushing on s1:, pining ) ( pushing on s1:, for ) ( pushing on s1:, the ) ( pushing on s1:, fjords ) pushing fjords on stack s2 pushing the on stack s2 pushing for on stack s2 pushing pining on stack s2 2. Inläsning och utskrift Skriv ett program som läser in en rad tal och skriver ut dom med ett tal per rad. #row = raw_input("ge en rad tal: ") row = input("ge en rad tal: ") ### python2 parted_row = row.split() for num in parted_row: print num # Ge en rad tal: 5 10 15 20 25 42 # 5 // 10 // 15 // 20 // 25 // 42 $ python2 >>> row = raw_input("prompt> ") Prompt> a single line of text >>> expr = input("prompt> ") Prompt> 4 + 5 $ python3 >>> row = input("prompt> ") Prompt> a single line of text >>> expr = eval(input("prompt> ")) Prompt> 4 + 5 3. Läs från fil; sortera Skriv ett program som läser in orden från en fil (det är ett ord per rad) och skriver ut dom i bokstavsordning. input = open("tred.txt") # See ex.4 for URL alist = [] for line in input: word = line.strip() alist.append(word) alist.sort() print(", ".join(alist)) # $ ln -s /afs/nada.kth.se/info/dd1320/www-csc/tilda13/ovn/tred.txt 3

# $ python3 ovn1-03.py # Abies, Acer, Aesculus, Alnus, Betula, Carpinus, Corylus, Fagus, # Fraxinus, Juniperus, Larix, Malus, Picea, Populus, Populus, Prunus, # Quercus, Salix, Salix, Sambucus, Sorbus, Syringa, Taxus, Tilia, # Ulmus # # $ fmt tred_sv.txt ### egentligen radseparerad # Banan Apelsin Äpple Plommon Öl Körsbär Åkerbär # $ python3 ovn1-03.py ### med tred_sv.txt # Apelsin, Banan, Körsbär, Plommon, Äpple, Åkerbär, Öl lst = [ Ärlig, Caesar, Adam, Bertil, Östen, Åke ] lst.sort() print ", ".join(lst) # Adam, Bertil, Caesar, Ärlig, Åke, Östen # ^^^^^^^^^^ import locale locale.setlocale(locale.lc_all, sv_se.utf-8 ) ## alt. LC_COLLATE # returns sv_se.utf-8 lst = [ Ärlig, Caesar, Adam, Bertil, Östen, Åke ] # lst.sort(cmp=locale.strcoll) ## Old-style sorting (Python <= 2.4) lst.sort(key=locale.strxfrm) print ", ".join(lst) # Adam, Bertil, Caesar, Åke, Ärlig, Östen import locale locale.setlocale(locale.lc_all, en_us.utf-8 ) lst = [ Ärlig, Caesar, Adam, Bertil, Östen, Åke ] lst.sort(key=locale.strxfrm) print ", ".join(lst) # Adam, Åke, Ärlig, Bertil, Caesar, Östen 4. Mäta tid; läsa URL Skriv ett program som jämför hur lång tid det tar att läsa orden från filen med hur lång tid det tar att göra samma sak från en webbsida. # -*- coding: utf-8 -*- import urllib.request import time def fetchsortedfile(filnamn): """Read file with the given name, return words as sorted list.""" wfile = open(filnamn) alist = [] for line in wfile: word = line.strip() ### remove whitespace alist.append(word) alist.sort() return alist def lasurlsortera(url): """Fetch file from given URL, return words as sorted list.""" wwwfile = urllib.request.urlopen(url) alist = [] for line in wwwfile: word = line.strip() alist.append(word) alist.sort() return alist before = time.time() lst1 = fetchsortedfile("tred.txt") after = time.time() print("tid för filläsning:", after - before) 4

before = time.time() lst2 = lasurlsortera("http://www.csc.kth.se/utbildning/kth/kurser/dd" "1320/tilda13/ovn/tred.txt") ### note linebreak after = time.time() print("tid för webbläsning:", after - before) # csc-datan$ python3 ovn1-04.py # Tid för filläsning: 0.00157403945923 # Tid för webbläsning: 0.0176341533661 # # csc-datan$ python3 ovn1-04.py # Tid för filläsning: 0.00156807899475 # Tid för webbläsning: 0.0101079845428 # # hemma-datan$ python ovn1-04.py # Tid för filläsning: 6.139282982929929e-05 # Tid för webbläsning: 0.0269299299108 5. Abstrakt datastruktur för temperatur Temperatur kan anges i olika skalor. En abstrakt datatyp minskar risken för missförstånd. Definiera klassen temp med metoderna setk, setc, setf och getk, getc, getf. Använd sedan klassen i ett program som läser in utomhustemperaturen (Celsius) och skriver ut temperaturen så att en amerikan förstår (Fahrenheit). Observera att uppgiften går att lösa utan objektorientering: templib.py def CtoF(c): return c*5/9 + 32 def FtoC(f): return (f - 32)*5/9 import templib c = 37.0 f = templib.ctof(c) print(c, " C =", f, " F =", templib.ftoc(f), " C") from templib import CtoF, FtoC c = 37.0 f = CtoF(c) print(c, " C =", f, " F =", FtoC(f), " C") # 37.0 C = 52.5555555556 F = 11.4197530864 C I detta fall skulle vi dock använda en abstrakt datatyp. temp.py """Temp - an abstract datatype for temperature Temp is used to represent temperature in multiple scales. """ zeroc = 273.15 zerof = 459.67*5/9 # 0 C == 273.15 K # 0 F == 255.37222... K # Conversion between Kelvin, degrees Celsius, degrees Fahrenheit # [ C] = [K] + 273.15 [K] = [ C] - 273.15 # [ C] = ([ F] - 32)*5/9 [ F] = [ C]*9/5 + 32 # [K] = ([ F] + 459.67)*5/9 [ F] = [K]*9/5-459.67 5

class Temp: def init (self): self.k = 0 # Temperature in Kelvin def setk(self,k): self.k = K def setc(self,c): self.k = zeroc + C def setf(self,f): self.k = zerof + 5*F/9 def getk(self): return self.k def getc(self): return self.k - zeroc def getf(self): return (self.k - zerof)*9/5 from temp import Temp t = Temp() c = eval(input("vad är temperaturen i Celsius? ")) t.setc(c) print "Amerikaner kallar det", str(t.getf()) + " F" # Vad är temperaturen i Celsius? 100 # Amerikaner kallar det 212.0 F Vi fick dock väldigt många decimaler för 37 C Representationsfel. Använd formaterad utskrift! Representationsfel kan ge många decimaler: >>> 0.1+0.2 0.30000000000000004 I bas 2 (binärt) så kan värdet 0.1 inte representeras exakt. (Jfr. 1 3 decimalt.) 0.1 10 = 0.00011001100110011001100110011001100110011001100110011010... 2 Fraction-klassen 1. Vad är relationen mellan en klass och ett objekt? 2. Hur skriver man för att skapa ett Fraction-objekt? 3. Vad gör init? 4. Vilka av metoderna ovan har returvärden? 5. Vad är self? 6. När anropas metoden str? 7. När anropas metoden add? 8. När anropas metoden cmp? 9. Hur används parametern otherfraction i add och cmp? 6

class Fraction: def init (self, top, bottom): self.num = top self.den = bottom def str (self): return str(self.num) + "/" + str(self.den) def show(self): print(self.num, "/", self.den, end=" ") def add (self,otherfraction): newnum = self.num*otherfraction.den + \ self.den*otherfraction.num newden = self.den * otherfraction.den return Fraction(newnum,newden) def lt (self,otherfraction): ## Cross-multiply by bd: a/b < c/d --> ad < bc num1 = self.num*otherfraction.den num2 = self.den*otherfraction.num return num1 < num2 def eq (self,otherfraction): ## See lt num1 = self.num*otherfraction.den num2 = self.den*otherfraction.num return num1 == num2 f = Fraction(6, 8) g = Fraction(10, 16) h = f + g f.show() # print "+", ### python2: trailing space supresses newline print("+", end=" ") g.show() print("=", end=" ") h.show() print() if f < g: print(str(f), "<", str(g)) else: print(str(f), ">=", str(g)) # 6 / 8 + 10 / 16 = 176 / 128 # 6/8 < 10/16 Pythons klass Fraction (modulen fractions) har funktionen gcd för att beräkna största gemensamma nämnare (greatest common divisor, GCD). Det använder Euklides algoritm, som i Python kan skrivas: def gcd(a, b): while b: a, b = b, a%b return a 7. Teckenkodning Följande funktion konverterar en sträng från teckenkodningen iso8859-1 till utf-8. Gör funktionen generellare så att den kan konvertera från en valfri given teckenkodning till en annan. Det är stor skillnad mellan Python2 och Python3. I Python2 finns datatyperna str, unicode, som bägge kan vara raw eller inte. I Python3 finns typerna text 7

(klassen str) och (binär) data (bytes). Se http://docs.python.org/release/3.0.1/whatsnew/3.0.html# text-vs-data-instead-of-unicode-vs-8-bit named_unicode = "\N{section sign}\n{digit four}\u0032 42\\" raw_string = r"\n{section sign}\n{digit four}\u0032 42\\" print(str(type(named_unicode)) + ": " + named_unicode) print(str(type(raw_string)) + ": " + raw_string) # <class str >: 42 42\ # <class str >: \N{section sign}\n{digit four}\u0032 42\\ ustr = "Å " print(ustr == "\u00c5 \u2022") # True #bstr = b"å " # SyntaxError: bytes can only contain ASCII literal characters. bstr = b"\xc3\x85 \xe2\x80\xa2" print("ustr:", str(type(ustr))) for c in ustr: print("unicode character", c, "code point", ord(c), "hex", hex(ord(c))) #ustr: <class str > # unicode character Å code point 197 hex 0xc5 # unicode character code point 32 hex 0x20 # unicode character code point 8226 hex 0x2022 print("bstr:", str(type(bstr))) for b in bstr: print("byte", b, "hex", hex(b)) # bstr: <class bytes > # byte 195 hex 0xc3 # byte 165 hex 0xa5 # byte 32 hex 0x20 # byte 226 hex 0xe2 # byte 128 hex 0x80 # byte 162 hex 0xa2 print(bstr.decode() == ustr) # True print(ustr.encode() == bstr) # True def iso2utf(strang): """ Konverterar från iso8859 till utf-8 """ ustrang = strang.decode( iso-8859-1 ) return ustrang.encode( utf-8 ) isostr = b R\xe4ksm\xf6rg\xe5s ; #isostr.decode() # UnicodeDecodeError: utf8 codec can t decode bytes in # position 1-3: invalid data #iso2utf(isostr) # b R\xc3\xa4ksm\xc3\xb6rg\xc3\xa5s utfstr = iso2utf(isostr).decode(); print(isostr, "->", utfstr) 8

8. (extra) Kopiera referenser Antag att man har en lista med referenser. Hur kan man ändra på elementen? Påverkar det även andra referenser som finns till objekten? a = [1, 7, 10, 13] ac = a[:] ac[2] = -1; print "-" * 40 print "a = ", a print "ac = ", ac # ---------------------------------------- # a = [1, 7, 10, 13] # ac = [1, 7, -1, 13] class Person: def init (self, name): self. name = name def change_name(self, newn): self. name = newn def repr (self): return "<" + self. class. name + ":" + self. name + ">" a = [ Person("Alice"), Person("Bob"), Person("Charlie") ] ac = a[:] ac[1] = Person("Duncan") ac[2].change_name("eric") print "-" * 40 print "a = ", a print "ac = ", ac Vi ändrar alltså på elementen i listan ac byter ut andra elementet till en ny referens, och ändrar på innehållet i det tredje elementet. # a = [<Person:Alice>, <Person:Bob>, <Person:Eric>] # ac = [<Person:Alice>, <Person:Duncan>, <Person:Eric>] 9