RSS

Cum sa testezi programele la OJI

28 Feb

Sa zicem ca ai terminat de rezolvat problemele si acum vrei sa le testezi sa vezi daca sunt corecte. Pentru fiecare problema ar trebui sa ai 3 surse: generatorul de teste, solutia propriu zisa si un brut care sa verifice daca solutia e curecta.

In continuare o sa exemplific o metoda destul de buna de testat cod

Exemplu de generator:

#include
#include
#include
#include
#define MAXN 50005
#define MAXVAL 2000
#define MAXPOS 1000
using namespace std;

int n,v[MAXN+5];

int main() {
  srand(time(NULL));//http://www.cplusplus.com/reference/cstdlib/srand/
  n=randI()%MAXN+1;
  for(int i=1; i<=n; ++i) v[i]=rand()%MAXVAL-MAXPOS // avem numere intre -1000 si 1000

  //scriem in fisierul de intrare
  ofstream g("problema.in");
  g<<n<<'\n';
  for(int i=1; i<=n; ++i) g<<v[i]<<'\n';
  g.close();
  cout<<"Test generat\n";   return 0; } 

Acum sursa va scrie in fisierul problema.out raspunsul corect iar noi vrem sa il verificam daca este chiar corect. Verificarea se poate face in brut

 int main() {   int raspuns=brute(),raspuns2;   ifstream f("problema.out");   f>>raspuns2;
  if(raspuns!=raspuns2) {
     cout<<"Raspuns gresit\nBrut:"<<raspuns<<"\nSursa eficienta:\n";
     cout.flush();//sau fflus(stdout) pentru cei care folosesc freopen
// pentru ca vom face un ciclu infinit vrem sa fie afisate toate caracterele pe ecran
     while(1);//oprim executia programului pentru a nu fi generate teste in continuare si a ne pastra testul pe care a picat
  }else cout<<"Raspuns corect";

Acum ca avem tot ce ne trebuie ne punem problema cum sa rulam de mai multe ori aceeasi sursa fara a modifica fisierele de intrare/iesire. Prima data trebuie sa facem rost de fisierele .exe generate in urma compilarii. Ele se vor gasi in folderul proiectului sau daca nu ati facut proiect vor purta numele sursa.exe. Acum le copiem pe toate in acelasi folder si creem un fisier eval.bat care le va rula pe rand de multe ori. In caz ca windowsul ascunde extensia(.bat) in my computer la folder and search options cautati o chestie bifata “hide extension for known bla bla” si debifati.

Acum in fisierul eval.bat scrieti urmatoarele:

@echo off

:loop
	generator.exe
	sursaBuna.exe
	brut.exe
	PAUSE
goto loop

Se va crea un ciclu infinit in care la fiecare pas pentru continuare va fi asteptata tasta enter. E de recomandat sa va faceti afisari in programe(nu lasati afisarile in sursa buna ca mananca timp) ca sa stiti in caz ca cicleaza unde se intampla asta.

Sper sa va ajute si sa va calificati la oni.

Daca aveti alte metode scrieti in comentarii.

 
Leave a comment

Posted by on February 28, 2013 in fun

 

Leave a comment