Școala Româno-Britanică
Modulul 2 Clasa a IX-a | Python

Ora 9: Aplicații integrate cu liste - gestiunea stocurilor și comenzilor

Ce vei învăța astăzi: Aplicarea operatorilor și metodelor clasei list în gestionarea stocurilor și a comenzilor

Rezultat practic: Gestionezi stocuri și comenzi din două depozite folosind concatenare (unirea a două liste într-una singură), multiplicare (repetarea unei liste de un anumit număr de ori), count și index (Competența 3.4).

Competența 3.4 Săptămâna 12

Înainte de a începe

De ce contează? Gestiunea stocurilor (urmărirea cantităților de produse disponibile) și a comenzilor (produsele cerute de clienți) este scenariul proiectului modulului: combinăm operatorii și metodele pe date reale. Aici înveți exact instrumentele pe care le vei folosi în aplicația ta de gestiune.

Ce știi deja?

În lecția anterioară, „Probleme aplicative cu liste - analiza datelor", ai analizat o listă de valori reale cu medie, minim, maxim și numărare. Ce funcție sau metodă ai folosi pentru a afla de câte ori apare un anumit produs într-o listă de comenzi?

Ideea-cheie: În aplicațiile reale combinăm operatorii (+, *, in) pentru operații de ansamblu asupra listelor cu metodele (append, count, index, sort) pentru operații punctuale pe elemente.
SINTEZĂ TEORETICĂ ȘI EXEMPLE GHIDATE

Ce vei învăța astăzi?

În această lecție combinăm operatorii (concatenare, multiplicare) și metodele (count, index, append) clasei list într-un context real: gestiunea stocurilor și a comenzilor dintr-un lanț de magazine.

Concatenarea stocurilor din două depozite cu +
Multiplicarea cu * pentru stocuri și rafturi
Numărarea comenzilor unui produs cu count
Găsirea primei comenzi cu index

De ce combinăm operatori și metode?

Definiție: În aplicațiile reale, datele nu apar niciodată ca exercițiile izolate: un depozit ține lista produselor, un alt depozit lista comenzilor, iar programul trebuie să combine, să numere, să caute și să modifice aceste liste. Operatorii (+, *, in) rezolvă rapid operații de ansamblu, iar metodele (append, count, index, sort) rezolvă operații punctuale asupra elementelor.

Gândește-te la o firmă de curierat: are o listă de colete în depozitul central și o listă în depozitul local. Pentru a vedea stocul complet, programul le unește; pentru a vedea câte colete conțin produsul „tabletă", le numără; pentru a găsi primul colet de „tabletă", îi caută poziția.

Analogie: registrul de evidență al magazinului

  • Concatenarea (+) este ca lipirea a două pagini din registrul de stocuri: obții o singură listă completă
  • Multiplicarea (*) este ca duplicarea unei pagini pentru fiecare raft al magazinului
  • count() este ca numărarea de câte ori apare un produs în registrul de comenzi
  • index() este ca găsirea liniei unde apare prima dată un produs

Stocul complet: concatenarea listelor din două depozite

Un lanț de magazine are două depozite: fiecare ține numărul de bucăți pe care le are pentru fiecare produs. Stocul total pentru fiecare produs se obține adunând element cu element pozițiile celor două liste, iar lista completă a tuturor produselor (prima dată depozitul 1, apoi depozitul 2) se obține cu concatenarea depozit1 + depozit2.

Concatenarea păstrează ordinea: toate elementele primei liste, urmate de toate elementele celei de-a doua. Este exact comportamentul necesar unui raport de gestiune: „ce avem în total, în ordinea depozitelor".

Exemplu: stocul complet al firmei

depozit1 = [12, 8, 15, 6, 20] // bucati pe produs: [caiet, pix, ghiozdan, stilou, mapa] depozit2 = [5, 14, 9, 18, 7] stocTotal = depozit1 + depozit2 // concatenare AFISEAZA stocTotal AFISEAZA NUMAR(stocTotal) // cate valori sunt in lista unita // suma pe produs a celor doua depozite: PENTRU i de la 0 la NUMAR(depozit1) - 1: AFISEAZA depozit1[i] + depozit2[i]
Stocul total din două depozite
depozit1 = [12, 8, 15, 6, 20]
depozit2 = [5, 14, 9, 18, 7]

stoc_total = depozit1 + depozit2
print("Stoc total:", stoc_total)
print("Valori in stoc:", len(stoc_total))

