TDDC76 - Programmering och Datastrukturer

Relevanta dokument
TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs

Tommy Färnqvist, IDA, Linköpings universitet

TDIU01 - Programmering i C++, grundkurs

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

TDIU01 (725G67) - Programmering i C++, grundkurs

C++ - En introduktion

TDIU01 - Programmering i C++, grundkurs

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

TDDC76 - Programmering och Datastrukturer

TDIU01 Programmering i C++

Programmering i C++ EDA623 Typer. EDA623 (Föreläsning 4) HT / 33

Minnestilldelning (allokering) och frigörande (avallokering) av minne

TDDC76 - Programmering och Datastrukturer

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

Innehåll. Resurshantering. Resource handles. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 6. Resurshantering

TDIU01 - Programmering i C++, grundkurs

Föreläsning 6: Introduktion av listor

TDDC76 - Programmering och Datastrukturer

Föreläsning 10. Pekare (Pointers)

Innehåll. Pekare Syntax

2 Pekare och dynamiska variabler.

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

C++ - En introduktion

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

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

Skizz till en enkel databas

Det finns många flaggor till g++,

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Tentamen EDAF30 Programmering i C++

Föreläsning 5: Introduktion av pekare

5 Arv och dynamisk bindning FIGUR

*Pekarvärden *Pekarvariabler & *

Pekare och arrayer. Indexering och avreferering

TDDC77 Objektorienterad Programmering

Nedan skapar vi klassen Person innehållande datamedlemmar för förnamn, efternamn, ålder, längd och vikt:

Att använda pekare i. C-kod

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Innehåll. EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Viktiga skillnader mot Java

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

TDDC76 - Programmering och Datastrukturer

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

KLASSER. Inkapsling Abstrakt datatyp Public och private. Klassmedlemmar Datamedlemmar Exempel Funktionsmedlemmar

struct egendefinierad typ struct LECTURE_TYPE { char teacher[99]; float lengthinminutes; char type; /* L = lecture, E = exercise */ };

Enkla datatyper minne

Introduktionslaboration

1 Klasser och objektorientering Vad är objektorientering?

Första exemplet. Kompilator & länkare. Projekt. Övning 1, Ögrupp 4, Programsystemkonstruktion med C++, Ronnie Johansson,

C++ Objektorientering - Klasser. Eric Elfving

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

grundläggande C++, funktioner m.m.

TDDC76 - Programmering och Datastrukturer

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

+Överskådlighet Normalt sätt blir ett program skrivet i det procedurella paradigmet överskådligt. Modifikationer på delproblem kan ske med lätthet.

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

Föreläsning 3.1: Datastrukturer, en översikt

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Klasser. Det är egentligen nu som kursen i programmeringsteknik börjar..., s k objektorienterad programmering.

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

ÖREBRO UNIVERSITET. Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 13.

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Innehåll. Pekare Exempel

Poster ( structar ) Postdeklarationer

Övningar Dag 2 En första klass

Operatoröverlagring. endast operatorsymboler definierade i C++ kan överlagras = += -= *= /= %= ^= &= = <<= >>= < > <= >= ==!= && > ->*, [ ] ( )

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

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Imperativ programmering (Fö 1 2) C++ Ett första programexempel. Enkel in- och utmatning strömbiblioteket

Transkript:

TDDC76 - Programmering och Datastrukturer Pekare och Listor Eric Elfving Institutionen för datavetenskap

1 / 21 Översikt Internminne Pekare Dynamiska datastrukturer (Enkellänkade) listor

2 / 21 Internminne - RAM Datorns internminne (RAM, random access memory) består av en ordnad sekvens bitar Vi kan normalt sett adressera (komma åt) en byte i taget (8 bitar)

3 / 21 Minne

4 / 21 Minne Vad händer i minnet? int x {3421}; x: int 3421

5 / 21 Variabler En variabel har alltid: Ett namn En datatyp Ett värde En adress

6 / 21 Pekare En pekare lagrar en adress till en given position i minnet Deklareras med en asterisk (*) int * ip;

7 / 21 Pekare Man kan ta fram adressen till en variabel med adressoperatorn (&) int x {3421}; int * ip {&x}; int x: ip: 3421

8 / 21 Pekare För att komma åt det värde en pekare pekar på används avrefereringsoperatorn (*) #include <iostream> using namespace std; int main() { int x {3421}; int *ip {&x}; cout << ip << endl; cout << *ip << endl; return 0; } 14 3421 Vi får bara avreferera pekare som pekar på adresser som vårt program äger

9 / 21 Pekare Pekare används oftast för att skapa dynamiskt minne Vi allokerar nytt minne med new-operatorn Vi kan endast nå det nya utrymmet med hjälp av pekaren int* ip; ip = new int; *ip = 5123; int * ip {new int{5123}};

