mockup.tex 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. %\documentclass[10pt, a4paper, twocolumn, notitlepage]{article}
  2. \documentclass[12pt, a4paper, notitlepage]{article}
  3. \usepackage[utf8]{inputenc}
  4. \usepackage{lipsum}
  5. \usepackage{biblatex}
  6. \usepackage{url}
  7. \usepackage{breakurl}
  8. \usepackage[breaklinks]{hyperref}
  9. %\addbibresource{bibliography.bib}
  10. \usepackage{comment}
  11. % Python stuff
  12. % Default fixed font does not support bold face
  13. \DeclareFixedFont{\ttb}{T1}{txtt}{bx}{n}{8} % for bold
  14. \DeclareFixedFont{\ttm}{T1}{txtt}{m}{n}{8} % for normal
  15. % Custom colors
  16. \usepackage{color}
  17. \definecolor{deepblue}{rgb}{0,0,0.5}
  18. \definecolor{deepred}{rgb}{0.6,0,0}
  19. \definecolor{deepgreen}{rgb}{0,0.5,0}
  20. \usepackage{listings}
  21. % Python style for highlighting
  22. \newcommand\pythonstyle{\lstset{
  23. language=Python,
  24. basicstyle=\ttm,
  25. otherkeywords={self}, % Add keywords here
  26. keywordstyle=\ttb\color{deepblue},
  27. emph={MyClass,__init__}, % Custom highlighting
  28. emphstyle=\ttb\color{deepred}, % Custom highlighting style
  29. stringstyle=\color{deepgreen},
  30. frame=tb, % Any extra options here
  31. showstringspaces=false, %
  32. commentstyle=\ttb
  33. }}
  34. % Python environment
  35. \lstnewenvironment{python}[1][]
  36. {
  37. \pythonstyle
  38. \lstset{#1}
  39. }
  40. {}
  41. % Python for external files
  42. \newcommand\pythonexternal[2][]{{
  43. \pythonstyle
  44. \lstinputlisting[#1]{#2}}}
  45. %\lstset{inputencoding=utf8/latin1}
  46. % Python for inline
  47. \newcommand\pythoninline[1]{{\pythonstyle\lstinline!#1!}}
  48. % Todo red marker
  49. \usepackage{xcolor}
  50. \newcommand{\todo}[1]{}
  51. \renewcommand{\todo}[1]{{\color{red} TODO: {#1}}}
  52. \begin{document}
  53. \title{\textbf{Esercizi}}
  54. %\date{October 24th, 2019}
  55. \date{}
  56. \maketitle
  57. \section{Aritmetica Binaria}
  58. Si calcoli la codifica binaria di $(13)_{10}$ in complemento a 2 su 5 bit e la si sommi a $(10000)_{complemento-a-2}$. Si verifichi il risultato effettuando l'operazione in decimale, previa ricodifica di $(10000)_{complemento-a-2}$.
  59. \bigskip
  60. \noindent
  61. \paragraph{Soluzione:}\
  62. Il numero $(13)_{10}$ in codifica complemento a 2 su 5 bit risulta essere $(01101)_{complemento-a-2}$. La somma risulta essere il numero $(11101)_{complemento-a-2}$, che effettivamente, riconvertito in decimale, risulta essere $(-3)_{10}$, che corrisponde alla somma 13 + (-16) in decimale (previa conversione di $(10000)_{complemento-a-2}$ in $(-16)_{10}$).
  63. \clearpage
  64. \section{Dimensionamento}
  65. Si consideri una telecamera che registra 90 immagini al secondo. Ogni immagine è rappresentata in scala di grigi su 256 possibili livelli di grigio, quindi ogni pixel potrà assumere un valore compreso tra 0 e 255. Ogni immagine inoltre, ha una dimensione di $800 \times 600$ pixel. Quanto spazio è necessario per memorizzare 1 minuto di registrazione assumendo che nessuna compressione video venga applicata all'immagine?
  66. \bigskip
  67. \noindent
  68. \paragraph{Soluzione:}\
  69. Cominciamo calcolando quanta memoria necessita una singola immagine. Ad una risoluzione di $800\times600$ ogni immagine racchiude un totale di $480000$ pixel, ed ogni pixel necessita di $1$ byte per essere immagazzinato. Infatti, ogni pixel può assumere un valore da $0$ a $255$ ($256$ possibili livelli), e sono necessari $8$ bit (equivalente ad $1$ byte) per memorizzarlo. Questo significa che ogni immagine occuperà uno spazio di circa $468.7 \; KiB$. Ogni secondo vengono catturati $90$ frame, per un totale di $468.7KiB * 90 \approx 42183 \; KiB$, ovvero circa $41.2MiB$. In un minuto, sono presenti $60$ secondi, quindi per contenere un minuto di registrazione saranno necessari $60 * 41.2 \; MiB \approx 2472 \; MiB$, ovvero circa $2.4 \; GiB$ di spazio.
  70. \clearpage
  71. \section{Sintesi di Codice}
  72. Si consideri in sistema di gestione di un magazzino. In questo magazzino, sono presenti una serie di prodotti. Ogni prodotto è caratterizzato da un nome, un prezzo (arrotondato all'euro), e una voce che dice se il prodotto è disponibile o meno nel magazzino. Descrivere che variabile possiamo utilizzare per rappresentare il singolo prodotto, e che tipo di variabile possiamo utilizzare per rappresentare il magazzino (che non è altro che una collezione di prodotti).
  73. Definire inoltre i prototipi delle seguenti funzioni:
  74. \begin{itemize}
  75. \item \textbf{prodotto\_caro}: Questa funzione, riceve in ingresso un magazzino, e restituisce il nome e il prezzo del prodotto più caro nel magazzino, non importa se disponibile o meno.
  76. \item \textbf{valore\_magazzino}: Questa funzione, riceve in ingresso un magazzino, e, per i soli prodotti presenti a magazzino, ne restituisce la somma dei loro prezzi.
  77. \item \textbf{salva\_magazzino}: Questa funzione, riceve in ingresso un magazzino, e salva in formato csv il magazzino su un file, denominato "magazzino.csv" nella directory di esecuzione del programma. L'organizzazione del file sarà molto semplice, si salverà su ogni riga ogni prodotto presente nel magazzino, con i vari campi separati da virgole (ad esempio, il prodotto con nome "carta", prezzo "1" e disponibilità presente, corrisponderà nel file ad un riga "carta,1,True", e così via). Aggiungere in testa al file csv una intestazione (header) per le colonne.
  78. \item \textbf{magazzini\_uguali}: Questa funzione, riceve in ingresso due oggetti di tipo magazzino, e controlla che i due magazzini siano identici. Per identici si intende che i prodotti presenti nei due magazzini devono comparire nello stesso ordine e avere lo stesso nome e lo stesso prezzo (la disponibilità invece non sarà controllata in questa funzione). In caso affermativo la funzione restituisce "True", altrimenti restituisce "False".
  79. \end{itemize}
  80. \bigskip
  81. \noindent
  82. \paragraph{Soluzione:}\
  83. Per rappresentare un prodotto è facile pensare all'utilizzo di un dizionario, che presenterà 3 coppie chiave-valore, il nome a cui corrisponderà un valore di tipo stringa, il prezzo a cui possiamo fare corrispondere un intero, e la disponibilità a cui possiamo fare corrispondere un booleano.
  84. Per rappresentare il magazzino invece, possiamo usare una semplice lista contenente oggetti di tipo prodotto (quindi una lista di dizionari).
  85. \clearpage
  86. \subsection{Implementazione}
  87. Implementare ora la funzione \textbf{prodotto\_caro}.
  88. \bigskip
  89. \noindent
  90. \paragraph{Soluzione:}\
  91. \begin{python}
  92. def prodotto_caro(magazzino):
  93. # Queste variabili conterranno il prodotto con
  94. # il prezzo piu' alto. prodotto_caro e' inizializzato
  95. # ad un valore nullo.
  96. prodotto_caro = None
  97. prezzo_massimo = 0
  98. # Cicliamo su tutti i prodotti nel magazzino
  99. for prodotto in magazzino:
  100. # Se il prezzo del prodotto attuale e' piu' alto
  101. # di quello trovato precedentemente lo sostituiamo
  102. if prodotto["prezzo"] > prezzo_massimo:
  103. prezzo_massimo = prodotto["prezzo"]
  104. prodotto_caro = prodotto
  105. # Controlliamo di aver trovato almeno un prodotto
  106. if prodotto_caro != None:
  107. return [prodotto_caro["nome"], prodotto_caro["prezzo"]]
  108. else:
  109. return ["non trovato", 0]
  110. \end{python}
  111. \clearpage
  112. \subsection{Implementazione}
  113. Implementare ora la funzione \textbf{valore\_magazzino}.
  114. \bigskip
  115. \noindent
  116. \paragraph{Soluzione:}\
  117. \begin{python}
  118. def valore_magazzino(magazzino):
  119. # Variabile che conterra' la somma parziale dei
  120. # prezzi del prodotto
  121. accumulatore = 0
  122. # Cicliamo su tutti i prodotti nel magazzino
  123. for prodotto in magazzino:
  124. # Se il prodotto ha disponibilita', accumuliamo il suo
  125. # prezzo nella variabile accumulatore
  126. if prodotto["disponibile"] == True:
  127. accumulatore = accumulatore + prodotto["prezzo"]
  128. return accumulatore
  129. \end{python}
  130. \clearpage
  131. \subsection{Implementazione}
  132. Implementare ora la funzione \textbf{salva\_magazzino}.
  133. \bigskip
  134. \noindent
  135. \paragraph{Soluzione:}\
  136. \begin{python}
  137. from csv import writer
  138. def salva_magazzino(magazzino, nome_file):
  139. print("Sto salvando il magazzino sul file " + nome_file)
  140. # Apriamo il file in scrittura e creiamo un oggetto csv
  141. output_file = open(nome_file, "w")
  142. csv_writer = writer(output_file)
  143. # Scriviamo nel file l'intestazione del csv
  144. csv_writer.writerow(["nome", "prezzo", "disponibile"])
  145. # Per tutti i prodotti in magazzino, serializziamoli
  146. # nel csv
  147. for prodotto in magazzino:
  148. lista_riga = [prodotto["nome"], prodotto["prezzo"], prodotto["disponibile"]]
  149. csv_writer.writerow(lista_riga)
  150. # Rircordiamoci di chiudere il file
  151. output_file.close()
  152. \end{python}
  153. \clearpage
  154. \subsection{Implementazione}
  155. Implementare ora la funzione \textbf{magazzini\_uguali}.
  156. \bigskip
  157. \noindent
  158. \paragraph{Soluzione:}\
  159. \begin{python}
  160. def magazzini_uguali(magazzino1, magazzino2):
  161. # Calcoliamo la dimensione dei due magazzini
  162. dim_mag1 = len(magazzino1)
  163. dim_mag2 = len(magazzino2)
  164. # Se le dimensioni dei magazzini differiscono i magazzini
  165. # non saranno uguali
  166. if dim_mag1 != dim_mag2:
  167. return False
  168. else:
  169. # Utilizziamo un indice di posizione per scorrere
  170. # sui magazzini in sincronia
  171. for i in range(0, dim_mag1):
  172. nome1 = magazzino1[i]["nome"]
  173. nome2 = magazzino2[i]["nome"]
  174. prezzo1 = magazzino1[i]["prezzo"]
  175. prezzo2 = magazzino2[i]["prezzo"]
  176. # Al primo prodotto per il quale non
  177. # corrispondono il nome o il prezzo restituiamo falso
  178. if nome1 != nome2 or prezzo1 != prezzo2:
  179. return False
  180. # Se siamo arrivati fin qui, significa che i magazzini erano
  181. # uguali
  182. return True
  183. \end{python}
  184. \clearpage
  185. \end{document}