Enunțul problemei dir, de clasa a 10-a, dată în 2007 la OJI, se găsește pe PbInfo, .campion și InfoArena.

Rezumat dir

Se consideră un disc ce conține mai multe foldere și fișiere. Un folder poate conține atât fișiere, cât și alte foldere. Folderele sunt scrise cu majuscule, iar fișierele cu minuscule, însă ambele tipuri de nume pot conține și cifre arabe. Ni se dă un șir de caractere ce reprezintă structura fișierelor de pe discul respectiv. Un folder este codificat astfel: NUME_FOLDER(listăDeFoldereȘiFișiere), unde lista conține elementele folder-ului separate prin virgulă. Desigur, subfolderele respectă aceeași regulă.

De exemplu, string-ul FOLDER1(FOLDER2(),FOLDER3(FOLDER4(poveste,basm),basm)) îi corespunde pozei de mai jos:

Structură de fișiere din problema dir

Pentru structura de fișiere dată, ni se cere afișarea în ordine lexicografică a căilor tuturor fișierelor de pe disc, precum și numărul lor. Fiecare nume de folder trebuie urmat de caracterul backslash.

Soluție dir

Vom evalua expresia, reținând pe o stivă numele folderelor ce constituie calea curentă. Pentru fiecare nou fișier găsit, formăm un șir de caractere ce reprezintă calea lui, folosind conținutul stivei și numele fișierului. Adăugăm acest string într-un vector pe care la final îl vom sorta, pentru a-i putea afișa elementele în ordinea cerută.

Am ales să creez un struct Str pentru șirurile de caractere, ce conține doar un vector de tip char, și să supraîncarc operatorul <. Asta ca să pot sorta vectorul de șiruri la final. În rest, am aplicat o tehnică folosită și în problema reteta. Am ținut o copie a șirului str în aux, și am aplicat strtok pe copie, delimitând numele de fișiere și de foldere de restul codificării. Apoi, am parcurs șirul str ca la orice altă problemă de evaluare de expresii, și când am găsit un început de nume, am adăugat valoarea din aux pe stivă, trecând la următorul separator.

Sursă C++ dir

Dacă ai vreo nedumerire cu privire la problema dir, lasă un comentariu și te voi ajuta 🙂

Îți place conținutul acestui site?

Dacă vrei să mă susții în întreținerea server-ului și în a scrie mai multe articole de calitate pe acest blog, mă poți ajuta printr-o mică donație. Află aici cum o poți face!