Ir ao conteúdo
  • Cadastre-se

problema com exercicio de fila


andersonmilanez

Posts recomendados

Olá pessoal!!

meu professor assou 1 trabalho p\ turma p\ exercitarmos fila em c. nesse trabalho temos que criar 1 sistema de cadastro e atendimento de pedidos que tem o seguinte menu:

[1] novo pedido( le do teclado codigo e a quando e insere na fila)

[2] atender (retirar da fila e mostra na tela e guarda numa outra lista)

[3] listar novos pedidos (nao atendidos)

[0] sair

e as informações de cada pedido é apenas codigo e quantidade utilizando struct

o programa q fiz ate esta funcionando mas quando eu digito o codigo e a quantidade e teclo enter o windows aborta programa. gostaria q vocês me ajudassem aencontra o erro do meu programa.

esse é o codigo do programa:


#include<stdio.h>
#include<conio.h>
#define max 5

struct Pedido{
int codigo, quant;
};

struct Fila{
int ini, fim, nElem;
Pedido elemento[max];
};


void inserir(Fila &f, Pedido &p){
if(f.nElem == max){
printf("\nFila de pedidos cheia");
return;
}
else{
f.elemento[f.fim] = p;
f.fim = (f.fim)%max;
f.nElem++;
}
}

Pedido retira (Fila &f){

Pedido p;
p.codigo = -1;
p.quant = -1;

if (f.nElem == 0){
printf("\nFila de pedidos vazia");
}
else{
p = f.elemento[f.fim];
f.ini = (f.ini)%max;
f.nElem--;
}
return p;
}


int main() {

Fila fila;

Pedido pedido;

char resposta =' ';

do{
printf("\n\nMenu de Pedidos");
printf("\n[1] Inserir novo pedido");
printf("\n[2] Atender o proximo pedido");
printf("\n[3] Listar novos pedidos (nao atendidos)");
printf("\n[0] Sair\n");
printf("Digite a opcao desejada: ");
resposta = getche();


switch(resposta){
case'1':
printf("\nDigite o codigo: ");
scanf("%d", &pedido.codigo);
printf("\nDigite a quantidade: ");
scanf("%d", &pedido.quant);
inserir(fila, pedido);
break;

case '2':
retira(fila);
break;

case '3':
printf("\n\nPedidos: ");
int e=fila.ini;

for (int i=0; i<fila.nElem; i++){
printf("%4.1f", fila.elemento[e]);
e=(e+1)%max;
}
}
}while(resposta != '0');

}

Desde já agradeco a atenção d vocês!!!

Link para o comentário
Compartilhar em outros sites

Você não inicializou f.fim, assim, quando você digita (em inserir())

f.elemento[f.fim] = p;

f.fim será igual ao valor que já estava na mémória (que geralmente é alto), ou seja, é como se estivesse digitando:

f.elemento[125] = p;

e acessando uma região inválida da memória e dando erro de segmentation fault, um erro fatal que encerra o programa.

Na realidade não entendi pra que servem ini e fim. Os dados podem estar em qualquer lugar da matriz ou estarão do 0 até (nElem-1)? Se for o segundo caso os dois primeiros números são inúteis.

Pra esse exercício é melhor usar "filas" mesmo, um tipo específico de estrutura de dados, no qual um elemento tem um ponteiro apontando para o próximo e para o anterior.

struct Pedido{    Pedido *ant, prox;    int codigo, quant;};

Aí você só controla qual é o primeiro e o último e pronto, tem uma fila potencialmente infinita e pode colocar e tirar elementos sem se preocupar com posição. Além disso, pra "atender" o pedido é só fazer:

pedidoatual.ant->prox = VALORQUEINDICAQUEÉULTIMO;

pedidoatual.ant = &ultimopedidoatendido;

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...