
\begin{enumerate}
\item La fonction complétée est la suivante:

\begin{python}
def ecc(L):
    # L est une liste de la forme [ (x1,n1) , (x2,n2) , ... ] où les ni sont les effectifs
    E = []
    for i in range( len( L ) ):
        if i == 0:
            E.append( L[i] )
        else:
            E.append( ( L[i][0] , E[i-1][1] + L[i][1] ) )

    return E
\end{python}

Explications:
\begin{itemize}
\item Ligne 4 : la boucle signifie ici que l'on parcourt la liste \texttt{L} à l'aide des indices (\texttt{i}) de ses éléments.
\item Ligne 5 : si l'indice est égal à 0, c'est-à-dire si l'on est sur le premier élément de la liste, ...
\item Ligne 6 : on insère dans la liste \texttt{E} le premier effectif (\texttt{L[0]} représente le premier couple de nombres de la liste \texttt{L}, donc \texttt{L[0][1]} représente le deuxième nombre dans ce couple de nombres).
\item Ligne 7: si nous ne sommes pas sur le premier élément de \mbox{\texttt{L}...}
\item Ligne 8: on prend le deuxième nombre de l'élément précédent dans \texttt{E} (qui est un couple) et on lui ajoute l'effectif de l'élément de \texttt{L} sur lequel nous sommes.
\end{itemize}

Regardons sur l'exemple où \texttt{L = [ (1,2) , (3,4) , (5,6) ]}:
\begin{center}
\begin{tabular}{|>{\ttfamily}Sl|*4{Sc|}}
\hline
i & - & 0 & 1 & 2\\
\hline
L[i] & - & (1,2) & (3,4) & (5,6) \\
\hline
L[i][1] & - & 2 & 4 & 6\\
\hline
E[i][1] & 0 & $0+2=2$ & $2+4=6$ & $6+6=12$ \\
\hline
\end{tabular}
\end{center}
Au final, \texttt{E = [ (1,2), (3,6) , (5,12)]}.

\item La fonction complétée est celle présentée page suivante.

On retrouve à la ligne 5 le test pour savoir si l'effectif total est pair (\texttt{N \% 2 == 0}, auquel cas on le divise par 2 (ligne 6), ou impair (ligne 7), auquel cas on ajoute \og 1 \fg{} à l'effectif total et on divise par 2.

Ensuite, on parcourt la liste \texttt{E} (qui contient les effectifs cumulés croissants, abrégés en e.c.c.): si l'e.c.c. dépasse la moitié de l'effectif total, c'est que l'on a atteint la médiane et on la renvoie. Si, au contraire, l'e.c.c. est exactement égal à la moitié alors on retourne la moyenne entre la valeur courante (\texttt{E[i][0]}) et la suivante (\texttt{E[i+1][0]}).

\newpage

\begin{python}
def mediane(L):
    E = ecc(L)
    N = E[-1][1] # effectif total

    if N % 2 == 0:
        moitie = N / 2 # moitié de l'effectif total
    else:
        moitie = (N +1) / 2

    for i in range( len(E) ):
        if E[i][1] > moitie:
            return E[i][0]
        if E[i][1] == moitie:
            return ( E[i][0] + E[i+1][0] ) / 2
\end{python}
\end{enumerate}
