... 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 ä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 } { END utgör ett block } DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 1 / 25 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. 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 } square := x * x { funktionskropp } END gör att resultatet sänds tillbaka Writeln(square(3)) { huvudprogram } anrop av funktionen DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 3 / 25 DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 4 / 25
Typer In- och utmatning 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) 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 5 / 25 DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 6 / 25 In- och utmatning... OBS 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) 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 7 / 25 DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 8 / 25
Deklarationsordning... Operatorer PROGRAM test2(output) FUNCTION absolutbelopp(x:integer):integer IF x < 0 THEN absolutbelopp := -x ELSE absolutbelopp := x END FUNCTION absx3(x:integer):integer absx3 := Sqr(x) * absolutbelopp(x) END Writeln(absx3(-3)) 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 9 / 25 DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 10 / 25 Operatorer... En mer utbyggd programdel 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) 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 11 / 25 DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 12 / 25
I Scheme 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! > (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 13 / 25 DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 14 / 25 I Val PROGRAM test4(input, output) VAR n, k: Integer FUNCTION fak(n: Integer): Integer IF n < 2 THEN fak := 1 ELSE fak := n * fak(n - 1) END Writeln( N över K, ange n och k ) Readln(n, k) Writeln(fak(n) / (fak(k) * fak(n - k)):1:0) IF villkor THEN sats1 ELSE sats2 Eller IF villkor THEN sats DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 15 / 25 DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 16 / 25
Val... Syntaxdiagram satserna kan vara sammansatta och skall då omges av END sats icketerminal symbol (förklaras i annat diagram). end terminal symbol (förklaras inte vidare) IF villkor THEN sats1 sats2 END ELSE sats3 sats4 END program identifierare ( (fil-) identifierare, ) block. DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 17 / 25 DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 18 / 25 identifierare bokstav bokstav bokstav A B... Z a b... z siffra siffra 0 1 2 3 4 5 6 7 8 9 DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 19 / 25 DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 20 / 25
deklarationsdel label lägesdeklaration const konstantdefinition block deklarationsdel sammansatt sats type typdefinition var variabeldeklaration procedurdeklaration funktionsdeklaration DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 21 / 25 DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 22 / 25 procedurdeklaration procedurhuvud block procedurhuvud direktiv procedure identifierare ( formell parameter ) funktionsdeklaration funktionshuvud block direktiv DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 23 / 25 DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 24 / 25
funktionshuvud function identifierare ( formell parameter ) : (typ-)identifierare DA2001 (Föreläsning 10) Datalogi 1 Hösten 2010 25 / 25