Tema 3

Responsabili:

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

Deadline soft: 11 mai, ora 23:55

Deadline hard: 14 mai, ora 23:55

Modificari si actualizari

  • 27 aprilie: a fost modificat example.json si exemplul de input/output
  • 27 aprilie: au fost publicate testele
  • 28 aprilie: a fost uploadat checkerul
  • 3 mai: s-au adaugat explicatii ale mesajelor de eroare
  • 3 mai: a fost uploadata o noua versiune de teste
  • 8 mai: amanare deadline

Obiective

În urma realizării acestei teme studentul:

  • va fi capabil să implementeze și să foloseasca un hashtable
  • isi va îmbunatați abilitatea de lucru cu liste
  • va folosi structurile de date pentru a implementa o posibilia aplicatie reala

Odata cu explozia internetului din ziua de azi a crescut, inevitabil, si gradul de risc la care un utilizator este expus in activitatea de zi cu zi. Pentru o detectie cat mai completa a numeroaselor tipuri de atacuri cibernetice, compania la care tocmai ati fost angajati va pune la dispozitie un set de date (in format JSON) ce contine statistici despre pagini web posibil”suspecte” (de exemplu: cu fisiere executabile infectate, cunoscute pentru fishing, continut ilegal sau potential daunator, etc.)

Generic numite “event-uri”, aceste date sunt stocate de catre Bitdefender intr-un depozit propriu, numit Event Correlation (EC). Pentru ca aceste inregistrari sa cuprinda o gama cat mai variata si actualizata de activitati ilegale (in vederea detectiei si preventiei) compania dispune de niste masini virtuale, numite HoneyPots (vulnerabile intentionat la atacuri) si raspandinte in diverse puncte geografice pe glob, care sa atraga in capcana hackeri si sa culeaga date despre activitatea lor: ce pagini acceseaza de pe honeypot-ul pe care tocmai (cred ca) l-au compromis, ce tipuri de atacuri initiaza, ce fisiere folosesc pentru aceasta, etc.

Cerinta

Se cere implementarea unei structuri de date care sa eficientizeze interogarea si manipularea obiectelor de tip JSON.

JSON este un acronim în limba engleza pentru JavaScript Object Notation, si este un format de reprezentare si interschimb de date intre aplicatii informatice. Este un format text, inteligibil pentru oameni, utilizat pentru reprezentarea obiectelor si a altor structuri de date si este folosit in special pentru a transmite date structurate prin retea, procesul purtand numele de serializare. JSON este alternativa mai simpla, mai facila decat limbajul XML. Eleganta formatului JSON provine din faptul ca este un subset al limbajului JavaScript (ECMA-262 3rd Edition), fiind utilizat alaturi de acest limbaj. Formatul JSON a fost creat de Douglas Crockford si standardizat prin RFC 4627.

Exemplu de obiect JSON:

example.json
[
  {
    "firstName": "John",
    "lastName": "Smith",
    "isAlive": true,
    "age": 25,
    "address": {
      "streetAddress": "21 2nd Street",
      "city": "New York",
      "state": "NY",
      "postalCode": "10021-3100"
    },
    "phoneNumbers": [
      {
        "type": "home",
        "number": "212 555-1234"
      },
      {
        "type": "office",
        "number": "646 555-4567"
      }
    ],
    "children": [ ],
    "spouse": null
  }
]

Tipurile de baza pentru obiectele JSON sunt:

  • JSON_ARRAY: vector cu 0 sau mai multe objects
  • JSON_OBJECT: colectie de perechi cheie:valoare unde cheia este de tip string (unica in cadrul object-ului) iar valoarea poate fi de orice tip
  • JSON_STRING: secventa de 0 sau mai multe caractere ASCII
  • JSON_BOOL: true sau false
  • JSON_NUMBER: intreg
  • JSON_NULL: valoare nula, reprezentata de cuvantul null

Operatii

Operatiile pe care structura voastra de date trebuie sa le efectueze sunt:

  • get(succesiune_chei): afiseaza valoarea ultimei chei din succesiunea de chei
  • put(succesiune_chei, valoare): adauga/modifica perechea ultima_cheie:valoare
  • del(succesiune_chei): sterge perechea ultima_cheie:valoare

Operatiile pot esua cu urmatoarele mesaje de eroare, urmate de valoarea cheii la care au esuat:

  • ERROR_NOT_ARRAY: se cere un index de la o cheie care nu reprezinta un JSON_ARRAY
  • ERROR_NOT_OBJECT: se cere o cheie de la o cheie care nu reprezinta un JSON_OBJECT
  • ERROR_INDEX_OUT_OF_RANGE: se cere un index de la o cheie care reprezinta un JSON_ARRAY cu un numar mai mic de intrari decat index-ul cerut
  • KEY_NOT_FOUND: cheia cautata nu a fost gasita

Fiecare mesaj de eroare este precedat de numele operatiei la care a aparut eroarea.

Pentru a observa comportamentul operatiilor de mai sus, urmariti exemplul de input/output.

Exemplu input/output

Operatiile de mai jos sunt efectuate asupra JSON-ului din example.json

input
GET
GET 0
GET 0 "firstName"
GET 0 "age"
GET 0 "isAlive"
GET 0 "spouse"
GET 0 "notAKey"
GET 0 "address" "city"
GET 0 "address" "notAKey"
GET 0 "notAKey1" "notAKey2"
GET 0 "spouse" 0
GET 0 "phoneNumbers" 0
GET 0 "phoneNumbers" 0 "type"
GET 0 "children"
GET 0 "children" 0
PUT "aKey" "aValue"
PUT 0 "aKey" "aValue"
GET 0 "aKey"
PUT 0 "address" null
GET 0 "address" "city"
GET 0 "address"
PUT 0 "spouse" "Jessica"
GET 0 "spouse"
PUT 0 "phoneNumbers" 1 "type" "mobile"
GET 0 "phoneNumbers" 1 "type"
PUT 0 "children" 0 "name" "John Snow"
DEL 0 "firstName"
GET 0 "firstName"
DEL 0 "notAkey"
DEL 1 "firstName"
GET 0 "phoneNumbers" 0 "number"
DEL 0 "phoneNumbers" 0
GET 0 "phoneNumbers" 0 "number"
DEL 0 "spouse"
DEL 0 "address"
GET 0 "address" "city"
output
JSON_ARRAY
JSON_OBJECT
"John"
25
true
null
GET_KEY_NOT_FOUND "notAKey"
"New York"
GET_KEY_NOT_FOUND "notAKey"
GET_KEY_NOT_FOUND "notAKey1"
GET_ERROR_NOT_ARRAY "spouse"
JSON_OBJECT
"home"
JSON_ARRAY
GET_ERROR_INDEX_OUT_OF_RANGE "children"
PUT_ERROR_NOT_OBJECT root
"aValue"
GET_ERROR_NOT_OBJECT "address"
null
"Jessica"
"mobile"
PUT_ERROR_INDEX_OUT_OF_RANGE "children"
GET_KEY_NOT_FOUND "firstName"
DEL_INDEX_OUT_OF_RANGE root
"212 555-1234"
"646 555-4567"
GET_KEY_NOT_FOUND "address"

Precizari

Fisierele de test cu obiectele JSON sunt valide, nu este nevoie sa faceti verificari suplimentare.

Indicatii de implementare

Executabilul vostru se va numi tema3 si va primi exact 3 parametri: fisierul ce contine obiectul JSON, fisierul de input si fisierul de output.

Teste publice

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ă:

  • sursele voastre
  • Makefile
  • fisier README care să conțină detalii despre implementarea temei

Punctaj

  • 90 puncte obținute pe testele de pe vmchecker
  • 10 puncte: README + alte eventuale penalizări
  • Bonus 10 puncte pentru soluțiile ce nu au memory leak-uri.
  • TOTAL: 100 puncte (+10 bonus)

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

sau

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 temele incepand de la prima si aceasta inclusiv. Heed my warning!

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

FAQ

Q: Se poate folosi STL?

A: Se poate folosi clasa string din STL. Folosirea oricărei alte clase din STL nu este permisă

sd-ca/2015/teme/tema03.txt · Last modified: 2016/02/22 22:48 by alexandru.olteanu
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