Računarski praktikum I - Vježbe 11 - Funktori

Слични документи
Računarski praktikum I - Vježbe 07 - Podstrukture, const, reference

Računarski praktikum I - Vježbe 06 - Standard Template Library (2)

Računarski praktikum I - Vježbe 09 - this, static

Računarski praktikum I - Vježbe 03 - Implementacija strukture string

Државно такмичење године 5. и 6. разред 1. [pločice] Правоугаону терасу димензија d s центиметара квадратних треба поплочати коришћењем плочица

Računarski praktikum I - Vježbe 01 - Uvod

Microsoft PowerPoint - MR - Vjezbe - 03.ppt [Compatibility Mode]

Programiranje 2 popravni kolokvij, 15. lipnja Ime i prezime: JMBAG: Upute: Na kolokviju je dozvoljeno koristiti samo pribor za pisanje i brisanj

The real problem is that programmers have spent far too much time worrying about efficiency in the wrong places and at the wrong times; premature opti

Tutoring System for Distance Learning of Java Programming Language

Microsoft Word - Zadaci za samostalno vjezbanje 4.doc

Uvod u računarstvo 2+2

PRIRODNO MATEMATIČKI FAKULTET U NIŠU DEPARTMAN ZA RAČUNARSKE NAUKE Utorak, godine PRIJEMNI ISPIT IZ INFORMATIKE 1. Koja od navedenih ekste

Programiranje 2 0. predavanje Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb Prog2 2019, 0. predavanje p. 1/4

Funkcije predavač: Nadežda Jakšić

Konstrukcija i analiza algoritama vežbe 10 Nina Radojičić 15. decembar Algoritamske strategije - podeli pa vladaj (divide and conquer) Ova stra

1. Vremensko ograničenje Memorijsko ograničenje ulaz izlaz 0,1 s 64 MB standardni ulaz standardni izlaz Banka želi da upozori kupce na sumnjive aktivn

Tutoring System for Distance Learning of Java Programming Language

Tutoring System for Distance Learning of Java Programming Language

Microsoft PowerPoint - Datoteke [Compatibility Mode]

Uvod u računarstvo 2+2

MIP-heuristike (Matheuristike) Hibridi izmedu metaheurističkih i egzaktnih metoda Tatjana Davidović Matematički institut SANU

Microsoft PowerPoint - OOPpredavanja05 [Compatibility Mode]

Microsoft PowerPoint - Programski_Jezik_C_Organizacija_Izvornog_Programa_I_Greske [Compatibility Mode]

1 jmbag ime i prezime Programiranje 2 prvi kolokvij, Rezultati i uvidi u kolokvije: Rezultati u petak, 3.5., navečer na webu, a uvidi u p

Slide 1

Programski jezici i strukture podataka 2018/2019. Programski jezici i strukture podataka Računarske vežbe vežba 10 Zimski semestar 2018/2019. Studijsk

Grananje u programu predavač: Nadežda Jakšić

Programiranje II Beleške sa vežbi Smer Informatika Matematički fakultet, Beograd Sana Stojanović 1

Programiranje predavanje Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb Prog1 2016, 10. predavanje p. 1

Uvod u računarstvo 2+2

Strukture predavač: Nadežda Jakšić

Funkcije predavač: Nadežda Jakšić

8 LINQ upiti LINQ (Language Integrated Query upit integrisan u jezik) jeste skup mogućnosti koje jezik C# i Framework pružaju za pisanje strukturirani

Programiranje 1 drugi kolokvij, 2. veljače Ime i prezime: JMBAG: Upute: Na kolokviju je dozvoljeno koristiti samo pribor za pisanje i brisanje,

Microsoft PowerPoint - 07-DinamickeStrukturePodataka

Datoteke predavač: Nadežda Jakšić

Univerzitet u Novom Sadu Tehnički fakultet Mihajlo Pupin Zrenjanin Seminarski rad Predmet: Konkuretno programiranje doc. dr Dejan Lacmanovic Zorica Br

Uvod u računarstvo 2+2

Classroom Expectations

Рачунарска интелигенција

Algoritmi SŠ P1

VEŽBA 5: KLASE I OBJEKTI U C# Cilj ove vežbe je upoznavanje sa osnovama rada sa klasama i objektima u programskom jeziku C#. Pored toga, bide demonstr

Upitni jezik SQL

Funkcijska sučelja: često korištena za modeliranje objekata koji obavljaju određene poslove Anotirana su signaliziraju da se t

Programski jezik C

2015_k2_z12.dvi

