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:2026:scala:t01 [2026/03/25 18:59]
ldaniel edit sectiunea de testare
pp:2026:scala:t01 [2026/04/03 23:01] (current)
ldaniel explicatie lista de cumparaturi
Line 3: Line 3:
 Deadline: ''​17 aprilie 2026''​ Deadline: ''​17 aprilie 2026''​
  
-Schelet de cod: TODO +Schelet de cod: {{:​pp:​2026:​scala:​tema1_pp_2026_skel_v3.zip|}} (actualizat 30 martie20:13)
- +
-După ce ați descărcat scheletulcreați un proiect nou din IntelliJ în Scala, în care copiați folderele și fișierul din arhivă în root-ul proiectului (folderul ''​src''​ va fi suprascris). Dați restart la IDE și ar trebui să funcționeze.+
  
 +Punctajul maxim este de 200 de puncte. Acesta este impartit astfel (puteti vedea in fisierele de test cat valoreaza fiecare test):
 +| **Modul** | **Sursa** | **Punctaj** |
 +| decoder | Decoder.scala | 100p |
 +| database | Table.scala | 25p |
 +| database | FilterCond.scala | 25p |
 +| database | PP_SQL.scala | 30p |
 +| shop | Commands.scala | 20p |
 <note warning>​După deadline fiecare student va prezenta tema la laborator, explicând în detaliu implementarea.</​note>​ <note warning>​După deadline fiecare student va prezenta tema la laborator, explicând în detaliu implementarea.</​note>​
  
Line 14: Line 19:
   * Partea 1: modulul de decodificare a codului de bare de pe produs   * Partea 1: modulul de decodificare a codului de bare de pe produs
   * Partea 2: modulul de tabele folosit pentru a stoca informatiile despre produse, cum at fi denumirea, pretul si codul de bare   * Partea 2: modulul de tabele folosit pentru a stoca informatiile despre produse, cum at fi denumirea, pretul si codul de bare
-  * Partea 3: operatii uzuale de gestionare a cosului de cumparaturi,​ de exemplu adaugarea ​deproduse, stergerea sau modificarea cantitatii+  * Partea 3: operatii uzuale de gestionare a cosului de cumparaturi,​ de exemplu adaugarea ​de produse, stergerea sau modificarea cantitatii
  
 ===== 1. Coduri de bare ===== ===== 1. Coduri de bare =====
Line 455: Line 460:
 </​hidden> ​ </​hidden> ​
  
-==== Clasa Table ====+==== 2.1. Clasa Table (25p) ====
  
 Vom defini un tabel ca o clasa care are ca atribute numele tabelei ''​tableName''​ si datele ''​tableData''​. Vom defini un tabel ca o clasa care are ca atribute numele tabelei ''​tableName''​ si datele ''​tableData''​.
Line 467: Line 472:
 </​code>​ </​code>​
  
-**2.1.1.** Definiti metoda ''​toString''​ care returneaza tabelul in forma CSV.+**2.1.1.** Definiti functia apply intr-un **companion object** al clasei ''​Table''​. Functia trebuie sa parseze un sir de caractere si sa returneze un tabel cu numele dat. 
 +<code scala> 
 +def apply(name: String, s: String): Table = ??? 
 +</​code>​ 
 + 
 +**2.1.2.** Definiti metoda ''​toString''​ care returneaza tabelul in forma CSV.
 <code scala> <code scala>
 override def toString: String = ??? override def toString: String = ???
 </​code>​ </​code>​
  
-**2.1.2** Definiti operatia de inserare a unei linii in tabel.+**2.1.3** Definiti operatia de inserare a unei linii in tabel. Nu vom insera linia daca exista o linie identica ​in tabel.
 <code scala> <code scala>
 def insert(row: Row): Table = ??? def insert(row: Row): Table = ???
 </​code>​ </​code>​
  
-**2.1.3** Definiti operatia de stergere a tuturor liniilor exact egale cu cea primita ca parametru.+**2.1.4** Definiti operatia de stergere a tuturor liniilor exact egale cu cea primita ca parametru.
 <code scala> <code scala>
 def delete(row: Row): Table = ??? def delete(row: Row): Table = ???
 </​code>​ </​code>​
  
-**2.1.4.** Definiti operatia de sortare a liniilor din tabel dupa o anumita coloana.+**2.1.5.** Definiti operatia de sortare a liniilor din tabel dupa o anumita coloana.
 <code scala> <code scala>
 def sort(column:​ String): Table = ??? def sort(column:​ String): Table = ???
 </​code>​ </​code>​
  
-**2.1.5.** Definiti functia select care primeste o lista de stringuri si returneaza un nou obiect de tip Table ce contine doar coloanele specificate.+**2.1.6.** Definiti functia select care primeste o lista de stringuri si returneaza un nou obiect de tip Table ce contine doar coloanele specificate.
 <code scala> <code scala>
 def select(columns:​ List[String]):​ Table = ??? def select(columns:​ List[String]):​ Table = ???
-</​code>​ 
- 
-**2.1.6.** Definiti functia apply intr-un **companion object** al clasei ''​Table''​. Functia trebuie sa parseze un sir de caractere si sa returneze un tabel cu numele dat. 
-<code scala> 
-def apply(name: String, s: String): Table = ??? 
 </​code>​ </​code>​
  
  
  
-==== Filtre peste Tabele ====+==== 2.2. Filtre peste Tabele ​(25p) ====
  
 <​code>​ <​filter>​ ::=  <​code>​ <​filter>​ ::= 
Line 582: Line 587:
 </​code>​ </​code>​
  
-==== Query Language ====+==== 2.3. Query Language ​(30p) ====
  
 Vom dezvolta un limbaj de interogare, care va servi ca API pentru o gama variata de transformari de tabele, anterior implementate sub forma de functii. Acest limbaj de query va permite secvente sau combinatii ale acestor transformari. Vom dezvolta un limbaj de interogare, care va servi ca API pentru o gama variata de transformari de tabele, anterior implementate sub forma de functii. Acest limbaj de query va permite secvente sau combinatii ale acestor transformari.
Line 656: Line 661:
  
 ===== 3. Casa de Marcat ===== ===== 3. Casa de Marcat =====
-Vrem sa simulam operatii elementare pe care le-am folosi la o casa de marcat de tip self checkout. Va veti folosi de **productsTable**,​ un tabel intitulat "​Products"​ ce contine coloeanele "​Barcode",​ "​Name"​ si "​Price"​. 
  
 +Vrem sa simulam operatii elementare pe care le-am folosi la o casa de marcat de tip self checkout. Va veti folosi de **productsTable**,​ un tabel intitulat "​Products"​ ce contine coloeanele "​Barcode",​ "​Name"​ si "​Price"​. **Veti construi un nou tabel pentru lista de cumparaturi,​ care va avea coloanele name, quantity si price.
 +**
 Pentru urmatoarele cerinte trebuie sa va folositi de implementarile de la 2.3.2. Va oferim un exemplu de utilizare al **queryT**, in care selectam(cu FILTER) acele randuri care pe coloana "​Name"​ contin cuvantul "​lapte":​ Pentru urmatoarele cerinte trebuie sa va folositi de implementarile de la 2.3.2. Va oferim un exemplu de utilizare al **queryT**, in care selectam(cu FILTER) acele randuri care pe coloana "​Name"​ contin cuvantul "​lapte":​
 <code scala> <code scala>
 queryT(Some(productsTable),​ "​FILTER",​ Field("​Name",​ _.contains("​lapte"​))) queryT(Some(productsTable),​ "​FILTER",​ Field("​Name",​ _.contains("​lapte"​)))
 </​code>​ </​code>​
 +
 +==== 3.1. Operatii elementare (20p) ==== 
 +In fisierul Commands.scala din modulul shop, implementati urmatoarele functii: ​
  
 **3.1.1** Definiti operatia de initializare a unui nou cos de cumparaturi (tabela goala). **3.1.1** Definiti operatia de initializare a unui nou cos de cumparaturi (tabela goala).
Line 707: Line 716:
 ===== Cum rulez pe propriile exemple? ===== ===== Cum rulez pe propriile exemple? =====
  
-Găsiți fișierul ​''​MyBarcodes.scala'' ​care poate fi rulat din IDE. Funcția ''​readBarcodes''​ primește numele unui folder de input și a unui folder de output. În cel de input puteți pune propriile imagini cu coduri de bare în format **.ppm**. Decupați doar codul de bare din imagini și aveți grijă ca acestea să fie suficient de clare, altfel algoritmul nu va funcționa. Puteți converti imagini în formatul **.ppm** pe https://​convertio.co/​. În folderul de output puteți vedea aceleași imagini **.ppm**, dar în format alb-negru (adică **.pbm**). +Folositi fisierul ​''​Main.scala'' ​ca exemplu. Funcția ''​readBarcodes''​ primește numele unui folder de input și a unui folder de output. În cel de input puteți pune propriile imagini cu coduri de bare în format **.ppm**. Decupați doar codul de bare din imagini și aveți grijă ca acestea să fie suficient de clare, altfel algoritmul nu va funcționa. Puteți converti imagini în formatul **.ppm** pe https://​convertio.co/​. În folderul de output puteți vedea aceleași imagini **.ppm**, dar în format alb-negru (adică **.pbm**). ​Daca doriti sa simulati intreaga functionare a unui magazin, si nu doar recunoasterea codului de bare, adaugati in fisierul csv si detalii despre produsul din imaginea voastra. Have fun!
 ===== Aplicatie a codurilor de bare ===== ===== Aplicatie a codurilor de bare =====
  
 Puteti verifica ce contine mancarea folosind site-ul https://​world.openfoodfacts.org/​. Codul de bare pentru fiecare produs este unic la nivel global. Have fun! Puteti verifica ce contine mancarea folosind site-ul https://​world.openfoodfacts.org/​. Codul de bare pentru fiecare produs este unic la nivel global. Have fun!