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 formatoP000,P001, …,P150e 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-stringf"P{numero:03d}", che aggiunge gli zeri davanti. Il ciclowhile codice_prodotto in codici_prodottine 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 usatry/except ValueErrorattorno afloat(...). - 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 posizionei. - 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 anche0: 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".