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

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

Ordnad lista. Listor... Ordnad lista... Ordnad lista typer

Tentamen Grundläggande programmering

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

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

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

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...

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.

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.

Standardfilerna Input och Output

Föreläsning 6: Introduktion av listor

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

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. Lösningsförslag till tentamen

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

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

Sökning och sortering

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

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

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

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

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

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

Några saker till och lite om snabbare sortering

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

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

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

Datastrukturer och algoritmer

Tentamen TEN1 HI

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Datastrukturer och algoritmer. Föreläsning 4 Test, Stack och Kö

Länkade strukturer. (del 2)

Funktionell programmering DD1361

Datastrukturer och algoritmer

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 11. Arrayer. Arrayer. Arrayer. Lagrar flera värden av samma typ Kan vara primitiva typer eller objekt. Kan ha en array av t.

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

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

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Visual Basic, en snabbgenomgång

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

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

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy cards. Slingor

[] Arrayer = Indexerad variabel

Föreläsning 7: Filer

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

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

TDIU01 - Programmering i C++, grundkurs

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

KOMPLETTERANDE HEMTENTAMEN TDDB53

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

Arrayer (fält)

Instuderingsfrågor, del D

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Tentamen i Algoritmer & Datastrukturer i Java

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

Föreläsning 10. Pekare (Pointers)

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

Datastrukturer. Föreläsning Innehåll. Program med vektor Exempel. Deklarera vektorer

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

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

Tillämpad Programmering (ID1218) :00-13:00

SMD 134 Objektorienterad programmering

Multipel tilldelning. Introduktion till programmering D0009E. Föreläsning 6: Iteration. while-satsen. Kom ihåg. Snurror kontra rekursion

Exempel på ett litet Ada-program

Föreläsning 4: Poster

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

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

Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Objektorienterad Programmering (TDDC77)

Föreläsning 5: Introduktion av pekare

4 Sammansatta datatyper

Föreläsning 3-4 Innehåll

Introduktion till algoritmer - Lektion 3 Matematikgymnasiet, Läsåret Lektion 3

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

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

FÖRSLAG TILL LÖSNING AV Tentamen i Objektorienterad programmering C++ I

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

Föreläsning 2, vecka 8: Repetition

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

2 Pekare och dynamiska variabler.

Deklarationer/definitioner/specifikationer

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

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

Enkla datatyper minne

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Outline. I Vi kan lätt göra samma sak för fyra variabler... I Hur gör vi för 400 inlästa värden? I Ofta behöver man flera likadana variabler

Tentamen i Algoritmer & Datastrukturer i Java

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

COBOL. från grunden. monitors. Peter Sterwe. training people

C++ Lektion Tecken och teckenfält

Transkript:

Fält (listor) Kontinuerliga listor En lista av värden 2 3 4 5 6 7 8 9... kan naturligtvis representeras av tal1, tal2, tal3,... men det finns då ingen möjlighet att välja element utan att explicit ange vilket av talen i programkoden. Man kan t.ex. inte ge i ett värde och sedan skriva Write(tali); En matematiker löser problemet med hjälp av index (tal i ) Man måste kunna skilja på tali där variabeln består av 4 tecken och tali där variabeln består av 3 tecken och det 4:e tecknet, i, är ett index. I har man löst det genom att index anges inom [ och ] Write(tal[i]); Som index kan allt som har diskret värde användas (även uttryck vars värde är diskret). De listor vi hittills tittat på har varit diskontinuerliga homogena listor. Alla element ligger i en följd i datorns minne och index är då ett offset från första komponenten. En sådan struktur kräver att utrymme reserveras då programmet startas och listorna kan alltså inte inte växa dynamiskt. En homogen kontinuerlig lista kallas för fält, vektor, tabell, lista,... Den måste deklareras: Undre gräns för index Övre gräns för index VAR tal : ARRAY [4..27] OF Integer; Variabelnamn Elementtyp DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 1 / 25 DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 2 / 25 Kontinuerliga listor... Kontinuerliga listor... Vi kan naturligtvis typspecificera allt: TYPE index = 4..27; element = 0..Maxint; vektor = ARRAY [index] OF element; VAR tal: vektor; Om vi skriver : VAR tal: ARRAY[1..20] OF Integer; pos: ARRAY[1..20] OF Integer; så är inte tal och pos av samma typ och man kan inte skriva: tal := pos (vilket man annars kan göra ) men tal[3] := pos[9] går ju bra! Om vi i stället typspecificerar: TYPE vektor = ARRAY[1..20] OF Integer; VAR pos: vektor; tal: vektor; så är tal och pos av samma typ. Man kan också deklarera dem på samma rad VAR tal, pos: ARRAY[1..20] OF Integer; så blir de av samma typ. Detta är en följd av att använder namnekvivalens för typer! Om vi vill ha en kontinuerlig lista som parameter i en funktion måste vi typspecificera annars kan vi inte anropa funktionen! DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 3 / 25 DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 4 / 25

