Pilha: usandro struct [RESOLVIDO]

1. Pilha: usandro struct [RESOLVIDO]

Julio Cesar
imasternex

(usa Ubuntu)

Enviado em 14/03/2010 - 12:53h

Bom Galera, sou novato em programação e estou com algumas dificuldades pra finalizar uma estrutura de pilha. abaixo segue o codigo. Se puderem dar uma força agradeço :P.

o Main ------------------------------------------------------------

#include "biblioteca.h"

int main(int argc, char *argv[]) {]

typedef struct pilha { /* cria pilha */
int n;
int topo=(-1);
int PILHA[N];
} Pilha;

Pilha* pilha_cria (void) {
Pilha* p = (Pilha*)malloc(sizeof(Pilha));
p->topo = 0; //inicializa com zero elementos
return p;
}

char op;
do {
printf ("\nMenu");
printf ("\n\nI - Insere");
printf ("\nR - Remover");
printf ("\nT - Topo");
printf ("\nS - Sair");
printf ("\n\nInforme a operacao desejada: ");
fflush (stdin);
scanf ("%c", &op);
op = my_toupper (op);
system ("cls");

switch (op) {
case 'I':
printf ("Informe o valor que deseja inserir: ");
fflush (stdin);
scanf ("%d",&p);
system ("pause");
system ("cls");

if (pilha_insere()){
printf ("O valor - %d - foi inserido\n", (p));
}
else {
printf ("O valor - %d - NAO foi Inserido - A pilha esta cheia\n\n", p);
}
break;
system ("pause");
system ("cls");

case 'R':
printf (" -- Removendo dados da pilha --\n");
fflush (stdin);
if (pilha_remove()) {
printf ("O valor - %d - foi removido\n", p);
}
else {
printf ("NAO foi removido - A Pilha esta vazia\n\n");
}
break;
system ("pause");
system ("cls");

case 'T':
printf ("-- Mostra valor do topo da pilha --\n");
fflush (stdin);
int x;
a=pilha_top();
if (x) {
printf ("Elemento do topo %d\n", x);
}
else {
printf ("NAO existe elemento no topo - Pilha vazia\n");
}
break;
system ("pause");
system ("cls");

default:
if (op == 'S') {
printf ("Saindo...\n");
}
else {
printf ("Operacao invalida\n");
}
}
system ("pause");
}while (op != 'S');

system("pause");
return 0;
}

Biblioteca.c -------------------------------------------------

#include "biblioteca.h"
#define N 5

/* insere pilha */
void pilha_insere (Pilha* p, int v) {
if (pilha_cheia (p)) { //verifica se a capacidade do vetor foi esgotada
printf ("A pilha ficou cheia!\n");
return (0);
}
p->PILHA[p->topo] = v; /*insere o novo elemento na próxima posição livre*/
p->topo++;
}

int pilha_remove (Pilha*p) { /* remove pilha */
int v;
if (pilha_vazia (p)) {
printf ("Pilha está vazia!\n");
return (0);
}
v = p->PILHA[p->(topo-1)]; /*agora retira o elemento do topo da pilha*/
p->topo--;
return v;
}

int pilha_vazia (Pilha* p) { /* pilha vazia */
return (p->topo == (-1));
}

int pilha_cheia(Pilha* p) { /* pilha cheia */
return (topo == (N-1));
}

int pilha_top (void) { /* topo da pilha */
if (!pilha_vazia(p)){
return (PILHA[topo]);
}
return (0);
}

biblioteca.h ----------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

(void) pilha_cria (int p);

(void) pilha_insere (int p, int v);

(int) pilha_remove (int p);

(int) pilha_vazia (int p);

(int) pilha_cheia(int p);

(int) pilha_top (void);





conto com a ajuda de vcs!


  


2. Local errado para estrutura.

???
gokernel

(usa Linux Mint)

Enviado em 15/03/2010 - 07:51h


Bom olhando rapidamente, vi que vc definiu a strutura(
typedef struct pilha) dentro da funcao "main()" UM ERRO, o correto seria definir no arquivo: "biblioteca.h"

