# exercise 5.1 by erikt(at)science.uva.nl SOFTWARE use strict; # read list numbers from STDIN, one line by one sub readNumbers { my @numbers = (); print "Please enter some numbers and finish with an empty line:\n> "; while () { my $line = $_; chomp($line); if ($line eq "") { last; } elsif ($line !~ /^\d+$/) { die "illegal input: $line\n"; } push(@numbers,$line); print "> "; } return(@numbers); } # sort a list with numbers sub sortList { my @numbers = @_; my $sorted = 0; my $i; while (not $sorted) { # bubble sort $sorted = 1; for ($i=0;$i<$#numbers;$i++) { if ($numbers[$i] > $numbers[$i+1]) { ($numbers[$i],$numbers[$i+1]) = ($numbers[$i+1],$numbers[$i]); $sorted = 0; } } } return(@numbers); } sub computeMedian { my @numbers = @_; # return undef for empty list if (not @numbers) { return(undef); } # sort the numbers: easiest solution: @numbers = sort {$a<=>$b} @numbers @numbers = &sortList(@numbers); # return the middle number if @numbers has an odd number of elements if ($#numbers%2 == 0) { return($numbers[$#numbers/2]); } # else return the average of the two center numbers else { return(($numbers[($#numbers-1)/2]+$numbers[1+($#numbers-1)/2])/2); } } # main part of the code my @numbers = &readNumbers(); my $median = &computeMedian(@numbers); if (defined $median) { print "The median number of these ",$#numbers+1," numbers is: ",$median,"\n"; } # TEST erikt@stuwww:~ perl -w 51.pl Please enter some numbers and finish with an empty line: > 3 > 8 > 0 > 2 > The median number of these 4 numbers is: 2.5 erikt@stuwww:~ perl -w 51.pl Please enter some numbers and finish with an empty line: > 9 > 10 > 2 > The median number of these 3 numbers is: 9