Kontinuerliga listor... Kontinuerliga listor flerdimensionella fält PROGRAM test; FUNCTION sum(var t:table):item; CONST low = 1; VAR tmpsum:item; high = 10; PROCEDURE additem(var i:item); TYPE index = low..high; natural = 0..Maxint; tmpsum := tmpsum + i item = natural; table = ARRAY [index] OF item; VAR tal : table; tmpsum := 0; PROCEDURE dotoeach(var t:table; dotoeach(t, additem); PROCEDURE todo(var i:item)); sum := tmpsum FOR i := low TO high DO todo(t[i]); Huvudprogram Write( Mata in talen ); PROCEDURE readtable(var t:table); readtable(tal); PROCEDURE readitem(var i:item); Writeln( Summan =,sum(tal)). Read(i) dotoeach(t, readitem) TYPE vektor = ARRAY [1..20] OF Integer; matris = ARRAY [1..10] OF vektor; tensor = ARRAY [5..13] OF matris; VAR a : matris; v : vektor;... a[2] := a[3]; a[5] := v; DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 5 / 25 DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 6 / 25 Fält/kontinuerliga listor... Räkna olika sorters tecken i löpande text Man kan inte: Skriva hela fält på skärmen, läsa hela fält från tangentbordet eller jämföra hela fält med varandra. Man skulle även kunna deklarera tensor som: TYPE tensor = ARRAY[5..13, 1..10, 1..20] OF Integer; Vilket är ekvivalent med den tidigare specifikationen. En variabel av typen tensor kan indexeras med 1, 2, eller 3 index. Ex: VAR a: tensor;... a[5] := a[8]; a[5, 3] := a[8, 1]; a[5][3] := a[8, 1];... PROGRAM symbolcount; CONST low = A ; high = Z ; TYPE index = low.. high; vowels = ARRAY [index] OF Boolean; natural = 0..MaxInt; VAR v : vowels; nv, nc, ns : natural; i : index; ch : Char; FOR i := low TO high DO v[i] := i IN [ A, E, I, O, U, Y ]; nv := 0; nc := 0; ns := 0; WHILE NOT EoF DO Read(ch); IF (ch >= low) AND (ch <= high) THEN IF v[ch] THEN nv := Succ(nV) nc := Succ(nC) IF ch <> THEN ns := Succ(nS); WriteLn(nV, vokaler,, nc, konsonanter,, ns, specialtecken ). DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 7 / 25 DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 8 / 25

Representation av textsträngar Representation av textsträngar... (2) PROGRAM txt; CONST strmax = 80; TYPE index = 1..strMax; nchars = 0..strMax; txt = PACKED ARRAY [index] OF Char; string = RECORD contents : txt; length : nchars FUNCTION stringlength(var s: string): nchars; stringlength := s.length PROCEDURE readstring(var s: string); WITH s DO length := 0; WHILE (NOT EoLn) AND (length <= strmax) DO length := Succ(length); Read(contents[length]); PROCEDURE writestring(var s: string); VAR n : nchars; FOR n := 1 TO stringlength(s) DO Write(s.contents[n]); WriteLn DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 9 / 25 DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 10 / 25 Representation av textsträngar... (3) Representation av textsträngar... (4) Procedur som gör små bokstäver till stora i en sträng: Man kan även arbeta med en variabel av typen PACKED ARRAY [...] OF Char; direkt. Vi kan inte läsa en hel sträng men den går att skriva. Obs! att även tilldelning av en sträng med värdet av en strängkonstant går bra! t := Kalle Anka ; OK om t är av typen PACKED ARRAY [1..10] OF Char; PROCEDURE upcase(var s: string); VAR n: nchars; shift : Integer; shift:= Ord( a ) - Ord( A ); WITH s DO FOR n := 1 TO stringlength(s) DO IF (contents[n] >= a ) AND (contents[n] <= z ) THEN contents[n] := Chr(Ord(contents[n]) - shift) IF contents[n] = å THEN contents[n] := Å IF contents[n] = ä THEN contents[n] := Ä IF contents[n] = ö THEN contents[n] := Ö ; DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 11 / 25 DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 12 / 25

