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 18:26]
ioana.alexandru schelet de cod
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 43: Line 41:
 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. 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 53: 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>​
Line 91: 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 108: 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 128: 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 168: 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 208: 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 241: 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 (dacă există), 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 273: Line 273:
 <​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 362: 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 379: 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.
 +  * Î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ă:   * 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);     * 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''​);​+    * 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);​     * 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''​.     * parametrul ''​start_line''​ este mai mare ca parametrul ''​end_line''​.
Line 398: Line 399:
   * **[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]].
Line 408: Line 409:
  
 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 418: 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 431: 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 438: 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.1538839575.txt.gz · Last modified: 2018/10/06 18:26 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