Informatică, întrebare adresată de timoteilupo13, 8 ani în urmă

Se consideră un set de 49 numere. Calculatorul va extrage aleator 6 numere din setul de mai sus, şi va afisa aceste 6 numere în ordine crescătoare. Se va folosi sortarea prin selecţie.

Răspunsuri la întrebare

Răspuns de Apollyon
0

Răspuns:

#include <iostream>

#include <chrono>

#include <random>

constexpr int DIMENSIUNE_SET_UNU{49}, DIMENSIUNE_SET_DOI{6};

static int *creareSetNumere()

{

   unsigned varSeed = std::chrono::steady_clock::now().time_since_epoch().count();

   std::default_random_engine randomEngine(varSeed);

   std::uniform_int_distribution<int> uniformIntDistribution(1, 100);

   int *setNumere = new int[DIMENSIUNE_SET_UNU];

   for (int i = 0; i < DIMENSIUNE_SET_UNU; i++)

       setNumere[i] = uniformIntDistribution(randomEngine);

   return setNumere;

}

static int *preluare6Numere(int *setNumere)

{

   unsigned varSeed = std::chrono::steady_clock::now().time_since_epoch().count();

   std::default_random_engine randomEngine(varSeed);

   std::uniform_int_distribution<int> uniformIntDistribution(0, DIMENSIUNE_SET_UNU - 1);

   int *setCu6Numere = new int[DIMENSIUNE_SET_DOI];

   for (int i = 0; i < DIMENSIUNE_SET_DOI; i++)

       setCu6Numere[i] = setNumere[uniformIntDistribution(randomEngine)];

   return setCu6Numere;

}

static void swapNumere(int &primulNumar, int &alDoileaNumar)

{

   int nrTemp = primulNumar;

   primulNumar = alDoileaNumar;

   alDoileaNumar = nrTemp;

}

static void selectionSort(int *setDeNumere, int dimensiuneSet)

{

   int indexMinim{};

   for (int i = 0; i < dimensiuneSet - 1; i++)

   {

       indexMinim = i;

       for (int j = i + 1; j < dimensiuneSet; j++)

           if (setDeNumere[j] < setDeNumere[indexMinim])

               indexMinim = j;

       swapNumere(setDeNumere[indexMinim], setDeNumere[i]);

   }

}

static void afisareSirNumere(int *sirNumere, int dimensiuneNumere)

{

   for (int i = 0; i < dimensiuneNumere; i++)

       std::cout << sirNumere[i] << " ";

   std::cout << std::endl;

}

static void elibereazaMemoria(int *setNumereInitial, int *noulSet)

{

   delete[] setNumereInitial;

   delete[] noulSet;

}

int main()

{

   int *setNumereInitial = creareSetNumere();

   std::cout << "Setul initial >> ";

   afisareSirNumere(setNumereInitial, DIMENSIUNE_SET_UNU);

   int *noulSet = preluare6Numere(setNumereInitial);

   std::cout << "Setul cu cele 6 numere luate random din primul set inainte de sortare >> ";

   afisareSirNumere(noulSet, DIMENSIUNE_SET_DOI);

   std::cout << "Setul cu cele 6 numere luate random din primul set dupa sortare >> ";

   selectionSort(noulSet, DIMENSIUNE_SET_DOI);

   afisareSirNumere(noulSet, DIMENSIUNE_SET_DOI);

   elibereazaMemoria(setNumereInitial, noulSet);

   return 0;

}

Explicație:

  • creareSetNumere(...) alocă o zonă de memorie în care salvăm 49 de numere generate random ( ca să nu le introducem noi de la tastatură ).
  • preluare6Numere(...) alocă o zonă de memorie în care vom salva 6 numere pe care le vom prelua din cele 49 salvate anterior folosindu-ne de un index generat random cu valori între 0 și 48.
  • afisareSirNumere(...) afișează numerele din interiorul zonelor de memorie.
  • selectionSort(...) o să sorteze crescător zona cu cele 6 numere ( vezi mai multe detalii pe net despre cum funcționează algoritmul )
  • swapNumere(...) interschimbă valorile variabilelor intre ele.
  • elibereazaMemoria(...) eliberează zonele de memorie alocate dinamic deoarece întotdeauna când aloci dinamic pe HEAP trebuie să și dealoci din moment ce C++ nu are un Garbage Collector care să se ocupe cu asta.
Alte întrebări interesante