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

Relevanta dokument
Övningsuppgifter kapitel 8

TDDE44 Programmering, grundkurs

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Arrayer (vektorer) Murach s: kap Elektronikcentrum i Svängsta AB

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Datastrukturer. Erik Forslin. Rum 1445, plan 4 på Nada

Föreläsning 11. ADT:er och datastrukturer

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

Länkade strukturer. (del 2)

729G74 IT och programmering, grundkurs. Tema 3. Föreläsning 2 Jody Foo,

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

TDIU01 - Programmering i C++, grundkurs

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tommy Färnqvist, IDA, Linköpings universitet. 1 ADT Map/Dictionary Definitioner Implementation... 2

Introduktion till formella metoder Programmeringsmetodik 1. Inledning

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Objektorienterad Programmering (TDDC77)

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

ADT Set, Map, Dictionary. Iteratorer TDDD86: DALGP. Tommy Färnqvist, IDA, Linköpings universitet

Datastrukturer och algoritmer

Föreläsning 18 Filer och avbildningar

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

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

Motivation. Programmeringsuppgift: En första ansats: Lagra info om anställda Håll reda på varje anställds närmaste chef. som också är en anställd!

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Programmering för språkteknologer II, HT2014. Rum

Datastrukturer och algoritmer

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

Föreläsning 3: Typomvandling, villkor och val, samt textsträngar

Datastrukturer och algoritmer. Föreläsning 4 Test, Stack och Kö

729G04 Programmering och diskret matematik

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Intro till standardbiblioteket. Eric Elfving

Classes och Interfaces, Objects och References, Initialization

Abstrakta datatyper Laboration 2 GruDat, DD1344

Övning 1 - Abstrakta datatyper

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Objektorienterad Programmering (TDDC77)

Magnus Nielsen, IDA, Linköpings universitet

Erfarenheter från labben

729G04 Programmering och diskret matematik. Python 3: Loopar

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

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

729G04 Programmering och diskret matematik

729G74 IT och programmering, grundkurs. Tema 2, Föreläsning 2 Jody Foo,

Länkade listor, stackar och köer

Visual Basic, en snabbgenomgång

[] Arrayer = Indexerad variabel

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

Sätt att skriva ut binärträd

DD1314 Programmeringsteknik

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

729G74 - IT och programmering, grundkurs. Dugga.

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

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

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

Grundläggande datalogi - Övning 1

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?

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

729G04 PYTHON 6 JODY FOO. Department of Computer and Information Science (IDA) Linköping University, Sweden

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

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

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

Tommy Färnqvist, IDA, Linköpings universitet

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

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Strukturdiagram. Styra. Algoritmer. Val

Lösningsförslag till exempeltenta 2

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

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

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

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

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

Tentamen i Algoritmer & Datastrukturer i Java

Arrayer (fält)

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning 6: Introduktion av listor

Tenta (TEN3) i kursen 729G04 Programmering och diskret matematik 5 feb 2016, kl 14:00-18:00

Uppgifter till tenta i 729G04 Programmering och diskret matematik. 17 december 2015, kl 14:00-18:00

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Föreläsningsanteckningar S6 Grafteori

Föreläsning 3 Programmeringsteknik och C DD1316. Innehåll i listor. Uppdateringsoperatorer. +,* och listor. Listor. Indexering

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

Objektorienterad programmering

Extramaterial till Matematik Y

729G74 IT och programmering, grundkurs. Tema 3. Föreläsning 1 Jody Foo,

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

Föreläsning 2 Datastrukturer (DAT037)

Klassdeklaration. Metoddeklaration. Parameteröverföring

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Programmering för språkteknologer II, HT2011. Rum

TDIU01 - Programmering i C++, grundkurs

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

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

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Sammansatta datatyper Generics: Parametrisk polymorfism

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

Användarhandledning Version 1.2

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Transkript:

1 Datatyper Tobias Wrigstad Det finns flera olika typer av (slags) data Olika datatyper har olika egenskaper. T.ex. är ett personnummer inte ett tal. (Den sista siffran skall stämma enligt den s.k. Luhnalgoritmen och bindestrecket har en mening och ersätts faktiskt med ett plustecken när en person blir över hundra år; om det är ett temporärt personnummer kan det ha en bokstav i sig). Vanliga datatyper Heltal (int, integer), flyttal (float), strängar (string), booleska värden (bool), listor, dictionaries samt objekt (mer om dessa på senare kurser). int (heltal) 1 En literal är en textuell representation av ett värde i Python-koden, t.ex. strängen "Hej", talet 1.001232, listan [1,2,3] och det booleska värdet True. Nedanstående tabell visar datatypen för olika literaler: float (flyttal) 1.0 str (sträng) Foo" bool (boolean) False list (lista) [3,5,7,11] dict (dictionary) { "Foo" : "Bar" } Datatyper i Python Python har många olika slags datatyper (http://docs.python. org/3.1/reference/datamodel.html#objects-values-and-types). De viktiga på denna kurs är de ovan. 2 Minne Datorns primärminne är begränsat. Detta är inte så viktigt för oss på den här kursen utan blir det först på senare kurser. Varje värde, t.ex. siffran 4711, i ett program ligger på en plats i minnet och varje variabel i ett program pekar på en plats i minnet där ett värde är sparat. Man kan likna datorns minne vid ett rutnät där varje ruta har en viss adress (t.ex. med ett löpnummer, 0, 1, 2, 3,... ). Varje värde i ett program ligger på en plats i rutnätet. När man tilldelar ett värde till en variabel sparas den adress där värdet ligger på i variabeln 1, inte själva värdet. Man säger att variabeln pekar på ett värde, d.v.s., att den pekar ut den plats (den adress) i minnet där värdet ligger. I Python är dessa adresser helt dolda för programmeraren och kan inte manipuleras. 3 Identitet och Ekvivalens Att två värden är identiska innebär att de är samma värden. Alla 2:or i ett Python-program är t.ex. identiska det finns bara en enda 2:a i språket, även om den kan förekomma på många olika ställen i ett program. Identitet kan enkelt prövas genom att man ser på vilken 1 Detta varierar med språk och även inom samma språk och blir viktigt först senare. 1 av 6

plats i minnet två värden är sparade. Om de är sparade på samma plats i minnet är de samma värde och är följaktligen identiska. Två värden som är identiska är automatiskt också ekvivalenta, se nedan. Att två värden är ekvivalenta innebär att de är likadana. T.ex. är två olika listor som innehåller samma värden, t.ex. [1,2,3] och [1,2,3] ekvivalenta. Om listorna ovan inte är identiska, kan man ta bort ett element ur den första listan utan att den andra påverkas. Gör man detta upphör listorna att vara ekvivalenta. Man skiljer ofta mellan värden som kan förändras (eng. mutable values) och värden som inte kan förändras (eng. immutable values). Ett exempel på ett värde som inte kan förändras är talet 2. Talet 2 kan inte ändras, då blir det ju ett annat tal! En konsekvens av detta är att alla 2:or i Python avser samma 2:a, vilket t.ex. sparar minne. Se här: tal = 2 x = tal print tal # skriver ut 2 tal = tal + 1 print tal # skriver ut 3 print x # skriver ut 2 print 2 # skriver ut 2 Vid den första tilldelningen till tal stoppas ett heltal av värde 2 in i tal-variabeln. Samma gäller för tilldelningen till x. Notera att tal och x innehåller samma 2:a. Ofta används termerna pekar på och refererar till istället för innehåller. Vid den andra tilldelningen till tal skrivs 5:an över med ett nytt heltal av värde 3. Skriver vi ut innehållet i tal-variabeln skrivs en 3:a ut, medan innehållet i x-variabeln är oförändrat. Värdet 2 är också oförändrat. Samma sak gäller även för bl.a. flyttal, booleska värden, enskilda tecken och strängar. För mer komplicerade datatyper, som listor, är det dock annorlunda. En lista kan modiferas (t.ex., element tas bort eller läggas till, eller sorteras om). list1 = [1,2,3,4] list2 = list1 print list1 print list2 list1.remove(3) # ta bort sista elementet print list1 print list2 Vid tilldelningen till list2 sätts denna att peka på samma lista som list1. Listan [1,2,3,4] finns alltså i två variabler samtidigt. Vi säger att variablerna list1 och list2 är alias och att listan som de innehåller är aliaserad. Att detta är ett viktigt koncept är uppenbart vid utprintningen av list2 2. Eftersom variablerna pekar på samma lista kommer förändringen av listan via list1 också att påverka list2. 2 Tobias avhandling, Owner-Based Alias Management (Wrigstad, 2006), handlar också om detta koncept. 2 of 6

