RSS

Daily Archives: March 22, 2014

[Linux]Cum sa-ti testezi programele la ONI


Recent am invatat niste chestii foarte misto la faculta care pot fi aplicate cu succes la ONI pentru scrisul rapid al generatoarelor si evaluatoarelor. Provocare pentru cei care n-au ce face: faceti aceleasi chestii pe windows.

Prima chestie pe care e bine s-o aveti in minte e ca nu trebuie sa memorati pasii/comenzile pentur scrierea unui generator, fiecare comanda are pe linux un manual complet de folosire. Puteti sa-l accesati asa:

man comanda

.

Prima data incepeti prin a genera un numar de teste(de ex 100):

//generator pentru problema max square
#include <fstream>
#include <ctime>
#include <cstdlib>
#include <cstdio>
using namespace std;

int n;

int main() {
	for(int t=1; t<=100; ++t) {
		char in[55];
		ofstream g(in);
		sprintf(in,"%d.in",t);
		n=rand()%50+1;
		g<<n<<'\n';
		for(int i=1; i<=n; ++i) {
			for(int j=1; j<=n; ++j) g<<rand()%100-rand()%100<<' ';
			g<<'\n';
		}
	}
}

Acum trebuie sa generam .ok-urile cu un program brut si pe urma sa verificam daca outputul programului bun coincide cu cel din ok. In bash putem redirectiona fisiere catre stdin si stdout catre un fisier(ca si la freopen).

g++ brut.cpp#compilam programul, va genera executabilul a.out
for i in {1..100}; do
	./a.out < $i.in > $i.ok
done

Avand fisierele .ok trebuie sa verificam ca programul sa produca acelasi output.

g++ bun.cpp
for i in {1..100}; do
	echo $i #ce test a fost verificat
	./a.out < $i.in > output
	diff $i.ok output#in caz ca fisierele difera va aparea un mesaj
done

In caz ca vrem sa afisam doar testele pe care pica putem modifica scriptul in felul urmator:

g++ bun.cpp
for i in {1..100}; do
	./a.out < $i.in > output
	if ! diff -q $i.ok output
	then echo "testul $i pica"
	fi
done
 
Leave a comment

Posted by on March 22, 2014 in fun