Programkonstruktion och datastrukturer

Relevanta dokument
Lars-Henrik Eriksson

Programspråk. Programkonstruktion. Moment 1 Introduktion till programmering och programspråket Standard ML. Användning av funktionell programmering

Programkonstruktion. Lars-Henrik Eriksson. (Min) syn på programmering. Vad är ett program? Hur detaljerade skall instruktioner vara?

Programmeringsmetodik DV1 Programkonstruktion 1. Lars-Henrik Eriksson. Välkomna till. edu/course/homepage/pkpm/ht06.

Programkonstruktion och datastrukturer

Programkonstruktion och datastrukturer

ENKEL Programmering 3

Föreläsning 1: Intro till kursen och programmering

Föreläsning 1: Intro till kursen och programmering

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Programmering A. Johan Eliasson

TDIU01 - Programmering i C++, grundkurs

Imperativ programmering

Programkonstruktion och datastrukturer. Formell verifiering eller hur man bevisar att program gör rätt utan att testa dem

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

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

Pascal... Pascal. Pascal... Pascal...

Pascal. reserverade ord fördefinierade funktioner och procedurer egendefinierade funktioner, procedurer och objekt

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg

Klassdeklaration. Metoddeklaration. Parameteröverföring

Introduktion till programmering. Undervisning. Litteratur och examination. Lärare. Föreläsning 1

Programkonstruktion. Tentamen,

F2 Datarepresentation talbaser, dataformat och teckenkodning EDAA05 Datorer i system! Roger Henriksson!

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 4 Om rekursion. PK1&PM1 HT-06 moment 4 Sida 1 Uppdaterad

Programmeringsteknik med C och Matlab

Användarhandledning Version 1.2

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

AssiML. Användarbeskrivning

Variabler, värden och typer

Variabler, värden och typer

Omtentamen (del 1, 6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

6. Ge korta beskrivningar av följande begrepp a) texteditor b) kompilator c) länkare d) interpretator e) korskompilator f) formatterare ( pretty-print

DD1361 Programmeringsparadigm. Carina Edlund

Summera godtyckligt antal tal. Programkonstruktion. Moment 4 Om rekursion. Fullständigt resonemang för summeringen. Analys av summeringsproblemet

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Numeriska Metoder och Grundläggande Programmering för P1, VT2014

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

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Imperativ programmering. Föreläsning 2

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

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Programmering: att instruera en maskin att utföra en uppgift, kräver olika språk:

Objektorienterad programmering Föreläsning 4

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

DD1314 Programmeringsteknik

Programkonstruktion. Tentamen,

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

Program & programmering

Föreläsning 1 & 2 INTRODUKTION

Parameteröverföring. Exempel. Exempel. Metodkropp

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

TDDC77 Objektorienterad Programmering

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

F2 Datarepresentation talbaser, dataformat och teckenkodning

Tentamen i. för D1 m fl, även distanskursen. lördag 26 februari 2011

Introduktion till datateknik och datavetenskap

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

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

Föreläsning 2. Operativsystem och programmering

Kursupplägg. Examination. Föreläsning 1: Intro till kursen och. Kursmaterial. programmering. Kursboken: Programmera med a multimedia approach

SMD 134 Objektorienterad programmering

Introduktion till programmering och Python Grundkurs i programmering med Python

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

Objektorienterad Programmering (TDDC77)

Introduktion till formella metoder Programmeringsmetodik 1. Inledning

Introduktionsmöte Innehåll

Introduktion till algoritmer - Lektion 1 Matematikgymnasiet, Läsåret Lektion 1

TANA17 Matematiska beräkningar med MATLAB för M, DPU. Fredrik Berntsson, Linköpings Universitet. 27 oktober 2015 Sida 1 / 31

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Programkonstruktion. Tentamen,

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

TDIU01 - Programmering i C++, grundkurs

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Introduktion till Datalogi DD1339. Föreläsning 1 8 sept 2014

Logik och kontrollstrukturer

Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

7 november 2014 Sida 1 / 21

Typsystem. Typsystem... Typsystem... Typsystem... 2 *

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

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

Typsystem. DA2001 (Föreläsning 23) Datalogi 1 Hösten / 19

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

IT OCH PROGRAMMERING I SKOLAN. Jan Erik Moström Peter Vinnervik

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

CS - Computer science. Datateknik Informationsbehandling Datalogi Datavetenskap (ÅA 2008)

Föreläsning 3: Booleans, if, switch

Programmering II (ID1019) :00-11:00

Kursplanering Objektorienterad programmering

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

TATM79: Föreläsning 1 Notation, ekvationer, polynom och summor

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

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

Tentamen i Programmering

Föreläsning 2 sept 05 (Onsdag v 36). DD Chapter 2.

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

Transkript:

Välkomna till kursen i Programkonstruktion och datastrukturer h http://www.it.uu.se/edu/course/homepage/pkd/ht12 Huvudlärare Lars-Henrik Eriksson lhe@it.uu.se, http://www.it.uu.se/katalog/lhe PKD 2012/13 introduktion Sida 1 Uppdaterad 2012-10-25

Salvador Dalí: Minnets varaktighet (1931) PKD 2012/13 introduktion Sida 2 Uppdaterad 2012-10-25

Datorn kan själv inte utföra något har potential för att utföra allt. Vad är ett program? Program är instruktioner till datorn hur den skall utföra en uppgift. Program uttrycks med ett programspråk. Program utför beräkningar där det undersöker och ändrar data. Data representerar någonting utanför datorn själv. Program = Algoritmer + Datastrukturer PKD 2012/13 introduktion Sida 3 Uppdaterad 2012-10-25

(Lars-Henriks) syn på programmering Vetenskap Hantverk Konst PKD 2012/13 introduktion Sida 4 Uppdaterad 2012-10-25

Biff Stroganoff Matrecept kan ses som en sorts program. De innehåller instruktioner om hur man skall utföra en uppgift. Skär 500 g benfritt nötkött i cm-tjocka strimlor, ca 3 cm långa. Skala och hacka 2 gula lökar. Bryn kött och lök. Tillsätt 1 tsk salt, 1 krm peppar, 2 msk tomatpuré och 1,5 dl vatten. Efterstek i 5 min. Späd med 1,5 dl crème fraiche mot slutet. PKD 2012/13 introduktion Sida 5 Uppdaterad 2012-10-25

Hur detaljerade skall instruktioner vara? Det beror på läsaren! Hur man skär kött i strimlor 1. Tag kött, en vass kniv och en skärbräda. 2. Tag en köttbit. 3. Skär loss en smal bit kött med kniven. 4. Finns det kött kvar på köttbiten? Gå i så fall till steg 3. 5. Finns det köttbitar kvar? Gå i så fall till steg 2. Annars är det klart! Hur man skär... utgör ett underprogram till Biff Stroganoff. Observera att instruktioner kan läggas i följd ges som alternativ upprepas...de grundläggande programstrukturerna PKD 2012/13 introduktion Sida 6 Uppdaterad 2012-10-25

Effektiv procedur för beräkning Algoritm 1) Mekanisk (skall inte kräva intelligens för att förstå) 2) Ändliga resurser (måste bli färdig) 3) Deterministisk (det skall alltid vara entydigt vad som skall göras) 4) Aritmetiserbart problem (problemet skall kunna representeras i termer av data egentligen heltal) Vad som är mekaniskt beror förstås på vem som tolkar algoritmen. Ett program är (oftast) en algoritm. (Med algoritmer i dagligt tal menar man i allmänhet bara sådana algoritmer som är fundamentala byggstenar för programmering. Jämför med olika grundrecept i matlagning för att t.ex. göra en redning). PKD 2012/13 introduktion Sida 7 Uppdaterad 2012-10-25

Euklides från Alexandria (325 265 f.v.t.) PKD 2012/13 introduktion Sida 8 Uppdaterad 2012-10-25

Största gemensamma delare Greatest Common Divisor gcd Det största heltal som jämnt delar två andra heltal. 126 Exempel: Vad är? 168 gcd till 126 och 168 är 42. 126 = 3*42, 168 = 4*42 så 126 3*42 3 = = 168 4*42 4 PKD 2012/13 introduktion Sida 9 Uppdaterad 2012-10-25

Euklides algoritm Förvillkor: m och n är positiva heltal Eftervillkor: m är gcd till de ursprungliga m och n. Variant: n Start. Är n=0? Ja. Stopp. Nej. Låt r vara resten när m delas med n. Låt m vara n. Låt n vara r. PKD 2012/13 introduktion Sida 10 Uppdaterad 2012-10-25

Euklides algoritm: exempel Största gemensamma delaren till 126 och 168 Start. Är n=0? Ja. Stopp. Nej. Låt r vara resten när m delas med n. m 126 n 168 Låt m vara n. Låt n vara r. PKD 2012/13 introduktion Sida 11.1 Uppdaterad 2012-10-25

Euklides algoritm: exempel Största gemensamma delaren till 126 och 168 Start. Är n=0? Ja. Stopp. Nej. Låt r vara resten när m delas med n. m 126 n 168 Låt m vara n. Låt n vara r. PKD 2012/13 introduktion Sida 11.2 Uppdaterad 2012-10-25

Euklides algoritm: exempel Största gemensamma delaren till 126 och 168 Start. Är n=0? Ja. Stopp. Nej. Låt r vara resten när m delas med n. Låt m vara n. m 126 n 168 r 126 Låt n vara r. PKD 2012/13 introduktion Sida 11.3 Uppdaterad 2012-10-25

Euklides algoritm: exempel Största gemensamma delaren till 126 och 168 Start. Är n=0? Ja. Stopp. Nej. Låt r vara resten när m delas med n. Låt m vara n. m 168 n 168 r 126 Låt n vara r. PKD 2012/13 introduktion Sida 11.4 Uppdaterad 2012-10-25

Euklides algoritm: exempel Största gemensamma delaren till 126 och 168 Start. Är n=0? Ja. Stopp. Nej. Låt r vara resten när m delas med n. Låt m vara n. m 168 n 126 r 126 Låt n vara r. PKD 2012/13 introduktion Sida 11.5 Uppdaterad 2012-10-25

Euklides algoritm: exempel Största gemensamma delaren till 126 och 168 Start. Är n=0? Ja. Stopp. Nej. Låt r vara resten när m delas med n. Låt m vara n. m 168 n 126 r 126 Låt n vara r. PKD 2012/13 introduktion Sida 11.6 Uppdaterad 2012-10-25

Euklides algoritm: exempel Största gemensamma delaren till 126 och 168 Start. Är n=0? Ja. Stopp. Nej. Låt r vara resten när m delas med n. Låt m vara n. m 168 n 126 r 42 Låt n vara r. PKD 2012/13 introduktion Sida 11.7 Uppdaterad 2012-10-25

Euklides algoritm: exempel Största gemensamma delaren till 126 och 168 Start. Är n=0? Ja. Stopp. Nej. Låt r vara resten när m delas med n. Låt m vara n. m 126 n 126 r 42 Låt n vara r. PKD 2012/13 introduktion Sida 11.8 Uppdaterad 2012-10-25

Euklides algoritm: exempel Största gemensamma delaren till 126 och 168 Start. Är n=0? Ja. Stopp. Nej. Låt r vara resten när m delas med n. Låt m vara n. m 126 n 42 r 42 Låt n vara r. PKD 2012/13 introduktion Sida 11.9 Uppdaterad 2012-10-25

Euklides algoritm: exempel Största gemensamma delaren till 126 och 168 Start. Är n=0? Ja. Stopp. Nej. Låt r vara resten när m delas med n. Låt m vara n. m 126 n 42 r 42 Låt n vara r. PKD 2012/13 introduktion Sida 11.10 Uppdaterad 2012-10-25

Euklides algoritm: exempel Största gemensamma delaren till 126 och 168 Start. Är n=0? Ja. Stopp. Nej. Låt r vara resten när m delas med n. Låt m vara n. m 126 n 42 r 0 Låt n vara r. PKD 2012/13 introduktion Sida 11.11 Uppdaterad 2012-10-25

Euklides algoritm: exempel Största gemensamma delaren till 126 och 168 Start. Är n=0? Ja. Stopp. Nej. Låt r vara resten när m delas med n. Låt m vara n. m 42 n 42 r 0 Låt n vara r. PKD 2012/13 introduktion Sida 11.12 Uppdaterad 2012-10-25

Euklides algoritm: exempel Största gemensamma delaren till 126 och 168 Start. Är n=0? Ja. Stopp. Nej. Låt r vara resten när m delas med n. Låt m vara n. m 42 n 0 r 0 Låt n vara r. PKD 2012/13 introduktion Sida 11.13 Uppdaterad 2012-10-25

Euklides algoritm: exempel Största gemensamma delaren till 126 och 168 Start. Är n=0? Ja. Stopp. Nej. Låt r vara resten när m delas med n. Låt m vara n. Låt n vara r. m 42 n 0 r 0 Svaret finns nu i m PKD 2012/13 introduktion Sida 11.14 Uppdaterad 2012-10-25

Erathostenes från Kyrene (276 194 f.v.t.) PKD 2012/13 introduktion Sida 12 Uppdaterad 2012-10-25

Erathostenes såll 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 2 --- --- --- --- --- --- --- 3 --- --- --- --- 4 --- --- --- 5 --- --- 6 --- 7 --- 8 ---... De tal som faller igenom sållet är primtal. PKD 2012/13 introduktion Sida 13 Uppdaterad 2012-10-25

Pseudoalgoritmer Eratostenes såll är en pseudoalgoritm en mekanisk procedur som inte uppfyller (alla) kraven på att vara en algoritm. Alla program är inte algoritmer. Ofta vill man inte att program skall avslutas t.ex. program som styr processer av olika slag: trafikljus telefonväxlar DVD-spelare kärnkraftverk... PKD 2012/13 introduktion Sida 14 Uppdaterad 2012-10-25

Abu Jaʼfar Mohammad Ibn Musa al-khwarizmi (c:a 780 c:a 850) PKD 2012/13 introduktion Sida 15 Uppdaterad 2012-10-25