Python har två operatorer för att jämföra data, == och is. Den första testar om objekten är ekvivalenta (likadana) och det andra om de är identiska (samma). Vad detta betyder torde vara uppenbart om man läser nästa program: list1 = [1,2,3] # Skapar en lista med elementen 1, 2 och 3 list2 = [1,2,3] # Skapar en ny (annan) lista med samma element print list1 == list2 # True print list1 is list2 # False print 5 == (4+1) # True print 5 is (4+1) # True print [] is [] # False 4 None: avsaknaden av ett värde Det speciella värdet None avser avsaknaden av ett värde 3. Det används ofta som ett initialt värde i en variabel som ännu inte har tilldelats sitt riktiga värde. T.ex.: biggest = None if a < b: biggest = b else: biggest = a print biggest Här används None i variabeln biggest i betydelsen vi vet inte ännu. Efter villkorssatsen kommer dock biggest att ha fått sitt slutgiltiga värde. 5 Datastrukturer En datastruktur är en struktur som innehåller ett eller flera värden organiserat på ett visst sätt. En datastruktur kan innehålla flera andra datastrukturer, t.ex., en lista av listor. 5.1 Mängder och element En mängd är en oordnad samling diskreta (d.v.s. olika) element, t.ex. alla studenter på DVK. En mängd skrivs normalt med kommaseparerade element mellan krullparenteser, d.v.s.: { 2, 3, 5, 7, 11 } är mängden av alla primtal 4 mindre än eller lika med 11. Den tomma mängden skrivs normalt, men kan även skrivas { }. Att ett element är med i en mängd betecknas normalt, t.ex. samt, för icke-tillhörighet,, d.v.s., 3 { 1, 2, 3, 4, 5 } 6 { 1, 2, 3, 4, 5 }. 3 Att jämföras med null i Java. 4 Ett primtal är ett heltal som inte går att jämnt dela med ett annat heltal. 4 är inte ett primtal eftersom 4 = 2 2, d.v.s. 4 är jämnt delbart med 2. Primtal är inte intressanta för oss under denna kurs. 3 of 6

