Jump to content
joaorebouta

"Mini base de dados"

Recommended Posts

joaorebouta

O erro é que o  identificador ' Acrescentar' nao foi declarado dentro do escopo de program

Program Canoagem ;

Type CanAtleta = Record
  Numero:Integer;
  Nome :String[25];
  Idade: Integer;
  Sexo :Char;
  Escalao :String;
  Telefone :String[9];
End;
Var  Atleta  :CanAtleta;
Arquivo: file of CanAtleta;
op:Char;

Procedure ExibirMenu;
Begin
  clrscr;
  Writeln('      Menu      ');
  Writeln('1. InserirDados');
  Writeln('2. Acrescentar');
  Writeln('3. Listar');
  Writeln('0. Exit');
  Write('Digite a opçao desejada:');
repeat
 Read(op);
 Until (op = '0') or (op = '1') or (op = '2') or (op ='3');
End;


Procedure InserirDados;
Begin
  clrscr;
  Writeln('  Menu - Inserir Atleta');
  Writeln;
  Write('Numero');
  Readln(Atleta.Numero);
  Write('Nome');
  Readln(Atleta.Nome);
  Write('Sexo');
  Readln(Atleta.Sexo);
  Write('Escalão');
  Readln(Atleta.Escalao);
  Write('Telefone');
  Readln(Atleta.Telefone);
  Assign(Arquivo,'Atletas.dat');
  Reset(Arquivo);
  If ioresult <> 0 then
  rewrite (arquivo);
  if filesize (arquivo) >0 then
  seek(Arquivo,FileSize(Arquivo));
  write(Arquivo,Atleta);
  Close(Arquivo);
  
End;

Function ExisteFicheiro : Boolean;

Procedure    Acrescentar;
Var N,i: Integer;
Begin
Writeln('Acrescentar Atleta');
If ExisteFicheiro Then
    Reset (Arquivo)
    Else
    Rewrite(Arquivo);
     Write('Quantos atletas quer acrescentar');
  Read(N);
     
  Seek(Arquivo,FileSize(Arquivo));           
  For i:=1 to N do
  Begin
    Write('Numero');
    Read(Atleta.Numero); 
    Write('Nome');
    Read(Atleta.Nome);
    Write('Idade');
    Read(Atleta.Idade);
    Write('Sexo');
    Read(Atleta.Sexo);
    Write('Escalao');
    Read(Atleta.Escalao);
    Write('Telefone');
    Read(Atleta.Telefone);
    Write (Arquivo,Atleta);
  End;
  Close (Arquivo);
  
End;
    
    Begin
Assign (Arquivo,'Atleta.dat');
{$I-};
Reset(Arquivo); Close(Arquivo);
{$I+};
ExisteFicheiro := (IoResult=0);
End;

  


Procedure Listar;
Var ExisteFicheiro: boolean;
Begin
  Clrscr;
  If Not ExisteFicheiro Then
  Begin
    Writeln('Ficheiro inexistente');
    Write('Tecla Enter para Menu');
    Readln;
  End
  Else
  Begin
    Reset(Arquivo);
    Writeln('Listar registos');
    Write('Registos no ficheiro: ');
    Writeln(FileSize(Arquivo));
    Writeln;
    While Not Eof (Arquivo) Do
    Begin
      Read(Arquivo, Atleta);
      Write(Atleta.Numero);
      Write(Atleta.Nome);
      Write(Atleta.Idade);
      Write(Atleta.Sexo);
      Write(Atleta.Escalao);
      Write(Atleta.Telefone);
    End;
    Close(Arquivo);
    
    Writeln('Tecla Enter para o Menu');
    Readln;
  End;
End;
Begin
  Repeat
    ExibirMenu;
    Case Op Of
      '1' :InserirDados;
      '2' :Acrescentar;
      '3' :Listar;
      '0' :Exit
      else
      Writeln('Opcao Invalida');
    End;
  Until Op = '0'
  
  

 

Edited by nunopicado
Syntax Highlight

Share this post


Link to post
Share on other sites
nunopicado

Podias experimentar ser um bocadinho mais vago, colocar o código e uma transcrição do erro do compilador ainda está explícito demais... 😒

De qualquer forma, basta ires ver a tua declaração do procedure Acrescentar.
Está inserida dentro da function ExisteFicheiro, e como tal, só poderia ser usada dentro desta. Tens de tirar o Acrescentar para fora, para poder ser acedido a partir de qualquer ponto do programa.

Este é o tipo de problema que, havendo uma correcta indentação do código, nunca chega a existir. 

Sem ler o resto do código posso ainda dizer-te que o procedure Listar não irá funcionar como esperado:

procedure Listar;
var
  ExisteFicheiro: Boolean;
begin
  clrscr;
  if not ExisteFicheiro
  then
  begin
    Writeln('Ficheiro inexistente');
    write('Tecla Enter para Menu');
    Readln;
  end
  else
  begin
    Reset(Arquivo);
    Writeln('Listar registos');
    write('Registos no ficheiro: ');

