#!/usr/bin/perl use strict; use warnings; use List::Util; # wyniki maksymalne z kolokwiow my @maxy = (5,6,5,5); # tabela z danymi nt. osiagniec studentow # kazdy element hasza %dane, to referencja do tablicy anonimowej # zawierajacej po prostu liczby punktow otrzymane z poszczegolnych # kolokwiow my %dane = ( "Agnieszka L." => [5,5,5,2,], "Anna S." => [5,5,5,3,], "Damian K." => [5,0,5,1,], "Dariusz G." => [5,4,5,2,], "Dawid K." => [5,3,5,3,], "Grzegorz T." => [5,2,5,3,], "Karol R." => [5,2,4,0,], "Lukasz K." => [2,4,5,2,], "Lukasz L." => [4,5,5,3,], "Marek K." => [5,3,3,3,], "Piotr J." => [5,4,4,3,], "Piotr T." => [5,5,3,0,], "Przemyslaw S." => [5,3,4,1,], "Radoslaw G." => [5,4,4,0,], "Rafal D." => [5,4,4,2,], "Slawomir P." => [5,4,5,0,], "Tomasz D." => [5,2,3,2,], "Tomasz M." => [3,3,4,0,], ); # obliczenie calkowitej maksymalnej liczby punktow mozliwej # do uzyskania ze wszystkich kolokwiow: my $max = List::Util::sum @maxy; # teraz przetwarzanie danych, czyli wypisywanie kazdego # imienia i nazwiska oraz za nim jego osiagniec srednich foreach my $student ( keys %dane ){ # lecimy po wszystkich kluczach w haszu %dane # kazdy taki klucz to po prostu napis zawierajacy imie i nazwisko # studenta. Uzywamy tego do uzyskania dostepu do danych odpowiedniej # osoby, a dane te to tablica anonimowa # wypisujemy nazwisko printf "%13s: ",$student; # sumujemy elementy w tablicy danej przez @{$dane{$student}}, dzielimy przez # wartosc $max (obliczona powyzej) i mnozymy przez 100 zeby wyszlo # jak nalezy w procentach, a potem wypisujemy printf "%1.2f%%\n", 100 * List::Util::sum(@$dane{$student}) / $max; } # i to wszystko. __END__ =pod =head1 Nazwa studenci.pl - program do podliczania wynikow studentow =head2 Wersja [c]piotao, 0.1, 20070124 Pisane na potrzeby przedmiotu monograficznego Perl-programowanie http://piotao.math.univ.gda.pl/Perl/ =head2 Streszczenie Uruchom program piszac: studenci.pl program oblicza wyniki studentow na podstawie zawartej w nim na stale struktury danych w ktorej w haszu przechowywane sa tablice anonimowe. Tablice wewnetrzne zawieraja wyniki studenta otrzymane w trakcie kolejnych kolokwiow. Kazdy ze studentow ma taka sama ilosc wynikow, brak jakiejs oceny jest sygnalizowany zerem, chociaz nie jest to konieczne. Wyniki, ktore program generuje, to lista studentow razem z ich srednimi wynikami wyrazonymi w procentach. Ilosc danych jest dla programu nieistotna (moze byc 10 studentow, moze byc i 1000, tego nigdzie nie okreslamy). Wazne jest to, aby elementow w tablicy C<@maxy> bylo tyle samo, ile jest liczb podawanych w tablicy danych dla kazdego studenta. Inne ilosci liczb nie spowoduja zalamania programu, ale wyniki procentowe beda nieprawidlowo obliczane co do wartosci. Czyli: @maxy = ( ... , ... , ... ) # jakies n-elementow i potem w tabeli danych: '...napis...' => [ ..., ..., ... ], # n-liczb w tablicy po napisie Jezeli student nie bral udzialu w zadnym kolokwium, jego oceny mozna nawet nie wpisywac, program policzy sume wynikow jako 0 wtedy i bedzie to zgodne z prawda. Dodatkowo, kolejnosc wynikow wpisana do tabeli nie ma znaczenia, gdyz wazna jest tylko ich suma. =head2 Zaleznosci Program wymaga modulu List::Util, ktory jest dolaczony do standardowej dystrybucji perla w wersji 5.8.+. Z tego modulu wykorzystana jest funkcja C. Zamiast niej wystarczy uzyc swojej funkcji, napisanej np. tak: sub sum { my $sum = 0; map{ $sum += $_ } @_; return $sum; } Oczywiscie wtedy nie nalezy poprzedzac jej przedrostkiem List::Util:: =head2 Autor Piotr Arlukowicz, , http://piotao.math.univ.gda.pl/ =head2 Znane bledy Jezeli sa jakies, nalezy zglosic je do autora. Program nie jest do konca przetestowany i ma stanowic tylko ilustracje zagadnien zwiazanych z przetwarzaniem zlozonych struktur danych.