Programspråk uppkallat efter Blaise. Skapat av Nicolaus Wirt. Avsett för undervisning för att lära ut typbegreppet och styrstrukturer. Har fått stor spridning p.g.a. enkelhet och att kompilatorn varken kräver stort utrymme eller mycket tid. Programmen byggs upp av reserverade ord fördefinierade funktioner och procedurer egendefinierade funktioner, procedurer och objekt DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 1 / 25
... är ett starkt typat språk, d.v.s. att man kan vid kompileringstillfället avgöra om ett program är syntaktiskt och semantiskt korrekt (men inte om det är logiskt korrekt). Varje objekt associeras med en datatyp och regler för konvertering mellan datatyper avgör om en operation är riktig. Ett fullständigt (meningslöst) program: PROGRAM test; { programhuvud, ; skiljer satser åt } BEGIN { BEGIN END utgör ett block } END. DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 2 / 25
... Programmet skrivs i en texteditor, spars på en fil under ett namn t.ex. test.p (.p för att tala om för kompilatorn att det är ett program) För att kompilera programmet kan man skriva: gpc -o test test.p Om kompileringen lyckas blir resultatet en fil med namnet test Programmet startas med kommandot test Man kan även skriva pc test.p. Då har man inte givit programmet ett namn och måste starta det med kommandot a.out Det kan hända att man måste använda formen./test respektive./a.out för att kunna starta programmet. DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 3 / 25
... För att få något gjort måste man ha med procedurer och funktioner samt andra satser: PROGRAM test(output); funktionsnamn formella parametrar och deras typ resultatets typ FUNCTION square(x:integer):integer; { funktionshuvud } BEGIN square := x * x { funktionskropp } END; gör att resultatet sänds tillbaka BEGIN Writeln(square(3)) { huvudprogram } END. anrop av funktionen DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 4 / 25
Typer De grundläggande typerna i är: Integer (heltal) Real (reella tal) Boolean (sanningsvärden true & false) Char (tecken ur aktuell kodtabell) Delintervall av ovanstående (utom Real) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 5 / 25
In- och utmatning Write(par1, par2,...) skriv par1, par2,... utan radbyte WriteLn(par1, par2,...) skriv par1, par2,... avslutat med radbyte Write(234:6) skriv 234 högerjusterat i 6 positioner. Om platsen är för liten sker automatiskt utvidgning så objektet får plats. DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 6 / 25
In- och utmatning... Write(2.234567:1:3) Skriv 2.234567 i en position (måste alltså utvidgas) och med 3 decimaler (korrekt avrundat) Write(3:1:4) är fel eftersom 3 är (implicit) ett heltal. Write och Writeln kan skriva enkla typer och teckensträngar omgivna av apostroftecken. Read(var1, var2,...) läser in värden till var1, var2,... ReadLn(var1, var2,...) läser in värden till var1, var2,... och ser till att nästa Read (Readln) läser från en ny rad (har inte något med radbyte att göra) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 7 / 25
OBS Objekts, funktioners och procedurers namn måste börja på en bokstav och bara innehålla bokstäver och siffror. (bokstav är A..Z,a..z) Kompilatorn läser texten endast en gång och alla namn som den stöter på måste vara definierade innan de används. Man måste alltså skriva saker i rätt ordning En funktion f 1 som använder en funktion f 2 måste stå efter f 2 i programkoden! DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 8 / 25
Deklarationsordning... PROGRAM test2(output); FUNCTION absolutbelopp(x:integer):integer; BEGIN IF x < 0 THEN absolutbelopp := -x ELSE absolutbelopp := x END; FUNCTION absx3(x:integer):integer; BEGIN absx3 := Sqr(x) * absolutbelopp(x) END; BEGIN Writeln(absx3(-3)) END. DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 9 / 25
Operatorer Aritmetiska opererar på resultat + addition num & set num (real) & set subtraktion num & set num (real) & set multiplikation num & set num (real) & set / division num real div division Integer Integer mod modulo Integer Integer Relationsop > < >= <= = <> DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 10 / 25
Operatorer... Boolean NOT AND OR Prioritetsordning 1. NOT 2. * / DIV MOD AND 3. + - OR 4. > < >= <= = <> Detta betyder att vi måste sätta ut parenteser i logiska uttryck. Ex: (1 + 1 = 3) OR (2 < 4) AND (7 >= 3 * 2) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 11 / 25
En mer utbyggd programdel PROGRAM test3(input, output); CONST { konstantdefinitioner } n = 10; pi = 3.141592; prompter = Mata in ett tal ; TYPE { typspecifikationer } naturligt = 0..Maxint; smallint = 0..n; biglet = A.. Z ; flyttal = Real; VAR { variabeldeklarationer } tal: naturligt; ch: biglet;... DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 12 / 25
I Scheme I scheme har vi programmerat strikt funktionellt (allt har varit funktioner och vi arbetar bara med funktionsvärden). Men man kan ändra ett objekts tillstånd med set! > (define x 3) > (set! x 7) > x 7 Objektets tillstånd har ändrats! DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 13 / 25
Scheme... > (define := (lambda (val) (set! x val))) > (:= 12) > 12 I bygger de flesta program på att objektens tillstånd ändras! DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 14 / 25
I PROGRAM test4(input, output); VAR n, k: Integer; FUNCTION fak(n: Integer): Integer; BEGIN IF n < 2 THEN fak := 1 ELSE fak := n * fak(n - 1) END; BEGIN Writeln( N över K, ange n och k ); Readln(n, k); Writeln(fak(n) / (fak(k) * fak(n - k)):1:0); END. DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 15 / 25
Val IF villkor THEN sats1 ELSE sats2; Eller IF villkor THEN sats; DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 16 / 25
Val... satserna kan vara sammansatta och skall då omges av BEGIN END IF villkor THEN BEGIN sats1; sats2 END ELSE BEGIN sats3; sats4 END; DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 17 / 25
Syntaxdiagram sats icketerminal symbol (förklaras i annat diagram). end terminal symbol (förklaras inte vidare) program identifierare ( (fil-) identifierare, ) ; block. DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 18 / 25
Syntaxdiagram... identifierare bokstav bokstav siffra DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 19 / 25
Syntaxdiagram... bokstav A B... Z a b... z siffra 0 1 2 3 4 5 6 7 8 9 DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 20 / 25
Syntaxdiagram... block deklarationsdel sammansatt sats DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 21 / 25
Syntaxdiagram... deklarationsdel label lägesdeklaration ; const konstantdefinition ; type typdefinition ; var variabeldeklaration ; procedurdeklaration ; funktionsdeklaration ; DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 22 / 25
Syntaxdiagram... procedurdeklaration procedurhuvud ; block direktiv funktionsdeklaration funktionshuvud ; block direktiv DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 23 / 25
Syntaxdiagram... procedurhuvud procedure identifierare ( formell parameter ; ) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 24 / 25
Syntaxdiagram... funktionshuvud function identifierare ( formell parameter ; ) : (typ-)identifierare DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 25 / 25