%\documentclass[10pt, a4paper, twocolumn, notitlepage]{article}
\documentclass[12pt, a4paper, notitlepage]{article}
\usepackage[utf8]{inputenc}
\usepackage{lipsum}
\usepackage{biblatex}
\usepackage{url}
\usepackage{breakurl}
\usepackage[breaklinks]{hyperref}
%\addbibresource{bibliography.bib}
\usepackage{comment}

% Python stuff
% Default fixed font does not support bold face
\DeclareFixedFont{\ttb}{T1}{txtt}{bx}{n}{8} % for bold
\DeclareFixedFont{\ttm}{T1}{txtt}{m}{n}{8}  % for normal

% Custom colors
\usepackage{color}
\definecolor{deepblue}{rgb}{0,0,0.5}
\definecolor{deepred}{rgb}{0.6,0,0}
\definecolor{deepgreen}{rgb}{0,0.5,0}

\usepackage{listings}

% Python style for highlighting
\newcommand\pythonstyle{\lstset{
    language=Python,
    basicstyle=\ttm,
    otherkeywords={self},             % Add keywords here
    keywordstyle=\ttb\color{deepblue},
    emph={MyClass,__init__},          % Custom highlighting
    emphstyle=\ttb\color{deepred},    % Custom highlighting style
    stringstyle=\color{deepgreen},
    frame=tb,                         % Any extra options here
    showstringspaces=false,           %
    commentstyle=\ttb
}}

% Python environment
\lstnewenvironment{python}[1][]
{
  \pythonstyle
  \lstset{#1}
}
{}

% Python for external files
\newcommand\pythonexternal[2][]{{
    \pythonstyle
\lstinputlisting[#1]{#2}}}
%\lstset{inputencoding=utf8/latin1}

% Python for inline
\newcommand\pythoninline[1]{{\pythonstyle\lstinline!#1!}}

% Todo red marker
\usepackage{xcolor}
\newcommand{\todo}[1]{}
\renewcommand{\todo}[1]{{\color{red} TODO: {#1}}}

\begin{document}

\title{\textbf{Esercizi}}
%\date{October 24th, 2019}
\date{}
\maketitle

\section{Aritmetica Binaria}
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}$.

\bigskip
\noindent
\paragraph{Soluzione:}\
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}$).

\clearpage

\section{Dimensionamento}
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?

\bigskip
\noindent
\paragraph{Soluzione:}\
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.

\clearpage

\section{Sintesi di Codice}
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).

Definire inoltre i prototipi delle seguenti funzioni:
\begin{itemize}
  \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.
  \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.
  \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.
  \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".
\end{itemize}

\bigskip
\noindent
\paragraph{Soluzione:}\
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.
Per rappresentare il magazzino invece, possiamo usare una semplice lista contenente oggetti di tipo prodotto (quindi una lista di dizionari).

\clearpage

\subsection{Implementazione}
Implementare ora la funzione \textbf{prodotto\_caro}.

\bigskip
\noindent
\paragraph{Soluzione:}\
\begin{python}
  def prodotto_caro(magazzino):
      # Queste variabili conterranno il prodotto con
      # il prezzo piu' alto. prodotto_caro e' inizializzato
      # ad un valore nullo.
      prodotto_caro = None
      prezzo_massimo = 0

      # Cicliamo su tutti i prodotti nel magazzino
      for prodotto in magazzino:
          # Se il prezzo del prodotto attuale e' piu' alto
          # di quello trovato precedentemente lo sostituiamo
          if prodotto["prezzo"] > prezzo_massimo:
              prezzo_massimo = prodotto["prezzo"]
              prodotto_caro = prodotto

      # Controlliamo di aver trovato almeno un prodotto
      if prodotto_caro != None:
          return [prodotto_caro["nome"], prodotto_caro["prezzo"]]
      else:
          return ["non trovato", 0]
\end{python}

\clearpage

\subsection{Implementazione}
Implementare ora la funzione \textbf{valore\_magazzino}.

\bigskip
\noindent
\paragraph{Soluzione:}\
\begin{python}
  def valore_magazzino(magazzino):
    # Variabile che conterra' la somma parziale dei
    # prezzi del prodotto
    accumulatore = 0

    # Cicliamo su tutti i prodotti nel magazzino
    for prodotto in magazzino:

        # Se il prodotto ha disponibilita', accumuliamo il suo
        # prezzo nella variabile accumulatore
        if prodotto["disponibile"] == True:
            accumulatore = accumulatore + prodotto["prezzo"]

    return accumulatore
\end{python}
\clearpage

\subsection{Implementazione}
Implementare ora la funzione \textbf{salva\_magazzino}.

\bigskip
\noindent
\paragraph{Soluzione:}\
\begin{python}
from csv import writer
def salva_magazzino(magazzino, nome_file):
    print("Sto salvando il magazzino sul file " + nome_file)
    # Apriamo il file in scrittura e creiamo un oggetto csv
    output_file = open(nome_file, "w")
    csv_writer = writer(output_file)

    # Scriviamo nel file l'intestazione del csv
    csv_writer.writerow(["nome", "prezzo", "disponibile"])

    # Per tutti i prodotti in magazzino, serializziamoli
    # nel csv
    for prodotto in magazzino:
        lista_riga = [prodotto["nome"], prodotto["prezzo"], prodotto["disponibile"]]
        csv_writer.writerow(lista_riga)

    # Rircordiamoci di chiudere il file
    output_file.close()
\end{python}

\clearpage

\subsection{Implementazione}
Implementare ora la funzione \textbf{magazzini\_uguali}.

\bigskip
\noindent
\paragraph{Soluzione:}\
\begin{python}
  def magazzini_uguali(magazzino1, magazzino2):
    # Calcoliamo la dimensione dei due magazzini
    dim_mag1 = len(magazzino1)
    dim_mag2 = len(magazzino2)

    # Se le dimensioni dei magazzini differiscono i magazzini
    # non saranno uguali
    if dim_mag1 != dim_mag2:
        return False
    else:
        # Utilizziamo un indice di posizione per scorrere
        # sui magazzini in sincronia
        for i in range(0, dim_mag1):
            nome1 = magazzino1[i]["nome"]
            nome2 = magazzino2[i]["nome"]
            prezzo1 = magazzino1[i]["prezzo"]
            prezzo2 = magazzino2[i]["prezzo"]

            # Al primo prodotto per il quale non
            # corrispondono il nome o il prezzo restituiamo falso
            if nome1 != nome2 or prezzo1 != prezzo2:
                return False

        # Se siamo arrivati fin qui, significa che i magazzini erano
        # uguali
        return True
\end{python}
\clearpage

\end{document}
