Ir ao conteúdo
  • Cadastre-se

Unit - Free Pascal IDE


liperts

Posts recomendados

Boa noite.

Estou com um problema nesse programa na hora de rodar. Poderiam me ajudar a resolver essa questão? Estou utilizando o Free Pascal IDE. Além disso, a parte que está comentada também apresenta erro. Já declarei a varíavel, mas o erro persistiu, por isso tirei a declaração...

Obrigado desde já.

Unit Lista;

{$mode objfpc}{$H+}

Interface

Uses

Classes, SysUtils, crt;

Type

TipoNome = string[30];

TipoTelefone = string[10];

Apontador = ^ Registro;

Registro = Record

Nome: String[30];

Telefone : String[10];

Proximo : Apontador;

End;

Procedure Insere (Var Ap : Apontador);

Procedure InsereElemento (Var Ap : Apontador; Novo : Apontador; Flag : Boolean);

Procedure Altera (Var Ap : Apontador);

Procedure Remove (Var Ap : Apontador);

Procedure GravaArquivo (Var Ap: Apontador);

Procedure CarregaArquivo (Var Ap: Apontador);

Procedure ListaElementos (Ap : Apontador);

Procedure MostraQuantidade (Ap : Apontador);

Procedure LeValores (Var Nome : TipoNome; Var Telefone : TipoTelefone);

Procedure CriaNovo (Var Novo : Apontador; Nome : TipoNome; Telefone : TipoTelefone);

Procedure Pesquisa (Ap : Apontador; Nome : TipoNome; Var El : Apontador; Var Ant : Apontador);

Function LeNome : TipoNome;

Procedure AlteraValores (Var Elemento : Apontador; NovoNome : TipoNome; NovoTelefone : TipoTelefone);

implementation

Procedure Insere (Var Ap : Apontador);

Var

Novo : Apontador;

Nome : TipoNome;

Telefone : TipoTelefone;

Begin

LeValores (Nome, Telefone);

CriaNovo (Novo, Nome, Telefone);

InsereElemento (Ap, Novo, True);

End;

Procedure InsereElemento (Var Ap : Apontador; Novo : Apontador; Flag : Boolean);

Var

Temp : Apontador;

Begin

If (Ap = Nil)

Then

Ap := Novo

Else

Begin

Temp := Ap;

While (Temp^.Proximo <> Nil) Do Temp := Temp^.Proximo;

Temp^.Proximo := Novo;

End;

if (Flag)

Then

Begin

Writeln;

Writeln('Novo nome incluido na lista...');

Readln;

End;

End;

Procedure Altera (Var Ap : Apontador);

Var

Lixo,

Elemento : Apontador;

NovoNome,

Nome : TipoNome;

NovoTelefone : TipoTelefone;

Begin

Clrscr;

Writeln ('Procedimento de Alteracao');

Writeln ('-------------------------');

Writeln;

if (Ap = Nil)

Then

Begin

Writeln ('A lista esta vazia...');

Readln;

End

Else

Begin

Nome := LeNome;

Pesquisa (Ap, Nome, Elemento, Lixo);

If (Elemento = Nil)

Then Writeln ('Nome nao encontrado')

Else

Begin

LeValores (NovoNome, NovoTelefone);

AlteraValores (Elemento, NovoNome, NovoTelefone);

End;

End;

End;

Procedure Remove (Var Ap : Apontador);

Var

Anterior,

Elemento : Apontador;

Nome : TipoNome;

Begin

Clrscr;

Writeln ('Procedimento de Remocao');

Writeln ('-----------------------');

Writeln;

If (Ap = Nil)

Then Writeln ('A lista esta vazia...')

Else

Begin

Nome := LeNome;

Pesquisa (Ap, Nome, Elemento, Anterior);

If (Elemento = Ap)

Then Ap := Ap^.Proximo

Else

Begin

Anterior^.Proximo := Elemento^.Proximo;

Elemento^.Proximo := Nil;

End;

Writeln('Nome removido: ' + Elemento^.Nome);