Två böcker av al-khwarizmi Efter romarrikets fall skedde en vetenskaplig nedgång i Europa. Den islamska kulturen bevarade och utvecklade grekisk vetenskap. Matematikern al-khwarizmi verkade i Bagdad som under 800-talet var ett kulturellt och vetenskapligt centrum. Några böcker av al-khwarizmi: Om beräkning genom al-jabr och al-muqabala Metoder för att förenkla ekvationer och lösa andragradsekvationer. al-khwarizmi om de indiska talen Om att skriva tal i positionssystem med siffran noll. Bara en latisk översättning finns bevarad Algoritmi de numero indorum Förvrängning av al-jabr och al-khwarizmis namn har gett oss orden algebra och algoritm. PKD 2012/13 introduktion Sida 16 Uppdaterad 2012-10-25

Gottfried Wilhelm von Leibniz (1646 1716) calculemus (låt oss räkna) PKD 2012/13 introduktion Sida 17 Uppdaterad 2012-10-25

Leibniz kalkylator Leibniz kalkylator förverkligar (implementerar) algoritmer för de fyra räknesätten. PKD 2012/13 introduktion Sida 18 Uppdaterad 2012-10-25

Gammal matematisk tabell Tabellen ger värden på sinus för vinklar i steg av 0,1 PKD 2012/13 introduktion Sida 19 Uppdaterad 2012-10-25

Charles Babbage (1791 1871) PKD 2012/13 introduktion Sida 20 Uppdaterad 2012-10-25

Differenskalkylen Polynom kan approximera matematiska funktioner som sinus, logaritm etc. (med taylorutvecklingar se kurs i analys) Differenskalkylen beräknar polynom med enbart additioner. x 2x 2-3x+4 1:a diff. 2:a diff 3:e diff. 0 4-1 1 3 4 3 0 2 6 4 7 0 3 13 4 11 4 24 5?? PKD 2012/13 introduktion Sida 21.1 Uppdaterad 2012-10-25

Differenskalkylen Polynom kan approximera matematiska funktioner som sinus, logaritm etc. (med taylorutvecklingar se kurs i analys) Differenskalkylen beräknar polynom med enbart additioner. x 2x 2-3x+4 1:a diff. 2:a diff 3:e diff. 0 4-1 1 3 4 3 0 2 6 4 7 0 3 13 4 11 0 4 24 0+4 5?? PKD 2012/13 introduktion Sida 21.2 Uppdaterad 2012-10-25

Differenskalkylen Polynom kan approximera matematiska funktioner som sinus, logaritm etc. (med taylorutvecklingar se kurs i analys) Differenskalkylen beräknar polynom med enbart additioner. x 2x 2-3x+4 1:a diff. 2:a diff 3:e diff. 0 4-1 1 3 4 3 0 2 6 4 7 0 3 13 4 11 0 4 24 4 11+4 5?? PKD 2012/13 introduktion Sida 21.3 Uppdaterad 2012-10-25

Differenskalkylen Polynom kan approximera matematiska funktioner som sinus, logaritm etc. (med taylorutvecklingar se kurs i analys) Differenskalkylen beräknar polynom med enbart additioner. x 2x 2-3x+4 1:a diff. 2:a diff 3:e diff. 0 4-1 1 3 4 3 0 2 6 4 7 0 3 13 4 11 0 4 24 4 15 5 24+15 PKD 2012/13 introduktion Sida 21.4 Uppdaterad 2012-10-25

Differenskalkylen Polynom kan approximera matematiska funktioner som sinus, logaritm etc. (med taylorutvecklingar se kurs i analys) Differenskalkylen beräknar polynom med enbart additioner. x 2x 2-3x+4 1:a diff. 2:a diff 3:e diff. 0 4-1 1 3 4 3 0 2 6 4 7 0 3 13 4 11 0 4 24 4 15 5 39 PKD 2012/13 introduktion Sida 21.5 Uppdaterad 2012-10-25

Babbages differensmaskin (del) Differensmaskinen implementerar en algoritm för differenskalkyl. PKD 2012/13 introduktion Sida 22 Uppdaterad 2012-10-25

Augusta Ada Byron grevinna av Lovelace (1815 1852) PKD 2012/13 introduktion Sida 23 Uppdaterad 2012-10-25

Babbages analytiska maskin Den analytiska maskinen skulle programmeras att utföra godtycklig algoritm. Beståndsdelarna i princip samma som i en modern dator, men allt byggt mekaniskt. Ada Lovelace skrev det första programmet i modern mening för beräkning av Bernoullital. Den analytiska maskinen kunde aldrig byggas dåtidens finmekanik räckte inte. PKD 2012/13 introduktion Sida 24 Uppdaterad 2012-10-25

Alonzo Church Alan Mathison Turing (1903 1995) (1912 1954) PKD 2012/13 introduktion Sida 25 Uppdaterad 2012-10-25

Vad är mekaniskt? Matematiska modeller av beräkningar. Church: λ-kalkylen ( lambdakalkylen ) Turing: turingmaskiner Church-Turings tes: Dessa modeller kan beskriva allt som går att beräkna. I praktiken: uttryckbart som program i en dator. Alla beräkningar kan inte mekaniseras enligt Church/Turing. Kan de då utföras alls? λ-kalkylen har blivit ett viktigt verktyg inom datavetenskapen. PKD 2012/13 introduktion Sida 26 Uppdaterad 2012-10-25

Turing award Datavetenskapens nobelpris är uppkallat efter A.M. Turing och delas ut sedan 1966 av Association for Computing Machinery(ACM) Några pristagare: 1983: Ken Thompson, Dennis M. Ritchie operativsystemet UNIX. 1988: Ivan Sutherland grundläggande principer för datorgrafik 1991: Robin Milner programspråket ML (bl.a.) 2001: Ole-Johan Dahl och Kristen Nygaard objektorienterad programmering (Simula) 2003: Alan Kay objektorienterad programmering (Smalltalk) och ideerna bakom persondatorer. 2004: Vinton G. Cerf och Robert E. Kahn Internet (TCP/IP) 2008: Barbara Liskov bidrag till grundprinciper för programspråk och systemdesign. PKD 2012/13 introduktion Sida 27 Uppdaterad 2012-10-25

Datarepresentation Datorer är byggda för att arbeta med heltal. Med hjälp av dessa kan annan information representeras. (Minns ni kravet på algoritmer om aritmetiserbarhet?) T.ex. kan text representeras genom att koda bokstäver: genom kodningen A=65, B=66 etc.kan ordet UPPSALA representeras som talföljden 84 79 79 82 65 75 65. En bild kan byggas upp av bildpunkter (pixlar) av bestämd färg. Färger kan kodas som tre tal som anger inblandning av rött, grönt och blått i procent. T.ex. kan mörkgult kodas som 100 75 0. En bild represeneras då som en (stor) mängd sådana taltripplar. PKD 2012/13 introduktion Sida 28 Uppdaterad 2012-10-25

Datastrukturer En bibliotekskatalog kan representeras som en upprepning av poster Vretblad, A.: Algebra och Geometri, Gleerups, 1999 Journal of Automated Reasoning, Kluwer, ISSN 0168-7433 Hansen, M.R. & Rischel, H.: Introduction to Programming in Standard ML, Addison-Wesley, 1999, ISBN 0-201-39820-6 Varje post sätts samman av olika fält här texter (strängar) och tal. Poster kan ha olika utformning beroende på vilka data som behövs. Sammansättning, upprepning och alternativ är de grundläggande metoderna för strukturering av data. (Jämför programstrukturer!) PKD 2012/13 introduktion Sida 29 Uppdaterad 2012-10-25

