• Nie Znaleziono Wyników

Programowanie i struktury danych Programowanie i struktury danych

N/A
N/A
Protected

Academic year: 2021

Share "Programowanie i struktury danych Programowanie i struktury danych"

Copied!
14
0
0

Pełen tekst

(1)

Programowanie i struktury danych Programowanie i struktury danych

Wykład 1 Wykład 1

Dr Piotr Cybula <piotr.cybula@wmii.uni.lodz.pl>

Dr Piotr Cybula <piotr.cybula@wmii.uni.lodz.pl>

(2)

Literatura Literatura

A. Drozdek: C++. Algorytmy i struktury danych.

S. Prata: Język C++. Szkoła programowania.

B. Stroustrup: Język C++.

D. M. Reed, J. Zelle: Data Structures and Algorithms Using Python and C++.

B. Eckel: Thinking in C++. Second edition. Vol. 1.

(http://mindview.net/Books/TICPP/ThinkingInCPP2e.html) S. Lippman, J. Lajoie, B. Moo: C++ Primer. Forth edition.

M. Ben-Ari: Understanding programming languages.

http://cppreference.com http://www.cplusplus.com

(3)

Paradygmaty programowania Paradygmaty programowania

programowanie deklaratywne (powiedz komputerowi co chcesz uzyskać)

programowanie imperatywne (powiedz komputerowi co ma zrobić)

programowanie proceduralne (styl bottom-up):

globalne struktury danych ogólnie dostępne

zestaw niezależnych funkcji tworzących program

programowanie obiektowe (styl top-down):

zabezpieczone i separowane struktury danych («czarna skrzynka»)

funkcje operujące na własnych strukturach danych (metody)

programowanie uogólnione/generyczne (statyczny polimorfizm)

programowanie zorientowane obiektowo (dynamiczny polimorfizm)

programowanie modularne, zdarzeniowe, aspektowe, ...

(4)

Struktury danych w programowaniu Struktury danych w programowaniu

Struktury maszynowe (reprezentacji fizycznej):

elementarne/wbudowane (zmienne liczbowe, znakowe, adresowe)

złożone:

homogeniczne (tablice jedno- i wielowymiarowe, łańcuchy)

heterogeniczne (struktury/rekordy/obiekty, listy łączone, struktury drzewiaste)

Struktury abstrakcyjne (reprezentacji logicznej):

sekwencje

stosy, kolejki

listy uporządkowane, kolejki priorytetowe, kopce

zbiory, słowniki (mapy), drzewa, grafy

(5)

Typ strukturalny Typ strukturalny

Podejście proceduralne (bez enkapsulacji):

struct Obj //własny typ strukturalny { int a;

float b; //pola struktury }; //średnik jest konieczny

void set(Obj &o, int _a, float _b) //funkcja globalna { o.a = _a; //selekcja pola struktury (operator kropki) o.b = _b;

}

int getA(const Obj &o) //funkcja globalna { return o.a;

}

Obj x; //zmienna strukturalna

set(x, 1, 2.5); //wywołanie funkcji zmieniającej strukturę cout << getA(x); //wywołanie funkcji dla struktury

(6)

Typ obiektowy Typ obiektowy

Podejście obiektowe (enkapsulacja):

struct Obj //własny typ obiektowy (klasa) { int a;

float b; //atrybuty klasy

void set(int _a, float _b) //metoda klasy (modyfikator) { a = _a;

b = _b;

} int getA() const //metoda klasy (selektor) { return a;

}};

Obj x; //zmienna obiektowa (instancja klasy)

x.set(1, 2.5); //wywołanie metody dla obiektu

cout << x.getA(); //za pomocą operatora selekcji (kropki) //komunikaty wysyłane do obiektu

(7)

Interfejs i implementacja Interfejs i implementacja

Plik obj.h (interfejs – specyfikacja klasy):

#ifndef MY_OBJ_H //zabezpieczenie przed wielokrotnym dołączeniem

#define MY_OBJ_H

struct Obj { int a, b;

void set(int _a, int _b); //prototyp metody };#endif

Plik obj.cpp (implementacja metod klasy):

#include ”obj.h”

void Obj::set(int _a, int _b) //ciało metody { a = _a; b = _b;

}Plik main.cpp (konsumpcja klasy):

#include ”obj.h”

int main()

{ Obj x; //obiekt

x.set(1, 2); //wywołanie metody }

(8)

Inicjalizacja obiektów Inicjalizacja obiektów

konstruktor – specjalna metoda do inicjalizacji atrybutów obiektu

uruchamiany zawsze przy tworzeniu obiektu

nazwa metody taka jak nazwa klasy

możliwe wiele przeciążeń z różnymi parametrami, brak typu wynikowego!

struct Obj

{ int a, b; //od C++11 możliwa inicjalizacja w klasie, np.

//int a = 0;

Obj(int _a = 0, int _b = 0) //konstruktor { a = _a;

b = _b;

}};

Obj x, y(1), z(1,2), v = 3, u = {3,4}; //wywołania konstruktora Obj t[5], *s = new Obj, *p = new Obj[3]; //wielokrotne

(9)

