Begreppet värde, igen Ett slags mått på en egenskap, eller något fenomen. Ska ges en bred tolkning! Kan vara mycket enkla: födår, ögonfärg, styckepris,.. eller lite sammansatta: en vektor, ett personnamn, en faktura,.. eller tämligen komplexa: ett ekvationssystem, en schackställning, Begreppet datatyp, igen Värden med samma karaktär, som mäter samma fenomen. Varje värde tillhör alltid en datatyp! Varje datatyp har (vanligen) ett eget namn. Datatyp Adas typnamn Exempel på bokstavliga skrivsätt heltal Integer 12-34 reella tal Float 3.1415-0.003 enstaka tecken Character A > texter String-varianter "Medelvärdet:" sanningsvärden Boolean true false Datatyp - mera Man kan som programmerare också tillverka egna, nya datatyper, t ex Egen datatyp Exempel på värden - för komplexa tal (12.3, -0.5) - för matriser 2.0-0.1 3.5 1.2 - för ögonfärg blå grå eller vad som helst! Men hur det går till visas inte just nu! Begreppet uttryck Ungefär: skrivsätt (konstruktioner) som beskriver ett värde. Flera alternativ, bl a Som literaler (dvs bokstavligt skrivna värden) 312 3.1415 "Summan: " Som variabler (egentligen variabelnamn) Alfa no_of_steps Som formler (operationsuttryck) 3.1415 - Alfa ** 2 Varje uttryck tillhör en och endast en datatyp! TDDB53 - Fö3 Sammanfattning 1 TDDB53 - Fö3 Sammanfattning 2 Variabel - en modell? Associationen från ett namn (identifierare) till ett värde av en viss given datatyp. Värdet kan ändras, men inte namn eller datatyp! Idé till hur det kan betraktas: Alfa namnet Samma variabel när den senare fått ett nytt värde: Alfa Variablers namn hittar jag själv på, enligt vissa regler. Variabler skall deklareras innan de kan användas! Begreppet deklaration värdets typ Float 1.25 aktuellt värde Float -0.003 Ungefär: att introducera ett nytt namn (egentligen identifierare), och samtidigt ge namnet en speciell innebörd (t ex att vara en variabel eller konstant). Deklaration - några exempel Variabler, konstanter: Alfa, Beta : Float; Anger att Alfa och Beta är namn på variabler av Float-typ. Men värdet på variablerna är än så länge odefinierat. Sum : Integer := 0; Anger att Sum är namnet på en heltalsvariabel, vars värde nu också sätts till 0. Men det kan givetvis ändras senare! Pi : constant Float := 3.141592; Anger att Pi är namnet på en konstant som får angivet värde, vilket aldrig kan ändras. Prompter : constant String := "? "; Anger att Prompter är namnet på en text-konstant (med huvud -datatypen String) med det oföränderliga värdet?. Andra exempel: type Color is (Blue, Green, Gray); Anger att Color blir namnet på en ny datatyp med de tre värdena som räknas upp, vilka härmed också deklareras att tillhöra datatypen Color. package IIO is new Integer_IO(Integer); Anger att IIO är namnet på ett speciellt slags paket. Därefter är det tillåtet att använda namnet. TDDB53 - Fö3 Sammanfattning 3 TDDB53 - Fö3 Sammanfattning 4
Deklarationer - exempel på skrivsätt Deklaration av fem variabler (lite osnyggt skrivet): Aritmetiska operatorer - sammanfattning Nedan anges typerna för operanderna! A, B, C : Integer; Mean, SqSum : Float; Operation: Typ på värde: Alternativt deklarationssätt: Ordningen kan vara en annan, kommentarer tillfogade, layout tillrättalagd: -- Variabler: Mean : Float; -- Medelvärdet. C, A, B : Integer; -- De tre talen. SqSum : Float; -- Summa av kvadraterna. Snyggaste sättet att skriva deklarationerna. En variabel per rad: -- Variabler: A : Integer; -- De tre talen, B : Integer; C : Integer; SqSum : Float; -- deras kvadratsumma, Mean : Float; -- och deras medelvärde. integer + integer integer integer - integer integer - integer integer {sk monärt -} integer * integer integer integer / integer integer integer mod integer integer abs integer integer { beloppet } float + float float float - float float - float float float * float float float / float float abs float float integer ** integer integer { a b } float ** integer float Detta sista gör det enklare att skriva en individuell kommentar till varje variabel, vilket ofta är en god idé. Prioriteter (beräkningsordning): högst (= först) abs ** mod * / monärt - lägst (= sist) binärt - binärt + TDDB53 - Fö3 Sammanfattning 5 TDDB53 - Fö3 Sammanfattning 6 Typkonvertering Funktioner - funktionsanrop De aritmetiska operationerna är alltså mycket strikta när det gäller operandernas datatyper. Ibland kan man behöva omvandla ett värde av en datatyp till ett värde av en annan datatyp. Integer till Float Om A, B och C är variabler av typen Integer och jag vill beräkna medelvärdet av dom som en Float duger inte uttrycket (A + B + C) / 3 eftersom kvoten då blir en (oprecis) Integer. Inte heller duger (A + B + C) / 3.0 eftersom den divisionsoperationen inte existerar överhuvudtaget! Jag måste omvandla summan till en Float innan jag gör en Float_division: Float(A + B + C) / 3.0 Alternativt skulle man förstås kunna ha gjort det som (Float(A) + Float(B) + Float(C)) / 3.0 men det är lite klumpigare. Alternativet 0.33 * Float(A + B + C) är inte heller så bra, på grund av att 0.33 är en ganska dålig approximation av en tredjedel! Float till Integer Integer(float-värde) skapar ett nytt Integer-värde som är en kopia av float-värde avrundat till närmaste Integer! En funktion är en slags transformation av ett/flera värden (parametrar, eller argument) till ett annat värde. Känt från t ex matten, där man ofta har mycket speciella skrivsätt för många såna: sin x x 10 log x x P(x, y) Ada har också funktioner, men alla beskrivs av ett namn, och argumenten skrivs alltid inom parentes. Värden kan också beskrivas med hjälp av funktioner - man säger att man använder funktionsanrop. Några exempel: Integer Max(i, k) Float Truncation(x) abs(k) abs(x) i och k betecknar här godtyckliga Integervärden, och x betecknar ett Float-värde Genom att använda det särskilda paketet Ada.Numerics.Elementary_Functions får man också tillgång till många andra matematiska funktioner, bl a Sin(x) och Cos(x) och andra trigonometriska Sqrt(x) för roten ur x Log(x) för naturliga logaritmen av x Log(x, b) för b-logaritmen av x Exp(x) för e x Funktionsanrop är alltså ytterligare en form av uttryck! Man kan införa egna funktioner! Mer senare i kursen. TDDB53 - Fö3 Sammanfattning 7 TDDB53 - Fö3 Sammanfattning 8
Jämförr (relationsoperationer) 6 operatorer: = /= < > <= >= Två värden kan jämföras bara om dessa har samma datatyp! Värdet av en jämför tillhör den inbyggda datatypen Boolean som innehåller exakt två värden, true och false OBS: true och false är inte namn på variabler, de är literaler (bokstavliga värden) pss som t ex 162 är ett literalt värde av typen Integer, eller -0.5 en literal av typen Float. Exempel: bland deklarationerna: x, y : Float; are_equal : Boolean; x_is_negative : Boolean; i den utförande delen: begin are_equal := x = y; x_is_negative := x < 0.0; Användning: Booleska (eller logiska) värden, t ex jämförr, används bl a för att styra if- och while-repetitioner. Logiska (Booleska) operationer Logiska värden kan sättas ihop till mer komplexa villkor med hjälp av logiska operationer (operatorer). I huvudsak finns 3 sådana i Ada: logiskt värde or logiskt värde logiskt värde and logiskt värde not logiskt värde Några exempel: bland deklarationerna: A, B, C : Integer; AllDifferent : Boolean; sen kan man göra t ex A=B or A=C or B=C true om minst två är lika A=0 and B=0 and C=0 true om alla är noll A < B and B < C Värdet är förstås också logiskt, true / false. true om stigande ordning AllDifferent := A/=B and A/=C and B/=C; AllDifferent sätts till true bara om alla är olika AllDifferent := not (A=B or A=C or B=C) dito! Jämför första uttrycket. TDDB53 - Fö3 Sammanfattning 9 TDDB53 - Fö3 Sammanfattning 10 Satser Ett uttryck är alltså något sätt att beskriva ett värde. En sats är å andra sidan snarast en order, en uppmaning till handling! (Ett imperativ, på vackert språk!) X := Alfa * 12.5; Sätt X till!!! Put(X, 0, 3, 0); Skriv ut!!! exit when X > 0.0; Avbryt (repetitionen) när!!! En sats kan beskriva vad som ska hända med värden: Sätt X till det värde som beskrivs av Alfa * 12.5 Skriv ut det värde som X står för En sats beteende kan också påverkas av, styras av värden: Olika typer av (1) tilldelningssatsen Den allmänna formen kan skrivas variabelnamn av nån typ T := värde av typ T ; proceduranrop Get(variabelnamn); Put(); i olika varianter New_Line; Get, Put, New_Line är namn på sk procedurer. Anropet av en procedur är en form av sats. Du ska få veta mer om vad en procedur är senare. Avbryt (repetitionen) när värdet av X > 0.0 är true, (fortsätt annars). Ett uttryck kan därmed vara del av en sats, men det är aldrig tvärtom! Ett uttryck kan aldrig finnas som en egen sats för sig själv. Däremot kan vara del av, styras av, andra. (loop-satsen, if-satsen) En sats har inte något värde! Varje sats skall avslutas med ; (semikolon). exit-satsen, som bara kan finnas mellan loop och end loop Det finns i själva verket två former av den satsen. Den ovillkorliga skrivs helt enkelt exit; Den villkorliga skrivs i den allmänna formen som exit when villkor ; Ett programs algoritmiska del (utförande del) är helt enkelt en sekvens av! Och uttryck ingår som beståndsdelar i (de flesta). där villkor är ett godtyckligt uttryck av Boolesk typ. TDDB53 - Fö3 Sammanfattning 11 TDDB53 - Fö3 Sammanfattning 12
Olika typer av (2) if-satsen - en styrsats Nedan betecknar villkor i ett uttryck vars värde är av typen Boolean, och i betecknar en följd av, vilka som helst, men minst en. Exempel utan -gren: Exempel med -gren: 1 1 2 1 1 elsif villkor 2 then elsif villkor 2 then 2 2 3 Olika typer av (3) if-satsen kan nu sammanfattas med en generell beskrivning på ett lite formellt sätt. Formella symboler: [ x ] x kan finnas en gång eller inte alls [ x ] x kan finnas noll gånger eller flera if villkor then [ elsif villkor then ] [ ] Ett annat generellt och grafiskt beskrivningssätt visas här. Det beskriver uppbyggnaden av en konstruktion genom att man följer pilar genom ett diagram: elsif Sammanfattningsvis: if villkor then elsif villkor then end if ;.. skall alltid finnas först.. kan sedan finnas 0 eller flera gånger.. kan därefter finnas 0 eller 1 gång.. skall alltid finnas sist if villkor then end if ; Här visas dels verkliga ada-ord och dels, i ramar, delar som betecknar andra delkonstruktioner. TDDB53 - Fö3 Sammanfattning 13 TDDB53 - Fö3 Sammanfattning 14 Olika typer av (4) Mera om datatyper repetitionssatsen - en styrsats Med samma grafiska beskrivningssätt kan den sammanfattas som while villkor for variabelnamn in range loop reverse Dvs: egentligen en enda konstruktion, men med olika alternativ. Vi kan ha en styrande beskrivning först, med for eller med while, eller utelämna den helt. I samtliga fall kan innehålla 0 eller flera förekomster av exit-satsen. villkor har samma betyd som tidigare. range är ungefär samma sak som intervall. Det kan skrivas på lite olika sätt - ett sätt är lägsta värde.. högsta värde. Det finns restriktioner på vilka värden range kan innehålla. Variabeln med namnet variabelnamn är en ny variabel som bara existerar inom loop-satsen, och som inte ska deklareras! Om reverse finns med innebär det att styrvariabeln stegas baklänges över range:en. För vissa datatyper gäller att det säkert går att säga vilket värde som följer närmast efter (eller före) ett givet värde. Eller: att det går att räkna upp alla värden från det minsta till det största (eller tvärtom). Integer: -oo, -1, 0, 1, 2, 3,.. oo Character:, a, b, c, A, B, C, Boolean: false, true Detta är omöjligt för Float! Vilket Float-värde är närmast större än 3.0? Vi säger nu att Integer, Character och Boolean är sk uppräkningstyper (eller: diskreta datatyper). range (intervallet) i en for-sats måste vara av uppräkningstyp! Man kan också tillverka egna uppräkningstyper! Man bestämmer då själv både namnet på den nya datatypen, vilka värden som typen ska innehålla och storleksrelationen mellan dessa. Värdena ska vara namn (identifierare)! I deklarationsdelen exempelvis type InstId is (IDA, IEI, IFM, MAI, IMT, ISY, ITN); TDDB53 - Fö3 Sammanfattning 15 TDDB53 - Fö3 Sammanfattning 16
Uppräkningstyper - attribut Ett attribut är en egenskap hos en datatyp, vars värde man kan läsa av med en särskild konstruktion: type InstId is (IDA, IEI, IFM, MAI, IMT, ISY, ITN); Inst : InstId := IEI; Attributen First och Last ger första resp sista värdet i datatypen: Integer First -2147483648 Integer Last 2147483647 Boolean First false InstId Last ITN Attributet Range ger intervallet över datatypens alla värden: Boolean Range false.. true InstId Range IDA.. ITN Attributen Pred och Succ ger föregångaren resp efterföljaren till ett angivet värde, inom typen: Integer Succ(23) 24 Boolean Pred(true) false InstId Succ(Inst) IFM InstId Pred(IDA) exekveringsfel! Attributet Image ger den text som representerar ett givet värde: Integer Image(125); " 125" Boolean Image(1 < 2); "TRUE" InstId Image(Inst) "IEI" Kort om subtyper Månad : Integer; -- Månadsnummer 1-12 är att skjuta över målet! Ett månadsnummer kan inte ha vilket Integer-värde som helst! Man kan lätt av misstag placera ett ogiltigt värde i variabeln Månad! Inför i stället en subtyp: subtype Månadsnummer is Integer range 1.. 12; Månad : Månadsnummer; Månad kan nu bara anta värden i 1.. 12. Om man försöker ge den andra värden blir det exekveringsfel! Däremot kan man göra operationer mellan Månad och vanliga Integers. Antag att nm är en Integer-variabel: -- Stega Månad nm månader framåt: *) if Månad + nm <= 12 then Månad := Månad + nm; Månad := (Månad - 1 + nm) mod 12 + 1; En bra regel: Försök alltid åstadkomma så naturtrogna datatyper som möjligt! *) Hela if-satsen skulle faktiskt kunna ersättas av Månad := (Månad - 1 + nm) mod 12 + 1; TDDB53 - Fö3 Sammanfattning 17 TDDB53 - Fö3 Sammanfattning 18 For-satsens range, igen Det finns tydligen flera sätt att skriva den. Några olika exempel: for index in 1.. 50 loop for i in -10.. slut_värde loop for value in min.. max * 2-1 loop for p in false.. true loop for p in Boolean Range loop for p in Boolean loop for mnr in Månadsnummer loop for col in Color loop for i_id in InstId First.. Inst Pred(InstId Last) loop Tänkbar typ av tentafrågor: Nedan är x en positiv Float. Beskriv med ord vilken funktion av x som uttrycket utgör. Eller: vilken karaktäristisk egenskap hos x som uttrycket beskriver. Det är inte detaljerna i beräkningen frågan gäller, utan en beskrivning av helheten, utifrån betraktat, och lite abstrakt. Integer(Float Truncation(10.0 * x)) mod 10 I koden nedan är v deklarerad som Integer. Vilka värden kommer v att ha, i tur och ordning, när avsnittet markerat med utförs? for s in reverse 1.. 5 loop v := s; while v <= 10 loop v := v + s; Antag att DT är namnet på någon uppräkningsdatatyp. Beskriv vilka värden v kommer att anta i for v in DT Succ(DT First).. DT Last loop TDDB53 - Fö3 Sammanfattning 19 TDDB53 - Fö3 Sammanfattning 20