Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
Ahoj, mohl by mi někdo pomoci?
Mám zadaný tento úkol:
Napište třídu Fronta realizující datový typ fronta.
Implementaci proveďte pomocí dynamicky alokovaného pole.
nevím si rady s metodami vloz, odeber.
Kdyby byl někdo tak ochotný a napsal těla metod (je to pár řádků) nebo mi to vysvětlil, tak bych byla strašně ráda. Díky
Zde je kód, který už mám napsaný:
/* main.cpp (neměnit-má být takto)*/ #include <stdlib.h> #include <iostream> using namespace std; #include "fronta.h" int main() { Fronta f; int cislo; for (int i=0; i<10; i++) f.vloz(i); for (int i=0; i<5; i++) f.odeber(); for (int i=20; i<25; i++) f.vloz(i); while (!f.jePrazdna()) cout << f.odeber() << ' '; cout << endl; system("PAUSE"); return 0; }
/*fronta.h*/ typedef char fronta; class Fronta { public: Fronta(int maxd=10); ~Fronta(); void vloz(fronta p); fronta odeber(); bool jePrazdna() const; private: fronta *pole; int celo, volny, delka, maxDelka; };
/*fronta.cpp*/ #include <iostream> using namespace std; #include "fronta.h" Fronta::Fronta(int maxd) { pole = new fronta[maxd]; celo=0; volny=0; delka=0; maxDelka=maxd; } void Fronta::vloz(fronta p) {} fronta Fronta::odeber() {} bool Fronta::jePrazdna() const {} Fronta::~Fronta() { delete [] pole; }
Offline
/*fronta.h*/ typedef char fronta; class Fronta { public: Fronta(int maxd=10); ~Fronta(); void vloz(int vlozen); int odeber(); bool jePrazdna() const; private: int *pole; int vkladaci,odebiraci,pocet,maxDelka; };
/*fronta.cpp*/ Fronta::Fronta(int maxd) { pole = new int[maxd]; odebiraci=0; vkladaci=0; pocet=0; maxDelka=maxd; } void Fronta::vloz(int vlozen) { if(pocet<maxDelka) { pole[vkladaci]=vlozen; pocet++; vkladaci=(vkladaci+1)%maxDelka; } else { cerr<<"fronta je plna"; } } int Fronta::odeber() { if(pocet>0) { int staryOdebiraci = odebiraci; pocet--; odebiraci=(odebiraci+maxDelka-1)%maxDelka; return pole[staryOdebiraci]; } else { cerr<<"fronta je prazdna"; } } bool Fronta::jePrazdna() const { return pocet==0; } Fronta::~Fronta() { delete [] pole; }
EDIT: nezkoušel jsem kompilovat. Není to paměťově optimální -- proměnná pocet je závislá na vkladaci a odebiraci, ale takto to ušetří hodně kódu. Důvod proč použít % je v tom, že jinak by nám po nějaké době operace přidat-odebrat-přidat-odebrat.... sežraly celou paměť.
Offline
díky zkusím, jestli funguje
Offline
nemáš tam nějakou chybu?
to samé jenom dělané pomocí spojového seznamu mi vypisuje toto
třeba tam mam chybu já, nevím co je správně, ale to druhé mi připadá věrohodnější.
Offline
Tak jednu závažou chybu u sebe jsem našel: ve funkci odeber má místo
odebiraci=(odebiraci+maxDelka-1)%maxDelka;
být
odebiraci=(odebiraci+1)%maxDelka;
Nicméně i potom se naše výstupy rozcházejí. Mě to dává 5 6 7 8 9 20 21 22 23 24. Nerozumím tomu, kde se ve Tvém výstupu vzala desítka ...
Offline
v tom prvním cyklu mám napsáno místo 1-10 1-11 :)
Offline
Stránky: 1