Konstruktor domy lny ś Konstruktor domy lny ś

Konstruktor domyślny:

bez parametrów (lub gdy wszystkie parametry mają wartości domyślne)

tworzony automatycznie przez kompilator (bez gwarancji inicjalizacji atrybutów obiektu) tylko gdy nie zdefiniowano jawnie żadnego konstruktora

struct Obj { int a, b;

Obj() //konstruktor domyślny { a = 0;

b = 0;

} Obj()=default;//konstruktor domyślny bez inicjalizacji(C++11) };

Obj x, t[5]; //wywołania konstruktora domyślnego Obj *s = new Obj, *p = new Obj[3]; //tu też

(10)

Konstruktor domy lny ś Konstruktor domy lny ś

Konstruktor domyślny:

jeżeli jakikolwiek konstruktor został zdefiniowany, kompilator nie tworzy domyślnego

w celu ułatwienia wykorzystania klasy należy zawsze zdefiniować konstruktor domyślny

struct Obj { int a, b;

Obj(int _a, int _b = 0) //1- lub 2-parametrowy konstruktor { a = _a;

b = _b;

}};

Obj y(1), z(1, 2); //wywołania konstruktora

Obj x; //brak konstruktora domyślnego – błąd kompilacji!

(11)

Konstruktor kopiuj cy ą Konstruktor kopiuj cy ą

Konstruktor kopiujący:

przyjmuje jako jedyny parametr referencję do obiektu tej samej klasy

tworzony automatycznie przez kompilator gdy nie zdefiniowano jawnie takiego konstruktora (kopia atrybutów obiektu)

wywoływany przy przekazywaniu i zwracaniu obiektów w funkcjach

struct Obj { int a, b;

… //inne konstruktory łącznie z domyślnym Obj(const Obj &o) //konstruktor kopiujący { a = o.a;

b = o.b;

}};

Obj x;

Obj y(x), z = x; //wywołania konstruktora kopiującego

(12)

Destrukcja obiektów Destrukcja obiektów

destruktor – specjalna metoda do zwolnienia pamięci zajmowanej przez obiekt

wywoływany automatycznie gdy zmienna przestaje istnieć (na końcu bloku)

metoda o nazwie takiej jak nazwa klasy lecz z poprzedzającą tyldą (~)

możliwy tylko jeden destruktor, brak typu wynikowego!

struct Obj { int a, b;

… //konstruktory łącznie z domyślnym ~Obj() //destruktor

{ ... }

~Obj()=default; //destruktor domyślny (C++11) };

{ Obj x, *p = new Obj; //wywołania konstruktora

delete p; //jawne wywołanie destruktora (obiekt *p) } //niejawne wywołanie destruktora (obiekt x)

(13)

Destrukcja obiektów Destrukcja obiektów

Destruktory obiektów:

tworzone automatycznie przez kompilator gdy nie zostaną jawnie zdefiniowane (destruktor domyślny nie zwalnia pamięci dla atrybutów klasy alokowanych dynamicznie za pomocą operatora new)

uruchamiane w kolejności odwrotnej do kolejności tworzenia obiektów (wywołań odpowiednich konstruktorów)

{ Obj x, *p = new Obj, z;

{ Obj y;

} //destruktor dla obiektu y

delete p; //destruktor dla obiektu *p } //destruktor dla obiektu z i dalej dla x

(14)

Metody domy lne ś Metody domy lne ś

Dla każdej klasy kompilator tworzy automatycznie (o ile nie zdefiniowano ich jawnie) następujące metody:

konstruktor domyślny (bezparametrowy, brak incjalizacji)

konstruktor kopiujący (kopia atrybutów)

destruktor (brak zwolnienia dynamicznej pamięci)

operator przypisania (kopia atrybutów)

struct Obj { int a, b;

};

{ Obj x; //konstruktor domyślny, atrybuty są przypadkowe Obj y = x; //konstruktor kopiujący

x = y; //operator przypisania

} //destruktor domyślny obiektów y i x

Cytaty

Powiązane dokumenty

przedostatniego węzła (ostatniego węzła, którego wskaźnik next jest niepusty) (3) ustawiamy dedykowany wskaźnik (killer) na ostatni węzeł używając adresu. zapisanego we

(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head) i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik

(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head) i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik pred

(2) za pomocą pary pomocniczych wskaźników pred i succ wybieramy węzeł do przeniesienia i przenosimy go do listy tymczasowej za pomocą wskaźnika mover (aktulizując wskaźniki head

● szablony pozwalają na wielokrotne wykorzystanie istniejącego kodu źródłowego struktury danych dla wielu wersji tej struktury z tym samym interfejsem, ale różnymi typami

● strumienie wejścia/wyjścia: iostream, fstream, sstream, iomanip. ●

(3) przestawiamy wskaźnik next w węźle wskazywanym przez pred (lub wskaźnik head gdy pred jest pusty) oraz wskaźnik prev w węźle wskazywanym przez succ (lub wskaźnik tail gdy

Każda linia w tych plikach zawiera dane pojedynczego studenta rozdzielone pojedynczymi spacjami w następującej kolejności: nazwisko, imię (imiona), numer indeksu