Månadsnamn september Några deklarationer

Relevanta dokument
Tentamen Grundläggande programmering

Datatyp - mera. Begreppet värde, igen. Ett slags mått på en egenskap, eller något fenomen. Ska ges en bred tolkning!

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

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

KOMPLETTERANDE HEMTENTAMEN TDDB53

KOMPLETTERANDE HEMTENTAMEN TDDB53

Exempel på ett litet Ada-program

KOMPLETTERANDE HEMTENTAMEN 2 TDDB53

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Föreläsning 6: Introduktion av listor

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Arrayer. results

Datastrukturer. Erik Forslin. Rum 1445, plan 4 på Nada

GRUNDER I VHDL. Innehåll. Komponentmodell Kodmodell Entity Architecture Identifierare och objekt Operationer för jämförelse

Beräkningsvetenskap föreläsning 2

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

Spelschema för årets fotbollsmästerskap! island tyskland Söndag 14/7 Växjö Arena, Växjö. Söndag 14/7 Kalmar Arena, Kalmar

TDIU01 - Programmering i C++, grundkurs

JAVAUTVECKLING LEKTION 8

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Språket Python - Del 1 Grundkurs i programmering med Python

Föreläsning 3-4 Innehåll

Föreläsning 4: Poster

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.

Föreläsning 5: Introduktion av pekare

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

Objektorienterad programmering Föreläsning 4

5 Grundläggande in- och utmatning

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

Översikt över Visual Basic

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

4 Sammansatta datatyper

Klassdeklaration. Metoddeklaration. Parameteröverföring

[] Arrayer = Indexerad variabel

Imperativ programmering. Imperativ programmering konstruktioner i Lisp. Datastrukturer (kap ) arraystruktur poststruktur

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

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Indexerade variabler

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Visual Basic, en snabbgenomgång

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

Arrayer (vektorer) Murach s: kap Elektronikcentrum i Svängsta AB

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

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

Objektorienterad Programmering (TDDC77)

Föreläsning 2, vecka 8: Repetition

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Strukturdiagram. Styra. Algoritmer. Val

OOP Objekt-orienterad programmering

Programmering A. Johan Eliasson

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

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

Parameteröverföring. Exempel. Exempel. Metodkropp

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

Deklarationer/definitioner/specifikationer

2D1339 Programkonstruktion för F1, ht 2003

Imperativ programmering. Föreläsning 2

TDIU01 - Programmering i C++, grundkurs

SMD 134 Objektorienterad programmering

Att förstå hur man konstruerar modulära program Att kunna skapa nya funktioner Att förstå hur data skickas mellan funktioner

Föreläsning 1 & 2 INTRODUKTION

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

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

Lösningsförslag: Instuderingsfrågor, del A

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

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Grundläggande programmering med C# 7,5 högskolepoäng

Digitalitet. Kontinuerlig. Direkt proportionerlig mot källan. Ex. sprittermometer. Elektrisk signal som representerar ljud.

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

Anteckningar 1: Grundläggande saker

TDDC77 Objektorienterad Programmering

Objektorienterad Programmering (TDDC77)

PROGRAMMERING-Java Omtentamina

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Föreläsning 3: Booleans, if, switch

I ett program hantera man ofta samlingar av objekt av samma typ.

Planering Programmering grundkurs HI1024 HT 2014

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

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Arrayer (fält)

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Övning från förra gången: readword

Föreläsning 6: Metoder och fält (arrays)

Objektorienterad programmering i Java

int iarray[]= new int[3]; // deklarera ett heltalsfält med tre heltal int jarray[]={ 1, 3, 5, 7, 9, 11, 13, 15}; // initierat fält 8 element

Java, klasser, objekt (Skansholm: Kapitel 2)

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

*Pekarvärden *Pekarvariabler & *

Föreläsning REPETITION & EXTENTA

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Föreläsning 9-10 Innehåll

Uppgift 1 (grundläggande konstruktioner)

Tentamen , Introduktion till Java, dtaa98, dtea53

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

TDIU01 - Programmering i C++, grundkurs

Transkript:

Datatyper - enkla resp sammansatta Varje datatyp kan sägas vara definierad som en uppsättning värden, vars form (vanligen) skiljer sig från värdena i andra datatyper. I Ada har vi t ex inbyggda datatyper med namnen Integer, Float, och Boolean. Kännetecknande för dessa är att varje värde är ett enda, odelbart: Integer -312 Float 0.65 Boolean false Q Databegrepp i många verkliga sammanhang kan dock vara sammansatta av flera komponenter: Ett komplext tal En text (String) En dag Float 0.1 H Dagnamn lördag Float -1.4 De resp komponenterna tillsammans är ett värde av datatypen: (0.1, -1.4) är ett värde av typen komplext tal. e Integer Såna sk sammansatta datatyper kan konstrueras i Ada. 13 j Månadsnamn september Några deklarationer -- Värdena i datatypen MonthName är de 12 månadsnamnen: type MonthName is (January, February, March, April, May, June, July, August, September, October, November, December); -- Datatypen Date har tre komponenter: type Date is record year : Integer; -- Årtal, month : MonthName; -- månadsnamn, day : Integer; -- och dagnummer i månaden.. -- En konstant och två variabler av datatypen Date: StartOfMillennium : constant Date := (2000, January, 1); Today : Date := (2001, May, 19); Tomorrow : Date; TDDB53 - Fö5 Sammanfattning 1 TDDB53 - Fö5 Sammanfattning 2 Recordtyper - några begrepp Date blir nu (namnet på) en recordtyp (posttyp). StartOfMillennium, Today, Tomorrow är records (poster), de två senare recordvariabler (postvariabler). Datatypen (och variabler av typen) har tre komponenter som jag givit namnen year, month och day. Typiskt för records är att komponenterna tillåts vara av inbördes olika datatyper, och godtyckligt vilka typer. Konstruktionen (2000, January, 1) kallas för ett recordaggregat (postaggregat). Ett recordaggregat är ett värde av en recordtyp på samma sätt som t ex -1.4 eller sin(0.5) är värden av typen Float. record year : Integer; month : MonthName; day : Integer; (2000, January, 1) Och varje komponent i ett aggregat kan generellt sett vara ett sammansatt uttryck, av korrekt typ: (Century + y, March, Today.day - 1) Användningsexempel PutDate(StartOfMillennium); Today.year := 2003; Today.month := November; Today.day := 28; PutDate(Today); Tomorrow := Today; Tomorrow.day := Tomorrow.day + 1; PutDate(Tomorrow); end; Man kan i olika sammanhang antingen avse helheten PutDate(StartOfMillennium); Tomorrow := Today; eller referera enstaka komponenter. Today.month := November; Tomorrow.day := Tomorrow.day + 1; Att referera en enstaka komponent kallas selektering ( välj ut ). TDDB53 - Fö5 Sammanfattning 3 TDDB53 - Fö5 Sammanfattning 4

Recordtyper - operationer type Date is record year : Integer; month : MonthName; day : Integer; D1, D2 : Date; Tilldelning: D1 := D2; Jämförelser på likhet och olikhet: D1 = D2 (men inte andra jämförelser!) D2 /= D1 Selektering: D1.year D2.day D1.year och motsvarande skrivsätt ska också betraktas som en form av variabelnamn! Records kan vara parametrar till funktioner och procedurer! PutDate(D1); Men det finns inte någon i förväg deklarerad Put för utskrift av någon posttyp! Inte heller någon Get för inläsning! Sådana Put och Get finns ju bara för de inbygggda datatyperna! Records som funktionsvärden Records kan vara värden av funktioner. Anropet ChristmasEve(årtal) ska ge ett Date-record som avser julafton året årtal: function ChristmasEve(y : integer) return Date is the_date : Date; the_date.year := y; the_date.month := December; the_date.day := 24; return the_date; end; Ett annat (trevligare?) alternativ är function ChristmasEve(y : integer) return Date is return (y, December, 24); end; TDDB53 - Fö5 Sammanfattning 5 TDDB53 - Fö5 Sammanfattning 6 Records i records Hopbyggnad kan vara godtyckligt sammansatt: type Date is record.. enligt tidigare type Adress is record Namn : någon form av String; Gatuadress : någon form av String; Postadress : någon form av String; type Faktura is record Fakturanummer : Integer; Belopp : Float; Faktureringsdag : Date; Förfallodag : Date; Betalningsmottagare : Adress; Selektering av komponenter, t ex: Fakt : Faktura; Fakt.Belopp Fakt.Förfallodag.month Fakt.Betalningsmottagare.Postadress Recordtyper och arraytyper kan byggas in i varandra på godtyckligt komplext sätt! Detta skall utnyttjas för att avbilda problemområdet så naturtroget som möjligt! Arrayer (fält) - 1 När man har ett större antal komponenter som alla tillhör samma datatyp är vanligen array-strukturen (fältstrukturen) att föredra. Jämför begreppet vektor från matten: V kan vara vektorn (3.2, -0.4, 1.7, 0.6), och beteckningen V avser då helheten. Enskilda komponenter betecknas med t ex V 2 eller V i eller V k+1 Selektering av komponent med index - indexering (indicering) Motsvarande för två-dimensionella strukturer, matriser: om m är helheten kan enstaka komponenter refereras med t ex m 2, 1 eller m i, j*2 I Ada finns en ganska naturtrogen modell av detta. Man skapar först en ny datatyp: type Sample is array(1.. 50) of Float; den nya datatypens namn indexens typ (intervall), en range datatyp för alla komponenter TDDB53 - Fö5 Sammanfattning 7 TDDB53 - Fö5 Sammanfattning 8

