TDIU01 - Programmering i C++, grundkurs

Relevanta dokument
TDDC76 - Programmering och Datastrukturer

TDDC76 - Programmering och Datastrukturer

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

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

TDIU01 - Programmering i C++, grundkurs

Föreläsning 6: Introduktion av listor

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

TDIU01 - Programmering i C++, grundkurs

C++ - En introduktion

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

C++ Objektorientering - Klasser. Eric Elfving

TDDC76 - Programmering och Datastrukturer

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

TDDC76 Programmering och datastrukturer

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

TDDC76 - Programmering och Datastrukturer

TDDC76 - Programmering och Datastrukturer

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

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

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

Funktionens deklaration

C++ - En introduktion

Intro till standardbiblioteket. Eric Elfving

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

TDIU01 - Datortenta (DAT2)

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

Tentamen *:58/ID100V Programmering i C Exempel 3

Det finns många flaggor till g++,

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

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

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

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

2 Pekare och dynamiska variabler.

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

Innehåll. Pekare Syntax

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

Tillämpad programmering

C++-programmets beståndsdelar

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

DD2387 Programsystemkonstruktion med C++ Tentamen 3 Onsdagen 7 januari, 14:00-18:00

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

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

Innehåll. Pekare Exempel

1 Namnkontroll (NameControl)

Innehåll. Pekare Exempel

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

TDDC76 - Programmering och Datastrukturer

Pekare och arrayer. Indexering och avreferering

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

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

Föreläsning 10. Pekare (Pointers)

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

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

DD2387 Programsystemkonstruktion med C++ Tentamen 2

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

Det objektorienterade synsättet. Objekt. Datorprogrammet kan uppfattas som en slags modell av den verklighet programmet skall samverka med.

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

Tentamen EDAF30 Programmering i C++

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

1 Klasser och objektorientering Vad är objektorientering?

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

Introduktionslaboration

Skizz till en enkel databas

TDDC77 Objektorienterad Programmering

Sätt att skriva ut binärträd

5 Arv och dynamisk bindning FIGUR

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Introduktionslaboration

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

*Pekarvärden *Pekarvariabler & *

(Lösningsförslag finns sist i denna fil.)

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

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

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

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

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

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

Föreläsning 3-4 Innehåll

Föreläsning 5: Introduktion av pekare

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

Poster ( structar ) Postdeklarationer

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

Vad är en klass? Övning 2. Konstruktorer. ffl copy-konstruktorn tar en instans av klassen som. ffl default-konstruktorn tar inga argument och kan

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

Innehåll. Användardefinierade typer. Användardefinierade typer Kategorier. Konstruktorer. Konstruktorer Två sätt att skriva initiering av medlemmar

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Att använda pekare i. C-kod

Enkla datatyper minne

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

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

Föreläsning 7. Träd och binära sökträd

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

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

Objektorienterad Programmering (OOP) Murach s: kap 12-16

Transkript:

TDIU01 - Programmering i C++, grundkurs Pekare och Listor Eric Elfving Institutionen för datavetenskap 31 oktober 2014

Översikt 2/41 Internminne Pekare Dynamiska datastrukturer (Enkellänkade) listor Arbeta med flera filer

Internminne - RAM 3/41 Datorns internminne (RAM, random access memory) består av en ordnad sekvens bitar Vi kan normalt sätt adressera (komma åt) en byte i taget (8 bitar)

Minne 4/41

Minne 5/41 Vad händer i minnet? int x 3421; x: int 3421

Variabler 6/41 En variabel har alltid: Ett namn En datatyp Ett värde En adress

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

Pekare I Man kan ta fram adressen till en variabel med adressoperatorn (&) int x 3421; int * ip & x ; 8/41 int x: ip: 3421

Pekare 9/41 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

Pekare I Pekare används oftast för att skapa dynamiskt minne I Vi allokerar nytt minne med new-operatorn I 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/41

Pekare 11/41 Minnesläcka Om vi redan pekar på en allokerad minnesadress och sedan ber om nytt utrymme tappar vi bort det vi pekade på. Detta fenomen kallas minnesläcka Minnesläckor är det vanligaste felet 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

Pekare 12/41 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-operatorn ändrar inte på pekarens värde!

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

Pekare 14/41 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?

Pekare 15/41 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 ;

Alias 16/41 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 = BESKRIVNING; using int_ptr = int *; void f( int_ptr & p); int main () int_ptr ptr new int 4 ; delete ptr ;

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

Dynamiska datastrukturer 18/41 En dynamisk datastruktur kan ändra storlek under programkörningen Vi har redan använt två dynamiska datastrukturer, string och vector Det finns många fler inbyggda i std

Dynamiska datastrukturer 19/41 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

Dynamiska datastrukturer 19/41 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

Dynamiska datastrukturer 19/41 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

Dynamiska datastrukturer 19/41 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

Dynamiska datastrukturer 19/41 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

Dynamiska datastrukturer 19/41 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

Enkellänkade listor 20/41 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

Enkellänkade listor 3 21/41 7 9

Enkellänkade listor 22/41 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 ; ;

Viktigt till labben 23/41 Initiera din lista till nullptr! using List = struct List_Node *; struct List_Node int data ; List next ; ; int main () List l ;

Exempel 24/41 Antag att vi vill lägga till ett värde först i en lista Vi ser (förhoppningsvis) två fall: 1. Vi har en tom lista (inga element) 2. Vi har ett eller flera element

Exempel 25/41 insert_first 1. Tom lista l: Skapa en ny nod och stoppa in värdet l = new List_Node ; l- >data = value ; l- >next = nullptr ; l: value

Exempel 26/41 insert_first 2. Finns värden l: 4 123 Skapa en ny nod med en temporär pekare, stoppa in värdet och få in noden i listan List tmp new List_Node ; tmp - >data = value ; tmp - >next = l; l = tmp ; tmp: value l: 4 123

Exempel 27/41 insert_first void insert_first ( List & l, int value ) if ( l == nullptr ) l = new List_Node value, nullptr ; else List tmp new List_Node value, l ; l = tmp ;

Exempel 28/41 insert_first Vi gör egentligen samma sak i de två fallen! Om l är nullptr stoppar vi in nullptr som next, annars l. Därför kan vi även skriva funktionen såhär: void insert_first ( List & l, int value ) List tmp new List_Node value, l ; l = tmp ;

Exempel 29/41 insert_first Vi behöver inte ens temporären: void insert_first ( List & l, int value ) l = new List_Node value, l; Vi skapar en ny nod vars next-pekare pekar på den nod l pekar på Därefter ändrar vi l så att den pekar på den nya noden

Exempel 30/41 member Tänk er att vi har en sorterad lista Hur gör vi för att ta reda på om ett värde finns i listan? Fyra fall: 1. Tom lista! 2. Eftersökt värde är först i listan. 3. Värdet på första positionen är större än det vi söker efter 4. Värdet på första positionen är lägre än det vi söker efter

Exempel 31/41 member 1. Tom lista: l: Vi vet svaret: false!

Exempel 32/41 member 2. Värdet är först i listan: value: 4 l: 4 123 Vi vet svaret: true!

Exempel 33/41 member 3. Första värdet är större än det vi söker efter: value: 4 l: 32 123 Vi vet svaret: false!

Exempel 34/41 member 4. Första värdet är lägre än det vi söker efter: value: 35 l: 6 123 Värdet kan vara längre bak i listan...

Exempel 35/41 member bool member ( List l, int value ) if ( l == nullptr ) return false ; else if ( l- >data == value ) return true ; else if ( l- >data > value ) return false ; else // Kontrollera om värdet finns i resten av listan return member ( l- >next, value ); // rekursivt anrop!

Exempel 36/41 member Det var ett exempel på en rekursiv lösning, här kommer en iterativ: bool member ( List l, int value ) List cur = l; while ( cur!= nullptr ) if ( cur - >data == value ) return true ; else if ( cur - >data > value ) return false ; cur = cur ->next ; return false ;

Exempel 37/41 Vi måste alltid tänka på fallet tom lista! Om vi försöker komma åt en del av noden när pekaren har värdet nullptr får vi ett sementation fault Listing 1: test.cc # include <iostream > using namespace std ; struct List_Node int data ; List_Node * next ; ; int main () List_Node *l ; cout << l- >data ; $ g++ - std =c ++11 test.cc $./a. out Segmentation fault ( core dumped )

Att arbeta med flera filer 38/41 Hittills har vi skapat våra program med all kod i en cc-fil. Detta kan ställa till det ibland Det blir svårt att hitta i filen Vi måste kopiera kod om vi vill använda listan i flera program I C++ kan man dela upp sin kod i inkluderingsfiler (headerfiler) och implementationsfiler Headerfilen innehåller deklarationer Implementationsfilen innehåller definitioner (all kod)

Att arbeta med flera filer 39/41 # ifndef LIST_H # define LIST_H Listing 2: List.h using List = struct List_Node *; void insert_first ( List &, int ); bool member ( List, int ); # endif Listing 3: List.cc # include " List.h" struct List_Node int data ; List next ; ; void insert_first ( List & l, int value )... bool member ( List l, int value )...

Att arbeta med flera filer 40/41 # include " List.h" Listing 4: list-test.cc # include <iostream > using namespace std ; int main () List l ; for ( int i : 9,5,3,1 ) insert_first (l, i); if ( member (l,3) ) cout << " 3 fanns i listan!" << endl ; $ g++ - std =c ++11 list - test.cc List.cc $./a. out 3 fanns i listan!

www.liu.se