Szybki wstęp do OOP na przykładzie C++

Wielkość: px
Rozpocząć pokaz od strony:

Download "Szybki wstęp do OOP na przykładzie C++"

Transkrypt

1 Szybki wstęp do OOP na przykładzie C++ (wersja 0.1) Marcin Kośmider Instytut Fizyki Uniwersytet Zielonogórski 8 grudzień

2 SPIS TREŚCI SPIS TREŚCI Spis treści 1 Wstęp 3 2 Klasy Wykorzystanie gotowych klas - klasa string Wykorzystanie gotowych klas - operacje wejścia/wyjścia Tworzenie własnych klas i hermetyzacja danych Pliki nagłówkowe Pamięć dynamiczna - konstruktor kopiujący i destruktor Dziedziczenie Konstruktor, destruktor i wywołanie metod klasy bazowej Dziedziczenie i enkapsulacja Polimorfizm 38 5 Abstrakcja 42 2 Materiał dystrybuowany bezpłatnie

3 1 WSTĘP 1 Wstęp Współczesny świat, w tym także współczesna fizyka, nie może się obejść bez metod i technik komputerowych. Dobra znajomość tych technik, jak i szerokiej gamy narzędzi, pozwalają w sposób wygodny i sprawny rozwiązywać i optymalizować problemy oraz zadania napotykane w toku studiów, życiu codziennym i przyszłej pracy zawodowej. Program kierunku fizyka w Instytucie Fizyki Uniwersytetu Zielonogórskiego jest dostosowany do tego wymogu, oczywiście w różnym stopniu w zależności od wybranej specjalności. Mimo sporych różnic programowych w zakresie przedmiotów komputerowych (np. między specjalnością fizyka komputerowa a ekofizyka czy fizyka teoretyczna) część przedmiotów jest wspólna. Jednym z pierwszych wspólnych przedmiotów jest przedmiot Podstawy programowania prowadzony w II semestrze pierwszego roku studiów. Program tego przedmiotu zakłada naukę programowania od zupełnych podstaw - od pojęcia kodu źródłowego, kompilacji, aż po elementy związane z pojęciem klasy. Taki dobór treści jest spowodowany słabym przygotowaniem uczniów z zakresu programowania na poziomie szkoły średniej. W większości przypadków programowanie realizowane było w PASCALU, a jeżeli nawet był to język C++, to nie zawierał on żadnych elementów programowania obiektowego. Dlatego też, mimo iż kurs podstaw programowania trwa cały semestr, to typowa tematyka zawiązana z programowaniem obiektowym najczęściej jest pomijana w trakcie jego trwania (choć zależy to od aktualnego poziomu grup laboratoryjnych i tempa zdobywania umiejętności). Z drugiej strony programowanie obiektowe stanowi współczesny standard programowania i praktycznie niemożliwe jest omawianie współczesnych bibliotek, języków programowania czy frameworków w oderwaniu od pojęć związanych z programowaniem obiektowym i bez zrozumienia jego podstawowych mechanizmów (jak np. omawiać analizę i prezentację danych w SciPy czy mówić o tworzeniu GUI bez zrozumienia programowania obiektowego). Studenci specjalności fizyka komputerowa są w tym wypadku w znacznie lepszej sytuacji ponieważ w ich programie nauczania programowanie obiektowe jest osobnym, kolejnym po podstawach programowania przedmiotem. Celem niniejszego opracowania jest szybkie i łagodne wprowadzenie do pojęć związanych z programowaniem obiektowym na przykładzie języka C++ tak, aby po jego lekturze móc zacząć programować obiektowo na poziomie podstawowym. Opracowanie przeznaczone jest dla każdego kto zna podstawowe elementy języka C/C++ takie jak deklaracje zmiennych, pętle, warunki, funkcje, tablice czy dynamiczną rezerwację pamięci. Nie jest to materiał z zakresu informatyki, bo unika abstrakcyjnego i formalnego języka oraz teoretycznego podejścia całościowego do problematyki OOP, nie ma tutaj zagadnień związanych z UML, z wzorcami projektowymi, z szablonami czy wreszcie nie jest to opis języka C++ i jego bibliotek. Osoby zainteresowane poszerzeniem swojej wiedzy w tym zakresie bez problemu znajdą stosowną literaturę i materiały w internecie. 3 Materiał dystrybuowany bezpłatnie

4 2 KLASY 2 Klasy Klasa to jedno z fundamentalnych pojęć w programowaniu obiektowym. Zanim jednak wyjaśnimy czym jest klasa, zastanówmy się jak postrzegamy rzeczywistość i jaki jest związek naszego postrzegania z programowaniem obiektowym. Obserwując swoje otoczenie, niejako podświadome widzimy i charakteryzujemy występujące w nim przedmioty. Każdy z otaczających nas przedmiotów jest w jakiś sposób charakterystyczny - ma swój kształt, kolor, rozmiar, ma swoje funkcje czy zachowania. Co więcej, bardzo często w danym przedmiocie jesteśmy w stanie wyróżnić inne przedmioty składowe. Te przedmioty składowe także mają swoje własne cechy i zachowania. Jako przykład rozważmy żarówkę. Żarówka, np. ta, która właśnie świeci się w lampce na biurku, ma swój kolor, ma swój kształt, ma konkretną, określoną średnicę gwintu, ma określoną moc i określone napięcie z jakim może pracować. Co więcej, ma ona również dwa stany - włączona, wyłączona oraz charakterystyczne zachowania - świecenie i grzanie się. Inny przykład z naszego otoczenia - pilot od telewizora. Ma on również swój kształt, swój numer seryjny, swój kolor, oraz szereg funkcji - włącz/wyłącz, głośniej/ciszej, przełączanie kanałów itp. Wszystkie przedmioty które nas otaczają nazywamy obiektami. Generalizując możemy powiedzieć, że obiekt to coś konkretnego, coś na co patrzymy, coś co ma swoje unikatowe cechy, coś co może się jakoś zachowywać (np. włącz/wyłącz). Obiektem będzie żarówka, pilot od telewizora, samochód zaparkowany na parkingu przed oknem. Jednak analizując dalej obiekty z naszego otoczenia, możemy wyciągnąć kolejne wnioski. Pewne obiekty są bardzo podobne (prawie identyczne), inne zaś są zupełnie od siebie różne. Każda żarówka ma zespół takich samych wielkości i zachowań, które ją opisują. Każda żarówka ma gwint, każda ma jakiś kolor, każda świeci (poza zepsutą). Każdy pilot od telewizora ma możliwości włączania i wyłączania odbiornika, zmiany kanałów, regulacji głośności, każdy ma jakiś kolor i jest przypisany do jakiegoś modelu lub marki telewizora. Każdy obiekt więc należy do jakiegoś typu, który jednoznacznie go odróżnia od obiektów innego typu. Każda żarówka jest do innych żarówek podobna (np. ma określoną moc), ale zupełnie nie jest podobna do samochodu czy pilota od telewizora. Obiekty różnych typów są czymś zupełnie innym. Co więcej, taki typ w przeciwieństwie do obiektów jest czymś zupełnie abstrakcyjnym, jest pojęciem, a nie konkretną rzeczą. Wykonując polecenie podaj mi żarówkę podajemy konkretną żarówkę, konkretny obiekt (ma kolor, moc etc.) Nie możemy komuś podać żarówki jako abstrakcyjnego typu. Tak samo nie możemy powiedzieć w salonie samochodowym kupuję samochód. Możemy co najwyżej powiedzieć, że chcemy kupić ten konkretny samochód, albo chcemy samochód o pewnych, konkretnych parametrach. Otaczające nas przedmioty są obiektami określonych typów. Właśnie taki typ w programowaniu nazywamy klasą. Klasa jest pewnym szablonem opisującym cechy obiektów i ich zachowania. Jednak klasa mówi tylko jakie są to cechy i zachowania, nie precyzując przy tym wartości tych cech. Klasa żarówka będzie zawierać cechę - moc, ale nie będzie miała wartości tej mocy. Wartość będą miały już konkretne obiekty tej klasy - żarówki. Samochód mały fiat jako klasa (czyli typ) będzie miał 4 Materiał dystrybuowany bezpłatnie

5 2.1 Wykorzystanie gotowych klas - klasa string 2 KLASY pole kolor, ale to konkretny mały fiat jest czerwony. Oczywiście pewne cechy mogą mieć wartość taką samą dla każdego obiektu klasy (np. pojemność silnika malucha ) i wtedy są cechami samej klasy (tzw. pola statyczne klasy). Zespół zachowań jest natomiast wspólny dla każdego obiektu klasy. Każda żarówka świeci, każdy samochód skręca w lewo, każdy pies szczeka. Przekładając obserwacje z realnego świata na programowanie powiemy, że klasa jest pewnym typem, szablonem określającym jakie pola obiekty tej klasy mają oraz określającym zachowania obiektów tej klasy. Pola to po prostu zmienne klasy, a zachowania to funkcje, które w odróżnieniu od zwykłych funkcji (nie zawierających się w klasie) nazywamy metodami tej klasy. A więc klasa to nie tylko nowy typ danych, ale to typ danych wraz z możliwymi zachowaniami tych danych. Podkreślmy po raz kolejny - klasa to szablon, klasa o danej nazwie jest jedna, klasa jest pewnym przepisem, natomiast obiekt to konkretna realizacja tej klasy ( mówimy że obiekt to instancja klasy), obiektów danej klasy może być wiele, ale klasa będzie zawsze jedna. Klasa to mały fiat, a obiekty tej klasy to mały fiat sąsiada, czerwony mały fiat za oknem, klasa to student, ale student Jan Kowalski to już obiekt tej klasy bo ma konkretne cechy (czyli przykładowe pola tej klasy takie jak imię, nazwisko, kierunek studiów, grupa mają konkretne wartości, które odróżniają obiekty klasy student od siebie). 2.1 Wykorzystanie gotowych klas - klasa string Zanim stworzymy swoją pierwszą klasę zobaczmy jak korzystać z gotowych klas dostępnych w bibliotekach języka. Jako przykład wykorzystamy klasę string. Aby móc korzystać z klasy string należy dołączyć plik nagłówkowy. 1 #i n c l u d e <s t r i n g > 2 using namespace s t d ; 3 4 i n t main ( ) 5 { 6 s t r i n g name ; 7 } Listing 1: Obiekty klasy deklarujemy tak samo samo jak zmienne zwykłych typów. Podajemy nazwę klasy (jako typ), a później nazwę zmiennej reprezentującej obiekt tej klasy. W powyższym przykładzie utworzyliśmy obiekt klasy string, obiekt o nazwie name. Jednak w tym wypadku stworzenie obiektu jest czymś znacznie więcej niż zwykłym zdeklarowaniem zmiennej. W momencie, kiedy tworzymy obiekt jakiejś klasy to zawsze odbywa się to poprzez wywołanie specjalnej metody zawartej w klasie (metody czyli funkcji). Metoda nazywa się konstruktorem i wywoływana jest ZAWSZE jako pierwsza w momencie tworzenia klasy. Po co jest konstruktor? Otóż, czasami w momencie tworzenia 5 Materiał dystrybuowany bezpłatnie

6 2.1 Wykorzystanie gotowych klas - klasa string 2 KLASY obiektu danej klasy, chcemy dokładnie określić jak dany obiekt ma być tworzony - np. jaką mają mieć wartość początkową jego atrybuty (pola klasy), czy ma być stworzony jako kopia innego obiekty tej klasy, czy może ma odbyć się dynamiczna rezerwacja pamięci, otwarcie pliku i wiele innych czynności. Jednym słowem, konstruktor odpowiada za skonstruowanie obiektu. Bardzo często klasa dostarcza kilku różnych konstruktorów odpowiadających możliwościom tworzenia obiektów na podstawie różnych danych początkowych. W powyższym programie w momencie tworzenia obiektu wywoływany jest konstruktor bezparametrowy, który tworzy pusty obiekt klasy string. Konstruktory klasy string zostały zebrane w tabeli 1. Konstruktor s t r i n g ( ) s t r i n g ( const s t r i n g & s ) s t r i n g ( const s t r i n g & s, s i z e t pos, s i z e t n ) s t r i n g ( const char t, s i z e t n ) s t r i n g ( const char t ) s t r i n g ( s i z e t n, char c ) Opis Konstruktor bezparametrowy tworzący pusty obiekt klasy string Nowy obiekt klasy string jest tworzony na podstawie już istniejącego obiektu s Nowy obiekt klasy string jest tworzony na podstawie podstringu już istniejącego obiektu s. Podstring zaczyna się na pozycji pos i zawiera n elementów Nowy obiekt klasy string jest tworzony na podstawie n pierwszych elementów tablicy znaków t Nowy obiekt klasy string jest tworzony na podstawie tablicy znaków t Nowy obiekt klasy string zawiera n powtórzeń znaku c Przykłady tworzenia obiektów klasy string: Tablica 1: Konstruktory klasy string 1 #i n c l u d e <i o s t r e a m > 2 #i n c l u d e <s t r i n g > 3 4 using namespace s t d ; 5 6 i n t main ( ) 7 { Listing 2: 6 Materiał dystrybuowany bezpłatnie

7 2.1 Wykorzystanie gotowych klas - klasa string 2 KLASY 8 9 s t r i n g s1 ; // p u s t y s t r i n g 10 s t r i n g s2 ( j a k i s n a p i s ) ; // to samo co s2= j a k i s n a p i s 11 char t []= c s t r i n g ; // t a b l i c a znakow z konczacym NULL 12 // tzw c s t r i n g 13 s t r i n g s3 ( t ) ; // o b i e k t utworzony na p o d s t a w i e t a b l i c y znakow 14 s t r i n g s4 ( s2, 6, 5 ) ; 15 s t r i n g s5 ( 1 0, a ) ; cout << s2 = <<s2<<e n d l ; 18 cout << s3 = <<s3<<e n d l ; 19 cout << s4 = <<s4<<e n d l ; 20 cout << s5 = <<s5<<e n d l ; r e t u r n 0 ; 24 } wynik programu to: s2 = j a k i s n a p i s s3 = c s t r i n g s4 = n a p i s s5 = aaaaaaaaaa Jak już zostało to podkreślone, klasa to nie tylko same dane, ale to dane wraz z metodami, które na tych danych pracują. Metody są wspólne dla wszystkich obiektów danej klasy, jednak wywołuje się je zawsze (z wyjątkiem tzw. metod statycznych) na rzecz konkretnych obiektów. Jest to dość oczywiste - metody to funkcje pracujące na konkretnych danych, a to właśnie konkretne dane są tym, co rozróżnia obiekty tej samej klasy. Jeden człowiek ma na imię Jan a inny Karol, a więc metoda podajimie musi wyraźnie wskazywać kto ma to imię podać, a więc musi być wywołana dla konkretnego obiektu. Jak to zrealizować technicznie ( a właściwie jak to zapisać) zależy od tego czy pracujemy na obiekcie czy na wskaźniku do obiektu. W pierwszym przypadku odwołanie do metody lub atrybutu obiektu odbywa się za pomocą znaku. : s t r i n g s ( n a p i s ) ; cout << s. s i z e ()<< e n d l ; // o d w o l a n i e do metody s i z e na r z e c z o b i e k t u s w drugim przypadku poprzez dwa znaki -> : s t r i n g s ( n a p i s ) ; s t r i n g s1=&s ; cout << s1 >s i z e ()<< e n d l ; // o d w o l a n i e do metody s i z e // na r z e c z o b i e k t u s1 ( p o p r z e z wskaznik ) Programowanie z wykorzystaniem gotowych klas to przede wszystkim paca z dokumentacją dotyczącą konkretnych bibliotek i klas. Celem tego opracowania nie jest przegląd wszystkich standardowych klas wraz z ich metodami, dlatego ograniczymy się do zastosowani kilku metod z klasy string na konkretnym przykładzie. Z całością standardowej dokumentacji zapoznać się można np. pod adresem 7 Materiał dystrybuowany bezpłatnie

8 2.1 Wykorzystanie gotowych klas - klasa string 2 KLASY Napiszmy dla przykładu program, który pobierze z klawiatury napis, wypisze informację o jego długości, następnie wypisze każdą jego literę w nowej linii, a na zakończenie utworzy nowy obiekt klasy string zawierający podany napis, ale zapisany od końca. Dodatkowo program sprawdzi czy napis jest palindromem (w tym wypadku porównanie będzie uwzględniać zarówno wielkość liter jaki i tzw. białe znaki!!!!). Listing 3: 1 #i n c l u d e <i o s t r e a m > 2 #i n c l u d e <a l g o r i t h m > 3 #i n c l u d e <s t r i n g > 4 5 using namespace s t d ; 6 7 i n t main ( ) 8 { 9 10 s t r i n g s1, s2 ; cout << Podaj j a k i s n a p i s <<e n d l ; 13 // czytamy l i n i e 14 g e t l i n e ( cin, s1 ) ; 15 cout << P o d a l e s n a p i s o d l u g o s c i <<s1. s i z e ()<< e n d l ; 16 cout << Zawiera on z n a k i : <<e n d l ; 17 f o r ( i n t i =0; i <s1. s i z e ( ) ; i ++) 18 cout <<s1. at ( i )<<e n d l ; // k o p i a o b i e k t u 21 s2=s1 ; 22 // o d w r o c e n i e 23 r e v e r s e ( s2. b e g i n ( ), s2. end ( ) ) ; 24 cout << Napis od konca to : ; 25 cout <<s2<<e n d l ; 26 // sprawdzamy p a l i n d r o m : 27 i f ( s2==s1 ) 28 cout << Napis j e s t palindromem <<e n d l ; 29 e l s e 30 cout << Napis n i e j e s t palindromem <<e n d l ; 31 r e t u r n 0 ; 32 } W linii 2 dołączamy do naszego programu bibliotekę z algorytmami (część biblioteki STL), a to po to, aby wykorzystać zawartą tam funkcję reverse (uwaga funkcję a nie metodę!!!!!) odwracającą zawartość stringa (w ogólności każdego kontenera). W naszym programie w linii 10 tworzymy dwa puste obiekty klasy string - obiekt o nazwie s1 i obiekt o nazwie s2. Następnie w linii 14 pobieramy dane z klawiatury i zapisujemy je w obiekcie s1. Dane odczytujemy za pomocą funkcji getline po to, aby odczytać wszystkie dane wprowadzone przez użytkownika w danej linii. Zakładamy, że użytkownik poproszony o wprowadzenie napisu może chcieć wpisać jakieś zdanie zawierające białe znaki (spacja, tabulator itp). Gdybyśmy skorzystali z formatowanych operacji wejścia/wyjścia c i n >>s1 ; 8 Materiał dystrybuowany bezpłatnie

9 2.1 Wykorzystanie gotowych klas - klasa string 2 KLASY to wtedy wszystko co zostałoby wprowadzone po znaku spacji zostałoby zignorowane. Funkcja getline nie interpretuje znaków za wyjątkiem znaku końca linii, a więc wczyta wszystkie znaki wprowadzone aż do naciśnięcia klawisza Enter. W linii 17 i 18 wykorzystujemy dwie metody z klasy string - size() i at() wywołując je na rzecz obiektu s1. Pierwsza z nich zwraca długość stringa (a więc mamy pewność, że pętla for przebiegnie po każdej literze napisu), druga zwraca znak znajdując się na pozycji wskazanej przez parametr wywołania metody at(). Od linii 21 zaczyna się druga część naszego programu. Najpierw kopiujemy obiekt s1 jako obiekt s2 wykorzystując przy tym operator przypisania odpowiednio przedefiniowany w klasie string. Następnie korzystając z funkcji revers odwracamy napis zawarty w obiekcie s2. Ważne jest to, że reverse jest funkcją a nie metodą - nie jest ona wywoływana na rzecz żadnego obiektu. Przyjmuje ona dwa parametry - tzw. iteratory początku i końca zakresu kontenera który chcemy odwrócić. Metoda begin() wywołana na rzecz obiektu s2 zwraca iterator (analog do wskaźnika) do początku stringu s2, a metoda end() do jego końca. Na zakończenie wystarczy sprawdzić czy podany napis jest palindromem. Twórcy klasy string zadbali w tym wypadku o stosowne przedefiniowanie operatora porównania (==), a więc możemy go użyć zgodnie z jego przeznaczeniem. Wynik programu jest następujący: Podaj j a k i s n a p i s j a k i s n a p i s P o d a l e s n a p i s o d l u g o s c i 11 Zawiera on z n a k i : j a k i s n a p i s Napis od konca to : s i p a n s i k a j Napis n i e j e s t palindromem a w przypadku palindromu kobyla ma maly bok (uwaga na spacje!!!!) Podaj j a k i s n a p i s kobylamamalybok P o d a l e s n a p i s o d l u g o s c i 15 Zawiera on z n a k i : k o b y l a m a 9 Materiał dystrybuowany bezpłatnie

10 2.2 Wykorzystanie gotowych klas - operacje wejścia/wyjścia 2 KLASY m a l y b o k Napis od konca to : kobylamamalybok Napis j e s t palindromem 2.2 Wykorzystanie gotowych klas - operacje wejścia/wyjścia Jako kolejny przykład wykorzystania gotowych klas i ich obiektów omówmy zagadnienia związane z operacjami wejścia/wyjścia na przykładzie operacji plikowych. Aby móc korzystać z operacji plikowych dołączamy plik nagłówkowy <fstream >. Jak zwykle pracę z klasą zaczynamy od zapoznania się z możliwymi konstruktorami. W tym wypadku nie mamy wielkiego wyboru. Obiekty klasy fstream możemy tworzyć albo tylko poprzez ich deklarację (czyli za pośrednictwem pustego konstruktora), albo podając w momencie tworzenia obiektu nazwę pliku (w postaci c-stringu!!!!) i tryb dostępu do pliku (dokładny opis w dokumentacji). Załóżmy, że chcemy odczytać plik o podanej nazwie (wprowadzonej przez użytkownika) i wyświetlić kilka informacji o tym pliku. Przykładowy plik tekstowy - dane.txt To j e s t l i n i a p i e r w s z a To j e s t l i n i a druga t r z e c i a i k o n i e c p l i k u. i nasz program Listing 4: 1 #i n c l u d e <i o s t r e a m > 2 #i n c l u d e <fstream > 3 #i n c l u d e <s t r i n g > 4 5 using namespace s t d ; 6 7 i n t main ( ) 8 { 9 s t r i n g nazwa ; cout << Podaj nazwe p l i k u <<e n d l ; 12 c i n >>nazwa ; f s t r e a m p l i k ( nazwa. c s t r ( ), f s t r e a m : : i n ) ; // j e s l i o b i e k t n i e z o s t a l utworzony 10 Materiał dystrybuowany bezpłatnie

