Programowanie
1. Rodzaje instrukcji języka programowania.
Instrukcje proste : charakteryzują się tym, że stanowią zlecenie wykonania pojedynczej akcji i nie zawierają innych instrukcji jako swoich składowych.
· instrukcja pusta
· instrukcja przypisana:
int a = a + 1;
· instrukcja wywołania:
CLEARSCREEN()
· instrukcja kontynuacji:
continue;
· instrukcja opuszczenia:
break;
· instrukcja powrotu:
return 5;
· instrukcja skoku:
goto 1
Instrukcje złożone : nie zlecają wykonania pojedynczej, konkretnej akcji, lecz sterują realizacją grupy instrukcji ujętej w logiczną strukturę algorytmu. Instrukcje strukturalne, często również służą do ograniczenia zakresu istnienia, dostępności i przesłaniania pewnych obiektów programu, np. zmiennych.
· instrukcja blokowa:
begin
WRITE('podaj liczbe: ');
READLN(NUMBER);
end
· instrukcja warunkowa:
if A > 3 then WRITELN(A) else WRITELN("NOT YET") end
· instrukcja wyboru:
switch (c) { case 'a': alert(); break; case 'q': quit(); break; }
· pętla:
while NOT EOF DO begin READLN end
2. Tworzenie własnych typów.
W niektórych językach programowania można tworzyć swoje własne typy danych. Nie jest to związane z instrukcją „typedef”, która produkuje tylko nowe nazwy dla już istniejących typów.
Konstruować typy możemy dzięki:
· wyliczeniom (enum w c++).
Np. enum DIRECTION { DIR_UP, DIR_DOWN, DIR_LEFT, DIR_RIGHT };
Zmienna takiego typu przyjmuje tylko wartości wpisane przez nas w definicji.
· Strukturom (struct)
np. struct bmi
{
int waga;
int wiek;
};
· Uniom (union)
Np. union hmm
int pole1;
double pole 2;
std::string pole 3;
Unii używa się do zapewnienia kilku dróg dostępu do tych samych danych.W danej chwili tylko jedno pole unii zawiera poprawną wartość.
3. Nagłówek funkcji, zasady wywoływania funkcji. Przeciążanie funkcji. Funkcje operatorowe.
Nagłówek funkcji składa się z nazwy funkcji poprzedzonej identyfikatorem typu. Wśród identyfikatorów wyróżnia się identyfikator void – pusty. Funkcje takie nie zwracają wartości i są odpowiednikami procedur w Turbo Pascalu.
Wszystkie inne funkcje są poprzedzone identyfikatorami takimi jak, int, float, char, itd. W funkcjach musi występować instrukcja return Wyrażenie, która przypisuje nazwie funkcji wartość wyrażenia.
Po nazwie funkcji podaje się deklarację parametrów ( formalnych ). Gdy funkcja nie posiada parametrów, po nazwie funkcji występują jedynie dwa nawiasy okrągłe ( ).
Przykład nagłówka funkcji:
double PoleProstokata(double x, double y);
Przeciążanie funkcji występowanie pod taką samą nazwą wielu funkcji różniących się zestawem argumentów (sygnaturą). W trakcie kompilacji program znajduje właściwą funkcję po liczbie oraz typach argumentów. Możliwe jest więc współistnienie kilku funkcji o tej samej nazwie, lecz różniących się typami argumentów.
Przykład:
double PoleProstokata(double x);
int PoleProstokata(double x, double y);
Funkcje operatorowe to funkcje jedno lub dwu argumentowe służące do zdefiniowania operacji operatorowych na obiektach typów zdefiniowanych przez programistę. Funkcje operatorowe mogą być umieszczone w ciele funkcji lub poza nią.
4. Obiekty, ich identyfikatory, typy, tożsamość, stan.
Obiekt to podstawowe pojęcie wchodzące w skład paradygmatu programowania obiektowego w programowaniu.
Z reguły obiekty (a właściwie klasy, do których te obiekty należą) są konstruowane tak, aby dane przez nie przenoszone były dostępne wyłącznie przez odpowiednie metody, co zabezpiecza je przed niechcianymi modyfikacjami. Takie zamknięcie danych nazywa się enkapsulacją czyli jakby zamknięcie ich w kapsule.
Identyfikator obiektu to unikalna wewnętrzna nazwa obiektu, nadawana automatycznie przez system i nieposiadająca znaczenia w świecie zewnętrznym. Służy on do odróżnienia obiektu od innych obiektów oraz do budowy odwołań prowadzących do obiektu.
Typ obiektu określa zbiór atrybutów i operacji, które można wykonać na obiekcie.
Każdy obiekt ma trzy cechy:
· tożsamość, czyli cechę umożliwiającą jego identyfikację i odróżnienie od innych obiektów;
· stan, czyli aktualny stan danych składowych;
· zachowanie (ang. behaviour), czyli zestaw metod wykonujących operacje na tych danych.
5. Tworzenie i niszczenie obiektów. Definiowanie działań na obiektach. Kolekcje obiektów. Agregacje (łączenie) obiektów.
Obiekty możemy tworzyć:
· Jako zmienne automatyczne. Deklarując je tak jak typy wbudowane (na stosie)
Np. Data data2( 2009, 4, 22 );
· Jako zmienne dynamiczne. Za pomocą słowa kluczowego „new” (na stercie)
Np. Data data2 = new Data( 2009, 4, 22 );
Niszczenie obiektów lokalnych, utworzonych na stosie, zachodzi gdy sterowanie wychodzi z bloku, w którym były zdefiniowane. Usunięte zatem zostaną wszystkie zmienne utworzone na stosie w tym bloku, wśród nich również zmienne obiektowe.
Niszczenie obiektów dynamicznych, utworzonych na stercie, dokonuje się za pomocą słowa kluczowego „delete”. W językach programowania m.in. C#, JAVA programista nie musi pamiętać o niszczeniu obiektów, wykonuje to za niego mechanizm wbudowany „Garbage Collector”.
Kolekcje obiektów – to klasy zawierające inne obiekty.
Przykłady kolekcji w STL (Standard Template Library):
· Klasa Vector<T>
· Klasa list<T>
· Klasa stack<T>
· Klasa map<KEY,T>
· Klasa set<KEY>
Agregacja (inaczej zawieranie się, gromadzenie) w programowaniu obiektowym nazywa się sytuację, gdy tworzy się nową klasę, używając klas już istniejących. Nowa klasa może być zbudowana z dowolnej liczby obiektów (obiekty te mogą być dowolnych typów) i w dowolnej kombinacji, by uzyskać żądany efekt. Agregacja jest często określana jako relacja typu "zawiera" np. "samochód zawiera silnik" - gdzie "samochód" i "silnik" są klasami, oraz klasa "samochód" zawiera w sobie obiekt (czasami referencję czy wskaźnik) typu "silnik".
Agregacja jest często przedstawiana w opozycji do dziedziczenia, które polega na uszczegóławianiu typu ogólnego w celu utworzenia typu szczególnego. Agregacja nie tworzy podtypu, lecz nowy typ.
6. Klasa jako projekt obiektu. Struktury klas.
Klasa jest niejako szablonem, według którego budowane są obiekty. Klasa zawiera:
· Pola (zadeklarowane zmienne, mogą być obiekty innych klas)
· Metody (funkcje operujące na polach)
· Właściwości (zapewniają dostęp do pól prywatnych, zapewniają wyższy poziom hermetyzacji niż pola publiczne)
Składnikom klasy możemy przypisać klasyfikator dostępu:
· Public – składnik dostępny poza klasą
· Private – składnik dostępny tylko wewnątrz klasy
· Protected – składnik dostępny tylko wewnątrz klasy oraz z klas pochodnych (dziedziczenie)
W klasie definiujemy konstruktor odpowiedzialny za początkowe ustawienie pól obiektu podanymi wartościami.
Rodzaje klas:
· Klasa właściwa to każda klasa, która może być instancjonowana.
· Klasa abstrakcyjna
Klasa abstrakcyjna to przeciwieństwo klasy właściwej - nie można utworzyć obiektu takiej klasy. Ma ona zastosowanie jedynie wtedy, gdy język programowania obsługuje dziedziczenie. Klasa abstrakcyjna stanowi wtedy wzorzec do dalszego rozszerzenia, który sam w sobie nie może być pełnoprawnym, poprawnym obiektem.
Klasy abstrakcyjne najczęściej posiadają przynajmniej jedną metodę abstrakcyjną. Jest to rodzaj metody, dla którego zdefiniowana jest wyłącznie lista argumentów, nazwa oraz zwracane wartości, natomiast nie jest ona zaimplementowana. Implementacją podanego interfejsu muszą zająć się klasy potomne.
Niektóre języki takie, jak Java czy C# obsługują ponadto szczególny rodzaj klas abstrakcyjnych zwany interfejsem. Interfejs nie może definiować żadnych atrybutów, a wszystkie jego metody są abstrakcyjne. Ponadto najczęściej nie dotyczą ich ograniczenia pojedynczego dziedziczenia.
· Klasa finalna
Klasa finalna ma sens jedynie w przypadku dziedziczenia - nazywamy tak klasę, której nie można rozszerzyć.
7. Polimorfizm.
Polimorfizm jest to wykazywanie różnej funkcjonalności podczas wywoływania metody, w zależności od typu obiektu na rzecz którego wywołana jest dana metoda. Nie ważny jest typ zmiennej za pomocą której wywołujemy daną metodą. W języku C# do implementacji polimorfizmu używamy metod wirtualnych oraz mechanizmu dziedziczenia.
Wyróżniamy:
· Polimorfizm statyczny (czasu kompilacji) – np. przeciążanie operatorów.
· Polimorfizm dynamiczny (czasu wykonania) – np. metody wirtualne
· Polimorfizm parametryczny – np. przeciążanie funkcji w c++
8. Szablony (templates).
Szablony umożliwiają m.in. tworzenie kodu, bez uwzględniania typów. Szablony mogą zapobiegać redundancji kodu.
Wykorzystanie szablonów w programach pozwala skupić się bardziej na algorytmach niż na danych jakie są przetwarzane. Użycie szablonów pozwala zredukować ilość nadmiarowego kodu ponieważ jedną funkcjonalność można zaprogramować dla wielu typów danych. Następnie kompilator w konkretnym przypadku precyzuje typ i odpowiednio dostosowuje np. wywołania funkcji.
template <typename T>
class List
//ciało klasy
// użycie
List <int> lista1;
List <std::string> lista2;
List <MojaKlasa> lista_mojej_klasy;
9. Programowanie zdarzeniowe.
Programowanie zdarzeniowe - paradygmat (wzorzec) programowania, według którego
...
devil88