int main(int argc, char *argv[]) {

// O ERRO ESTA AQUI... LOCAL ERRADO PARA DEFINIR A ESTRUTURA.
typedef struct pilha { /* cria pilha */
int n;
int topo=(-1);
int PILHA[N];
} Pilha;

...

return 0;
}

OBS: Li nas pressas.

Corrige aí e T++.

gokernel
gokernel@hotmail.com



3. Só complementando...

???
gokernel

(usa Linux Mint)

Enviado em 15/03/2010 - 07:56h


AH... e só complementando.

Se vc estiver usando C puro:

typedef struct pilha { /* cria pilha */
int n;
int topo=(-1); // ERRO... AQUI NAO PODE ATRIBUIR UM VALOR.
int PILHA[N];
} Pilha;

Ajudando aos poucos... =).

T++.

gokernel - libAS
gokernel@hotmail.com



4. mais alguns

???
gokernel

(usa Linux Mint)

Enviado em 15/03/2010 - 08:17h


Desculpe por postar várias vezes.

MAIS ERROS:

01
--------------------------
ERRADO: no arquivo biblioteca.c
#define N 5


CORRETO: no arquivo biblioteca.h
#define N 5
--------------------------


02
--------------------------
ERRADO:
(void) pilha_cria (int p);

CORRETO:
void pilha_cria (int p);
--------------------------


03
--------------------------
op = my_toupper (op);

CADE ESSA FUNCAO???
--------------------------

04
--------------------------
switch(op){
case 'I':
....
break;

system ("pause"); // ERROR: <-- ISSO NAO SERA EXECUTADO
system ("cls"); // ERROR: <-- ISSO NAO SERA EXECUTADO

case 'R':
...
break;

...
}
--------------------------

T++

gokernel - libAS
gokernel@hotmail.com



5. Pilha

Julio Cesar
imasternex

(usa Ubuntu)

Enviado em 15/03/2010 - 22:55h

Man, vlw pelas dicas, apliquei as correções mas continua com alguns erros e não estou conseguindo identifica-los. Segue abaixo codigo com as modificações:

--------------- main -------------------
#include "biblioteca.h"

int main(int argc, char *argv[]) {]

Pilha* pilha_cria (void) {
Pilha* p = (Pilha*)malloc(sizeof(Pilha));
p->topo = (-1); //inicializa com zero elementos
return p;
}

char op;
do {
printf ("\nMenu");
printf ("\n\nI - Insere");
printf ("\nR - Remover");
printf ("\nT - Topo");
printf ("\nS - Sair");
printf ("\n\nInforme a operacao desejada: ");
fflush (stdin);
scanf ("%c", &op);
op = my_toupper (op);
system ("cls");

switch (op) {
case 'I':
printf ("Informe o valor que deseja inserir: ");
fflush (stdin);
scanf ("%d",&p);
system ("pause");
system ("cls");

if (pilha_insere()){
printf ("O valor - %d - foi inserido\n", (p));
}
else {
printf ("O valor - %d - NAO foi Inserido - A pilha esta cheia\n\n", p);
}
break;
system ("pause");
system ("cls");

case 'R':
printf (" -- Removendo dados da pilha --\n");
fflush (stdin);
if (pilha_remove()) {
printf ("O valor - %d - foi removido\n", p);
}
else {
printf ("NAO foi removido - A Pilha esta vazia\n\n");
}
break;
system ("pause");
system ("cls");

case 'T':
printf ("-- Mostra valor do topo da pilha --\n");
fflush (stdin);
int x;
a=pilha_top();
if (x) {
printf ("Elemento do topo %d\n", x);
}
else {
printf ("NAO existe elemento no topo - Pilha vazia\n");
}
break;
system ("pause");
system ("cls");

default:
if (op == 'S') {
printf ("Saindo...\n");
}
else {
printf ("Operacao invalida\n");
}
}
system ("pause");
}while (op != 'S');

system("pause");
return 0;
}

-------------------- biblioteca.c -------------------

#include "biblioteca.h"

char my_toupper(char op) { //funçao que muda a fonte
if ((op >= 'a') && (op <= 'z')) {
op = op -32;
}
return (op);
}