Ao declarares uma variável com o mesmo nome da função (ExisteFicheiro) estás a fazer com que esse procedure apenas aceda ao valor da variável local, nunca chegando a executar a função com o mesmo nome. E tendo em conta que declaras a variável mas nunca lhe atribuis um valor, o resultado daquele IF será sempre o mesmo.

Remove a declaração da variável se quiseres que ele use a função para determinar se o ficheiro existe ou não.

 

Nota também que num lado fazes o Assign a um ficheiro Atletas.dat e noutro fazes Assign a um ficheiro Atleta.dat (plural vs singular).
Evita usar valores absolutos directamente no código, especialmente quando os usarás mais do que uma vez. Usa constantes logo no inicio do programa para definir os valores absolutos, e depois usa as constantes no código.

De qualquer forma, recomendo que revejas o teu código por forma a usar o Assign uma única vez. Não há necessidade de usar mais que uma vez para o mesmo ficheiro, e é comum quando se o faz, surgirem problemas por vezes difíceis de detectar.

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
joaorebouta
4 horas atrás, nunopicado disse:

Podias experimentar ser um bocadinho mais vago, colocar o código e uma transcrição do erro do compilador ainda está explícito demais... 😒

De qualquer forma, basta ires ver a tua declaração do procedure Acrescentar.
Está inserida dentro da function ExisteFicheiro, e como tal, só poderia ser usada dentro desta. Tens de tirar o Acrescentar para fora, para poder ser acedido a partir de qualquer ponto do programa.

Este é o tipo de problema que, havendo uma correcta indentação do código, nunca chega a existir. 

Sem ler o resto do código posso ainda dizer-te que o procedure Listar não irá funcionar como esperado:


procedure Listar;
var
  ExisteFicheiro: Boolean;
begin
  clrscr;
  if not ExisteFicheiro
  then
  begin
    Writeln('Ficheiro inexistente');
    write('Tecla Enter para Menu');
    Readln;
  end
  else
  begin
    Reset(Arquivo);
    Writeln('Listar registos');
    write('Registos no ficheiro: ');

Ao declarares uma variável com o mesmo nome da função (ExisteFicheiro) estás a fazer com que esse procedure apenas aceda ao valor da variável local, nunca chegando a executar a função com o mesmo nome. E tendo em conta que declaras a variável mas nunca lhe atribuis um valor, o resultado daquele IF será sempre o mesmo.

Remove a declaração da variável se quiseres que ele use a função para determinar se o ficheiro existe ou não.

 

Nota também que num lado fazes o Assign a um ficheiro Atletas.dat e noutro fazes Assign a um ficheiro Atleta.dat (plural vs singular).
Evita usar valores absolutos directamente no código, especialmente quando os usarás mais do que uma vez. Usa constantes logo no inicio do programa para definir os valores absolutos, e depois usa as constantes no código.

De qualquer forma, recomendo que revejas o teu código por forma a usar o Assign uma única vez. Não há necessidade de usar mais que uma vez para o mesmo ficheiro, e é comum quando se o faz, surgirem problemas por vezes difíceis de detectar.

obrigado pela ajuda e ocorreu este erro de o procedure listar nao dar estou a tentar resolver agora irei enviar lhe uma nova msg caso nao de

 

Share this post


Link to post
Share on other sites
joaorebouta
6 horas atrás, nunopicado disse:

Podias experimentar ser um bocadinho mais vago, colocar o código e uma transcrição do erro do compilador ainda está explícito demais... 😒

De qualquer forma, basta ires ver a tua declaração do procedure Acrescentar.
Está inserida dentro da function ExisteFicheiro, e como tal, só poderia ser usada dentro desta. Tens de tirar o Acrescentar para fora, para poder ser acedido a partir de qualquer ponto do programa.

Este é o tipo de problema que, havendo uma correcta indentação do código, nunca chega a existir. 

Sem ler o resto do código posso ainda dizer-te que o procedure Listar não irá funcionar como esperado:

Ao declarares uma variável com o mesmo nome da função (ExisteFicheiro) estás a fazer com que esse procedure apenas aceda ao valor da variável local, nunca chegando a executar a função com o mesmo nome. E tendo em conta que declaras a variável mas nunca lhe atribuis um valor, o resultado daquele IF será sempre o mesmo.

Remove a declaração da variável se quiseres que ele use a função para determinar se o ficheiro existe ou não.

 

Nota também que num lado fazes o Assign a um ficheiro Atletas.dat e noutro fazes Assign a um ficheiro Atleta.dat (plural vs singular).
Evita usar valores absolutos directamente no código, especialmente quando os usarás mais do que uma vez. Usa constantes logo no inicio do programa para definir os valores absolutos, e depois usa as constantes no código.

De qualquer forma, recomendo que revejas o teu código por forma a usar o Assign uma única vez. Não há necessidade de usar mais que uma vez para o mesmo ficheiro, e é comum quando se o faz, surgirem problemas por vezes difíceis de detectar.

boa noite o programa esta assim mas continua a nao listar porque diz que o ficheiro inexistente 

 

Program Canoagem ;

Type CanAtleta = Record
  Numero:Integer;
  Nome :String[25];
  Idade: Integer;
  Sexo :Char;
  Escalao :String;
  Telefone :String[9];
End;
Var  Atleta  :CanAtleta;
Arquivo: file of CanAtleta;
op:Char;
Function ExisteFicheiro : Boolean;
    Begin
Assign (Arquivo,'Atletas.dat');
{$I-};
Reset(Arquivo); Close(Arquivo);
{$I+};
ExisteFicheiro := (IoResult=0);
End;
Procedure ExibirMenu;
Begin
  clrscr;
  Writeln('      Menu      ');
  Writeln('1. InserirDados');
  Writeln('2. Acrescentar');
  Writeln('3. Listar');
  Writeln('0. Exit');
  Write('Digite a opçao desejada:');
repeat
 Read(op);
 Until (op = '0') or (op = '1') or (op = '2') or (op ='3');
End;
Procedure InserirDados;
Begin
  clrscr;
  Writeln('  Menu - Inserir Atleta');
  Writeln;
  Write('Numero');
  Readln(Atleta.Numero);
  Write('Nome');
  Readln(Atleta.Nome);
  Write('Idade');
  Readln(Atleta.Idade);
  Write('Sexo');
  Readln(Atleta.Sexo);
  Write('Escalão');
  Readln(Atleta.Escalao);
  Write('Telefone');
  Readln(Atleta.Telefone);
  
  If ioresult <> 0 then
  rewrite (arquivo);
  if filesize (arquivo) >0 then
  seek(Arquivo,FileSize(Arquivo));
  write(Arquivo,Atleta);
  Close(Arquivo);
  
End;


Procedure    Acrescentar;
Var N,i: Integer;
Begin
Writeln('Acrescentar Atleta');
If ExisteFicheiro Then
    Reset (Arquivo)
    Else
    Rewrite(Arquivo);
     Writeln('Quantos atletas quer acrescentar');
  Readln(N);
  
  For i:=1 to N do
  Begin
    Write('Numero');
    Read(Atleta.Numero); 
    Write('Nome');
    Read(Atleta.Nome);
    Write('Idade');
    Read(Atleta.Idade);
    Write('Sexo');
    Read(Atleta.Sexo);
    Write('Escalao');
    Read(Atleta.Escalao);
    Write('Telefone');
    Read(Atleta.Telefone);
    Reset(Arquivo);
    Seek(Arquivo,FileSize(Arquivo));      
    Write (Arquivo,Atleta);
  End;
  Close (Arquivo);
  
End;
    

  


Procedure Listar;
Var ExisteFicheiro: boolean;
Begin
  Clrscr;
  If Not ExisteFicheiro 
    Then
  Begin
    Writeln('Ficheiro inexistente');
    Write('Tecla Enter para Menu');
    Readln;
  End
  Else
  Begin
    Reset(Arquivo);
    Writeln('Listar registos');
    Write('Registos no ficheiro: ');
    Writeln(FileSize(Arquivo));
    Writeln;
    While Not Eof (Arquivo) Do
    Begin
      Read(Arquivo, Atleta);
      Write(Atleta.Numero);
      Write(Atleta.Nome);
      Write(Atleta.Idade);
      Write(Atleta.Sexo);
      Write(Atleta.Escalao);
      Write(Atleta.Telefone);
    End;
    Close(Arquivo);
    
    Writeln('Tecla Enter para o Menu');
    Readln;
  End;
End;
Begin
Assign(Arquivo,'Atletas.dat');
  Rewrite(Arquivo);
  Repeat
    ExibirMenu;
    Case Op Of
      '1' :InserirDados;
      '2' :Acrescentar;
      '3' :Listar;
      '0' :Exit
      else
      Writeln('Opcao Invalida');
    End;
  Until Op = '0'
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
End.

 

Edited by nunopicado
Syntax Highlight

Share this post


Link to post
Share on other sites
nunopicado
6 horas atrás, nunopicado disse:

Ao declarares uma variável com o mesmo nome da função (ExisteFicheiro) estás a fazer com que esse procedure apenas aceda ao valor da variável local, nunca chegando a executar a função com o mesmo nome. E tendo em conta que declaras a variável mas nunca lhe atribuis um valor, o resultado daquele IF será sempre o mesmo.

Remove a declaração da variável se quiseres que ele use a função para determinar se o ficheiro existe ou não.

O que eu disse antes ainda é válido...
Continuas com uma variável local chamada ExisteFicheiro que nunca é inicializada com valor nenhum e como tal é sempre False. Daí te dá o erro de ficheiro inexistente.

Tens de remover aquela Var, senão não vai funcionar!


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

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.