Media e scarto quadratico medio

ESERCIZIO 1

Completare il sequente programma (ATTENZIONE: cercate di scrivere l'invariante di ciclo PRIMA di scrivere il ciclo).

{
SCRITTO DA:
IL:
DESCRIZIONE:
Questo programma
- legge un certo numero di elementi (di tipo integer) da terminale
- restituisce valore medio (mu) e scarto quadratico medio (sigma)
}

const 
  MAX=100;

type 
  vett = array[1..MAX] of integer;

var 
  elem: vett; {contiene gli elementi} 
  n:integer;  {lunghezza del vettore elem}

{AI: 1<=n<=MAX}
{AF: e[1..n] contiene n elementi letti da terminale}
procedure leggi (var e:vett; n:integer);
  var 
    i:integer;
  begin
    for i:=1 to n do {1<=i<=n+1, e[1..i-1] letto da terminale}
      begin
        write('elemento ',i,':');
        readln(e[i]);
      end;
  end;


{AI: 1<=n<=MAX, x[1..n] e' inizializzato}
{AF: restituisce mu = (x[1]+...+x[n]) / n}
function mu (x:vett, n:integer):real;
  var 
    i:integer;
    s:longint;
  begin
    s:=0;
    for i:=1 to n do {1<=i<=n+1, s=e[1]+...+e[i-1]}
      s:=s+e[i];
    mu:=s / n;
  end;

{AI: 1<=n<=MAX, x[1..n] e' inizializzato}
{AF: restituisce 
sigma = sqrt( ( (x[1]-mu(x,n))^2+...+(x[n]-mu(x,n))^2 ) / n )
}
function sigma (x:vett, n:integer):real;
--COMPLETARE LA FUNZIONE

begin
writeln('+--------------------------------------+');
writeln('| Calcolo di mu e sigma di n>=1 interi |'); 
writeln('+--------------------------------------+');
writeln;
--COMPLETARE
end.

ESERCIZIO 2

Modificare il programma precedente in modo che gli elementi in ingresso siano dati specificando le frequenze. Vi ricordo che dati si ha:
     x[1]*f[1]+...+x[n]*f[n]
mu = -----------------------
          f[1]+...+f[n]

      _          ____________________________________
       \        /
        \      / (x[1]-mu)^2*f[1]+...+(x[n]-mu)^2*f[n]
sigma =  \    /  -------------------------------------
          \  /              f[1]+...+f[n]
           \/

Suggerimento, memorizzare i dati in una coppia di vettori:

  elem: vett; {contiene gli elementi} 
  freq: vett; {contiene le frequenze}
e usate le seguenti intestazioni per le procedure e funzioni:
procedure leggi (var e,f:vett; n:integer);

function mu (x,f:vett, n:integer):real;

function sigma (x,f:vett, n:integer):real;
ATTENZIONE: