Matematické Fórum

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

#1 16. 03. 2009 14:25

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

fronta pomocí pole v c++

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ý:

Code:

/* 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;
}

Code:

/*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; 
};

Code:

/*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;                
}

Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#2 16. 03. 2009 20:24

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: fronta pomocí pole v c++

Code:

/*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; 
};

Code:

/*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ěť.


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#3 17. 03. 2009 09:34

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: fronta pomocí pole v c++

díky zkusím, jestli funguje


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#4 17. 03. 2009 11:39 — Editoval gladiator01 (17. 03. 2009 11:46)

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: fronta pomocí pole v c++

nemáš tam nějakou chybu?
http://forum.matweb.cz/upload/941-2-3.jpg

to samé jenom dělané pomocí spojového seznamu mi vypisuje toto
http://forum.matweb.cz/upload/738-1-3.jpg

třeba tam mam chybu já, nevím co je správně, ale to druhé mi připadá věrohodnější.


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#5 17. 03. 2009 12:13

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: fronta pomocí pole v c++

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


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#6 17. 03. 2009 17:14 — Editoval gladiator01 (17. 03. 2009 17:18)

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: fronta pomocí pole v c++

v tom prvním cyklu mám napsáno místo 1-10 1-11 :)


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson