Dynamický zásobník C++ – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Dynamický zásobník C++ – C / C++ – Fórum – Programujte.comDynamický zásobník C++ – C / C++ – Fórum – Programujte.com

 

Ilhvm
~ Anonymní uživatel
38 příspěvků
17. 3. 2013   #1
-
0
-

Zdravím,

potřebuju naprogramovat zásobník, který bude mít tyto data:

- ukazatel na jednorozměrné dynamické pole, ve kterém budou jednotlivé prvky-celá čísla zásobníku
- vrchol zásobníku (index posledního prvku vloženého do zásobníku)
- max - hodnota omezující počet prvků v dynamickém poli

A pak bude třída obsahovat následující metody:
- konstruktor s parametrem, který vytvoří objekt a v něm dynamické pole o určitém max počtu prvků (hodnota
  parametru) a inicializuje se vrchol zásobníku
-  destruktor, který uvolní paměť po objektu
-  metoda PridejNaVrchol, která přidá prvek na vrchol zásobníku
-  metoda OdeberZVrcholu, která odebere prvek-číslo z vrcholu zásobníku a vrátí jeho hodnotu
-  metoda JePrázdný, která vrátí true, bude-li zásobník prázdný, a false, bude-li obsahovat alespoň jeden prvek

Moje třída zásobník vypadá takto:
 

#include "StdAfx.h"
#include "Zasobnik.h"

private:
	int *zas;
	int index;
	int max;

Zasobnik::Zasobnik(int max){
	zas = new int[max];
	index = max-1;
}

Zasobnik::~Zasobnik(void){
	delete zas;
}

int Zasobnik::PridejNaVrchol(int h){
	zas[index] = h;
	index++; 
}

int Zasobnik::OdeberZVrcholu(){
	return zas[index--];
}

bool Zasobnik::Je Prazdny(){
	if (index <= 0) return true;
	else return false;
}

A ve třídě main mám zatím jen aplikovanou metodu pro vložení:

 

#include "stdafx.h"
#include <iostream>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
	cout << "Zadej pocet prvku: ";
        cin >> max;
	
	Zasobnik z1(max);
	for(int i = max; i < ; i++) 
		z1.PridejNaVrchol(i);
}

Jelikož mám Visual Studio mimo provoz, tak to nemám jak vyzkoušet? Teoreticky mám to dobře?

Díky!

Nahlásit jako SPAM
IP: 93.187.106.–
Koudis
~ Anonymní uživatel
145 příspěvků
18. 3. 2013   #2
-
0
-

Ahoj,

ne, nemas to dobre. Mas tam aspon jednu syntaktickou chybku. 

"bool Zasobnik::Je Prazdny()" ==> "bool Zasobnik::Je_Prazdny()"

Nahlásit jako SPAM
IP: 78.128.194.–
Ilhvm
~ Anonymní uživatel
38 příspěvků
19. 3. 2013   #3
-
0
-

#2 Koudis
No dobře, to si člověk nevšimne někdy, mě jde spíše o funkčnost, ne o syntaxi, pořád mě to hází chybky, navíc ted mám problém ještě s MS Visual, při kompilaci mi vyhodí chybu, že nelze najít exe soubor, zkoušela jsem podle návodů tady to vyřešit, ale bez úspěchu :-/

Nahlásit jako SPAM
IP: 93.187.106.–
KIIV
~ Moderátor
+43
God of flame
19. 3. 2013   #4
-
0
-

#3 Ilhvm

private:
	int *zas;
	int index;
	int max;

wtf?

co implicitni konstruktor? Pak bude destruktor uvolnovat neco co nebylo alokovano...  proste spousta chyb muze byt uz v tom  "zasobnik.h"

vymlouvat se na to, ze nemas visual studio je chaby.. bud stahni to, nebo stahni gcc a zkompiluj pekne rucne.. (neni nic horsiho nez programovat naslepo...)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Ilhvm
~ Anonymní uživatel
38 příspěvků
19. 3. 2013   #5
-
0
-

#4 KIIV
C++ vidím poprvé v životě, takže zase v tom tak zběhlá nejsem, navíc, Visual mám, jen mám problém při kompilaci, každopádně jsem opravdu schopná program psát v něčem jiném (momentálně Code::Blocks) :))

Teď jsem to trošku změnila, každopádně bych prosila o trošku trpělivosti :))

 main.cpp:

#include <iostream>

using namespace std;

int main()
{
	Zasobnik z1(5);
	for(int i = 5; i < 10; i++)
		z1.PridejNaVrchol(i);
}

