Jump to content
JA86

Problema na pesquisa

Recommended Posts

JA86

Tenho um problema no meu codigo que é o seguinte , insiro um aluno, elimino o mesmo e depois volto a inserir com o mesmo nome outro aluno ele aparece na listagem, mas não me deixa pesquisar nem alterar.

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <locale.h>
struct Alunos {
   char Nome[50];
   char Idade[5];
   char Numero[5];
   char Nacionalidade[20];
   char Turma[20];
   char status;
   } reg;
FILE *fp;

/*prototipo das funcoes*/
void inserir (void);
void pesquisar (void);
void eliminar(void);
void atualizar(void);
void abrir(void);
void listagem(void);


int main(void)
{
 setlocale(LC_ALL, "Portuguese");
 char opcao[2], op;
 do{
    do{
       printf("\n\n\n\n\n\n\n");
       printf("\t########################################################\n");
       printf("\t#        				               #\n");
       printf("\t#                 Programa de Registo Alunos           #\n");
       printf("\t#                                                      #\n");
       printf("\t########################################################\n\n\n");
       printf("\n Escolha a Opção Pretendida \n\n");
       printf("\n <I> - Inserir");
       printf("\n <A> - Atualizar");
       printf("\n <E> - Eliminar");
       printf("\n <C> - Consultar");
       printf("\n <L> - Listagem");
       printf("\n <S> - Sair");
       printf("\n\n\n Opção:");
       gets(opcao);
       op=tolower(*opcao);
    } while(!strchr("iaeclsh",op));
       switch(op){/*D*/
	  case 'i' : inserir(); break;
	  case 'a' : atualizar(); break;
	  case 'e' : eliminar(); break;
	  case 'c' : consultar(); break;
	  case 'l' : listagem(); break;
	  case 's' : exit(0);
	  }
 }while(1);
}
		    /*Declaração De Funções*/

void abrir(const char tipo[3])
{
     if((fp=fopen("alunos.dat", tipo))==NULL)
     {printf("\n Este Arquivo Não Pode Ser Aberto!!\n");
      getch();
      exit(1);
     }
}
void inserir(void)
{    //char *um="0";
     abrir("ab+");
     fseek(fp,0L, SEEK_END);

     do
     {
	printf("\n Digite o Nome do Aluno ou <EXIT> para sair:\n\n");
	gets(reg.Nome);

	if ((strcmp(reg.Nome,"exit")!=0)&&(strcmp(reg.Nome,"EXIT")!=0)&&(strcmp(reg.Nome,"Exit")!=0)){
		printf("\n Idade:"); gets(reg.Idade);
		printf("\n Numero:"); gets(reg.Numero);
		printf("\n Nacionalidade:"); gets(reg.Nacionalidade);
		printf("\n Turma:"); gets(reg.Turma);
		reg.status='1';
		if(fwrite(&reg, sizeof(struct Alunos), 1, fp) != 1)
		{
		printf("\n Erro Na Gravação!!");
		getch();
		}
		else
		{   printf("\n Gravação Efetuada Com Sucesso...\n\n");}
		}
     }while((strcmp(reg.Nome,"exit")!=0)&&(strcmp(reg.Nome,"EXIT")!=0)&&(strcmp(reg.Nome,"Exit")!=0));
     fclose(fp);
}
int pesquisa (void){
   int achou=-1,posicao=0;
   char Nome [40];
   abrir("rb");
   printf("\nDigite o Nome a Ser Pesquisado:");
   gets(Nome);
   rewind(fp);
   while((!feof(fp))&&(achou==-1))
   {
      fread(&reg, sizeof(struct Alunos), 1, fp);
      if (!feof(fp))
	 {if (strcmp(Nome, reg.Nome)==0)
	    {if (reg.status=='0')
	       {posicao=-2;}
	     achou=1;
	    }
	  else{posicao++;}
	 }
      else{posicao=-1;}
   }
   if (achou==-1)
      {posicao=-1;}
   fclose(fp);
   return(posicao);
}
void pesquisar(void){
   int pos;
   pos=pesquisa();
   if(pos==-1)
      {
	 printf("\nAluno Não Existe!");
	 getch();
      }
      else if(pos==-2)
	      {
		 printf("\nAluno Não Existe!");
		 getch();
	      }
	      else
		 {
		    abrir("rb+");
		    fseek(fp,pos*sizeof(struct Alunos),SEEK_SET);
		    fread(&reg, sizeof(struct Alunos), 1, fp);
		    printf("\nNome:%s",reg.Nome);
		    printf("\n Idade:"); gets(reg.Idade);
            printf("\n Numero:"); gets(reg.Numero);
            printf("\n Nacionalidade:"); gets(reg.Nacionalidade);
            printf("\n Turma:"); gets(reg.Turma);
		    getch();
		 }
   fclose(fp);
}
void atualizar(void){
   int posA;
   posA=pesquisa();
   if (posA==-1)
      {
	 printf("\nAluno Não Existe");
	 getch();
      }
      else if(posA==-2)
	      {
		 printf("\nAluno Não Existe!");
		 getch();
	      }
	      else
		 {
		    abrir("rb+");
		    fseek(fp,posA*sizeof(struct Alunos),SEEK_CUR);
		    fread(&reg, sizeof(struct Alunos), 1, fp);
		    printf("\nDeseja Atualizar o Seguinte Aluno...");
		    printf("\nAluno:%s",reg.Nome);
		    printf("\nIdade:%s",reg.Idade);
		    printf("\nNumero:%s",reg.Numero);
		    printf("\nNacionalidade:%s",reg.Nacionalidade);
		    printf("\nTurma:%s",reg.Turma);
		    getch();
		    printf("\nInsira as Informações Correctas:");
		    printf("\nAluno:");
		    gets(reg.Nome);
		    printf("\nIdade:");
		    gets(reg.Idade);
		    printf("\nNumero:");
		    gets(reg.Numero);
		    printf("\nNacionalidade:");
		    gets(reg.Nacionalidade);
		    printf("\nTurma:");
		    gets(reg.Turma);
		    reg.status='1';
		    fseek(fp,posA*sizeof(struct Alunos),SEEK_SET);
		    if(fwrite(&reg, sizeof(struct Alunos),1, fp)!=1)
		       {
			  printf("\n Erro Na Gravação!!");
		       }
		       else
			  {
			     printf("\nActualização Efetuada Com Sucesso");
			     getch();
			  }
		 }
   fclose(fp);
}
void listagem(void) {
   int cont=0;

   abrir("rb");
   fseek(fp, 0L, SEEK_SET);
   fread(&reg, sizeof(struct Alunos),1, fp);
   do
   {
      if (reg.status!='0')
	 {
	    printf("\nNome: %s",reg.Nome);
	    printf("\nIdade: %s",reg.Idade);
	    printf("\nNumero: %s",reg.Numero);
	    printf("\nNacionalidade: %s",reg.Nacionalidade);
	    printf("\nTurma: %s",reg.Turma);
	    cont++;
	 }
      fread(&reg, sizeof(struct Alunos),1, fp);
      }while(!feof(fp));
   printf("\n#Quantidade de Alunos Presentes no Registo=%d",cont);
   getch();
}
void eliminar(void){
   int posE;
   posE=pesquisa();
   if(posE==-1)
      {
	 printf("\nAluno Não Existe!");
	 getch();
      }
      else
	 {
	    if(posE==-2)
	       {
		  printf("\nAluno Eliminado do Registo!");
		  getch();
	       }
	       else
		  {
		     abrir("rb+");
		     fseek(fp, posE*sizeof(struct Alunos), SEEK_SET);
		     fread(&reg, sizeof(struct Alunos), 1, fp);
		     printf("\nNome: %s",reg.Nome);
		     printf("\nIdade: %s",reg.Idade);
		     printf("\nNumero: %s",reg.Numero);
		     printf("\nNacionalidade: %s",reg.Nacionalidade);
		     printf("\nTurma: %s",reg.Turma);
		     printf("\nEste Registro #%d sera excluido",(posE+1));
		     getch();
		     reg.status='0';
		     fseek(fp, posE*sizeof(struct Alunos), SEEK_SET);
		     if(fwrite(&reg, sizeof(struct Alunos), 1, fp)!=1)
			{
			   printf("\n Erro Na Gravação!!");
			   getch();
			}
			else
			{
			   printf("\n Eliminação Efetuada Com Sucesso...\n\n");
			   getch();
			}
		  }
	 }
   fclose(fp);
}

 

Share this post


Link to post
Share on other sites
PsySc0rpi0n

A compilação dá algum erro ou warning?

Porque é que há duas funções um chamada pesquisa() e outra chamada pesequisar()??

Se houver warnings, mostra quais são.

Não uses o gets() nem o getchar(). Acho que já são funções deprecadas e com problemas de segurança.

O que é que acontece quando tentas pesquisar o nome? Que mensagens mostra?


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
JA86
39 minutes ago, PsySc0rpi0n said:

A compilação dá algum erro ou warning?

Porque é que há duas funções um chamada pesquisa() e outra chamada pesequisar()??

Se houver warnings, mostra quais são.

Não uses o gets() nem o getchar(). Acho que já são funções deprecadas e com problemas de segurança.

O que é que acontece quando tentas pesquisar o nome? Que mensagens mostra?

Não compila sem warnings.

int pesquisa ()

é para pesquisar no ficheiro o que quero eliminar ou alterar ou pesquisar

pesquisar ()

é para apresentar aquilo que pesquisei 

o problema que tenho é intrudosu dados, e depois elimino,

e quando insiro dados iguais eles aparecem na listagem mas se eu os tentar alterar ou pesquisar dá que não os encontra, e não percebo porque 

Share this post


Link to post
Share on other sites
PsySc0rpi0n

Eu sugeria que fosses fazendo printf() das variáveis à medida que elas vão alterando, para tentares perceber onde é que algo que não seja epxerado, está a acontecer!


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

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.