Writeln('Telefone removido: ' + Elemento^.Telefone);

Dispose (Elemento);

End;

Readln;

End;

Procedure GravaArquivo (Var Ap: Apontador);

Var

Temp : Apontador;

NomeArquivo : String [255];

Arquivo : File of Registro;

Begin

Clrscr;

Writeln ('Procedimento de Gravacao em Arquivo');

Writeln ('-----------------------------------');

Writeln;

If (Ap = Nil)

Then Writeln ('A lista esta vazia...')

Else

Begin

Write ('Informe o nome do arquivo: ');

Readln (NomeArquivo);

Assign (Arquivo, NomeArquivo);

Rewrite (Arquivo);

Temp := Ap;

While (Temp <> Nil) Do

Begin

Write (Arquivo, Temp^);

Writeln ('Nome gravado: ' + Temp^.Nome);

Writeln ('Telefone gravado: ' + Temp^.Telefone);

Writeln;

Temp := Temp^.Proximo;

End;

Close (Arquivo);

Writeln ('Gravacao da lista no arquivo bem sucedida...');

End;

Readln;

End;

Procedure CarregaArquivo (Var Ap: Apontador);

Var

Lido : Apontador;

NomeArquivo : String [255];

Arquivo : File of Registro;

Begin

Clrscr;

Writeln ('Procedimento de Carregamento de Arquivo');

Writeln ('---------------------------------------');

Writeln;

Write ('Informe o nome do arquivo: ');

Readln (NomeArquivo);

Assign (Arquivo, NomeArquivo);

Reset (Arquivo);

Ap := Nil;

While (Not Eof(Arquivo)) Do

Begin

New (Lido);

Read (Arquivo, Lido^);

Lido^.Proximo := Nil;

InsereElemento (Ap, Lido, False);

Writeln ('Nome lido: ' + Lido^.Nome);

Writeln ('Telefone lido: ' + Lido^.Telefone);

Writeln;

End;

Close (Arquivo);

Writeln ('Lista telefonica carregada do arquivo...');

Readln;

End;

Procedure ListaElementos (Ap : Apontador);

Var

Temp : Apontador;

Contador : Integer;

Begin

Clrscr;

Writeln ('Listando Nomes e Telefones');

Writeln ('--------------------------');

Writeln;

Contador := 0;

Temp := Ap;

If (Temp = Nil) Then Writeln ('A lista esta vazia...');

While (Temp <> Nil) Do

Begin

Contador := Contador + 1;

// Write (IntToStr (Numero) + ' - Nome: ' + Temp^.Nome + ' - ');

// Writeln ('Telefone: ' + Temp^.Telefone);

Temp := Temp^.Proximo;

End;

Readln;

End;

Procedure MostraQuantidade (Ap : Apontador);

Var

Temp : Apontador;

Contador : Integer;

Begin

Clrscr;

Writeln ('Exibindo a Quantidade de Nomes e Telefones');

Writeln ('------------------------------------------');

Writeln;

Contador := 0;

Temp := Ap;

While (Temp <> Nil) Do

Begin

Contador := Contador + 1;

Temp := Temp^.Proximo;

End;

Writeln ('A quantidade de registros e: ' + IntToStr (Contador));

Readln;

End;

Procedure LeValores (Var Nome : TipoNome; Var Telefone : TipoTelefone);

Begin

Clrscr;

Writeln ('Leitura de Valores');

Writeln ('------------------');

Writeln;

Writeln;

Write ('Informe o nome: ');

Readln (Nome);

Write ('Informe o telefone: ');

Readln (Telefone);

End;

Procedure CriaNovo (Var Novo : Apontador; Nome : TipoNome; Telefone : TipoTelefone);

Begin

New (Novo);

Novo^.Nome := Nome;

Novo^.Telefone := Telefone;

Novo^.Proximo := Nil;

End;

procedure Pesquisa (Ap : Apontador; Nome : TipoNome; Var El : Apontador; Var Ant : Apontador);

Var

Achou : Boolean;

