#!/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 tablicy @dane, to skalar zawierajacy referencje do tablicy # anonimowej, ktora zawiera napis a potem ciag liczb 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 ( @dane ){ # lecimy po wszystkich podtablicach w tablicy @dane # kazda taka podtablica trzymana jest w tymczasowej zmiennej # skalarnej '$student' jako referencja # wypisujemy nazwisko z jednoczesnym usunieciem z tablicy danej # przez @$student (pelen zapis to @{$student}) printf "%13s: ",shift @$student; # sumujemy elementy w tablicy danej przez @$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(@$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 tablicy przechowywane sa tablice. Tablice wewnetrzne zawieraja w pierwszym elemencie napis (imie i nazwisko studenta), a w kolejnych elementach 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 po napisie Jezeli student nie brak 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.