Technologie cyfrowe semestr letni 2018/2019 Tomasz Kazimierczuk Wykład 7 (08.04.2019)
Wikipedia Programowanie komputerów proces projektowania, tworzenia, testowania i utrzymywania kodu źródłowego programów komputerowych ( )
Wikipedia Programowanie komputerów proces projektowania, tworzenia, testowania i utrzymywania kodu źródłowego programów komputerowych ( )
Schematy rozwoju
Język C++
Języki programowania Język programowania: zestaw symboli i gramatyka używane do tworzenia programów komputerowych. Języki wysokiego poziomu (np. C++, Python, Java) są skonstruowane tak, by ułatwić zrozumienie programu (kodu). Języki niskiego poziomu (np. assembler) używają konstrukcji możliwie najbliższych do wykonywanych rzeczywiście przez procesor. Wykład 7 6
Kompilacja Kompilacja programu (kodu): proces tłumaczenia kodu napisanego w wybranym języku na kod maszynowy, zrozumiały dla procesora. Wynikiem kompilacji jest program, który można uruchomić. W czasie kompilacji jest analizowany cały kod, co oznacza, że nie może w nim być nigdzie błędów językowych. Interpretacja: wykonywanie kodu programu krok po kroku, bez analizy poprawności językowej całości. Interpretacja jest prowadzona do napotkania błędu w kodzie, lub poprawnego zakończenia działania programu. Języki kompilowane: C++ Języki interpretowane: PHP, Java, Python Wykład 7 7
C++ jest językiem kompilowanym 1. Tworzymy kod źródłowy w pliku tekstowym #include <iostream> using namespace std; int main() { cout << "Hello world"; program.cpp return 0; 2. Kompilujemy program $ g++ program.cpp o program 3. Uruchamiamy program $./program Hello world
Paradygmaty programowania Imperatywne Deklaratywne Proceduralne Logiczne Obiektowe Funkcyjne
Przykład 2 function GreatestCommonDivisor(a, b: Int64): Int64; begin if (a < 0) then a := -a; if (b < 0) then b := -b; if (a = 0) then Exit(b); if (b = 0) then Exit(a); while not (a = b) do begin if (a > b) then a := a - b else b := b - a; end; Result := a; end;
Przykład: programowanie deklaratywne SELECT Student.Imie, Student.Nazwisko, Ocena.Ocena FROM Student JOIN Ocena ON Student.id = Ocena.StudentId WHERE Ocena.Przedmiot = Mechanika kwantowa AND Ocena.Ocena > 2;
(define (sieve n) (define (aux u v) (let ((p (car v))) (if (> (* p p) n) (let rev-append ((u u) (v v)) Przykład 2: programowanie funkcyjne (if (null? u) v (rev-append (cdr u) (cons (car u) v)))) (aux (cons p u) (let wheel ((u '()) (v (cdr v)) (a (* p p))) (cond ((null? v) (reverse u)) ((= (car v) a) (wheel u (cdr v) (+ a p))) ((> (car v) a) (wheel u v (+ a p))) (else (wheel (cons (car v) u) (cdr v) a)))))))) (aux '(2) (let range ((v '()) (k (if (odd? n) n (- n 1)))) (if (< k 3) v (range (cons k v) (- k 2))))))
Programowanie imperatywne Kolejne instrukcje zmieniają stan (np. wartości zmiennych) Podstawowe typy zmiennych: int liczba całkowita, np. 2235 double liczba rzeczywista, np. 3.14 char pojedynczy znak ASCII (litera) bool wartość logiczna (prawda lub fałsz)
Język Python Struktury danych: elementy algorytmu przechowujące informacje. zmienna: miejsce na konkretne dane. Zmienna ma swoją nazwę, typ i wartość. Wykład 7 14
Język Python Wyrażenia: operacje na zmiennych, wzory. Wykład 7 15
Język Python Struktury danych: elementy algorytmu przechowujące informacje. lista (macierz jednowymiarowa): zestaw podstawowych elementów, np. liczb. Wykład 7 16
Prześledźmy program (C++): #include <iostream> using namespace std; Standardowy początek int main() { int a = 0; int b = 0; a = 8; b = 9 + a; b = b + b; Wypisywanie wartości zmiennych cout << a << " " << b << "\n"; return 0; Standardowy koniec
Prześledźmy program (Python): a = 8 b = 9 + a b = b + b print (a, " ", b)
Wyrażenia Operator: + (np. a + b) Wynik: suma wartości a i b Efekt uboczny: brak Operator: = (np. a = b) Wynik: wartość b Efekt uboczny: zmienna a przyjmuje wartość b Operator: ++ (np. a++) Wynik: wartość a [jest w C++, nie ma w Pythonie] Efekt uboczny: zmienna a zwiększa się o 1
Porównywanie ==,!=, >, <, >=, <= Wykorzystywane głównie w instrukcjach kontrolnych, np. if (a == b) cout << "Zmienne a i b sa rowne"; while (a > b) { b++; a--;
Pętle Blok instrukcji Blok instrukcji Warunek sprawdzany przed lub po iteracji
Pętle w różnych językach programowania (1) cout << a: " << a << endl; while number>0 do begin Pascal sum := sum + number; number := number - 2; end; while( a < 20 ) C++ { a++; while (count < 9): print 'The count is:', count count = count + 1 Python
Pętle w różnych językach repeat sum := sum + number; number := number - 2; until number<0; programowania (2) Pascal C++ do { cout << "a: " << a << endl; a++; while ( a < 20 ) Python brak odpowiednika
Pętle for for i:=0 to 10 do begin writeln('a: ', a); end; Pascal C++ int sum = 0; for (int i = 1; i < 6; i++) { sum += i;
Pętle for int sum = 0; for (int i = 1; i < 6; i++) { sum = sum + i; int sum = 0; int i = 1; while (i < 6) { sum = sum + i; i++;
int sum = 0; int i = 1; cout << "Podaj 2 liczby: "; cin >> i; cin >> j; cout << i + j; i = 0; while (i < 6) { sum = sum + i; i++; Niejednoznaczność roli zmiennej i
Pętle for dla zakresu for i in range(1,10): print(i) Python PHP for (int i : tablica ) { cout << i << endl; $tablica = array(1, 2, 3, 4); foreach ($tablica as $i) { print($i); C++
Dwie zmienne o tej samej nazwie int i = 0; double i = 0.5; cout << i << endl; int i = 0; { double i = 0.5; cout << i << endl; Cout << i << endl;
Zmienna lokalna dla zakresu int i; for(i = 0; i < 3; i++) { for(i = 0; i < 5; i++) { cout << i << endl; for(int i = 0; i < 3; i++) { for(int i = 0; i < 5; i++) { cout << i << endl;
Zmienna lokalna dla zakresu int i; for(i = 0; i < 3; i++) { for(i = 0; i < 5; i++) { cout << i << endl; for(int i = 0; i < 3; i++) { for(int j = 0; j < 5; j++) { cout << j << endl;
Funkcja Argumenty zmienne lokalne Wynik double srednia(double x, double y) { return (x+y) / 2;
Programowanie obiektowe
Przykład wykorzystania obiektu Obiekt X jest instancją klasy Y Obiekt = tożsamość + stan + zachowanie vector<int> v; v.push.back(5); v.push_back(6); v.push_back(3); Obiekt = dane + metody cout << "Aktualnie w wektorze jest " << v.size() << " elementow" << endl; cout << "Pierwszym elementem jest" << v.front() << endl;
Przykład class A{ private: int x, y; public: void setvaluex(int a) { x = a; void setvaluey(int b); ; int main(){ A obj; obj.x = 3; obj.setvaluey(3);... niedozwolone
Koncepcja Abstrakcja Enkapsulacja Ochrona informacji Polimorfizm Dziedziczenie Realizacja w C++ Klasy Klasy public/protected/private Przeładowanie operatorów, wzorce, metody wirtualne Dziedziczenie klas
Dziedziczenie Dziedziczenie pozwala stworzyć nową klasę przy wykorzystaniu już istniejącej klasy. Dziedziczenie to modyfikacja typu polegająca na jego przystosowaniu do określonych warunków jest to więc rodzaj specjalizacji. Tekst zapożyczony z https://www.ii.uni.wroc.pl/~prz/2012lato/cpp/slajdy/cpp5.ppt
Dziedziczenie Nomenklatura: klasa bazowa (podstawowa albo nadklasa) to klasa, z której dziedziczą inne klasy; klasa pochodna (podklasa) to nowa klasa, która dziedziczy strukturę informacyjną i funkcjonalność z innej klasy. Rysunek schematyczny: klasa bazowa klasa pochodna
Przykład Klasa bazowa Macierz Klasa pochodna - MacierzKwadratowa
class Macierz { public: Macierz(int n, int m); int liczba_wierszy(); int liczba_kolumn(); void wypisz(); void ustaw_wartosc(int wiersz, int kolumna, double wartosc); double wartosc(int wiersz, int kolumna); void pomnoz_przez(double r); private: int w, k; vector< vector<double> > dane; ;
class MacierzKwadratowa : public Macierz { public: MacierzKwadratowa(int n); ; double wyznacznik();
Zasada podstawienia Liskov Funkcje które używają wskaźników lub referencji do klas bazowych, muszą być w stanie używać również obiektów klas dziedziczących po klasach bazowych, bez dokładnej znajomości tych obiektów Kontrprzykład: void przetwarzajfigurę(figura& ifigura) { if(typeid(ifigura) == typeid(prostokąt)) przetwarzajprostokąt(static_cast<prostokąt&>(ifigura)); else if(typeid(ifigura) == typeid(okrąg)) przetwarzajokrąg(static_cast<okrąg&>(ifigura)); else if(typeid(ifigura) == typeid(kwadrat)) przetwarzajkwadrat(static_cast<kwadrat&>(ifigura));
Dostęp do składników W klasie pochodnej nie ma dostępu do odziedziczonych składników prywatnych (czyli private). W klasie pochodnej jest dostęp do odziedziczonych składników nieprywatnych (czyli protected i public). Składniki chronione (czyli protected) są dostępne tylko w klasie bieżącej i w klasach pochodnych ale nie na zewnątrz.
Dostęp do składników Klasa pochodna też decyduje o zakresie widoczności odziedziczonych składników nieprywatnych poprzez sposób dziedziczenia (public, protected, private): przy dziedziczeniu publicznym odziedziczone składniki nieprywatne zachowują swój zakres widoczności; przy dziedziczeniu chronionym odziedziczone składniki nieprywatne stają się chronione; przy dziedziczeniu prywatnym odziedziczone składniki nieprywatne stają się prywatne. Domyślny sposób dziedziczenia to private.
Hierarchia klas Dziedziczenie może mieć wiele poziomów. Jedna klasa może być klasą bazową dla wielu innych klas. klasa A klasa B klasa D klasa C klasa E klasa F klasa G klasa D