Exemplu: Tabel cu rezultatele studentilor. t1l15ld
Programul produce un raport cu rezultatele studentilor la examene, combinand
date din doua fisiere ce contin informatii despre studenti respectiv notele
obtinute de fiecare la examene.
Fisierul de intrare studenti are campurile delimitate prin : si contine pe fiecare
linie numarul matricol, numele si anul in care este studentul.
28602:Muresan Robert:2
38601:Pop Ioan:3
48000:Pop Vasile:1
Fisierul de intrare note are campurile delimitate prin spatii si contine pe
fiecare linie numarul matricol, examenul, si numarul de credite obtinute.
28602 1 4
38601 1 2
48000 1 1
28602 2 5
38601 2 3
Se observa ca Pop Vasile a lipsit la al 3-lea examen.
Raportul afisat de program arata in felul urmator:
Nr. Mat Nume 1 2 Total
28602 Muresan Robert 4 5 9
38601 Pop Ioan 2 3 5
48000 Pop Vasile 1 1
Total: 7 8
Programul care a generat acest raport este urmatorul:
#! usr/bin/perl
# Catalog de Note - pentru demonstrarea lucrului cu sistemul I/O, liste asociative
# sortare si formatarea unui raport
# Programul accepta orice numar de studenti si examene, respectiv trateaza si
# cazurile cand anumite informatii lipsesc.
$studfile = 'studenti';
$notfile = 'note';
# Daca fisierele se pot deschide, atunci perl nu mai evalueaza si restul expresiei
ce # urmeaza dupa ||
open (NUME,"<studfile") || die "Nu pot deschide fisierul
$studfile! \n"; open(NOTE,"<notfile") || die "Nu pot deschide fisierul $notfile!
\n";
# Construieste o lista asociativa cu informatiile despre studenti folosind ca
si # cheie, numarul matricol
while(<NUME>)A
($nrmat,$nume,$an) = split(':',$_);
$numeA$nrmatS = $nume; if (length($nume) > $maxlengthnume)A
$maxlengthnume = length($nume);
S
S close NUME;
# Construieste un tabel cu notele de la exemene
while(<NOTE>)A
A$nrmat,$nrexam,$notaS = split;
$notaA$nrmat,$nrexamS = $nota; if ($nrexam > $maxnrexam)A$maxnrexam = $nrexam;S
S close NOTE;
# Tipareste raportul cu datele citite
printf "%6s %-$AmaxlengthnumeSs ",'Nr. Mat','Nume'; foreach $nrexam(1..$maxnrexam)A printf "%4d",$nrexam;
S printf "%10s\n\n",'Total:';
# Subrutina dupanume este folosita pentru sortarea sirului %nume
# Functia "sort" transmite variabilele $a si $b subrutinelor pe care
le apeleaza
# Functia " x cmp y " returneaza -1 daca x < y , 0 daca x=y si
1 daca x > y.
sub dupanume A$numeA$aS cmp $numeA$bSS
# Ordoneaza numerele matricole astfel incat numele studentilor sa apara in #
ordine alfabetica foreach $nrmat(sort dupanume keys(%nume))A
# Tipareste creditele obtinute si totalul pentru fiecare student printf "%6d %-$AmaxlengthnumeSs ", $nrmat,$numeA$nrmatS;
$total = 0; foreach $nrexam(1..$maxnrexam)A printf "%4s",$notaA$nrmat,$nrexamS;
$total += $nota($nrmat,$nrexam);
$examtot($nrexam) += $nota($nrmat,$nrexam);
S printf "%10d\n",$total;
S
printf "\n%6s %$AmaxlengthnumeSs ",' ',"Total: "; foreach $nrexam(1..$maxnrexam)A printf "%4d",$examtotA$nrexamS;
S printf "\n"; exit(0).