Sa se scrie un program care memoreaza n numere intregi intr-o structura de tip coada. Sa se stearga numerele care nu sunt prime din varful cozii pana cand se intalneste un numar prim. Sa se afiseze pe ecran rezultatul.
c++, vs.
Răspunsuri la întrebare
Răspuns:
#include <iostream>
constexpr auto DIMENSIUNE_COADA = 1000;
class Coada
{
/* primulElement va arăta întotdeauna spre primul element adăugat în coadă deoarece principiul pe care funcționează coada e FIFO (first in, first out) deci dacă avem coada 1 -> 2 -> 3 primulElement va arăta spre 1, ultimulElement va arăta spre 3, dimensiunea va fi 3, capacitatea 1000 */
int primulElement, ultimulElement, capacitateCoada, dimensiuneCoada;
int* arrayCoada;
public:
/* consturctor-ul și destructor-ul cozii */
Coada(int dimensiuneCoada = DIMENSIUNE_COADA)
{
arrayCoada = new int[dimensiuneCoada];
capacitateCoada = dimensiuneCoada;
primulElement = 0;
ultimulElement = -1;
this->dimensiuneCoada = 0;
}
~Coada() { delete[] arrayCoada; }
/* funcția adaugă un element în coadă */
void adaugaInCoada(int numar)
{
/* dacă avem mai mult de 1000 elemente (cât am setat capacitatea cozii ) ieșim din program */
if (eCoadaPlina()) {
std::cerr << numar << " nu mai poate fi adaugat in coada, e plina!\n";
exit(EXIT_FAILURE);
}
/* altfel incrementăm ultimulElement (care are valoarea -1 de început) deci practic când adăugăm primul element în coadă o să adăugăm pe poziția 0 din „arrayCoada”, următorul pe poziția 1 ș.a.m.d. */
ultimulElement = (ultimulElement + 1) % capacitateCoada;
arrayCoada[ultimulElement] = numar;
/* în același timp incrementăm și variabila în care salvăm dimensiunea actuală a cozii */
dimensiuneCoada++;
}
/* funcția returnează primul element din coadă */
int scoateElementDinCoada()
{
/* dacă coada e goală practic nu avem ce să mai scoatem, ieșim din program */
if (eCoadaGoala()) {
std::cerr << "Nu putem scoate din coada, coada este goala!\n";
exit(EXIT_FAILURE);
}
/* luăm primul element (dacă avem 20 de elemente în coadă prima dată când încercăm să scoatem un element o să-l scoatem cel de pe poziția 0, dacă mai scoatem un element o să-l scoatem pe cel de pe poziția 1) ș.a.m.d. */
int numarScos = arrayCoada[primulElement];
primulElement = (primulElement + 1) % capacitateCoada;
dimensiuneCoada--;
/* returnăm numărul din coadă */
return numarScos;
}
/* niște funcții ajutătoare pentru a verifica dacă coada e plină sau goală */
bool eCoadaGoala() { return dimensiuneCoada == 0; }
bool eCoadaPlina() { return dimensiuneCoada == capacitateCoada; }
/* funcția returnează dimensiunea actuală a cozii */
int aflaDimensiunea() { return dimensiuneCoada; }
};
bool estePrim(int numar);
int main()
{
int nrElementeDinCoada, nrCitit{};
std::cout << "Cate numere adaugi in coada ? >> ";
std::cin >> nrElementeDinCoada;
/* creăm coada de N elemente */
Coada coadaNumere(nrElementeDinCoada);
/* citim numerele-n coadă */
for (int i{}; i < nrElementeDinCoada; i++) {
std::cout << "Introdu un numar >> ";
std::cin >> nrCitit;
coadaNumere.adaugaInCoada(nrCitit);
}
/* până când coada e goală sau găsim un număr prim */
while (true) {
/* scoatem numărul din coadă */
int numarDinCoada{ coadaNumere.scoateElementDinCoada() };
/* dacă este prim ieșim din program */
if (estePrim(numarDinCoada)) {
std::cout << numarDinCoada << " este prim, ne oprim!\n";
break;
}
/* dacă nu este prim, îl scoatem din coadă */
std::cout << numarDinCoada << " a fost scos din coada, nu este prim!\n";
}
return 0;
}
/* funcția verifică dacă un număr ește sau nu prim */
bool estePrim(int numar)
{
if (numar == 0 || numar == 1) {
return false;
}
for (int i{ 2 }; i <= numar / 2; ++i) {
if (numar % i == 0) {
return false;
}
}
return true;
}
Na, cam asta e, dacă nu înțelegi ceva, scrie-mi.