Differences

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

Link to this comparison view

programare:laboratoare:lab07 [2018/11/07 18:06]
darius.neatu [Exerciții]
programare:laboratoare:lab07 [2022/04/01 11:35] (current)
cristian.olaru1612
Line 3: Line 3:
  
 **Responsabili:​** **Responsabili:​**
-  * [[neatudarius@gmail.com|Darius Neațu (2018, 2017)]]+  * [[neatudarius@gmail.com|Darius Neațu (CA 2019-2021)]] 
 +  * [[ion_dorinel.filip@cti.pub.ro|Dorinel Filip (CA 2019-2021)]]
   * [[rares96cheseli@gmail.com|Rareș Cheșeli (2018, 2017)]] ​   * [[rares96cheseli@gmail.com|Rareș Cheșeli (2018, 2017)]] ​
  
Line 540: Line 541:
  
 <​note>​ <​note>​
 +Există un [[https://​ocw.cs.pub.ro/​courses/​programare/​laboratoare/​lab07-bitset-example | exemplu]] detaliat care vă explică cum functionează aceastea.
 +
 Treceți la subpunctul următor abia după ce v-ați asigurat că acestea funcționează. Treceți la subpunctul următor abia după ce v-ați asigurat că acestea funcționează.
- 
- 
-<spoiler Hint> 
-Folosiți funcțiile **set, reset, is_set ** definite în ** prima ** parte a laboratorului care operează asupra unui **byte**. 
- 
-Implementați funcțiile din enunț în ordinea sugerată. 
-</​spoiler>​ 
- 
 </​note>​ </​note>​
- 
  
       * **adăugarea** unui element în mulțime       * **adăugarea** unui element în mulțime
Line 603: Line 597:
       </​code>​       </​code>​
       ​       ​
-Urmăriți ​exemplul următor pentru a înțele cum funcționează aceste operații. ​      +Urmăriți ​acest [[https://ocw.cs.pub.ro/courses/programare/laboratoare/lab07-bitset-example | exemplu cu bitset]]  ​pentru ​înțele cum funcționeazăaceste ​operații.      ​
- +
-<spoiler Exemplu>​ +
-=== Codificare ===  +
-Presupunem că avem vectorul ** unsigned char s[3]; **. s[0], s[1], s[2] fiecare reprezintă câte o variabilă pe 8 biți pe care initial ii setam pe 0. +
- +
- +
-^  ^     ​^ ​    ​^ ​    ​^ ​  ​s[0] ​ ^     ​^ ​    ​^ ​    ​^ ​    ​^ ​ |   ​^ ​    ​^ ​    ​^ ​    ^ s[1]    ^     ​^ ​    ​^ ​    ​^ ​    ​^ ​  ​| ​ ^     ​^ ​    ​^ ​    ^ s[2]    ^     ​^ ​    ​^ ​    ​^ ​    ^ +
-^ ^$b_7$^$b_ 6$^$b_5$^$b_4$^$b_3$^$b_2$^$b_1$^$b_0$^ ​ |   ^ $b_7$^$b_6$^$b_5$^$b_4$^$b_3$^$b_2$^$b_1$^$b_0$^ ​ |   ^ $b_7$^$b_6$^$b_5$^$b_4$^$b_3$^$b_2$^$b_1$^$b_0$^ +
-^ biti din S ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^  |  ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^    |   ^ 0    ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^ +
- +
-În plus facem următoarea asociere: +
- +
-^  ^     ​^ ​    ​^ ​    ​^ ​  ​s[0] ​ ^     ​^ ​    ​^ ​    ​^ ​    ​^ ​ |   ​^ ​    ​^ ​    ​^ ​    ^ s[1]    ^     ​^ ​    ​^ ​    ​^ ​    ​^ ​  ​| ​ ^     ​^ ​    ​^ ​    ^ s[2]    ^     ​^ ​    ​^ ​    ​^ ​    ^ +
-^ ^$b_7$^$b_ 6$^$b_5$^$b_4$^$b_3$^$b_2$^$b_1$^$b_0$^ ​ |   ^ $b_7$^$b_6$^$b_5$^$b_4$^$b_3$^$b_2$^$b_1$^$b_0$^ ​ |   ^ $b_7$^$b_6$^$b_5$^$b_4$^$b_3$^$b_2$^$b_1$^$b_0$^ +
-^ biti din S ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^  |  ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^    |   ^ 0    ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^ +
-^ numere asociate^7^6^5^4^3^2^1^0^ | ^15^14^13^12^11^10^9^8^ | ^23^22^21^20^19^18^17^16^  +
- +
-Explicație:​ +
-  * numerele **0, 8, 16** au fost asociate cu bitul **0** ($b_0$) in bytes diferitiPentru că toate dau restul impartirii la 8 egal cu **0**; +
-  * numerele **1, 9, 17** au fost asociate cu bit-ul **1** ($b_1$)Pentru că toate dau restul impartirii la 8 egal cu **1**; +
-  * numerele **2, 10, 18** au fost asociate cu bit-ul **2** ($b_2$)Pentru că toate dau restul impartirii la 8 egal cu **2**; +
-  * numerele **3, 11, 19** au fost asociate cu bit-ul **3** ($b_3$). Pentru că toate dau restul impartirii la 8 egal cu **3**; +
-    * ... +
-  * numărul **i** a fost asociat cu bitul ** (i % 8) ** in byte-ul **(i 8)**! +
- +
-Observație! **card_set(s) == 0** (0 elemente in s) și **is_empty_set(s) == 1** (este **adevărat** că s e gol). +
- +
-=== Insert - exemplu 1 === +
-Să presupunem că pe mulțimea s de mai sus (inițial goală) se execută operația următoarea:​ +
-<code cpp> +
-insert_in_set(s,​ 8); +
-</code> +
- +
-Noua mulțime s este **s = {8}** și arată astfel: +
-^  ^     ​^ ​    ​^ ​    ​^ ​  ​s[0] ​ ^     ​^ ​    ​^ ​    ​^ ​    ​^ ​ |   ​^ ​    ​^ ​    ​^ ​    ^ s[1]    ^     ​^ ​    ​^ ​    ​^ ​    ​^ ​  ​| ​ ^     ​^ ​    ​^ ​    ^ s[2]    ^     ​^ ​    ​^ ​    ​^ ​    ^ +
-^ ^$b_7$^$b_ 6$^$b_5$^$b_4$^$b_3$^$b_2$^$b_1$^$b_0$^ ​ |   ^ $b_7$^$b_6$^$b_5$^$b_4$^$b_3$^$b_2$^$b_1$^$b_0$^ ​ |   ^ $b_7$^$b_6$^$b_5$^$b_4$^$b_3$^$b_2$^$b_1$^$b_0$^ +
-^ biti din S ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^  |  ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^1    ^    |   ^ 0    ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^ +
-^ numere asociate^7^6^5^4^3^2^1^0^ | ^15^14^13^12^11^10^9^8^ | ^23^22^21^20^19^18^17^16^  +
- +
-Explicație:​ numărul **8** a fost asociat cu bitul 0 (** 8 % 8 **) in byte-ul 1 (**8 8**). Acest bit a fost facut 1. +
- +
-Observație! **card_set(s) == 1** (1 element in s) și **is_empty_set(s) == 0** (este **false** că s e gol). +
- +
- +
-=== Insert - exemplu 2 === +
-Să presupunem că pe mulțimea s curentă se execută operația următoarea:​ +
-<code cpp> +
-insert_in_set(s,​ 19); +
-</code> +
- +
-Noua mulțime s este **s = {8, 19}** și arată astfel: +
-^  ^     ​^ ​    ​^ ​    ​^ ​  ​s[0] ​ ^     ​^ ​    ​^ ​    ​^ ​    ​^ ​ |   ​^ ​    ​^ ​    ​^ ​    ^ s[1]    ^     ​^ ​    ​^ ​    ​^ ​    ​^ ​  ​| ​ ^     ​^ ​    ​^ ​    ^ s[2]    ^     ​^ ​    ​^ ​    ​^ ​    ^ +
-^ ^$b_7$^$b_ 6$^$b_5$^$b_4$^$b_3$^$b_2$^$b_1$^$b_0$^ ​ |   ^ $b_7$^$b_6$^$b_5$^$b_4$^$b_3$^$b_2$^$b_1$^$b_0$^ ​ |   ^ $b_7$^$b_6$^$b_5$^$b_4$^$b_3$^$b_2$^$b_1$^$b_0$^ +
-^ biti din S ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^  |  ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^1    ^    |   ^ 0    ^0    ^0    ^0    ^1    ^0    ^0    ^0    ^ +
-^ numere asociate^7^6^5^4^3^2^1^0^ | ^15^14^13^12^11^10^9^8^ | ^23^22^21^20^19^18^17^16^  +
- +
-Explicație:​ numărul **19** a fost asociat cu bitul 3 (** 19 % 8 **) in byte-ul 2 (**19 / 8**). Acest bit a fost facut 1. +
- +
-Observație! **card_set(s) == 2** (2 elemente in s) și **is_empty_set(s) == 0** (este **false** că s e gol). +
- +
-=== Verificare ​- exemplu ​1 === +
-Să presupunem că pe mulțimea s curentă se execută următoarele 2 operații:​ +
-<code cpp> +
-printf("​%d",​ is_in_set(s,​ 3));    // afișează 0 +
-printf("​%d",​ is_in_set(s,​ 19));   // afișează 1 +
-</​code>​ +
- +
-  * ** is_in_set(s,​ 3)** returnează 0 pentru că 3 **NU** face parte din s (bitul $b_3$ din byteul s[0] este egal cu 0) +
-  * ** is_in_set(s,​ 19)** returnează 1 pentru că 19 face parte din s (bitul $b_3$ din byteul s[2este egal cu 0) +
- +
- +
-=== Delete - exemplu 1 === +
-Să presupunem că pe mulțimea s curentă se execută operația următoarea:​ +
-<code cpp> +
-delete_from_set(s,​ 19); +
-</​code>​ +
- +
-Noua mulțime s este **s = {8}** și arată astfel: +
-^  ^     ​^ ​    ​^ ​    ​^ ​  s[0]  ​^     ​^ ​    ​^ ​    ​^ ​    ​^ ​ |   ​^ ​    ​^ ​    ​^ ​    ^ s[1]    ^     ​^ ​    ​^ ​    ​^ ​    ​^ ​  ​| ​ ^     ​^ ​    ​^ ​    ^ s[2]    ^     ​^ ​    ​^ ​    ​^ ​    ^ +
-^ ^$b_7$^$b_ 6$^$b_5$^$b_4$^$b_3$^$b_2$^$b_1$^$b_0$^ ​ |   ^ $b_7$^$b_6$^$b_5$^$b_4$^$b_3$^$b_2$^$b_1$^$b_0$^ ​ |   ^ $b_7$^$b_6$^$b_5$^$b_4$^$b_3$^$b_2$^$b_1$^$b_0$^ +
-^ biti din S ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^  |  ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^1    ^    |   ^ 0    ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^ +
-^ numere asociate^7^6^5^4^3^2^1^0^ | ^15^14^13^12^11^10^9^8^ | ^23^22^21^20^19^18^17^16^  +
- +
-Explicație:​ numărul **19** ​fost asociat cu bitul 3 (** 19 % 8 **) in byte-ul 2 (**19 / 8**). Acest bit a fost facut 0. +
- +
-Observație! **card_set(s) == 1** (1 element in s) și **is_empty_set(s) == 0** (este **false** că s e gol). +
- +
-=== Verificare - exemplu 1 === +
-Să presupunem că pe mulțimea s curentă se execută următoarele 2 operații+
-<code cpp> +
-printf("​%d",​ is_in_set(s,​ 19));   // afișează 0 +
-</​code>​ +
- +
-  * ** is_in_set(s,​ 19)** returnează 0 pentru că 19 **NU ** mai face parte din S (bitul $b_3$ din byteul s[2] este egal cu 0) +
- +
-</​spoiler>​+
  
 === 5.2 === === 5.2 ===
Line 769: Line 667:
  
 <spoiler Element unic din șir> ​ <spoiler Element unic din șir> ​
-Fie un șir cu ** 2n + 1 ** numere întregi, dintre care n numere apar de câte 2 ore, iar unul singur este unic.+Fie un șir cu ** 2n + 1 ** numere întregi, dintre care n numere apar de câte 2 ori, iar unul singur este unic.
 Să se gasească elementul unic.  Să se gasească elementul unic. 
  
Line 806: Line 704:
 </​spoiler>​ </​spoiler>​
  
-<spoiler Împărat, bețiv și nervos> 
-Împăratul Gigel a primit cadou ** 100 ** de sticle de vin de la un admirator secret. Acesta i-a lăsat și o scrisoare în care îi spune despre faptul că este vin nobil, însă a otrăvit o sticlă. Cine va bea din sticla otrăvită ** va muri în fix 24h **.  
  
-Gigel dispune de un număr imens de sclavi (precum număr imens de restanțe in Poli), așa că el își va pune sclavii să guste din vin. Se gândește totuși că nu se mai găsesc sclavi pe toate drumurile, așa ca dorește ** să folosească un număr minim de sclavi ** (cei care gustă riscă să moară). 
- 
-Ajutați-l pe Gigel să găsească numărul minim de sclavi pe care trebuie să îi foloseacă astfel: 
-   * pune pe cei **n sclavi** aleși la masă cu câte un pahar în mână, inițial gol 
-   * poruncește bucătarului să toarne vin în pahare, alegând cui și ce să toarne 
-   * unui sclav i poate turna în pahat vin din oricâte sticle (chiar și simultan) 
-   * după ce s-a turnat în **toate** cele n pahare, ei **vor bea toți simultan** 
-   * la finalul celor **24h** Gigel trebuie să își dea seama care este sticla otrăvită, altfel se va oftica și va pune 100 de sclavi să guste fiecare din câte o sticlă, iar pe cei care rămân în viață îi va împușca oricum pentru că e nervos 
- 
-P.S. Apreciați faptul că Gigel încearcă să nu omoare foarte mulți oameni degeaba. Ajutați-l să găsească $numărul minim n de sclavi$ care trebuie să guste din vin.  
- 
-Follow-up: Aceeași problemă, dar pentru n sticle. 
- 
-TODO: sursă ​       ​ 
- 
-<​note>​ 
-Hint: Reprezentarea numerelor în baza 2. 
-</​note>​ 
- 
-</​spoiler>​ 
  
 <spoiler Jocul NIM> ​ <spoiler Jocul NIM> ​
Line 847: Line 723:
 Enunt: [[http://​www.infoarena.ro/​problema/​sushi | sushi ]] Enunt: [[http://​www.infoarena.ro/​problema/​sushi | sushi ]]
 </​spoiler>​ </​spoiler>​
 +
programare/laboratoare/lab07.1541606763.txt.gz · Last modified: 2018/11/07 18:06 by darius.neatu
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