I Python finns mängder tillgängliga via datatypen set. Nedanstående kodsnutt skapar en tom mängd och lägger till elementen 1, 3 och 5 i den. my_set = set() my_set.add(1) my_set.add(3) my_set.add(5) Man kan också skapa motsvarande mängd direkt, så här: set([1,3,5]). 5.2 Lista Listan är en av de mest grundläggande datatyperna. En listas element är ordnade. Detta betyder att varje element i listan har ett index, d.v.s., en speciell plats i listan, och att det för varje element finns, utantaget första och sista elementen, ett föregående element och ett efterföljande element i listan. Det betyder också att man vid insertering måste bestämma var i listan (längst fram, längst bak, mellan två element) man vill stoppa in det nya elementet. I en homogen lista har alla element samma datatyp, t.ex., i listan [1,2,3,4,5,6] är alla elementen heltal. I en heterogen lista kan man blanda element av olika datatyp, t.ex. [grodan boll", 23, False]. En lista kan skapas på många sätt: Som en literal: [0,1,2,3,4] Med funktionen range(from, upto): range(0,5) (skapar [0,1,2,3,4]) Incrementellt: 1 list = [] # initialt värde på listan 2 list.append(0) 3 list.append(1) 4 list.append(2) 5 list.append(3) 6 list.append(4) Notera att append lägger till nya element sist i listan. Alltså, list.append(0) lägger till en 0:a på sista positionen i listan, vilket i detta skede är samma som först elementet eftersom listan är tom. I sitt vaniljutförande kan man stoppa in element i en lista på godtycklig plats, t.ex.: 1 list = [1,2,3] 2 print list 3 list.insert(0,4) 4 print list # [4,1,2,3] 5 list[3] = 8 6 print list # [4,1,2,8] 7 list[3:4] = [7,9,10] 8 print list # [4,1,2,7,9,10] 4 of 6

Senare kurser kommer att skilja på olika slags listor och hur listan är uppbyggd i datorns minne. Vissa slags listor är bra för datamängder som växer och krymper hela tiden, medan andra listor är bra för att snabbt komma åt ett element som man vet platsen på. Etc. Element på godtyckling plats i en lista kan tas bort direkt, t.ex.: list = [1,2,3] list.pop(0) # tar bort elementet med index 0 print list # skriver ut [2,3] list.remove(3) # tar bort första förekomsten av 3 i listan print list # skriver ut [2] Notera att ett element kan förekomma flera gånger i en och samma lista, t.ex., [1,1,1,2,1,2]. 5.3 Stack En stack är en lista som har en s.k. LIFO-struktur (Last in, first out). En stack kan bara manipuleras med operationerna push som lägger något överst på stacken, och pop som tar bort det översta elementet (och returnerar det). Ett exempel på en stack är en hög med tallrikar i ett kök. Enda sättet att lägga till en ny tallrik är att pusha den, d.v.s., lägga den överst i högen. Vill man lägga till något näst överst får man först poppa av den första tallriken, lägga den nya överst med push och sedan lägga tillbaka det föregående första elementet igen. 5.4 Kö En kö är en lista som har en s.k. FIFO-struktur (First in, first out) och modellerar på så sätt t.ex. en kassakö i en matvarubutik. En kö manipuleras med operationerna enqueue (lägg till något sist i kön) och dequeue (ta bort det första elementet i kön). En kö kan vara bra att använda istället för en lista om man t.ex. har order i ett ordersystem som tillämpar först-till-kvarn-systemet. Om man alltid betjänar den order som är först i kön och lägger nya ordrar sist i kön är det en FIFO-kö. 5.5 Dictionary (Map) Kallas också för en associativ array. En mängd ordnade par där första elementet i varje par är diskret. Man säger att det första elementet i paret är associerat med det andra, eller, vanligare, att det första elementet mappar till det andra. Det första elementet kallas för en nyckel och det andra för ett värde. Inom matematiken skrivs en map ofta på detta sätt: { A 1, B 2, C 3 } där A 1 är ett par där A är nyckeln och 1 är värdet. Nyklarna och värdena kan vara av godtycklig datatyp, d.v.s., kan vara heltal, strängar, listor, etc. Exempel på en map är en telefonkatalog där varje unikt namn (nyckel) är associerat med ett telefonnummer (värde). Dock ej tvärtom, eftersom ett telefonnummer kan delas av flera personer som bor på samma adress. Ett dictionary skapas så här i Python: 5 of 6

phone_book = { "Henrik" : 161611, "Beatrice" : 164988 } För att slå upp något i dictionariet använder vi samma uppslagningsoperator som för listor, med skillnaden att vi inte letar med hjälp av index utan med nycklar: henriks_number = phone_book["henrik"] print henriks_number # skriver ut 161611 För att uppdatera ett dictionary använder man följande syntax: phone_book["stefan"] = 161621 # lägger till Stefan i listan phone_book["henrik"] = 162000 # ändrar henriks nummer till 162000 I det första fallet utökas dictionariet med en ny map från Stefan till 161621. Den resulterande mappen ser då ut så här: phone_book = { "Henrik" : 161611, "Beatrice" : 164988, "Stefan" : 161621 } Efter uppdateringen av Henrik så ser mappen ut så här: phone_book = { "Henrik" : 162000, "Beatrice" : 164988, "Stefan" : 161621 } Man kan få tag i alla nycklar i ett dictionary med hjälp av metoden keys() enligt följande: phone_book.keys() = ["Beatrice", "Stefan", "Henrik"] I Python är nyklarna inte ordnade utan kan komma ut i vilken ordning som helst. På så sätt kan vi alltså skriva ut alla namn och telefonnummer i vårt dictionary enligt följande: names = phone_book.keys() for name in names: print name, "has number", phone_book[name] 6 of 6