27
Programowanie obiektowe - wprowadzenie Od zmiennej do obiektu Miroslaw Glowacki 1 1 Akademia Górniczo-Hutnicza im. Stanislawa Staszica w Krakowie Wydzial Inżynierii Metali i Informatyki Stosowanej Katedra Informatyki Stosowanej i Modelowania Październik 2017 Miroslaw Glowacki (AGH) Programowanie obiektowe 2017 1 / 27

Programowanie obiektowe - wprowadzenie - Od zmiennej do ...glowacki/docs/matwykl/O-o/_ProgObiekt_OdZmDoMet.pdfMirosław Głowacki (AGH) Programowanie obiektowe 2017 1 / 27. Spistreści

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

  • Programowanie obiektowe - wprowadzenie

    Od zmiennej do obiektu

    Mirosław Głowacki 1

    1Akademia Górniczo-Hutnicza im. Stanisława Staszica w KrakowieWydział Inżynierii Metali i Informatyki StosowanejKatedra Informatyki Stosowanej i Modelowania

    Październik 2017

    Mirosław Głowacki (AGH) Programowanie obiektowe 2017 1 / 27

  • Spis treści

    1 Przykładowy program - specyfikacja wymagań

    2 Programowanie imperatywne

    3 Prosta wersja obiektowa

    4 Wersja obiektowa z ukrywaniem informacji

    5 Zastosowanie przeciążeń operatorów

    6 Program w wielu plikach

    Mirosław Głowacki (AGH) Programowanie obiektowe 2017 2 / 27

  • Spis treści

    1 Przykładowy program - specyfikacja wymagań

    2 Programowanie imperatywne

    3 Prosta wersja obiektowa

    4 Wersja obiektowa z ukrywaniem informacji

    5 Zastosowanie przeciążeń operatorów

    6 Program w wielu plikach

    Mirosław Głowacki (AGH) Programowanie obiektowe 2017 3 / 27

  • Specyfikacja wymagań

    Należy napisać program , który pozwoli na:

    obliczenie położenia węzłówt rójkąta równobocznego, wpisanego wokrąg o zadanym promieniu - pierwszy powinien leżeć na osi OX ,zapamiętanie tych węzłów,wypisanie współrzędnych węzłów na konsoli.

    Program powinien mieć dwie wersje zgodne z paradygmatami :

    programowania imperatywnego,programowania obiektowo zorientowanego.

    Należy również zbudować wersję rozszerzoną programu obiektowozorientowanego – trójkąt należy zastąpić wielokątem .Należy zbudować wersję programu przystosowaną dowielokrotnego użycia .

    Mirosław Głowacki (AGH) Programowanie obiektowe 2017 4 / 27

  • Spis treści

    1 Przykładowy program - specyfikacja wymagań

    2 Programowanie imperatywne

    3 Prosta wersja obiektowa

    4 Wersja obiektowa z ukrywaniem informacji

    5 Zastosowanie przeciążeń operatorów

    6 Program w wielu plikach

    Mirosław Głowacki (AGH) Programowanie obiektowe 2017 5 / 27

  • Klasyczny program imperatywny

    #include #include using namespace std;

    // Obliczanie współrzędnych wierzchołków trójkąta:void wezly(double* tr, double r){

    const double pi = 4*atan(1.);double alfa = 0.;double dalf= 2. * pi / 3.;for(int i = 0; i < 3; i++){

    int j = 2 * i;tr[j] = r*cos(alfa);tr[j+1] = r*sin(alfa);alfa += dalf;

    }}

    Mirosław Głowacki (AGH) Programowanie obiektowe 2017 6 / 27

  • Klasyczny program imperatywny

    // Wypisywanie współrzędnych wierzchołków trójkąta:void pisz(double* tr){

    cout

  • Spis treści

    1 Przykładowy program - specyfikacja wymagań

    2 Programowanie imperatywne

    3 Prosta wersja obiektowa

    4 Wersja obiektowa z ukrywaniem informacji

    5 Zastosowanie przeciążeń operatorów

    6 Program w wielu plikach

    Mirosław Głowacki (AGH) Programowanie obiektowe 2017 8 / 27

  • Prosta wersja obiektowa

    #include #include using namespace std;

    // Struktury:struct punkt{

    double x, y;};

    struct trojkat{punkt p[3];void wezly(double);void pisz();

    };

    Mirosław Głowacki (AGH) Programowanie obiektowe 2017 9 / 27

  • Prosta wersja obiektowa

    // Metody:void trojkat::wezly(double r){

    const double pi = 4 * atan(1.);double alfa = 0.;double dalf = 2. * pi / 3.;for (int i = 0; i < 3; i++){

    p[i].x = r*cos(alfa);p[i].y = r*sin(alfa);alfa += dalf; }

    }void trojkat::pisz(){

    cout

  • Prosta wersja obiektowa

    // Program główny:int main(){

    trojkat t;t.wezly(2.);t.pisz();return 0;

    }

    W centrum zainteresowania są struktury (lub klasy ).

    Procedury zostały zastąpione tzw. metodami - funkcjamizadeklarowanymi wewnątrz struktur.Struktury pozwalają na definiowanie obiektów , a ichwzajemne relacje umożliwiają pewne wysoce pożądanemechanizmy.

    Mirosław Głowacki (AGH) Programowanie obiektowe 2017 11 / 27

  • Spis treści

    1 Przykładowy program - specyfikacja wymagań

    2 Programowanie imperatywne

    3 Prosta wersja obiektowa

    4 Wersja obiektowa z ukrywaniem informacji

    5 Zastosowanie przeciążeń operatorów

    6 Program w wielu plikach

    Mirosław Głowacki (AGH) Programowanie obiektowe 2017 12 / 27

  • Wersja obiektowa z ukrywaniem informacji

    // Klasy:class punkt{

    double x, y;public:

    punkt(double x0 = 0., double y0 = 0.) :x(x0), y(y0){};

    void pisz(){ cout

  • Wersja obiektowa z ukrywaniem informacji

    // Metody:trojkat::trojkat(double r){

    ileTr++;nrTr = ileTr;const double pi = 4 * atan(1.);double alfa = 0.;double dalf = 2. * pi / 3.;for (int i = 0; i < 3; i++){

    p[i] = punkt( r*cos(alfa), r*sin(alfa));alfa += dalf;

    }}void trojkat::pisz(){

    cout

  • Wersja obiektowa z ukrywaniem informacji

    // Program główny:int main(){

    trojkat t;t.pisz();return 0;

    }

    Wprowadzono specyfikator dostępu: public

    Wprowadzono pola statyczne pozwalające naprzechowywanie informacji wspólnych dla wszystkich obiektówklasy.Wewnątrz klas zdefiniowano konstruktory .

    Konstruktory pozwalają na inicjalizację obiektów w tle .

    Mirosław Głowacki (AGH) Programowanie obiektowe 2017 15 / 27

  • Spis treści

    1 Przykładowy program - specyfikacja wymagań

    2 Programowanie imperatywne

    3 Prosta wersja obiektowa

    4 Wersja obiektowa z ukrywaniem informacji

    5 Zastosowanie przeciążeń operatorów

    6 Program w wielu plikach

    Mirosław Głowacki (AGH) Programowanie obiektowe 2017 16 / 27

  • Zastosowanie przeciążeń operatorów// Klasy:class punkt{

    double x, y;public:

    punkt(double x0 = 0., double y0 = 0.) :x(x0), y(y0){};

    };class wielokat{

    static int ileWielok;int nrWielok;int ileWierzch;punkt *p;

    public:wielokat(int = 3, double = 1.);int nrWlk(){ return nrWielok; }int ileWier(){ return ileWierzch; }punkt punktI(int i){ return p[i]; }

    };int wielokat::ileWielok = 0;

    Mirosław Głowacki (AGH) Programowanie obiektowe 2017 17 / 27

  • Zastosowanie przeciążeń operatorów

    // Metody:wielokat::wielokat(int ileW, double r):

    ileWierzch(ileW), nrWielok(++ileWielok){p = new punkt[ileWierzch];const double pi = 4 * atan(1.);double alfa = 0.;double dalf = 2. * pi /ileWierzch;for (int i = 0; i < ileW; i++){

    p[i] = punkt( r*cos(alfa), r*sin(alfa));alfa += dalf;

    }}

    //Przeciążenia operatora coutostream& operator

  • Zastosowanie przeciążeń operatorów

    ostream& operator

  • Zastosowanie przeciążeń operatorów

    Wezly wielokata nr 1:(1, 0)(-0.5, 0.866025)(-0.5, -0.866025)Wezly wielokata nr 2:(5, 0)(2.5, 4.33013)(-2.5, 4.33013)(-5, 6.12303e-016)(-2.5, -4.33013)(2.5, -4.33013)

    Program przystosowano do obliczeń dla dowolnego wielokątarównobocznego - konieczna była dynamiczna deklaracja tablicoperatorem new .Zastosowano przeciążenia operatora cout - proste wypisywanieinformacji o wielokącie.

    Mirosław Głowacki (AGH) Programowanie obiektowe 2017 20 / 27

  • Spis treści

    1 Przykładowy program - specyfikacja wymagań

    2 Programowanie imperatywne

    3 Prosta wersja obiektowa

    4 Wersja obiektowa z ukrywaniem informacji

    5 Zastosowanie przeciążeń operatorów

    6 Program w wielu plikach

    Mirosław Głowacki (AGH) Programowanie obiektowe 2017 21 / 27

  • Pliki kompilowane oddzielnie

    Zaletą programu umieszczonego w wielu plikach jestmożliwość oddzielnej kompilacji tych plików.Ma to szczególne znaczenie dla dużych programów i dajeoszczędność czasu kompilacji.Na ogół liczba plików jest znaczna, ale w naszym prostymprzykładzie będą trzy:

    plik nagłówkowy klasy.hpp zawierający definicje klas -na ogół metody są tu jedynie deklarowane,plik klasy.cpp zawierający definicje metodplik main.cpp zawierający program główny.

    Pliki z rozszerzeniem .cpp będą kompilowane oddzielnie.Plik nagłówkowy zostanie włączony do obu pozostałych plików.

    Mirosław Głowacki (AGH) Programowanie obiektowe 2017 22 / 27

  • Plik nagłówkowy

    #include #include

    using namespace std;

    // klasa punktclass punkt{

    friend ostream& operator

  • Plik nagłówkowy - cd

    // klasa wielokatclass wielokat{

    static int ileWielok;int nrWielok;int ileWierzch;punkt *p;

    public:wielokat(int = 3, double = 1.);int nrWlk();int ileWier();punkt punktI(int i);

    };// operator

  • Plik z definicjami metod#include "klasy.hpp"//klasa punkt

    punkt::punkt(double x0, double y0) : x(x0), y(y0){};// klasa wielokat

    int wielokat::ileWielok = 0;wielokat::wielokat(int ileW, double r):

    ileWierzch(ileW), nrWielok(++ileWielok){p = new punkt[ileWierzch];const double pi = 4 * atan(1.);double alfa = 0.;double dalf = 2. * pi /ileWierzch;for (int i = 0; i < ileW; i++){

    p[i] = punkt( r*cos(alfa), r*sin(alfa));alfa += dalf;

    } }

    Mirosław Głowacki (AGH) Programowanie obiektowe 2017 25 / 27

  • Plik z definicjami metod - cdint wielokat::nrWlk(){ return nrWielok; }int wielokat::ileWier(){ return ileWierzch; }punkt wielokat::punktI(int i){ return p[i]; }

    // przeciązenia operatorówostream& operator

  • Plik programu głównego

    #include "klasy.hpp"

    int main(){wielokat t1(3), t2(6, 5.);cout