Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi LISTA DINAMICA pascal/ copa de futebol


Posts recomendados

Não consigo percorrer e entender os ponteiros, a minha inclusão ta bem ruim , preciso inclui de acordo com o ultimo ponteiro ne, como encontro o ultimo ponteiro ?

Program COPA ;

const
SAIR = 8;

TYPE
ponteiro_time = ^time;

time = RECORD
  nome: string [30];
  qtdpontos: integer;
  golsmarcados: integer;
  golssofridos: integer;
  prox: ponteiro_time;
END;

var
atual: ponteiro_time; //aponta para elemento da lista de time
inicio: ponteiro_time; // ponteiro para o in?cio da lista
ponteiro_auxiliar:
ponteiro_time;
times: time;
opcao, codigo: integer;
continuar:char;

procedure menu;
begin
  writeln('******* Menu de Opções *******');
  writeln('Escolha uma opcao:');
  writeln('1 – Incluir Time');
  writeln('2 – Mostrar o número de pontos, gols marcados e gols sofridos de um time');
  writeln('3 – Listar ordenadamente todos os times');
  writeln('4 – Mostrar os 4 primeiros times na classificação');
  writeln('5 – Mostrar os 4 últimos times na classificação');
  writeln('6 – Mostrar time com o melhor ataque');
  writeln('7 – Mostrar time com a defesa mais vazada');
  writeln('8 - Sair');
  readln(opcao);
end;

//cria uma lista vazia
procedure cria_lista (var lista: ponteiro_time);
begin
  lista:= nil;
  atual:=lista;
end;

//retorna verdadeiro se a lista est? vazia e falso caso contr?rio
function lista_vazia (var lista: ponteiro_time): boolean;
begin
  if (lista = nil) then
  lista_vazia := true
  else
  lista_vazia := false;
end;

procedure incluir_time ;
begin
  writeln('DIGITE O NOME DO TIME');
  readln(time.nome);
  writeln('DIGITE A QUANTIDADE DE PONTOS DO TIME');
  readln(time.qtdpontos);
  writeln('DIGITE O TOTAL DE GOLS MARCADOS PELO TIME');
  readln(time.golsmarcados);
  writeln('DIGITE O TOTAL DE GOLS SOFRIDOS PELO TIME');
  readln(time.golssofridos);
end;


procedure localiza
writeln('digite o time a ser localizado');
readln (x);
repeat
  ponteiro_time=atual;
  ponteiro_time=prox;
until (ponteiro_time=x) or (ponteiro_time=nil);
if (ponteiro_time=x) then
writeln('time encontrado com sucesso, sua quantidade depontos é' time.qtdpontos', seus gols marcados totalizam 'time.golsmarcados', seus gols sofridos totalizam'time.golssofridos);
else writeln('o time nao existe, para incluí-lo basta voltar ao menu e ir na opcao 2, digite s/n para voltar ao menu ');
readln (continuar);
if (continuar=s) then (menu)
else (sair=8);

Begin
  repeat
    menu;
    if (opcao=1) then
    lista_vazia
    cria_lista
    incluir_time
    else if   (opcao=2) then
    localiza
    else if (opcao=3) then 
    ordena
      else if (opcao=4) then 
    quatro_primeiros
        else if (opcao=5) then 
    quatro_ultimos
        else if (opcao=6) then 
    maior_golsmarcados
          else if (opcao=7) then 
    menor_golssofridos;
    
  until opcao = SAIR;
End.

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

1#

Sugiro ter uma maior atenção para indentação. O código sempre deve ficar indentado. Ex.:

Código:

Spoiler

program COPA ;
const
  SAIR = 8;

type
  ponteiro_time = ^time;
  time = record
    nome: string [30];
    qtdpontos: integer;
    golsmarcados: integer;
    golssofridos: integer;
    prox: ponteiro_time;
  end;