Temp : Apontador;

Begin

Temp := Ap;

Ant := Temp;

Achou := False;

While ((Temp <> Nil) And (Not Achou)) Do

Begin

If (Temp^.Nome = Nome) Then Achou := True;

If (Not Achou)

Then

Begin

Ant := Temp;

Temp := Temp^.Proximo;

End;

End;

El := Temp;

End;

Function LeNome : TipoNome;

Var

Nome : TipoNome;

Begin

Write ('Informe o nome a pesquisar: ');

Readln (Nome);

LeNome := Nome;

End;

Procedure AlteraValores (Var Elemento : Apontador; NovoNome : TipoNome; NovoTelefone : TipoTelefone);

Begin

Clrscr;

Writeln ('Procedimento de Alteracao');

Writeln ('-------------------------');

Writeln;

Writeln ('Nome Anterior: ' + Elemento^.Nome);

Writeln ('Telefone Anterior: ' + Elemento^.Telefone);

Writeln;

Writeln ('Novo Nome: ' + NovoNome);

Writeln ('Novo Telefone: ' + NovoTelefone);

Elemento^.Nome := NovoNome;

Elemento^.Telefone := NovoTelefone;

Writeln ('Alteracao efetuada com sucesso...');

Readln;

End;

End.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Boa noite.

Estou com um problema nesse programa na hora de rodar. Poderiam me ajudar a resolver essa questão? Estou utilizando o Free Pascal IDE. Além disso, a parte que está comentada também apresenta erro. Já declarei a varíavel, mas o erro persistiu, por isso tirei a declaração...

Obrigado desde já.

Unit Lista;

{$mode objfpc}{$H+}

Interface

Uses

Classes, SysUtils, crt;

Type

TipoNome = string[30];

TipoTelefone = string[10];

Apontador = ^ Registro;

Registro = Record

Nome: String[30];

Telefone : String[10];

Proximo : Apontador;

End;

Procedure Insere (Var Ap : Apontador);

Procedure InsereElemento (Var Ap : Apontador; Novo : Apontador; Flag : Boolean);

Procedure Altera (Var Ap : Apontador);

Procedure Remove (Var Ap : Apontador);

Procedure GravaArquivo (Var Ap: Apontador);

Procedure CarregaArquivo (Var Ap: Apontador);

Procedure ListaElementos (Ap : Apontador);

Procedure MostraQuantidade (Ap : Apontador);

Procedure LeValores (Var Nome : TipoNome; Var Telefone : TipoTelefone);

Procedure CriaNovo (Var Novo : Apontador; Nome : TipoNome; Telefone : TipoTelefone);

Procedure Pesquisa (Ap : Apontador; Nome : TipoNome; Var El : Apontador; Var Ant : Apontador);

Function LeNome : TipoNome;

Procedure AlteraValores (Var Elemento : Apontador; NovoNome : TipoNome; NovoTelefone : TipoTelefone);

implementation

Procedure Insere (Var Ap : Apontador);

Var

Novo : Apontador;

Nome : TipoNome;

Telefone : TipoTelefone;

Begin

LeValores (Nome, Telefone);

CriaNovo (Novo, Nome, Telefone);

InsereElemento (Ap, Novo, True);

End;

Procedure InsereElemento (Var Ap : Apontador; Novo : Apontador; Flag : Boolean);

Var

Temp : Apontador;

Begin

If (Ap = Nil)

Then

Ap := Novo

Else

Begin

Temp := Ap;

While (Temp^.Proximo <> Nil) Do Temp := Temp^.Proximo;

Temp^.Proximo := Novo;

End;

if (Flag)

Then

Begin

Writeln;

Writeln('Novo nome incluido na lista...');

Readln;

End;

End;

Procedure Altera (Var Ap : Apontador);

Var

Lixo,

Elemento : Apontador;

NovoNome,

Nome : TipoNome;

NovoTelefone : TipoTelefone;

Begin

Clrscr;

Writeln ('Procedimento de Alteracao');

