Programowanie obiektowe w C++ Wykład 1

Podobne dokumenty
Język C++ Różnice między C a C++

Programowanie obiektowe w C++ Wykład 12

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

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

Podstawy programowania skrót z wykładów:

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Programowanie w języku C++

DYNAMICZNE PRZYDZIELANIE PAMIECI

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

Wstęp do Programowania 2

Programowanie obiektowe W3

Lab 9 Podstawy Programowania

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

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

Podstawy programowania w języku C++

Podstawy algorytmiki i programowania - wykład 1 Tablice powtórzenie Tablice znaków Tablice dwuwymiarowe

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Wstęp do programowania

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

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

Wstęp do programowania

Podstawy algorytmiki i programowania - wykład 5 C-struktury cd.

Wstęp do programowania

Wstęp do programowania

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Wstęp do Programowania 2

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Wstęp do programowania. Wykład 1

Wstęp do informatyki- wykład 9 Funkcje

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

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Projektowanie klas c.d. Projektowanie klas przykład

Pytania sprawdzające wiedzę z programowania C++

ZASADY PROGRAMOWANIA KOMPUTERÓW

Paostwowa Wyższa Szkoła Zawodowa w Płocku Dariusz Wardowski

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

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

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

Wstęp do informatyki- wykład 11 Funkcje

Wstęp do informatyki- wykład 9 Pętla while, do while,for -pętla w pętli- przykłady Funkcje

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Programowanie komputerowe. Zajęcia 4

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

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

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

1 Podstawy c++ w pigułce.

Programowanie (C++) NI 5

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Programowanie 2. Język C++. Wykład 1.

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Język C++ wykład VIII

Wskaźniki. Informatyka

Podstawy programowania 1

Tablice, funkcje - wprowadzenie

Wykład 1: Wskaźniki i zmienne dynamiczne

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

Programowanie 2. Język C++. Wykład 3.

1 Podstawy c++ w pigułce.

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Programowanie - wykład 4

Techniki Programowania wskaźniki

Techniki Programowania wskaźniki 2

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Podstawy programowania. Wykład: 8. Wskaźniki. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

dr inż. Paweł Myszkowski Wykład nr 8 ( )

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Zaawansowane programowanie w języku C++ Klasy w C++

Zmienne i struktury dynamiczne

PARADYGMATY PROGRAMOWANIA Wykład 4

Wstęp do programowania obiektowego, wykład 7

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Wykład 8: klasy cz. 4

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Języki programowania obiektowego Nieobiektowe elementy języka C++

Programowanie strukturalne i obiektowe : podręcznik do nauki zawodu technik informatyk / Adam Majczak. Gliwice, cop

Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne

Programowanie Procedurale

Programowanie, część I

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

Podstawy programowania w języku C++

Część 4 życie programu

Operacje wejścia/wyjścia odsłona pierwsza

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Wykład 3 Składnia języka C# (cz. 2)

Struktury Struktura polami struct struct struct struct

Podstawy programowania komputerów

Język C++ zajęcia nr 2

Spis treści WSTĘP CZĘŚĆ I. PASCAL WPROWADZENIE DO PROGRAMOWANIA STRUKTURALNEGO. Rozdział 1. Wybór i instalacja kompilatora języka Pascal

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Transkrypt:

Programowanie obiektowe w C++ Wykład 1 dr Lidia Stępień Akademia im. Jana Długosza w Częstochowie L. Stępień (AJD) POwCPP 1 / 24

Literatura Prata Stephen, Szkoła programowania. Język C++. Wydawnictwo Helion, Gliwice 2012 http://www.cplusplus.com Bjarne Stroustrup. Język C++. Kompendium wiedzy. Wydawnictwo Helion, Gliwice 2014. Siddhartha Rao. C++. Dla każdego. Wydanie VII. Wydawnictwo Helion, Gliwice 2014. Alex Allain. C++. Przewodnik dla początkujących. Wydawnictwo Helion, Gliwice 2014. L. Stępień (AJD) POwCPP 2 / 24