Arrayer (fält) - 2 Sen kan man deklarera variabler: V1 : Sample; Se nu till att V1 i blir = i, för alla i for index in 1.. 50 loop V1(index) := Float(index); Se sen till att varannan komponent (2, 4, ) byter tecken: for index in 1.. 25 loop V1(2 * index) := - V1(2 * index); Flytta alla komponenter i V1 ett steg åt vänster/ neråt, men gör detta cirkulärt: temp := V1(1); for index in 1.. 49 loop V1(index) := V1(index + 1); V1(50) := temp; Detta sista kan göras enklare med hjälp av sk slicing: temp := V1(1); V1(1.. 49) := V1(2.. 50); V1(50) := temp; Arrayer (fält) - 3 Index måste inte börja med 1: type Data is array(-10.. 20) of Integer; type OK is array(5.. 10) of Boolean; Typen på index måste inte ens vara Integer: type Color is (white, blue, red); type Amount is array(color) of Integer; Count : Amount; Sum := 0; for col in Color loop Sum := Sum + Count(col); Regel: Index skall vara en uppräkningstyp! Integer, eller en begränsad Integer, Boolean Egna uppräkningstyper (som Color ovan) I flerdimensionella array-strukturer (matriser, tabeller, ) kan indexen i de resp dimensionerna ha olika typ. type ColTable is array(color, 1.. 5) of Float; TDDB53 - Fö5 Sammanfattning 9 TDDB53 - Fö5 Sammanfattning 10 Arrayer (fält) - exempel 1 (1) Antag att ett program behöver en tabell över hur många timmar man jobbat (med något) per dag under ett års alla veckor. Värdena i tabellen skall vara Float. Det logiska (eller abstrakta) perspektivet: vecka måndag 1 2 3.... 53 tisdag.... onsdag.... torsdag.... fredag.... lördag.... söndag.... type Day is (måndag, tisdag, onsdag, torsdag, fredag, lördag, söndag); type WorkHour is array(day, 1.. 53) of Float; MyHours : WorkHour; -- Tabellen Raderna (första dimensionen) har då indexen måndag t o m söndag, kolumnerna har index 1 t o m 53. Arrayer (fält) - exempel 1 (2) Beräkna antal arbetstimmar under en viss vecka, given av variabeln week: for d in Day loop Sum := Sum + MyHours(d, week); Kan med fördel bli en särskild funktion: function WeekHours(WH : WorkHour; week : Integer) return Float is sum : Float := 0.0; for d in Day loop sum := sum + WH(d, week); return sum; end WeekHours; Exemplet visar att arrayer mycket väl kan vara parametrar till funktioner och procedurer. Värdet för tisdag vecka 4 refereras då med namnet MyHours(tisdag, 4) TDDB53 - Fö5 Sammanfattning 11 TDDB53 - Fö5 Sammanfattning 12

Arrayer (fält) - exempel 1 (3) Arrayer - exempel 2 (1) Beräkna antal arbetstimmar under veckoslut (lördag, söndag) för hela året: for week in 1.. 53 loop for d in lördag.. söndag loop Sum := Sum + MyHours(d, week); alternativt: for week in 1.. 53 loop Sum := Sum + MyHours(lördag, week) + MyHours(söndag, week); eller: for week in MyHours Range(2) loop Sum := Sum + MyHours(lördag, week) + MyHours(söndag, week); Mer om attributet Range senare. Ofta behöver man en array för att lagra ett större antal värden, men man vet inte i förväg precis hur många. Och antalet kan dessutom variera mellan körtillfällen: max : constant Integer := 2000; type Data is array(1.. max) of Integer; Value : Data; -- Inlästa värden Count : Integer; -- Antal värden x : Integer; Put( Ge högst ); Put(max, 0); Put( heltal > 0! ); Count := 0; loop Get(x); exit when x <= 0; Count := Count + 1; Value(Count) := x; De två variablerna/värdena Value och Count tillsammans krävs för att beskriva datamängden! TDDB53 - Fö5 Sammanfattning 13 TDDB53 - Fö5 Sammanfattning 14 Arrayer - exempel 2 (2) Arrayer - exempel 2 (3) För att i programmet ovan t ex finna det största värdet i arrayen Value med Count st. komponenter använder man gärna en funktion som kan anropas Maximum(Value, Count). OBS att båda de parametrarna är nödvändiga! function Maximum(val : Data; cnt : Integer) return Integer is big : Integer := val(1); for i in 2.. cnt loop if val(i) > big then big := val(i); end if; return big; end Maximum; eller något alternativ till hela if-satsen, t ex Om man har intresse av t ex att ta bort alla dom komponenter ur en Data-variabel, som är lika med ett visst p kan med fördel en subrutin få klara av det jobbet. OBS att antalet utnyttjade komponenter också kommer att förändras: procedure Remove(val : in out Data; cnt : in out Integer; p : Integer) is -- Till position dest flyttas en -- komponent om den är /= p! dest : Integer := 0; for i in 1.. cnt loop if val(i) /= p then dest := dest + 1; val(dest) := val(i); end if; cnt := dest; -- Nytt antal komponenter! end Remove; big := Integer Max(val(i), big); TDDB53 - Fö5 Sammanfattning 15 TDDB53 - Fö5 Sammanfattning 16

Arrayer - attribut Antag deklarationerna type Vector is array(5.. 8) of Integer; type Matrix is array(1.. 3, 0.. 4)of Float; V : Vector; M : Matrix; Både typerna Vector och Matrix liksom variablerna V och M har en uppsättning attribut: Vector Length V Length ger antalet komponenter i den enda dimensionen (= 4) Matrix Length(2) M Length(1) ger antalet komponenter i den angivna dimensionen (här blir det 5 resp 3) Vector First M Last(2) ger första resp sista indexet i den enda eller den angivna dimensionen (blir här 5 resp 4). OBS: Första eller sista index, inte komponent! V Range Matrix Range(2) ger indexintervallet (dvs en range) i den enda eller angivna dimensionen (här blir det 5.. 8 resp 0.. 4) Arrayer - operationer type VecA is array(1.. 3) of Integer; type VecB is array(1.. 4) of Integer; type VecC is array(1.. 3) of Integer; A1 : VecA; A2 : VecA; B : VecB; C : VecC := (64, 32, 16); Selektering av viss komponent, dvs indexering. Tilldelning och jämförelser mellan två array-variabler kan ske om båda är deklarerade med samma typnamn. Jämförelser sker elementvis. Tilldelning till en array-variabel från ett aggregat kan ske bara om aggregatets komponenter har samma typ som array-deklarationens, och om antalet komponenter stämmer överens. Konkatenering ( hopslagning ) av en-dimensionella arrayer, operatorn & Slicing, dvs att ta en delföljd av komponenter ur en en-dimensionell array. B := (5, 6) & C(2.. 3); TDDB53 - Fö5 Sammanfattning 17 TDDB53 - Fö5 Sammanfattning 18 Tänkbar tentafråga! Vi har deklarationen type Arr is array(1.. 100) of Integer; Under vilken omständighet ger då nedanstående funktion värdet true? eller (alternativ frågeställning) Vilken uppgift har funktionen q? En annan tänkbar tentafråga! Givet är datatypen type Arr is array(1.. 100) of Integer; Skriv en procedur Rearrange(A, N, X) som ser till att flytta om de N första komponenterna i variabeln A av typen Arr så att alla förekomster av värdet X finns först, medan ordningen i övrigt är ovidkommande. function q(a : Arr; N : Integer) return Boolean is for ind in 1.. N - 1 loop if A(ind + 1) < A(ind) then return False; end if; return True; end q; Svaret skall inte ges i form av detaljerade beräkningssteg, utan i ett övergripande, utanförperspektiv, i analogi med Funktionen ger den största av komponenterna NOT: Funktionen ovan kan förstås inte förses med ett riktigt namn, eftersom det skulle avslöja dess syfte! TDDB53 - Fö5 Sammanfattning 19 TDDB53 - Fö5 Sammanfattning 20

Lite om den inbyggda datatypen String Typen String är en array med som komponenter. Prompt : constant String := "Värde: "; Mssg : String := "DEL 1"; Typerna för Prompt och Mssg skiljer sig åt i en detalj: Prompts typ kan i princip beskrivas av array(1.. 7) of, medan Mssgs typ på samma sätt kan ses som array(1.. 5) of! Den tänkta deklarationen av typen String: type String is array(positive range <>) of ; Innebär 1: Index skall vara av typ Positive (heltalen 1, 2, ), 2: men exakta gränser är inte fastställda! Prompt och Mssg kommer att få dessa gränser från sina resp. initialvärden! Dessa gränser kan sen aldrig ändras! Och typlikhet råder inte! Därför är t ex tilldelningen Mssg := Prompt olaglig! En egen String-typ kan lämpligen konstrueras som t ex subtype String_20 is String(1.. 20); men variabler av den typen kan bara innehålla texter med exakt 20 tecken! TDDB53 - Fö5 Sammanfattning 21