Mer komplicerade datastrukturer En del av Uppsalas busslinjenät representerat som en graf. Svartbäcken Slottsbacken Stora torget 20 110 Centralstationen Eriksberg 7 20 7 20 110 20 Akademiska södra 20 110 Polacksbacken Bergsbrunna PKD 2012/13 introduktion Sida 30 Uppdaterad 2012-10-25

Ada Lovelace om datarepresentation "Again, [the Analytical Engine] might act upon other things besides number, were objects found whose mutual fundamental relations could be expressed by those of the abstract science of operations, and which should be also susceptible of adaptations to the action of the operating notation and mechanism of the engine... Supposing, for instance, that the fundamental relations of pitched sounds in the science of harmony and of musical composition were susceptible of such expression and adaptations, the engine might compose elaborate and scientific pieces of music of any degree of complexity or extent." Notes on the description of the Analytical Engine, 1843 PKD 2012/13 introduktion Sida 31 Uppdaterad 2012-10-25

Grace Murray Hopper (1906 1992) If it's a good idea... go ahead and do it. It is much easier to apologize than it is to get permission PKD 2012/13 introduktion Sida 32 Uppdaterad 2012-10-25

Högnivåspråk Datorn styrs med numeriska koder (maskinspråk) vars funktion definieras i termer av datorns inre uppbyggnad. Även data representeras ytterst som numeriska koder. Människor vill ha mer lättanvänd notation. Därför finns användarorienterade programspråk (högnivåspråk) för att konstruera program. En kompilator är ett program översätter från ett högnivåspråk till maskinspråk. Grace Hopper skrev den första kompilatorn ( 1952). PKD 2012/13 introduktion Sida 33 Uppdaterad 2012-10-25

Ni skall även: Programkonstruktion är mer än att bara skriva program... lära er ett högnivåprogramspråk (Standard ML) lära er grundläggande datavetenskapliga begrepp förstå betydelsen av specifikationer (vad?) motivering (varför?) dokumentation i övrigt elegans, precision, klarhet... PKD 2012/13 introduktion Sida 34 Uppdaterad 2012-10-25

Algoritmer och datastrukturer handlar om att lära sig... ett antal grundläggande datastrukturer ett antal grundläggande algoritmer...deras användning...deras egenskaper, speciellt avseende komplexitet....hur man skall välja bland dem att analysera algoritmer PKD 2012/13 introduktion Sida 35 Uppdaterad 2012-10-25

Små- och storskalig programmering På denna kurs skall ni lära er småskalig programmering att själv skriva små program, oftast för eget bruk. ( Små betyder här en eller några tusen rader programkod.) En helt annan sak är storskalig programmering att många programmerare tillsammans utvecklar stora program för någon uppdragsgivare. Stora program kan bestå av miljontals rader programkod. För detta krävs inte bara erfarenhet utan även andra kunskaper som behandlas på kurserna Storskalig programmering och Programvaruteknik. Jämför med att laga mat hemma till sig själv eller familjen mot att vara kock i ett restaurantkök eller vid en festmiddag för hundratals gäster! PKD 2012/13 introduktion Sida 36 Uppdaterad 2012-10-25

Sun Tzu (c:a 500 f.v.t) Skrev Krigskonsten som fortfarande läses i militära skolor. (Vad har det med kursen att göra...?) PKD 2012/13 introduktion Sida 37 Uppdaterad 2012-10-25

David Parnas (1941 ) I would advise students to pay more attention to the fundamental ideas rather than the latest technology. The technology will be out-ofdate before they graduate. Fundamental ideas never get out of date. PKD 2012/13 introduktion Sida 38 Uppdaterad 2012-10-25

Thomas Thorild (1759-1808) Tänka fritt är stort men tänka rätt är större Devis över ingången till universitetsaulan PKD 2012/13 introduktion Sida 39 Uppdaterad 2012-10-25

En kurs på universitetet En universitetsutbildning skiljer sig från andra utbildningar genom att vila på vetenskaplig grund. Det som lärs ut skall inte vara fritt tyckande utan vila på vetenskaplig grund samt på beprövad erfarenhet. (högskolelagen) skall ge förståelse för inte bara hur utan även varför. skall leda till självständigt och kritiskt tänkande. (högskolelagen) Vad har ni för anledning att tro eller inte tro på det som jag säger? Man kan spekulera i att homeopati fungerar eller att en programutvecklingsmetod som är inne ger billiga program av hög kvalitet, men i verkligheten är det underbyggda påståenden som gäller. Det kostar liv och egendom att tänka fritt vid brobygge, behandling av sjukdomar, konstruktion av programvara PKD 2012/13 introduktion Sida 40 Uppdaterad 2012-10-25

Föreläsningar: Laborationer: Kursupplägg Vanliga föreläsningar Gästföreläsningar Överkursföreläsningar I datasal med handledare på plats Inlämningsuppgifter: I tvåpersonersgrupper under c:a två veckor. Projekt: Lektioner: Handledning och genomgångar. I slutet av kursen, större grupper. Lärarledda övningar, handledning, genomgång av inlämningsuppgifter Tentamen: I december och mars. PKD 2012/13 introduktion Sida 41 Uppdaterad 2012-10-25

Hur man blir godkänd på laborationerna 1) Kom till labbsalen (nödvändigt!) och gör labbuppgifterna. Du blir bedömd och godkänd direkt om du gjort ett bra jobb eller 2) Om du inte har löst labbuppgifterna ordentligt så får du till början av nästa labbtillfälle att göra klart labben. För att få godkänt på kursen måste 70% av laborationerna vara godkända. PKD 2012/13 introduktion Sida 42 Uppdaterad 2012-10-25

Hur man blir godkänd på inlämningsuppgifterna 1) Lämna in en tillräckligt bra lösning i tid eller 2) Lämna in ett seriöst försök till lösning i tid i detta fall får du betyg K (komplettering) på uppgiften och Deltag på följande lektion (obligatoriskt!) Lämna in en tillräckligt bra lösning senast vid nästa inlämningstid. I annat fall blir uppgiften underkänd. Inlämningsuppgifterna får ett graderat godkänt betyg (3,4,5). För att få godkänt på kursen måste alla 3 inlämningsuppgifterna vara godkända. PKD 2012/13 introduktion Sida 43 Uppdaterad 2012-10-25

Hur man blir godkänd på projektet 1) Bestäm (i samråd med lärarna) ett lagom stort projekt 2) Konstruera ett program som i huvudsak uppfyller projektmålen 3) Skriv en godkänd programdokumentation 4) Gör en godkänd projektredovisning 5) Gör godkänd opposition på annat projekt 6) Gör alltihop i tid I annat fall blir projektet underkänt. Projektet får ett graderat godkänt betyg (3,4,5). För att få godkänt på kursen måste projektet vara godkänt. PKD 2012/13 introduktion Sida 44 Uppdaterad 2012-10-25