void pilha_insere (Pilha* p, int v) { /* insere pilha */
if (pilha_cheia (p)) { //verifica se a capacidade do vetor foi esgotada
printf ("A pilha ficou cheia!\n");
return (0);
}
p->PILHA[p->topo] = v; /*insere o novo elemento na próxima posição livre*/
p->topo++;
}

int pilha_remove (Pilha*p) { /* remove pilha */
int v;
if (pilha_vazia (p)) {
printf ("Pilha está vazia!\n");
return (0);
}
v = p->PILHA[p->(topo-1)]; /*agora retira o elemento do topo da pilha*/
p->topo--;
return v;
}

int pilha_vazia (Pilha* p) { /* pilha vazia */
return (p->topo == (-1));
}

int pilha_cheia(Pilha* p) { /* pilha cheia */
return (topo == (N-1));
}

int pilha_top (void) { /* topo da pilha */
if (!pilha_vazia(p)){
return (PILHA[topo]);
}
return (0);
}

--------------------- biblioteca.h --------------------

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define N 5

typedef struct pilha { /* cria pilha */
int n;
int topo;
int PILHA[N];
} Pilha;

char my_toupper(char op);

void pilha_insere (int p, int v);

int pilha_remove (int p);

int pilha_vazia (int p);

int pilha_cheia(int p);

int pilha_top (void);



6. O codigo.

???
gokernel

(usa Linux Mint)

Enviado em 16/03/2010 - 12:50h


Veja o arquivo MAIS LEGIVEL no meu HD VIRTUAL:
http://www.4shared.com/account/dir/24056491/7a5bc050/sharing.html?rnd=93

ARQUIVO: pilha.zip

OK? T++.

//----------- PILHA.C ----------

#include "biblioteca.h"

// COMPILE:
//-------------------------------------------------
// gcc pilha.c -o pilha.exe biblioteca.c -Wall
//-------------------------------------------------
//
// T++.
//
// gokernel - Francisco G. A.
// gokernel@hotmail.com
//

int main(int argc, char *argv[]) {
//-------------------------------------------------------------
// OBS: Aqui vc esta definindo a FUNCAO... mas essa nao eh usada para criar o PONTEIRO...
// REVEJA...
// O PONTEIRO "p" NAO FOI CRIADO POIS ESSA FUNCAO NAO EH USADA... APENAS DEFINIDA...
//
// ENTENDEU ??? T++.
//-------------------------------------------------------------
Pilha* pilha_cria (void) {
Pilha* p = (Pilha*)malloc(sizeof(Pilha));
p->topo = (-1); //inicializa com zero elementos.
return p;
}

// Entao estou usando/CRIANDO... AGORA VIU.
p = pilha_cria();


char op;


do {
printf ("\nMenu");
printf ("\n\nI - Insere");
printf ("\nR - Remover");
printf ("\nT - Topo");
printf ("\nS - Sair");
printf ("\n\nInforme a operacao desejada: ");
fflush (stdin);
scanf ("%c", &op);
op = my_toupper (op);
// system ("cls");

switch(op){
case 'I':
printf ("Informe o valor que deseja inserir: ");
fflush (stdin);
//ERRO: scanf ("%d",&p);
scanf ("%d", &op); // REVEJA O PARAMETRO 1... OK?
// system ("pause");
// system ("cls");

/*
if (pilha_insere()){ // <-- AQUI PRECISA 2 ARGUMENTOS
//ERRO: printf ("O valor - %d - foi inserido\n", (p));
}
else {
//ERRO: printf ("O valor - %d - NAO foi Inserido - A pilha esta cheia\n\n", p);
}
*/
break;


case 'R':
printf (" -- Removendo dados da pilha --\n");
fflush (stdin);
/*
if (pilha_remove()) { // <-- AQUI PRECISA 1 ARGUMENTOS
//ERRO: printf ("O valor - %d - foi removido\n", p);
}
else {
printf ("NAO foi removido - A Pilha esta vazia\n\n");
}
*/
break;

// system ("pause"); // <-- ISSO NAO TEM EFEITO AQUI.
// system ("cls"); // <-- ISSO NAO TEM EFEITO AQUI.

case 'T': {
printf ("-- Mostra valor do topo da pilha --\n");
fflush (stdin);
int x;
// ERRO: a=pilha_top();
x = pilha_top();
if (x) {
printf ("Elemento do topo %d\n", x);
}
else {
printf ("NAO existe elemento no topo - Pilha vazia\n");
}
} break;


default:
if (op == 'S') {
printf ("Saindo...\n");
}
else {
printf ("Operacao invalida\n");
}

}//END: switch(op)

system ("pause");
system ("cls");

}while (op != 'S');

system("pause");

return 0;
}

