Zásobník - statické pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zásobník - statické pole – C / C++ – Fórum – Programujte.comZásobník - statické pole – C / C++ – Fórum – Programujte.com

 

DaFak
~ Anonymní uživatel
11 příspěvků
19. 12. 2012   #1
-
0
-

Zdravím vás,

potřeboval bych vysvětlit, jak na to, když mám udělat zásobník, který bude implementovat datovou strukturu a bude vytvořen pomocí statického pole (o max 50 prvcích) a bude také obsahovat index vrcholu zásobníku.

Řekl bych, že to bude vypadat nějak takto:

#define N 50

typedef struct zasobnik{
   int[N] zas;
   int v;
}ZASOBNIK;

Nevím ale, jestli to má obsahovat nějaké pointery nebo ne.

Díky za radu.

Nahlásit jako SPAM
IP: 93.187.106.–
ondra.holub+1
Stálý člen
19. 12. 2012   #2
-
0
-

#1 DaFak
Ano, tak nějak to bude vypadat. Pokud data v zásobníku budou typu int. Jinak v tom poli může být jakýkoliv jiný typ, stačí změnit deklaraci. Nějakými ukazately bych se v tomto případě nezalamoval - nejsou tam potřeba.

Nahlásit jako SPAM
IP: 194.138.12.–
DaFak
~ Anonymní uživatel
11 příspěvků
20. 12. 2012   #3
-
0
-

#2 ondra.holub
Vyborně, děkuju :))

Nahlásit jako SPAM
IP: 178.72.192.–
DaFak
~ Anonymní uživatel
11 příspěvků
22. 12. 2012   #4
-
0
-

Příklad mi vznikl nějak takhle:

#define N 50

typedef struct zasobnik{
   int[N] zas;
   int v;
}ZASOBNIK;

void Vytvor(ZASOBNIK v){
    v = NULL;
}

void PridejNaKonec(ZASOBNIK v, int h){
    v = h;

}

void OdeberZKonce(ZASOBNIK v, int h){
    ZASOBNIK pom;
    pom = v;
    ???
}

int JePrazdny(ZASOBNIK v){
    if (v == NULL) return 1
    else return 0;
}

Nevím si rady s těmi pointery, jestli je tam mám teď už nasázet nebo tam vůbec nejsou potřeba. A potom metoda OdeberZKonce, vím, že se musí zavést pomocná proměnná, do které se uloží hodnota z vrcholu a pak se vrchol nastaví na předchůdce, ale nevím jak to napsat.

Nahlásit jako SPAM
IP: 93.187.106.–
liborb
~ Redaktor
+18
Guru
22. 12. 2012   #5
-
0
-

Hledáš v tom zbytečně složitost :). Zásobník ti tvoří pole a index vrcholu zásobníku. Když přidáváš, tak uděláš něco takového:

zas[v] = h;
v++;

Když odebíráš, tak děláš něco takového:

v--;
return(zas[v]);

A ještě 2 připomínky. Pole bude definované jako int zas[N]; a můžeš používat víc názvů proměnných, tj. nemusí se všechny jmenovat v. Zásobník by se třeba mohl jmenovat zasobnik :). A pokud ho předáváš jako parametr funkce, tak tam bude ten pointer, který tak usilovně hledáš, takže to bude třeba:

void pridej(ZASOBNIK* zasobnik, int h) {
zasobnik->zas[zasobnik->v] = h;
zasobnik->v++;
}

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 82.145.208.–
DaFak
~ Anonymní uživatel
11 příspěvků
22. 12. 2012   #6
-
0
-

#5 liborb
To hledám, to je pravda :)) Takže nějak takhle by to šlo?

#define N 50

typedef struct zasobnik{
   int zas[N];
   int v;
}ZASOBNIK;

void Vytvor(ZASOBNIK* zasobnik){
    zasobnik = NULL;
}

void PridejNaKonec(ZASOBNIK* zasobnik, int h){
    	zasobnik->zas[zasobnik->v] = h;
	zasobnik->v++; 
}

void OdeberZKonce(ZASOBNIK* zasobnik, int h){
    	zasobnik->v--;
	zasobnik->zas[zasobnik->v] = h;
}

int JePrazdny(ZASOBNIK* zasobnik){
    if (zasobnik == NULL){
		return 1;
	}
    else return 0;
}

Jinak ještě metoda main:

int _tmain(int argc, _TCHAR* argv[]){
    ZASOBNIK* vrchol;
    int i, h;

    Vytvor(vrchol);
    for(i = 1; i <= N; i++){
        PridejNaKonec(vrchol, i);
    }
    while(JePrazdny(vrchol) == 0){
        OdeberZKonce(vrchol, h);
    }

    System("PAUSE");
	return 0;
}

Pořád se tomu něco nelíbí.

Nahlásit jako SPAM
IP: 93.187.106.–
vitamin+8
Grafoman
22. 12. 2012   #7
-
0
-

#6 DaFak
 

void Vytvor(ZASOBNIK* zasobnik){
	
    //zasobnik = NULL; 	//zasobnik je lokalna premenna, jej vynulovanim nic nezmenis
    zasobnik->v = 0;
}


void OdeberZKonce(ZASOBNIK* zasobnik/*, int h*/){
    zasobnik->v--;
    //zasobnik->zas[zasobnik->v] = h;		//zbytocne
}