Presentation och opposition För att träna på muntlig framställning och kritiskt tänkande skall alla vid projektredovisningen Muntligt presentera projektet. Opponera på någon annans presentation. Opposition opponenten läser projektredovisningen i förväg och funderar: Är detta rätt? Varför är det gjort som det är gjort? Kan det göras på bättre sätt? Efter presentationen ställer opponenten frågor om detta och den som presenterar (respondenten) skall kunna svara på frågorna. Lärarna väljer i förväg ut vilka som skall opponera på vilka presentationer. PKD 2012/13 introduktion Sida 45 Uppdaterad 2012-10-25

För programkonstruktion: Litteratur Introduction to Programming using SML av Michael R. Hansen och Hans Rischel För algoritmer och datastrukturer: Introduction to Algorithms av Cormen, Leiserson, Rivest, Stein eller Introduction to the Design & Analysis of Algorithms, Anany Levitin Dessa böcker är framförallt referens/brevidläsningslitteratur Det står på kurswebbplatsen hur ni får tag på dem. Där finns också förslag på andra böcker och nätresurser. PKD 2012/13 introduktion Sida 46 Uppdaterad 2012-10-25

Arbetstid Kursen går på 2/3 av heltid. 2/3 av en 40-timmarsvecka är 27 tim. I genomsnitt finns 14 timmar schemalagd undervisning varje vecka (mera mot slutet av kursen). Du skall alltså vara beredd på att lägga 13 timmar i vecka på självstudier! Lösa uppgifter Repetera material vi gått igenom Läsa igenom materialet till nästa föreläsning etc PKD 2012/13 introduktion Sida 47 Uppdaterad 2012-10-25

Är du registrerad på kursen? Du måste själv registrera dig på kursen i Studentportalen. Undantag: Om du varit registrerad tidigare år och skall läsa om kursen, så skicka e-post till it-kansli@it.uu.se och be om att bli omregistrerad. Gör det nu!!! Om du av någon anledning inte lyckas registrera dig så skall du också skicka e-post till it-kansli@it.uu.se. Om du hoppar av kursen så måste du också anmäla det till it-kansli@it.uu.se glöm inte att såsmåningom anmäla dig till tentan i december! PKD 2012/13 introduktion Sida 48 Uppdaterad 2012-10-25

Vilken var webbadressen nu igen? http://www.it.uu.se/edu/ course/homepage/pkd/ht12 Läs informationen om kursen! Läs nyheter på webben! Minst två gånger i veckan. PKD 2012/13 introduktion Sida 49 Uppdaterad 2012-10-25

Programspråk Vid programmering används något av många olika programspråk för att beskriva algoritmer och datastrukturer. C, C++, Java, ADA, ML, Pascal, BASIC,... Program i högnivåspråk Program i maskinspråk Kompilator/ Interpretator Programkörning PKD 2012/13 introduktion Sida 50 Uppdaterad 2012-10-25

Funktionell programmering Programspråk skiljer i hur instruktioner är utformade och sätts ihop. Instruktionerna i funktionella programspråk är funktioner. En funktion är något som tar data ( argument ) och beräknar nya data ( värde ). Det är inte samma sak som funktioner i matematiken. sinus 30 0.5 4 5 + 9 Hejsan 3 deltecken (Obs att datavetare ofta börjar räkna med 0...) Funktionella program byggs genom sammansättning av funktioner. s Hejsan längd 1 - deltecken Detta dataflödesdiagram visar beräkning av sista tecknet i en sträng PKD 2012/13 introduktion Sida 51.1 Uppdaterad 2012-10-25

Funktionell programmering Programspråk skiljer i hur instruktioner är utformade och sätts ihop. Instruktionerna i funktionella programspråk är funktioner. En funktion är något som tar data ( argument ) och beräknar nya data ( värde ). Det är inte samma sak som funktioner i matematiken. sinus 30 0.5 4 5 + 9 Hejsan 3 deltecken (Obs att datavetare ofta börjar räkna med 0...) Funktionella program byggs genom sammansättning av funktioner. s Hejsan längd 6 1 - deltecken Detta dataflödesdiagram visar beräkning av sista tecknet i en sträng PKD 2012/13 introduktion Sida 51.2 Uppdaterad 2012-10-25

Funktionell programmering Programspråk skiljer i hur instruktioner är utformade och sätts ihop. Instruktionerna i funktionella programspråk är funktioner. En funktion är något som tar data ( argument ) och beräknar nya data ( värde ). Det är inte samma sak som funktioner i matematiken. sinus 30 0.5 4 5 + 9 Hejsan 3 (Obs att datavetare ofta börjar räkna med 0...) Funktionella program byggs genom sammansättning av funktioner. Hejsan längd 6-5 1 deltecken deltecken Detta dataflödesdiagram visar beräkning av sista tecknet i en sträng PKD 2012/13 introduktion Sida 51.3 Uppdaterad 2012-10-25 s

Funktionell programmering Programspråk skiljer i hur instruktioner är utformade och sätts ihop. Instruktionerna i funktionella programspråk är funktioner. En funktion är något som tar data ( argument ) och beräknar nya data ( värde ). Det är inte samma sak som funktioner i matematiken. sinus 30 0.5 4 5 + 9 Hejsan 3 (Obs att datavetare ofta börjar räkna med 0...) Funktionella program byggs genom sammansättning av funktioner. Hejsan längd 6-5 1 deltecken deltecken Detta dataflödesdiagram visar beräkning av sista tecknet i en sträng PKD 2012/13 introduktion Sida 51.4 Uppdaterad 2012-10-25 n s

Användning av funktionell programmering Har funnits inom datavetenskapen sedan lång tid (LISP 1962) Har fått växande använding även i praktiska tillämpningar, t.ex. Microsoft Excel (formelspråket är ett funktionellt språk) Ericssons telefonsystem (programspråket Erlang) Studier har visat att program blir kortare och enklare och att utvecklingstiden blir kortare jämfört med traditionella språk som C. Funktionella språk har också en enklare semantik (betydelse). Nackdelen är att programmen ibland utnyttjar datorn något mindre effektivt spelar i dag mindre roll än effektivitet vid utvecklingen. Inst. för informationsteknologi bedriver forskning kring funktionell programmering i samarbete med bl.a. Ericsson. PKD 2012/13 introduktion Sida 52 Uppdaterad 2012-10-25

Programspråket Standard ML Funktionellt språk Programmen liknar (ytligt sett) matematiska uttryck. Få, enkla och tydliga begrepp lämpligt för utbildning Enkel struktur hos program (i alla fall jämfört med många andra språk...) Möjliggör snabb och effektiv programmering Den implementering av Standard ML vi använder på kursen kallas Poly/ML. PKD 2012/13 introduktion Sida 53 Uppdaterad 2012-10-25

Enkla ML-uttryck Uttryck är formler i språket ML som kan beräknas till ett värde. ML kan arbeta med olika sorters data, bl.a.: heltal: 32+15 beräknas till 47 flyttal: 3.12*4.3 beräknas till 13.416 text (strängar): size "Hej, hopp" beräknas till 9 Värden kan inte beräknas vidare utan är data i sig själva. Funktionsvärden beräknas genom att man skriver funktionen (dess namn) före argumentet. (Prefix notation.) Vissa funktioner som i matematiken normalt skrivs mellan sina argument (t.ex. +, *) skrivs så även i ML. (Infix notation.) PKD 2012/13 introduktion Sida 54 Uppdaterad 2012-10-25

