Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
andersonmilanez

problema com exercicio de fila

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!!!

Compartilhar este post


Link para o post
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;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!