//---------- BIBLIOTECA.C ----------

#include "biblioteca.h"

char my_toupper(char op) { //funçao que muda a fonte
if ((op >= 'a') && (op <= 'z')) {
op = op -32;
}

return (op);
}


void pilha_insere (Pilha* p, int v) { /* insere pilha */
if (pilha_cheia (p)) { //verifica se a capacidade do vetor foi esgotada
printf ("A pilha ficou cheia!\n");

//ERRO: return (0);
return;
}

p->PILHA[p->topo] = v; /*insere o novo elemento na próxima posição livre*/
p->topo++;
}


int pilha_remove (Pilha *p) { /* remove pilha */
int v;

if (pilha_vazia (p)) {

printf ("Pilha está vazia!\n");

return (0);
}

// ERRO: v = p->PILHA[ p->(topo-1) ]; /*agora retira o elemento do topo da pilha*/
v = p->PILHA[ p->topo-1 ]; /*agora retira o elemento do topo da pilha*/
p->topo--;

return v;
}


int pilha_vazia (Pilha* p) { /* pilha vazia */
return (p->topo == (-1));
}


int pilha_cheia(Pilha* p) { /* pilha cheia */

//ERRO: return (topo == (N-1));
// ACHO QUE VC QUERIA ASSIM...
return (p->topo == (N-1));

}


int pilha_top (void) { /* topo da pilha */

if (!pilha_vazia(p)){

// ERRO: return (PILHA[topo]);
// ACHO QUE VC QUERIA ASSIM...
return (p->PILHA[p->topo]);

}

return (0);
}


//---------- BIBLIOTECA.H ----------

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <malloc.h>

#define N 5


//ERRO: typedef struct pilha { /* cria pilha */
typedef struct Pilha { /* cria pilha */
int n;
int topo;
int PILHA[N];
}Pilha;


Pilha *p; // Defini aqui o PONTEIRO GLOBAL...


char my_toupper(char op);

// ERRO NA DEFINICAO: void pilha_insere (int p, int v);
void pilha_insere (Pilha* p, int v);

//ERRO NA DEFINICAO: int pilha_remove (int p);
int pilha_remove (Pilha *p);


//ERRO NA DEFINICAO: int pilha_vazia (int p);
int pilha_vazia (Pilha* p);

//ERRO NA DEFINICAO: int pilha_cheia(int p);
int pilha_cheia(Pilha* p);

int pilha_top (void);



7. Pilha

Julio Cesar
imasternex

(usa Ubuntu)

Enviado em 16/03/2010 - 15:38h

gokernel, muito obrigado pela ajuda!

Agora consegui entender o funcionamento da pilha, vc foi 1000 na explicação!

Desculpa pela tempo tomado,



abração,

Júlio
imasternex@hotmail.com


8. Foi um prazer.

???
gokernel

(usa Linux Mint)

Enviado em 16/03/2010 - 17:56h


Foi um prazer prazer ajudar brother, e precisando eh so perguntar... afinal a comunidade eh para isso... UM PROBLEMA SEU, TORNA-SE PROBLEMA NOSSO(eh assim que pensso).

Eu por exemplo já obtive muita ajuda dos brothers aqui.

Agora uma pergunta.
--------------------------------------
Quem vai vencer o BIG BROTHER?
--------------------------------------

Nao responde... EH SÓ ZOEIRA... LOL. =).

Abraços.

gokernel - libAS
gokernel@hotmail.com








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts