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.