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:15]
ana.ailiesei [Tema 1 PP – Casa de marcat]
pp:2026:scala:t01 [2026/03/25 19:19] (current)
ldaniel typo
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_v1.zip|}}
- +
-După ce ați descărcat scheletul, creaț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.+
  
 <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 12:
   * 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 47: Line 45:
  
 Pentru fiecare cifră din al doilea grup (pozițiile 8->13) există o singură codificare posibilă (codificare **R** paritate ''​pară''​ ). Pentru fiecare cifră din al doilea grup (pozițiile 8->13) există o singură codificare posibilă (codificare **R** paritate ''​pară''​ ).
 +<hidden Tabelul codificarilor L, G si R pentru cifre>
 ^ Cifra ^ Codificare-L ^ Codificare-G ^ Codificare-R^ ^ Cifra ^ Codificare-L ^ Codificare-G ^ Codificare-R^
 | **0** | **0001101** | **0100111** | **1110010**| | **0** | **0001101** | **0100111** | **1110010**|
Line 59: Line 57:
 | **8** | **0110111** | **0001001** | **1001000**| | **8** | **0110111** | **0001001** | **1001000**|
 | **9** | **0001011** | **0010111** | **1110100**| | **9** | **0001011** | **0010111** | **1110100**|
 +
 +</​hidden>​
 +
 Observații:​ Observații:​
   * Codul de bare începe cu o cifră codificată ''​impar''​ și se termină cu o cifră codificată ''​par'',​ astfel scannerele pentru codurile de bare pot determina orientarea și să citească și de la stânga la dreapta, dar și invers.   * Codul de bare începe cu o cifră codificată ''​impar''​ și se termină cu o cifră codificată ''​par'',​ astfel scannerele pentru codurile de bare pot determina orientarea și să citească și de la stânga la dreapta, dar și invers.
Line 68: Line 69:
 După cum am spus anterior, prima cifră se numește cifră de paritate. ​ După cum am spus anterior, prima cifră se numește cifră de paritate. ​
 Cifra de paritate ''​nu''​ este reprezentată direct printr-o succesiune de bare și spații, ci este codificată indirect, prin alegerea unei combinații de moduri de codificare L sau G pentru primul grup de 6 cifre, conform tabelului de mai jos. Practic, este suficient să știm ce codificare a fost folosită pentru fiecare dintre cele 6 cifre din primul grup pentru a determina cifra de paritate asociată. Dacă combinația găsită nu este asociată cu o cifră din tabelul de mai jos codul este invalid. Cifra de paritate ''​nu''​ este reprezentată direct printr-o succesiune de bare și spații, ci este codificată indirect, prin alegerea unei combinații de moduri de codificare L sau G pentru primul grup de 6 cifre, conform tabelului de mai jos. Practic, este suficient să știm ce codificare a fost folosită pentru fiecare dintre cele 6 cifre din primul grup pentru a determina cifra de paritate asociată. Dacă combinația găsită nu este asociată cu o cifră din tabelul de mai jos codul este invalid.
 +
 +<hidden Tabelul codificarilor in functie de cifra de paritate>​
 +
 ^ Cifra de paritate ^ Primul grup ^ ^ Cifra de paritate ^ Primul grup ^
 | **0** | **LLLLLL**| | **0** | **LLLLLL**|
Line 80: Line 84:
 | **9** | **LGGLGL**| | **9** | **LGGLGL**|
  
 +</​hidden>​
  
 === Calculare cifră de control === === Calculare cifră de control ===
Line 125: Line 130:
 </​code>​ </​code>​
  
-=== Algoritm === +<hidden Explicarea in detaliu a algoritmului> ​ 
-**1. Transformara ​imaginilor**+**1. Transformarea ​imaginilor**
  
 Primim o matrice de biți 0 și 1, reprezentând imaginea în formatul alb-negru descris anterior. Decupăm din matricea de pixeli rândurile din mijloc și rulăm algoritmul de identificare a barelor pe toate aceste rânduri, pentru a avea șanse mai mari de succes. Vrem să găsim barele din imagine, așa că grupăm biții identici și consecutivi în tupluri de tipul **(<​număr_repetări>,​ <​bit>​)**,​ unde tuplul descrie grosimea și culoarea barei din imagine. Va rezulta următorul comportament:​\\ Primim o matrice de biți 0 și 1, reprezentând imaginea în formatul alb-negru descris anterior. Decupăm din matricea de pixeli rândurile din mijloc și rulăm algoritmul de identificare a barelor pe toate aceste rânduri, pentru a avea șanse mai mari de succes. Vrem să găsim barele din imagine, așa că grupăm biții identici și consecutivi în tupluri de tipul **(<​număr_repetări>,​ <​bit>​)**,​ unde tuplul descrie grosimea și culoarea barei din imagine. Va rezulta următorul comportament:​\\
Line 176: Line 181:
  
 Dacă cifra de control este corectă, am identificat toate cifrele și întoarcem rezultatul. Altfel întoarcem None. Dacă cifra de control este corectă, am identificat toate cifrele și întoarcem rezultatul. Altfel întoarcem None.
 +
 +</​hidden>​
 +
 <hidden Recapitulare functii de ordin superior>​ <hidden Recapitulare functii de ordin superior>​
  
Line 580: Line 588:
  
  
-**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 670: Line 678:
 </​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 =====