Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
pp:2023:hw2_v2 [2023/04/10 11:11]
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 93: Line 95:
 Pentru acest exercitiu, este nevoie sa implementam si filtrele ce se aplica pe o linie din tabel. Definim un filtru recursiv, astfel: Pentru acest exercitiu, este nevoie sa implementam si filtrele ce se aplica pe o linie din tabel. Definim un filtru recursiv, astfel:
 <​code> ​ <​code> ​
-  ​<​filter>​ ::= <​filter>​ && <​filter>​ | <​filter>​ || <​filter>​ | (<​column_name>​ <​predicate>​) +<​filter>​ ::= <​filter>​ && <​filter>​ | <​filter>​ || <​filter>​ | (<​column_name>​ <​predicate>​) 
-<​code>​+</code> 
 Unde ''<​column_name>''​ este un nume de coloana, iar <​predicate>​ este un predicat ce poate sau nu sa fie satisfacut de valoarea de la coloana respectiva. Unde ''<​column_name>''​ este un nume de coloana, iar <​predicate>​ este un predicat ce poate sau nu sa fie satisfacut de valoarea de la coloana respectiva.
  
 <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 120: 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] = ???
 </​code>​ </​code>​
 +
 <hidden Exemplu> <hidden Exemplu>
 <​code>​ <​code>​
Line 143: 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 158: 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 204: 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''​.