Writeln ('-------------------------');

Writeln;

if (Ap = Nil)

Then

Begin

Writeln ('A lista esta vazia...');

Readln;

End

Else

Begin

Nome := LeNome;

Pesquisa (Ap, Nome, Elemento, Lixo);

If (Elemento = Nil)

Then Writeln ('Nome nao encontrado')

Else

Begin

LeValores (NovoNome, NovoTelefone);

AlteraValores (Elemento, NovoNome, NovoTelefone);

End;

End;

End;

Procedure Remove (Var Ap : Apontador);

Var

Anterior,

Elemento : Apontador;

Nome : TipoNome;

Begin

Clrscr;

Writeln ('Procedimento de Remocao');

Writeln ('-----------------------');

Writeln;

If (Ap = Nil)

Then Writeln ('A lista esta vazia...')

Else

Begin

Nome := LeNome;

Pesquisa (Ap, Nome, Elemento, Anterior);

If (Elemento = Ap)

Then Ap := Ap^.Proximo

Else

Begin

Anterior^.Proximo := Elemento^.Proximo;

Elemento^.Proximo := Nil;

End;

Writeln('Nome removido: ' + Elemento^.Nome);

Writeln('Telefone removido: ' + Elemento^.Telefone);

Dispose (Elemento);

End;

Readln;

End;

Procedure GravaArquivo (Var Ap: Apontador);

Var

Temp : Apontador;

NomeArquivo : String [255];

Arquivo : File of Registro;

Begin

Clrscr;

Writeln ('Procedimento de Gravacao em Arquivo');

Writeln ('-----------------------------------');

Writeln;

If (Ap = Nil)

Then Writeln ('A lista esta vazia...')

Else

Begin

Write ('Informe o nome do arquivo: ');

Readln (NomeArquivo);

Assign (Arquivo, NomeArquivo);

Rewrite (Arquivo);

Temp := Ap;

While (Temp <> Nil) Do

Begin

Write (Arquivo, Temp^);

Writeln ('Nome gravado: ' + Temp^.Nome);

Writeln ('Telefone gravado: ' + Temp^.Telefone);

Writeln;

Temp := Temp^.Proximo;

End;

Close (Arquivo);

Writeln ('Gravacao da lista no arquivo bem sucedida...');

End;

Readln;

End;

Procedure CarregaArquivo (Var Ap: Apontador);

Var

Lido : Apontador;

NomeArquivo : String [255];

Arquivo : File of Registro;

Begin

Clrscr;

Writeln ('Procedimento de Carregamento de Arquivo');

Writeln ('---------------------------------------');

Writeln;

Write ('Informe o nome do arquivo: ');

Readln (NomeArquivo);

Assign (Arquivo, NomeArquivo);

Reset (Arquivo);

Ap := Nil;

While (Not Eof(Arquivo)) Do

Begin

New (Lido);

Read (Arquivo, Lido^);

Lido^.Proximo := Nil;

InsereElemento (Ap, Lido, False);

Writeln ('Nome lido: ' + Lido^.Nome);

Writeln ('Telefone lido: ' + Lido^.Telefone);

Writeln;

End;

Close (Arquivo);

Writeln ('Lista telefonica carregada do arquivo...');

Readln;

End;

Procedure ListaElementos (Ap : Apontador);

Var

Temp : Apontador;

Contador : Integer;

Begin

Clrscr;

Writeln ('Listando Nomes e Telefones');

Writeln ('--------------------------');

Writeln;

Contador := 0;

Temp := Ap;

If (Temp = Nil) Then Writeln ('A lista esta vazia...');

While (Temp <> Nil) Do

Begin

Contador := Contador + 1;

// Write (IntToStr (Numero) + ' - Nome: ' + Temp^.Nome + ' - ');

// Writeln ('Telefone: ' + Temp^.Telefone);

Temp := Temp^.Proximo;

End;

Readln;

End;

Procedure MostraQuantidade (Ap : Apontador);

Var

Temp : Apontador;

Contador : Integer;

Begin

Clrscr;

Writeln ('Exibindo a Quantidade de Nomes e Telefones');

Writeln ('------------------------------------------');

Writeln;

Contador := 0;

Temp := Ap;

While (Temp <> Nil) Do

Begin

Contador := Contador + 1;

Temp := Temp^.Proximo;

End;

Writeln ('A quantidade de registros e: ' + IntToStr (Contador));

Readln;

End;

Procedure LeValores (Var Nome : TipoNome; Var Telefone : TipoTelefone);

Begin

Clrscr;

Writeln ('Leitura de Valores');

Writeln ('------------------');

Writeln;

Writeln;

Write ('Informe o nome: ');

Readln (Nome);

Write ('Informe o telefone: ');

Readln (Telefone);

End;

Procedure CriaNovo (Var Novo : Apontador; Nome : TipoNome; Telefone : TipoTelefone);

Begin

New (Novo);

Novo^.Nome := Nome;

Novo^.Telefone := Telefone;

Novo^.Proximo := Nil;

End;

procedure Pesquisa (Ap : Apontador; Nome : TipoNome; Var El : Apontador; Var Ant : Apontador);

Var

Achou : Boolean;

Temp : Apontador;

Begin

Temp := Ap;

Ant := Temp;

Achou := False;

While ((Temp <> Nil) And (Not Achou)) Do

Begin

If (Temp^.Nome = Nome) Then Achou := True;

If (Not Achou)

Then

Begin

Ant := Temp;

Temp := Temp^.Proximo;

End;

End;

El := Temp;

End;

Function LeNome : TipoNome;

Var

Nome : TipoNome;

Begin

Write ('Informe o nome a pesquisar: ');

Readln (Nome);

LeNome := Nome;

End;

Procedure AlteraValores (Var Elemento : Apontador; NovoNome : TipoNome; NovoTelefone : TipoTelefone);

Begin

Clrscr;

Writeln ('Procedimento de Alteracao');

Writeln ('-------------------------');

Writeln;

Writeln ('Nome Anterior: ' + Elemento^.Nome);

Writeln ('Telefone Anterior: ' + Elemento^.Telefone);

Writeln;

Writeln ('Novo Nome: ' + NovoNome);

Writeln ('Novo Telefone: ' + NovoTelefone);

Elemento^.Nome := NovoNome;

Elemento^.Telefone := NovoTelefone;

Writeln ('Alteracao efetuada com sucesso...');

Readln;

End;

End.

Olá,

Você está usando uma variável que não existe.

Se esse numero estiver se referindo a "posição" na lista, use o contador. Eu pelo menos entendi assim. Veja ai...

Procedure ListaElementos (Ap : Apontador);
Var
Temp : Apontador;
Contador : Integer;
Begin
Clrscr;
Writeln ('Listando Nomes e Telefones');
Writeln ('--------------------------');
Writeln;
Contador := 0;
Temp := Ap;
If (Temp = Nil) Then
Writeln ('A lista esta vazia...');
While (Temp <> Nil) Do
Begin
Contador := Contador + 1;
// Write (IntToStr ([COLOR="Red"]Numero[/COLOR]) + ' - Nome: ' + Temp^.Nome + ' - ');
Write ([COLOR="Blue"]Contador[/COLOR], ' - Nome: ' + Temp^.Nome + ' - ');
Writeln ('Telefone: ' + Temp^.Telefone);
Temp := Temp^.Proximo;
End;
Readln;
End;

OBS.: Veja que para imprimir dados na tela (write) não necessariamente o dado tem que está em string ou char. Para separar as variáveis ou textos você também pode usar ",". Por exemplo, poderia ficar assim:

Write (Contador,' - Nome: ',Temp^.Nome,' - ');

Dá no mesmo. Quando usa "+" o pascal "concatena os textos" e depois imprime. E com "," ela simplesmente imprime cada valor, que no final vai dar no mesmo. Resumindo: não precisa converter para texto... imprime direto.

Qualquer coisa é só postar.

Abraços

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!