int JePrazdny(ZASOBNIK* zasobnik){
    //if (zasobnik == NULL)return 1;
    if(zasobnik->v == 0)return 1;
    else return 0;
}
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. "
DaFak
~ Anonymní uživatel
11 příspěvků
22. 12. 2012   #8
-
0
-

#7 vitamin
No, když program spustím, tak mi to při běhu vyhodí warning u zasobnik->v = 0;

Nahlásit jako SPAM
IP: 93.187.106.–
vitamin+8
Grafoman
22. 12. 2012   #9
-
0
-

napis aky warning, inak tam mas hlavne problem v tom ze nikde nealokujes premennu ZASOBNIK.

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. "
DaFak
~ Anonymní uživatel
11 příspěvků
22. 12. 2012   #10
-
0
-

#9 vitamin
ZASOBNIK mám jako strukturu. Warning to vyhodí nějaký šílený s číslama: Unhandled exception at 0x004113c1 in zasobnik.exe: 0xC0000005: Access violation writing location 0xcccccd94.

Nahlásit jako SPAM
IP: 93.187.106.–
vitamin+8
Grafoman
22. 12. 2012   #11
-
0
-

Tak to nie je warning ale runtime chyba sposobna tym ze pristupujes do pamete ktora ti nepatri pretoze si nealokoval premennu ZASOBNIK

int _tmain(int argc, _TCHAR* argv[]){
    ZASOBNIK* vrchol;			// <-- tu je chyba, vrchol je neinicializovany pointer 
    int i, h;

    Vytvor(vrchol);
    for(i = 1; i <= N; i++){
        PridejNaKonec(vrchol, i);
    }
    while(JePrazdny(vrchol) == 0){
        OdeberZKonce(vrchol, h);
    }

    System("PAUSE");
	return 0;
}
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. "
DaFak
~ Anonymní uživatel
11 příspěvků
22. 12. 2012   #12
-
0
-

Takže:

zasobnik = (ZASOBNIK*)malloc(sizeof(ZASOBNIK)); ?

Nahlásit jako SPAM
IP: 93.187.106.–
vitamin+8
Grafoman
22. 12. 2012   #13
-
0
-

Skus a uvidis   (ale vyzera to funkcne, aj ked by ti uplne stacila lokalna premenna).

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. "
DaFak
~ Anonymní uživatel
11 příspěvků
22. 12. 2012   #14
-
0
-

#13 vitamin
Zkusil jsem a pořád je tam něco špatně :)) Takže asi by byla teoreticky lepší ta lokální proměnná, ale to taky nevím, jak ji napsat, když je vrchol typu ZASOBNIK.

Nahlásit jako SPAM
IP: 93.187.106.–
vitamin+8
Grafoman
22. 12. 2012   #15
-
0
-

   

ZASOBNIK* vrchol = (ZASOBNIK*)malloc(sizeof(ZASOBNIK));

Vytvor(vrchol);
PridejNaKonec(vrchol, 666);
JePrazdny(vrchol)
OdeberZKonce(vrchol);

free(vrchol);

//alebo:
ZASOBNIK vrchol;

Vytvor(&vrchol);
PridejNaKonec(&vrchol, 666);
JePrazdny(&vrchol)
OdeberZKonce(&vrchol);
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. "
DaFak
~ Anonymní uživatel
11 příspěvků
22. 12. 2012   #16
-
0
-

#15 vitamin
Tak i tak to nejde.

#define N 50

typedef struct zasobnik{
   int zas[N];
   int v;
}ZASOBNIK;

void Vytvor(ZASOBNIK* zasobnik){
    	zasobnik->v = 0;
}

void PridejNaKonec(ZASOBNIK* zasobnik, int h){
	zasobnik->zas[zasobnik->v] = h;
	zasobnik->v++; 
}

void OdeberZKonce(ZASOBNIK* zasobnik){
    	zasobnik->v--;
}

int JePrazdny(ZASOBNIK* zasobnik){
   	if (zasobnik->v == 0) return 1;
    	else return 0;
}


int _tmain(int argc, _TCHAR* argv[]){
	ZASOBNIK vrchol;
    	int i, h;

    	Vytvor(&vrchol);
    	for(i = 1; i <= N; i++){
        	PridejNaKonec(&vrchol, i);
    	}
    	while(JePrazdny(&vrchol) == 0){
        	OdeberZKonce(&vrchol);
    	}
	return 0;
}
Nahlásit jako SPAM
IP: 93.187.106.–
vitamin+8
Grafoman
22. 12. 2012   #17
-
0
-

V c sa polia indexuju od 0.

edit: moja chyba, v tomto pripade to mas spravne :)

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. "
DaFak
~ Anonymní uživatel
11 příspěvků
22. 12. 2012   #18
-
0
-

#17 vitamin
To mám a pořád nic, program jen problikne.

Nahlásit jako SPAM
IP: 93.187.106.–
vitamin+8
Grafoman
22. 12. 2012   #19
-
0
-

A co si cakal ze spravi?

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. "
DaFak
~ Anonymní uživatel
11 příspěvků
22. 12. 2012   #20
-
0
-

#19 vitamin
Dobré, už nic, v pohodě je to všechno :)

Tak děkuju moc všem!

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, 101 hostů

Podobná vlákna

Staticke pole ve tride — založil Dimitry:f

Pole : zasobnik — založil Atheo

Zásobník a pole — založil Koler

Statické TreeView — založil Chudda

Staticke a nestaticke metody — založil vlado0991

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ý