11 2.2 Wykorzystanie gotowych klas - operacje wejścia/wyjścia 2 KLASY 17 i f ( p l i k. f a i l ( ) ) 18 { 19 cout << Blad zwiazany z otwarciem p l i k u!!!! <<e n d l ; 20 r e t u r n 1 ; 21 } // p l i k o t w a r t y a wiec czytamy dane l i n i a po l i n i i 24 char b u f f [ ] ; w h i l e (! p l i k. e o f ( ) && p l i k. good ( ) ) 27 { 28 p l i k. g e t l i n e ( b u f f, ) ; 29 cout << Wczytano l i n i e z a w i e r a j a c a <<p l i k. gcount ( ) 30 << znakow <<e n d l ; 31 cout << Tresc w c z y t a n e j l i n i i to : <<b u f f <<endl <<e n d l ; 32 } p l i k. c l o s e ( ) ; 35 r e t u r n 0 ; 36 } wynik: Podaj nazwe p l i k u dane. t x t Wczytano l i n i e z a w i e r a j a c a 23 znakow To j e s t l i n i a p i e r w s z a Wczytano l i n i e z a w i e r a j a c a 20 znakow To j e s t l i n i a druga Wczytano l i n i e z a w i e r a j a c a 8 znakow t r z e c i a Wczytano l i n i e z a w i e r a j a c a 15 znakow i k o n i e c p l i k u. Do linii 14 właściwie nie pojawia się nic nowego. W linii 14 definiujemy obiekt o nazwie plik, który jest obiektem klasy fstream. W tym wypadku używamy konstruktora, który wymaga podania nazwy pliku w postaci wskaźnika do tablicy znaków zakończonej znakiem NULL (czyli po prostu c-stringa). W naszym programie nazwa pliku została pobrana z klawiatury i zapisana w obiekcie klasy string. Jednak klasa ta definiuje metodę c str(), która wywołana na rzecz obiektu klasy string zwraca jego elementy w postaci c-stringa. Drugi parametr konstruktora określa typ dostępu do pliku - w tym wypadku fstream::in co oznacza, że plik zostanie otwarty do odczytu. Kolejnym niezbędnym elementem jest sprawdzenie czy udało się otworzyć plik zgodnie z tym co zostało przesłane w konstruktorze (linia 17). Metoda fail() (wywołana na rzecz obiektu plik w tym wypadku) zwraca czy bit błędu jest ustawiony czy nie. Jeżeli wszystko poszło pomyślnie można rozpocząć pracę z plikiem. Aby właściwie przeczytać dane z pliku tekstowego (bez pomijania np. białych znaków) użyjemy nieformatowanych operacji wejścia/wyj- 11 Materiał dystrybuowany bezpłatnie

