Inserir Produtos em uma Pilha [RESOLVIDO]

1. Inserir Produtos em uma Pilha [RESOLVIDO]

Jóvio
Jovioluiz

(usa Ubuntu)

Enviado em 07/04/2018 - 10:36h

Pessoal estou precisando de uma ajuda, pois estou com bastante dificuldade em fazer este programa. O programa pede que seja inserido um produto que contém código, nome e preço. Inicialmente é solicitado ao usuário quantos produtos serão inseridos na pilha. Lembre-se que além da pilha, este valor lido anteriormente deve ser passado para as funções servindo de auxílio para
teste de pilha cheia ou vazia. O programa possui um menu para interação com o usuário sendo:
(1) Inserir produto na pilha
(2) Excluir um elemento da pilha
(3) Listar todos os campos da pilha.

O que eu não estou conseguindo é implementar a função desempilhar(pop) e não estou conseguindo passar alguns argumentos para as funções que verificam se a pilha esta cheia ou vazia.

Agradeço pela ajuda.

#include <stdio.h>
#include <stdlib.h>
#define MAX 50

typedef struct{
int cod;
char nome[MAX];
float preco;
} tp_produto;

typedef struct _pilha{

tp_produto *info;
int topo;

}tp_pilha;

int cheia(tp_pilha *c, int num){ //verifica se a pilha está cheia;
if(c->topo == num-1){
return 1;
} else{
return 0;
}
}

int vazia(tp_pilha *v, int num){//verifica se a pilha está vazia
if(v->topo == -1){
return 1;
} else{
return 0;
}
}

void empilhar(tp_pilha *i, int valor){ //insere um elemento na pilha

if (cheia(i, valor)){
printf("Pilha Cheia!\n");
printf("Esvaziar Pilha!\n\n");

} else{
for(int j = 0; j < valor; j++){
printf("Digite o codigo: ");
scanf("%d", &(i+j)->info->cod);
printf("Digite o nome do produto: ");
fgets((i+j)->info->nome, 50, stdin);
printf("Digite o preço: ");
scanf("%f", (&(i+j)->info->preco));

//*(i->info+i->topo)=valor;
i->topo++;
}
}
}

int desempilhar(tp_pilha *e, int valor){//excluir um elemento da pilha
int aux;

if (vazia(e, valor)){
printf("Pilha Vazia!!\n\n");

} else{
aux = *(e->info+e->topo);
e->topo--;
}
return aux;
}

void display(tp_pilha *d, int valor){//mostra os elementos da Pilha
int i;
for(i = 0; i < valor; i++){
printf("Cod: %d\n", (d->info->cod+i));
printf("Nome: %s", (d->info->nome+i));
printf("Preço: %.2f\n", (d->info->preco+i));
}
printf("\n");
}

int main(){
tp_pilha *p = (tp_pilha *) malloc(sizeof(tp_pilha));
int op, num;
int valor;

printf("Quantos produtos quer cadastrar: ");
scanf("%d", &num);

tp_produto *prod = (tp_produto *) malloc(num * sizeof(tp_produto));

cheia(prod, num);

do {
printf("\tOPÇÕES\n");
printf("1 - Empilhar\n");
printf("2 - Desempilhar\n");
printf("3 - Mostrar\n");
printf("Digite uma opção (0 para sair)--> ");
scanf("%d", &op);
switch (op) {
case 1:
empilhar(p, num);
break;
case 2:
desempilhar(p, num);
break;
case 3:
display(p, num);
break;
case 0:
break;
default:
printf("Opção Inválida\n");
break;
}
} while(op != 0);

free(p);
}



  


2. Re: Inserir Produtos em uma Pilha [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/04/2018 - 11:15h

Como você tem um tipo de dados dedicado para represnetar a pilha, seria interessante que você tivesse uma função para criar a pilha e outra para destruí-la (que seria chamada quando ela não fosse mais necessária).

Como você fala em tamanho máximo, parece que você teria de ter um array de produtos dentro dessa pilha. Esse array seria alocado junto com a criação do objeto que representa a pilha (ou seja, na função de criação), e o tamanho do array passaria a ser um atributo constituinte da pilha (i.e. você vai ter de ter um campo representando essa quantidade máxima de produtos a serem empilhados). As funções de inserção e remoção de elementos vão mexer nos elementos do array e num indicador da quantidade corrente de elementos ocupados, mas não na quantidade máxima.


3. Re: Inserir Produtos em uma Pilha [RESOLVIDO]

Jóvio
Jovioluiz

(usa Ubuntu)

Enviado em 07/04/2018 - 11:47h

Eu criei essa função que cria a pilha

 void cria(tp_pilha *cr, int tamanho){
tp_produto *prod = (tp_produto *) malloc(tamanho * sizeof(tp_produto));
cr->info = prod;
}



Mas tenho outro problema que é que não consigo cadastrar mais de um produto na pilha pois da erro de segmentação. E eu não compreendi bem como fazer o que você escreveu abaixo.

paulo1205 escreveu:

Como você fala em tamanho máximo, parece que você teria de ter um array de produtos dentro dessa pilha. Esse array seria alocado junto com a criação do objeto que representa a pilha (ou seja, na função de criação), e o tamanho do array passaria a ser um atributo constituinte da pilha (i.e. você vai ter de ter um campo representando essa quantidade máxima de produtos a serem empilhados). As funções de inserção e remoção de elementos vão mexer nos elementos do array e num indicador da quantidade corrente de elementos ocupados, mas não na quantidade máxima.





4. Re: Inserir Produtos em uma Pilha [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 08/04/2018 - 00:00h

Pegue sua função de criação.

Você usa a informação de tamanho para alocar uma determinada quantidade de elementos. Até aí, OK. Mas de que modo as demais funções saberão quantos elementos foram alocados? Você tem de salvar essa informação de tamanho em algum lugar daquela pilha. No campo info não é, porque ele guarda apenas o valor do ponteiro. No campo topo também não é, porque ele indica quantos elementos já foram usados, não o tamanho total de elementos.

Sua função de criação, portanto, tem duas omissões: além de deixar indeterminado o valor do campo topo, não salva a informação de tamanho máximo em lugar nenhum.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts