This shows you the differences between two versions of the page.
programare:teme_2018:tema2_2018_cbd [2018/10/06 17:11] ioana.alexandru tratarea cazurilor speciale |
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 42: | 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 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> | ||
Line 90: | 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 107: | 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 127: | 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 167: | 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 207: | 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 240: | 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 272: | 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 361: | Line 362: | ||
7. Tina | 7. Tina | ||
</file> | </file> | ||
- | <code>I b - z</code> | + | <code>O b - z</code> |
<file txt out.txt> | <file txt out.txt> | ||
- Tina | - Tina | ||
Line 378: | 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 397: | 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 407: | 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 417: | 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 430: | 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 437: | 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> |