1. Apsolutni pobednik na glasanju vreme memorija ulaz izlaz 0,1 s 64 Mb standardni ulaz standardni izla Apsolutni pobednik izbora je onaj ko osvoji ba

Zadaća 4. Ova zadaća nosi ukupno 4 poena, pri čemu prva dva zadatka nose po 1 poen, treći zadatak 1,5 poen i četvrti zadatak 0.5 poena. Svi zadaci se

PowerPoint Presentation

Slide 1

Skripte2013

PowerPoint Presentation

Програмирај!

070-ALIP2-udzbenik.indb

Uvod u PHP

Microsoft PowerPoint - 12-Funkcije_1.ppt [Compatibility Mode]

Programiranje za UNIX Okruženje unix procesa

1. OPĆE INFORMACIJE 1.1. Naziv kolegija Programiranje 1.6. Semestar Nositelj kolegija dr.sc. Bruno Trstenjak, v. pred Bodovna vrijednost

Algoritmi

Objektno orjentirano programiranje

Microsoft PowerPoint - C-4-1

Microsoft PowerPoint - 03-Slozenost [Compatibility Mode]

PROGRAMIRANJE Program je niz naredbi razumljivih računalu koje rješavaju neki problem. Algoritam je postupak raščlanjivanja problema na jednostavnije

Sveučilište u Zagrebu Fakultet prometnih znanosti Zavod za inteligentne transportne sustave Katedra za primijenjeno računarstvo Vježba: #7 Kolegij: Ba

Uvod u takmičarsko programiranje

Osnove inženjerske informatike II. Uvod u programiranje Vaš prvi program K. F. & V. B.

Introduction to Programming

Oblikovanje i analiza algoritama 5. predavanje Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb OAA 2017, 5. pr

PowerPoint Presentation

Microsoft Word - AIDA2kolokvijumRsmerResenja.doc

Računarske mreže Čas 2 Ivana Tanasijević Matematički fakultet, Beograd 1

Hash, topsort (stack, queue), deque, map Hash 1. За дати низ од n елемената, где је n паран број и n <= 10 6, испитати да ли он може бити подељен на n

PHP kod

Hej hej bojiš se matematike? Ma nema potrebe! Dobra priprema je pola obavljenog posla, a da bi bio izvrsno pripremljen tu uskačemo mi iz Štreberaja. D

Programiranje 2 1. predavanje Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb Prog2 2019, 1. predavanje p. 1/7

Programiranje u C-u ili C++-u Pseudo-slučajni brojevi; Dinamička alokacija memorije 1 ZADACI SA ČASA Zadatak 1 Napraviti funkciju koja generišlučajan

Grafovski algoritmi - čas 4 Artikulacione tačke i mostovi Ukoliko u neusmerenom povezanom grafu G = (V, E) postoji čvor v V takav da njegovim uklanjan

Орт колоквијум

Programski jezik C

Microsoft PowerPoint - 10-Jednodimenzionalni nizovi.ppt [Compatibility Mode]

Test ispravio: (1) (2) Ukupan broj bodova: 21. veljače od 13:00 do 14:00 Županijsko natjecanje / Osnove informatike Osnovne škole Ime i prezime

Državna matura iz informatike

Često postavljana pitanja u programu OBRT 1. Kako napraviti uplatu u knjizi tražbina i obveza? 2. Kako odabrati mapu/disk za pohranu podataka? 3. Kako

SAŽETAK Diplomski rad, kroz teorijsku razradu i prikaz praktične primjene na primjeru aplikacije za pretragu studentskih poslova, obrađuje temu računa

UAAG Osnovne algebarske strukture 5. Vektorski prostori Borka Jadrijević

ZADACI ZA VEŽBU 1. Realizovati konzolnu aplikaciju koja će računati površinu kvadrata, pravougaonika ili trougla. 2. Preko konzole se unosi ocena od 1

07_PJISP_II_Predavanja

Microsoft Word - mat_szerb_kz_1flap.doc

Osnovni programiranja I

ELEKTROTEHNIČKI FAKULTET UNIVERZITETA U BEOGRADU BEOGRAD, Ispit iz Programiranja 2 Ispit traje 135 minuta Napomene: a) Pažljivo proučite U

sve.dvi

GLAZBENA UČILICA Marko Beus Filozofski fakultet u Zagrebu 098/ Sažetak Glazbena učilica je projekt osmišljen kao nadopuna

MIP-heuristike (Matheuristike) Hibridi izmedu metaheurističkih i egzaktnih metoda Tatjana Davidović Matematički institut SANU

Microsoft Word - 15ms261

P2.1 Projektovanje paralelnih algoritama 1

PowerPoint Presentation

studirko.com predstavlja: Večernja škola C# za FPZ ( ) v 4.0 Za studirko.com napisao: Slaven Špigl

Programiranje 1 5. predavanje dodatak Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb Prog1 2018, 5. predavanj

Microsoft Word - 11 Pokazivaci

Транскрипт:

Prirodoslovno-matematički fakultet Matematički odsjek Sveučilište u Zagrebu RAČUNARSKI PRAKTIKUM I Vježbe 11 - Funktori v2018/2019. Sastavio: Zvonimir Bujanović

Funkcijski objekti (funktori) Objekt klase koja ima nadograđen operator() zovemo funkcijski objekt ili funktor. template<class T> struct dupler void operator()( T &x ) x = x+x; } }; int main() int zz = 5; string oo = "AB"; dupler<int> DI; DI( zz ); // zz=10 dupler<string>()( oo ); // oo="abab" } return 0; 2

Funkcijski objekti (funktori) dupler je primjer unarnog funktora. Možemo napraviti funktore s proizvoljnim brojem parametara (pa i 0). template<class T> struct max // binarni funktor T operator()( T x, T y ) return (x < y)? y : x; } }; int main () max<string> MS; string oo = MS( "ab", "aac" ); // oo="ab" } int zz = max<int>()( 3, 7 ); // zz=7 3

Funkcijski objekti (funktori) Kombinacijom funktora i iteratora možemo implementirati razne algoritme koji rade s proizvoljnim spremnicima (vector, list, ). template<class Iter, class Functor> void for_each( Iter st, Iter en, Functor f ) for( Iter i = st; i!= en; ++i ) f( *i ); } int main() list<int> L; L.push_back( 2 ); L.push_back( 6 ); // L = (2, 6) } for_each( L.begin(), L.end(), dupler<int>() ); // sada: L = (4, 12) 4

Funkcijski objekti (funktori) Promjenom funktora poslanog for_each možemo s elementima liste napraviti nešto sasvim drugo. template<class T> struct printer void operator()( T x ) cout << x << " "; } }; int main() list<int> L; L.push_back( 2 ); L.push_back( 6 ); // L = (2, 6) } for_each( L.begin(), L.end(), printer<int>() ); // ispis na ekran: "2 6 " 5

Zadatak 1 Napišite generičku funkciju za sortiranje spremnika, te pripadne binarne funktore tako da imamo sljedeću funkcionalnost: int X[] = 2, 6, 4, 7, 8 }; vector<int> V( X, X+5 ); sort( V.begin(), V.end(), manji<int>() ); for_each( V.begin(), V.end(), printer<int>() ); // ispise "2 4 6 7 8 " sort( X, X+5, veci<int>() ); for_each( X, X+5, printer<int>() ); // ispise "8 7 6 4 2 " Ovdje su veci, manji (binarni) funktori koji vraćaju bool. Takve funktore zovemo (binarni) predikati. 6

Funktori i algoritmi u STL-u #include <algorithm> for_each i sort već dolaze u STL-u, koriste se na posve jednak način; sort je izuzetno efikasno implementiran. Postoje i predikati greater, less koji rade istu stvar kao redom predikati veci, manji koje smo implementirali u Zadatku 1: sort( V.begin(), V.end(), greater<int>() ); set i map mogu primati i dodatni funktor (default=less) koji kaže kako treba sortirati elemente: set<int, greater<int>> S; S.insert( 1 ); S.insert( 7 ); // S = (7, 1); Postoji cijeli niz gotovih algoritama koji rade s funktorima. 7

Pretraživanje find vraća iterator prvog elementa jednakog trećem parametru. list<int> L; L.push_back(3); L.push_back(1); L.push_back(7); list<int>::iterator r = find( L.begin(), L.end(), 1 ); // r = iterator na element jednak 1 find_if vraća iterator prvog elementa za kojeg je istinit unarni predikat poslan kao treći parametar. struct pozitivan bool operator()(int x) return x > 0; } }; list<int> L; L.push_back(-3); L.push_back(-1); L.push_back(7); list<int>::iterator r = find_if( L.begin(), L.end(), pozitivan() ); // r = iterator na prvi pozitivni element (7) 8

Pretraživanje count vraća broj elemenata jednakih trećem parametru. list<int> L; L.push_back(1); L.push_back(1); L.push_back(7); int r = count( L.begin(), L.end(), 1 ); // r = 2 count_if vraća broj elemenata za koje je istinit unarni predikat poslan kao treći parametar. list<int> L; L.push_back(3); L.push_back(-1); L.push_back(7); int r = count_if( L.begin(), L.end(), pozitivan() ); // r = 2 9

copy/replace copy kopira sve elemente iz intervala određenog s prva dva parametra na mjesto koje počinje s trećim parametrom. Uoči: u ciljnom spremniku mora biti dovoljno mjesta! int X[] = 5, 2, 3, 6, 5}; list<int> L(5); copy( X, X+5, L.begin() ); replace svaka pojava trećeg parametra zamjenjuje se četvrtim. list<int> L; L.push_back(1); L.push_back(4); L.push_back(1); replace( L.begin(), L.end(), 1, 5 ); // L = (5, 4, 5) 10

fill/generate fill popuni raspon određen prvim dvama parametrima s trećim parametrom. list<int> L(5); fill( L.begin(), L.end(), 3 ); // L = (3, 3, 3, 3, 3) generate kao fill, ali treći parametar je funktor bez parametara, u donjem slučaju pointer na C-ovu funkciju rand(). list<int> L(5); generate( L.begin(), L.end(), rand ); // L = (234324, 823, 9162, 12312, 5685), npr. 11

transform transform(st1, en1, st2, f) nad svakim elementom raspona [st1, en1 izvrši unarni funktor f i rezultate spremi u raspon koji počinje sa st2. struct negiraj int operator()( int x ) return -x; } }; list<int> L; L.push_back(3); L.push_back(5); // L = (3, 5) vector<int> V(5); transform( L.begin(), L.end(), V.begin(), negiraj() ); // V = (-3, -5, 0, 0, 0) 12

transform transform(st1, en1, st2, st3, f) nad svakim elementom raspona [st1, en1 i odgovarajućim elementom raspona koji počinje na st2 izvrši binarni funktor f i rezultate spremi u raspon koji počinje sa st3. struct zbrajaj int operator()( int x, int y ) return x+y; } }; list<int> L; L.push_back(3); L.push_back(5); // L = (3, 5) list<int> M; M.push_back(6); M.push_back(7); // M = (6, 7) vector<int> V(5); transform( L.begin(), L.end(), M.begin(), V.begin(), zbrajaj() ); // V = (9, 12, 0, 0, 0) Umjesto zbrajaj možemo koristiti i već gotovi plus<int>. 13

reverse/random_shuffle reverse preokreće redoslijed elementa u rasponu [st, en. list<int> L; L.push_back(3); L.push_back(5); L.push_back(7); // L = (3, 5, 7) reverse( L.begin(), L.end() ); // L = (7, 5, 3) random_shuffle na slučajan način promjeni redoslijed elemenata u rasponu [st, en ; radi samo sa vector-om ili poljem. vector<int> V; V.push_back(3); V.push_back(5); V.push_back(7); // V = (3, 5, 7) random_shuffle( V.begin(), V.end() ); // V = (5, 7, 3), npr. 14

next_permutation Zamislimo da sve permutacije elemenata nekog spremnika poredamo u niz koji je leksikografski sortiran. next_permutation mijenja poredak elemenata u spremniku tako da on bude iduća po redu pemutacija u nizu, vraća true ako iduća permutacija postoji, a false ako ne postoji. int X[] = 1, 2, 3}; while( 1 ) for_each( X, X+3, printer<int>() ); cout << endl; } if(!next_permutation( X, X+3 ) ) break; // Ispis: // (1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1) 15

next_permutation next_permutation može primiti i dodatni parametar (binarni predikat) ako je niz permutacija sortiran na drugačiji način. int X[] = 3, 2, 1}; while( 1 ) for_each( X, X+3, printer<int>() ); cout << endl; } if(!next_permutation( X, X+3, greater<int>() ) ) break; // Ispis: // (3, 2, 1), (3, 1, 2), (2, 3, 1), (2, 1, 3), (1, 3, 2), (1, 2, 3) 16

Zadatak 2 Odaberite bilo koja 3 opisana algoritma i napišite svoju implementaciju. Za popis svih dostupnih algoritama vidi: http://www.cplusplus.com/reference/algorithm/ 17

Funktori i funkcije Kao parametre algoritmima možemo slati i (pokazivače na) funkcije. int zbr( const int &a, const int &b ) return a+b; } transform( L.begin(), L.end(), M.begin(), V.begin(), zbr ); // OK! Međutim, tip u predlošku ne može biti funkcija, nego samo funktor. bool veci( const int &a, const int &b ) return a < b? false : true; } set<int, veci> S; // compile error, veci nije tip! Pozive naših algoritama i onih iz STL-a razlikujemo ovako: ::for_each( V.begin(), V.end(), printer<int>() ); // nas std::for_each( V.begin(), V.end(), printer<int>() ); // STL-ov 18