funkcje rekurencyjne Wykład 12. Podstawy programowania (język C) Funkcje rekurencyjne (1) Funkcje rekurencyjne (2)

Podobne dokumenty
Rekurencja. Przygotowała: Agnieszka Reiter

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

WYKŁAD 9. Algorytmy sortowania elementów zbioru (tablic) Programy: c4_1.c... c4_3.c. Tomasz Zieliński

Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

12. Rekurencja. UWAGA Trzeba bardzo dokładnie ustalić <warunek>, żeby mieć pewność, że ciąg wywołań się zakończy.

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

Programowanie w VB Proste algorytmy sortowania

Wskaźniki do funkcji. Wykład 11. Podstawy programowania ( język C ) Wskaźniki do funkcji (1) Wskaźniki do funkcji (2)

ALGORYTMY I STRUKTURY DANYCH

Algorytmy sortujące i wyszukujące

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

Metodyki i Techniki Programowania 2

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 9 Rekurencja

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

4) Operacje na tablicy dwuwymiarowej bez wykorzystywania indeksów liczbowych:

Funkcja (podprogram) void

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Rekurencje. Jeśli algorytm zawiera wywołanie samego siebie, jego czas działania moŝe być określony rekurencją. Przykład: sortowanie przez scalanie:

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Inicjacja tablicy jednowymiarowej

Wstęp do programowania

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

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

Program 22. #include <iostream> using namespace std; struct Osoba { string Imie; string Nazwisko; char Plec; int RokUr; };

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

Programowanie komputerowe. Zajęcia 2

Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Wybrane algorytmy tablicowe

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

ATD. Wykład 8. Programowanie (język C++) abstrakcyjny typ danych. Abstrakcyjne typy danych (ATD) Metody czysto wirtualne. Definicje i uwagi:

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Wskaźniki w C. Anna Gogolińska

Lab 9 Podstawy Programowania

znalezienia elementu w zbiorze, gdy w nim jest; dołączenia nowego elementu w odpowiednie miejsce, aby zbiór pozostał nadal uporządkowany.

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

Kolokwium ze wstępu do informatyki, I rok Mat. (Ściśle tajne przed godz. 10 : grudnia 2005.)

Język C zajęcia nr 11. Funkcje

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Podstawy programowania w języku C++

Funkcje i tablice. Elwira Wachowicz. 23 maja 2013

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

Podstawy programowania w języku C++

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

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

Program 14. #include <iostream> #include <ctime> using namespace std;

Algorytmy i Struktury Danych, 2. ćwiczenia

Wstęp do programowania

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Rekurencja (rekursja)

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Efektywna metoda sortowania sortowanie przez scalanie

tablica: dane_liczbowe

Podstawy programowania

DYNAMICZNE PRZYDZIELANIE PAMIECI

Programowanie komputerowe. Zajęcia 3

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Rekurencja. Przykład. Rozważmy ciąg

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

E S - uniwersum struktury stosu

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

void Pobierz(Student &a); void Wypisz(Student a); void Ustaw_zaliczenia(Student t[],int r); void Wypisz_najlepszych(Student t[],int r, float prog);

typ_zwracanej_wartości nazwa_funkcji(lista deklaracji argumentów) { ciało(treść) funkcji return Val; //zwracana wartość }

Algorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

Podstawy Informatyki. Metalurgia, I rok. Rekurencja. skomplikowane zadanie. Rekurencja

Podstawy Informatyki. Metalurgia, I rok. Wykład 5 Rekurencja

Kontrola przebiegu programu

Podstawy Programowania C++

Analiza algorytmów zadania podstawowe

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

Wstęp do Programowania, laboratorium 02

5 Przygotował: mgr inż. Maciej Lasota

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Stałe, tablice dynamiczne i wielowymiarowe

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

Strategia "dziel i zwyciężaj"

Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37

Programowanie Proceduralne

Funkcje zawarte w bibliotece < io.h >

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Tablice deklaracja, reprezentacja wewnętrzna

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

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Wykład 8. Rekurencja. Iterować jest rzeczą ludzką, wykonywać rekursywnie boską. L. Peter Deutsch

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Część 4 życie programu

Transkrypt:

Podstawy programowania (język C) funkcje rekurencyjne Wykład 12. Tomasz Marks - Wydział MiNI PW -1- Tomasz Marks - Wydział MiNI PW -2- Funkcje rekurencyjne (1) W języku C funkcja moŝe wywoływać samą siebie. Taką funkcję nazywamy funkcją rekurencyjną. Rekurencja moŝe być realizowana bezpośrednio, jak i pośrednio. N.p. Schemat funkcji int F ( int x ) int y, z; z = F( y ); ilustruje realizację rekurencji bezpośredniej. Tomasz Marks - Wydział MiNI PW -3- Funkcje rekurencyjne (2) Ilustracja rekurencji pośredniej jest trochę bardziej złoŝona. N.p. int H ( int x ); // niezbędna deklaracja int G ( int x ) // funkcja rekurencyjna int y, z; z = H( y ); int H ( int x ) // funkcja pośrednicząca int y, z; z = G( y ); W powyŝszym przykładzie rekurencyjna funkcja G wywołuje samą siebie za pośrednictwem funkcji H. Oczywiście, głębokość takiego pośrednictwa moŝe być większa. Tomasz Marks - Wydział MiNI PW -4-

Funkcje rekurencyjne (3) Klasycznym przykładem jest uŝycie rekurencji do obliczania wartości silni (! ): 0! == 1 1! == 1 dla n >= 2 n! == 1* 2 *...* (n-1) * n Ten ostatni wzór moŝe być zrealizowany iteracyjnie int i, s=1; for ( i=2; i<=n; ++i ) s = s * i; co pozwala napisać definicję funkcji: int silnia ( int n ) int i, s=1; if ( n <= 1 ) return 1; for ( i=2; i<=n; ++i ) s *= i; return s; Ale wzór dla n >= 2 Funkcje rekurencyjne (4a) n! == 1* 2 *...* (n-1) * n moŝemy zapisać w postaci: albo n! == n * (n-1)! silnia(n) == n * silnia(n-1) co prowokuje, Ŝeby napisać definicję funkcji: int Silnia ( int n ) if ( n < 2 ) return 1; return n * Silnia( n-1 ); Tomasz Marks - Wydział MiNI PW -5- Tomasz Marks - Wydział MiNI PW -6- Funkcje rekurencyjne (4b) Funkcje rekurencyjne (5) Ale wzór dla n >= 2 n! == 1* 2 *...* (n-1) * n moŝemy zapisać w postaci: albo n! == n * (n-1)! silnia(n) == n * silnia(n-1) ewentualnie: int Silnia ( int n ) return ( n < 2 )? 1 : n * Silnia( n-1 ); Tomasz Marks - Wydział MiNI PW -7- Tomasz Marks - Wydział MiNI PW -8-

Funkcje rekurencyjne (5) Funkcje rekurencyjne (6) Inny przykład funkcji rekurencyjnej moŝna znaleźć w ksiąŝce Kerninhana i Ritchie'go. Funkcja realizuje wypisywanie liczby całkowitej w postaci ciągu znaków. #include <stdio.h> /* printd: wypisz n dziesiętnie */ void printd ( int n ) if ( n < 0 ) putchar ( '-' ); n = -n; if ( n / 10 ) printd ( n / 10 ); putchar ( n % 10 + '0' ); Tomasz Marks - Wydział MiNI PW -9- Tomasz Marks - Wydział MiNI PW -10- Sortowanie (1) Sortowanie jest zadaniem polegającym na porządkowaniu elementów jakiegoś zbioru według ustalonego kryterium. SORTOWANIE N.p. porządkowanie tablicy liczb według rosnących/malejących wartości jej elementów porządkowanie listy struktur zawierających dane osobowe według alfabetycznej kolejności nazwisk porządkowanie pliku dyskowego zawierającego opisy magazynowanych towarów według rosnących/malejących wielkości cen Istnieje bardzo wiele algorytmów sortowania. N.p. bąbelkowe, przez wstawianie, quicksort,... Wybór zaleŝy od sposobu reprezentacji i wielkości (liczebności elementów) rozpatrywanego zbioru. Tomasz Marks - Wydział MiNI PW -11- Tomasz Marks - Wydział MiNI PW -12-

Sortowanie (2) Sortowanie (3a) Jednym z najprostrzych algorytmów sortowania jest tzw. sortowanie bąbelkowe. Metoda polega na wielokrotnym przeglądaniu zawartości zbioru i porównywaniu wartości kolejnych par jego elementów. JeŜeli para jest w niewłaściwej kolejności, to jej elementy są zamieniane miejscami. Dla przykładu rozpatrzmy tablicę int A[ 5 ] = 2, 5, 8, 1, 4 ; którą chcemy uporządkować według rosnących wartości jej elementów. To nasza tablica, którą chcemy uporządkować w kolejności rosnących wartości elementów. Tomasz Marks - Wydział MiNI PW -13- Tomasz Marks - Wydział MiNI PW -14- Sortowanie (3b) Sortowanie (3c) Pierwsza para elementów. We właściwym porządku. Kolejna para elementów. TeŜ we właściwym porządku. Tomasz Marks - Wydział MiNI PW -15- Tomasz Marks - Wydział MiNI PW -16-

Sortowanie (3d) Sortowanie (3e) Elementy w niewłaściwym porządku. Trzeba je zamienić miejscami. Po wykonaniu zamiany. Tomasz Marks - Wydział MiNI PW -17- Tomasz Marks - Wydział MiNI PW -18- Sortowanie (3f) Sortowanie (3g) Elementy w niewłaściwym porządku. Trzeba je zamienić miejscami. Po wykonaniu zamiany. Tomasz Marks - Wydział MiNI PW -19- Tomasz Marks - Wydział MiNI PW -20-

Sortowanie (3h) Sortowanie (4) MoŜemy łatwo opisać jeden przebieg algorytmu: int n=5, i; Po wykonaniu pierwszego przebiegu element o największej wartości znajduje się na ostatniej pozycji. for ( i = 0; i < n-1; i++ ) if ( A[ i ] > A[ i+1 ] ) int tmp = A[ i ]; A[ i ] = A[ i+1 ]; A[ i+1 ] = tmp; W kolejnym przebiegu warunek i < n-1 powinniśmy zastąpić przez i < n-2 w następnym przez i < n-3 itd.., itd.., aŝ do i<1 co moŝna zapisać jako i < n-(n-1) Tomasz Marks - Wydział MiNI PW -21- Tomasz Marks - Wydział MiNI PW -22- Czyli cały algorytm int n=5, i, j; for ( j = 1; j< n; j++ ) for ( i = 0; i < n-j; i++ ) if ( A[ i ] > A[ i+1 ] ) int tmp = A[ i ]; A[ i ] = A[ i+1 ]; A[ i+1 ] = tmp; Sortowanie (5) ZauwaŜmy, Ŝe jeśli dla jakiegoś j pętla for ( i=0; i<n-j; i++ )... "wykręci" się bez wykonania choćby jednej zamiany, to znaczy, Ŝe wszystkie elementy są juŝ we właściwej kolejności, a więc obliczenia naleŝy przerwać. Tomasz Marks - Wydział MiNI PW -23- Sortowanie (6) PowyŜszą uwagę uwzględnimy definicji funkcji: void bubblesort ( int A[ ], int n ) int i, j; if ( n < 2 ) return; for ( j = 1; j< n; j++ ) int przerwij = 1; for ( i = 0; i < n-j; i++ ) if ( A[ i ] > A[ i+1 ] ) int tmp = A[ i ]; A[ i ] = A[ i+1 ]; A[ i+1 ] = tmp; przerwij = 0; if ( przerwij ) break; Tomasz Marks - Wydział MiNI PW -24-

Sortowanie (7) A teraz zobaczmy rekurencyjną wersję naszej funkcji: void bubsort ( int A[ ], int n ) int i, przerwij = 1; if ( n < 2 ) return; // zaczynamy sortowanie tablicy n-elementowej for ( i = 0; i < n-1; i++ ) if ( A[ i ] > A[ i+1 ] ) int tmp = A[ i ]; A[ i ] = A[ i+1 ]; A[ i+1 ] = tmp; przerwij = 0; jeszcze na temat... SORTOWANIE funkcja qsort( ) if ( przerwij ) return; // tablica jest juŝ posortowana bubsort( A, n-1 ); // trzeba posortować tablicę (n-1)-elementową Tomasz Marks - Wydział MiNI PW -25- Tomasz Marks - Wydział MiNI PW -26- qsort (1) Funkcja standardowa qsort ma deklarację w pliku stdlib.h void qsort ( void *base, size_t n, size_t size, int (*cmp)(const void* a, const void* b) ); Porządkuje w kolejności rosnącej tablicę tab[0], tab[1],... tab[n-1] składającej się z o rozmiarze n elementów size bajtów, cmp jest wskazaniem funkcji porównującej 2 elementy. Parametr base przekazuje adres początku tablicy tab, t.zn. base == (void *) tab Tomasz Marks - Wydział MiNI PW -27- qsort (2) Funkcja wskazana przez cmp musi zwracać: wartość ujemną, gdy obiekt *a jest mniejszy obiektu *b; zero, gdy obiekt *a jest równy *b; wartość dodatnią, gdy obiekt *a jest większy od obiektu *b. N.p. dla tablicy danych typu int odpowiednia funkcja moŝe mieć postać: int i_cmp ( const void* a, const void* b ) int A = *(int*)a, B = *(int*)b; return A - B; lub int i_cmp ( const void* a, const void* b ) return *(int*)a - *(int*)b; Tomasz Marks - Wydział MiNI PW -28-

qsort (3) N.p. dla tablicy danych typu double odpowiednia funkcja moŝe mieć postać: int d_cmp ( const void* a, const void* b ) double A = *(double*)a, B = *(double*)b; return (A-B<0)? -1 : ( (A-B>0)? 1 : 0 ); N.p. dla tablicy danych typu struct Osoba char nazwisko [20]; char imie [20]; int wiek; double waga; qsort (4) dla uporządkowania według alfabetycznej kolejności nazwisk odpowiednia funkcja moŝe mieć postać: UWAGA: return A B; nie będzie tu właściwym rozwiązaniem. Dlaczego??? int On_cmp ( const void* a, const void* b ) return strcmp ( (struct Osoba*)a->nazwisko, (struct Osoba*)b->nazwisko ); Tomasz Marks - Wydział MiNI PW -29- Tomasz Marks - Wydział MiNI PW -30- N.p. dla tablicy danych typu struct Osoba char nazwisko [20]; char imie [20]; int wiek; double waga; qsort (5) dla uporządkowania według alfabetycznej kolejności nazwisk i imion odpowiednia funkcja moŝe mieć postać: int Oni_cmp ( const void* a, const void* b ) int k = strcmp ( (struct Osoba*)a->nazwisko, (struct Osoba*)b->nazwisko ); if ( k ) return k; return strcmp ( (struct Osoba*)a->imie, (struct Osoba*)b->imie ); qsort (6) Dla tablic danych int A[100]; double B[30]; struct Osoba C[75]; wywołania porządkujące powyŝsze tablice powinny mieć postać: qsort ( A, 100, sizeof(int), i_cmp ); qsort ( B, 30, sizeof(double), d_cmp ); qsort ( C, 75, sizeof(struct Osoba), On_cmp ); // dla nazwisk qsort ( C, 75, sizeof(struct Osoba), Oni_cmp ); // dla nazwisk i imion Tomasz Marks - Wydział MiNI PW -31- Tomasz Marks - Wydział MiNI PW -32-

WieŜe Hanoi (1) jeszcze na temat... funkcje rekurencyjne "wieŝe Hanoi" Plik Tower of Hanoi.jpeg znajduje się w Wikimedia Commons Tomasz Marks - Wydział MiNI PW -33- Tomasz Marks - Wydział MiNI PW -34- WieŜe Hanoi (2) Problem: Posługując się trzema słupkami, z których pierwszy zawiera wieŝę z krąŝków o malejących (w kierunku do góry) średnicach, a dwa pozostałe są puste: odbuduj, z zachowaniem kształtu, wieŝę na trzecim słupku. Warunek 1. Podczas przekładania krąŝków wolno się posługiwać buforem, reprezentowanym przez drugi słupek. Warunek 2. Nie wolno kłaść krąŝka o większej średnicy na mniejszy ani przekładać kilku krąŝków jednocześnie. Sytuacja początkowa: Sytuacja docelowa: WieŜe Hanoi (3) UWAGA: ZłoŜoność obliczeniowa tego zadania wzrasta bardzo szybko wraz ze zwiększaniem liczby elementów wieŝy. Tomasz Marks - Wydział MiNI PW -35- Powiedzmy, Ŝe opis rozwiązania zadania zrealizuje wykonanie funkcji Hanoi ( 5, A, B,C ) Tomasz Marks - Wydział MiNI PW -36-

WieŜe Hanoi (4) Aby przemieścić dolny krąŝek na słupek C, trzeba doprowadzić do sytuacji: WieŜe Hanoi (5) Po przemieszeniu dolnego krąŝka na słupek C Rozwiązanie tego 'mniejszego' zadania moŝna zapisać jako wykonanie funkcji Hanoi ( 4, A, C, B ) Po której moŝna przenieść pojedynczy krąŝek z A na C. Zapiszemy to symbolicznie: A C Teraz trzeba wykonać zadanie Hanoi ( 4, B, A, C ) aby doprowadzić do oczekiwanego stanu końcowego. Tomasz Marks - Wydział MiNI PW -37- Tomasz Marks - Wydział MiNI PW -38- Zatem wyjściowe zadanie WieŜe Hanoi (6) Hanoi ( 5, A, B, C ) MoŜna zapisać jako sekwencję: Hanoi ( 4, A, C, B ) A C Hanoi ( 4, B, A, C ) WieŜe Hanoi (7) Uogólniając dla zadanego n Hanoi ( n, A, B, C ) MoŜna zapisać jako sekwencję: Hanoi ( n-1, A, C, B ) A C Hanoi ( n-1, B, A, C ) Tomasz Marks - Wydział MiNI PW -39- Tomasz Marks - Wydział MiNI PW -40-

WieŜe Hanoi (8) MoŜemy zatem zdefiniować funkcję, która opisze nam kolejne przemieszczenia: void Hanoi ( int n, char A, char B, char C ) if (n > 0) Hanoi ( n-1, A, C, B ); printf ( "%c --> %c\n", A, C ); Hanoi (n-1, B, A, C ); WieŜe Hanoi (9) A cały program moŝe wyglądać tak: // hanoi_prog.c #include <stdio.h> void Hanoi ( int n, char A, char B, char C ) if (n > 0) Hanoi ( n-1, A, C, B ); printf ( "%c --> %c\n", A, C ); Hanoi (n-1, B, A, C ); void main ( void ) int N; scanf ( "%d", &N ); Hanoi ( N, 'A', 'B', 'C' ); Tomasz Marks - Wydział MiNI PW -41- Tomasz Marks - Wydział MiNI PW -42- WieŜe Hanoi (10) Wyniki działania programu dla N == 4 : Koniec wykładu 12. Tomasz Marks - Wydział MiNI PW -43- Tomasz Marks - Wydział MiNI PW -44-