#!/usr/bin/perl

# $odchylenie = odchylenie_standardowe(\@tablica) 
# Oblicza odchylenie standardowe dla tablicy wartoci.
#
sub odchylenie_standardowe {
    my $element = shift;
    my $srednia = srednia($element); # procedura srednia() zostala zdefiniowana wczesniej
    return sqrt( srednia( [map( ($_ - $srednia) ** 2, @$element) ] ) );
}

# @oceny = ocena_standardowa(\@tablica)
# Oblicza dla kazdego elementu liczbe odchylen standardowych 
# ponad srednia.
#
sub ocena_standardowa {
    my $element = shift;
    my $srednia = srednia($element);
    my ($i, @oceny);
    my $odchylenie = sqrt(srednia( [map( ($_ - $srednia) ** 2, @$element)]));
    return unless $odchylenie;
    for ($i = 0; $i < @$element; $i++) {
        push @oceny, ($element->[$i] - $srednia) / $odchylenie;
    }
    return \@oceny;
}

%wyniki = (Adam => 72, Basia => 69, Czarek => 68, Darek => 80,
            Ewa => 85, Franek => 84, Grzes => 75, Heniek => 90,
            Iza => 69, Jacek => 74, Krzys => 83, Liza => 75,
            Marcin => 77);

@wartosci   = values %wyniki;
$srednia    = srednia(\@wartosci);
$odchylenie = odchylenie_standardowe(\@wartosci);
$oceny      = ocena_standardowa(\@wyniki);
print "Srednia to $srednia, a odchylenie standardowe to $odchylenie.\n";

while (($imie, $ocena) = each %wyniki) {
    print "$imie: ", " " x (10 - length($imie)), stopnie($oceny->[$i]);
    printf " (odchylenie: %4.1f)\n", $oceny->[$i];
    $i++;
}

sub stopnie {
    return "5" if $_[0] > 1.0;
    return "4" if $_[0] > 0.5;
    return "3" if $_[0] > -0.5;
    return "2" if $_[0] > -1.0;
    return "1";
}

# $srednia = srednia(\@tablica) oblicza srednia dla tablicy z wartosciami.
#
sub srednia {
    my ($element) = @_;
    my $wynik;
    foreach (@$element) { $wynik += $_ }
    return $wynik / @$arrayref;
}
