Sunteți pe pagina 1din 4

Tema 1 Multi-platform Development

Dat publicare: 27 Februarie 2014


Deadline: 12 Martie 2014, ora 23:55

Deadline hard: 19 Martie 2014, ora 23:55

Scopul temei

Recapitularea lucrului cu funciile ANSI C:

lucrul cu fiiere

alocare dinamic de memorie

Folosirea pointerilor

Enun
S se implementeze n C o tabel de dispersie (hashtable) ce va conine cuvinte. Operaiile ce trebuie implementate pentru tabel sunt
urmtoarele:

add <cuvnt> adauga cuvntul la hashtable (nu se permit dubluri)

remove <cuvnt> terge cuvntul din hashtable (nu e obligatoriu s existe cuvntul)

clear golete tabela

find <cuvnt> [<fiier_ieire>] caut cuvntul n hashtable scrie True sau False pe o linie nou n fiierul specificat sau la

consol dac acest parametru lipsete

print_bucket <index_bucket> [<fiier_ieire>] scrie cuvintele din bucketul respectiv, pe o singur linie i separate de spaiu n

fiierul specificat sau la consol dac acest parametru lipsete, index_bucket este valid

print [<fiier_ieire>] printeaza toate bucket-urile pe linii diferite, ncepnd cu bucketul 0, n fiierul specificat sau la consol

dac acest parametru lipsete

resize double dubleaz dimensiunea hash-ului (bucket-urile vor fi parcuse n ordine i cuvintele sunt redistribuite)

resize halve njumtete dimensiunea hash-ului (bucket-urile vor fi parcuse n ordine i cuvintele sunt redistribuite, memoria

n surplus va fi dealocat)
Aceste comenzi se vor regsi una per linie.

Programul va primi o serie de parametri:

Primul parametru este lungimea iniiala a hashului

Urmtorii parametri sunt opionali i reprezint o list de fiiere de intrare din care se face citirea. Dac acetia lipsesc citirea

se face de la STDIN. Atenie, n cazul n care sunt specificate mai multe fiiere de intrare, toate operaiile se

aplic aceluiai hash.


Exemplu:

./tema1 256 hash1.in hash2.in

./tema1 100 < hash1.in


hash1.in:

add tema

add hash

print hash.out

find tema hash.out

remove tema

find tema hash.out

print hash.out

resize double

print

print_bucket 185 hash2.out

Hashtable-ul implementat va conine SIZE bucketuri. Fiecare bucket va conine cuvintele n ordinea n care ele au fost introduse. Pentru
operaia de resize bucketurile vor fi parcurse n ordine i redistribuite. Cuvintele din bucket vor fi parcurse ncepnd cu cel mai vechi i
terminand cu cel mai recent.

Precizri generale

Valorile introduse n hashtable sunt cuvinte [A-Za-z].

Un tablou nu poate conine duplicate.

Nu exist limitri pentru lungimea unui bucket.

Inserarea ntr-un tablou (bucket) se face la finalul acestuia.

Funcia de hash ce trebuie folosit (n ntreaga tem) este definit in hash.c. Nu poate fi folosita alt funcie.

Programul trebuie s execute comenzile n ordine, aa cum au fost primite citite din fiier(e).

Liniile goale din fiierul de intrare trebuie ignorate (programul nu face nimic i trece la linia urmtoare)

n fiiere se va scrie n modul append.

Dac dimensiunea hash-ului este impar (2k+1), dup njumtaire dimensiunea lui va fi k.

Lungimea hash-ului i a unui cuvnt vor fi reprezentate pe un numr pe 32 de bii (fr semn) .

irul vid nu este valid.

Dimensiunea hash-ului va fi ntotdeauna pozitiv.

Executabilul generat va purta numele tema1 pe Linux i tema1.exe pe Windows.

Dimensiunea maxim a unei comenzi (operaia i cuvntul asociat) este de 20000 de caractere.

Bufferul folosit pentru citirea comenzilor poate fi declarat cu dimensiune static.

Comportamentul dorit la resize este unul echivalent cu urmatorul: se creeaza un nou hash, se itereaza prin bucketurile din

vechiul hash si se adauga in noul hash.


Precizri VMChecker
Arhiva temei va fi ncrcat de doua ori pe vmchecker (Linux i Windows). Arhiva trimis trebuie s fie aceeai pe ambele platforme (se vor
compara cele dou trimise). Arhivele trebuie s conina sursele temei, README i dou fiiere Makefile care conin target-urile build i clean:

Fiierul Makefile de Linux se va numi GNUmakefile.

ATENIE: GNUmakefile (cu m mic).

Fiierul Makefile de Windows se va numi Makefile.


Executabilul rezultat din operaia de compilare i linking se va numi tema1.
Punctare

Tema va fi punctat cu minimul punctajelor obinute pe cele dou platforme. Nu avei voie s folosii directive de preprocesare

de forma:

#ifdef __linux__
[...]
#ifdef _WIN32
[...]

Nota mai poate fi modificat prin depunctri suplimentare:

Lista generala de depunctari

-0.1 diverse alte probleme constatate n implementare

-4 alocare static hash

Materiale ajuttoare

Arhiva cu funcia de hash.

Teste:

Linux

Windows

Referine:

ANSI C reference

Hash table

Maini virtuale:

Link (Important: folosii 7zip pentru dezarhivarea mainilor, este posibil s apar probleme cu alte programe de

dezarhivare)
FAQ

Q: Tema 1 se poate face n C++?

A: Nu.

Q: Valorile introduse n hastable sunt cuvinte [A-Za-z] - trebuie verificate cuvintele la introducere?

A: Nu.

Q: Se pot folosi directive de preprocesare de tipul #define?

A: Da.

Q: Pentru citire/scriere din fiier/consol putem folosi freopen?


A: Da, e ok. Putei folosi orice funcie din categoria fopen, fread, fwrite, fclose.

Lista de discuii

Pentru ntrebri sau nelmuriri legate de tem putei cuta, consulta sau trimite un mail pe lista de discuii (trebuie s fii nregistrai).

S-ar putea să vă placă și