10 / 21 Pekare Minnesläcka Om vi redan pekar på en minnesadress och ber om nytt utrymme tappar vi bort det vi pekade på. Detta kallas minnesläcka, ett av de vanligaste felen när vi jobbar med pekare Vi äger fortfarande utrymmet, men har inget sätt att nå det int* ip {new int{44}}; ip = new int{123}; int 44 int ip: 123

11 / 21 Pekare Om vi vill lämna tillbaka minne till operativsystemet gör vi det med delete-operatorn int *ip {new int{345}}; int ip: 345 delete ip; int ip: 345 OBS, delete ändrar inte på pekarens värde!

12 / 21 Pekare Värdet nullptr betyder inget värde för pekare 1 int * ip{}; // ip sätts till nullptr 2 ip = new int{}; // det nya heltalet får värdet 0 3 delete ip; 4 ip = nullptr; kodrad: 1 2 3 4 Minnet: int ip: ip: 0 int ip: 0 ip:

13 / 21 Pekare void f(int *p) { delete p; p = new int{2}; } int main() { int *ptr {new int{12}}; f(ptr); cout << *ptr << endl; delete ptr; } Vad händer?

14 / 21 Pekare Precis som vanligt måste vi ta emot referenser om vi vill ändra på värden: void f(int *& p) { delete p; p = new int{2}; } int main() { int *ptr {new int{12}}; f(ptr); cout << *ptr << endl; delete ptr; }

15 / 21 Alias Om man tycker det är jobbigt med alla asterisker kan man skapa ett nytt namn för en typ med aliasdefinition Skrivs på formen using NAMN = TYPBESKRIVNING; using int_ptr = int *; void f(int_ptr & p); int main() { int_ptr ptr { new int{4} }; delete ptr; }

16 / 21 Pekare till poster För att komma åt fälten i poster kan man använda sig av medlemsåtkomstoperatorn (->) struct Book { string title; string author; int pages; }; Book *bp { new Book }; bp->title = "C++ Primer"; Man kan använda avreferering också, men då krävs parenteser cout << (*bp).title << endl;

17 / 21 Dynamiska datastrukturer En dynamisk datastruktur kan ändra storlek under programkörningen Vi har redan använt en dynamisk datastruktur, string Det finns många fler inbyggda i std, exempelvis vector som kan lagra flera värden av en viss typ.

18 / 21 Dynamiska datastrukturer Tänk er att vi vill stoppa in ett värde sorterat i en vector. Då behöver vi: Hitta rätt position 7 0 4 12 17 0 1 2 3

18 / 21 Dynamiska datastrukturer Tänk er att vi vill stoppa in ett värde sorterat i en vector. Då behöver vi: Hitta rätt position Utöka storleken 7 0 4 12 17? 0 1 2 3 4

18 / 21 Dynamiska datastrukturer Tänk er att vi vill stoppa in ett värde sorterat i en vector. Då behöver vi: Hitta rätt position Utöka storleken Flytta alla värden som ligger efter hittad position 7 0 4 12 17? 0 1 2 3 4

18 / 21 Dynamiska datastrukturer Tänk er att vi vill stoppa in ett värde sorterat i en vector. Då behöver vi: Hitta rätt position Utöka storleken Flytta alla värden som ligger efter hittad position 7 0 4 12 17 17 0 1 2 3 4

18 / 21 Dynamiska datastrukturer Tänk er att vi vill stoppa in ett värde sorterat i en vector. Då behöver vi: Hitta rätt position Utöka storleken Flytta alla värden som ligger efter hittad position Stoppa in värdet 7 0 4 12 12 17 0 1 2 3 4

18 / 21 Dynamiska datastrukturer Tänk er att vi vill stoppa in ett värde sorterat i en vector. Då behöver vi: Hitta rätt position Utöka storleken Flytta alla värden som ligger efter hittad position Stoppa in värdet 7 0 4 7 12 17 0 1 2 3 4

19 / 21 Enkellänkade listor En enkellänkad lista består av noder. En nod är en post som innehåller två saker, ett värde av någon datatyp samt en pekare till nästa nod i listan. Detta gör en pekare till en nod till en lista. Tom lista (eller slutet av listan) markeras med pekarvärdet nullptr. 3 7 9

20 / 21 Enkellänkade listor 3 7 9

21 / 21 Enkellänkade listor Deklaration av en listtyp: struct List_Node { int data; List_Node * next; }; Alternativ lösning med alias: struct List_Node; using List = List_Node *; struct List_Node { int data; List next; };

Eric Elfving Institutionen för datavetenskap www.liu.se