Flerdimensionella fält i Kontinuerlig lista för att hantera ett register CONST maxindex = 10; TYPE index = 1..maxIndex; matris = ARRAY [index] OF ARRAY [index] OF Integer; PROCEDURE enhetsmatris(var a:matris); VAR row, col : index; FOR row := 1 TO maxindex DO FOR col := 1 TO maxindex DO IF row = col THEN a[row, col] := 1 a[row, col] := 0; TYPE Namn = PACKED ARRAY [1..maxTal] OF Char; sex = (man, kvinna); inskrivnaar = 1970..2000; npoang = 0..300; studentuppgifter = RECORD fnamn : Namn; enamn : Namn; kon : sex; studieresultat = RECORD student : studentuppgifter; inskriven : inskrivnaar; poang : npoang; studielinje = ARRAY[1..90] OF studieresultat; VAR matematiskdatalogisklinje: studielinje; DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 13 / 25 DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 14 / 25 Kontinuerlig lista för att hantera ett register (2) Kontinuerlig lista för att hantera ett register (3) matematiskdatalogisklinje[3].student.fnamn := Kalle ; Post av typen studieresultat Post av typen studentuppgifter Fält i en post av typen studentuppgifter PROCEDURE readstudent(var s:studentuppgifter); VAR ch: Char; WriteLn( Förnamn ); ReadString(s.fnamn); WriteLn( Efternamn ); ReadString(s.enamn); WriteLn( Ange k för kvinna och m för man ); Readln(ch); IF (ch = K ) OR (ch = k ) THEN s.kon := kvinna IF (ch = M ) OR (ch = m ) THEN s.kon := man DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 15 / 25 DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 16 / 25

Stackar och köer med kontinuerliga listor (stack 1) Stackar och köer med kontinuerliga listor (stack 2) Stack och elementen i stacken representeras av följande: TYPE item = RECORD <user defined> stack = RECORD top: 0..maxNoOfElements; entry: ARRAY [1..maxNoOfElements] OF item FUNCTION empty(s : stack): Boolean; empty := s.top = 0 FUNCTION full(s : stack): Boolean; full := s.top = maxnoofelements PROCEDURE push(var S:stack; e: item); WITH S DO IF top >= maxnoofelements THEN owerflow top := Succ(top); entry[top] := e PROCEDURE pop(var S: stack;var e: item); WITH S DO IF top < 1 THEN underflow e := entry[top]; top := Pred(top) DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 17 / 25 DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 18 / 25 Stackar och köer med kontinuerliga listor (kö 1) Stackar och köer med kontinuerliga listor (kö 2) För kö ser posten ut så här: Kön kan betraktas som cirkulär så att efter sista elementet kommer första. index = 1..maxNoOfElements; queue = RECORD front, rear: index; entry: ARRAY [index] OF item; Och procedurerna som arbetar mot kön: PROCEDURE initqueue (VAR q: queue); WITH q DO front := maxnoofelements; rear := 1 FUNCTION inc (i: index): index; IF i = maxnoofelements THEN inc := 1 inc := succ(i) Om kön är tom så är inc(front) = rear och om den är full så är front = rear FUNCTION empty (VAR q: queue): boolean; empty := inc(q.front) = q.rear DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 19 / 25 DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 20 / 25

Stackar och köer med kontinuerliga listor (kö 3) Lista på en kontinuerlig lista (1) FUNCTION full (VAR q: queue): boolean; full := q.front = q.rear PROCEDURE enqueue (VAR q: queue;i : item); IF full(q) THEN writeln( queue is full! ) WITH q DO entry[rear] := i; rear := inc(rear) PROCEDURE dequeue (VAR q : queue;var i : item); IF empty(q) THEN writeln( q is empty! ) WITH q DO front := inc(front); i := entry[front] En lista baserad på en kontinuerlig lista kan implementeras på följande sätt: CONST maxnoofelements = 10; TYPE item = RECORD tal: Integer lista = RECORD lastelement: 0..maxNoOfElements; cursor: 0..maxNoOfElements; entry: ARRAY [1..maxNoOfElements] OF item PROCEDURE create(var L: lista); cursor := 0; lastelement := 0 DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 21 / 25 DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 22 / 25 Lista på en kontinuerlig lista (2) Lista på en kontinuerlig lista (3) FUNCTION empty(l: lista): Boolean; empty := L.lastElement = 0 FUNCTION full(l: lista): Boolean; full := L.lastElement = maxnoofelements PROCEDURE insert(var L: lista; e: Item); IF NOT full(l) THEN lastelement := lastelement + 1; entry[lastelement] := e PROCEDURE delete(var L: lista); IF (NOT empty(l)) AND (cursor > 0) THEN entry[cursor] := entry[lastelement]; lastelement := lastelement - 1; IF cursor > lastelement THEN cursor := lastelement PROCEDURE next(var L: lista); IF cursor > 0 THEN IF cursor = lastelement THEN cursor := 0 cursor := cursor + 1 DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 23 / 25 DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 24 / 25

Lista på en kontinuerlig lista (4) PROCEDURE previous(var L: lista); IF cursor > 0 THEN cursor := cursor - 1 PROCEDURE locatefirst(var L:lista); IF lastelement > 0 THEN cursor := 1 PROCEDURE retrieve(var L: lista; VAR e: item); IF cursor > 0 THEN e := entry[cursor] DA2001 (Föreläsning 18) Datalogi 1 Hösten 2010 25 / 25