Sammansatta uttryck Även sammansatta uttryck finns: 1+(size "Hej, hopp"*2) beräknas till 19. Precis som i matematiken har operatorer olika prioritet (precedens), t.ex. beräknas multiplikationer före additioner. Prefixa funktionsanrop beräknas allra först. Parenteser kan användas för att ändra ordningen. Uttrycket ovan motsvarar alltså dataflödesdiagrammet Hej, hopp längd 2 * 1 + (I praktiken använder man sällan dataflödesdiagram för programmering.) PKD 2012/13 introduktion Sida 55 Uppdaterad 2012-10-25

Körning av Poly/ML-interpretatorn På Unix-systemen startas Poly/ML med kommandot poly. För tydlighet skrivs inmatning på OH-bilderna med blå färg. prompter inmatningen kan delas på flera rader men måste alltid avslutas med semikolon. Poly/ML 5.4.1 Release > 32+15; val it = 47 : int > 3.12* # 4.3; val it = 13.416 : real > size "Hej, hopp"; val it = 9 : int > 1+(size "Hej, hopp"*2); val it = 19 : int inmatning (uttryck) ML svarar med uttryckets värde och typ Jag återkommer till vad en typ är för något och vad val it betyder. PKD 2012/13 introduktion Sida 56 Uppdaterad 2012-10-25

Syntax Syntaxen hos ett programspråk är hur program får se ut. Programspråk har normalt mycket strikt syntax som inte tillåter misstag. Några exempel: funktion argument citationstecken "Hej" sträng infixuttryck operander 32+15 operator String.sub("Hejsan",5) funktionsanrop Operatorer är funktioner som skrivs mellan sina argument ( infix ). Argumenten kan själva vara uttryck, t.ex. 1+2*3. Argument, operander och parametrar är olika namn på samma sak. Om funktionen har ett argument kan man i ML utelämna parenteserna t.ex. size "Hej" är samma som size("hej"). PKD 2012/13 introduktion Sida 57 Uppdaterad 2012-10-25

Syntaxfel Felaktig syntax gör att uttrycken inte kan tolkas. ML-systemet ger ett felmeddelande. > (1.0+ *3.0)/2.0; Warning-(*) has infix status but was not preceded by op. Meddelandena är inte alltid hjälpsamma maskinen kan inte gissa vad man egentligen menar... Ibland kan felskrivningen ligga på ett helt annat ställe än där MLsystemet misslyckas med att tolka ett uttryck. PKD 2012/13 introduktion Sida 58 Uppdaterad 2012-10-25