12 2.3 Tworzenie własnych klas i hermetyzacja danych 2 KLASY ścia. Metoda getline() czyta z pliku jedną linię (jako linię znaków) i przeczytane dane umieszcza w podanej tablicy znaków. Drugi parametr tej metody to maksymalny rozmiar bufora (tablicy w której dane będą zapisywane). Czytanie z pliku linia po linii trwać będzie tak długo, dopóki nie dotrzemy do końca pliku (metoda eof() zwraca true jeśli napotkano koniec pliku) lub nie wystąpił jakiś błąd (metoda good() zwraca wartość true jeśli nie wystąpił błąd w operacjach wejścia/wyjścia). Jako dodatkową informację wyświetlamy na ekranie ilość przeczytanych elementów (linia 29).Metoda gcount zwraca ilość przeczytanych bajtów w trakcie ostatniej wykonanej operacji wejścia/wyjścia. W naszym wypadku operacje to czytanie całej linii z pliku, a więc gcount zwraca ilość znaków w linii, a dokładniej o jeden więcej ze względu na znak nowej linii. 2.3 Tworzenie własnych klas i hermetyzacja danych Programowanie polega na rozwiązywaniu realnych problemów (postrzeganych obiektowo), a więc wcześniej czy później każdy spotka się z koniecznością stworzenia własnych klas stosownych do rozwiązania zadanego problemu. Deklaracja klasy zawiera deklarację jej pól oraz metod i jest informacją dla kompilatora jak postępować z obiektami danej klasy. Aby stworzyć własną klasę używamy słówka kluczowego class. c l a s s ComplexNumber { // t u t a j j e s t c i a l o k l a s y } ; Bardzo ważne jest to, że zamykający nawias } zakończony jest znakiem ;!!!! Przy okazji omawiania tworzenia własnych klas należy wspomnieć o standardach związanych z nazewnictwem. Wprawdzie standardy te nie stanowią formalnego wymogu języka programowania, ale niewątpliwie ułatwiają programowanie i wpływają na jakość kodu źródłowego. Oczywiście standardów jest kilka, jednak na potrzeby tego opracowania przyjmiemy następujące reguły: Nazwy klas piszemy z dużej litery. Jeżeli nazwa składa się z kilku wyrazów, to każdy z nich piszemy dużą literą np. Numbers, ComplexNumbers, Person, DowodOsobisty. Nazwy zmiennych piszemy od małej litery. Jeżeli nazwa składa się z kliku wyrazów, to każdy z nich piszemy od dużej litery (za wyjątkiem pierwszego) np: suma, kolor, mainwindow. Nazwy metod podlegają tym samym regułom co nazwy zmiennych. Stałe piszemy dużymi literami 12 Materiał dystrybuowany bezpłatnie

13 2.3 Tworzenie własnych klas i hermetyzacja danych 2 KLASY Powyższy standard nosi nazwę camel i jest jednym z najpopularniejszych (np. język Java, framework QT). Jak łatwo zauważyć standardu tego nie stosuje np. biblioteka STL (klasa string, vector etc.) W przypadku tworzenia własnych klas należy bardzo wyraźnie odróżnić deklarację klasy od jej definicji. Deklaracja mówi czym klasa jest - jakie ma pola i jakie metody jednak nie zawiera konkretnej implementacji tych metod. W języku C++ wszystkie deklaracje klas powinny się znajdować w plikach nagłówkowych ( o rozszerzeniu.h), a ich definicje w plikach o rozszerzeniu cpp (znowu wspomniana zasada jest pewną konwencją, choć czasami jest wymogiem formalnym - np. QT). Na razie jednak dla prostoty nie będziemy dokonywać takiego rozbicia. Kontynuujmy tworzenie klasy ComplexNumber reprezentującej liczby zespolone. Po pierwsze musimy się zastanowić jakie pola klasa będzie miała. W tym przypadku sytuacja jest oczywista - dwa pola typu double reprezentujące część rzeczywistą i urojoną liczby zespolonej. Drugi etap projektowania klasy to wyróżnienie konstruktorów, a więc sposobów w jaki obiekty klasy mogą być tworzone. Konstruktor to po prostu metoda o nazwie takiej samej jak nazwa klasy, metoda która nic nie zwraca. Jeżeli sami nie napiszemy żadnego konstruktora, to domyślnie tworzone są dwa - konstruktor bezparametrowy i konstruktor kopiujący. Pierwszy nie robi nic, drugi ma za zdanie utworzyć obiekt danej klasy na podstawie przesłanego obiektu tej samej klasy,a więc po prostu ma wykonać kopię obiektu. Zagadnienie konstruktora kopiującego zostanie omówione w jednym z kolejnych podrozdziałów. Listing 5: 1 c l a s s ComplexNumber 2 { 3 double re, im ; 4 5 // k o n s t r u k t o r y 6 // bezparametrowy u s t a w i a j a c y w a r t o s c i r e i im na 0 7 ComplexNumber ( ) 8 { 9 r e =0.0; 10 im =0.0; 11 } // k o n s t r u k t o r z dwoma parametrami im i r e 14 ComplexNumber ( double re, double im ) 15 { 16 t h i s >r e=r e ; 17 t h i s >im=im ; 18 } 19 } ; W drugi konstruktorze tworzone są dwie zmienne lokalne re i im. Nazwy tych zmiennych są dokładnie takie same jak nazwy pól klasy, czyli je przekrywają. Dlatego chcąc ustawić wartość pola klasy musimy dokładnie określić, że chodzi nam o zmienne klasy 13 Materiał dystrybuowany bezpłatnie

14 2.3 Tworzenie własnych klas i hermetyzacja danych 2 KLASY a nie lokalne zmienne tej metody, a więc musimy użyć wskaźnika this. Wskaźnik ten wskazuje nam na ten konkretny obiekt na którym właśnie pracujemy. Oczywiście można by unikać przekrywania nazw i zmienne deklarowane w metodzie nazwać np. a i b, jednak wtedy czytelność kodu dramatycznie się zmniejsza - sama deklaracja metody nie daje nam żadnej informacji co ta metoda będzie robić. Wykorzystajmy naszą klasę (w tym wypadku listing przedstawia cały plik o nazwie zespolone.cpp). Listing 6: 1 #i n c l u d e <i o s t r e a m > 2 using namespace s t d ; c l a s s ComplexNumber 6 { 7 double re, im ; 8 9 // k o n s t r u k t o r y 10 // bezparametrowy u s t a w i a j a c y w a r t o s c i r e i im na 0 11 ComplexNumber ( ) 12 { 13 r e =0.0; 14 im =0.0; 15 } // k o n s t r u k t o r z dwoma parametrami im i r e 18 ComplexNumber ( double re, double im ) 19 { 20 t h i s >r e=r e ; 21 t h i s >im=im ; 22 } 23 } ; i n t main ( ) 26 { 27 ComplexNumber z1 ( 1 0, 5 ) ; 28 r e t u r n 0 ; 29 } Próba kompilacji przebiegnie niepomyślnie, kompilator zwróci następujące błędy: g++ z e s p o l o n e. cpp z e s p o l o n e. cpp : I n f u n c t i o n i n t main ( ) : z e s p o l o n e. cpp : 1 8 : e r r o r : ComplexNumber : : ComplexNumber ( double, d o u b l e ) i s p r i v a t e z e s p o l o n e. cpp : 2 7 : e r r o r : w i t h i n t h i s c o n t e x t W linii 27 próbujemy tworzyć obiekt za pomocą konstruktora przyjmującego dwa parametry. Oczywiście taki konstruktor jest w naszej klasie (linia 18), jednak kompilator zgłosił błąd polegający na próbie dostępu do prywatnych składowych klasy. W języku C++ wszystkie składniki domyślnie są prywatne. 14 Materiał dystrybuowany bezpłatnie

15 2.3 Tworzenie własnych klas i hermetyzacja danych 2 KLASY W tym momencie spotykamy drugie fundamentalne pojęcie związane z programowaniem obiektowym - hermetyzacja danych lub inaczej enkapsulacja. Znowu i tym razem najprościej będzie odwołać się do obserwacji przedmiotów (obiektów) w naszym otoczeniu. Weźmy dla przykładu telewizor. Telewizor jest jakimś obiektem posiadającym mnóstwo atrybutów (oporniki, procesory, tranzystory, kineskop,...) oraz szereg zachowań (włącz, wyłącz, głośniej, ciszej,...). Jednak my jako użytkownicy nie mamy dostępu bezpośredniego do wszystkich elementów telewizora. Mimo, iż praca telewizora polega na zmianie stanu jego atrybutów (np. przyłożenie odpowiedniego napięcia do poszczególnych elementów) to my jako użytkownicy tej zmiany dokonujemy poprzez przygotowany dla nas interfejs (np. pilot), nie mamy dostępu do elementów składowych i nie manipulujemy nimi (nie przełączamy kabelków ). Możemy więc powiedzieć, że elementy wewnętrzne telewizora są jego składowymi prywatnymi. Wszystkie elementy prywatne są niedostępna spoza danej klasy - a więc elementy wewnątrz telewizora wpływają na swoje działanie bezpośrednio, ale my znajdując się na zewnątrz zmiany te wprowadzamy tylko za pośrednictwem publicznych (czyli ogólnodostępnych) metod. Ogólna reguła dobrego programowania mówi, że wszystkie pola powinny być prywatne, a dostęp do nich powinien być realizowany za pośrednictwem publicznych metod. Idea tego podejścia jest znacznie głębsza niż zwykła dbałość o to, aby użytkownik czegoś nie zepsuł. Enkaspulacja zapewnia separację konkretnej realizacji kodu od interfejsu (czyli mówiąc ogólnie metody pracy z klasą). Programista projektujący klasę może dostarczyć metodę string getfirstname() i dla użytkownika tej klasy nie ma znaczenia jak zmienna firstname jest reprezentowana w klasie. Może się zdarzyć tak, że na początku to będzie zwykła zmienna typu string, ale z biegiem czasu metoda ta zwróci wynik wyszukiwania w rozproszonej bazie danych. Dzięki enkaspsulacji, program bazujący na takiej klasie nie ulegnie zmianie bo zmieni się tylko prywatna część klasy, ale interfejs pozostał ten sam. Można to porównać z samochodem. Nie ma znaczenia jaki silnik jest pod maską sposób zmiany biegów, hamowania, przyspieszana i skręcania jest taki sam - działanie silnika jest prywatne, a obsługa samochodu to publiczny interfejs. W języku C++ mamy trzy modyfikatory dostępu do danych - public, private i protected. Pierwszy oznacza, że wszystkie pola i metody znajdujące się za jego deklaracją będą publiczne (a więc dostępne spoza klasy), drugi oznacza, że będą prywatne (a więc dostępne tylko z poziomu tej klasy) i to jest domyślny tryb dostępu, trzeci tryb dostępu ma znaczenie w dziedziczeniu i zostanie omówiony później. Zmieńmy w takim razie naszą klasę, tak aby konstruktory były metodami publicznymi. Listing 7: 1 c l a s s ComplexNumber 2 { 3 double re, im ; 4 5 p u b l i c : 6 // k o n s t r u k t o r y 7 // bezparametrowy u s t a w i a j a c y w a r t o s c i r e i im na 0 8 ComplexNumber ( ) 15 Materiał dystrybuowany bezpłatnie

16 2.3 Tworzenie własnych klas i hermetyzacja danych 2 KLASY 9 { 10 r e =0.0; 11 im =0.0; 12 } // k o n s t r u k t o r z dwoma parametrami im i r e 15 ComplexNumber ( double re, double im ) 16 { 17 t h i s >r e=r e ; 18 t h i s >im=im ; 19 } 20 } ; Wszystkie metody i ewentualne pola począwszy od linii 5 traktowane będą jako publiczne, chyba, że zmienimy dostęp na private. Aby móc przetestować naszą klasę powinniśmy mieć dostęp do informacji o części rzeczywistej i urojonej liczby zespolonej. W obecnej postaci pola te są prywatne i nie możemy się do nich odwołać. Dlatego dodamy do klasy metody dostępowe set (ustawiające pola) i get (pobierające wartości tych pól). Metody takie nazywa się muttator i accesor. Listing 8: 1 2 c l a s s ComplexNumber 3 { 4 double re, im ; 5 6 p u b l i c : 7 // k o n s t r u k t o r y 8 // bezparametrowy u s t a w i a j a c y w a r t o s c i r e i im na 0 9 ComplexNumber ( ) 10 { 11 r e =0.0; 12 im =0.0; 13 } // k o n s t r u k t o r z dwoma parametrami im i r e 16 ComplexNumber ( double re, double im ) 17 { 18 t h i s >r e=r e ; 19 t h i s >im=im ; 20 } // metody dostepowe do p o l void setre ( double r e ) 25 { 26 t h i s >r e=r e ; 27 } void s e t I m ( double im ) 30 { 16 Materiał dystrybuowany bezpłatnie

17 2.3 Tworzenie własnych klas i hermetyzacja danych 2 KLASY 31 t h i s >r e=im ; 32 } double getre ( ) 35 { r e t u r n r e ; } double getim ( ) 38 { r e t u r n im ; } } ; Następnym elementem tworzenia klasy jest dodawanie do niej kolejnych funkcjonalności - obliczenie modułu liczby zespolonej, operacje matematyczne na liczbach czy operacje porównujące dwie liczby. W języku C++ mamy możliwość przedefiniowania operatorów tak, aby praca z obiektami tworzonych klas była jak najbardziej wygodna i intuicyjna. Problem ten jednak wymaga szerszego omówienia i w tym opracowaniu nie zostanie omówiony. Naszą klasę uzupełnimy o dwie metody - metodę obliczającą moduł liczby zespolonej i metodę zwracającą sumę dwóch liczb zespolonych (ale bez przedefiniowania operatora dodawania). Moduł liczby zespolonej to po prostu z = re 2 + im 2. Jednak, aby móc skorzystać z pierwiastkowania musimy do naszego programu dołączyć plik nagłówkowy <cmath >. W przypadku dodawania sprawa jest oczywista: (a + ib) + (c + id) = (a + c) + i(b + d) jednak do rozstrzygnięcia pozostaje inna kwestia - jak zapisać wynik dodawania. Możliwości są co najmniej dwie - albo modyfikujemy liczbę zespoloną (w sensie obiektu klasy ComplexNumber) do której dodajemy inną liczbę, albo w wyniku operacji otrzymujemy nową liczbę zespoloną (nowy obiekt klasy ComplexNumber). Oczywiste jest, że jedynym rozsądnym rozwiązaniem jest opcja druga. Listing 9: 1 #i n c l u d e <i o s t r e a m > 2 #i n c l u d e <cmath> 3 4 using namespace s t d ; c l a s s ComplexNumber 8 { 9 double re, im ; p u b l i c : 12 // k o n s t r u k t o r y 13 // bezparametrowy u s t a w i a j a c y w a r t o s c i r e i im na 0 17 Materiał dystrybuowany bezpłatnie

18 2.3 Tworzenie własnych klas i hermetyzacja danych 2 KLASY 14 ComplexNumber ( ) 15 { 16 r e =0.0; 17 im =0.0; 18 } // k o n s t r u k t o r z dwoma parametrami im i r e 21 ComplexNumber ( double re, double im ) 22 { 23 t h i s >r e=r e ; 24 t h i s >im=im ; 25 } // metody dostepowe do p o l void setre ( double r e ) 30 { 31 t h i s >r e=r e ; 32 } void s e t I m ( double im ) 35 { 36 t h i s >r e=im ; 37 } double getre ( ) 40 { r e t u r n r e ; } double getim ( ) 43 { r e t u r n im ; } // metdoy abs i add 47 double abs ( ) 48 { r e t u r n s q r t ( r e r e + im im ) ; } ComplexNumber add ( ComplexNumber &w) 51 { 52 r e t u r n ComplexNumber (w. getre ()+ re, w. getim ()+im ) ; 53 } } ; i n t main ( ) 58 { 59 ComplexNumber z1 ( 1, 1 ), z2 ( 4, 2 ), z3 ; z3=z1. add ( z2 ) ; 62 cout << Nowa l i c z b a z e s p o l o n a : <<e n d l ; 63 cout << r e = <<z3. getre()<< e n d l ; 64 cout << im = <<z3. getim()<< e n d l ; 65 cout << Modul l i c z b y z e s p o l o n e j z3 = <<z3. abs()<< e n d l ; Materiał dystrybuowany bezpłatnie

19 2.4 Pliki nagłówkowe 2 KLASY 67 r e t u r n 0 ; 68 } Prezentowany powyżej sposób zapisu klasy polegający na pomieszaniu deklaracji z definicjami jest bardzo złym nawykiem. Po pierwsze, kod takiej klasy jest nieczytelny. Użytkownik klasy chciałbym mieć szybki dostęp do informacji na temat dostępnych metod i pól bez konieczności przedzierania się przez kod źródłowy. Po drugie, dobrze napisana klasa będzie wykorzystywana wielokrotnie, a więc umieszczenie deklaracji, definicji i przykładowego wykorzystania w jednym pliku powoduje brak takiej możliwości. Po trzecie klasy często wykorzystują inne pliki nagłówkowe (przykładowo w naszym przypadku cmath). To definicja klasy powinna określać co ma być dołączone aby klasa działała. Użytkownik nie musi, co więcej najczęściej nie chce, wiedzieć co dołącza klasa. Użytkownik chce dołączyć bibliotekę z daną klasą i móc z niej korzystać. I po czwarte przy powyższym zapisie niemożliwe jest używanie zmiennych i metod statycznych ponieważ muszą one być definiowane poza obszarem deklaracji klasy. 2.4 Pliki nagłówkowe Dla przykładu rozpatrzmy klasę Employee reprezentującą pracownika. Załóżmy dla prostoty, że każdy pracownik ma tylko trzy atrybuty go opisujące - imię, nazwisko i stanowisko pracy. Każde z tych pól jest po prostu ciągiem znaków (stringiem). Zgodnie z tym co powiedzieliśmy wcześniej, pola te będą polami prywatnymi, a dostęp do nich realizować będą publiczne metody. Zacznijmy od deklaracji klasy z wyróżnieniem interfejsu. Deklarację zapisujemy w pliku nagłówkowym (z rozszerzeniem.h), najczęściej o nazwie takiej, jak nazwa klasy, która jest w nim deklarowana. W naszym przypadku plik employee.h wyglądałby następująco: Listing 10: 1 // employee. h 2 3 #i f n d e f EMPLOYEE H 4 #d e f i n e EMPLOYEE H 5 6 #i n c l u d e <s t r i n g > c l a s s Employee 10 { 11 // p u b l i c i n t e r f a c e 12 p u b l i c : 13 Employee ( ) { } ; 14 Employee ( s t d : : s t r i n g f irstname, s t d : : s t r i n g secondname, 15 s t d : : s t r i n g p o s i t i o n ) ; 16 Employee ( s t d : : s t r i n g f irstname, s t d : : s t r i n g secondname ) ; Materiał dystrybuowany bezpłatnie

20 2.4 Pliki nagłówkowe 2 KLASY 18 s t d : : s t r i n g g etfirstname ( ) ; 19 s t d : : s t r i n g getsecondname ( ) ; 20 s t d : : s t r i n g g e t P o s i t i o n ( ) ; void s e t P o s i t i o n ( s t d : : s t r i n g p o s i t i o n ) ; // p r i v a t e data 25 p r i v a t e : 26 s t d : : s t r i n g f i r s tname, secondname, p o s i t i o n ; } ; 29 #e n d i f Plik nagłówkowy wymaga pewnego omówienia. Po pierwsze, musimy zabezpieczyć się przed sytuacją, że nasz plik będzie dołączany wielokrotnie do programu. Taka sytuacja spowodowałaby ponowną deklarację klasy o tej samej nazwie, a więc kompilator zgłosiłby błąd. Standardowym rozwiązaniem jest obłożenie deklaracji klasy przez dyrektywy pre-procesora (linia 3,4 i 28). Rozwiązanie sprowadza się do sprawdzenia czy została zdefiniowana zmienna o nazwie EMPLOYEE H. Jeżeli nie, to jest ona definiowana i dołączana jest deklaracja klasy, jeżeli natomiast zmienna była zdeklarowana, to cały kod pomiędzy #ifndef i #endif zostanie pominięty. Drugi problem to używanie using namespace w plikach nagłówkowych. Sprawa jest prosta - nie używać nigdy, ponieważ może to prowadzić do wielu, bardzo trudnych do wyłapania błędów (patrz google: namespace pollution). Plik nagłówkowy nie zawiera konkretnego kodu metod (za wyjątkiem pustego konstruktora) a jedynie deklaruje jakie metody w klasie są, jaki jest do nich dostęp oraz jakie pola klasa posiada. Dość często przyjętym standardem jest wypisywanie najpierw publicznych metod i pól (choć dyskusyjne jest czy takie być powinny), a później dopiero prywatnych składowych klasy. Powód jest bardzo prosty - informacja jak używać obiektów klasy jest dostępna od razu bez konieczności przewijania kolejnych ekranów z kodem. Następnym krokiem jest zaimplementowanie wypisanych metod w pliku z kodem (np. o rozszerzeniu cpp). W naszym przypadku plik nazywa się employee.cpp. Listing 11: 1 // employee. cpp 2 #i n c l u d e employee. h 3 4 using s t d : : s t r i n g ; 5 6 Employee : : Employee ( s t r i n g f irstname, s t r i n g secondname, s t r i n g p o s i t i o n ) 7 { 8 t h i s >f i r s t N a m e=f i r s t N a m e ; 9 t h i s >secondname=secondname ; 10 t h i s >p o s i t i o n=p o s i t i o n ; 11 } Employee : : Employee ( s t r i n g f irstname, s t r i n g secondname ) 14 { 20 Materiał dystrybuowany bezpłatnie

21 2.4 Pliki nagłówkowe 2 KLASY 15 t h i s >f i r s t N a m e=f i r s t N a m e ; 16 t h i s >secondname=secondname ; 17 p o s i t i o n= brak p r z y d z i a l u ; 18 } s t r i n g Employee : : getfirstname ( ) 21 { 22 r e t u r n f i r s t N a m e ; 23 } s t r i n g Employee : : getsecondname ( ) 26 { 27 r e t u r n secondname ; 28 } s t r i n g Employee : : g e t P o s i t i o n ( ) 31 { 32 r e t u r n p o s i t i o n ; 33 } void Employee : : s e t P o s i t i o n ( s t r i n g p o s i t i o n ) 36 { 37 t h i s >p o s i t i o n=p o s i t i o n ; 38 } Po pierwsze musimy dołączyć plik nagłówkowy z deklaracją naszej klasy. W odróżnieniu od plików dołączanych z standardowych bibliotek, nasze pliki nagłówkowe dołączane są poprzez ujęcie nazwy pliku w podwójny cudzysłów. Jeżeli plik znajduje się w jakimś podkatalogu to musimy podać w jego nazwie ścieżkę (względną lub bezwzględną) do tego pliku np. #include src/employee.h. Drugi problem znowu wiąże się z przestrzeniami nazw - nie używamy całej przestrzeni nazw, wystarczy używać tych nazw które są wykorzystywane w naszym kodzie w danym pliku (tutaj std::string - linia 4). Trzecia sprawa, na którą należy zwrócić uwagę, to definicja metod. Nazwa metody MUSI być poprzedzona nazwą klasy (i dwoma znakami ::). Jest to wyraźne określenie do jakiej klasy metoda należy. W jednym pliku źródłowym może znajdować się wiele deklaracji metod należących do różnych klas, co więcej, część tych metod może mieć takie same nazwy i przyjmować takie same parametry. Kompilator musi wiedzieć dokładnie do jakiej klasy dana metoda należy. W przykładach prezentowanych w poprzednich podrozdziałach nie było problemu z jednoznacznością przynależności metod, bo były one definiowane wewnątrz klasy. Znowu łatwa do zapamiętania jest analogia z naszego otoczenia. Nie możemy zdefiniować czynności włącz, możemy co najwyżej powiedzieć jak włączyć światło, jak włączyć telewizor czy pralkę, a więc definiujemy czynność przynależną do konkretnego typu urządzenia (ale nie obiektu, bo każdy obiekt tego typu włącza się tak samo). Kolejną ważną sprawą jest przetestowanie napisanej klasy. Problem testowania i pisa- 21 Materiał dystrybuowany bezpłatnie

22 2.4 Pliki nagłówkowe 2 KLASY nia aplikacji jest bardzo obszernym zagadnieniem, które zdecydowanie wykracza poza to opracowanie. Dla naszych celów warto stosować prostą zasadę - kompilować kod programu po wprowadzeniu każdego nowego elementu kodu (nowej metody, nowej funkcjonalności w metodzie, nowych danych etc.) Nikt nie jest w stanie napisać programu od początku do końca bez żadnego błędu (oczywiście istnieje silna zależność długość kodu - profesjonalizm programisty), a szukanie błędu w 100 czy linii kodu jest po prostu koszmarem. Dlatego też, zanim wykorzystamy naszą klasę przetestujmy czy nie zawiera ona błędów. g++ c employee. cpp Ważne jest aby dodać do g++ opcję -c. Opcja ta powoduje, że plik źródłowy jest kompilowany, ale nie następuje proces linkowania. Bez opcji -c kompilator zasygnalizuje nam błąd braku funkcji main, a więc braku punktu startowego aplikacji. Po kompilacji, w katalogu powinien znajdować się plik z rozszerzeniem.o. Na zakończenie wystarczy zastosować naszą klasę w jakimś konkretnym przypadku: Listing 12: 1 // p r z y k l a d. cpp 2 #i n c l u d e employee. h 3 #i n c l u d e <i o s t r e a m > 4 5 using namespace s t d ; 6 7 i n t main ( ) 8 { 9 10 Employee p1 ( Jan, Kowalski, p r o g r a m i s t a ) ; cout <<p1. getfirstname()<< e n d l ; 13 cout <<p1. getsecondname()<< e n d l ; 14 cout <<p1. g e t P o s i t i o n ()<< e n d l ; cout <<endl <<e n d l ; 17 Employee p2 ( K a r o l, Jankowski ) ; 18 cout <<p2. getfirstname()<< e n d l ; 19 cout <<p2. getsecondname()<< e n d l ; 20 cout <<p2. g e t P o s i t i o n ()<< e n d l ; r e t u r n 0 ; 23 } Jeżeli wcześniej skompilowaliśmy klasę z opcją -c to teraz wystarczy dołączyć skompilowany plik (ten z rozszerzeniem.o): g++ p r z y k l a d. cpp employee. o lub możemy też ponownie skompilować wszystkie pliki źródłowe: g++ p r z y k l a d. cpp employee. cpp 22 Materiał dystrybuowany bezpłatnie

23 2.5 Pamięć dynamiczna - konstruktor kopiujący i destruktor 2 KLASY 2.5 Pamięć dynamiczna - konstruktor kopiujący i destruktor Bardzo często zachodzi potrzeba dynamicznej rezerwacji pamięci w trakcie tworzenia obiektu. Mimo, iż wskaźniki nie stanowią żadnego specjalnie skomplikowanego narzędzia, to w praktyce okazuje się, że podczas nauki, praca z nimi nastręcza najwięcej problemów. Jako przykład rozważmy klasę Tablica, która służy do przechowywania liczb typu double. Oczywiście w praktycznych zastosowaniach pisanie takiej klasy mija się z celem (jest STL i np. klasa vector), ale problem ten idealnie nadaje się do omówienia pracy na wskaźnikach w przypadku klas. Zacznijmy od deklaracji klasy: Listing 13: 1 // a r r a y. h 2 #i f n d e f ARRAY H 3 #d e f i n e ARRAY H 4 5 c l a s s Array 6 { 7 p u b l i c : 8 Array ( i n t s i z e ) ; 9 Array ( ) ; 10 void s e t E l e m e n t ( i n t i, double v a l ) ; 11 void c l e a r ( ) ; 12 double getelement ( i n t i ) ; 13 double getmaximum ( ) ; 14 double getminimum ( ) ; 15 double g e t S i z e ( ) ; p r i v a t e : 18 double tab ; 19 i n t s i z e ; 20 } ; 21 #e n d i f Pojawiła się po raz pierwszy nowa metoda specjalna zwana destruktorem (linia 9). Destruktor to metoda, która jest wywoływana zawsze gdy obiekt danej klasy przestaje istnieć (np. po zakończeniu funkcji). Destruktor to metoda o nazwie takiej jak nazwa klasy, ale poprzedzony znakiem tyldy. Destruktor nie przyjmuje i nie zwraca żadnych argumentów. Rolą destruktora jest posprzątanie po obiekcie, co najczęściej ma formę zwolnienia dynamicznie zarezerwowanej pamięci lub zwolnienia innych zasobów (np. zamknięcie plików). Reszta metod w powyższym kodzie jest oczywista i nie wymaga tłumaczenia. Kolejnym krokiem jest zdefiniowanie metod: 1 // a r r a y. cpp Listing 14: 23 Materiał dystrybuowany bezpłatnie

24 2.5 Pamięć dynamiczna - konstruktor kopiujący i destruktor 2 KLASY 2 #i n c l u d e a r r a y. h 3 4 Array : : Array ( i n t s i z e ) 5 { 6 t h i s >s i z e=s i z e ; 7 tab=new double [ s i z e ] ; 8 c l e a r ( ) ; 9 } Array : : Array ( ) 12 { 13 d e l e t e [ ] tab ; 14 } void Array : : c l e a r ( ) 17 { 18 f o r ( i n t i =0; i <s i z e ; i ++) 19 tab [ i ] = 0. 0 ; 20 } void Array : : s e t E l e m e n t ( i n t i, double v a l ) 23 { 24 i f ( i <0 i >=s i z e ) 25 throw Wrong Array I n d e x ; 26 tab [ i ]= v a l ; 27 } double Array : : getelement ( i n t i ) 30 { 31 i f ( i <0 i >=s i z e ) 32 throw Wrong Array I n d e x ; 33 r e t u r n tab [ i ] ; 34 } 35 double Array : : getmaximum ( ) 36 { 37 double max=tab [ 0 ] ; 38 f o r ( i n t i =1; i <s i z e ; i ++) 39 i f ( tab [ i ]>max ) 40 max=tab [ i ] ; 41 r e t u r n max ; 42 } double Array : : getminimum ( ) 45 { 46 double min=tab [ 0 ] ; 47 f o r ( i n t i =1; i <s i z e ; i ++) 48 i f ( tab [ i ]<min ) 49 min=tab [ i ] ; 50 r e t u r n min ; 51 } double Array : : g e t S i z e ( ) 54 { 24 Materiał dystrybuowany bezpłatnie

25 2.5 Pamięć dynamiczna - konstruktor kopiujący i destruktor 2 KLASY 55 r e t u r n s i z e ; 56 } Konstruktor pobiera informacje o rozmiarze tablicy i na jej podstawie dynamicznie rezerwuje stosowny obszar pamięci, a następnie zeruje elementy tablicy poprzez wywołanie metody clear(). Destruktor (linia 11) zwalnia zarezerwowany w konstruktorze obszar pamięci. Jest to niezwykle ważne ponieważ w momencie zniszczenia obiektu klasy Array, informacja o tym gdzie znajduje się przydzielona dynamicznie pamięć jest tracona, zniszczenie obiektu nie powoduje jej zwolnienia, a więc mamy zarezerwowaną pamięć, do której nie mamy dostępu. Kolejną nowością pojawiającą się w kodzie programu jest wyrzucenie wyjątku. Metody naszej klasy dbają o to, aby nie odnosić się do elementów spoza tablicy. Jeżeli użytkownik spróbuje odnieść się do komórki tablicy spoza jej zakresu, program wyrzuci wyjątek i przestanie działać (linia 25 i 32). Przykład : Listing 15: 1 // t a b l i c a. cpp 2 #i n c l u d e <i o s t r e a m > 3 #i n c l u d e a r r a y. h 4 5 using namespace s t d ; 6 7 main ( ) 8 { 9 Array t a b l i c a ( 1 0 ) ; 10 f o r ( i n t i =0; i <10; i ++) 11 t a b l i c a. s e t E l e m e n t ( i, i ) ; f o r ( i n t i =0; i <12; i ++) 14 cout <<t a b l i c a. getelement ( i )<<e n d l ; r e t u r n 0 ; 17 } kompilacja: g++ a r r a y. cpp t a b l i c a. cpp wynik programu: Materiał dystrybuowany bezpłatnie

26 2.5 Pamięć dynamiczna - konstruktor kopiujący i destruktor 2 KLASY 9 t e r m i n a t e c a l l e d a f t e r t h r o w i n g an i n s t a n c e o f c h a r c o n s t Aborted Pętla wyświetlająca elementy tablicy przekracza jej zakres i program przestaje działać w wyniku wyrzucenia i nieobsłużenia wyjątku. Przy omawianiu konstruktorów wspomnieliśmy, że jeżeli sami nie zdefiniujemy żadnego konstruktora to automatycznie są tworzone dwa konstruktory - bezparametrowy i kopiujący. Jeżeli deklarujemy jakikolwiek konstruktor (za wyjątkiem kopiującego), to domyślnie tworzony jest tylko konstruktor kopiujący. Rolą konstruktora kopiującego jest utworzenie obiektu klasy, na podstawie innego obiektu tej samej klasy. Domyślnie jest to realizowane poprzez kopiowanie wartości pól. Skoro kopiowana jest wartość pól, to w przypadku gdy pole jest wskaźnikiem, kopiowany jest adres przechowywany w zmiennej a nie wartość na jaką on wskazuje. W praktyce oznacza to, że dwa obiekty będą wskazywać na ten sam obszar pamięci. Listing 16: 1 #i n c l u d e <i o s t r e a m > 2 #i n c l u d e a r r a y. h 3 4 using namespace s t d ; 5 6 main ( ) 7 { 8 Array t a b l i c a ( 1 0 ) ; 9 f o r ( i n t i =0; i <10; i ++) 10 t a b l i c a. s e t E l e m e n t ( i, i ) ; // t2 b e d z i e k o p i a t a b l i c a 13 Array t2 ( t a b l i c a ) ; t a b l i c a. s e t E l e m e n t ( 0, ) ; 16 cout <<t2. getelement (0)<< e n d l ; r e t u r n 0 ; 20 } Zmiany w obiekcie tablica będą widoczne również w obiekcie t2. Jednak to nie koniec problemów. Wynik działania tego programu będzie wyglądał mniej więcej tak: 100 g l i b c d e t e c t e d. / a. out : d o u b l e f r e e or c o r r u p t i o n ( top ) : 0 x09b6b008 ======= B a c k t r a c e : ========= / l i b / t l s / i /cmov/ l i b c. so. 6 [ 0 x17b0d1 ] / l i b / t l s / i /cmov/ l i b c. so. 6 [ 0 x17c7d2 ] / l i b / t l s / i /cmov/ l i b c. so. 6 ( c f r e e +0x6d ) [ 0 x17f8ad ] / u s r / l i b / l i b s t d c ++.so. 6 ( ZdlPv+0x21 ) [ 0 xab86f1 ] / u s r / l i b / l i b s t d c ++.so. 6 ( ZdaPv+0x1d ) [ 0 xab874d ] 26 Materiał dystrybuowany bezpłatnie

Laboratorium 1 - Programowanie proceduralne i obiektowe

Laboratorium 1 - Programowanie proceduralne i obiektowe Laboratorium 1 - Programowanie proceduralne i obiektowe mgr inż. Kajetan Kurus 4 marca 2014 1 Podstawy teoretyczne 1. Programowanie proceduralne (powtórzenie z poprzedniego semestru) (a) Czym się charakteryzuje?

Bardziej szczegółowo

Rozdział 4 KLASY, OBIEKTY, METODY

Rozdział 4 KLASY, OBIEKTY, METODY Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej

Bardziej szczegółowo

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Laboratorium z przedmiotu Programowanie obiektowe - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia.

Bardziej szczegółowo

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Java - tablice, konstruktory, dziedziczenie i hermetyzacja Java - tablice, konstruktory, dziedziczenie i hermetyzacja Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU zmienne tablicowe konstruktory klas dziedziczenie hermetyzacja

Bardziej szczegółowo

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02 METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się

Bardziej szczegółowo

Rekurencja (rekursja)

Rekurencja (rekursja) Rekurencja (rekursja) Rekurencja wywołanie funkcji przez nią samą wewnątrz ciała funkcji. Rekurencja może być pośrednia funkcja jest wywoływana przez inną funkcję, wywołaną (pośrednio lub bezpośrednio)

Bardziej szczegółowo

Zadania z podstaw programowania obiektowego

Zadania z podstaw programowania obiektowego Zadania z podstaw programowania obiektowego 1. Napisać klasę Lista, której zadaniem będzie przechowywanie listy liczb całkowitych. Klasa ta ma mieć następujące pola prywatne: int* liczby; tablica, w której

Bardziej szczegółowo

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Programowanie obiektowe, wykład nr 6. Klasy i obiekty Dr hab. inż. Lucyna Leniowska, prof. UR, Zakład Mechatroniki, Automatyki i Optoelektroniki, IT Programowanie obiektowe, wykład nr 6 Klasy i obiekty W programowaniu strukturalnym rozwój oprogramowania oparto

Bardziej szczegółowo

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody Obiektowy PHP Czym jest obiekt? W programowaniu obiektem można nazwać każdy abstrakcyjny byt, który programista utworzy w pamięci komputera. Jeszcze bardziej upraszczając to zagadnienie, można powiedzieć,

Bardziej szczegółowo

Podstawy Programowania 2

Podstawy Programowania 2 Podstawy Programowania 2 Laboratorium 7 Instrukcja 6 Object Pascal Opracował: mgr inż. Leszek Ciopiński Wstęp: Programowanie obiektowe a programowanie strukturalne. W programowaniu strukturalnym, któremu

Bardziej szczegółowo

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji. JAVA Java jest wszechstronnym językiem programowania, zorientowanym obiektowo, dostarczającym możliwość uruchamiania apletów oraz samodzielnych aplikacji. Java nie jest typowym kompilatorem. Źródłowy kod

Bardziej szczegółowo

Zasady programowania Dokumentacja

Zasady programowania Dokumentacja Marcin Kędzierski gr. 14 Zasady programowania Dokumentacja Wstęp 1) Temat: Przeszukiwanie pliku za pomocą drzewa. 2) Założenia projektu: a) Program ma pobierać dane z pliku wskazanego przez użytkownika

Bardziej szczegółowo

Programowanie w językach

Programowanie w językach Programowanie w językach wysokiego poziomu Obsługa plików za pomocą strumieni Elektronika i Telekomunikacja, semestr III rok akademicki 2013/2014 dr inż. Paweł Myszkowski Plan zajęć a) otwieranie i zamykanie

Bardziej szczegółowo

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami 1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami Celem tych zajęć jest zrozumienie i oswojenie z technikami programowania przy pomocy wskaźników w języku C++. Proszę przeczytać rozdział 8.

Bardziej szczegółowo

Definiowanie własnych klas

Definiowanie własnych klas Programowanie obiektowe Definiowanie własnych klas Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski @ pwr.wroc.pl Definiowanie własnych klas Autor:

Bardziej szczegółowo

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main. Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo

Bardziej szczegółowo

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16 M. Trzebiński C++ 1/16 Podstawy języka C++ Maciej Trzebiński Instytut Fizyki Jądrowej Polskiej Akademii Nauk Praktyki studenckie na LHC IFJ PAN 6lipca2015 Uruchomienie maszyny w CC1 M. Trzebiński C++ 2/16

Bardziej szczegółowo

Wprowadzenie do projektu QualitySpy

Wprowadzenie do projektu QualitySpy Wprowadzenie do projektu QualitySpy Na podstawie instrukcji implementacji prostej funkcjonalności. 1. Wstęp Celem tego poradnika jest wprowadzić programistę do projektu QualitySpy. Będziemy implementować

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Laboratorium 1. Wstęp do programowania w języku Java. Narzędzia 1. Aby móc tworzyć programy w języku Java, potrzebny jest zestaw narzędzi Java Development Kit, który można ściągnąć

Bardziej szczegółowo

I - Microsoft Visual Studio C++

I - Microsoft Visual Studio C++ I - Microsoft Visual Studio C++ 1. Nowy projekt z Menu wybieramy File -> New -> Projekt -> Win32 Console Application w okienku Name: podajemy nazwę projektu w polu Location: wybieramy miejsce zapisu i

Bardziej szczegółowo

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej Wykład I - semestr II Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2015 c Copyright 2015 Janusz Słupik Zaliczenie przedmiotu Do zaliczenia przedmiotu niezbędne jest

Bardziej szczegółowo

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno Instrukcja laboratoryjna 2 Podstawy programowania 2 Temat: Zmienne dynamiczne tablica wskaźników i stos dynamiczny Przygotował: mgr inż. Tomasz Michno 1 Wstęp teoretyczny 1.1 Tablice wskaźników Tablice

Bardziej szczegółowo

Pliki. Operacje na plikach w Pascalu

Pliki. Operacje na plikach w Pascalu Pliki. Operacje na plikach w Pascalu ścieżka zapisu, pliki elementowe, tekstowe, operacja plikowa, etapy, assign, zmienna plikowa, skojarzenie, tryby otwarcia, reset, rewrite, append, read, write, buforowanie

Bardziej szczegółowo

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18 Dariusz Wardowski dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18 Literatura Języki i paradygmaty programowania Wykład 2 1. C. S. Horstman, G. Cornell, core Java 2 Podstawy, Helion 2003

Bardziej szczegółowo

Pliki. Informacje ogólne. Obsługa plików w języku C

Pliki. Informacje ogólne. Obsługa plików w języku C Pliki Informacje ogólne Plik jest pewnym zbiorem danych, zapisanym w systemie plików na nośniku danych (np. dysku twardym, pendrive, płycie DVD itp.). Może posiadać określone atrybuty, a odwołanie do niego

Bardziej szczegółowo

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij.

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij. Programowanie Sobera Jolanta 16.09.2006 Strona 1 z 26 1 Wprowadzenie do programowania 4 2 Pierwsza aplikacja 5 3 Typy danych 6 4 Operatory 9 Strona 2 z 26 5 Instrukcje sterujące 12 6 Podprogramy 15 7 Tablice

Bardziej szczegółowo

Kurs WWW. Paweł Rajba. pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/

Kurs WWW. Paweł Rajba. pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/ Paweł Rajba pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/ Spis treści Wprowadzenie Automatyczne ładowanie klas Składowe klasy, widoczność składowych Konstruktory i tworzenie obiektów Destruktory i

Bardziej szczegółowo

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Program, to lista poleceń zapisana w jednym języku programowania zgodnie z obowiązującymi w nim zasadami. Celem programu jest przetwarzanie

Bardziej szczegółowo

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 2. Poprawna definicja wskażnika b to: a) float *a, **b = &a; b) float

Bardziej szczegółowo

Szablony funkcji i szablony klas

Szablony funkcji i szablony klas Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2011 Bogdan Kreczmer Niniejszy dokument

Bardziej szczegółowo

Klasy abstrakcyjne i interfejsy

Klasy abstrakcyjne i interfejsy Klasy abstrakcyjne i interfejsy Streszczenie Celem wykładu jest omówienie klas abstrakcyjnych i interfejsów w Javie. Czas wykładu 45 minut. Rozwiązanie w miarę standardowego zadania matematycznego (i nie

Bardziej szczegółowo

Język programowania. Andrzej Bobyk http://www.alfabeta.lublin.pl. www.alfabeta.lublin.pl/jp/

Język programowania. Andrzej Bobyk http://www.alfabeta.lublin.pl. www.alfabeta.lublin.pl/jp/ Język programowania Andrzej Bobyk http://www.alfabeta.lublin.pl www.alfabeta.lublin.pl/jp/ Literatura K. Reisdorph: Delphi 6 dla każdego. Helion, Gliwice 2001 A. Grażyński, Z. Zarzycki: Delphi 7 dla każdego.

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Wykład 2 Marcin Młotkowski 4 marca 2015 Plan wykładu 1 2 3 4 5 Marcin Młotkowski Programowanie obiektowe 2 / 47 Krótki opis C Obiektowy, z kontrolą typów; automatyczne odśmiecanie;

Bardziej szczegółowo

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego: Typy klasowe (klasy) 1. Programowanie obiektowe Programowanie obiektowe (ang. object-oriented programming) to metodologia tworzenia programów komputerowych, która definiuje programy za pomocą obiektów

Bardziej szczegółowo

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami. UML a kod w C++ i Javie Projektowanie oprogramowania Dokumentowanie oprogramowania Diagramy przypadków użycia Przewoznik Zarzadzanie pojazdami Optymalizacja Uzytkownik Wydawanie opinii Zarzadzanie uzytkownikami

Bardziej szczegółowo

Projektowanie klas c.d. Projektowanie klas przykład

Projektowanie klas c.d. Projektowanie klas przykład Projektowanie klas c.d. ogólne wskazówki dotyczące projektowania klas: o wyodrębnienie klasy odpowiedź na potrzeby życia (obsługa rozwiązania konkretnego problemu) o zwykle nie uda się utworzyć idealnej

Bardziej szczegółowo

ALGORYTMY I STRUKTURY DANYCH

ALGORYTMY I STRUKTURY DANYCH Akademia Rolnicza im. Augusta Cieszkowskiego w Poznaniu - Instytut Inżynierii Rolniczej - ALGORYTMY I STRUKTURY DANYCH Prowadzący: dr inż. Radosław J. Kozłowski email: rjk@au.poznan.pl www: http://www.au.poznan.pl/~rjk

Bardziej szczegółowo

Programowanie 3 - Funkcje, pliki i klasy

Programowanie 3 - Funkcje, pliki i klasy Instytut Informatyki Uniwersytetu Śląskiego Laborki funkcja; parametry funkcji; typ zwracany; typ void; funkcje bez parametrów; napis.length() - jako przykład funkcji. Zadania funkcja dodająca dwie liczby;

Bardziej szczegółowo

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016 Wykład 2 17 marca 2016 Dziedziczenie Klasy bazowe i potomne Dziedziczenie jest łatwym sposobem rozwijania oprogramowania. Majac klasę bazowa możemy ja uszczegółowić (dodać nowe pola i metody) nie przepisujac

Bardziej szczegółowo

10. Programowanie obiektowe w PHP5

10. Programowanie obiektowe w PHP5 Ogólnie definicja klasy wygląda jak w C++. Oczywiście elementy składowe klasy są zmiennymi PHP, stąd nieśmiertelne $. Warto zauważyć, że mogą one mieć wartość HHH mgr inż. Grzegorz Kraszewski TECHNOLOGIE

Bardziej szczegółowo

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje. Podstawowe elementy proceduralne w C++ Program i wyjście Zmienne i arytmetyka Wskaźniki i tablice Testy i pętle Funkcje Pierwszy program // Niezbędne zaklęcia przygotowawcze ;-) #include using

Bardziej szczegółowo

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Jak napisać program obliczający pola powierzchni różnych figur płaskich? Część IX C++ Jak napisać program obliczający pola powierzchni różnych figur płaskich? Na początku, przed stworzeniem właściwego kodu programu zaprojektujemy naszą aplikację i stworzymy schemat blokowy

Bardziej szczegółowo

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, 2015. Wydział Matematyki Stosowanej Politechniki Śląskiej

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, 2015. Wydział Matematyki Stosowanej Politechniki Śląskiej Laboratorium 1 - Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2015 c Copyright 2015 Janusz Słupik Punkty Na laboratorium można zdobyć 60 punktów. Ocena ogólna z zajęć:

Bardziej szczegółowo

Delphi podstawy programowania. Środowisko Delphi

Delphi podstawy programowania. Środowisko Delphi Delphi podstawy programowania Środowisko Delphi Olsztyn 2004 Delphi Programowanie obiektowe - (object-oriented programming) jest to metodologia tworzeniu programów komputerowych definiująca je jako zbiór

Bardziej szczegółowo

Modelowanie diagramów klas w języku UML. Łukasz Gorzel 244631@stud.umk.pl 7 marca 2014

Modelowanie diagramów klas w języku UML. Łukasz Gorzel 244631@stud.umk.pl 7 marca 2014 Modelowanie diagramów klas w języku UML Łukasz Gorzel 244631@stud.umk.pl 7 marca 2014 Czym jest UML - Unified Modeling Language - Rodzina języków modelowania graficznego - Powstanie na przełomie lat 80

Bardziej szczegółowo

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki Turbo Pascal jest językiem wysokiego poziomu, czyli nie jest rozumiany bezpośrednio dla komputera, ale jednocześnie jest wygodny dla programisty,

Bardziej szczegółowo

Politechnika Krakowska im. Tadeusza Kościuszki. Karta przedmiotu. obowiązuje w roku akademickim 2012/2013. Przedmioty kierunkowe

Politechnika Krakowska im. Tadeusza Kościuszki. Karta przedmiotu. obowiązuje w roku akademickim 2012/2013. Przedmioty kierunkowe Wydział Fizyki, Matematyki i Informatyki Politechnika Krakowska im. Tadeusza Kościuszki Karta przedmiotu obowiązuje w roku akademickim 01/013 Kierunek studiów: Informatyka Forma studiów: Stacjonarne Profil:

Bardziej szczegółowo

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład. Część XVII C++ Funkcje Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład. 2 3 Tworzymy deklarację i definicję funkcji o nazwie pobierzln() Funkcja

Bardziej szczegółowo

Modelowanie i Programowanie Obiektowe

Modelowanie i Programowanie Obiektowe Modelowanie i Programowanie Obiektowe Wykład I: Wstęp 20 październik 2012 Programowanie obiektowe Metodyka wytwarzania oprogramowania Metodyka Metodyka ustandaryzowane dla wybranego obszaru podejście do

Bardziej szczegółowo

Wykład 4: Klasy i Metody

Wykład 4: Klasy i Metody Wykład 4: Klasy i Metody Klasa Podstawa języka. Każde pojęcie które chcemy opisać w języku musi być zawarte w definicji klasy. Klasa definiuje nowy typ danych, których wartościami są obiekty: klasa to

Bardziej szczegółowo

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce. Przygotować program tworzący tablicę dwuwymiarową zawierającą zestawy 10 2, 10 4, 10 6 liczb losowych zmiennoprzecinkowych. Korzystając z funkcji bibliotecznych uporządkować zawartość każdego (a) wiersza

Bardziej szczegółowo

Jak Windows zarządza pamięcią?

Jak Windows zarządza pamięcią? Jak Windows zarządza pamięcią? System Windows definiuje dwa typy pamięci, często mylone przez użytkowników. Pamięć fizyczna (pamięc RAM zainstalowana w komputerze) Pamięć widziana przez daną aplikację

Bardziej szczegółowo

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna Język JAVA podstawy Wykład 4, część 1 1 Język JAVA podstawy Plan wykładu: 1. Podstawy modelowania obiektowego 2. Konstruktory 3. Dziedziczenie, związki pomiędzy klasami, UML 4. Polimorfizm 5. Klasy abstrakcyjne

Bardziej szczegółowo

Wprowadzenie do obiektowości

Wprowadzenie do obiektowości Wprowadzenie do obiektowości Obiekt jest abstrakcją pewnego konkretnego bytu ze świata rzeczywistego, reprezentujący rzecz (obiekt fizyczny), pojęcie (obiekt konceptualny) lub pewny byt programistyczny

Bardziej szczegółowo

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna Język JAVA podstawy wykład 2, część 1 1 Język JAVA podstawy Plan wykładu: 1. Rodzaje programów w Javie 2. Tworzenie aplikacji 3. Tworzenie apletów 4. Obsługa archiwów 5. Wyjątki 6. Klasa w klasie! 2 Język

Bardziej szczegółowo

1 Wielokrotne powtarzanie tych samych operacji

1 Wielokrotne powtarzanie tych samych operacji 1 Wielokrotne powtarzanie tych samych operacji Zadanie 1. roszę porównać następujące programy(efekt działania każdego z nich jest takisam). rzykład 1 przedstawia najbardziej typowy zapis, powodujący wykonanie

Bardziej szczegółowo

Język ludzki kod maszynowy

Język ludzki kod maszynowy Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza

Bardziej szczegółowo

Programowanie obiektowe Wykład 1. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20

Programowanie obiektowe Wykład 1. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20 Dariusz Wardowski dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20 O mnie prowadzący wykład: Dariusz Wardowski pokój: A334 dyżur: środa, godz. 10.00 12.00 e-mail: wardd@math.uni.lodz.pl

Bardziej szczegółowo

Politechnika Krakowska im. Tadeusza Kościuszki. Karta przedmiotu. obowiązuje studentów rozpoczynających studia w roku akademickim 2012/2013

Politechnika Krakowska im. Tadeusza Kościuszki. Karta przedmiotu. obowiązuje studentów rozpoczynających studia w roku akademickim 2012/2013 Politechnika Krakowska im. Tadeusza Kościuszki Karta przedmiotu obowiązuje studentów rozpoczynających studia w roku akademickim 01/013 Wydział Fizyki, Matematyki i Informatyki Kierunek studiów: Informatyka

Bardziej szczegółowo

Java Język programowania

Java Język programowania Java Język programowania Język Java Bazuje i jest zbliżony do C/C++ Porosty zbiór typów danych (podział na typy prymitywne i obiektowe) Zarządzanie pamięcią i Garbage Collection Zintegrowana synchronizacja

Bardziej szczegółowo

Informatyka- wykład. Podstawy programowania w Pythonie. dr Marcin Ziółkowski

Informatyka- wykład. Podstawy programowania w Pythonie. dr Marcin Ziółkowski Informatyka- wykład Podstawy programowania w Pythonie dr Marcin Ziółkowski Instytut Matematyki i Informatyki Akademia im. Jana Długosza w Częstochowie 23 listopada 2015 r. JĘZYK PYTHON Język Python jest

Bardziej szczegółowo

Instrukcja laboratoryjna cz.3

Instrukcja laboratoryjna cz.3 Języki programowania na platformie.net cz.2 2015/16 Instrukcja laboratoryjna cz.3 Język C++/CLI Prowadzący: Tomasz Goluch Wersja: 2.0 I. Utworzenie projektu C++/CLI z interfejsem graficznym WPF 1 Cel:

Bardziej szczegółowo

Algorytmika i programowanie usystematyzowanie wiadomości

Algorytmika i programowanie usystematyzowanie wiadomości Temat 1. Algorytmika i programowanie usystematyzowanie wiadomości Cele edukacyjne Usystematyzowanie podstawowych pojęć: algorytm, program, specyfikacja zadania, lista kroków, schemat blokowy, algorytm

Bardziej szczegółowo

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016 Wstęp - wykład 0 22 lutego 2016 Historia Simula 67 język zaprojektowany do zastosowan symulacyjnych; Smalltalk 80 pierwszy język w pełni obiektowy; Dodawanie obiektowości do języków imperatywnych: Pascal

Bardziej szczegółowo

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane Stałe Oprócz zmiennych w programie mamy też stałe, które jak sama nazwa mówi, zachowują swoją wartość przez cały czas działania programu. Można

Bardziej szczegółowo

VII. Ciągi znaków łańcuchy

VII. Ciągi znaków łańcuchy VII. Ciągi znaków łańcuchy 7.1. Wczytywanie tekstu Do tej pory poznaliśmy metodę wczytywania i wyświetlania liczb. Tak samo jak liczby moŝemy wczytać jeden znak, jednak co zrobić jeśli chcielibyśmy wczytać

Bardziej szczegółowo

Wymagania edukacyjne z informatyki dla klasy szóstej szkoły podstawowej.

Wymagania edukacyjne z informatyki dla klasy szóstej szkoły podstawowej. Wymagania edukacyjne z informatyki dla klasy szóstej szkoły podstawowej. Dział Zagadnienia Wymagania podstawowe Wymagania ponadpodstawowe Arkusz kalkulacyjny (Microsoft Excel i OpenOffice) Uruchomienie

Bardziej szczegółowo

C++ - [1-3] Debugowanie w Qt Creator

C++ - [1-3] Debugowanie w Qt Creator Slajd 1 z 10 C++ - [1-3] Debugowanie w Qt Creator Nysa 2004-2013. Autor: Wojciech Galiński. wersja dnia 15 maja 2013 r. Slajd 2 z 10 Pojęcia związane z debugowaniem DEBUGOWANIE (z ang. debugging odrobaczanie)

Bardziej szczegółowo

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Konstruktory Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasę Prostokat: class

Bardziej szczegółowo

Warunek wielokrotnego wyboru switch... case

Warunek wielokrotnego wyboru switch... case Warunek wielokrotnego wyboru switch... case Działanie instrukcji switch jest zupełnie inne niż w przypadku instrukcji if o czym będziesz mógł się przekonać w niniejszym rozdziale. Różnice pomiędzy instrukcjami

Bardziej szczegółowo

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem. WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM NetBeans Wykonał: Jacek Ventzke informatyka sem. VI 1. Uruchamiamy program NetBeans (tu wersja 6.8 ) 2. Tworzymy

Bardziej szczegółowo

Klasy i obiekty cz II

Klasy i obiekty cz II Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Klasy i obiekty cz II Hermetyzacja, mutatory, akcesory, ArrayList Rozwijamy aplikację Chcemy, aby obiekty klasy

Bardziej szczegółowo

Multimedia JAVA. Historia

Multimedia JAVA. Historia Multimedia JAVA mgr inż. Piotr Odya piotrod@sound.eti.pg.gda.pl Historia 1990 rozpoczęcie prac nad nowym systemem operacyjnym w firmie SUN, do jego tworzenia postanowiono wykorzystać nowy język programowania

Bardziej szczegółowo

Program 14. #include #include using namespace std;

Program 14. #include <iostream> #include <ctime> using namespace std; Program 14 Napisać: * funkcję słuŝącą do losowego wypełniania tablicy liczbami całkowitymi z podanego zakresu (*). Parametrami funkcji mają być tablica, jej długość oraz dwie liczby stanowiące krańce przedziału

Bardziej szczegółowo

Wstęp do Programowania, laboratorium 02

Wstęp do Programowania, laboratorium 02 Wstęp do Programowania, laboratorium 02 Zadanie 1. Napisać program pobierający dwie liczby całkowite i wypisujący na ekran największą z nich. Zadanie 2. Napisać program pobierający trzy liczby całkowite

Bardziej szczegółowo

WYKŁAD. Jednostka prowadząca: Wydział Techniczny. Kierunek studiów: Elektronika i telekomunikacja. Nazwa przedmiotu: Język programowania C++

WYKŁAD. Jednostka prowadząca: Wydział Techniczny. Kierunek studiów: Elektronika i telekomunikacja. Nazwa przedmiotu: Język programowania C++ Jednostka prowadząca: Wydział Techniczny Kierunek studiów: Elektronika i telekomunikacja Nazwa przedmiotu: Język programowania C++ Charakter przedmiotu: podstawowy, obowiązkowy Typ studiów: inŝynierskie

Bardziej szczegółowo

Ćwiczenie: JavaScript Cookies (3x45 minut)

Ćwiczenie: JavaScript Cookies (3x45 minut) Ćwiczenie: JavaScript Cookies (3x45 minut) Cookies niewielkie porcje danych tekstowych, które mogą być przesyłane między serwerem a przeglądarką. Przeglądarka przechowuje te dane przez określony czas.

Bardziej szczegółowo

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej Wykład II - semestr II Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2015 c Copyright 2015 Janusz Słupik Operacje dyskowe - zapis do pliku #include #include

Bardziej szczegółowo

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Zaawansowane programowanie w języku C++ Biblioteka standardowa Zaawansowane programowanie w języku C++ Biblioteka standardowa Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka

Bardziej szczegółowo

Klasy i obiekty. Programowanie zorientowane obiektowo. Case study: Filmoteka Case study: Klasa Akademik

Klasy i obiekty. Programowanie zorientowane obiektowo. Case study: Filmoteka Case study: Klasa Akademik Klasy i obiekty. Programowanie zorientowane obiektowo. Case study: Filmoteka Case study: Klasa Akademik Dlaczego obiekty Załóżmy, że mamy napisać program o następującej specyfikacji: 1. Program wyświetla

Bardziej szczegółowo

Java Podstawy. Michał Bereta www.michalbereta.pl mbereta@pk.edu.pl

Java Podstawy. Michał Bereta www.michalbereta.pl mbereta@pk.edu.pl Prezentacja współfinansowana przez Unię Europejską ze środków Europejskiego Funduszu Społecznego w ramach projektu Wzmocnienie znaczenia Politechniki Krakowskiej w kształceniu przedmiotów ścisłych i propagowaniu

Bardziej szczegółowo

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. 1. Rodzaje pamięci używanej w programach Pamięć komputera, dostępna dla programu,

Bardziej szczegółowo

Temat 1. Podstawy Środowiska Xcode i wprowadzenie do języka Objective-C

Temat 1. Podstawy Środowiska Xcode i wprowadzenie do języka Objective-C Temat 1. Podstawy Środowiska Xcode i wprowadzenie do języka Objective-C Wymagana wiedza wstępna: 1) Student musi 1) Znać język C 2) Znać zasady zarządzania pamięcią w komputerze 3) Znać pojecie wskaźnika

Bardziej szczegółowo

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre) Uwagi dotyczące notacji kodu! Wyrazy drukiem prostym -- słowami języka VBA. Wyrazy drukiem pochyłym -- inne fragmenty kodu. Wyrazy w [nawiasach kwadratowych] opcjonalne fragmenty kodu (mogą być, ale nie

Bardziej szczegółowo

PRZEWODNIK PO PRZEDMIOCIE

PRZEWODNIK PO PRZEDMIOCIE Nazwa przedmiotu: Podstawy programowania komputerów Computer programming basics Kierunek: Mechatronika Rodzaj przedmiotu: obowiązkowy Rodzaj zajęć: wykład, laboratorium Forma studiów: stacjonarne Poziom

Bardziej szczegółowo

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych Obiekty reprezentują pewne pojęcia, przedmioty, elementy rzeczywistości. Obiekty udostępniają swoje usługi: metody operacje,

Bardziej szczegółowo

Metody Metody, parametry, zwracanie wartości

Metody Metody, parametry, zwracanie wartości Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Metody Metody, parametry, zwracanie wartości Metody - co to jest i po co? Metoda to wydzielona część klasy, mająca

Bardziej szczegółowo

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych: Zmienna i typ Pascal typy danych Zmienna to obiekt, który może przybierać różne wartości. Typ zmiennej to zakres wartości, które może przybierać zmienna. Deklarujemy je w nagłówku poprzedzając słowem kluczowym

Bardziej szczegółowo

PARADYGMATY PROGRAMOWANIA Wykład 3

PARADYGMATY PROGRAMOWANIA Wykład 3 PARADYGMATY PROGRAMOWANIA Wykład 3 Definiowanie operatorów i ich przeciążanie Przykłady zastosowania operatorów: a) operator podstawienia ( = ) obiektów o złożonej strukturze, b) operatory działania na

Bardziej szczegółowo

Lekcja 10. Uprawnienia. Dołączanie plików przy pomocy funkcji include() Sprawdzanie, czy plik istnieje przy pmocy funkcji file_exists()

Lekcja 10. Uprawnienia. Dołączanie plików przy pomocy funkcji include() Sprawdzanie, czy plik istnieje przy pmocy funkcji file_exists() Paweł Gmys PHP strona 1 Lekcja 10 Uprawnienia Aby skrypt PHP mógł odwołać się do pliku, musi mieć odpowiednie uprawnienia. Szczegóły są zależne od serwera. Najczęściej chyba skrypt ma uprawnienia takie,

Bardziej szczegółowo

Java jako język programowania

Java jako język programowania Java jako język programowania Interpretowany programy wykonują się na wirtualnej maszynie (JVM Java Virtual Machine) Składnia oparta o język C++ W pełni zorientowany obiektowo (wszystko jest obiektem)

Bardziej szczegółowo

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej Podstawy informatyki Informatyka stosowana - studia niestacjonarne Grzegorz Smyk Wydział Inżynierii Metali i Informatyki Przemysłowej Akademia Górniczo Hutnicza im. Stanisława Staszica w Krakowie, rok

Bardziej szczegółowo

Kompletna dokumentacja kontenera C++ vector w - http://www.cplusplus.com/reference/stl/vector/

Kompletna dokumentacja kontenera C++ vector w - http://www.cplusplus.com/reference/stl/vector/ STL, czyli o co tyle hałasu W świecie programowania C++, hasło STL pojawia się nieustannie i zawsze jest o nim głośno... często początkujące osoby, które nie znają STL-a pytają się co to jest i czemu go

Bardziej szczegółowo

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton Dzisiejszy wykład Wzorce projektowe Visitor Client-Server Factory Singleton 1 Wzorzec projektowy Wzorzec nazwana generalizacja opisująca elementy i relacje rozwiązania powszechnie występującego problemu

Bardziej szczegółowo

Programowanie Komputerów 2FD. Materiały pomocnicze do laboratorium

Programowanie Komputerów 2FD. Materiały pomocnicze do laboratorium Programowanie Komputerów 2FD Materiały pomocnicze do laboratorium 2 Spis treści ZAJĘCIA 1. WPROWADZENIE... 4 1. ZAPOZNANIE SIĘ ZE ŚRODOWISKIEM PRACY... 4 Praca w sieci lokalnej... 4 Sposób logowania...

Bardziej szczegółowo

Programowanie (C++) NI 5

Programowanie (C++) NI 5 Forma kształcenia i sposób weryfikacji efektów kształcenia Efekty kształcenia WYDZIAŁ FIZYKI UwB kierunek studiów: FIZYKA specjalność: FIZYKA KOD USOS: 0900 FS1 2 PRO Karta przedmiotu Przedmiot moduł ECTS

Bardziej szczegółowo