Funktioner, Procedurer och Parametrar. Funktioner, Procedurer och Parametrar... Funktioner, Procedurer och Parametrar procedurspecifikation

Relevanta dokument
Ordnad lista. Listor... Ordnad lista... Ordnad lista typer

GOTO och lägen. Några saker till och lite om snabbare sortering. GOTO och lägen (3) GOTO och lägen (2)

Några saker till och lite om snabbare sortering

Pascal. Vi har ofta behov av att behandla klumpar av data som i sig är inhomogena men sett över ett helt register har klumparna lika struktur.

Poster... Poster. Poster... Poster...

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

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

Poster. Vi har ofta behov av att behandla klumpar av data som i sig är inhomogena men sett över ett helt register har klumparna lika struktur.

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

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

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

Föreläsning 6: Introduktion av listor

Standardfilerna Input och Output

Standardfilerna Input och Output. Filer... Filer... vanlig utbyggnad för ökad dynamik. Filer... filtyper

Sökning och sortering. Sökning och sortering - definitioner. Sökning i oordnad lista. Sökning med vaktpost i oordnad lista

Kontinuerliga listor. Fält (listor) Kontinuerliga listor... Kontinuerliga listor...

Sökning och sortering

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.

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

Abstraktion. Abstraktion... Abstraktion... Abstraktion...

TDIU01 - Programmering i C++, grundkurs

Abstraktion. procedurabstraktion. DA2001 (Föreläsning 26) Datalogi 1 Hösten / 27

Repetition i Pascal. Exemplen fac. Exemplen fac i Pascal. Exemplen fac motivering. Orginalet

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

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

2D1310 Programmeringsteknik Tentamen (1p) lördag 29 april 2000 kl 14-17

Innehåll MySQL Intro. Allmänt om Lagrade Procedurer Enkel utformning Skapa en lagrad procedur Använda parameter som indata

Tentamen Grundläggande programmering

Uppgift 1 (grundläggande konstruktioner)

Uppgift 1a (Aktiekurser utan poster)

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

Variabler och konstanter

Funktionens deklaration

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

Introduktion till programmering SMD180. Föreläsning 3: Funktioner

Deklarationer/definitioner/specifikationer

Planering Programmering grundkurs HI1024 HT 2014

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 rik

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Programdesign. Dokumentera. Dokumentera

Uppgift 1 ( Betyg 3 uppgift )

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

Datalogi, grundkurs 1 Övningsuppgifter i Pascal. Serafim Dahl, Carina Edlund, Kjell Lindqvist m.fl.

Introduktion till MATLAB, med utgångspunkt från Ada

1 Funktioner och procedurell abstraktion

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning

Programdesign. minnesutrymme storlek på indata. DA2001 (Föreläsning 15) Datalogi 1 Hösten / 20

Exempel att testa. Stora problem och m-filer. Grundläggande programmering 4. Informationsteknologi. Informationsteknologi.

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Uppföljning till lektion 5 om pekare. Grundläggande symboler. En struct, en pekartyp och lite variabler

I dag: Blockstruktur, omgivningar, problemlösning

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson

Översikt över Visual Basic

Exempel på ett litet Ada-program

KOMPLETTERANDE HEMTENTAMEN TDDB53

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

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

TENTAMEN TDDB53. Programmering i Ada för MI (provkod TEN2) den 7 april 2010 kl Institutionen för datavetenskap, IDA Olle Willén mars 2010

TDIU01 - Programmering i C++, grundkurs

Grundläggande datalogi - Övning 1

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

OMTENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13: 15

Periodiska decimalbråk

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

Föreläsning 5: Introduktion av pekare

TDIU01 - Programmering i C++, grundkurs

HI1024 Programmering, grundkurs TEN

Introduktion till Jasmine 1.2 ODQL

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Du skall naturligtvis visa körexempel med output där det behövs i din rapport!

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

1 Texthantering. 1.1 Typen char. Exempel, skriv ut alfabetet

Föreläsning 4: Poster

F4. programmeringsteknik och Matlab

DD1361 Programmeringsparadigm. Carina Edlund

KOMPLETTERANDE HEMTENTAMEN TDDB53

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och...

Laboration 1 Introduktion till Visual Basic 6.0

F5: Högnivåprogrammering

Repetition i Python 3. Exemplen fac. Exemplen fac motivering. Exemplen fac i Python

Planering Programmering grundkurs HI1024 HT TIDAA

F5: Högnivåprogrammering

Polymorfi (många skepnader) är egentligen en mängd olika abstraktionsmekanismer och en indelning skulle kunna se ut så här: polymorfi

TUTORIAL: SAMLING & KONSOLL

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Paket (2) nautisk_mil : constant Float := * foot; ångström : constant Float := 10.0E-10; mile : constant Float := 5280.

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Det finns många flaggor till g++,

Programmering II (ID1019) :00-11:00

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 29 augusti 2015, kl 8 12

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

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

TENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13:15

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

Föreläsning 10. Pekare (Pointers)

Att använda pekare i. C-kod

Programmeringsteknik med C och Matlab

Transkript:

Funktioner, Procedurer och Parametrar I delar vi upp underprogram i två grupper : Funktioner: lämnar alltid ett värde som resultat Funktionsnamnet får ett värde i funktionen genom: funktionsnamn := expr; Anropet av funktionen gör att vi erhåller ett värde som alltid måste användas: t.ex. IF funcanrop = värde THEN variabel := funcanrop; Writeln(funcAnrop); Procedurer: lämnar inte något värde som resultat. (Bara bieffekter!) men kan fungera som en funktion som lämnar fler värden som resultat. Anropas genom ProcNamn(< lista av aktuella parametrar >); Parametrarna kan vara av två typer: Värdeparametrar som endast kan föra in värden till proceduren eller Referensparametrar som både kan föra in och ut värden till proceduren. Gäller även funktioner men man brukar aldrig använda referensparametrar i funktioner DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 1 / 21 DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 2 / 21 Funktioner, Procedurer och Parametrar funktionsspecifikation Funktioner, Procedurer och Parametrar procedurspecifikation FUNCTION funcnamn(par1, par2: typ1; ): uttyp; CONST TYPE VAR <satser>; funcnamn := expr ; <satser>; PROCEDURE procnamn(par1, par2: typ1; ); CONST TYPE VAR <satser>; OBS funcnamn := expr; kan finnas på fler ställen i funktionen!! DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 3 / 21 DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 4 / 21

Ex: PROCEDURE newsection(ch : Char; n: Integer); IF n = 0 THEN WriteLn ELSE Write(ch); newsection(ch, n-1); Om vi vill skapa ett underprogram som tar två värden och byter plats på dem: från till y x 3 5 y x 5 3 så kan vi inte använda en funktion utan måste vi använda en procedur! DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 5 / 21 DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 6 / 21 PROCEDURE swap(a, b: Integer); VAR tmp: Integer; tmp := a; a := b; b := tmp; Det fungerar inte eftersom a och b kommer att vara kopior av de aktuella parametrarna! Parametrar av detta slag kallas värdeparametrar. Man kan förhindra att värden kopieras genom att före en parameter skriva VAR. Detta gör att den anropande parameterns adress kopieras in i stället för dess värde. Parametrar av detta slag kallas referensparametrar. Programmet arbetar då med variabeln själv och inte en kopia. PROCEDURE swap(var a, b: Integer); VAR tmp:integer; tmp:=a; a:=b; b:= tmp; Nu fungerar det! Om man vill skriva ut tre tal i (fallande) storleksordning: DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 7 / 21 DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 8 / 21

Parametrar och globala variabler PROGRAM sortthree; VAR tal1, tal2, tal3: Integer; PROCEDURE swap(var a, b: Integer); VAR tmp:integer; tmp := a; a := b; b := tmp; PROCEDURE sort(var a, b, c: Integer); IF a < b THEN swap(a, b); IF a < c THEN swap(a, c); IF b < c THEN swap(b, c); Write( Ge tre tal: ); ReadLn(tal1, tal2, tal3); sort(tal1, tal2, tal3); WriteLn(tal1, tal2, tal3); END. Om en variabel inte finns deklarerad i den egna omgivningen så går man till närmaste yttre omgivning och letar. Detta betyder att om man glömmer att deklarera en variabel så riskerar man att påverka variabler i andra programdelar! Detta kallar vi bieffekter! Variabler som är deklarerade utanför det egna underprogrammet kallas globala variabler och de som är deklarerade i det egna underprogrammet kallas lokala (även parametrar) Ett exempel på användning av globala variabler och dess konsekvenser: DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 9 / 21 DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 10 / 21 PROGRAM tzt (input, output); PROCEDURE iterate; VAR i: Integer; PROCEDURE newsection (ch: char); newsection( * ); Writeln(i : 3, kub(i) : 10); IF i = 0 THEN WriteLn i := i - 1; ELSE IF i > 1 THEN iterate i := i - 1; END procedure iterate; Write(ch); newsection(ch) huvudprogram END i := 10; END procedure newsection; iterate; END. huvudprogram FUNCTION kub (x: Integer): Integer; kub := x * sqr(x) END function kub; Om man arbetar med globala storheter så är risken för fel stor!!! Ändra inte globala storheter. Måste de ändras så skicka dem som parametrar! I de listhanterare som definierades på tidigare föreläsningar kan vissa funktioner bytas mot procedurer för att få en mer naturlig användning, vilka? Alla de som bara påverkar listans inre struktur t.ex i den för enkellänkade sorterade listor create insert(l, e) delete(l, k) retrieve(l, k) empty(l) member(l, k) L i s t a D.v.s. insert och delete bör vara procedurer! DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 11 / 21 DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 12 / 21

