Ghid Evaluator

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.

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.
  • 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:
void result(char msg[], int p)
{
    fprintf(stderr, "%s", msg);
    printf("%d", p);
    exit(0);
}

Daca ai probleme cu redactarea unui evaluator, poti contacta un administrator sau o persoana implicata in proiectul Extinde Arhiva.

Exemple

Exemple de verificatoare pentru diverse probleme: