<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.algopedia.ro/wiki/index.php?action=history&amp;feed=atom&amp;title=Clasa_a_VI-a_lec%C8%9Bia_9</id>
	<title>Clasa a VI-a lecția 9 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.algopedia.ro/wiki/index.php?action=history&amp;feed=atom&amp;title=Clasa_a_VI-a_lec%C8%9Bia_9"/>
	<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_VI-a_lec%C8%9Bia_9&amp;action=history"/>
	<updated>2026-04-15T19:41:50Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_VI-a_lec%C8%9Bia_9&amp;diff=14139&amp;oldid=prev</id>
		<title>Bella: /* Temă */</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_VI-a_lec%C8%9Bia_9&amp;diff=14139&amp;oldid=prev"/>
		<updated>2017-11-13T12:35:35Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Temă&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Tema - rezolvări =&lt;br /&gt;
&lt;br /&gt;
Rezolvări aici [http://solpedia.francu.com/wiki/index.php/Clasa_a_VI-a_lec%C8%9Bia_4_-_13_oct_2015]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Lecție =&lt;br /&gt;
== Baze de numerație - continuare ==&lt;br /&gt;
=== Exercițiu: submulțimile unei mulțimi ===&lt;br /&gt;
&amp;#039;&amp;#039;Aceasta este o problemă clasică în matematică și informatică.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Rezolvați în clasă următorul exercițiu: să se afișeze toate submulțimile nevide ale mulțimii &amp;lt;nowiki&amp;gt;{ 1, 2, 3, ..., n }&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Cum abordăm această problemă? La prima vedere pare foarte grea. Va trebui, probabil, să afișăm toate submulțimile de un element. Aceasta e simplu. Apoi cele de două elemente. Tot simplu, vom selecta perechile cu două bucle &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;. Apoi cele cu trei elemente. Hmmm, de data asta avem nevoie de trei bucle &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;. Apoi de patru. Apoi de cinci. Cînd se oprește? Răspunsul depinde de &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt;. Dar stai! Nu putem scrie un număr variabil de bucle &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; una într-alta!&lt;br /&gt;
&lt;br /&gt;
Ne trebuie o altă abordare. Vom codifica mulțimile. Cum? Foarte simplu: folosind vectorul lor caracteristic. Pentru fiecare element al mulțimii, de la 1 la &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt;, vom avea un element în vectorul &amp;lt;tt&amp;gt;v&amp;lt;/tt&amp;gt;. Pentru o submulțime dată &amp;lt;tt&amp;gt;v[i]&amp;lt;/tt&amp;gt; este 1 dacă elementul &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; apare în submulțime.&lt;br /&gt;
&lt;br /&gt;
Acest mod de codificare demonstrează un lucru interesant: numărul de submulțimi al unei mulțimi, incluzînd mulțimea vidă, este 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Interesant!&lt;br /&gt;
&lt;br /&gt;
Cum vom folosi acest vector? Destul de neclar. Ne-ar trebui un mod în care să variem toate elementele sale de la zero la unu. Și iar ne întoarcem la buclele &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; una într-alta. Dar există un mod natural în care elementele pot trece prin toate combinațiile posibile de 0 și 1: dacă în loc să folosim un vector cu &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; elemente folosim un număr binar cu &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; cifre. Dacă pornim cu numărul binar de la zero și îl incrementăm pînă ce ajungem la 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; cele &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; cifre ale sale vor trece prin toate configurațiile posibile. Exact ce ne dorim!&lt;br /&gt;
&lt;br /&gt;
În concluzie, care este algoritmul? Iată-l descris mai jos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;1. Pentru i de la 1 la 2^n - 1&lt;br /&gt;
    1.1 Descompune i în baza 2&lt;br /&gt;
    1.2 Pentru fiecare cifră binară 1 care se află pe poziția j&lt;br /&gt;
        1.2.1 Afișează j&lt;br /&gt;
    1.3 Sfîrșit de submulțime, treci la linia următoare&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarcați că algoritmul nu folosește vectori! Vă invit să rezolvați problema [http://varena.ro/problema/submultimi1 submulțimi1] la vianuarena, folosind acest algoritm. După ce o rezolvați, pentru verificare, iată codul complet mai jos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot; style=&amp;quot;border: dashed&amp;quot;&amp;gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  FILE *fin, *fout;&lt;br /&gt;
  int n, m, i, p2max, p;&lt;br /&gt;
&lt;br /&gt;
  fin = fopen( &amp;quot;submultimi1.in&amp;quot;, &amp;quot;r&amp;quot; );&lt;br /&gt;
  fscanf( fin, &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  fclose( fin );&lt;br /&gt;
&lt;br /&gt;
  p2max = 1; // calculam 2^n, numarul pina unde trebuie sa numaram&lt;br /&gt;
  for ( i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    p2max *= 2;&lt;br /&gt;
&lt;br /&gt;
  fout = fopen( &amp;quot;submultimi1.out&amp;quot;, &amp;quot;w&amp;quot; );&lt;br /&gt;
  for ( i = 1; i &amp;lt; p2max; i++ ) {  // numaram de la 1 la 2^n exclusiv&lt;br /&gt;
    m = i;                         // copiem contorul, sa nu il pierdem&lt;br /&gt;
    for ( p = 1; p &amp;lt;= n; p++ ) {   // obtinem pe rind cifrele binare&lt;br /&gt;
      if ( m % 2 == 1 )            // 1 inseamna ca pozitia apartine multimii&lt;br /&gt;
        fprintf( fout, &amp;quot;%d &amp;quot;, p ); // afisam pozitia cifrei 1, p&lt;br /&gt;
      m /= 2;&lt;br /&gt;
    }&lt;br /&gt;
    fprintf( fout, &amp;quot;\n&amp;quot; );         // am afisat o submultime, linie noua&lt;br /&gt;
  }&lt;br /&gt;
  fclose( fout );&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Alte baze ===&lt;br /&gt;
Pînă acum am vorbit numai despre baza 10 și baza 2. Există însă o infinitate de baze. Orice număr întreg poate fi folosit ca bază pentru scrierea numerelor. Exemple:&lt;br /&gt;
&lt;br /&gt;
* Baza 8 este folosită în sisteme de operare pentru exprimarea drepturilor utilizatorilor asupra resurselor&lt;br /&gt;
* Baza 16 este folosită în calculatoare pentru descrierea succintă a numerelor&lt;br /&gt;
&lt;br /&gt;
Lucrul cu alte baze este similar cu lucrul în baza 2 sau baza 10 așa încît nu avem ce menționa în plus. Nu uitați: principiul de conversie de la baza 10 la baza 2 și invers funcționează și în conversiile de la baza 10 la alte baze și invers. De asemenea funcționează și analogia bazelor.&lt;br /&gt;
&lt;br /&gt;
Să vedem acum folosirea unei baze importante, baza 16.&lt;br /&gt;
&lt;br /&gt;
==== Baza 16 ====&lt;br /&gt;
Baza 16 folosește 16 cifre hexazecimale. Primele 10 cifre sînt cele cunoscute. Următoarele 6 cifre sînt primele litere ale alfabetului latin: A, B, C, D, E și F. A are valoarea 10, B are valoarea 11 și așa mai departe pînă la F care are valoarea 15. De exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;B9A&amp;lt;sub&amp;gt;(16)&amp;lt;/sub&amp;gt; = B×16&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + 9×16 + A = 11×16&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + 9×16 + 10 =&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;= 11×256 + 9×16 + 10 = 2816 + 144 + 10 = 2970&amp;lt;sub&amp;gt;(10)&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== Conversia de la baza 2 la baza 16 ====&lt;br /&gt;
Pentru a converti un număr de la baza 2 la baza 16 nu este nevoie să trecem prin baza 10. Putem proceda astfel: &lt;br /&gt;
&lt;br /&gt;
* Grupăm cifrele numărului binar cîte patru, începînd de la dreapta către stînga. Ultima grupă poate să aibă mai puțin de patru cifre binare.&lt;br /&gt;
* Fiecare grup va fi un număr binar între 0 și 15, adică echivalentul unei cifre hexazecimale. Înlocuim aceste grupuri cu cifra echivalentă în baza 16.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;1010110110010110111&amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt; = 101 0110 1100 1011 0111&amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt; = 5 6 12 11 7 = 56CB7&amp;lt;sub&amp;gt;(16)&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== Conversia de la baza 16 la baza 2 ====&lt;br /&gt;
Pentru a converti rapid un număr de la baza 16 la baza 2 vom proceda în sens invers: vom exprima fiecare cifră hexa ca patru cifre binare, făcînd conversia la baza 2 a valorii cifrei hexa. Exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;56CB7&amp;lt;sub&amp;gt;(16)&amp;lt;/sub&amp;gt; = 5 6 12 11 7 = 101 0110 1100 1011 0111&amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt; = 1010110110010110111&amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== Constante hexazecimale în C ====&lt;br /&gt;
La problema [http://varena.ro/problema/dconv dublă conversie] am avut nevoie să calculăm 2&amp;lt;sup&amp;gt;60&amp;lt;/sup&amp;gt;. Avem mai multe variante de a face acest lucru:&lt;br /&gt;
&lt;br /&gt;
* Putem să calculăm acest număr cu un calculator de buzunar și să îl introducem în program&lt;br /&gt;
* Putem să îl scriem în program ca produsul 1048576LL * 1048576LL * 1048576LL. &amp;#039;LL&amp;#039; adăugat la finalul unei constante o transformă în constantă de tip &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Putem să îl calculăm în program într-o buclă &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nici una din aceste metode nu este prea elegantă. De aceea limbajul C ne permite folosirea constantelor hexazecimale. Acestea sînt numere scrise în baza 16. Pentru ca compilatorul să își dea seama că sînt numere și nu nume de variabile aceste constante trebuie precedate de &amp;#039;0x&amp;#039;. Exemplu: 0x56CB7. Pentru cifrele mai mari ca 9 puteți folosi litere mici sau mari, nu are importanță.&lt;br /&gt;
&lt;br /&gt;
Astfel:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;2&amp;lt;sup&amp;gt;60&amp;lt;/sup&amp;gt; = 1000...(60 zerouri)...000&amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt; =&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;1 0000 0000 0000 ...(15 grupe)... 0000&amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt; = 1000000000000000&amp;lt;sub&amp;gt;(16)&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Acum avem încă o metodă, mai simplă, de a calcula 2&amp;lt;sup&amp;gt;60&amp;lt;/sup&amp;gt;: folosind conversia rapidă de la baza 2 la baza 16 și apoi scriind o constantă hexa:&lt;br /&gt;
&lt;br /&gt;
* Putem folosi direct constanta hexa 0x1000000000000000LL. Avem 15 cifre 0 hexa, echivalentul a 60 de cifre 0 binare. Observați că numărul se termină cu &amp;#039;LL&amp;#039; deoarece este o constantă &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Vom vedea cu altă ocazie că există o metodă și mai scurtă de a folosi această constantă.&lt;br /&gt;
&lt;br /&gt;
=== Exerciții cu alte baze ===&lt;br /&gt;
Rezolvați în clasă următoarea problemă:&lt;br /&gt;
==== Baza ascunsă ====&lt;br /&gt;
Rezolvați în timpul cercului problema [http://varena.ro/problema/ascunsa baza ascunsă] la vianuarena.&lt;br /&gt;
&lt;br /&gt;
=== Concurs C4_6=== &lt;br /&gt;
* [http://varena.ro/problema/paritate paritate] Cerc informatică Vianu [http://isa.algopedia.ro/wiki/index.php/paritate Rez]&lt;br /&gt;
* [http://varena.ro/problema/submult submult] Cerc informatică Vianu [http://isa.algopedia.ro/wiki/index.php/submult Rez]&lt;br /&gt;
&lt;br /&gt;
= Temă =&lt;br /&gt;
&lt;br /&gt;
* implementati singuri [http://varena.ro/problema/submultimi1 submulțimi1] (tema din urma)&lt;br /&gt;
* implementati problemele din concurs, conform corecturii. &lt;br /&gt;
** Pentru paritate, va rog sa implementati sursa c, cu citire caracter cu caracter pana la \n.&lt;br /&gt;
** Pentru problema submult, va rog sa faceti 2 implementari: cea cu numarare pana la 3&amp;lt;sup&amp;gt;n si alta simuland adunarea cu 1 pe vector a unui numar in baza 3 cu n cifre. Ultima implementare este de fapt adunarea unui numar mare cu un scalar. &lt;br /&gt;
&lt;br /&gt;
** [http://varena.ro/problema/ascunsa baza ascunsă]&lt;br /&gt;
** [http://varena.ro/problema/decbin Decbin]&lt;br /&gt;
&lt;br /&gt;
Rezolvări aici [http://solpedia.francu.com/wiki/index.php/Clasa_a_VI-a_lec%C8%9Bia_5_-_20_oct_2015]&lt;br /&gt;
&lt;br /&gt;
Suplimentar, daca aveti toate temele facute:&lt;br /&gt;
* [http://varena.ro/problema/cepe cepe]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
</feed>