Table of Contents

Tema 1 - Introducere în C++

Responsabili

Deadline soft: 2 aprilie, ora 23:55

Depunctare întârziere după depășirea deadline-ului soft: -10p/zi

Deadline hard: 5 aprilie, ora 23:55

Modificări și actualizări

Obiective

În urma realizării acestei teme:

Ne propunem să simulăm funcționalitatea unei structuri de date omogenă, care se redimensionează, de tip std::vector din STL. De atlfel, ne propunem implementarea unui iterator care să poate funcționa pe aceasta structură de date, similiar cu std::vector::iterator din STL.

Cum funcționează

MyVector

Reprezintă o clasă care implementează funcționalitatea unui vector cu elemente generice. Se dorește implementarea următoarelor funcționalități:

MyIterator

Reprezintă o clasă care va fi folosită pentru a itera asupra structurii de date de mai sus. Astfel, ea va avea nevoie de următoarele funcționalități:

Exemplu simplu de folosire (evident, clasele voastre vor fi template-uite):

MyVector a; /* a are o dimensiune default de 10 elemente */
MyIterator it;
for (int i = 0; i < 20; ++i)
    a[i] = i;
 
/* se iterează asupra vectorului cu ajutorul iteratorului */
for (it = a.begin(); it != a.end(); ++it)
    std::cout << *it << ' ' << std::endl; /* se printează elementele */

Cerințe

Se cere să se implementeze funcționalitățile descrise mai sus, în 2 fișiere, MyVector.h și MyIterator.h, care vor fi incluse în fișierele noastre de teste.

Cum vom testa

Tema voastră va fi testată folosind niște fișiere sursă .cpp, care vor include cele 2 header-e și vor instanția cele 2 clase pe care le aveți de implementat, verificând funcționalitățile cerute.

Folosiți MyVector și MyIterator pt numele claselor, respectiv MyVector.h și MyIterator.h pentru numele fișierelor, altfel testele nu vor trece, chiar dacă voi implementați cum trebuie totul.

Având în vedere modul de testare, dacă veți avea funcționalități neimplementate, cel puțin unele dintre teste nu vor compila.

Cum vom implementa

Veți implementa cele două clase template-uite în câte un fișier header separat, MyVector.h și MyIterator.h.

observație: Față de funcționalitățile descrise mai sus, clasele vor trebui, evident, să respecte rule of three.

Teste publice

Aveți la dispoziție o arhivă ce conține o suită de teste publice, reprezentate prin niște fișiere .cpp, și un Makefile care va încerca compilarea fiecărui fișier din teste.

Arhiva de testare

Reguli pentru trimitere

Temele vor trebui trimise pe vmchecker. Atenție! Temele trebuie trimise în secțiunea Structuri de Date (CA).

Arhiva trebuie să conțină:

Punctaj

Codul vostru va fi verificat să nu genereze comportament nedefinit (undefined behaviour) cu valgrind. Dacă se va observa că există cod care ar putea genera astfel de comportament din partea compilatorului, se poate scădea tot punctajul de pe temă (o tema cu undefined behaviour poate merge sau nu, în funcție de mașina pe care a fost compilată, memoria RAM disponibilă la acel moment, starea vremii în ziua compilării sau orice alt motiv super concludent :-p). Exemple de lucruri care ar putea genera undefined behaviour:

  • dereferențiere de pointer NULL
  • screiere sau citire peste zona care a fost alocată
  • double free etc

Mai multe exemple găsiți aici, la răspunsul acceptat (cel cu checked). De altfel, mai multe despre undefined behaviour găsiți aici, aici și aici. Ar fi de preferat să citiți aceste articole înainte de implementarea temei.

Coding style-ul trebuie sa fie consistent și ușor de citit. Ca ghid vă recomandăm:

sau

Atenție! Tema valorează 0.75 punct din nota finală. Cele 100 de puncte acordate de noi se vor regăsi proporțional în punctajul de 0.75. Citiți cu atenție Regulamentul General de Trimitere a Temelor.

Nu copiați! Toate soluțiile vor fi verificate folosind o unealtă de detectare a plagiatului. În cazul detectării unui astfel de caz, atât plagiatorul cât și autorul original (nu contează cine care e) vor primi punctaj 0 pe toate temele!

De aceea, vă sfătuim să nu vă lăsați rezolvări ale temelor pe calculatoare partajate (la laborator etc), pe Drive/Dropbox/mail/liste de discuții/grupuri/facebook/reddit/9gag etc.

În cazul detectării plagiatului, argumentele de tipul “mi-am lăsat calculatorul logat pe Drive” vor avea aceeași valoare cu “mi-a mâncat câinele codul”. You have been warned :)

FAQ

Q: Se poate folosi STL?

A: Nu puteți folosi structurile gata implementate în STL. Obiectivul principal al cursului de structuri de date este acela ca voi să implementați structurile respective.

Q: Avem vreun schelet de cod? Practic ce clase, metode, operatori trebuie să implementăm?

A: Nu există schelet de cod pentru tema aceasta. Trebuie să vă dați seama din specificația temei (dacă nu e suficient de clară, întrebați) ce anume trebuie să implementați (metode, operatori etc).

Q: De ce trebuie să mă chinui atât ca doar să mi se compileze codul?

A: După cum observați, structura de date în sine este foarte simplă. Pentru că abia învățați baza C++, ne așteptăm ca operațiile pe care trebuie să le suporte MyVector și MyIterator să vă dea (foarte probabil) bătăi de cap la compilare. Este intenționat. Deducerea semnăturilor corecte pentru metode, operatori etc și utilizarea lor corectă fac parte din dificultatea temei.

Resurse

C++ Tutorial