Krótka historia języka C++ Język C++ powstał w Bell Labs na poczatku lat 80-tych ubiegłego stulecia. Twórcą jest Bjarne Stroustrup. Język C++ został stworzony jako rozszerzenie języka C o takie elementy jak: obiektowość - dodanie klas, programowanie uogólnione - dodanie szablonów. Standard C++: C++11 - sierpień 2011, C++14 - grudzień 2014, aktualnie trwają prace nad C++17. Kompilacja: g++ -std=c++11 -Wall -pedantic -o plik.cpp plik L. Stępień (AJD) POwCPP 3 / 24

Obsługa wejścia i wyjścia #include<iostream> using namespace std; int main(){ int a; cout << "a = "; cin >> a; cout << "a: " << a << endl; } #include<iostream> int main(){ int a; std::cout << "a = "; std::cin >> a; std::cout << "a: " << a << std::endl; } L. Stępień (AJD) POwCPP 4 / 24

Obsługa wejścia i wyjścia #include<iostream> using std::cin; using std::cout; using std::endl; int main(){ int a; cout << "a = "; cin >> a; cout << "a: " << a << endl; } L. Stępień (AJD) POwCPP 5 / 24

Dane - deklaracja zmiennych wraz z inicjalizacją int a = 12; int tab1[] = {1,2,3,4,5}; char tab2[3] { a, 66, b }; char b { 1 }; //inicjalizacja klamrowa (inicjalizacja listą) float c = {3.14} //inicjalizacja klamrowa; int d {}; //ustawia d na 0 int e = {}; //ustawia e na 0 const int i = 123; //stała symboliczna L. Stępień (AJD) POwCPP 6 / 24

Automatyczne deklarowanie typów w C++11 Kompilator określa typ zmiennej na podstawie typu wartości inicjalizacyjnej. auto x = 100; // x typu int auto y = 1.5; // y typu double auto z = 1.3e12L; // z typu long double Typ auto należy stosować ostrożnie, np. mamy zamiar zadeklarować 3 zmienne typu double: auto x = 0.0; double y = 0; auto z = 0; // x typu double, bo 0.0 typu double // y typu double, 0 jest // automatycznie konwertowane do double // z typu int, bo 0 jest typu int L. Stępień (AJD) POwCPP 7 / 24

Wczytywanie łańcuchów znakowych wierszami getline() Wczytuje całe wiersze, uznając znak nowego wiersza (ENTER) jako koniec danych. Funkcja ta ma dwa argumenty: pierwszym jest nazwa tablicy, drugim maksymalna liczba wczytanych znaków, np. dla cin.getline(tab, 20); funkcja wczyta maksymalnie 19 znaków do tablicy tab, zostawiając ostatnie miejsce na końcowy znak NUL. Funkcja ta przerywa wczytywanie danych po osiągnięciu ustalonego limitu znaków lub po wczytaniu znaku nowego wiersza. Funkcja getline() odrzuca znak nowego wiersza po sczytaniu go z bufora i zastępuje znakiem NUL. L. Stępień (AJD) POwCPP 8 / 24

Przykład getline() #include<iostream> using namespace std; int main(){ const int N = 20; char imie[n], nazwisko[n]; cout << "imie: "; cin.getline(imie, N); cout << "nazwisko: "; cin.getline(nazwisko, N); } cout << imie << " i " << nazwisko << endl; L. Stępień (AJD) POwCPP 9 / 24

Wczytywanie łańcuchów znakowych wierszami get() Funkcja pobiera takie same argumenty jak funkcja getline(), tak samo je interpretuje i wczytuje dane do końca wiersza. Różni się tym, że pozostawia znak nowego wiersza w kolejce wejściowej, co przy kilkukrotnym wywołaniu funkcji get(), może sprawiać kłopot, np. cin.get(imie,n); cin.get(nazwisko,n); //problem Rozwiązaniem może być: bezparametrowe wywołanie funkcji cin.get(), która odczytuje pojedynczy znak, np. cin.get(imie,n); cin.get(); cin.get(nazwisko,n); złączenie wywołań dwóch funkcji, np. cin.get(imie,n).get(); L. Stępień (AJD) POwCPP 10 / 24

Przykład get() #include<iostream> using namespace std; int main(){ const int N = 20; char imie[n], nazwisko[n]; cout << "imie: "; cin.get(imie, N).get(); cout << "nazwisko: "; cin.get(nazwisko, N).get(); } cout << imie << " i " << nazwisko << endl; L. Stępień (AJD) POwCPP 11 / 24

Typy wyliczeniowe Typ wyliczeniowy enum stanowi mechanizm alternatywny do stałych. enum dnitygodnia {pn, wt, sr, czw, pt, so, nd}; dnitygodnia stają się nazwą nowego typu, typu wyliczeniowego. pn, wt,... stają się stałymi symbolicznymi (enumeratorami) odpowiadającymi liczbom od 0 do 6. Domyślnie pierwszy element ma numer 0, drugi jest o 1 większy od poprzedniego, itd. Aby zmienić numery odpowiadające stałym symbolicznym należy użyć przypisania, np. enum dnitygodnia {pn = 1, wt, sr, czw, pt, so, nd}; dnitygodnia dt; Jeśli chcemy używać stałych, ale nie tworzyć zmienne typu wyliczeniowego, możemy pominąć nazwę typu wyliczeniowego, np. enum {pn = 1, wt, sr, czw, pt, so, nd}; L. Stępień (AJD) POwCPP 12 / 24

Typy wyliczeniowe Zmiennej wyliczeniowej można przypisać (bez rzutowania typów) tylko enumeratory odpowiedniego typu, np.: dt = pt; // dobrze dt = 2016; // źle Dla typów wyliczeniowych zdefiniowany jest jedynie operator przypisania. ++dt; // źle dt = pn + wt; // źle Typy wyliczeniowe są typami całkowitymi, więc można je rzutować na typ int, ale typy całkowite nie są automatycznie konwertowane na wyliczeniowe, np. int x = wt; // dobrze x = 3 + pn; // dobrze dt = dnitygodnia(3); // dobrze, jawne rzutowanie dt = dnitygodnia(2016) // wynik nieokreślony L. Stępień (AJD) POwCPP 13 / 24

Alokacja pamięci - new new - otrzymuje informację na jakie dane potrzebna jest nam pamięć, znajduje odpowiedni blok pamięci i zwraca jego adres, który przypisujemy wskaźnikowi. int * p = new int; *p = 12; double * q = new double; *q = 3.14; cout << "size p: " << sizeof(p) << "size *p: " << sizeof(*p); cout << "size q: " << sizeof(q) << "size *q: " << sizeof(*q); Zmienne statyczne mają wartości przechowywane na stosie (ang. stack), natomiast obszar pamięci przydzielany przez new to obszar tzw. sterty (ang. heap) lub pula wolnej przestrzeni (ang. free store). W sytuacji, gdy nie ma wystarczającego miejsca w pamięci, aby obsłużyć kolejne żądanie operatora new, operator ten zasygnalizuje błąd, zrzucając wyjątek. W starszych implementacjach wywołanie new zwróci 0 (pusty wskaźnik, czyli null). L. Stępień (AJD) POwCPP 14 / 24

Zwalnianie pamięci - delete Operatora delete używa się wraz ze wskaźnikiem bloku, który był wcześniej zaalokowany za pomocą new. Po zwolnieniu pamięci wskaźnik można ponownie wykorzystać. Użycie new i delete powinno się bilansować - ile new tyle delete. Nie należy zwalniac pamięci już raz zwolnionej. Wynik takiego działania jest nieokreślony. Można bezpiecznie stosować delete do wskaźników pustych. int * p = new int; int * q= p; delete q; delete p; // niepoprawne; Pamięć została już zwolniona! L. Stępień (AJD) POwCPP 15 / 24

Tablice dynamiczne int * tab = new int[100]; for(int i = 0; i < 100; ++i) tab[i] = 2*i; for(int i = 0; i < 100; ++i) cout << *(tab+i) << ", "; delete [] tab; const int N = 10; double **m = new double* [N]; for(int i = 0; i < N; ++i) m[i] = new double [N]; for(int i = 0; i < N; ++i) for(int j = 0; j < N; ++j) m[i][j] = 2*i+j; for(int i = 0; i < N; ++i) for(int j = 0; j < N; ++j) cout << *(*(m + i))+j) << ", "; for(int i = 0; i < N; ++i) delete [] m[i]; delete [] m; L. Stępień (AJD) POwCPP 16 / 24

Zmienne referencyjne & - alternatywna nazwa (referencja) dla zadeklarowanej wcześniej zmiennej. int i = 5; int & ri = i; cout << i << " : " << ri << endl; ri *= 5; cout << i << " : " << ri << endl; Obie nazwy i oraz ri odnoszą się do tej samej wartości, położonej w tym samym miejscu w pamięci. Deklarując zmienną referencyjną, należy ją zainicjalizować! Referencja to coś w rodzaju stałego wskaźnika, który raz powiązany ze zmienną, na zawsze z nią pozostaje. int * const pi = &i; L. Stępień (AJD) POwCPP 17 / 24

Zmienne referencyjne - referencja do r-wartości W C++11 wprowadzono referencję do r-wartości, która może odnosić się do r-wartości. double && rrf = sqrt(36.0); // niedozwolone dla & double j = 15.0; double && rrj = 3.0*j + 3.14; // niedozwolone dla & cout << rrf << endl; cout << rrj << endl; L. Stępień (AJD) POwCPP 18 / 24

Zakresowe pętle for (C++11) Służy do przetwarzania każdego z elementów tablicy (lub ogólniej, kazdego z elementów dowolnego kontenera, jak wektor czy array), np. double tab[5] = {4.09, 4.90, 5.08, 5.80, 6.0}; for(double t: tab) cout << t << ", "; Pętla wypisuje wszystkie wartości z zakresu reprezentowanego tablicą. Jęśli w pętli zamierzamy modyfikować wartości tablicy, to: double tab[5] = {4.09, 4.90, 5.08, 5.80, 6.0}; for(double &t: tab) t += 1.14; L. Stępień (AJD) POwCPP 19 / 24

Przeciążanie funkcji - polimorfizm Pozwala używać wielu funkcji o takiej samej nazwie. Polimorfizm - posiadanie wielu postaci. Przeciążanie funkcji - możliwość wiązania z jedną nazwą wielu funkcji - czyli nazwa jest przeciążana. Kluczem do przeciążania funkcji jest lista parametrów, czyli sygnatura funkcji. Język C++ umożliwia definiowanie funkcji o takich samych nazwach, ale o różnych sygnaturach. Sygnatury mogą różnić się liczbą parametrów, ich typami lub jednym i drugim. Niektóre sygnatury nie mogą istnieć jednocześnie: L. Stępień (AJD) POwCPP 20 / 24

Dopasuj prototyp do wywołania void Pisz(const char*, int); // #1 void Pisz(double, int); // #2 void Pisz(long, int); // #3 void Pisz(int, int); // #4 void Pisz(const char*); // #5 Pisz("Tort", 15); Pisz("Lody"); Pisz(2016.0, 1); Pisz(2016L, 1); Pisz(2016,1); unsigned int j = 2017; Pisz(j,1); L. Stępień (AJD) POwCPP 21 / 24

Dopasuj prototyp do wywołania void F1(char *); void F1(const char*); void F2(char*); void F3(const char*); const char t1[20] = "Ale checa!"; char t2[20] = "Co słychać?"; F1(t1); F1(t2); F2(t1); F2(t2); F3(t1); F3(t2); L. Stępień (AJD) POwCPP 22 / 24

Czy poniższe deklaracje są zgodne? long F(int, double); double F(int, double); L. Stępień (AJD) POwCPP 23 / 24