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

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.


Apollyon: Ai nevoie și de implementarea cozii sau te poți folosi de queue-ul din STL
danielabrz: Am nevoie si de implementarea cozii. Multumesc!

Răspunsuri la întrebare

Răspuns de Apollyon
0

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.

Alte întrebări interesante