This is an old revision of the document!


Laboratorul 13 – Fluxuri I/O. Funcționale

Problema 1

Să se scrie un program pentru afișarea pe ecran a liniilor aflate pe poziții impare dintr-un fișier text. Fiecare linie va fi precedată de numărul ei și un spațiu.

În implementare, se va folosi un obiect de tip LineNumberReader.

Cerințe:

  • Tratați toate excepțiile care ar putea să apară exact acolo unde apar!
  • Atenție la închiderea fișierelor – să se facă chiar dacă apare excepție la citire!

Pentru validarea acestei cerințe, puteți folosi fișierul text test01.in pus la dispoziție în arhiva laboratorului.

Problema 2

Să se scrie un program care citește un text de la tastatură și îl salvează într-un fișier pe disc. Citirea se va face până la introducerea cuvântului exit.

În implementare se va utiliza metoda readLine() pentru un obiect de tip DataInputStream sau BufferedReader.

Tratați toate excepțiile care ar putea să apară!

Problema 3

Să se implementeze un program care citește din fișierul test02.in un text și determină numărul de cuvinte din text.

Pentru citire se vor utiliza un obiect de tip FileReader și unul de tip StreamTokenizer.

FileReader in = new FileReader(new File("test02.in"));
StreamTokenizer str = new StreamTokenizer(in);

Problema 4 – Funcționale

Realizați o arhitectură unificată, similară cu Collections, pentru manipularea listelor care să conțină:

  • Interfața Function, parametrizată corespunzător, care conține o metodă execute, având ca parametru un obiect de tip A și un rezultat de tip B, unde A și B sunt două tipuri formale;
  • Interfața Addition folosită pentru a calcula suma a două numere de tip T, unde T este un subtip al lui Number (aceasta va conține o metodă zero care va întoarce elementul neutru al operației de adunare și o metodă add, care primește două obiecte de tip T și returnează suma lor);
  • Doi algoritmi polimorfici: reverse care inversează elementele unei liste și sum care calculează suma elementelor din listă; acești algoritmi trebuie să poată fi folosiți pe implementări diferite de liste, deoarece le abordează la nivel de interfață;
  • O serie de metode care au un comportament similar cu funcționalele din paradigma funcțională.

Veți porni implementarea de la clasa ListUtil, pusă la dispoziție în arhiva laboratorului.

Explicații pentru funcționale

foldl(function, init, list) Returnează rezultatul aplicării funcției function pe rând asupra unui element din listă și a unui acumulator init. Ordinea folosirii elementelor din listă este de la stânga la dreapta.

foldl(f(x, y) = x + y, 5, [0, 1, 2, 3]) => 11

foldr(function, init, list) Are un comportament similar cu foldl, însă ordinea folosirii elementelor din listă este de la dreapta la stânga.

foldr(f(x, y) = y, 4, [0, 1, 2, 3]) => 0

map(function, list) Returnează lista rezultatelor aplicării unei funcții f asupra fiecărui element dintr-o listă.

map(f(x) = 2*x, [0, 1, 2, 3]) => [0, 2, 4, 6]

filter(predicat, list) Returnează lista elementelor dintr-o listă care satisfac un predicat p (un predicat îl vom percepe ca o funcție care are un rezultat de tip Boolean).

filter(f(x) = x % 2 == 0, [0, 1, 2, 3]) => [0, 2]

reduce(function, list) Aplică funcția pentru primele două elemente din listă, apoi pentru rezultatul obținut anterior și următorul element și tot așa.

reduce(f(x, y) = x + y, [47, 11, 42, 13]) => 113

all(predicat, list) Primește un predicat (metodă ce are ca rezultat un boolean) și verifică dacă toate elementele din listă satisfac predicatul.

all(f(x) = x > 0, [0, 1, 2, 3])      => False
all(f(x) = x >= 0, [0, 1, 2, 3])     => True

any(predicat, list) Primește un predicat și verifică dacă există cel puțin un element în listă care satisface predicatul.

any(f(x) = x < 0, [1, 2, 3, 4])      => False
any(f(x) = x % 2 == 0, [1, 2, 3])    => True
poo/laboratoare/14.1768199063.txt.gz · Last modified: 2026/01/12 08:24 by george.tudor1906
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0