Buguri la concursurile de programare si nu numai

Cosmin
Cosmin Negruseri
18 martie 2012

Se apropie ONI si cred ca e utila o lista cu buguri frecvente. So here it goes:

  • Probleme in timpul implementarii:
    • greseli la copy paste.
    • inversarea indicilor la iterarea unei matrici (a[j][i]).
    • punct si virgula la final de linie dupa un for.
      for(i = 0; i < n; i++);
       ceva cod care se va executa doar o data
    • refolosirea unui index in interiorul unor foruri imbricate
      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
    • functia % nu functioneaza ca functia modulo din matematica. Astfel daca scazi numere modulo X poti ajunge la resturi negative.
      Sunt gasite de obicei la depanare.
  • Probleme cu memoria:
    • variabile neinitializate.
    • array-uri de dimensiune de prea mica.
    • off by one errors. Datele pornesc de la 0 sau 1?
      Sunt de greu de gasit.
  • Probleme cu tipuri de date:
    • folosire de tipuri prea mici (ex. int in loc de long long sau float in loc de double).
    • probleme cu tipurile intermediare.
      gresit: int a, b; long long c = a * b; // c va avea valoarea unui int
      corect: long long c = ((long long) a) * b;
      gresit: double half = 1 / 2;
      corect: double half = 1.0 / 2;
      Foarte frustrante. Pierzi toate punctele pentru un algoritm aproape de forma corecta.
  • Intrare/Iesire:
    • fisier de intrare sau iesire gresit ca urmare a depanarii intermediare.
    • formatarea gresita (cate un spatiu in loc de virgula, sau uiti ca trebuie sa returnezi rezultatul modulo X)
      Le faci cand problema merge aproape perfect si te-ai grabit sa trimiti solutia.
  • Greseli la algoritm:
    • incepatorii se arunca sa implementeze prima idee, inainte sa se asigure ca e corecta.
    • probleme pe cazuri extreme, mici: gen n = 1, 2 sau mari unde iesi din memorie.
    • strlen(s) are complexitate O(n) nu O(1).
    • rezultatul are nevoie de numere mai mari decat poate reprezenta limbajul de programare.
    • graful nu e neaparat conex si toate exemplele au fost grafuri conexe.

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?

Categorii:
remote content