Intro. Vad är en monad?
|
|
- Erika Andersson
- för 7 år sedan
- Visningar:
Transkript
1 Intro Eftersom Haskell är ett funktionellt språk utan sido effekter så kan man argumentera om IO borde vara möjligt alls, men om vi struntar i det så länge så återstår det fortfarande ett stort problem: Haskell är ett rent och väldigt lat språk! Detta innebär att ett funktionsanrop alltid kommer returnera samma värde för ett visst set med parametrar. Så om vi t.ex. skulle försöka anropa getchar flera gånger med en viss parameter så kommer vi alltid få tillbaka samma karaktär. Och även om vi skulle haft dynamiska returvärden så finns det ingen garanti att vi skulle få tillbaka dem i rätt ordning. Hur skall man då lösa dessa problem på ett sätt som innebär att man inte förstör Haskell på något vis och ändå kan kalla det för ett funktionellt språk utan sido effekter? Svaret kommer i formen av en monad. Vad är en monad? Enkelt uttryckt så är en monad en del av ett program där allt man gör behandlas utifrån ett regelvärk definierat av monaden ( My sandbox, my rules ). I fallet för IO så definierar Haskells IO monad nya regler och beteenden som gör det möjligt att kringgå faktumet att Haskell är rent, saknar sido effekter och ser även till att allting returneras i rätt ordning. För att få en förståelse hur detta går till så kan vi ta en titt på följande exempel: Vi definierar funktionen getchar och get2chars som följer: getchar :: Char get2chars = [getchar,getchar] Om vi skulle anropa get2chars i Haskell som vanligt så skulle Haskell, som det lata språket det är, använda samma returvärde för båda getchar anropen. Skulle det inte göra det så kan vi ändå inte veta i vilken ordning de skulle anropas. Denna definition är alltså inte tillräcklig! Vi försöker på nytt och omdefinierar funktionerna som: getchar :: Int > Char get2chars :: Int > String get2chars _ = [getchar 1, getchar 2] Vi ger funktionerna fake parametrar i form av heltal som vi inte bryr oss om då vi inte kommer använda dem, de gör ingen skillnad för oss helt enkelt. Detta innebär dock för Haskell att båda getchar funktionerna måste anropas eftersom de har olika parametrar. Dock så vet Haskell fortfarande inte exakt i vilken ordning som getchar skall anropas, vi skriver om getchar som: getchar :: Int > (Char, Int)
2 Vi introducerar ännu ett returvärde i form av ett heltal som vi inte bryr oss om, vi använder sedan detta värde och skickar in det som en parameter till nästa getchar anrop. På så vis måste Haskell utvärdera det första anropet först eftersom det andra anropet beror på ett returvärde från det första, ett anrop skulle nu alltså se ut såhär: get2chars _ = [a,b] where (a,i) = getchar 1 (b,_) = getchar i Vi är dock inte ute ur skogen än så att säga, Haskell kompilatorn är så pass smart att den inte kommer tro på oss då vi säger att fake parametern till get2chars är viktig eftersom vi inte bryr oss om den (se _ ). Detta leder till att Haskell också kommer bortse från fake parameterarna i getchar anropen och köra dem i den ordning den anser bäst. Vi löser detta genom att skicka get2chars fake parameter till getchar anropen, vilket leder till ett anrop som ser ut som följer: get2chars i0 = [a,b] where (a,i1) = getchar i0 (b,i2) = getchar i1 Vi har nu ett (fake)databeroende genom hela anropet som garanterar att alla anrop kommer köras i den ordning vi vill. Dock så lider get2chars av samma problem som getchar gjorde från början, dvs. att vi inte kan garantera att ordningen den anropas i är rätt. Om vi t.ex. skulle definiera en get4chars funktion som: get4chars = [get2chars 1, get2chars 2] Så skulle Haskell inte ha någon aning om i vilken ordning de skulle köras. Men detta löser vi på exakt samma vis som med getchars, vi lägger till ett extra returvärde som vi inte bryr oss om. Definitionen av get2chars blir då: get2chars :: Int > (String, Int) Frågan blir då vad get2chars skall returnera för heltal? Enkelt, vi tar det heltalet som det sista getchar anropet returnerar (som vi ändå inte bryr oss om). Det slutgiltiga anropet blir då: get2chars i0 = ([a,b], i2) where (a,i1) = getchar i0 (b,i2) = getchar i1 I verkligheten så passeras dock inte dessa heltal runt utan Haskell använder sig av ett objekt av typen RealWorld som den passar runt i alla IO funktioner. Alltså ser ovan skrivna exempel egentligen ut som följer: get2chars world0 = ([a,b], i2) where (a,world1) = getchar world0 (b,world2) = getchar world1
3 Alla IO funktioner tar alltså in ett objekt av typen RealWorld och returnerar sedan sitt beräknade värde och en möjligtvis förändrad RealWorld. Sedan så är Haskells main funktion definierad som: main :: RealWorld > ((), RealWorld) Vilket innebär att man redan där definierar det första RealWorld objektet som sedan kommer passeras vidare till alla IO funktioner. Och det enligt detta tankesätt som hela Haskells IO monad är uppbygd! Vi har nu definierat ett sätt att anropa funktioner på som ger dynamiska returvärden och garanterar att alla anrop sker i rätt ordning. Detta ger oss de verktyg som krävs för att vi skall kunna utföra IO och begränsar dem till en monad så att renheten inte förstörs i resten av programmet. Begränsningen till en monad innebär också att Haskell i sig fortfarande är helt funktionellt och saknar sido effekter, monaden räknas som ett slags specialfall (se imperativt sub språk ). Att utföra IO Notation IO sker i funktionen main main :: IO () När man kompilerar ett haskell program så är det main som blir programmets ingång. Flera IO operationer kan kombineras med hjälp av do notation main = do iofunc1 iofunc2 De kombinerade io funktionerna bildar då en ny IO operation. Det main returnerar, körs. Man kan referera till resultat från io operationer med hjälp av < notation: choice < getchar Notera att vi inte använder let, då vi vill lagra resultatet av att köra funktionen en gång snarare än att sätta ett namn på ett distinkt värde IO kontexten (>>=) :: IO a > (a > IO b) > IO b (>>) :: IO a > IO b > IO b Exempel: main = getline >>= putstrln main = (putstrln What is your name? ) >> getline >>= putstrln
4 getline och putstrln är ihopsträngade. Det är såhär haskell binder ihop IO actions under huven så att de körs i ordning (t.ex. do notation) Användbara funktioner Grundläggande för att prata med stdinout putchar :: Char :: IO () putstr :: String :: IO () putstrln :: String :: IO () getchar :: IO Char getline :: IO String Man referera till all standard input samtidigt med hjälp av getcontents :: IO String Att läsa från stdin, transformera och skriva ut på stdout är så vanligt att det finns en inbyggt funktion för det: interact :: (String > String) > IO () Man passar alltså in en transformerande funktion, och så tar interact om inläsning och output. Ex: main = interact (map toupper) Gissa vad programmet gör? Funktioner för filhantering openfile :: FilePath > IOMode > Handle hclose :: Handle > IO () hputstr :: Handle > String > IO () hgetline :: Handle > IO String hgetcontents :: Handle > IO String etc Shortcuts readfile :: FilePath > IO String writefile :: FilePath > String > IO () withfile :: FilePath > IOMode > (Handle > IO r) > IO r Fler funktioner finns i System.IO på hackage. Kolla även in monadiska operationer som form, mapm, sequence m.fl. i Control.Monad Separation av pure och impure
5 Eftersom all IO utgår från main, och alla funktioner som gör IO måste ha det i sin typdeklaration, så är det lätt att spåra vilka funktioner som är orena och vilka som är rena. Resultatet blir en naturlig separation mellan de rena och orena delarna av programmet. Exempelprogram formatering För att tydligare illustrera hur man utför IO i Haskell har vi här ett exempelprogram som tar in en textfil och formaterar om den. cat tomten.txt Midvinternattens köld är hård, stjärnorna gnistra och glimma. Alla sova i enslig gård djupt under midnattstimma. Månen vandrar sin tysta ban, snön lyser vit på fur och gran, snön lyser vit på taken. Endast tomten är vaken. Ovan har vi en textfil som vi vill läsa in i ett program och modifiera. Vi tycker inte att den är så fint formaterad utan vill gärna sätta in lite radbrytningar så man lättare kan se att det är en dikt det rör sig om. För att göra detta skriver vi följande program: readfile import System.IO main = do putstr "\ntext file to format and print: " hflush stdout fname < getline handle < openfile fname ReadMode contents < hgetcontents handle putstr ("\n\n" ++ newlines contents ++ "\n") hclose handle newlines :: [Char] > [Char] newlines [] = [] newlines [x] = [x] newlines (x:y:xs) (x:y:[] == ", " x:y:[] == ". " x:y:[] == "? " x:y:[] == "! ") = x : '\n' : (newlines xs) otherwise = x : (newlines (y:xs)) Vad gör då detta program kan man fråga sig? Jo, det frågar efter namnet på en textfil som det
6 senare öppnar för inläsning. Inläsningen sker genom att binda ett handle (en referens) till filströmmen med openfile. Därifrån plockas vi ut innehållet i vårt handle med hgetcontents. Därefter skriver vi ut texten efter att den har behandlats med vår funktion newlines. Resultatet av att applicera newlines på våran text är att vi för varje förekomst av interpunktion följt av ett mellanslag byter ut blanksteget mot en newline istället../readfile Text file to format and print: tomten.txt Midvinternattens köld är hård, stjärnorna gnistra och glimma. Alla sova i enslig gård djupt under midnattstimma. Månen vandrar sin tysta ban, snön lyser vit på fur och gran, snön lyser vit på taken. Endast tomten är vaken. Ovan: resulterande utskrift. Sen är det kanske inte mest praktiskt att bara skriva ut texten till stdout, eller för den delen läsa in från en fil angiven från stdin. Vi kan istället välja att dirigera om input och output antingen med något av nedanstående unix kommandon: eller cat tomten.txt./insertnewlines >> nyatomten.txt cat tomten.txt runhaskell insertnewlines.hs >> nyatomten.txt om vi skriver om programmet som nedan: insertnewlines Takes the content given and formats and prints it. Formatting is done by replacing the white space with a newline after a comma, period, question mark or exclamation mark import System.IO main = do contents < getcontents putstr ("\n" ++ newlines contents ++ "\n") newlines :: [Char] > [Char] newlines [] = [] newlines [x] = [x] newlines (x:y:xs)
7 (x:y:[] == ", " x:y:[] == ". " x:y:[] == "? " x:y:[] == "! ") (x:y:[] == ": " x:y:[] == "; ") = x : '\n' : (newlines xs) otherwise = x : (newlines (y:xs)) Ett mer kompakt alternativ till att använda openfile är withfile som har följande typsignatur: withfile :: FilePath > IOMode > (Handle > IO a) > IO a Med andra ord så tar den en sökväg till en fil, ett IOMode som är en parameter för hur filen ska öppnas (exempelvis ReadMode för att läsa filen, WriteMode för att skriva till filen et.c.) samt en funktion som tar ett handle och ger en IO handling som sedan utförs. Detta ger ett väldigt kompakt syntax och låter oss använda lambda funktioner. I det första givna programexemplet skulle vi genom att använda oss av withfile kunna byta ut följande rader kod: fname < getline handle < openfile fname ReadMode contents < hgetcontents handle putstr ("\n\n" ++ newlines contents ++ "\n") hclose handle mot detta lite tydligare exempel: fname < getline withfile fname ReadMode (\handle > do contents < hgetcontents handle putstr ( \n\n ++ newlines contents ++ \n ) Vilken version man föredrar är lite av en smakfråga, men båda finns att tillgå i språket. När saker går fel Exceptions I/O monaden kan lite slarvigt ses som ett imperativt underspråk till Haskell som tillåter oss att göra saker som vi annars inte får. Det man dock bör komma ihåg är att vi är normalt sett förbjudna att göra dessa saker i normal kontext av en anledning; de kan ge oväntade resultat, helt emot en av de funktionella språkens huvudprinciper. Väl är det att vi har metoder att hantera dessa problem i Haskell, mest klarspråkigt genom exceptions liknande de i objektorienterade språk såsom Java och C++. Dessa kan vi
8 använda oss av med diverse konstruktioner, utav vilka catch från modulen Control.Exception är den enklaste, men långt ifrån den enda. Nedan har vi ett kort exempel på syntax för catch: main = catch tryme catcher tryme :: IO () tryme = do someio catcher :: IOError > IO () catcher e = putstrln Här gick något snett! Typsignaturen för catch är som följer: catch :: IO a > (IOError > IO a) > IO a I exemplet ovan ser vi att catch tar två argument; det ena argumentet är en IO handling som kommer köras och det andra är en handler, en funktion som anropas med exceptionvärdet om ett sådant skulle uppstå i det första IO blocket. I detta exempel så skulle alla tänkbara exceptions att mönstermatchas till e, det vill säga oavsett vilket exception vi får ut ur tryme kommer vi få samma exceptionhantering, ett beteende som inte alltid är önskvärt. Vill man istället ha olika utskrifter för olika fel finns det andra funktioner än catch vi kan använda. Ett exempel på detta är catchjust, som har följande typsignatur: catchjust:: Exception e => (e > Maybe b) > IO a > (b > IO a) > IO a Skillnaden mellan de två olika funktionerna är att catchjust bara fångar vissa sorters exception. Vilka de är väljs med ett så kallat exception predikat, en funktion som ger de klausuler som ska uppfyllas för att just den handlern ska fånga vårat höjda exception. Nedan har vi ett exempel på ett exception predikat som en lambda funktion: catchjust (\e > if isdoesnotexisterrortype (ioegeterrortype e) then Just () else Nothing) (someio) (\_ > do hputstrln stderr ("Följande fil finns ej: " ++ show f) return "") Om exception predikatet i en catchjust inte matchar mot ett exception som höjs kan omslutande catchjust och catchblock fånga det och försöka sin egen mönstermatchning. Detta låter en ha övergripande catchblock för exceptions som ska hanteras likadant oavsett när i IO blocket de sker. Vill man då ha mer speciella beteenden för att hantera exceptions på enskilda ställen i koden kan man då bruka sig av specifika catchjust block.
9 För att vidare tydliggöra hur detta skulle fungera i verkligheten kan vi lägga till exception hantering i det tidigare givna kodexemplet för att läsa in en fil och manipulera innehållet. Vi vill särskilt hantera om användaren anger ett ogiltigt filnamn, men även fånga upp andra mer generella fel. Det skulle se ut på detta vis: insertnewlines Takes the content given and formats and prints it. Formatting is done by replacing the white space with a newline after a comma, period, question mark or exclamation mark import System.IO main = catch tryme catcher tryme :: IO () tryme = do fname < getline catchjust (\e > if isdoesnotexisterrortype (ioegeterrortype e) then Just () else Nothing) withfile fname ReadMode (\handle > do contents < hgetcontents handle putstr ( \n\n ++ newlines contents ++ \n )) (\_ > do hputstrln stderr ("Följande fil finns ej: " ++ show fname) return "") putstr ("\n" ++ newlines contents ++ "\n") catcher :: IOError > IO () catcher e = hputstrln stderr Filen fanns men något annat gick snett! newlines :: [Char] > [Char] newlines [] = [] newlines [x] = [x] newlines (x:y:xs) (x:y:[] == ", " x:y:[] == ". " x:y:[] == "? " x:y:[] == "! ") (x:y:[] == ": " x:y:[] == "; ") = x : '\n' : (newlines xs)
10 otherwise = x : (newlines (y:xs)) Om vi nu anropar programmet med ett felaktigt filnamn kommer vi få en särskilt anpassad utskrift för det fallet, medans andra exceptions hanteras generellt. Det anses god praxis att hantera specifika fel individuellt om man misstänker/vet att/var de kan uppstå och bara se generella catchers som en sista fallback. IORef När saker inte redan gick fel nog Vi använder oss som sagt av dessa exception hanterare för att IO kod inte är funktionellt ren. Ett av de mest grundläggande exempel på funktionell orenhet man skulle kunna tänka sig hade varit en variabel. I Haskell så har vi ju som tur är inga egentliga variabler, men vi har något liknande att tillgå genom språkets IO syntax, nämligen Data.IORef. Man kan se IORef som en variabel i ett annars variabellöst språk. Till skillnad från Haskells inbyggda uttryck är alltså typen IORef mutable, det vill säga vi kan ändra värdet på värdet lagrat under det namnet vi gett den. Om namnet är förvirrande hjälper det kanske att tänka sig IORef som en konstruktion att temporärt flytta data utanför programmets mer strikta uppbyggnad utan att behöva skriva till en extern resurs, exempelvis disk eller nätverksgränssnitt. Vi kommer åt den undangömda datan med funktioner snarlika de vi använder för att läsa från och skriva till andra IO objekt. Till exempel, för att skriva ett värde till, modifiera och sedan läsa från en IORef skulle man bruka följande syntax: writeioref myref Detta värde Kommer att försvinna writeioref myref Istället kommer detta värde ligga här myval < readioref myref myval kommer efter dessa handlingar innehålla den andra strängen. Lägg märke till att om man väljer att använda sig av IORef måste särskilda åtgärder vidtas för att göra ens applikation trådsäker. Dessa finns väl dokumenterade på annat håll och kommer ej tas upp här, då vi mest nämnt IORef som kuriosa, försök helst att finna lösningar ej innehållandes IORef då riskerna med att använda typen sällan bör anses vara värda mödan att hantera. Man får förstås dessutom bara använda sig av typen i main på grund av dess icke funktionella natur. Vi avrundar vår rapport om IO i Haskell med de rekommendationer vi kommit fram till under rapportens gång; använd oförutsägbar kod i låg utsträckning om möjligt, hantera gärna specifika fel och introducera inte osäkra konstruktioner i er kod i onödan!
Senast. Idag. Icke-strikt evaluering. Strikt evaluering. Testa latheten! Lat evaluering. Plus och minus med lat evaluering. Testa latheten!
Senast Idag Högre ordningens funktioner Listomfattning Strikthet och lat evaluering Strömmar Monadisk I/O Strikt evaluering Icke-strikt evaluering Def: Strikt evaluering innebär att alla parametrars värde
Läs merDD1361 Programmeringsparadigm. Carina Edlund
DD1361 Programmeringsparadigm Carina Edlund carina@nada.kth.se Funktionell programmering Grundidéen med funktionell programmering är att härma matematiken och dess funktionsbegrepp. Matematiskt funktionsbegrepp
Läs merLambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017
Lambdas (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017 Funktioner En funktion (i programmeringstermer) är en operation som tar ett eller flera argument,
Läs merSpråket Python - Del 2 Grundkurs i programmering med Python
Hösten 2009 Dagens lektion Funktioner Filhantering Felhantering 2 Funktioner 3 FUNKTIONER Att dela upp program Att dela upp program i mindre delar, funktioner är ett viktigt koncept i programmering. Viktigt
Läs merMetoder (funktioner) Murach s: kap Winstrand Development
(funktioner) Murach s: kap 6 2013-01-23 1 Winstrand Development Metoder I C# kan vi dela in koden i block en kodsekvens ska köras likadant på flera ställen i applikationen. Detta block kallas för en metod
Läs merUppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:
Att skapa en klass kvadrat Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här: public class Kvadrat { private int sida; Det var väl inte
Läs merAtt skriva till och läsa från terminalfönstret
Att skriva till och läsa från terminalfönstret Oftast används grafiska komponenter i Java för att kommunicera med användaren (användargränssnitt), men det finns objekt i standardbiblioteken för de tillfällen
Läs merJohan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen
Tentamen för teknisk kemi, 10p, moment 1 29 november 1999 Skrivtid 9-15 Hjälpmedel: av följande böcker. - U. Bilting och J. Skansholm: Vägen till C - A. Kelley & I. Pohl: A Book on C Maxpoäng: Gräns för
Läs merProgrammering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p
Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p Skriven av Michael Andersson Introduktion Programmering I högnivåspråk fokuserar på själv problemet (algoritmen) istället
Läs merUniversitetet i Linköping Institutionen för datavetenskap Anders Haraldsson
1 2 - Block, räckvidd Dagens föreläsning Programmering i Lisp - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning - Felhantering (kap 17) icke-normala återhopp catch
Läs merCommand line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016
Command line argumenter Objektorienterad Programmering (TDDC77) Föreläsning VI: eclipse, felsökning, felhantering Ahmed Rezine IDA, Linköpings Universitet Hösttermin 2016 /* Cla. java * Programmet illustrerar
Läs merObjektorienterad Programmering (TDDC77)
Objektorienterad Programmering (TDDC77) Föreläsning VI: eclipse, felsökning, felhantering Ahmed Rezine IDA, Linköpings Universitet Hösttermin 2016 Outline Felhantering Eclipse Felsökning Command line argumenter
Läs merVälkomna till DIT012 IPGO. Tyvärr en bug i Google Docs: Sidnummer stämmer inte alltid. Alla anteckningar börjar på sidan 1.
Välkomna till DIT012 IPGO 1 Tyvärr en bug i Google Docs: Sidnummer stämmer inte alltid. Alla anteckningar börjar på sidan 1. Lärare och Handledare Kursansvariga, examinatorer, föreläsare och handledare
Läs merAtt deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)
Föreläsning 10 STRING OCH STRINGBUILDER; VARIABLERS SYNLIGHET Att deklarera och att använda variabler När vi deklarerar en variabel, t ex int x; inför vi en ny variabel med ett namn och en typ. När namnet
Läs merIntroduktion till Haskell
Introduktion till Haskell Elias Riedel Gårding NMA11, Teknisk Fysik (KTH) 2014 18 februari 2018 Elias Riedel Gårding (NMA11, F14) Introduktion till Haskell 18 februari 2018 1 / 29 Om Haskell Historik 1927:
Läs merProgrammeringsteknik med C och Matlab
Programmeringsteknik med C och Matlab Kapitel 2: C-programmeringens grunder Henrik Björklund Umeå universitet Björklund (UmU) Programmeringsteknik 1 / 32 Mer organisatoriskt Imorgon: Datorintro i lab Logga
Läs merDagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning
1 Dagens föreläsning Programmering i Lisp - Block, räckvidd - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning - Felhantering (kap 17) icke-normala återhopp catch
Läs merDeklarationer/definitioner/specifikationer
Deklarationer/definitioner/specifikationer Konstantdefinitioner innebär att ett namn binds och sätts att referera till ett värde som beräknas vid kompileringen/interpreteringen och som under programmets
Läs merLite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.
Institutionen för Datavetenskap Göteborgs universitet HT2009 DIT011 Objektorienterad programvaruutveckling GU (DIT011) Föreläsning 3 Innehåll Lite om felhantering och Exceptions Mer om variabler och parametrar
Läs merIntroduktion till programmering SMD180. Föreläsning 3: Funktioner
Introduktion till programmering Föreläsning 3: Funktioner 1 1 Mer matematik Vi har sett matematiska uttryck med variabler, värden och operatorer, ex: 17+n pi/2 hours*60+minutes Kan man även skriva uttryck
Läs merObjektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6
Laboration 2 Objektorienterad programmering i Java I Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6 Syfte: Att kunna använda sig av olika villkors- och kontrollflödeskonstruktioner
Läs merSträngar. Strängar (forts.)
Strängar En sträng i C är helt enkelt en array av char: char namn[20]; För att få strängar att bete sig som om de vore av dynamisk längd markeras strängens slut med null-tecknet \0 : J o z e f S w i a
Läs merIntroduktion till programmering. Programspråk och paradigmer
Introduktion till programmering Programspråk och paradigmer Vad är ett programspråk? Aprogramming languageis a formal constructedlanguagedesigned to communicate instructions to a machine, particularly
Läs merSätt att skriva ut binärträd
Tilpro Övning 3 På programmet idag: Genomgång av Hemtalet samt rättning Begreppet Stabil sortering Hur man kodar olika sorteringsvilkor Inkapsling av data Länkade listor Användning av stackar och köer
Läs merStatic vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016
Static vs Dynamic binding Polymorfism Objekt-orienterad programmering och design Alex Gerdes, 2016 Diagnostiskt prov Shape + overlaps(shape): int return 1; Shape shape = new Shape(); Polygon tripoly =
Läs merC++ - En introduktion
C++ - En introduktion De imperativa grunderna för dig som kan programmera Eric Elfving Institutionen för datavetenskap 1 / 72 Översikt 1 Grunderna 2 Uttryck och satser 3 Funktioner 4 Poster 1 Grunderna
Läs merTDIU01 - Programmering i C++, grundkurs
TDIU01 - Programmering i C++, grundkurs Sammanfattning period 1 Eric Elfving Institutionen för datavetenskap 1 oktober 2013 Översikt Ett C++-programs uppbyggnad Variabler Datatyper Satser Uttryck Funktioner
Läs merTUTORIAL: KLASSER & OBJEKT
TUTORIAL: KLASSER & OBJEKT I denna tutorial lär vi oss att använda klasser och objekt samt hur vi bygger en enkel applikation kring dessa. I tutorialen kommer det finnas en mängd kod som du antingen kan
Läs merFöreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt
Föreläsning 2 Programmeringsteknik och C DD1316 Mikael Djurfeldt Föreläsning 2 Programmeringsteknik och C Python introduktion Utskrift Inläsning Variabler Datatyp Aritmetiska operatorer Omvandling
Läs merObjektorienterad programmering D2
Objektorienterad programmering D2 Laboration nr 2. Syfte Att få förståelse för de grundläggande objektorienterade begreppen. Redovisning Källkoden för uppgifterna skall skickas in via Fire. För senaste
Läs merProgrammering I Tobias Wrigstad fredag, 2009 augusti 28
Programmering I Tobias Wrigstad tobias@dsv.su.se Vad är programmering? Lågnivåspråk och högnivåspråk Kompilering och interpretering Variabler Notation för flödesschema (flow chart) Kontrollstrukturer (conditionals,
Läs merLÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p
UMEÅ UNIVERSITET Datavetenskap 010530 LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p Betygsgränser 3 21,5-27 4 27,5-33,5 5 34-43 Uppgift 1. (4p) Hitta de fel som finns i nedanstående klass (det
Läs merStatic vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018
Static vs Dynamic binding Polymorfism Objekt-orienterad programmering och design (DIT95) Niklas Broberg, 2018 Diagnostiskt prov Shape + overlaps(shape): int return 1; Shape shape = new Shape(); Polygon
Läs merKompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering
Föreläsning 1 Objektorienterad programmering DD1332 Introduktion till Java Kompilering, exekvering, variabler, styrstrukturer Kompilering och exekvering Ett program måste översättas till datorns språk
Läs merPlatser för att skriva och testa kod online. Workshop om programmering i matematikkurser, version 0.7 senast sparat
Cheat sheets Nedan finns referensblad för fyra olika programmeringsspråk, som kan bli aktuella att använda i matematikundervisning. MATLAB är en välkänd programvara för att göra matematiska beräkningar,
Läs merPython. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.
är, som Scheme, ett interpreterat språk men det finns kompilatorer för. När man interpreterar ett språk tillhandahåller man en interpretator som läser sats för sats och försöker tolka den. När man kompilerar
Läs merLaboration 1: Figurer i hierarki
Laboration 1: Figurer i hierarki Bakgrund Två grundläggande tekniker i objektorienterad konstruktion är arv och komposition. Mål Laborationen har flera avsikter: 1. Ge kunskaper i hur program kan organiseras
Läs merDatalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs
Datalogi I, grundkurs med Java 10p, 2D4112, 2002-2003 Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera först talet 37 med 2. Använd heltalsdivision. Det ger kvoten
Läs merPython. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.
är, som Scheme, ett interpreterat språk men det finns kompilatorer för. När man interpreterar ett språk tillhandahåller man en interpretator som läser sats för sats och försöker tolka den. När man kompilerar
Läs merProgrammeringsteknik med C och Matlab
Programmeringsteknik med C och Matlab Kapitel 6: Filhantering Henrik Björklund Umeå universitet 13 oktober 2009 Björklund (UmU) Programmeringsteknik 13 oktober 2009 1 / 22 Textfiler Filer är sekvenser
Läs merFunktioner. Linda Mannila
Funktioner Linda Mannila 13.11.2007 Vad kan vi nu? Primitiva datatyper Tal, strängar, booleska värden Samlingsdatatyp Listan Utskrift Indata Felhantering Intro till funktioner och moduler Villkorssatsen
Läs merProgrammeringsteknik och Matlab. Dagens program. Viktiga datum. Repetitionsexempel. Repetition av if/else, for, while och Scanner
Programmeringsteknik och Matlab Övning 3 Dagens program Övningsgrupp 2 (Sal Q22/E32) Johannes Hjorth hjorth@nada.kth.se Rum 4538 på plan 5 i D-huset 08-790 69 02 Kurshemsida: http://www.nada.kth.se/kurser/kth/2d1312
Läs merTentamen FYTA11 Javaprogrammering
Lunds universitet FYTA11 Institutionen för Astronomi och Teoretisk fysik HT 12 Tentamen FYTA11 Javaprogrammering Onsdag 9 januari 2013, 10:15 14:15 Instruktioner Hjälpmedel: Papper och penna. Behandla
Läs merBackcode. Jonathan Crusoe TDP019 Projekt: Datorspråk Linköpings universitet
Žƒ ƒ Ž Ž ˆ ƒ ƒ ƒ Žƒ ƒ Ž ˆ Œ ŽŽ ƒ Backcode Jonathan Crusoe TDP019 Projekt: Datorspråk Linköpings universitet Innehållsförteckning 12-05-29 Inledning... 3 Användarhandledningen... 4 Klasser... 4 Metoder...
Läs merÖvning från förra gången: readword
(9 september 2010 T4.1 ) Övning från förra gången: readword /** readword.c * * int readword(char w[], int n) { * * Läser tecken tills en bokstav påträffas. * Läser och lagrar sedan högst n-1 bokstäver
Läs merFöreläsnings 9 - Exceptions, I/O
Föreläsnings 9 - Exceptions, I/O Josef Svenningsson Tisdag 6/11 Undantag - Exceptions Kommer ni ihåg det här programmet? Det var ett av de första ni såg i första föreläsningen. import javax.swing.*; public
Läs merJAVA Mer om klasser och objektorientering
JAVA Mer om klasser och objektorientering Begreppet package - paket Package används när man t ex vill skapa ett eget bibliotek med klasser. Sen är det då meningen att man ska importera detta paket i det
Läs merLite mer om Javas stöd för fält. Programmering. Exempel: vad är det största talet? hh.se/db2004. Fält samt Input/Output
Programmering hh.se/db2004 Föreläsning 5: Fält samt Input/Output Verónica Gaspes www2.hh.se/staff/vero www2.hh.se/staff/vero/programmering Lite mer om Javas stöd för fält Hur många element har ett fält?
Läs merIntroduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion
Introduktion till programmering Föreläsning 4: Villkor och rekursion 1 1 Några inbyggda funktioner (med resultat!) Konverterar mellan de grundläggande typerna: >>> int("32") 32 >>> int(3.999) 3 >>> float(32)
Läs merObjektorienterad programmering i Java I
Laboration 4 Objektorienterad programmering i Java I Uppgifter: 1 Beräknad tid: 6 9 timmar Att läsa: Kapitel 7, 8 (stränghantering, arrayer och Vector) Utdelat material (paket) Syfte: Att kunna använda
Läs merFöreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen
Föreläsning 2 Programmeringsteknik och Matlab DD1312 Introduktion till python Variabler,datatyper, omvandling av typer sfunktioner Två olika typer av program omvandlar högnivå till lågnivå program: Interpreterande
Läs merFunktionell programmering DD1361
Funktionell programmering DD1361 Tupler Två eller fler (men ändligt) antal element. Elementen kan vara av olika typer. Ex: (1,2) :: (Integer, Integer) (( 2, hejsan ), True) ::? Tupel med två element ->
Läs merObjektorienterad Programmering (TDDC77)
Objektorienterad Programmering (TDDC77) Föreläsning II: utmatning, variabler, typer Ahmed Rezine IDA, Linköpings Universitet Hösttermin 2016 Kompilera och köra programmet under terminal 2: I Skapa Hej.java
Läs merRekursion och induktion för algoritmkonstruktion
Informationsteknologi Tom Smedsaas, Malin Källén 20 mars 2016 Rekursion och induktion för algoritmkonstruktion Att lösa ett problem rekursivt innebär att man uttrycker lösningen i termer av samma typ av
Läs merI Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program
Kompilera och köra programmet Objektorienterad Programmering (TDDC77) Föreläsning II: utmatning, variabler, typer Ahmed Rezine IDA, Linköpings Universitet Hösttermin 2016 under terminal 2: I Skapa Hej.java
Läs merTentamen i Introduktion till programmering
Tentamen i Introduktion till programmering Kurskod: Skrivtid: D0009E 09:00-13:00 (4 timmar) Totalt antal uppgifter: 7 Totalt antal poäng: 38 Tentamensdatum: 2014-05-17 Jourhavande lärare: Tillåtna hjälpmedel:
Läs merObjektorienterad programmering i Java
Objektorienterad programmering i Java Föreläsning 4 Täcker i stort sett kapitel 6 i kursboken Java Software Solutions 1 Läsanvisningar Den här föreläsningen är uppbyggd som en fortsättning av exemplet
Läs merSTRÄNGAR DATATYPEN. Om du vill baka in variabler eller escape-tecken måste du använda dubbla citattecken. strängar
STRÄNGAR En av de mest avancerade av de normala datatyperna är. Här skall vi grundläggande gå igenom hur den datatypen fungerar och vidare flertalet funktioner som hör till datatypen. Låt oss kasta oss
Läs merIntroduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner
Introduktion till programmering D0009E Föreläsning 5: Fruktbara funktioner 1 Retur-värden Funktioner kan både orsaka en effekt och returnera ett resultat. Hittills har vi ej definierat några egna funktioner
Läs merTentamen OOP 2015-03-14
Tentamen OOP 2015-03-14 Anvisningar Fråga 1 och 2 besvaras på det särskilt utdelade formuläret. Du får gärna skriva på bägge sidorna av svarsbladen, men påbörja varje uppgift på ett nytt blad. Vid inlämning
Läs merTDP002 - Imperativ programmering
TDP002 - Imperativ programmering Underprogram Pontus Haglund Institutionen för datavetenskap Anpassatt från material ursprungligen av: Eric Elfving 1 Underprogram Parametrar Returvärden Räckvidd och skuggning
Läs mer2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik
2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det riktiga provet tar 45 minuter (en lektionstimme) och det
Läs merBankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.
Bankkonto - övning Övningar att göra efter lärardemostration. Filen bankkonto.zip innehåller ett projekt med klassen Bankkonto. Zippa upp denna fil och öppna projektet i BlueJ och skriv vidare på klassen
Läs merGPT föreläsning 8. Förra veckan: Man kan ta tiden på en sorterad teckensträng Förra gången: Problemlösning på lägre nivå kan sortera funktioner
GPT föreläsning 8 Förra veckan: Man kan ta tiden på en sorterad teckensträng Förra gången: Problemlösning på lägre nivå kan sortera funktioner Denna gång Reflektioner kring OU1 Funktioner Reflektioner
Läs merFöreläsning 5: Introduktion av pekare
Föreläsning 5: Introduktion av pekare Det bör påpekas att det som tas upp i introduktionen inte är reella exempel på kod. Man anväder inte pekare till att peka på enstaka heltal som i exemplen nedan, men
Läs merFöreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen
Föreläsning 2 Programmeringsteknik och Matlab DD1312 Introduktion till python Variabler, datatyper, omvandling av typer sfunktioner Två olika typer av program omvandlar högnivå till lågnivå program: Interpreterande
Läs merJavaScript del 5 Funktioner
JavaScript del 5 Funktioner När man skriver JavaScriptkod eller program i andra programmeringsspråk för den delen så kan det finnas anledningar till att man vill dela upp sitt stora program i flera mindre
Läs merIntroduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser
Introduktion till programmering Föreläsning 2: Variabler, uttryck och satser 1 1 Värden De grundläggande saker som en dator manipulerar resultaten av beräkningar kallas värden Värden vi stött på: 2 och
Läs merIdag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.
Idag Javas datatyper, arrayer, referenssemantik Klasser Arv, polymorfi, typregler, typkonvertering Strängar Tänker inte säga nåt om det som är likadant som i C. Objectorienterad programmering Sida 1 Ett
Läs merTentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34
Tentamen Datalogi I, grundkurs med Java 10p, 2D4112, 2002-2003 Lördagen den 30 november 2002 kl 9.00 14.00, salar E33, E34 Inga hjälpmedel 30 poäng ger säkert godkänt, 40 poäng ger betyg 4 50 poäng ger
Läs merObjektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11
Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11 Undantag Engelska: exceptions Skansholm: exceptionella händelser Fel som genereras om man försöker
Läs merProgrammera i C Varför programmera i C när det finns språk som Simula och Pascal??
Programmera i C Varför programmera i C när det finns språk som Simula och Pascal?? C är ett språk på relativt låg nivå vilket gör det möjligt att konstruera effektiva kompilatorer, samt att komma nära
Läs merMetoder. Inledande programmering med C# (1DV402)
Metoder Upphovsrätt för detta verk Detta verk är framtaget i anslutning till kursen Inledande programmering med C# vid Linnéuniversitetet. Du får använda detta verk så här: Allt innehåll i detta verk av
Läs merDagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?
Programmeringsteknik och Matlab Övning 4 Dagens program Övningsgrupp 2 (Sal Q22/E32) Johannes Hjorth hjorth@nada.kth.se Rum 4538 på plan 5 i D-huset 08-790 69 02 Kurshemsida: http://www.nada.kth.se/kurser/kth/2d1312
Läs merTDIU01 - Programmering i C++, grundkurs
TDIU01 - Programmering i C++, grundkurs Grundläggande satser och uttryck Eric Elfving Institutionen för datavetenskap 5 augusti 2014 Översikt Uttryck Litteraler Operatorer Satser Villkor Upprepning Teckenhantering
Läs merGrundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2
AID-nummer: Datum: 2014-12-18 Kurskod: 725G61 Provkod: LAB1 Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2 Skrivningstid: 2014-12-18 klockan 8.00-10.00. Hjälpmedel: Inga. För varje fråga
Läs merOmgivningar. Omgivningar är viktiga eftersom de avgör vilka namn som är synliga och därmed dessas innebörd och de värden som är förknippade med dem.
Omgivningar Omgivningar är viktiga eftersom de avgör vilka namn som är synliga och därmed dessas innebörd och de värden som är förknippade med dem. (define (sqrroot c) (define (fixpoint guess c eps) (define
Läs mer732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning
Varför? 732G11 Linköpings universitet 2011-02-08 Varför? 1 2 3 Varför? 4 5 Medelvärde av 5000 tal Varför? while-loopen int nrofints = 5000; int [] integers = new int [ nrofints ]; int pos = 0; while (
Läs mer1 Comparator & Comparable
1 Comparator & Comparable 1.1 Implementation av Comparable Att implementera Comparable innebär att man gör objekt av sin klass jämförbara med andra och att det därmed antas existera en naturlig ordning
Läs merHI1024 Programmering, grundkurs TEN
HI1024 Programmering, grundkurs TEN2 2016-01-09 KTH STH Haninge 8.15-13.00 Tillåtna hjälpmedel: En A4 handskriven på ena sidan med egna anteckningar Kursboken C PROGRAMMING A Modern Approach K. N. King
Läs merÖvningsuppgifter kapitel 8
Inst. för Systemteknik Introduktion till programmering (SMD 180), 5 p Övningsuppgifter kapitel 8 1. Listor är en viktig datatyp i Python. Hur definierar kursboken lista? Vad kallas de värden som tillsammans
Läs merNågra inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.
Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E Föreläsning 4: Villkor och rekursion Konverterar mellan de grundläggande typerna: >>> int("") >>> int(.999) >>> float().0
Läs mer732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel
732G11 Linköpings universitet 2011-02-15 1 2 3 4 Extrapass Extrapass håller på att bokas. Blir 3-4 st. och öppet för alla. Mer info på kursmailen när bokningen är klar. i Java En funktion i Java... public
Läs merFöreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad
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
Läs merAdministrativt. Programmeringsteknik för I1. Dagens program. Objektorienterad programmering
Programmeringsteknik för I1 Övning 2 Administrativt Övningsgrupp 2 (Sal E32/D32) Johannes Hjorth hjorth@nada.kth.se Rum 4538 på plan 5 i D-huset 08-790 69 02 Kontrollera att ni har fått Lab2 inrapporterad
Läs merIdag. Exempel, version 2. Exempel, version 3. Ett lite större exempel
Idag Ett exempel Undantag Substitutierbarhet, subtyper, subklasser När val av metod beror av typerna hos två objekt Lite om överlagring Exempel, version 2 Notera: för samtliga figurer gäller: arean av
Läs merIntroduktion till arv
Introduktion till arv 6 INTRODUKTION TILL ARV Arv Generell-Speciell Arv för att utnyttja det vi redan gjort Återanvändning Basklass Härledd klass Varför arv? Inför en subklass för att uttrycka specialisering
Läs merTypkonvertering. Java versus C
Typer Objektorienterad programmering E Typkonvertering Typkonvertering Satser: while, for, if Objekt Föreläsning 2 Implicit konvertering Antag att vi i ett program deklarerat int n=3; double x = 5.2; Då
Läs merVem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.
Institutionen för Datavetenskap Göteborgs universitet HT2009 DIT011 Vem är vem på kursen Objektorienterad programvaruutveckling GU (DIT011) Kursansvarig : Katarina Blom, tel 772 10 60 Rum: 6126 (E-huset)
Läs merAlla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.
Att förstå variabler Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata. Vad är en variabel? En variabel är en plats att lagra information. Precis
Läs mer(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java
(Man brukar säga att) Java är... Denna föreläsning Allmänt om Java Javas datatyper, arrayer, referenssemantik Klasser Strängar enkelt baserat på C/C++ objekt-orienterat från början dynamiskt utbyggbart
Läs merExempelsamling Assemblerprogrammering
Exempelsamling Assemblerprogrammering I uppgifterna nedan utgå från följande programskelett: #include.data var1:.word 12 var2:.word 19 sum: prod:.float 0.set noreorder.text.globl start.ent start
Läs merPlanering Programmering grundkurs HI1024 HT TIDAA
Planering Programmering grundkurs HI1024 HT 2016 - TIDAA Föreläsning V35 Föreläsning 1 Programmering Kurs-PM Programmeringsmiljö Hello World! Variabler printf scanf Föreläsning 2 Operatorer Tilldelning
Läs merSpråket Python - Del 1 Grundkurs i programmering med Python
Hösten 2009 Dagens lektion Ett programmeringsspråks byggstenar Några inbyggda datatyper Styra instruktionsflödet Modulen sys 2 Ett programmeringsspråks byggstenar 3 ETT PROGRAMMERINGSSPRÅKS BYGGSTENAR
Läs merKlassdeklaration. Metoddeklaration. Parameteröverföring
Syntax: Class Declaration Modifier Class Body Basic Class Member Klassdeklaration class Class Member Field Declaration Constructor Declaration Method Declaration Identifier Class Associations Motsvarar
Läs merAnvändarhandledning Version 1.2
Användarhandledning Version 1.2 Innehåll Bakgrund... 2 Börja programmera i Xtat... 3 Allmänna tips... 3 Grunderna... 3 Kommentarer i språket... 4 Variabler... 4 Matematik... 5 Arrayer... 5 på skärmen...
Läs merAgenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då
Agenda Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer Övningar nu och då 1 Motivering I de flesta problem ingår att hantera multipla data I de
Läs merFöreläsning 6 pekare och pekare tillsammans med arrayer
Föreläsning 6 pekare och pekare tillsammans med arrayer Vi ska nu undersöka vad pekare egentligen är och hur de relaterar till arrayer. Det är ett centralt tema i C-programmering. Vi följer boken och går
Läs merFö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 10 Datalogi 1 DA2001 python introduktion Variabler Datatyp Aritmetiska operatorer av typer Reserverade ord logiska operatorer If-sats kommentarer på skärmen print( Hej ) print( Hur är det?
Läs merDatalogi för E Övning 3
Datalogi för E Övning 3 Mikael Huss hussm@nada.kth.se AlbaNova, Roslagstullsbacken 35 08-790 62 26 Kurshemsida: http://www.csc.kth.se/utbildning/kth/kurser/2d1343/datae06 Dagens program Att skapa egna
Läs mer