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:
#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.