Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

SPJM

Dúvidas - guardar a informação na memória

Mensagens Recomendadas

SPJM

Boas!

Estou a fazer neste momento um trabalho que consiste em criar um programa capaz de gerir o atendimento diário de um restaurante!

O programa tem de ler a ementa que contem o nome, o código e o preço de todos os itens a partir de um ficheiro binário! Durante a execução do programa toda a informação deve ser mantida em memória. O acesso ao ficheiro deve ser feito apenas no início do programa. É suposto usar estruturas dinâmicas.

Como está ele lê e mostra o conteudo da ficheiro mas para voltar a aceder à info tenho que o voltar a abrir :D

struct menu{
        char nome[100];
        int id;
        float preco;
}item;

int mostra_ementa()
{
        FILE *fp;       
        fp = fopen ("menu.dat", "rb");

        if (fp == NULL)
        {
                printf ("Erro: Impossivel abrir menu\n");
                exit();
        }
        else
        {              
                while ( fread(&item, sizeof(item), 1, fp) == 1 )
                {
                        printf("\n%20s\t%3d\t%.2f\n", item.nome, item.id, item.preco);
                }

                fclose(fp);
        }
}

Alguém me pode dar um ajudinha? Não estou a conseguir chegar lá :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jpedro20

Tens de guardar a informação na memória e depois quando saires do programa libertas a memória utilizada. O que estás a fazer é simplesmente imprimir a informação que está dentro do ficheiro.

Durante a execução do programa toda a informação deve ser mantida em memória.

Tu próprio dizes isso.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
SPJM

O problema é que eu não estou a conseguir fazer isso. Tenho sempre uma carrada de erros 🤔

Não me podem dar umas luzes no assunto? 😳

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
SPJM

🤔 então é suposto ter algo deste género

	char * buffer;
m = sizeof fp;
buffer = malloc(m);


for (n=0; n<=m; n++)
{
	fscanf (fp, "%s", buffer[n]);
}

Mas isto assim não funciona.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Assim só estás a alocar espaço para um ponteiro. Tens de fazer:

malloc(sizeof(fp) * N);

Em que N é o número de ponteiros que queres alocar.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
SPJM

🤔 mas vou precisar de 3 malloc(sizeof(fp) * N);?

Visto o ficheiro ter o nome, o código e preço?  :D

O N neste caso, por outras palavras, serve para determinar a quantidade de informação que posso ter certo?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Tu queres alocar o quê precisamente? Pelo que percebi, queres alocar ponteiros para ficheiros, certo?


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
SPJM

Quero alocar toda a informação que está no ficheiro, que inclui os tais nome, código e preço. De forma a não ter de voltar a aceder ao ficheiro, para voltar a utilizar a informação deste.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
SPJM

Sim exactamente! Só que ainda não me entendi lá muito bem com as listas ligadas! :bored: Ando a analisar alguns exemplos a ver se entendo!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Então se tens de usar listas ligadas não podes alocar tudo logo no inicio do programa. Vais alocando, por exemplo, se o utilizador quiser adicionar alguma informação crias mais uma estrutura dinamicamente.

Para perceberes melhor vê o exemplo que deixei no link que deixei no meu último post.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
SPJM

Hum não sei se entendi bem! A informação que está no tal ficheiro não muda depois da inicialização do programa! Depois de carregar esta informação na memória ela vai manter-se como está até ao fim! Vai servir só para consulta, do género saber preços, saber pratos disponíveis...

Obrigado pela dica, vou tratar disso :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

O que tu estavas a fazer era a alocar logo uma certa memória mas não podes fazer isso com listas ligadas, tens ir alocando em "tempo real".


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
SPJM

O problema inicial já está resolvido! Acabei por utilizar um array de estruturas.

Mas agora, que tenho mesmo que utilizar listas ligadas, tou com outro problema :P

Uma porção do código que tenho:

typedef struct pedidos *pPedidos;
typedef struct pedidos{
        int itemPedido, codGrupo, codMesa;
        pPedidos proxPedido;
}llPedidos;

pPedidos novoPedido;


int pedeEmenta()
{
        auxItenPedido=1;

        printf ("Mesa: ");
        scanf ("%d", &auxMesaPedido);
       
        if (Mesa[auxMesaPedido-1].disponivel==0)
        {
                printf ("Mesa vazia\n\n");
                system("pause");
        }

        else if (Mesa[auxMesaPedido-1].disponivel==1)
        {
                mostra_ementa();

                while (auxItenPedido!=0)
                {
                               
                        novoPedido = malloc(sizeof(llPedidos));

                        if(novoPedido == NULL)
                        {
                                printf ("Erro: Impossivel alocar memoria\n\n");
                                system("pause");
                                return;
                        }
                        else
                        {       
                                ////////////////////
                                printf ("Pedido: ");
                                scanf ("%d", &auxItenPedido);
                               
                                if (auxItenPedido != 0)
                                {
                                        novoPedido->itemPedido = auxItenPedido;
                                        novoPedido->codGrupo = Mesa[auxMesaPedido-1].numGrupoActual;
                                        novoPedido->codMesa = auxMesaPedido;
                                        novoPedido->proxPedido=NULL;

                                        numTotalPedidos+=1;
                                }
                         novoPedido = novoPedido->proxPedido;
                        }
                }
        }       
}

int pagamento()
{
        int auxPagamentoMesa, auxPrecoTotal, auxGrupoPagamento, x;

        printf ("Mesa: ");
        fflush (stdin);
        scanf ("%d", &auxPagamentoMesa);

        if (Mesa[auxPagamentoMesa-1].disponivel==0)
        {
                printf ("Mesa vazia\n\n");
                system("pause");
        }
        else
        {
                auxGrupoPagamento = Mesa[auxPagamentoMesa-1].numGrupoActual;

                while (novoPedido != NULL)
                {
                        if (novoPedido->codGrupo == auxGrupoPagamento)
                      {
                                printf ("Grupo: %d", novoPedido->codGrupo);
                                printf ("Pedido: %d", novoPedido->itemPedido);
                                printf ("Mesa: %d", novoPedido->codMesa);
                                novoPedido = novoPedido->proxPedido;
                        }
                }
                                system ("pause");
        }
}

O problema está na função pagamento. Quando entro nesta função o programa deixa de responder ;) O que eu pretendo é depois de obter todos os pedidos, imprimi-los!

Onde estará o erro? ;)

Obrigado!

Ah faltou dizer uma coisa, no inicio da função main, tenho isto:

novoPedido = NULL;

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Só estás a actualizar novopedido se se confirmar uma condição aí, pode ser disso.

Mete printf's e vẽ onde pára exactamente.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
SPJM

Ele para na condição if() antes de imprimir o Grupo, Pedido e Mesa.

Mas se lhe tirar esta condição ela fica a parar logo no primeiro printf() :P

Se fizer o mesmo e lhe tirar o primeiro printf() ele vai parar no segundo, e se voltar a fazer o mesmo ele vai parar no terceiro! Portanto o problema deve estar na lista ligada porque sempre que ele de alguma forma precisa de aceder à lista deixa de responder!

Depois de despistar aqui uns problemas, com este código já não tenho nenhum erro e ele imprime tudo direitinho, penso que o problema está no avançar para o próximo nó da lista, porque se não avançar ele funciona como é esperado:

int pedeEmenta()
{
auxItenPedido=1;

printf ("Mesa: ");
scanf ("%d", &auxMesaPedido);

if (Mesa[auxMesaPedido-1].disponivel==0)
{
	printf ("Mesa vazia\n\n");
	system("pause");
}

else if (Mesa[auxMesaPedido-1].disponivel==1)
{
	mostra_ementa();

// 		while (auxItenPedido!=0)
// 		{
		novoPedido = malloc(sizeof(llPedidos));

		if(novoPedido == NULL) 
		{
			printf ("Erro: Impossivel alocar memoria\n\n");
			system("pause");
			return;
		}
		else
		{	
			////////////////////
			printf ("Pedido: ");
			scanf ("%d", &auxItenPedido);

			if (auxItenPedido != 0)
			{
				novoPedido->itemPedido = auxItenPedido;
				novoPedido->codGrupo = Mesa[auxMesaPedido-1].numGrupoActual;
				novoPedido->codMesa = auxMesaPedido;
				novoPedido->proxPedido=NULL;


				numTotalPedidos+=1;

			}
/*				novoPedido = novoPedido->proxPedido;*/
		}
/*		}*/
}	
}

int pagamento()
{
int auxPagamentoMesa, auxPrecoTotal, auxGrupoPagamento, x;


printf ("Mesa: ");
fflush (stdin);
scanf ("%d", &auxPagamentoMesa);

if (Mesa[auxPagamentoMesa-1].disponivel==0)
{
	printf ("Mesa vazia\n\n");
	system("pause");
}
else

{
/*		auxGrupoPagamento = Mesa[auxPagamentoMesa-1].numGrupoActual;*/



//   		while (novoPedido != NULL)
//   		{
//  			if (auxGrupoPagamento == novoPedido->codGrupo)
//   			{

			printf ("Grupo: %d", novoPedido->codGrupo);
			printf ("Pedido: %d", novoPedido->itemPedido);
			printf ("Mesa: %d", novoPedido->codMesa);

			novoPedido = novoPedido->proxPedido;

		/*}*/
/* 		}*/
system ("pause");
}
}

Mas agora que vejo isto, não é suposto ter um ponteiro para o inicio da lista antes de imprimir toda a informação que lá está? Ainda não percebi muito bem isto de voltar ao inicio. Será que é esse o problema? ;)

Obrigado!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
SPJM

Ora bem, já avancei mais um bocado!

Faltava-me um ponteiro para o inicio que já lá está a funcionar!

Mas o que acontece agora é que ele imprime a informação que está no primeiro nó da lista mas depois quando devia passar para o segundo nó o programa deixa de funcionar!

O código é este:

typedef struct pedidos *pPedidos;
typedef struct pedidos{
int itemPedido, codGrupo, codMesa;
struct llPedidos *proxPedido;
}llPedidos;

pPedidos novoPedido, inicioPedido, auxPedidos;

int pedeEmenta()
{
int auxInicio=0;
auxItenPedido=1;

printf ("Mesa: ");
fflush (stdin);
scanf ("%d", &auxMesaPedido);

if (Mesa[auxMesaPedido-1].disponivel==0)
{
	printf ("Mesa vazia\n\n");
	system("pause");
}

else if (Mesa[auxMesaPedido-1].disponivel==1)
{
	mostra_ementa();

	while  (auxItenPedido!=0)
	{
		printf ("Pedido: ");
		fflush (stdin);
		scanf ("%d", &auxItenPedido);

		if (auxItenPedido!=0)
		{
			novoPedido = malloc(sizeof(llPedidos));

			if(novoPedido == NULL)
			{
				printf ("Erro: Impossivel alocar memoria\n\n");
				system("pause");
				return;
			}
			else
			{       
				novoPedido->itemPedido = auxItenPedido;
				novoPedido->codGrupo = Mesa[auxMesaPedido-1].numGrupoActual;
				novoPedido->codMesa = auxMesaPedido;

				numTotalPedidos+=1;

				if (auxInicio != 1)
				{
					inicioPedido = novoPedido;
					auxInicio=1;
				}

			novoPedido = novoPedido->proxPedido;
			novoPedido = NULL;

			}
		}
	}
}
}

int pagamento()
{
int auxPagamentoMesa, auxGrupoPagamento;

printf ("Mesa: ");
fflush (stdin);
scanf ("%d", &auxPagamentoMesa);

if (Mesa[auxPagamentoMesa-1].disponivel==0)
{
	printf ("Mesa vazia\n\n");
	system("pause");
}
else
{
	auxGrupoPagamento = Mesa[auxPagamentoMesa-1].numGrupoActual;

	for (auxPedidos=inicioPedido; auxPedidos!=NULL; auxPedidos=auxPedidos->proxPedido)
	{
		if (auxPedidos->codGrupo == auxGrupoPagamento)
		{
			printf ("Grupo: %d\n", auxPedidos->codGrupo);
			printf ("Pedido: %d\n", auxPedidos->itemPedido);
			printf ("Mesa: %d\n", auxPedidos->codMesa);	
		}
	}
	system ("pause");
}
}

Não estou a ver qual é o problema agora :wallbash:

Mais uma vez obrigado!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.