Revizia anterioară Revizia următoare
Buguri la concursurile de programare si nu numai
Se apropie ONI si m-am gandit ca e utila o lista cu buguri frecvente in concursurile de programare.
Probleme in timpul implementarii:
- x
- inversarea coordonatelor unei matrici a[j][i]
- functia % nu functioneaza exact la fel cu functia modulo din matematica. Astfel daca scazi numere modulo X poti ajunge la resturi negative (caz frecvent: hashing pe string-uri)
- Punct si virgula la final de linie dupa un for
for(i = 0; i < n; i++);
ceva cod - refolosirea unui index
for (i = 0; i < n; i++)
for (i = 0; i < m; i++) // i in loc de j - folosirea lui = in locul lui ==
- comparare de stringuri cu \=\= in loc de strcmp
- diferente de librarii ale limbajului intre linux si windows
- ++ in loc de --
Ele sunt gasite de obicei la depanare.
- Probleme cu memoria:
- variabile neinitializate - cand programul are comportament diferit la rulari diferite, una dintre probleme ar initializarea variabilelor.
- depasirea limitei de memorie
- declarat array-uri de dimensiune de prea mica
- refolosirea variabilelor
- off by one errors, frecvent apar probleme cu datele pornind de la 0 sau 1
Destul de greu de gasit.
- Probleme cu tipuri de date:
- folosire de tipuri prea mici de exemplu int in loc de long long sau float in loc de double
- probleme cu tipurile intermediare
int a,b;
long long c = a * b; // c va avea valoarea unui int
corect e
long long c = ((long long) a) * b; - impartire intreaga in loc de impartire reala:
double half = 1 / 2;
corect e
double half = 1.0 / 2 sau
double half = ((double)1)/2
Foarte frustrante. Pierzi toate punctele pentru un algoritm aproape de forma corecta.
- Intrare/Iesire:
- fisier de intrare sau iesire gresit
- formatarea gresita (cate un spatiu in loc de virgula, sau mai stiu eu ce)
- uitat ca anumite probleme cer rezultatul modulo X
Le faci cand problema merge aproape perfect si te-ai grabit sa trimiti solutia.
- Greseli la algoritm:
- de multe ori incepatorii se arunca sa implementeze prima idee, inainte sa se gandeasca atent daca ea e corecta.
- graful nu e neaparat conex si toate exemplele au fost grafuri conexe.
- rezultatul are nevoie de numere mai mari decat poate reprezenta limbajul de programare.
- probleme pe cazuri extreme, mici: gen n = 1, 2 sau mari unde iesi din memorie.
- strlen(s) are complexitate O(n) nu O(1).
Faceti o lista cu bugurile cu care v-ati intalnit ca sa va dati seama care sunt cele mai frecvente pentru voi. In concursurile online e foarte utila o asemenea lista.
Voua ce buguri v-au dat dureri de cap?