var
  atual    : ponteiro_time; //aponta para elemento da lista de time
  inicio   : ponteiro_time; // ponteiro para o in?cio da lista
  ponteiro_auxiliar : ponteiro_time;
  times    : time;
  opcao, 
  codigo   : integer;
  continuar: char;

procedure menu;
begin
  writeln('******* Menu de Opções *******');
  writeln('Escolha uma opcao:');
  writeln('1 – Incluir Time');
  writeln('2 – Mostrar o número de pontos, gols marcados e gols sofridos de um time');
  writeln('3 – Listar ordenadamente todos os times');
  writeln('4 – Mostrar os 4 primeiros times na classificação');
  writeln('5 – Mostrar os 4 últimos times na classificação');
  writeln('6 – Mostrar time com o melhor ataque');
  writeln('7 – Mostrar time com a defesa mais vazada');
  writeln('8 - Sair');
  readln(opcao);
end;

//cria uma lista vazia
procedure cria_lista (var lista: ponteiro_time);
begin
  lista:= nil;
  atual:=lista;
end;

//retorna verdadeiro se a lista est? vazia e falso caso contr?rio
function lista_vazia (var lista: ponteiro_time): boolean;
begin
  if (lista = nil) then
    lista_vazia := true
  else
    lista_vazia := false;
end;

procedure incluir_time ;
begin
  writeln('DIGITE O NOME DO TIME');
  readln(time.nome);
  writeln('DIGITE A QUANTIDADE DE PONTOS DO TIME');
  readln(time.qtdpontos);
  writeln('DIGITE O TOTAL DE GOLS MARCADOS PELO TIME');
  readln(time.golsmarcados);
  writeln('DIGITE O TOTAL DE GOLS SOFRIDOS PELO TIME');
  readln(time.golssofridos);
end;

procedure localiza
  writeln('digite o time a ser localizado');
  readln(x);
  repeat
    ponteiro_time=atual;
    ponteiro_time=prox;
  until (ponteiro_time=x) or (ponteiro_time=nil);
  if (ponteiro_time=x) then
    writeln('time encontrado com sucesso, sua quantidade depontos é' time.qtdpontos', seus gols marcados totalizam 'time.golsmarcados', seus gols sofridos totalizam'time.golssofridos);
  else
    writeln('o time nao existe, para incluí-lo basta voltar ao menu e ir na opcao 2, digite s/n para voltar ao menu ');
  readln(continuar);
if (continuar=s) then
  menu
else
  sair=8;

begin
  repeat
    menu;
    if (opcao=1) then
      lista_vazia
    cria_lista
    incluir_time
    else if   (opcao=2) then
      localiza
    else if (opcao=3) then 
      ordena
    else if (opcao=4) then 
      quatro_primeiros
    else if (opcao=5) then 
      quatro_ultimos
    else if (opcao=6) then 
      maior_golsmarcados
    else if (opcao=7) then 
      menor_golssofridos;
  until opcao = SAIR;
end.

 

 

 

2#
Em relação a implementação, recomendo fazer por partes. Implemente uma procedure de cada vez. Compile constantemente para ver se tem algum erro de sintaxe. Ex.:
 

Inicialmente só implementei o menu e a criação da lista:

program COPA ;
const
  SAIR = 8;

type
  ponteiro_time = ^time;
  time = record
    nome: string [30];
    qtdpontos: integer;
    golsmarcados: integer;
    golssofridos: integer;
    prox: ponteiro_time;
  end;

var
  atual    : ponteiro_time; //aponta para elemento da lista de time
  inicio   : ponteiro_time; // ponteiro para o in?cio da lista
  ponteiro_auxiliar : ponteiro_time;
  times    : time;
  opcao, 
  codigo   : integer;
  continuar: char;

