Differences

This shows you the differences between two versions of the page.

Link to this comparison view

so:teme:tema-0 [2013/02/20 15:25]
sergiu.costea [Punctare]
— (current)
Line 1: Line 1:
-====== Tema 0 HashTable ====== 
  
-<note important>​ 
-Termen de predare: **miercuri, 6 martie 2013, ora 23:59** 
- 
-Termen de predare hard: **miercuri, 20 martie 2013, ora 23:59** 
- 
-Punctaj: 
-  * **0.25** pentru o singură platformă 
-  * **0.5** pentru ambele platforme 
-</​note>​ 
- 
-===== Scopul temei ===== 
- 
-  *Recapitularea lucrului cu funcțiile ANSI C: 
-    *lucrul cu fișiere 
-    *alocare dinamică de memorie 
-  *Folosirea pointerilor 
- 
-===== Enunț ===== 
- 
-Să se implementeze ** în C ** o tabelă de dispersie (hashtable) ce va conține cuvinte. 
-Operațiile ce trebuie suportate de această tabelă sunt următoarele:​ 
-  *add <​cuvânt>​ // adauga cuvântul la hashtable (nu se permit dubluri) // 
-  *remove <​cuvânt>​ // șterge cuvântul din hashtable (nu e obligatoriu să existe cuvântul) // 
-  *clear // golește tabela // 
-  *find <​cuvânt>​ [<​fișier_ieșire>​]//​ caută cuvântul în hashtable -> scrie True sau False pe o linie nouă în fișierul specificat sau la consolă dacă acest parametru lipsește // 
-  *print_bucket <​index_bucket>​ [<​fișier_ieșire>​] // scrie cuvintele din bucketul respectiv, pe o singură linie și separate de spațiu în fișierul specificat sau la consolă dacă acest parametru lipsește, index_bucket este valid // 
-  *print [<​fișier_ieșire>​]//​ printeaza toate bucket-urile pe linii diferite, începând cu bucketul 0, în fișierul specificat sau la consolă dacă acest parametru lipsește // 
-  *resize double // dublează dimensiunea hash-ului (bucket-urile vor fi parcuse în ordine și cuvintele sunt redistribuite) // 
-  *resize halve // înjumătățește dimensiunea hash-ului (bucket-urile vor fi parcuse în ordine și cuvintele sunt redistribuite,​ // memoria în surplus va fi dealocată) 
-Aceste comenzi se vor regăsi una per linie. 
- 
-Programul va primi o serie de parametri: 
-  *Primul parametru este lungimea inițiala a hashului 
-  *Următorii parametri sunt opționali și reprezintă o listă de fișiere de intrare din care se face citirea. Dacă aceștia lipsesc citirea se face de la STDIN. Atenție, în cazul în care sunt specificate mai multe fișiere de intrare, toate operațiile se aplică **aceluiași** hash. 
- 
-Exemplu: 
- 
- 
-<​code>​ 
- ​./​tema0 256 hash1.in hash2.in 
- ​./​tema0 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 
-</​code>​ 
- 
-Hashtable-ul implementat va conține SIZE bucketuri. Fiecare bucket va conține cuvintele în ordinea în care ele au fost introduse. 
-Pentru operația de resize bucketurile vor fi parcurse în ordine și redistribuite. Cuvintele din bucket vor fi parcurse începând cu cel mai vechi și terminand cu cel mai recent. 
- 
-===== Precizări generale ===== 
- 
-  *Valorile introduse în hashtable sunt cuvinte [A-Za-z]. 
-  *Un tablou **nu** poate conține duplicate. 
-  *Nu există limitări pentru lungimea unui bucket sau a unui cuvânt. 
-  *Inserarea într-un tablou (bucket) se face la finalul acestuia. 
-  *Funcția de hash ce **trebuie** folosită (în întreaga temă) este definită in //hash.c//. Nu poate fi folosita altă funcție. 
-  *Programul trebuie să execute comenzile în ordine, așa cum au fost primite citite din fișier(e). 
-  *În fișiere se va scrie în modul append. 
-  *Dacă dimensiunea hash-ului este impară (2k+1), după înjumătațire dimensiunea lui va fi k. 
-  *Lungimea hash-ului și a unui cuvânt vor fi reprezentate pe un număr pe 32 de biți <​html>​ <span style="​color:​red;">​(fără semn)</​span>​ </​html>​. 
-  *Șirul vid nu este valid. 
-  *Dimensiunea hash-ului va fi întotdeauna pozitivă. 
-  *Executabilul generat va purta numele ''​**tema0**''​ pe Linux și ''​**tema0.exe**''​ pe Windows. 
-  *Dimensiunea maximă a unei comenzi (operația și cuvântul 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. 
- 
-===== Precizări VMChecker ===== 
- 
-Arhiva temei va fi încărcată de doua ori pe vmchecker (Linux și Windows). Arhiva trimisă trebuie să fie aceeași pe ambele platforme (se vor compara cele două trimise). 
-Arhivele trebuie să conțina sursele temei, ''​README''​ și două fișiere Makefile care conțin target-urile ''​build''​ și ''​clean'':​ 
-  *Fișierul Makefile de Linux se va numi ''​GNUmakefile''​. 
-    * **ATENȚIE**:​ GNU**m**akefile (cu ''​m''​ mic). 
-  *Fișierul Makefile de Windows se va numi ''​Makefile''​. 
-Executabilul rezultat din operația de compilare și linking se va numi ''​tema0''​. 
- 
-===== Punctare ===== 
-  *Tema va fi punctată cu maxim **0.25** puncte dacă aceasta compilează pe o platformă și cu **0.5** puncte dacă ea compilează pe ambele platforme, fără a folosi directive de preprocesare:​ 
-<code c> 
-#ifdef LINUX 
-[...] 
-#ifdef WIN32 
-[...] 
-</​code>​ 
-  *** Atenție ** Depunctarea pentru această temă este de 1 punct/zi. Depunctarea ** nu ** se oprește la nota 7 
- 
-Nota mai poate fi modificată prin depunctări suplimentare:​ 
-    *      [[http://​elf.cs.pub.ro/​so/​wiki/​teme/​general|Lista generala de depunctari]] 
-    *      ''​-0.1''​ diverse alte probleme constatate în implementare 
-    *      ''​-4''​ alocare statică hash 
- 
- 
-===== Materiale ajutătoare ===== 
- 
-  *[[http://​elf.cs.pub.ro/​so/​res/​teme/​tema0-util.zip | Arhiva]] cu funcția de hash. 
- 
-  *Teste: 
-    *[[http://​elf.cs.pub.ro/​so/​res/​teme/​tema0-checker-lin.zip | Linux]] 
-    *[[http://​elf.cs.pub.ro/​so/​res/​teme/​tema0-checker-win.zip | Windows]] 
- 
-  *Referințe:​ 
-    *[[http://​www.acm.uiuc.edu/​webmonkeys/​book/​c_guide/​ | ANSI C reference]] 
-    *[[http://​www.cs.auckland.ac.nz/​~jmor159/​PLDS210/​hash_tables.html | Hash table]] 
- 
-===== FAQ ===== 
- 
-  ***Q:** Tema 0 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 fișier/​consolă putem folosi freopen? 
-    ***A:** Da, e ok. Puteți folosi orice funcție din categoria fopen, fread, fwrite, fclose. 
-===== Lista de discuții ===== 
- 
-Pentru întrebări sau nelămuriri legate de temă puteți [[http://​elf.cs.pub.ro/​so/​wiki/​resurse/​lista-discutii| căuta]], [[http://​cursuri.cs.pub.ro/​pipermail/​so | consulta]] sau [[mailto:​so@cursuri.cs.pub.ro | trimite un mail pe]]  lista de discuții ​ (trebuie să fiți [[http://​cursuri.cs.pub.ro/​liste/​so | înregistrați]]). 
so/teme/tema-0.1361366703.txt.gz · Last modified: 2013/02/20 15:25 by sergiu.costea
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0