print("Stoc pe produs (dep1 + dep2):")
for i in range(len(depozit1)):
    print(i + 1, ":", depozit1[i] + depozit2[i])

Observă: depozit1 + depozit2 creează o listă nouă cu toate valorile, în ordine. Pentru stocul pe produs, parcurgem pozițiile cu range(len(depozit1)) și adunăm valorile de pe aceeași poziție. Cele două abordări răspund la întrebări diferite!

Comenzile clienților: count și index în practică

Magazinul primește într-o zi o listă de comenzi, fiecare comanda fiind numele unui produs. Două întrebări apar constant în gestiune: de câte ori a fost comandat un produs (răspunsul: comenzi.count(produs)) și care este numărul primei comenzi care conține produsul (răspunsul: comenzi.index(produs) + 1, deoarece pozițiile încep de la 0).

count() numără toate aparițiile valorii, iar index() returnează poziția primei apariții. Ambele sunt metode ale clasei list, deci se aplică direct pe listă, fără parcurgere manuală.

Exemplu: analiza comenzilor zilnice

comenzi = [caiet, pix, caiet, ghiozdan, pix, caiet] AFISEAZA comenzi.count("caiet") // 3 comenzi de caiete AFISEAZA comenzi.count("pix") // 2 comenzi de pixuri AFISEAZA comenzi.index("pix") + 1 // pozitia primei comenzi de pix (din 1) DACA "ghiozdan" in comenzi ATUNCI AFISEAZA "ghiozdanul a fost comandat"
Comenzi: count și index
comenzi = ["caiet", "pix", "caiet", "ghiozdan", "pix", "caiet"]

print("Comenzi de caiete:", comenzi.count("caiet"))
print("Comenzi de pixuri:", comenzi.count("pix"))
print("Prima comanda de pix:", comenzi.index("pix") + 1)

if "ghiozdan" in comenzi:
    print("Ghiozdanul a fost comandat astazi")

Observă: count() răspunde la „cât de des?", iar index() la „unde apare prima dată?". Adăugăm 1 la poziția returnată pentru a număra comenzile de la 1, nu de la 0. Verificăm cu in înainte de index(), pentru a evita o eroare dacă produsul nu există.

Exercițiu de completare 1

Completează enunțul despre gestiunea stocurilor cu cuvintele potrivite:

Stocul total al firmei se obține cu operatorul ______, care concatenează listele celor două depozite. Numărul de comenzi ale unui produs se află cu metoda ______. Poziția primei comenzi a unui produs se află cu metoda ______. Pentru a verifica dacă un produs a fost comandat, folosim operatorul ______.

Bancă de cuvinte:
+ count index in

Exercițiu de completare 2

Completează fragmentul de program care analizează comenzile:
comenzi = ["caiet", "pix", "caiet", "ghiozdan"]
print(comenzi.______("caiet"))
print(comenzi.______("pix") ______ 1)
if "stilou" ______ comenzi:
    print("Stiloul a fost comandat")
Bancă de cuvinte:
count index + in

Test de înțelegere

Test rapid - gestiunea stocurilor:

1. depozit1 = [10, 20] și depozit2 = [30, 40]. Ce produce depozit1 + depozit2?

2. Ce returnează comenzi.count("pix") pentru comenzi = ["pix", "caiet", "pix"]?

3. Care este numărul primei comenzi de "caiet" din lista ["pix", "caiet", "pix"]?

Ai grijă la: nu confunda concatenarea cu adunarea pe poziții: d1 + d2 lipește listele una după alta, iar d1[i] + d2[i] adună valorile de pe aceeași poziție. Citește cu atenție ce întrebare pune enunțul înainte de a alege operația.

Aprofundare

Concatenare versus adunare pe poziții. Operatorul + lipeste listele una după alta, iar depozit1[i] + depozit2[i] adună valorile de pe aceeași poziție. Ambele sunt corecte, dar răspund la întrebări diferite: „ce conține stocul complet?" versus „câte bucăți are fiecare produs în total?". În probleme reale, citește enunțul cu atenție ca să alegi operația potrivită.

Multiplicarea listelor în gestiune. stoc * k repetă întreaga listă de k ori. O aplicare reală: dacă magazinul are 3 rafturi identice și fiecare raft are aceeași listă de prețuri, preturi * 3 generează lista completă a tuturor etichetelor. De asemenea, [0] * n creează rapid lista de frecvențe pentru numărarea comenzilor pe produse.

