Diferente pentru documentatie/ghid-evaluator intre reviziile #6 si #18

Nu exista diferente intre titluri.

Diferente intre continut:

h1. Ghid Evaluator
Pentru problemele in care raspunsul nu este unic, site-ul *infoarena* a fost conceput sa foloseasca un program extern pentru verificarea raspunsului. Acest program se numeste _evaluator_, si poate fi scris in $C, C++$ sau $Pascal$. Pentru a realiza un evaluator compatibil cu design-ul infoarena trebuie respectate urmatoarele reguli:
== include(page="documentatie/sidebar")==
 
h2. Ce este un evaluator?
 
Pentru problemele in care raspunsul nu este unic, site-ul *infoarena* a fost conceput sa foloseasca un program extern pentru verificarea raspunsului. Acest program se numeste _evaluator_, si poate fi scris in $C, C++$ sau $Pascal$.
 
h2. Cum se face un evaluator?
 
Pentru a realiza un evaluator compatibil cu design-ul infoarena trebuie respectate urmatoarele reguli:
 
* In functie de numele introdus in setarile problemei pentru evaluator, fisierul care va fi atasat la pagina problemei trebuie prefixat cu cuvantul $grader_$ (spre exemplu daca s-a introdus in setarile problemei $eval.cpp$ fisierul care trebuie atasat se va numi $grader_eval.cpp$)
* Daca numele problemei este $prob$ fisierul de intrare care se evalueaza se numeste $prob.in$, fisierul de iesire al utilizatorului se numeste $prob.out$, iar fisierul de evaluare (care contine informatii despre raspunsul corect pentru testul respectiv) se numeste $prob.ok$. Nu se recomanda folosirea altor fisiere in timpul evaluarii.
 
* Evaluator trebuie sa verifice ca fiecare din operatiile de deschidere de fisier sau de citire se efectueaza corect. Cateva exemple in $C/C++$:
** functia $fopen$ returneaza un pointer catre fisierul deschis, iar daca acesta este $NULL$ s-a produs o eroare la deschiderea fisierului iar aceasta trebuia raportata
** functiile $scanf / fscanf$ returneaza numarul de valori citite din lista de argumente; astfel se poate verifica la fiecare apel daca au fost citite toate datele si se poate detecta orice eroare de citire
** asemanator cu $scanf$ , functia $gets / fgets$ returneaza o valoarea diferita de $0$ daca a efectuat cu succes citirea
Toate aceste verificari sunt *necesare*, in caz contrar evaluator poate crapa daca fisierul de iesire al utilizatorului nu respecta formatul de iesire.
 
* Desi se presupune ca fisierul de intrare ({$.in$}) si fisierul de verificare ({$.ok$}) sunt corecte, se recomanda sa se verifice daca acestea sunt intr-adevar valide folosind acelasi tratament ca pentru fisierul de iesire al utilizatorului. In plus, se poate verifica daca fisierul de intrare respecta intr-adevar restrictiile din enuntul problemei. Aceste verificari pot identifica eventualele greseli din fisierele de intrare "din fasa" si de aceea recomandam cu insistenta folosirea lor.
* In functie de numele introdus in setarile problemelei pentru evaluator, fisierul care va fi atasat la pagina problemei trebuie prefixat cu cuvantul $grader_$ (spre exemplu daca s-a introdus in setarile problemei $eval.cpp$ fisierul care trebuie atasat se va numi $grader_eval.cpp$)
* Daca numele problemei este $prob$ fisierul de intrare care se evalueaza se numeste $prob.in$, fisierul de iesire al utilizatorului se numeste $prob.out$, iar fisierul de evaluare (care contine informatii despre raspunsul corect pentru testul respectiv) se numeste $prob.out$. Nu se recomanda folosirea altor fisiere in timpul evaluarii.
* Odata ce s-a evaluat fisierul de iesire, mesajul trimis de evaluator trebuie afisat la $stderr$, iar punctajul la $stdout$, iar executia programului de evaluare trebuie terminata. Se recomanda scrierea unei functii care sa faca aceste lucruri:
== code(cpp) |
p{width:75%}. == code(cpp) |
void result(char msg[], int p)
{
    fprintf(stderr, msg);
    fprintf(stderr, "%s", msg);
    printf("%d", p);
    exit(0);
}
==
* Evaluator trebuie sa verifice ca fiecare din operatiile de deschidere de fisier sau de citire se efectueaza corect. Cateva exemple in $C/C++$:
** functia $fopen$ returneaza un pointer catre fisierul deschis, iar daca acesta este $NULL$ s-a produs o eroare la deschiderea fisierului iar aceasta trebuia raportata
** functiile $scanf / fscanf$ returneaza numarul de valori citite din lista de argumente; astfel se poate verifica la fiecare apel daca au fost citite toate datele si se poate detecta orice eroare de citire
** asemanator cu $scanf$ , functia $gets / fgets$ returneaza o valoarea diferita de $0$ daca a efectuat cu succes citirea
Toate aceste verificari sunt *necesare*, in caz contrar evaluator poate crapa daca fisierul de iesire al utilizatorului nu respecta formatul de iesire.
 
* Desi se presupune ca fisierul de intrare ({$.in$}) si fisierul de verificare ({$.ok$}) sunt corecte, se recomanda sa se verifice daca acestea sunt intr-adevar valide folosind acelasi tratament ca pentru fisierul de iesire al utilizatorului. In plus, se poate verifica daca fisierul de intrare respecta intr-adevar restrictiile din enuntul problemei.
Daca ai probleme cu redactarea unui evaluator, poti contacta un 'administrator':echipa-infoarena sau o persoana 'implicata':implica-te in proiectul 'Extinde Arhiva':implica-te/extinde-arhiva.
h2. Exemple
 
Exemple de verificatoare pentru diverse probleme:
* 'Buline':ghid-evaluator?grader_buline.cpp
* 'Ghiozdan':ghid-evaluator?grader_ghiozdan.cpp
* 'Shop':ghid-evaluator?grader_shop.cpp
* 'Zero 2':ghid-evaluator?grader_zero2.cpp
* 'Buline':documentatie/ghid-evaluator?buline.cpp
* 'Ghiozdan':documentatie/ghid-evaluator?ghiozdan.cpp
* 'Shop':documentatie/ghid-evaluator?shop.cpp
* 'Zero 2':documentatie/ghid-evaluator?zero2.cpp
* 'Semne':documentatie/ghid-evaluator?semne.pas (Pascal)
* 'Adapost 2':documentatie/ghid-evaluator?adapost2.pas (Pascal)

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.