Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
pp:2026:scala:t01 [2026/03/18 18:08] ldaniel unary_! |
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 11: | Line 9: | ||
| <note important>În soluție nu aveți voie să programați cu efecte laterale. Folosiți declarații doar ''val'', nu <del>var</del>.</note> | <note important>În soluție nu aveți voie să programați cu efecte laterale. Folosiți declarații doar ''val'', nu <del>var</del>.</note> | ||
| - | [Obiectivul acestei teme este implementarea unui program care simuleaza functionarea unei case de marcat, proces care consta in scanarea unor produse si adaugarea acestora pe o lista pentru calculul sumei de platit. Pentru a implementa acest proiect, avem nevoie de doua module importante: modulul de decodificare a codului de bare de pe produs si modulul de baza de date, care stocheaza informatiile despre denumirea, pretul si cantitatea produselor disponibile.] | + | Obiectivul acestei teme este implementarea unui program care simuleaza functionarea unei case de marcat, proces care consta in scanarea unor produse si adaugarea acestora in cosul de cumparaturi. Pentru a implementa acest proiect, avem nevoie de trei module importante: |
| + | * 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 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 ===== | ||
| Un cod de bare este o reprezentare vizuală a datelor, ușor de citit de dispozitive. De obicei datele descriu proprietăți ale obiectului pe care se află codul de bare. | Un cod de bare este o reprezentare vizuală a datelor, ușor de citit de dispozitive. De obicei datele descriu proprietăți ale obiectului pe care se află codul de bare. | ||
| Line 43: | 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 55: | 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 64: | 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 76: | Line 84: | ||
| | **9** | **LGGLGL**| | | **9** | **LGGLGL**| | ||
| + | </hidden> | ||
| === Calculare cifră de control === | === Calculare cifră de control === | ||
| Line 121: | 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 172: | 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 576: | 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 666: | 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ă testele. Testele 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 ===== | ||