Luring vid felaktig syntax Felaktig syntax kan göra att ML-systemet verkar sluta fungera. > 2.0*(3.0+4.0; # 1+2; # size "Hej"; Här har man glömt en högerparentes! ML väntar förgäves på den och verkar därför ha slutat svara. I detta läge kan man avbryta inmatningen med kontroll-c från tangentbordet och skriva in rätt. ^C Compilation interrupted > 2.0*(3.0+4.0); val it = 14.0 : real Glömmer man ett citationstecken kan man få liknande effekt... > size "Hej, hopp; # 1+2; PKD 2012/13 introduktion Sida 59 Uppdaterad 2012-10-25

Semantik Semantiken hos ett programspråk är vad program betyder. Betydelsen av... + är en funktion som beräknar summan av operanderna size är en funktion som beräknar längden av argumentet F X X OP Y är att funktionen F beräknas med argumentet X är att funktionen OP beräknas med argumenten X och Y alltså... 32+15 betyder summan av 32 och 15, vilket beräknas till 47. size Hej, hopp betyder längden av strängen Hej, hopp, vilket beräknas till 9. PKD 2012/13 introduktion Sida 60 Uppdaterad 2012-10-25

Beräkning av uttryck Uttryck i ML beräknas i steg. I varje steg väljs en funktion där alla argument redan är beräknade. Funktionen anropas med sina argument och beräknar ett värde som ersätter funktionsanropet. Proceduren upprepas tills beräkningen är färdig. 1+size("Hej, " ^ "hopp")*2 > 1+size "Hej, hopp"*2 > 1+9*2 > 1+18 > 19 Blåmarkerade deluttryck är de som beräknas i nästa steg. ( > är ingen symbol i språket ML utan visar beräkningssteg.) PKD 2012/13 introduktion Sida 61 Uppdaterad 2012-10-25

Ordningen spelar ingen roll I ett (äkta) funktionellt program spelar det ingen roll i vilken ordning funktionsanropen utförs resultatet blir samma ändå. 2*3+4*5 > 6+4*5 > 6+20 > 26 2*3+4*5 > 2*3+20 > 6+20 > 26 Man kan till och med låta flera funktionsanrop utföras samtidigt i ett steg. 2*3+4*5 > 6+20 > 26 Funktionella språk är lämpliga för datorer där beräkningar kan göras parallellt (t.ex. flerkärniga processorer). Just språket ML gör dock alltid beräkningarna från vänster till höger. PKD 2012/13 introduktion Sida 62 Uppdaterad 2012-10-25

Syntax- och semantikbeskrivningar Syntaxen hos ett programspråket finns normalt noggrant beskriven, så att det exakt går att avgöra vad som är ett korrekt program. (Men i den här kursen nöjer vi oss med en ungefärlig beskrivning.) Semantiken är i allmänhet mindre exakt beskriven helt enkelt för att det är svårare att precis och fullständigt beskriva vad ett program egentligen betyder. För ML finns dock en exakt semantisk beskrivning. PKD 2012/13 introduktion Sida 63 Uppdaterad 2012-10-25

Typer Typer är mängder av data med samma slags egenskaper. Elementen i en typ kallas typens värden. Heltal (int) Flyttal (real) Strängar (string) 1 2 ~10 5 ~12 147 0 Minustecken i ML 1.0 2.3 ~10.4 3.1415927 "Hej, hopp" "Uppsala" "ABC" "" "1" ML-notation: 1:int 1.0:real "1":string Obs! 1, 1.0 och "1" är alla olika. Varför är 1 och 1.0 olika? Jo, flyttal är approximationer med begränsad noggranhet! 1.0 + 10000000000000000.0 10000000000000000.0 blir 0.0?!? (Representera aldrig riktiga pengar som flyttal.) PKD 2012/13 introduktion Sida 64 Uppdaterad 2012-10-25

Storleksbegränsningar I praktiken finns det begränsningar i hur stora (små) tal kan vara och hur långa strängar kan vara. Det är sällan detta leder till problem, men man måste vara medveten om det. Begränsningarna kan variera mellan olika datorer/ml-system. Vanliga gränser för heltal är 1073741823 och 1073741824. Just Poly/ML tillåter dock godtyckligt stora heltal. (Ovanligt!) Flyttal kan vara mycket större (i Poly/ML upp till c:a ± 10 308 ), men har begränsad noggranhet (i Poly/ML c:a 17 decimala siffror). Skulle resultatet av en beräkning bli för stort kallas det overflow. PKD 2012/13 introduktion Sida 65 Uppdaterad 2012-10-25

Också funktioner har typer: Funktionstyper argumenttyper argumenttyp size : string -> int resultattyp (värdetyp) + : int*int -> int binder samman argumenttyperna (betyder inte multiplikation i detta sammanhang) + kan även typas real*real->real + sägs vara överlagrad (Egentligen är addition av heltal och flyttal helt olika funktioner som har samma namn. Argumenttyperna styr vilken som används.) PKD 2012/13 introduktion Sida 66 Uppdaterad 2012-10-25

Divisionsfunktionerna Funktionerna för division av flyttal respektive heltal heter olika: > 7.0 / 2.0; val it = 3.5: real > 7 div 2; val it = 3: int Anledningen är att heltalsdivisionen ger ett heltalsresultat och alltså avrundar nedåt. PKD 2012/13 introduktion Sida 67 Uppdaterad 2012-10-25

Beräkningsfel Alla uttryck går inte att beräkna även om syntaxen är riktig: Felkod > 1 div 0; Exception- Div raised Fastän 1 div 0 är ett ML-uttryck med riktig syntax så går det inte att beräkna. Istället avbryts beräkningen av uttrycket med ett beräkningsfel (exekveringsfel) och man får ett felmeddelande med felkod istället för värde. Beräkningsfel kan inträffa i många situationer där en beräkning inte går att genomföra. I ML är felkoderna en speciell sorts datatyper, kallade undantag (exceptions). PKD 2012/13 introduktion Sida 68 Uppdaterad 2012-10-25

Typkontroll (typning) Vad betyder 32+1.5? 32+"Hej"? 32+"1"? Att addera värden av olika typ är inte utan vidare meningsfullt. Det fungerar på olika sätt i olika programspråk. Stark typning: Operationen förbjuds alltid (t.ex. ML). Automatisk typkonvertering: Värden görs om till rätt typ om det går t.ex. 32+1.5 > 33.5. 32+"1" > 33. 32+"Hej" ger typfel. Ingen typkontroll: Operationen utförs utan att kontrollera typerna. Resultatet är oförutsägbart kan variera från fall till fall. En möjlighet är 32+"1" > 81 om tecknet "1" kodas som 49!! Statisk typning: Typkontroll görs innan programmet körs (t.ex. ML). Dynamisk typning: Typkontroll görs under programkörningen typfel ger beräkningsfel. Stark och statisk typning minskar risken för programmeringsfel. PKD 2012/13 introduktion Sida 69 Uppdaterad 2012-10-25

Typning i ML ML är ett starkt och statiskt typat språk. Alla uttryck har en bestämd typ. > 32+1; val it = 33 : int; Liksom felaktig syntax gör typfel att uttrycken inte kan tolkas. > 32+"Hej"; Error-Type error in function application. Function: + : int * int -> int Argument: (32, "Hej") : int * string Reason: Can't unify int (*In Basis*) with string (*In Basis*) (Different type constructors) Found near 32 + "Hej" Ett stränguttryck har använts där det krävts ett heltalsuttryck. PKD 2012/13 introduktion Sida 70 Uppdaterad 2012-10-25

Mer om typfel Meddelandena är inte alltid hjälpsamma ML talar om var den hittar ett typfel, vilket kan vara ett helt annat ställe i programmet än där felet egentligen ligger! ML vet inte om programmerarens avsikter. > (1+2)*(3.0+4.0); Error-Type error in function application. Function: * : int * int -> int Argument: ((1 + 2),(3.0 + 4.0)) : int*real Reason: Can't unify int (*In Basis*) with real (*In Basis*) (Different type constructors) Found near (1 + 2) * (3.0 + 4.0) ML säger att andra parentesen skall vara ett heltal men det kan ju lika gärna vara så att första parentesen skulle vara ett flyttal! PKD 2012/13 introduktion Sida 71 Uppdaterad 2012-10-25

Bindningar Man kan namnge värden binda namn till värdet. > val a = 3; inmatning (deklaration) val a = 3 : int > a; ML svarar med bundet val it = 3 : int namn, värde och typ > a+1; val it = 4 : int Namnet it binds alltid till det senast beräknade värdet. > it+1; val it = 5 : int > val b = 5; val b = 5 : int > a+b; val it = 8 : int Bindningar är inte tilldelningar som i C, Java,... (Mer om det senare.) PKD 2012/13 introduktion Sida 72 Uppdaterad 2012-10-25

Uttryck och deklarationer Uttryck är delar av språket ML som beräknar ett värde. Deklarationer är delar av språket ML som inte beräknar något värde, men som påverkar hur uttryck beräknas (tolkas). > xyz; Uttrycket kan inte beräknas Error-Value or constructor (xyz) has not been declared Found near xyz > val xyz = 4711; Deklarationen binder xyz val xyz = 4711 : int > xyz; Nu kan samma uttryck val it = 4711 : int beräknas En deklaration kan dock innehålla ett uttryck som del (t.ex. valdeklarationer innehåller uttryck som beräknar värdet som binds). Likaså kan uttryck innehålla deklarationer som delar. (Mera senare.) PKD 2012/13 introduktion Sida 73 Uppdaterad 2012-10-25

Syntax för identifierare i ML Namn på värden, funktioner m.m. kallas identifierare. Det finns alfanumeriska identifierare en följd av bokstäver, siffror, understrykning och apostrof som börjar med en bokstav: Ex: x, X, x2, x, size, total_sum Obs att stora och små bokstäver skiljer sig åt. Endast engelska bokstäver är tillåtna inte t.ex. åäöåäö. symboliska identifierare en följd av tecknen! % & $ # + - / : < = >? @ \ ~ ` ^ * Ex: +, *, :, ++,!?, >> reserverade ord eller nyckelord (som kännetecknar eller delar upp konstruktioner i språket) får inte användas som identifierare. Ex: val, if, then, :, = (se kursbok eller ML-dokumentation) PKD 2012/13 introduktion Sida 74 Uppdaterad 2012-10-25

Formattering ML tillåter att blanka och radbrytningar används var som helst i program mellan olika symboler. ML kräver inte blanka och radbrytningar utom för att undvika att namn läses ihop (size x kan inte skrivas sizex). Varning! Även namn bestående av specialtecken kan läsas ihop! 3+~2 fungerar inte. ML tolkar +~ som en operation som den inte känner till. Skriv 3+ ~2. I ML-program kan man lägga in kommentarer förklarande text som inte ingår i beräkningen. Kommentarer inleds med (* och avslutas med *). T.ex.: 1+(* Längden på strängen *) size "abc" PKD 2012/13 introduktion Sida 75 Uppdaterad 2012-10-25

Villkorsuttryck Program kan välja mellan två olika uttryck beroende på ett villkor. if b then e1 else e2 Om villkoret b är uppfyllt beräknar villkorsuttrycket e1, annars e2. b skall beräkna ett värde av typ bool ett sanningsvärde. 10>20 > false, 1<2 > true. > 10 > 20; val it = false : bool > if 10 > 20 then 10 else 20; val it = 20 : int Obs att e1 och e2 måste ha samma typ! (Varför?) PKD 2012/13 introduktion Sida 76 Uppdaterad 2012-10-25

Villkorsuttryck (forts.) if b then e1 else e2 b beräknas först och bara ett av e1 och e2 beräknas > val x = 0; val x = 0 : int > if x < 1 then 1000 else 1000 div x; val it = 1000 : int 1000 div x beräknas inte om x=0 och det uppstår därför inget exekveringsfel. if x < 1 then 1000 else 1000 div x > if 0 < 1 then 1000 else 1000 div x > if true then 1000 else 1000 div x > 1000 PKD 2012/13 introduktion Sida 77 Uppdaterad 2012-10-25

Andra typer Andra grundläggande typer i ML: char Enstaka tecken. Syntax: #"1" för t.ex. tecknet 1. unit Trivial typ. unit har ett enda värde som skrivs (). () används när syntaxen för språket ML kräver ett uttryck, men man inte är intresserad av något. PKD 2012/13 introduktion Sida 78 Uppdaterad 2012-10-25

Typen int (heltal) Syntax: en eller flera siffor. Negativa tal föregås av ~ ( tilde ). Exempel: 1, ~25 Funktioner Typ +, -, *, div int*int->int (de fyra räknesätten, heltalsdivision 7 div 3 > 2) mod int*int->int (rest 7 mod 3 > 1) =, <> int*int->bool (lika med, inte lika med) <, <=, >, >= int*int->bool (storleksjämförelser) ~ int->int (negation ~(2-3) > 1) abs int->int (absolutbelopp abs ~3 > 3) (alla tvåställiga funktioner på denna sida är infixa) PKD 2012/13 introduktion Sida 79 Uppdaterad 2012-10-25

Typen real (flyttal) Syntax: en eller flera siffor med decimalpunkt och/eller följd av tiopotens (bokstaven E följd av siffror) Negativa tal föregås av ~. Termen flyttal (floating point) kommer sig av att decimalpunkten inte står på ett bestämt ställe i talet. Exempel: 1.0, 3E4 (=3000.0), 3.4E~2 (=0.034) Grundläggande operationer på flyttal: Funktioner Typ +, -, *, / real*real->real (de fyra räknesätten) <, <=, >, >= real*real->bool (storleksjämförelser) ~ real->real (negation) abs real->real (absolutbelopp) (alla tvåställiga funktioner på denna sida är infixa) PKD 2012/13 introduktion Sida 80 Uppdaterad 2012-10-25

Likhetstyper Värden av de flesta typer kan jämföras med = och <>. 1+1=2 > true 1+1<>2 > false Detta gäller inte flyttal i Standard ML. Anledningen är att flyttal är approximationer och strikta likhetsjämförelser i allmänhet inte är rätt sak att göra. Är 1+10 16 10 16 = 1? 1.0+1E16-1E16 > 0.0?!? Jämför istället om två tal är tillräckligt lika. T.ex. jämför om 1+10 16 10 16 och 1 är lika med en noggranhet av ±10: abs(1.0+1e16-1e16-1.0) < 10.0 > true Typer som kan likhetsjämföras kallas likhetstyper. PKD 2012/13 introduktion Sida 81 Uppdaterad 2012-10-25

Biblioteket Math Det finns programbibliotek med färdigskrivna funktioner som man kan ha användning för. Ett sådant bibliotek är Math. Ett urval funktioner: Funktion Typ Math.sqrt real->real (kvadratrot) Math.sin real->real (sinus vinkeln i radianer) Math.cos real->real (cosinus vinkeln i radianer) Math.tan real->real (tangens vinkeln i radianer) Math.ln real->real (naturliga logaritmen) Math.pow real*real->real (exponentiering) Math.pow(10.0,3.0) > 1000.0 PKD 2012/13 introduktion Sida 82 Uppdaterad 2012-10-25

Typen string (strängar) Syntax: En teckenföljd med citationstecken (") omkring. Funktioner Typ =, <> string*string->bool (lika med, inte lika med) <, <=, >, >= string*string->bool (jämför bokstavsordning) ^ string*string->string (sammansättning) size string->int (längd) String.substring string*int*int->string (delsträng) (alla tvåställiga funktioner är infixa) "Hej, " ^ "hopp" > "Hej, hopp" String.substring("abcd",1,2) > "bc" Citrationstecken i strängen skrivs \". Bakvänt snedstreck skrivs \\. Exempel: "ab\"cd\\" är en sträng med 6 tecken: a,b,",c,d och\. PKD 2012/13 introduktion Sida 83 Uppdaterad 2012-10-25

Typen char (tecken) Syntax: Tecknet # följt av en sträng med exakt ett tecken. Grundläggande operationer på tecken: Funktioner Typ =, <> char*char->bool (lika med, inte lika med) <, <=, >, >= char*char->bool (storleksjämförelser) String.sub string*int->char (tecken ur sträng) String.sub("abcd",1) > #"b" PKD 2012/13 introduktion Sida 84 Uppdaterad 2012-10-25

Typen bool (sanningsvärden) Syntax: true respektive false Observera: true och false är data i typen bool. De är konstanta värden ungefär som 1, 3.0 och "Hej" Funktioner med värdetyp bool kallas ibland predikat. Funktioner Typ =, <> bool*bool->bool (lika med, inte lika med) not bool->bool (logisk negation true om argumentet är false och tvärtom.) orelse bool*bool->bool (logisk eller true om endera argumentet är true, false annars.) andalso bool*bool->bool (logisk och true om båda argumenten är true, false annars.) PKD 2012/13 introduktion Sida 85 Uppdaterad 2012-10-25

orelse och andalso igen 1 = 2 orelse not 3 = 4 > false orelse not 3 = 4 > false orelse not false > false orelse true > true orelse och andalso är inte vanliga funktioner deras andra argument beräknas inte om det inte behövs. Man säger att de är lata i sitt andra argument. (Motsatsen till lat beräkning alltså det normala att alltid beräkna argument kallas för ivrig beräkning.) 3>2 orelse 3 < 1 div 0 ger inte exekveringsfel trots divisionen med noll. 3>2 orelse 3 < 1 div 0 > true orelse 3 < 1 div 0 > true PKD 2012/13 introduktion Sida 86 Uppdaterad 2012-10-25

Typomvandlingar Det finns funktioner som vid behov kan byta typ på data. Exempel: Funktioner Typ real int->real (från heltal till flyttal) round real->int (från flyttal till heltal, avrundat) trunc real->int (samma, men decimaler kastas) str char->string (från tecken till sträng) ord char->int (från tecken till teckenkod) chr int->char (från teckenkod till tecken) Int.toString int->string (från heltal till sträng) trunc 4.7 > 4 ord #"1" > 49 Int.toString 42 > "42" PKD 2012/13 introduktion Sida 87 Uppdaterad 2012-10-25

Teckenkodning Det finns ingen bestämd teckenkodning för ML utan det beror på dator, operativsystem och inställningar! Vid användning av ord och chr måste man alltså vara försiktig om programmet skall vara portabelt (dvs gå att flytta till annan dator). Om ni kan välja, så använd standardkodningen ISO 8859-1 (en utökning av den vanliga äldre koden ASCII American Standard Code for Information Interchange). Den används av de flesta Unixsystem samt är standardkodning på World Wide Web. Datorer med Apple MacOS och Microsoft Windows kan använda egna teckenkodningar som också bygger på ASCII. En modern kodning är UTF-8. Den kan ge problem vissa skrivtecken (t.ex. ö ) representeras som flera tecken i en sträng! PKD 2012/13 introduktion Sida 88 Uppdaterad 2012-10-25