Vai al contenuto

Esercitazione 05 · Vendite giornaliere di un negozio

Esercitazione 3 di 4 · in stile prova pratica d'esame

Traccia

Un negozio desidera un programma in Python per gestire le vendite giornaliere dei propri prodotti: inserire, visualizzare e analizzare le vendite di un elenco denominato prodotti. Ogni vendita ha i campi codice prodotto, nome prodotto, categoria, quantità venduta, prezzo unitario.

Prima parte

  • registrare_vendita: consente di inserire più vendite. Per ogni vendita chiede da tastiera nome del prodotto, categoria, quantità venduta e prezzo unitario (reale). Il codice prodotto è generato in modo pseudo-casuale nel formato P000, P001, …, P150 e non deve essere già presente nell'elenco. Va controllato che il nome sia una stringa, che la categoria sia una tra alimentari, igiene e cartoleria, che la quantità sia un intero positivo e che il prezzo sia un numero reale valido. In caso di errore il dato va richiesto di nuovo.
  • visualizza_prodotti: mostra tutte le vendite in forma di tabella (codice, nome, categoria, quantità, prezzo unitario).
  • grafico_barre: calcola l'incasso totale di ciascun prodotto e lo mostra con un grafico a barre.
  • main(): gestisce l'inserimento iterativo; a ogni giro l'utente sceglie se inserire una nuova vendita o terminare. Alla fine mostra la tabella e il grafico.

Seconda parte

  • calcola_incasso_vendita: calcola il totale incassato per una vendita.
  • ricerca_per_categoria: chiede una categoria tra alimentari, igiene e cartoleria e mostra le vendite corrispondenti, oppure un messaggio se non ce ne sono.
  • prodotto_incasso_maggiore: mostra nome, codice e incasso totale del prodotto con l'incasso maggiore.
  • ordina_per_incasso: ordina le vendite in ordine decrescente di incasso con il Selection Sort e le mostra in tabella.
  • incasso_complessivo: somma gli incassi di tutte le vendite.
  • Il main() va esteso per richiamare anche queste funzioni.

Laboratorio

Grafici nella console

Il laboratorio carica matplotlib la prima volta che il programma lo importa (qualche secondo in più). plt.show() disegna il grafico direttamente nella console, sotto l'output.

Dati di prova

Inserisci almeno tre vendite, ad esempio pane (alimentari, 10, 1.20), sapone (igiene, 4, 2.50) e quaderno (cartoleria, 6, 1.80), poi prova le voci 2, 3, 5 e 6 del menu.

La soluzione proposta

  • Codice senza duplicati. Il codice si genera con randint(0, 150) e la f-string f"P{numero:03d}", che aggiunge gli zeri davanti. Il ciclo while codice_prodotto in codici_prodotti ne genera un altro finché è già usato.
  • Due modi di validare. Per la quantità si usa isdigit() (solo cifre); per il prezzo non funziona perché "2.5" contiene il punto, quindi si usa try/except ValueError attorno a float(...).
  • Selection Sort con il massimo. Per ordinare in modo decrescente si cerca a ogni passo la posizione del massimo nella parte non ordinata (ricerca_massimo_sottolista) e lo si scambia con l'elemento in posizione i.
  • Menu. La soluzione usa direttamente il menu completo della seconda parte, che copre anche la scelta "inserire o terminare" della prima.

Correzioni rispetto alla prima versione, segnate nel codice con # CORREZIONE:

  • Quantità positiva. isdigit() accetta anche 0: ora lo zero viene rifiutato. Anche il prezzo deve essere maggiore di zero.
  • Incasso totale per prodotto. Se lo stesso prodotto è venduto più volte, nel grafico i suoi incassi vengono sommati in un'unica barra.
  • Ricerca per categoria. È la funzione a chiedere la categoria, come nella traccia.
  • Formato. Prezzi e incassi sono mostrati con due decimali; corretti i refusi "cateogoria".