Evaluatorul care-l folosesc eu. Nu e cine stie ce dar isi face treaba.
$a1=@ARGV[0];
if ( ($a1 ne "help" && $a1 ne "config" && $a1 ne "c" && $a1 ne "pascal" && $a1 ne "setup") ) {
print ("Mod de folosire:\n");
printf ("\tperl eval.pl setup : Compileaza fisierul jlaunch.cpp necesar la testare\n");
print ("\tperl eval.pl help : Afiseaza informatii referitoare la modul de folosire\n");
print ("\tperl eval.pl config : Configureaza evaluatoru\n");
print ("\tperl eval.pl p fisier.pas : Testeaza un program scris in Pascal\n");
print ("\tperl eval.pl c fisier.cpp : Testeaza un program scris in C++\n");
exit();
}
if ($a1 eq "setup") {
if (!( -e "jlaunch.cpp") ) {
print ("Fisierul jlaunch.cpp nu exista. Probabil l-ati sters sau nu l-ati descarcat. Daca nu il mai aveti\ntrimiteti un email la
[email protected]");
exit();
}
if (-e "run") {
print ("Evaluatorul a mai fost instalat odata\n");
exit();
}
exec ("g++ -o run jlaunch.cpp\n");
printf ("Evaluatorul a fost instalat cu succees\n");
exit();
}
if ($a1 eq "help") {
printf ("======================================\n");
print ("Evaluator versiunea 1.0\n");
print ("Autor: Vlad Saveluc\nLicenta: GPL (http://www.gnu.org/copyleft/gpl.html)\n");
print ("=======================================\n");
print ("Instructiuni de utilizare:\n");
print ("1. Inainte de a testa surse programul trebuie configurat.\n");
print ("\taceasta se realizeaza prin comanda:\n\t\t'perl eval.pl config'\n");
printf ("\tProgramul va genera un fisier config.txt folosit mai tarziu la testare.\n");
printf ("\tVor trebui introduse date referitoare la numarul de teste, denumirea \n\tfisierelor de intrare/iesire etc.\n");
printf ("2. Testele se vor afla intr-un director cu teste definit la configurare\n");
printf ("\tFisierele vor fi denumite 0.in, 1.in ... respectiv 0.ok, 1.ok ...\n");
printf ("\tFisierele .ok sunt necesare doar in cazul in care validarea outputului\n");
printf ("\tse face print diferenta de fisiere\n");
printf ("3. Daca verificarea este realizata de un verificator acesta va trebui sa scrie intr-un fisier ver.ok\n");
printf ("\t1- daca rezultatul este corect, 0- daca este gresit. !!! ver.ok va avea o singura linie\n");
printf ("3.1 Utilizatorul sub care este rulat evaluatorul va trebui sa aiba drepturi de executare a verificatorului\n");
printf ("\tAceasta se face prin: 'chmod 700 nume_verificator'\n");
printf ("4. Dupa ce a fost configurat, programul poate testa programe scrise in C sau Pascal astfel\n");
printf ("\tperl eval.pl c nume_fisier - Pentru programe in C++\n");
printf ("\tperl eval.pl p nume_fisier - Pentru programe scrise in Pascal\n");
printf ("5. Rezultatele evaluarii se vor gasi intr-un fisier definit la configurare\n");
exit();
}
if ($a1 eq "config") {
print ("Sunteti sigur ca doriti sa (re)configurati evalutorul (configuratia trecuta se va pierde) ? (DA/NU)\n");
$ans=<STDIN>;
while ($ans ne "DA\n" && $ans ne "NU\n") {
print ("Raspunsul nu este valid. Mai incercati (trebuie scris cu masjuscule)\n");
$ans=<STDIN>;
}
if ($ans eq "NU\n") {exit();}
open (fout,">config.txt");
print ("Problema va avea verificator (daca nu, se va verifica print diferenta de fisiere? (DA/NU)\n");
$ans=<STDIN>;
while ($ans ne "DA\n" && $ans ne "NU\n") {
print ("Raspunsul nu este valid. Mai incercati (trebuie scris cu masjuscule)\n");
$ans=<STDIN>;
}
print fout ("$ans");
if ($ans eq "DA\n") {
printf ("Dati denumirea executabilului verificatorului\n");
$ans=<STDIN>;
chomp($ans);
while ( !( -e $ans) ) {
if ($ans eq "a.out") {printf ("a.out este fisier rezervat\n");}
else {printf ("Acest fisier nu exista. Mai incercati (CTRL + C pentru a iesi)\n");}
$ans=<STDIN>;
chomp($ans);
}
print fout ("$ans\n");
}
printf ("Directorul in care se gasesc testele este: \n");
$ans=<STDIN>;
chomp($ans);
while ( !(-d $ans) ) {
printf ("Directorul $ans nu exista. Mai incercati (CTRL + C pentru iesi)\n");
$ans=<STDIN>;
chomp($ans);
}
print fout ("$ans\n");
printf ("Numarul de teste (divizor de 100)");
$ans=<STDIN>;
print fout ("$ans");
printf ("Denumirea fisierului de intrare:");
$ans=<STDIN>;
print fout ("$ans");
printf ("Denumirea fisierului de iesire:");
$ans=<STDIN>;
print fout ("$ans");
printf ("Timp de executie: ");
$ans=<STDIN>;
print fout ("$ans");
printf ("Comanda de compilare in C++ (recomandat 'g++') ");
$ans=<STDIN>;
chomp($ans);
print fout ("$ans\n");
printf ("Comanda de compilare in pascal (recomandat 'fpc') ");
$ans=<STDIN>;
chomp($ans);
print fout ("$ans\n");
printf ("Fisierul in care vor fi scrise rezultatele evaluarii (borderoul):");
$ans=<STDIN>;
print fout ("$ans");
}
if ($a1 eq "c" || $a1 eq "p") {
$file=@ARGV[1];
unless (-e "run") {
printf ("Evaluatorul nu a fost instalat\n");
printf ("Rulati 'perl eval.pl setup'\n");
exit();
}
unless (-e "config.txt") {
printf ("Evaluatorul nu a fost configurat\n");
exit();
}
if ($file eq "") {
printf ("Trebuie sa specificati fisierul sursa ce va fi evaluat\n");
printf ("Rulati 'perl eval.pl' pentru mai multe detalii\n");
exit();
}
unless (-e $file) {
printf ("Fisierul $file nu exista\n");
exit();
}
$fin="config.txt";
open(fin);
@data=<fin>;
close(fin);
foreach (@data) {
chomp($_);
}
$type=@data[0];
my $ver,$tdir,$nt,$in,$out,$tl,$comp_c,$comp_p,$borderou;
$tl=0.0;
if ($type eq "DA") {
$ver=@data[1];
$tdir=@data[2];
$nt=@data[3];
$in=@data[4];
$out=@data[5];
$tl=@data[6];
$comp_c=@data[7];
$comp_p=@data[8];
$borderou=@data[9];
}
else {
$tdir=@data[1];
$nt=@data[2];
$in=@data[3];
$out=@data[4];
$tl=@data[5];
$comp_c=@data[6];
$comp_p=@data[7];
$borderou=@data[8];
}
open (fout,">$borderou");
$ppt=100/$nt;
#Partea de compilare
if ($a1 eq "c") {
system ("$comp_c $file 2>eror.txt\n");
}
else {
system ("$comp_p $file 2>eror.txt\n");
}
unless (-e "a.out") {
printf ("Eroare de compilare\n");
system ("cp -f eror.txt $borderou");
exit();
}
system ("rm -f eror.txt");
$total=0;
for ($i=0;$i<$nt;++$i) {
printf fout ("Testul %2d ............ ",$i+1);
chdir ("$tdir");
system ("cp -f $i.in ../$in");
if ($type eq "NU") {
system ("cp -f $i.ok ../");
}
else {
system ("cp -f $i.ok ../$tdir.ok");
}
chdir ("..");
$mess=system ("./run a.out 0 $tl 0");
if ($mess==0) {
if ($type eq "DA") {
system ("./$ver");
$fin="ver.ok";
open(fin);
@data=<fin>;
if (@data[0] eq "1") {
$total+= $ppt;
printf fout ("OK\n");
}
else {
printf fout ("Raspuns gresit\n");
}
}
else {
$mess2=system("diff -bq $out $i.ok >/dev/null");
if ($mess2 ==0) {
printf fout ("OK\n");
$total += $ppt;
}
else {
printf fout ("Raspuns gresit\n");
}
}
}
if ($mess==51200) {printf fout ("Limita de timp depasita\n");}
if ($mess != 51200 && $mess!=0) {printf fout ("Eroare la executie\n");}
system ("rm -f $in");
system ("rm -f $out");
system ("rm -f $i.ok");
}
printf fout ("Total $total\n");
system ("rm -f a.out\n");
}
Pentru a executa "perl eval.pl".