Differences

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

Link to this comparison view

programare:laboratoare:lab07 [2018/11/03 17:35]
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 517: Line 518:
  
 == 5. bitset (10p )== == 5. bitset (10p )==
-O mulțime de numere întregi poate fi reprezentată astfel: spunem că un număr aparține unei mulțimi S dacă bit-ul al i-lea din vectorul S are valoarea 1. +O mulțime de numere întregi poate fi reprezentată astfel: spunem că un număr ​**i ** aparține unei mulțimi S dacă bit-ul al i-lea din vectorul S are valoarea 1. 
  
-Pentru e ficientă,​ vectorul S va conține date de tipul **unsigned char**+Pentru e ficientă,​ vectorul S va conține date de tipul **unsigned char** (reamintim ​ca **sizeof(unsigned char== byte** adică **8 biți**).
- +
-<spoiler Exemplu>​ +
-Presupunem că avem vectorul ** unsigned char S[3]; **, pentru care am initializat deja valorile cu 0, 3, 5. +
-S[0], S[1], S[2] fiecare reprezintă câte o variabilă pe 8 biți. +
- +
-^  ^     ​^ ​    ​^ ​    ​^ ​  ​S[0] ​ ^     ​^ ​    ​^ ​    ​^ ​    ​^ ​ |   ​^ ​    ​^ ​    ​^ ​    ^ S[1]    ^     ​^ ​    ​^ ​    ​^ ​    ​^ ​  ​| ​ ^     ​^ ​    ​^ ​    ^ S[2]    ^     ​^ ​    ​^ ​    ​^ ​    ^ +
-^ ^$b_0$^$b_ 1$^$b_2$^$b_3$^$b_4$^$b_5$^$b_6$^$b_7$^ ​ |   ^ $b_0$^$b_1$^$b_2$^$b_3$^$b_4$^$b_5$^$b_6$^$b_7$^ ​ |   ^ $b_0$^$b_1$^$b_2$^$b_3$^$b_4$^$b_5$^$b_6$^$b_7$^ +
-^ biti din S ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^0    ^  |  ^1    ^1    ^0    ^0    ^0    ^0    ^0    ^0    ^    |   ^ 1    ^0    ^1    ^0    ^0    ^0    ^0    ^0    ^ +
-^ numere asociate^0^1^2^3^4^5^6^7^ | ^8^9^10^11^12^13^14^15^ | ^16^17^18^19^20^21^22^23^  +
- +
-<​note>​ +
-Atentie! Bitii au fost desenati invers ​(stanga-dreapta 0-7) pentru a obtine in desen sirul sortat de numere asociate. +
-In realitate un byte arata asa in memorie: $b_7b_6b_5b_4b_3b_2b_1b_0$ +
-</​note>​ +
-Observați notarea biților! Vom folosi această schema pentru a obține șirul numerelor asociate ​ca fiind sortat. +
- +
-Interpretare:​ +
- +
-- numărul ​**3** nu face partea din mulțimea S, pentru că bitul asociat ​(**cel cu numărul / etichete 3** din vectoreste **0** +
- +
-- numărul **16** face partea din mulțimea S, pentru că bitul asociat (**cel cu numărul / etichepa 16 ** din vector) este **1** +
- +
-Analog pentru toate numerele de la 0 la 23 (avem doar 24 de biți în acest exemplu), putem verifica dacă numărul i este în vector. +
-Astfel vectorul S de mai sus reprezintă mulțimea ​**{8, 9, 16, 18}**. +
- +
-Dacă programul nostru va seta bitul cu numărul 15 pe 1, atunci operația este echivalentă cu **S = S U {15}**. Programul va trebui să îșdea seama ca **bitul cu numărul 15** este defapt ** bitul cu numărul 7 ** din **byteul cu numărul 1** (adica din S[1]).  +
-</​spoiler>​+
  
 <​note>​ <​note>​
Line 567: 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 618: Line 585:
       * o funcție care **să citească de la tastatură** ​ o mulțime       * o funcție care **să citească de la tastatură** ​ o mulțime
       <code C>       <code C>
-      // read_set(a) - functia citeste numarul n de elemente care se afla in a+      // read_set(s) - functia citeste numarul n de elemente care se afla in a
       // apoi citeste cele n numere si le insereaza in a       // apoi citeste cele n numere si le insereaza in a
       // va returna numarul n citit (numarul de elemente)       // va returna numarul n citit (numarul de elemente)
-      int read_set(SET ​a);+      int read_set(SET ​s);
       </​code>​       </​code>​
  
       * o funcție care **să afișeze** pe ecran elementele care se află într-o mulțime       * o funcție care **să afișeze** pe ecran elementele care se află într-o mulțime
       <code C>       <code C>
-      // print_set(a) - functia printeaza elementele multimii ​a +      // print_set(s) - functia printeaza elementele multimii ​s 
-      void print_set(SET ​a);+      void print_set(SET ​s);
       </​code>​       </​code>​
       ​       ​
 +Urmăriți acest [[https://​ocw.cs.pub.ro/​courses/​programare/​laboratoare/​lab07-bitset-example | exemplu cu bitset]] ​ pentru a înțele cum funcționeazăaceste operații. ​     ​
 +
 === 5.2 === === 5.2 ===
 Realizati un program care, utilizând metodele de fite anterior, citește 2 mulțimi A (n și B și a fișează:​ $ A U B, A ∩ B, A - B, B - A $. Realizati un program care, utilizând metodele de fite anterior, citește 2 mulțimi A (n și B și a fișează:​ $ A U B, A ∩ B, A - B, B - A $.
Line 636: Line 605:
       * **reuniunea** a două mulțimi (**1p**)       * **reuniunea** a două mulțimi (**1p**)
       <code C>       <code C>
-      // B+      // b
       void merge_set(SET a, SET b, SET c);       void merge_set(SET a, SET b, SET c);
       </​code>​       </​code>​
Line 642: Line 611:
       * **intersecția** a două mulțimi (**1p**)       * **intersecția** a două mulțimi (**1p**)
       <code C>       <code C>
-      // B+      // b
       void intersect_set(SET a, SET b, SET c);       void intersect_set(SET a, SET b, SET c);
       </​code>​       </​code>​
Line 648: Line 617:
       * **diferența** a două mulțimi (**1p**)       * **diferența** a două mulțimi (**1p**)
       <code C>       <code C>
-      // A - B+      // a \ b
       void diff_set(SET a, SET b, SET c);       void diff_set(SET a, SET b, SET c);
       </​code>​       </​code>​
Line 698: 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 735: 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 776: Line 723:
 Enunt: [[http://​www.infoarena.ro/​problema/​sushi | sushi ]] Enunt: [[http://​www.infoarena.ro/​problema/​sushi | sushi ]]
 </​spoiler>​ </​spoiler>​
 +
programare/laboratoare/lab07.1541259351.txt.gz · Last modified: 2018/11/03 17:35 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