Jump to content
JoaoNascimento

Estrutura de decisão com apontadores

Recommended Posts

JoaoNascimento

Olá pessoa,

não sei se o titulo é o mais apropriado , a minha duvida é a seguinte;

Tenho duas estruturas, um dos campos dessa estrutura é um apontador para a anterior... Até ai tudo bem, lé tudo do ficheiro e preenche bem, o problema é quando é para fazer a verificação se o sócio da livraria tem ou não um livro requisitado quando não tem, ou seja quando o campo estado esta diferente de 1 então o programa encrava.

Estruturas:

typedef struct livro
{
char autor[50];
char titulo[50];
unsigned char Estado;
}livros;

typedef struct socio
{
char socio[50];
int numero;
livros* requesitado;
}socios;

Ler Ficheiros:

int lerLivros(livros *l) //a) pronto
{
int i = 0;
FILE *fp;
fp = fopen("livros.txt","r");

while(!feof(fp))
{
	fscanf(fp,"%[^\t]\t%[^\t]\t%d\n", l[i].autor, l[i].titulo, &l[i].Estado);
	printf("%s\t%s\t%d\n", l[i].titulo, l[i].autor, l[i].Estado);
	i++;
}
//printf("%d",i);

fclose(fp);
return i;
}

int lerSocios(socios *s, livros *l, int tamanhoLivros) //a) pronto
{
int i = 0;
livros h[MaxLivros];
int j=0;
FILE *pf;
pf = fopen("socios.txt","r");

while(!feof(pf))
{
	fscanf(pf,"%[^\t]\t%d",s[i].socio, &s[i].numero);
	printf("%s\t%d\n",s[i].socio, s[i].numero);
	s[i].requesitado = NULL;
	i++;
}

fclose(pf);
return i;
}

Função em causa

void pesquisarSocio(socios *s, int tamanhoSocios) //g)
{
int AuxNumero = 0;
int i = 0;
int flag = 0;

fflush(stdin);
printf("Insira o numero do sócio: ");
scanf("%d",&AuxNumero);

for (i=0;i<tamanhoSocios;i++)
{
	if(AuxNumero == s[i].numero)
	{
		printf("\n\nSocio encontrado");
		if(s[i].requesitado->Estado == 1)
		{
			printf("\n\nO socio tem o livro: %s do autor: %s requisitado", s[i].requesitado->titulo, s[i].requesitado->autor);
			flag = 1;
		}
		else if(s[i].requesitado != 1)
		{
			printf("\n\nO socio não tem nenhum livro requesitado");
		}
	}
}
}

Share this post


Link to post
Share on other sites
daj

Porque, quando o sócio não tem nenhum livro requisitado, o apontador é NULL (que é o que faz sentido) e essa condição tem que ser testada antes de chegares a uma instância de livro através do apontador. No código

                        printf("\n\nSocio encontrado");
                        if(s[i].requesitado->Estado == 1)
                        {
                                printf("\n\nO socio tem o livro: %s do autor: %s requisitado", s[i].requesitado->titulo, s[i].requesitado->autor);
                                flag = 1;
                        }
                        else if(s[i].requesitado != 1)
                        {
                                printf("\n\nO socio não tem nenhum livro requesitado");
                        }

na segunda linha, estás a consultar coisas do livro (campo Estado) sem antes verificar se existe um livro.

                        printf("\n\nSocio encontrado");
                        
                        if(s[i].requesitado == NULL)
                        {
                                printf("\n\nO socio não tem nenhum livro requesitado");
                        }
                        else if(s[i].requesitado->Estado == 1)
                        {
                                printf("\n\nO socio tem o livro: %s do autor: %s requisitado", s[i].requesitado->titulo, s[i].requesitado->autor);
                                flag = 1;
                        }

Isto supondo que no lerSocio() ainda pesquisas pelo livro e preenches o apontador requesitado como fazias num post anterior. Neste momento, com o código que tens, o apontador requesitado nunca é diferente de NULL e não tens forma de saber que sócio requisitou determinado livro.

Já agora, no código de cima, testar por s[ i ].requesitado->Estado == 1 no else é um pouco redundante. O que diz que livro um sócio requisitou é o valor do apontador. Ainda assim, o campo Estado pode ser útil. Para fazer uma nova requisição (que corresponde a afectar o campo requesitado do sócio com o endereço do livro que ele requisita), terás antes de verificar o campo Estado do livro e só permitir a requisição se estiver a 0 (e colocas a 1 neste ponto). Sem o Estado, terias que percorrer o array de sócios para saber se alguém tinha no campo requesição o endereço do livro pretendido.

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

×
×
  • Create New...

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.