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/18 18:22]
ldaniel
pp:2026:scala:t01 [2026/04/03 23:01] (current)
ldaniel explicatie lista de cumparaturi
Line 1: Line 1:
 ===== Tema 1 PP – Casa de marcat ===== ===== Tema 1 PP – Casa de marcat =====
-Publicare: ''​?? martie 2026''​\\ +Publicare: ''​25 martie 2026''​\\ 
-Deadline: ''​?? aprilie 2026''​+Deadline: ''​17 aprilie 2026''​
  
-Schelet de cod: {{:pp:2025:scala:tema1_pp_2025.zip|}} +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 590: Line 595:
  
  
-**2.3.1.** Vom defini operatiile ce se pot realiza pe o tabela folosind TDA-ul ''​PP_SQL_Table''​. Funcția ''​eval''​ trebuie sa apeleze metodele corespunzatoare ​ definite in ''​Table''​.+**2.3.1.** Vom defini operatiile ce se pot realiza pe o tabela folosind TDA-ul ''​PP_SQL_Table''​. Funcția ''​eval''​ trebuie sa apeleze metodele corespunzatoare ​ definite in ''​Table''​. Ne vom folosi de mostenire pentru a oferi implementari specifice functiei eval pentru fiecare tip de operatie.
  
 <code scala> <code scala>
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 680: Line 689:
 </​code>​ </​code>​
 =====  Testare =====  =====  Testare ===== 
-În folderul src/test din proiect se află Test.scala, care poate fi rulat din IntelliJ apăsând pe butonul de Run din partea stângă a codului. Fiecare test are un buton propriu și poate fi rulat separat. Există teste pentru cele mai importante funcții, vă recomandăm să testați funcțiile de bază înainte de a începe implementarea task-urilor avansate.+În folderul src/test din proiect se află testeleTestele pot fi rulate ​din terminal folosind comanda:
  
-La rularea testelor veți primi și un punctaj, după specificațiile din enunț. 
- 
-Dacă folosiți terminalul: 
 <​code>​sbt test</​code>​ <​code>​sbt test</​code>​
 +
 +Puteti testa singuri functionalitatea temei folosind functia main din fisierul Main.scala dupa ce ati implementat toate functiile. Ar trebui ca primul cod de bare sa fie recunoscut si al doilea nu.
 +
 +Din terminal puteti rula proiectul folosind comanda:
 +
 +<​code>​sbt run</​code>​
  
 ===== Submisie arhiva ===== ===== Submisie arhiva =====
Line 704: 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!