zasobnik.cpp:

#include "zasobnik.h"

private:
	int *zas;
	int index;
	int max;
public:
    Zasobnik(int);
    ~Zasobnik();
    void PridejNaVrchol(int);
    typ OdeberZVrcholu();
    bool JePrazdny();

Zasobnik::Zasobnik(int poc){
	zas = new int[max];
	max = poc;
	index = -1;
}

Zasobnik::~Zasobnik(void){
	delete zas[];
}

int Zasobnik::PridejNaVrchol(int h){
    if (index < max-1){
        index++;
        zas[index] = h;
    } else
        cout << "Zasobnik je plny!"; << endl;
}

int Zasobnik::OdeberZVrcholu(){
    if (index >= 0){
        return zas[index--];
    } else
        cout << "Zasobnik je prazdny!" << endl;
}

bool Zasobnik::JePrazdny(){
	if (index < 0) return true;
	else return false;
}

zasobnik.h

#pragma once
class Zasobnik
{
public:
	Zasobnik(void);
	~Zasobnik(void);
};

No, tady mi to hází jednu chybu ve třídě main - Zasobnik z1(5);

Nahlásit jako SPAM
IP: 93.187.106.–
KIIV
~ Moderátor
+43
God of flame
19. 3. 2013   #6
-
0
-

Dobre tedy, zasobnik.h ma obsahovat rozhrani tridy Zasobnik... tj. hlavicky (hlavne spravne hlavicky) vsech metod + atributy tridy (to je to co mas ted vytazeny uplne jinam, kam to nepatri - to je to u ceho sem psal WTF?)

V zasobnik.cpp mas mit pak implementaci tech metod, deklarovanych pro tridu...  Zasobnik se ctyrteckou pak urcuje, ke ktere tride dana metoda vlastne patri...

Takze ted musis aktualizovat class Zasobnik, aby tam byly vsechny prototypy metod a spravne...

uz treba to   Zasobnik(void);   nesedi k   Zasobnik::Zasobnik(int poc)   ->  ma byt     Zasobnik(int);  pripadne   Zasobnik(int pocet);  aby bylo lepe citelne rozhrani

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Ilhvm
~ Anonymní uživatel
38 příspěvků
19. 3. 2013   #7
-
0
-

#6 KIIV
No, jediný Zasobnik(void) mám u destruktoru, ten my void být měl ne?

Nahlásit jako SPAM
IP: 93.187.106.–
vitamin+8
Grafoman
19. 3. 2013   #8
-
0
-

 #7 Ilhvm

//subor.hpp	
class C{
	/*
	Tu musia byt vsetky atributy(premenne) a deklaracie metod
	*/

	int i;
	float f;
	double d;
	//...
	
public:		
	C();
	int metoda(int, float);
	void metoda2();
	
	//...
};
//-----------------------------------------------------------------
//subor.cpp	

#include "subor.hpp"

/*
tu nedefinujes ziadne atributy, len metody (pripadne staticke premenne)
*/

C::C(){
	//...
}
int C::metoda(int x, float y){
	//...
}
void C::metoda2(){
	//...
}

	
Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
KIIV
~ Moderátor
+43
God of flame
19. 3. 2013   #9
-
0
-

proste to ma byt prinejmensim takto:

class Zasobnik
{
private:
	int *zas;
	int index;
	int max;
public:
    Zasobnik(int);
    ~Zasobnik();
    void PridejNaVrchol(int);
    typ OdeberZVrcholu();
    bool JePrazdny();
};

nicmene je tam stale problem s implicitnim konstruktorem... pokud se udela pak    Zasobnik neco;  tak na konci se budes snazit uvolnovat pamet, kterou nikdo nikdy nezabral...

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Ilhvm
~ Anonymní uživatel
38 příspěvků
19. 3. 2013   #10
-
0
-

#9 KIIV
Ano ano, tak to už mám. Takže bych tam měla přidat ještě jeden implicitní konstruktor?

To znamená něco takového?

Zasobnik::Zasobnik (){
	zas = new int [];
	...
}
Nahlásit jako SPAM
IP: 93.187.106.–
KIIV
~ Moderátor
+43
God of flame
19. 3. 2013   #11
-
0
-

no muzes ho zablokovat ... tim ze ho das do sekce   private:  

pripadne das nejakou defaultni hodnotu - neco jako     Zasobnik(int pocet = 0);     staci ale jen uvnitr  class {  }; pokud dobre pamatuju

zas = new int []  neni uplne dobrej napad... aspon nejakou velikost by to mit mohlo

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Ilhvm
~ Anonymní uživatel
38 příspěvků
19. 3. 2013   #12
-
0
-

#11 KIIV
Doobře, díky moc.

No a ještě, věděl bys, proč mi to vyhazuje chybu v main teda u toho řádku: Zasobnik z1(5); ? Tam prostě vytvořím objekt, který bude typu Zasobnik a bude mít 5 čísel.

Nahlásit jako SPAM
IP: 93.187.106.–
KIIV
~ Moderátor
+43
God of flame
19. 3. 2013   #13
-
0
-

tezko rict .. takhle nejak to me funguje:

class Zasobnik
{
private:
	int *zas;
	int index;
	int max;
public:
    Zasobnik(int);
    ~Zasobnik();
    void PridejNaVrchol(int);
    int OdeberZVrcholu();
    bool JePrazdny();
};

///////////////////////////////////////////////
#include <iostream>
#include "zasobnik.h"

using namespace std;

int main()
{
	Zasobnik z1(5);
	for(int i = 5; i < 10; i++)
		z1.PridejNaVrchol(i);
}

///////////////////////////////////////////////
#include "zasobnik.h"
Zasobnik::Zasobnik(int poc){
	zas = new int[max];
	max = poc;
	index = -1;
}

Zasobnik::~Zasobnik(void){
	delete [] zas;
}

void Zasobnik::PridejNaVrchol(int h){
    if (index < max-1){
        index++;
        zas[index] = h;
    } else
        cout << "Zasobnik je plny!" << endl;
}

int Zasobnik::OdeberZVrcholu(){
    if (index >= 0){
        return zas[index--];
    } else
        cout << "Zasobnik je prazdny!" << endl;
}

bool Zasobnik::JePrazdny(){
	if (index < 0) return true;
	else return false;
}

teda funguje == jde zkompilovat :D

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Ilhvm
~ Anonymní uživatel
38 příspěvků
20. 3. 2013   #14
-
0
-

#13 KIIV
Pff, mě to tam furt hází chyby. Že Zasobnik není deklarovaný a z1 nenalezen.

Nahlásit jako SPAM
IP: 93.187.106.–
KIIV
~ Moderátor
+43
God of flame
20. 3. 2013   #15
-
0
-

v main.cpp musi byt ten include "zasobnik.h"

pomohly by kazdopadne presne ty chyby co to hazi...ne "neco nefunguje"

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Ilhvm
~ Anonymní uživatel
38 příspěvků
20. 3. 2013   #16
-
0
-

#15 KIIV
To tam právě mám ...

Nahlásit jako SPAM
IP: 93.187.106.–
KIIV
~ Moderátor
+43
God of flame
20. 3. 2013   #17
-
0
-

stahni si asi radsi to gcc :D  tydle mrchy s ruznejma stdafx.h predkompilovanejma hlavickama a podobne sou sileny..

evidentne to pak preskakuje veskery hlavicky tj. je tam jakoby ani nema...

zkusil bych pridat ten include stdafx a pak se uvidi

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Ilhvm
~ Anonymní uživatel
38 příspěvků
20. 3. 2013   #18
-
0
-

#17 KIIV
S GCC jsem ještě nepracovala, každopádně jsem tam něco vykutila a výsledky:

main.cpp:

Zasobnik.cpp:

Nahlásit jako SPAM
IP: 93.187.106.–
KIIV
~ Moderátor
+43
God of flame
20. 3. 2013   #19
-
0
-

vidis ja to kompiloval vse v jednom tak sem si nevsiml ze mas v zasobnik.cpp zapomenuty include <iostream> a musis vsude pridat  std::  u cout a endl ...  

no a da se to pak zkompilovat vesmes najednou     g++ main.cpp zasobnik.cpp  

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Ilhvm
~ Anonymní uživatel
38 příspěvků
20. 3. 2013   #20
-
0
-

#19 KIIV
Jojojo, už je to dobré, super. V tom Code::Blocks mi to tam pořád u toho řádku (Zasobnik z1(5);) háže chybu. Každopádně si myslím, že budu mít špatně Zasobnik.h, v tom Code:Blocks je to trošku jinak, tak si s tím nějak pohraju, pohledám a uvidíme.

Děkuju moc! :)

Nahlásit jako SPAM
IP: 93.187.106.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 66 hostů

Podobná vlákna

Zasobník — založil MarokSK92

Zásobník — založil Siggi

Zasobník — založil MarokSK92

Zasobnik — založil bbeni

Zásobník — založil Seann_K

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý