Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
SPJM

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

Recommended Posts

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á :)

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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? 😳

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other sites
Localhost

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


here since 2009

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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 :)

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
SPJM

Hum estou a ver! Então estou a pensar que tenho que usar listas ligadas mas não tenho nada :wallbash:

Share this post


Link to post
Share on other 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;

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.