Cazuri particulare la count și index. index(x) produce ValueError dacă x nu există în listă, de aceea verificăm întâi cu if x in lista:. count(x) nu produce erori și returnează 0 pentru valori inexistente, deci este sigur de folosit oricând. La listele cu valori repetate, index() returnează mereu prima apariție, exact ca o căutare secvențială care se oprește la primul rezultat.

Date organizate pe produse. Dacă fiecare produs are mai multe informații (nume, preț, cantitate), folosim o listă de liste: produse = [["caiet", 3, 12], ["pix", 1, 8]]. Atunci produse[0] este toată fișa produsului, produse[0][2] este cantitatea, iar sortarea după preț se face cu produse.sort(key=lambda p: p[1]). Aici se vede puterea combinării indexării cu metodele.

Validarea datelor în aplicații reale. În gestiunea reală, comenzile pot conține produse inexistente sau cantități negative. Un program robust verifică cu in dacă produsul există în lista de produse înainte de a-l număra cu count(), evitând rapoarte eronate.

APLICARE ȘI REZOLVARE DE PROBLEME

PbInfo - Stocul total al depozitelor

Enunț:

Cerință: Se citesc două liste de numere, reprezentând stocurile (în bucăți) ale unui magazin în depozitul 1 și depozitul 2. Să se afișeze lista obținută prin concatenarea celor două liste, cu operatorul +, și numărul total de valori din lista obținută.

Date de intrare:

Programul citește de la tastatură, pe două linii separate, stocurile celor două depozite, numere întregi pozitive, separate prin spații.

Date de ieșire:

Programul va afișa pe prima linie lista stocului total (elementele primei liste urmate de elementele celei de-a doua), iar pe a doua linie numărul total de valori.

Restricții și precizări:

Fiecare listă are cel mult 1000 de elemente, numere întregi pozitive.

Exemplu:

Intrare:

12 8 15
5 14 9 18

Ieșire:

12 8 15 5 14 9 18
7
Cum gândim soluția:
  1. Citim stocul depozitului 1 în lista a, iar stocul depozitului 2 în lista b
  2. Concatenăm cu a + b și stocăm în stoc_total
  3. Afișăm lista cu print(*stoc_total)
  4. Afișăm numărul total cu len(stoc_total)
Scrie soluția în Python:
Soluție corectă:
a = list(map(int, input().split()))
b = list(map(int, input().split()))

stoc_total = a + b

print(*stoc_total)
print(len(stoc_total))

Ce învățăm: operatorul + unește listele celor două depozite într-o singură listă, iar len() ne spune câte valori conține stocul total.

PbInfo - Comenzile unui produs

Enunț:

Cerință: Se citește o listă de comenzi (nume de produse), apoi un produs p. Să se afișeze de câte ori apare produsul p în lista de comenzi și numărul primei comenzi care conține produsul p (numărătoarea începe de la 1). Dacă produsul nu apare nicio dată, să se afișeze mesajul "NU EXISTA".

Date de intrare:

Programul citește de la tastatură, pe prima linie, comenzile separate prin spații, iar pe a doua linie produsul căutat p.

Date de ieșire:

Programul va afișa pe prima linie numărul de apariții ale produsului p, iar pe a doua linie numărul primei comenzi care conține p, sau mesajul "NU EXISTA" dacă p nu apare.

Restricții și precizări:

Lista de comenzi are cel mult 1000 de elemente; numele produselor sunt formate doar din litere mici.

Exemplu:

Intrare:

caiet pix caiet ghiozdan pix caiet
pix

Ieșire:

2
2
Cum gândim soluția:
  1. Citim comenzile în lista comenzi și produsul căutat p
  2. Verificăm cu p in comenzi dacă produsul există
  3. Dacă da, afișăm comenzi.count(p) și comenzi.index(p) + 1
  4. Dacă nu, afișăm mesajul "NU EXISTA"
Scrie soluția în Python:
Soluție corectă:
comenzi = input().split()
p = input()

if p in comenzi:
    print(comenzi.count(p))
    print(comenzi.index(p) + 1)
else:
    print("NU EXISTA")

Ce învățăm: verificăm cu in înainte de a folosi index(), pentru a evita o eroare. count() numără aparițiile, iar index() + 1 dă numărul primei comenzi, numerotat de la 1.

EXERCIȚII PRACTICE

Exercițiul Practic: Gestiunea stocurilor și a comenzilor

Sarcini de lucru

Completează următoarele sarcini pentru a aplica operatorii și metodele clasei list într-un context real de gestiune

Sarcina 1: Stocul pe produs din două depozite

Cerință: Scrie un program care citește stocul depozitului 1 și stocul depozitului 2 (câte o listă de numere), apoi afișează pentru fiecare produs stocul total: suma valorilor de pe aceeași poziție din cele două liste.

Soluție pentru Sarcina 1:
d1 = list(map(int, input().split()))
d2 = list(map(int, input().split()))

for i in range(len(d1)):
    print("Produsul", i + 1, ":", d1[i] + d2[i])

Verifică: pentru d1 = [12, 8, 15] și d2 = [5, 14, 9], afișăm 17, 22, 24. Parcurgem pozițiile cu range(len(d1)) și adunăm valorile corespunzătoare.

Sarcina 2: Cel mai comandat produs

Cerință: Scrie un program care citește o listă de comenzi (nume de produse) și afișează produsul care apare de cele mai multe ori, împreună cu numărul de comenzi. Pentru a parcurge produsele distincte, poți folosi metoda count() pentru fiecare element al listei.

Soluție pentru Sarcina 2:
comenzi = input().split()

maxim = 0
produs_max = comenzi[0]

for p in comenzi:
    nr = comenzi.count(p)
    if nr > maxim:
        maxim = nr
        produs_max = p

print(produs_max, maxim)

Verifică: pentru "caiet pix caiet ghiozdan pix caiet", afișăm caiet 3. Folosim count() pentru fiecare element și reținem produsul cu numărul maxim de comenzi.

Scrie pe caiet - De reținut

Titlul lecției

Ora 9: Aplicații integrate cu liste - gestiunea stocurilor și comenzilor

Definiția lecției

Gestiunea stocurilor și a comenzilor combină operatorii și metodele clasei list pe date reale. Concatenarea cu operatorul + unește listele a două depozite într-o listă nouă, păstrând ordinea, iar multiplicarea cu operatorul * repetă o listă de un anumit număr de ori. Metodele count(x) și index(x) numără aparițiile unui produs în comenzi, respectiv găsesc poziția primei comenzi care îl conține, iar operatorul in verifică dacă un produs a fost comandat înainte de a-l căuta. Este important să deosebim concatenarea (+ lipește listele) de adunarea pe poziții (d1[i] + d2[i] însumează stocurile aceluiași produs). Un exemplu real: un lanț de magazine combină stocurile depozitelor sale și numără comenzile primite, pentru a decide care produse trebuie reaprovizionate.

Definiții esențiale

Algoritmul cheie - pseudocod

d1 = [12, 8, 15, 6, 20] d2 = [5, 14, 9, 18, 7] stocTotal = d1 + d2 // concatenare AFISEAZA stocTotal AFISEAZA NUMAR(stocTotal) // len comenzi = [caiet, pix, caiet, ghiozdan, pix] DACA "pix" in comenzi ATUNCI AFISEAZA comenzi.count("pix") // de cate ori AFISEAZA comenzi.index("pix") + 1 // prima comanda

Algoritmul cheie - cod Python

d1 = [12, 8, 15, 6, 20]
d2 = [5, 14, 9, 18, 7]

stoc_total = d1 + d2
print(stoc_total)
print(len(stoc_total))

comenzi = ["caiet", "pix", "caiet", "ghiozdan", "pix"]
if "pix" in comenzi:
    print(comenzi.count("pix"))
    print(comenzi.index("pix") + 1)

Greșeli comune de evitat

Sfaturi practice și trucuri

Exemplu practic

De unde întâlnim gestiunea în viața reală? Două depozite ale unui lanț de magazine trimit zilnic listele lor cu bucăți de produse. Programul le unește și verifică cât de des a fost comandat un produs:

d1 = [12, 8, 15]
d2 = [5, 14, 9]
stoc_total = d1 + d2
print(stoc_total)
comenzi = ["caiet", "pix", "caiet"]
print(comenzi.count("caiet"))
print("Prima comanda cu pix:", comenzi.index("pix") + 1)

Programul afișează stocul total al firmelor și faptul că „caiet" a fost comandat de 2 ori, prima comandă cu „pix" fiind a doua.