Differences

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

Link to this comparison view

programare:teme_2018:tema2_2018_cbd [2018/10/06 11:36]
ioana.alexandru improved based on feedback
programare:teme_2018:tema2_2018_cbd [2018/12/10 10:56] (current)
ioana.alexandru [Informații]
Line 4: Line 4:
   * [[ioanaa.alexandru98@gmail.com|Ioana Alexandru]]   * [[ioanaa.alexandru98@gmail.com|Ioana Alexandru]]
   * [[oana.balan@cs.pub.ro|Oana Bălan]]   * [[oana.balan@cs.pub.ro|Oana Bălan]]
- 
- 
 ====== Informații ====== ====== Informații ======
-  * Data publicare: ​**TODO** +  * Data publicare: ​17 Noiembrie 2018 
-  * Deadline Soft: **TODO** +  * Deadline Soft: 11 Decembrie 2018 (23:55) 
-  * Deadline Hard: **TODO**+  * Deadline Hard: 16 Decembrie 2018 (23:55) 
 +  <​note>​Update 10 Decembrie 8:55 - Deadline soft extins cu o zi.</​note>​
  
-<​hidden>​ 
 ====== Obiective ====== ====== Obiective ======
  
Line 23: Line 21:
  
 ====== Cerință ====== ====== Cerință ======
- 
-//**TODO:** Schelet de cod cu citirea/​scrierea din/în fișier (din care rezultă o matrice de caractere care corespunde fișierului text citit + nr de linii ca să se poată folosi de el)  și a argumentelor din linia de comandă + Makefile// 
  
 Maria vrea ca programul ei să primească trei argumente în linia de comandă. Primul argument reprezintă un șir de caractere care indică operațiile pe care dorește să le aplice textului dintr-un fișier (separate prin virgulă), al doilea argument este calea către fișierul respectiv, iar al treilea argument este numele fișierului formatat care va fi generat. Maria vrea ca programul ei să primească trei argumente în linia de comandă. Primul argument reprezintă un șir de caractere care indică operațiile pe care dorește să le aplice textului dintr-un fișier (separate prin virgulă), al doilea argument este calea către fișierul respectiv, iar al treilea argument este numele fișierului formatat care va fi generat.
 +
 +Puteți porni de la scheletul de cod de {{:​programare:​teme_2018:​schelet_tema2.zip|aici}},​ care face citirea și scrierea în/din fișier pentru voi. Fișierul Makefile inclus conține regulile ''​build'',​ ''​clean''​ și ''​run''​. Pentru a da argumente regulii ''​run'',​ formatul este conform exemplului următor:
 +<​code=bash>​make run ARGS='"​W 50, C 0 0, L1" in.txt out.txt'</​code>​
  
 <​note>​Exemplu de rulare: <​note>​Exemplu de rulare:
Line 40: Line 39:
 </​note>​ </​note>​
  
-Maria știe că fișierele pe care le va formata nu vor avea niciodată mai mult de 1.000 de linii sau mai mult de 10.000 de caractere pe o singură linie.+Maria știe că fișierele pe care le va formata nu vor avea niciodată mai mult de 1.000 de linii sau mai mult de 1.000 de caractere pe o singură linie.
  
-În șirul de caractere care indică operațiile,​ pot exista oricâte spații între operații și parametri. Acestea nu influențează operațiile. În plus, primul caracter din operație (care diferă în funcție de tipul operației) poate fi atât //​lowercase//,​ cât și //​uppercase//,​ având aceeași semnificație.+În șirul de caractere care indică operațiile ​(îl vom numi "​comandă"​), pot exista oricâte spații între operații și parametri. Acestea nu influențează operațiile. În plus, primul caracter din operație (care diferă în funcție de tipul operației) poate fi atât //​lowercase//,​ cât și //​uppercase//,​ având aceeași semnificație. O comandă nu ar trebui să aibă mai mult de 10 operații, iar o operație validă nu are mai mult de 20 de caractere (cu tot cu spații).
  
 <note tip>În notația formatului operațiilor următoare, parametrii opționali sunt înconjurați de paranteze pătrate, similar cu formatul operațiilor descrise în [[https://​en.wikipedia.org/​wiki/​Man_page|manpage]]. <note tip>În notația formatului operațiilor următoare, parametrii opționali sunt înconjurați de paranteze pătrate, similar cu formatul operațiilor descrise în [[https://​en.wikipedia.org/​wiki/​Man_page|manpage]].
Line 52: Line 51:
 <​code=bash>​W max_line_length</​code>​ <​code=bash>​W max_line_length</​code>​
  
-Operația //wrap// adaugă și elimină caractere //newline// din text astfel încât textul să se încadreze în ''​max_line_length''​ (să aibă lungimea mai mică sau egală), fără a permite linii prea scurte (în afara ultimei linii dintr-un paragraf) și fără a trunchia cuvintele. O linie este prea scurtă dacă primul cuvânt din linia următoare ar fi încăput în ea fără să depășească ''​max_line_length''​.+Operația //wrap// adaugă și elimină caractere //newline// din text astfel încât textul să se încadreze în ''​max_line_length''​ (să aibă lungimea ​- în octeți - mai mică sau egală), fără a permite linii prea scurte (în afara ultimei linii dintr-un paragraf) și fără a trunchia cuvintele. O linie este prea scurtă dacă primul cuvânt din linia următoare ar fi încăput în ea fără să depășească ''​max_line_length''​
 + 
 +Atunci când două linii ''​l1''​ și ''​l2''​ sunt concatenate în urma unei operații //wrap//, rezultatul obținut va fi ''"​l1` l2`"''​ unde ''​l1`''​ este ''​l1''​ fără //trailing whitespace//,​ iar ''​l2`''​ este ''​l2''​ fără //starting whitespace//​.
  
 <note tip>Un **cuvânt** este orice grupare de caractere încadrată de //​whitespace//​ (spațiu, tab, newline). Spre exemplu, într-un text dat, "​după-amiază"​ va fi considerat un singur cuvânt și nu va fi trunchiat.</​note>​ <note tip>Un **cuvânt** este orice grupare de caractere încadrată de //​whitespace//​ (spațiu, tab, newline). Spre exemplu, într-un text dat, "​după-amiază"​ va fi considerat un singur cuvânt și nu va fi trunchiat.</​note>​
  
 <​note>​Fie următoarele fișiere de intrare pe care se aplică operația ''​W 60'':​ <​note>​Fie următoarele fișiere de intrare pe care se aplică operația ''​W 60'':​
-<file txt in1.txt> +<file txt in1.txt>​Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer elementum, ipsum sit amet vulputate semper, orci justo condimentum
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer elementum, ipsum sit amet vulputate semper, orci justo condimentum+
 felis, eu lobortis metus quam ac mauris. Mauris sed pharetra leo. Morbi mollis nunc eu velit tincidunt ullamcorper. Vestibulum finibus tellus ac lobortis porttitor. Integer a lacus nisi. Morbi mauris massa, aliquam sed eros in, fringilla accumsan neque. Quisque blandit lobortis purus vitae gravida. felis, eu lobortis metus quam ac mauris. Mauris sed pharetra leo. Morbi mollis nunc eu velit tincidunt ullamcorper. Vestibulum finibus tellus ac lobortis porttitor. Integer a lacus nisi. Morbi mauris massa, aliquam sed eros in, fringilla accumsan neque. Quisque blandit lobortis purus vitae gravida.
  
-Morbi sit amet euismod leo. Quisque in hendrerit turpis, ac fringilla ante. Sed id mi bibendum, scelerisque arcu vel, rutrum nibh. +Morbi sit amet euismod leo. Quisque in hendrerit turpis, ac fringilla ante. Sed id mi bibendum, scelerisque arcu vel, rutrum nibh.</​file>​
-</​file>​+
 <file txt in2.txt> <file txt in2.txt>
 Lorem ipsum dolor sit amet, Lorem ipsum dolor sit amet,
Line 92: Line 91:
 justo condimentum felis, eu lobortis metus quam ac mauris. justo condimentum felis, eu lobortis metus quam ac mauris.
 Mauris sed pharetra leo. Morbi mollis nunc eu velit Mauris sed pharetra leo. Morbi mollis nunc eu velit
-tincidunt ullamcorper. Vestibulum finibus tellus ac +tincidunt ullamcorper. Vestibulum finibus tellus ac lobortis 
-lobortis porttitor. Integer a lacus nisi. Morbi mauris +porttitor. Integer a lacus nisi. Morbi mauris massa, aliquam 
-massa, aliquam sed eros in, fringilla accumsan neque. +sed eros in, fringilla accumsan neque. Quisque blandit 
-Quisque blandit lobortis purus vitae gravida.+lobortis purus vitae gravida.
  
 Morbi sit amet euismod leo. Quisque in hendrerit turpis, ac Morbi sit amet euismod leo. Quisque in hendrerit turpis, ac
Line 109: Line 108:
 <​code=bash>​C [start_line [end_line]]</​code>​ <​code=bash>​C [start_line [end_line]]</​code>​
  
-Operația //center// folosește ca referință cea mai lungă linie din fișier și adaugă spații la începutul liniilor care sunt mai scurte pentru a le centra.+Operația //center// folosește ca referință cea mai lungă linie din fișier ​(fără //trailing whitespace//​) ​și adaugă spații la începutul liniilor care sunt mai scurte pentru a le centra.
  
 <​note>​Fie dat următorul fișier de intrare pe care se aplică operația ''​C'':​ <​note>​Fie dat următorul fișier de intrare pe care se aplică operația ''​C'':​
Line 129: Line 128:
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer
 elementum, ipsum sit amet vulputate semper, orci justo condimentum elementum, ipsum sit amet vulputate semper, orci justo condimentum
-felis, eu lobortis metus quam ac mauris. Mauris sed pharetra leo.+ felis, eu lobortis metus quam ac mauris. Mauris sed pharetra leo.
    Morbi mollis nunc eu velit tincidunt ullamcorper. Vestibulum    Morbi mollis nunc eu velit tincidunt ullamcorper. Vestibulum
  ​finibus tellus ac lobortis porttitor. Integer a lacus nisi. Morbi  ​finibus tellus ac lobortis porttitor. Integer a lacus nisi. Morbi
Line 169: Line 168:
 <​code=bash>​R [start_line [end_line]]</​code>​ <​code=bash>​R [start_line [end_line]]</​code>​
  
-Operația //align right// folosește ca referință cea mai lungă linie din fișier și adaugă spații la începutul liniilor care sunt mai scurte pentru a le alinia la marginea din dreapta.+Operația //align right// folosește ca referință cea mai lungă linie din fișier ​(fără //trailing whitespace//​) ​și adaugă spații la începutul liniilor care sunt mai scurte pentru a le alinia la marginea din dreapta.
  
 <​note>​Fie dat următorul fișier de intrare pe care se aplică operația ''​R'':​ <​note>​Fie dat următorul fișier de intrare pe care se aplică operația ''​R'':​
Line 209: Line 208:
 Quisque blandit lobortis purus vitae gravida. Quisque blandit lobortis purus vitae gravida.
  
-Morbi sit amet euismod leo. Quisque in hendrerit turpis, ac+    ​Morbi sit amet euismod leo. Quisque in hendrerit turpis, ac
 fringilla ante. Sed id mi bibendum, scelerisque arcu vel, fringilla ante. Sed id mi bibendum, scelerisque arcu vel,
 rutrum nibh. rutrum nibh.
Line 242: Line 241:
 <​code=bash>​P indent_length [start_line [end_line]]</​code>​ <​code=bash>​P indent_length [start_line [end_line]]</​code>​
  
-Această operație realizează indentarea automată a paragrafelor din intervalul precizat, cu ''​indent_length''​ spații. Se va indenta doar prima linie din fiecare paragraf.+Această operație realizează indentarea automată a paragrafelor din intervalul precizat ​(dacă există), cu ''​indent_length''​ spații ​(maxim 8). Se va indenta doar prima linie din fiecare paragraf.
  
-<note tip>Un paragraf nou este marcat prin două caractere newline ("​\n\n"​).</​note>​+<note tip>Un paragraf nou este marcat prin două sau mai multe caractere newline ("​\n\n"​).</​note>​
  
 <​note>​Fie dat următorul fișier de intrare pe care se aplică operația ''​P 4'':​ <​note>​Fie dat următorul fișier de intrare pe care se aplică operația ''​P 4'':​
Line 272: Line 271:
 ===== Liste ===== ===== Liste =====
  
-<​code=bash>​I list_type special_character [start_line end_line]</​code>​+<​code=bash>​I list_type special_character [start_line ​[end_line]]</​code>​
  
-Această operație formatează liniile corespunzătoare ca pe o listă a cărei **indici** sunt definiți în funcție de parametrii ''​list_type''​ și ''​special_character''​.+Această operație formatează liniile corespunzătoare ca pe o listă ​(aliniată la stânga) ​a cărei **indici** sunt definiți în funcție de parametrii ''​list_type''​ și ''​special_character''​.
  
 Parametrul ''​list_type''​ indică tipul listei: Parametrul ''​list_type''​ indică tipul listei:
Line 333: Line 332:
 ===== Liste ordonate ===== ===== Liste ordonate =====
  
-<​code=bash>​O list_type special_character ordering [start_line end_line]</​code>​+<​code=bash>​O list_type special_character ordering [start_line ​[end_line]]</​code>​
  
 Această operație funcționează exact la fel ca operația precedentă ''​I''​ (formatează liniile corespunzătoare ca pe o listă a cărei **indici** sunt definiți în funcție de parametrii ''​list_type''​ și ''​special_character''​),​ dar în plus face și ordonarea alfabetică a elementelor din listă. Această operație funcționează exact la fel ca operația precedentă ''​I''​ (formatează liniile corespunzătoare ca pe o listă a cărei **indici** sunt definiți în funcție de parametrii ''​list_type''​ și ''​special_character''​),​ dar în plus face și ordonarea alfabetică a elementelor din listă.
Line 363: Line 362:
 7. Tina 7. Tina
 </​file>​ </​file>​
-<​code>​b - z</​code>​+<​code>​b - z</​code>​
 <file txt out.txt> <file txt out.txt>
 - Tina - Tina
Line 380: Line 379:
   * Dacă parametrul ''​end_line''​ este mai mare decât numărul de linii din fișier, dar parametrul ''​start_line''​ este valid, se va efectua operația de la ''​start_line''​ până la sfârșitul fișierului (ca și cum ''​end_line''​ nu ar fi fost precizat).   * Dacă parametrul ''​end_line''​ este mai mare decât numărul de linii din fișier, dar parametrul ''​start_line''​ este valid, se va efectua operația de la ''​start_line''​ până la sfârșitul fișierului (ca și cum ''​end_line''​ nu ar fi fost precizat).
   * Dacă valoarea parametrului ''​max_line_length''​ de la operația //wrap// este mai mică decât lungimea celui mai lung cuvânt din fișierul inițial, se va afișa la ''​stdout''​ mesajul **"​Cannot wrap!"​**,​ iar fișierul obținut va fi identic cu fișierul inițial.   * Dacă valoarea parametrului ''​max_line_length''​ de la operația //wrap// este mai mică decât lungimea celui mai lung cuvânt din fișierul inițial, se va afișa la ''​stdout''​ mesajul **"​Cannot wrap!"​**,​ iar fișierul obținut va fi identic cu fișierul inițial.
-  * Dacă unul sau mai mulți parametri nu are tipul corect sau are o valoare invalidă (spre exemplu ''​list_type''​ cu o altă valoare decât cele precizate)o operație invalidă este folosită ​sau un număr incorect de parametri este precizat pentru o operație, se va afișa ​la ''​stdout'' ​mesajul **"​Invalid operation!"​**,​ iar fișierul obținut va fi identic cu fișierul inițial.+  * În cazul în care comanda conține mai mult de 10 operații, se va afișa la ''​stdout''​ mesajul **"Too many operations! Only the first 10 will be applied."​**,​ iar fișierul obținut va avea aplicate doar primele 10 operații din comandă
 +  * Se va afișa la ''​stdout''​ mesajul **"​Invalid operation!"​**,​ iar fișierul obținut va fi identic cu fișierul inițial, dacă: 
 +    * unul sau mai mulți parametri nu are tipul corect sau are o valoare invalidă (spre exemplu ''​list_type''​ cu o altă valoare decât cele precizate)
 +    * o operație invalidă este folosită ​(operațiile valide sunt ''​W'',​ ''​C'',​ ''​L'',​ ''​R'',​ ''​J'',​ ''​P'',​ ''​I'',​ ''​O''​ și au maximum 20 de caractere);​ 
 +    * un număr incorect de parametri este precizat pentru o operație ​(atenție ​la parametrii opționali);​ 
 +    * parametrul ​''​start_line''​ este mai mare ca parametrul ''​end_line''​.
  
 <note tip> <note tip>
   * Parametri de tip **întreg**:​ ''​max_line_length'',​ ''​start_line'',​ ''​end_line'',​ ''​indent_length''​   * Parametri de tip **întreg**:​ ''​max_line_length'',​ ''​start_line'',​ ''​end_line'',​ ''​indent_length''​
-  * Parametri de tip **caracter**:​ ''​list_type'',​ ''​special_character''​+  * Parametri de tip **caracter**:​ ''​list_type'',​ ''​special_character'',​ ''​ordering''​
 </​note>​ </​note>​
  
 ====== Punctaj ====== ====== Punctaj ======
-  * **[40p]** Wrap text+  * **[30p]** Wrap text
   * **[5p]** Center   * **[5p]** Center
   * **[5p]** Align left   * **[5p]** Align left
   * **[5p]** Align right   * **[5p]** Align right
-  * **[20p]** Justify (bonus)+  * **[30p]** Justify (bonus)
   * **[5p]** Paragrafe   * **[5p]** Paragrafe
   * **[10p]** Liste   * **[10p]** Liste
-  * **[15p]** Liste ordonate +  * **[20p]** Liste ordonate 
-  * **[40p]** Operații combinate+  * **[45p]** Operații combinate
   * **[15p]** Tratarea operațiilor invalide   * **[15p]** Tratarea operațiilor invalide
   * **[10p]** README și [[programare:​coding-style|Coding Style]].   * **[10p]** README și [[programare:​coding-style|Coding Style]].
  
-TOTAL: **170p**+TOTAL: **180p**
  
 ====== Trimitere temă ====== ====== Trimitere temă ======
  
 Tema va fi trimisă folosind [[https://​vmchecker.cs.pub.ro|vmchecker]],​ cursul **Programarea Calculatoarelor (CB & CD)**. \\ Tema va fi trimisă folosind [[https://​vmchecker.cs.pub.ro|vmchecker]],​ cursul **Programarea Calculatoarelor (CB & CD)**. \\
-Găsiți checker-ul {{:​programare:​teme_2018:​2-format-text.zip|TODO}}. +Găsiți checker-ul {{:​programare:​teme_2018:​tema2_cb.zip|aici}}.
  
 +<note warning>
 +**Atenție!** Checker-ul verifică atât fișierul obținut, cât și ''​stdout''​. Nu trebuie să afișați nimic la ''​stdout'',​ în afară de cele 3 mesaje de eroare precizate în secțiunea [[https://​ocw.cs.pub.ro/​courses/​programare/​teme_2018/​tema2_2018_cbd#​tratarea-cazurilor-speciale|Tratarea cazurilor speciale]].
 +</​note>​
  
 Formatul arhivei va fi următorul: Formatul arhivei va fi următorul:
Line 415: Line 422:
  - **clean**: șterge fișierele obiect/​executabile create.  - **clean**: șterge fișierele obiect/​executabile create.
  - Un fișier [[https://​en.wikipedia.org/​wiki/​README|README]] în care vă descrieți rezolvarea temei.  - Un fișier [[https://​en.wikipedia.org/​wiki/​README|README]] în care vă descrieți rezolvarea temei.
-<note tip>Este necesară scrierea numelui ​si a grupei atât în fișierul README, cât și în toate fișierele sursă pe care le adăugați în arhiva temei.</​note>​+<note tip>Este necesară scrierea numelui ​și a grupei atât în fișierul README, cât și în toate fișierele sursă pe care le adăugați în arhiva temei.</​note>​
 ====== Observații ====== ====== Observații ======
   * Nu folosiți variabile globale.   * Nu folosiți variabile globale.
   * Fiți consistenți în ceea ce privește [[programare:​coding-style|Coding Style-ul]].   * Fiți consistenți în ceea ce privește [[programare:​coding-style|Coding Style-ul]].
   * Nu este nevoie să folosiți alocare dinamică.   * Nu este nevoie să folosiți alocare dinamică.
-  * Fișierele obținute nu trebuie să conțină [[https://​blog.codinghorror.com/​whitespace-the-silent-killer/​|trailing whitespace]].+  * Fișierele obținute nu trebuie să conțină [[https://​blog.codinghorror.com/​whitespace-the-silent-killer/​|trailing whitespace]] ​(cu excepția situației în care aveți o operație invalidă). În urma unei operații goale (''""''​),​ fișierul obținut va avea același conținut ca cel inițial, dar nu va conține trailing whitespace.
  
-====== Listă depunctări ======+====== Listă depunctări ​(neexhaustivă) ​======
   * o temă care nu compilează și nu a rulat pe **vmchecker** nu va fi luată în considerare   * o temă care nu compilează și nu a rulat pe **vmchecker** nu va fi luată în considerare
   * o temă care nu rezolvă cerința și trece testele prin alte mijloace nu va fi luată în considerare   * o temă care nu rezolvă cerința și trece testele prin alte mijloace nu va fi luată în considerare
Line 428: Line 435:
   * [-1.0]: numele variabilelor nu sunt sugestive   * [-1.0]: numele variabilelor nu sunt sugestive
   * [-1.0]: linii mai lungi de 80 de caractere   * [-1.0]: linii mai lungi de 80 de caractere
 +  * [-1.0]: cod nemodular, funcții prea lungi (inclusiv main)
   * [-5.0]: abordare ineficientă   * [-5.0]: abordare ineficientă
     * în cadrul cursului de programare nu avem ca obiectiv rezolvarea în cel mai eficient mod posibil a programelor;​ totuși, ne dorim ca abordarea să nu fie una ineficientă,​ de genul să nu folosiți instrucțiuni repetitive acolo unde clar era cazul, etc.     * în cadrul cursului de programare nu avem ca obiectiv rezolvarea în cel mai eficient mod posibil a programelor;​ totuși, ne dorim ca abordarea să nu fie una ineficientă,​ de genul să nu folosiți instrucțiuni repetitive acolo unde clar era cazul, etc.
Line 435: Line 443:
   * [[http://​pubs.opengroup.org/​onlinepubs/​009695399/​basedefs/​string.h.html|Biblioteca string.h]]   * [[http://​pubs.opengroup.org/​onlinepubs/​009695399/​basedefs/​string.h.html|Biblioteca string.h]]
  
-</​hidden>​ 
programare/teme_2018/tema2_2018_cbd.1538814960.txt.gz · Last modified: 2018/10/06 11:36 by ioana.alexandru
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