Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
pp:2023:hw2_v2 [2023/04/10 11:12] pdmatei |
pp:2023:hw2_v2 [2023/04/11 00:04] (current) sorin.mateescu [2. Functii de procesare a datelor (50p)] |
||
---|---|---|---|
Line 3: | Line 3: | ||
<note important> | <note important> | ||
- | **DEADLINE TODO ** | + | **DEADLINE 28 aprilie 2023** |
* Temele trebuie submise pe curs.upb.ro, in assignment-ul numit ''Tema 2''. | * Temele trebuie submise pe curs.upb.ro, in assignment-ul numit ''Tema 2''. | ||
Line 15: | Line 15: | ||
* **var** (**val** este ok!) | * **var** (**val** este ok!) | ||
</note> | </note> | ||
- | <note>Scheletul se poate găsi la: TODO</note> | + | <note>Scheletul se poate găsi la: {{:pp:2023:tema2_2023_pp-skel.zip|}}</note> |
<note> | <note> | ||
- | Validatorul de arhive se poate găsi la: TODO | + | Validatorul de arhive se poate găsi la: {{:pp:2023:archive_validator_hw2.zip|}} |
\\ | \\ | ||
Formatul arhivelor este: | Formatul arhivelor este: | ||
- | * TODO | + | * util/Util.scala |
+ | * Table.scala | ||
+ | * TestTables.scala | ||
* ID.txt - acest fisier va contine o singura linie, formata din ID-ul unic al fiecarui student | * ID.txt - acest fisier va contine o singura linie, formata din ID-ul unic al fiecarui student | ||
Numele arhivelor trebuie sa fie de forma **<Nume>_<Prenume>_<Grupa>_T2.zip** (daca aveti mai multe prenume sau nume, le puteti separa prin '-') | Numele arhivelor trebuie sa fie de forma **<Nume>_<Prenume>_<Grupa>_T2.zip** (daca aveti mai multe prenume sau nume, le puteti separa prin '-') | ||
Line 56: | Line 58: | ||
</code> | </code> | ||
- | ====1. Tipul de date Table si parsarea datelor ==== | + | ====1. Tipul de date Table si parsarea datelor (10p) ==== |
Pentru inceput, trebuie sa definim o clasa prin care sa modelam ce este un tabel. | Pentru inceput, trebuie sa definim o clasa prin care sa modelam ce este un tabel. | ||
Line 62: | Line 64: | ||
Vom implementa clasa ''Table'' in acest sens: | Vom implementa clasa ''Table'' in acest sens: | ||
<code scala> | <code scala> | ||
- | case class Table (column_names: Line, tabular: List[List[String]]) { | + | class Table (column_names: Line, tabular: List[List[String]]) { |
??? | ??? | ||
} | } | ||
Line 69: | Line 71: | ||
Pentru a putea rula checkerul, este nevoie sa putem parsa input si output. Prin urmare, avem nevoie de o functie de citire si una de afisare a unui tabel. | Pentru a putea rula checkerul, este nevoie sa putem parsa input si output. Prin urmare, avem nevoie de o functie de citire si una de afisare a unui tabel. | ||
- | **1.1.** Suprascrieti metoda ''toString'' a unui tabel, astfel incat sa puteti reprezenta un tabel in forma csv. | + | **1.1. (5p)** Suprascrieti metoda ''toString'' a unui tabel, astfel incat sa puteti reprezenta un tabel in forma csv. |
Liniile vor fi separate prin ''\n'', iar coloanele vor fi delimitate prin '',''. | Liniile vor fi separate prin ''\n'', iar coloanele vor fi delimitate prin '',''. | ||
- | **1.2.** Definiti functia ''apply'' intr-un companion object al clasei ''Table''. Functia trebuie sa parseze un sir de caractere si sa returneze un tabel. | + | **1.2. (5p)** Definiti functia ''apply'' intr-un companion object al clasei ''Table''. Functia trebuie sa parseze un sir de caractere si sa returneze un tabel. |
<code scala> | <code scala> | ||
def apply(s: String): Table = ??? | def apply(s: String): Table = ??? | ||
</code> | </code> | ||
- | ====2. Functii de procesare a datelor==== | + | ====2. Functii de procesare a datelor (50p)==== |
- | In continuare, vom implementa operatii pe tabele, ca **membrii** ai clasei ''Table''. | + | In continuare, vom implementa operatii pe tabele, ca **membri** ai clasei ''Table''. |
- | **2.1.** Implementati functia ''select'' care selecteaza valorile din tabel asociate unor coloane date ca input. Daca operatia face referire la coloane inexistente, ea va intoarce ''None''. | + | **2.1. (5p)** Implementati functia ''select'' care selecteaza valorile din tabel asociate unor coloane date ca input. Daca operatia face referire la coloane inexistente, ea va intoarce ''None''. |
<code scala> | <code scala> | ||
def select(columns: Line): Option[Table] = ??? | def select(columns: Line): Option[Table] = ??? | ||
</code> | </code> | ||
- | **2.2.** Implementati functia ''filter'' care aplica un filtru pe liniile din tabel, fiind pastrate doar acele linii care verifica conditia. Daca conditia de filtrare face referiri la coloane inexistente, operatia va intoarce ''None''. | + | **2.2. (20p)** Implementati functia ''filter'' care aplica un filtru pe liniile din tabel, fiind pastrate doar acele linii care verifica conditia. Daca conditia de filtrare face referiri la coloane inexistente, operatia va intoarce ''None''. |
<code scala> | <code scala> | ||
def filter(cond: FilterCond): Option[Table] = ??? | def filter(cond: FilterCond): Option[Table] = ??? | ||
Line 100: | Line 102: | ||
<code scala> | <code scala> | ||
trait FilterCond { | trait FilterCond { | ||
+ | // these are useful for the intuitive infix notation | ||
+ | // e.g. the following expression is a filter condition: | ||
+ | // Field("PL", x=>true) && Field("PL", x=> false) | ||
def &&(other: FilterCond): FilterCond = ??? | def &&(other: FilterCond): FilterCond = ??? | ||
def ||(other: FilterCond): FilterCond = ??? | def ||(other: FilterCond): FilterCond = ??? | ||
Line 121: | Line 126: | ||
</code> | </code> | ||
- | **2.3** Implementati functia ''newCol'' ce adauga o noua coloana la finalul unui tabel, fiecare intrare in acea coloana asociata unei linii fiind completata cu o valoare default. | + | **2.3. (5p)** Implementati functia ''newCol'' ce adauga o noua coloana la finalul unui tabel, fiecare intrare in acea coloana asociata unei linii fiind completata cu o valoare default. |
<code scala> | <code scala> | ||
def newCol(name: String, defaultVal: String): Table = ??? | def newCol(name: String, defaultVal: String): Table = ??? | ||
</code> | </code> | ||
- | **2.4.** Implementati functia ''merge'' care uneste 2 tabele. Identificarea liniilor ce trebuie combinate se va face folosing coloana comuna ''key''. Daca exista suprapuneri intre valori, se vor pastra amandoua sub forma unui singur sir de caractere (cele doua intrari vor fi separate prin '';''), iar acolo unde nu exista corespondent in unul dintre tabele, coloanele ramase necompletate vor fi umplute cu un sir de caractere gol. Daca coloana ''key'' nu exista in vreunul din tabele, se va intoarce None. | + | **2.4. (20p)** Implementati functia ''merge'' care uneste 2 tabele. Identificarea liniilor ce trebuie combinate se va face folosing coloana comuna ''key''. Daca exista suprapuneri intre valorile asociate unei chei in cele doua tabele, se vor pastra amandoua valorile (daca sunt diferite) sub forma unui singur sir de caractere (cele doua intrari vor fi separate prin '';''), iar acolo unde nu exista corespondent in unul dintre tabele, coloanele ramase necompletate vor fi umplute cu un sir de caractere gol. Daca coloana ''key'' nu exista in vreunul din tabele, se va intoarce ''None''. |
<code scala> | <code scala> | ||
def merge(key: String, other: Table): Option[Table] = ??? | def merge(key: String, other: Table): Option[Table] = ??? | ||
Line 145: | Line 150: | ||
MERGE intre TABEL 1 si TABEL 2 cu cheia PL: | MERGE intre TABEL 1 si TABEL 2 cu cheia PL: | ||
- | PL Functional OO Description | + | PL Functional Description OO |
- | Haskell yes "" nice | + | Haskell yes nice "" |
- | Scala yes yes cool | + | Scala yes cool yes |
- | Python yes yes good;whoa | + | Python yes good;whoa yes |
</code> | </code> | ||
</hidden> | </hidden> | ||
- | ====3. Query Language ==== | + | ====3. Query Language (40p)==== |
Obiectivul acestui task este acela de a: | Obiectivul acestui task este acela de a: | ||
Line 160: | Line 165: | ||
* debug, testare | * debug, testare | ||
- | Veti implementa un Query Language ce reprezinta un API pentru o varietate de transformari de tabele, deja implementate anerior ca functii. Un ''Query'' este o secventa/ combinatie de astfel de transformari. | + | **3.0. (25p)** Veti implementa un Query Language ce reprezinta un API pentru o varietate de transformari de tabele, deja implementate anerior ca functii. Un ''Query'' este o secventa/ combinatie de astfel de transformari. |
Query-urile sunt descrise recursiv astfel: | Query-urile sunt descrise recursiv astfel: | ||
Line 206: | Line 211: | ||
In finalul acestei teme, vom scrie propriul nostru Query, folosind tabelele Functional, Object-Oriented si Imperative, ce contin doar 3 coloane: "Language", "Original purpose", "Other paradigms". | In finalul acestei teme, vom scrie propriul nostru Query, folosind tabelele Functional, Object-Oriented si Imperative, ce contin doar 3 coloane: "Language", "Original purpose", "Other paradigms". | ||
- | **3.1.** Creati tabelul ''TestTables.programmingLanguages1'' combinand functiile ''newCol'' si ''merge'': | + | **3.1. (5p)** Creati tabelul ''TestTables.programmingLanguages1'' combinand functiile ''newCol'' si ''merge'': |
* creati o noua colana in fiecare tabel ce contine tipul limbajului, avand acelasi nume ca tabela si valoare default "Yes" | * creati o noua colana in fiecare tabel ce contine tipul limbajului, avand acelasi nume ca tabela si valoare default "Yes" | ||
* aplicati merge intre noile tabele dupa numele limbajelor de programare | * aplicati merge intre noile tabele dupa numele limbajelor de programare | ||
- | **3.2** Eliminati limbajele al caror scop original este "Application" si sunt "concurrent". Rezultatul se va numi ''TestTables.programmingLanguages2''. | + | **3.2. (5p)** Eliminati limbajele al caror scop original este "Application" si sunt "concurrent". Rezultatul se va numi ''TestTables.programmingLanguages2''. |
- | **3.3** Selectati doar coloanele "Language", "Object-Oriented" and "Functional" din tabelul obtinut anterior. Rezultatul se va numi ''TestTables.programmingLanguages3''. | + | **3.3. (5p)** Selectati doar coloanele "Language", "Object-Oriented" si "Functional" din tabelul obtinut anterior. Rezultatul se va numi ''TestTables.programmingLanguages3''. |