PROCEDURE delete(l: listptr; key: keytype); VAR tmp : elementptr; PROCEDURE deleteelement(e: elementptr); IF e^.next <> NIL THEN IF equal(e^.next^.entry^.key, key) THEN tmp := e^.next; e^.next := tmp^.next; Dispose(tmp^.entry); Dispose(tmp) END ELSE IF lessthan(e^.next^.entry^.key, key) THEN deleteelement(e^.next) END deleteelement; delete IF NOT empty(l) THEN IF equal (L^.firstElement^.entry^.key, key) THEN tmp := L^.firstElement; L^.firstElement := tmp^.next; Dispose(tmp^.entry); Dispose(tmp) END ELSE deleteelement(l^.firstelement) END delete; DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 13 / 21 DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 14 / 21 Separatkompilering PROCEDURE insert(l: listptr; e: itemptr); VAR tmpptr: elementptr; PROCEDURE insertelement(var e: elementptr); IF e = nil THEN e := tmpptr ELSE IF NOT lessthan(e^.entry^.key, tmpptr^.entry^.key) THEN tmpptr^.next := e; e := tmpptr END ELSE insertelement(e^.next) END insertelement; insert NEW(tmpPtr); tmpptr^.next := nil; tmpptr^.entry := e; insertelement(l^.firstelement); IF tmpptr^.next = L^.firstElement THEN L^.firstElement := tmpptr END insert; För att kunna använda förut definierade programdelar finns i de flesta versioner möjlighet att inkludera separat kompilerade filer eller att textuellt inkludera moduler i det egna programmet. OBS! att detta inte är möjligt i standard! DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 15 / 21 DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 16 / 21

Exempel Kalkylatorn Vi kan dela upp detta program i tre delar: calc.p där själva huvudprogrammet ligger. commmand.p där alla funktioner och procedurer för att t.ex. hämta de kommandon vi ger till kalkylatorn finns. stack.p här finns alla funktioner och procedurer som vi behöver för en stack. Vi tittar lite närmare på command.p: module command interface; export command = (commandsequencepointer, commandsequencetype, commandpointer, commandtype, createcommandsequence, getcommand, putcommand, clearcommandsequence, emptycommandsequence); type commandpointer = ^commandtype; commandtype = record entry : char; next : commandpointer end; commandsequencepointer = ^commandsequencetype; commandsequencetype = record first, last : commandpointer end; DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 17 / 21 DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 18 / 21 function createcommandsequence: commandsequencepointer; function getcommand (cmd: commandsequencepointer): char; function putcommand (cmd: commandsequencepointer; acommand: char): commandsequencepointer; function clearcommandsequence (cmd: commandsequencepointer): commandsequencepointer; function emptycommandsequence (cmd: commandsequencepointer): boolean; end. module command implementation; import StandardInput; standardoutput; DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 19 / 21 DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 20 / 21

Den första satsen module command interface; talar om att allt det som finns fram till första end. är sådant som behövs för att det som står i nästa sats: export command = (commandsequencepointer, commandsequencetype, commandpointer, commandtype, createcommandsequence, getcommand, putcommand, clearcommandsequence, emptycommandsequence); skall kunna synas så att andra programdelar kan utnyttja det. Resten av filen, efter första end., innehåller de kompletta funktions- och procedurdeklarationerna. I implementationsdelen, som den andra delen kallas, kan man ha allt som går att ha i ett pascalprogram (men inte ett helt program). Det som definieras i denna del syns inte utåt. kompilera exempelvis med gpc -o kalk stack.p command.p calc.p och kör med kalk eller möjligen./kalk DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 20 / 21 DA2001 (Föreläsning 16) Datalogi 1 Hösten 2010 21 / 21