procedure menu;
begin
  writeln('******* Menu de opções *******');
  writeln('Escolha uma opcao:');
  writeln('//1 - Incluir Time');
  writeln('//2 - Mostrar o numero de pontos, gols marcados e gols sofridos de um time');
  writeln('//3 - Listar ordenadamente todos os times');
  writeln('//4 - Mostrar os 4 primeiros times na classificacao');
  writeln('//5 - Mostrar os 4 ultimos times na classificacao');
  writeln('//6 - Mostrar time com o melhor ataque');
  writeln('//7 - Mostrar time com a defesa mais vazada');
  writeln('//8 - Sair');
  readln(opcao);
end;

  
begin
  repeat
    menu;


  until opcao = SAIR;
end.

No caso, os // indicando o que ainda não foi implementado.


 

 

3#
Implementando outra parte, por exemplo a inserção:

function inserir_lista(var inicio:ponteiro_time; dadosTime:time):boolean;
  var
    p:ponteiro_time; //ponteiro para o novo time
  begin
  new(p); //cria um novo ponteiro
  p^.nome        :=dadosTime.nome;
  p^.qtdpontos   :=dadosTime.qtdPontos;
  p^.golsmarcados:=dadosTime.golsmarcados;
  p^.golssofridos:=dadosTime.golssofridos;
  p^.prox:=inicio; //aponta primeira posição
  inicio:=p; //a primeira posição para ser a posição no novo time
  end;

Obs.: nesse caso, as novas posição vão ficando no início.

 

 

 

4#

Implementando a leitura dos dados do time:

procedure ler_time(var dadosTime:time);
begin
  writeln('DIGITE O NOME DO TIME');
  readln(dadosTime.nome);
  writeln('DIGITE A QUANTIDADE DE PONTOS DO TIME');
  readln(dadosTime.qtdpontos);
  writeln('DIGITE O TOTAL DE GOLS MARCADOS PELO TIME');
  readln(dadosTime.golsmarcados);
  writeln('DIGITE O TOTAL DE GOLS SOFRIDOS PELO TIME');
  readln(dadosTime.golssofridos);
end;

 

Por ai vai..

 

 

5#

Implementei mais algumas coisas... Por enquanto teria algo assim:

program COPA ;
uses
  CRT;
const
  SAIR = '8';
type
  ponteiro_time = ^time;
  time = record
    nome        :string[30];
    qtdpontos   :integer;
    golsmarcados:integer;
    golssofridos:integer;
    prox        :ponteiro_time;
  end;

procedure menu(var opcao:char);
begin
  writeln('******* Menu de opções *******');
  writeln('Escolha uma opcao:');
  writeln('1 - Incluir Time');
  writeln('2 - Mostrar o numero de pontos, gols marcados e gols sofridos de um time');
  writeln('//3 - Listar ordenadamente todos os times');
  writeln('//4 - Mostrar os 4 primeiros times na classificacao');
  writeln('//5 - Mostrar os 4 ultimos times na classificacao');
  writeln('//6 - Mostrar time com o melhor ataque');
  writeln('//7 - Mostrar time com a defesa mais vazada');
  writeln('//8 - Sair');
  readln(opcao);
end;

//cria uma lista vazia
procedure cria_lista(var lista:ponteiro_time);
begin
  lista:=NIL;
end;

//retorna verdadeiro se a lista está vazia e falso caso contrário
function lista_vazia (lista:ponteiro_time):boolean;
begin
  if (lista = nil) then
    lista_vazia:=true
  else
    lista_vazia:=false;
end;

function inserir_lista(var inicio:ponteiro_time; dadosTime:time):boolean;
  var
    p:ponteiro_time; //ponteiro para o novo time
  begin
  new(p); //cria um novo ponteiro
  p^.nome        :=dadosTime.nome;
  p^.qtdpontos   :=dadosTime.qtdPontos;
  p^.golsmarcados:=dadosTime.golsmarcados;
  p^.golssofridos:=dadosTime.golssofridos;
  p^.prox:=inicio; //a próxima posição aponta para a então primeira posição
  inicio:=p; //a primeira posição passa a ser a posição do atual novo time
  end;

procedure ler_time(var dadosTime:time);
begin
  writeln('DIGITE O NOME DO TIME');
  readln(dadosTime.nome);
  writeln('DIGITE A QUANTIDADE DE PONTOS DO TIME');
  readln(dadosTime.qtdpontos);
  writeln('DIGITE O TOTAL DE GOLS MARCADOS PELO TIME');
  readln(dadosTime.golsmarcados);
  writeln('DIGITE O TOTAL DE GOLS SOFRIDOS PELO TIME');
  readln(dadosTime.golssofridos);
end;
  
  
procedure exibe_lista(inicio:ponteiro_time);
  var 
    aux:ponteiro_time;
  begin 
  aux:=inicio; //copia a posição da primeira posição
  while aux <> NIL do
    begin 
    writeln(aux^.nome);
    aux:=aux^.prox; 
    end; 
  write  ('Tecle <enter> para continuar...');
  readln;
End; 
  
var
  inicio   :ponteiro_time; //ponteiro para o início da lista
  dadosTime:time;           //dados do novo time
  opcao    :char;
  
  
begin
  cria_lista(inicio); //inicializa a lista
  repeat
    ClrScr;
    menu(opcao);
    case opcao of
      '1':begin //Incluir time
          ler_time(dadosTime);
          inserir_lista(inicio,dadosTime);
          end;
      '2':begin
          //em construção
          writeln('EM CONSTRUÇÃO');
          writeln('Exibindo apenas o nome e na ordem padrão da lista (+ novos primeiro)');
          exibe_lista(inicio);
          end;
      '3':begin
          //em construção
          end;
    end; //fim case
  until opcao = SAIR;
end.

 

Qualquer dúvidas, sobre qualquer parte é só perguntar..

 

 

6#

Então, eu considero que a implementação com ponteiros algo não tão trivial... ou seja, ela tem características que inicialmente podem parecer confusas... é preciso estudar um pouco sobre e também ter contato com códigos... sugiro que pegue CÓDIGOS PRONTOS e analise o seus funcionamentos. Lembrando: não é algo trivial mesmo.. que bate o olho e já sai entendendo ou deduzindo, mas também não é coisa do outro mundo. Com auxílio de uma apostila dá para entender de boa.. pegando a base... vai embora!!!

 

A mesma coisa se aplica a implementação de "lista encadeadas". É meio estranho está ainda se habituando com a lógica de ponteiros, e a ainda sim ter que "inventar" como deveria funcionar uma lista. RESUMINDO: não precisa, e NEM DEVE, tentar reinventar a roda. As estruturas já estão prontas e disponíveis... apenas que você pode ENTENDER E REUTILIZAR, assim como READAPTAR PARA O SEU CONTEXTO.

 

Pesquise listas encadeadas prontas ou apostilas... por exemplo, eu usei achei esse como parâmetro:

http://osorio.wait4.org/oldsite/prog2/prog2-listaencsimp.pdf

 

Fui entendendo a ajustando mais ou menos de acordo com o padrão que você criou. ;)

 

 

7#

PRÓXIMAS ETAPAS SUGERIDAS PARA IMPLEMENTAÇÃO:

Em vez de inserir no início (que deixa na ordem inversa de inserção), mude para inserir no fim. Faz testes até que funcione certinho. Deixei na opção 2 uma opção para exibir os nomes de cada time apenas para testar.

 

Após, implemente a opção 2 do menu, ou seja, que pesquise um time específico. A opção 2 não não vai mais exibir a lista, mas sim perguntar qual time quer exibir. Daí pesquisa o time e exibe os dados que foi solicitado ou que o time não existe

 

 

***

 

Caso queira seguir essa lógica, é só postar o código completo para analisarmos. Caso tenha dúvidas sobre alguma parte é só perguntar... críticas e sugestões são bem vindos também.

 

No aguardo.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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!