Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi conjectura de collartz pascal


Posts recomendados

Boa tarde meus queridos, estou com um problema no seguinte exercício: 

 

Screenshot_3.png.ceb7f18e95763a7680f5e26a87cda8e8.png

ele compila mas não da a resposta correta

 

Program Pzim ;
var n,i,j,resultado,contador:integer;
Begin
  writeln('digite um numero para aplicarmos a conjectura de collartz, mostrando cada resultado e quantas vezes foi aplicado');
  readln(n);
  For resultado:=n to 1 do
  begin
    if (n mod 2<>0) then
    begin
      resultado:=(3*resultado)+1 ;
      contador:= contador+1;
      writeln(resultado)
        end
    else
    begin
      resultado:=resultado div 2 ;
      contador:= contador+1;
      writeln(resultado)
        end;
  end;
 writeln(contador) 
End.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

Vou tentar comentar do modo longo.. vamos lá:

 

1#

1 hora atrás, Bruno Gabriel de Andrade disse:

  For resultado:=n to 1 do
  begin
    if (n mod 2<>0) then
    begin
      resultado:=(3*resultado)+1 ;
      contador:= contador+1;
      writeln(resultado)
        end
    else
    begin
      resultado:=resultado div 2 ;
      contador:= contador+1;
      writeln(resultado)
        end;
  end;


Você está alterando a variável "controladora do for" dentro do for (variável resultado). Não pode (pelo menos assim entendo). Perceba que quebra a lógica da estrutura do for. No Pascal, o for é algo como "para variável n de x até y", ou seja, para a variável ter cada um dos valores entre x e y (conceitualmente é projetado para executar y-x+1 vezes!). Ao alterar o valor da variável como você fez, estará alterando o propósito do for. Inclusive era para dar erro de compilação, mas por algum motivo o PascalZim aceita (mas não deveria. O compilador deveria identificar e não avisar que não pode).

 

 

 

2#
Outra coisa, esse for vai do "menor valor para o maior", já que utilizou to (é crescente), mas o problema só funcionado com número naturais, correto?, ou seja, números maiores que 0, logo, nunca vai entrar no for. Por exemplo: se digitar 5, como vai de 5 até 1? como 5 é maior que 1, o for termina sem executar alguma vez.

 

Para decrescer, utilizaria o downto. Mas lembrando: não pode alterar o valor da variável que está lá na "assinatura" do for, pois só o for pode alterar ela. São 2 problemas: esse do 2# e o problema do 1#.

 

 

 

3#

Então, o problema pede que "conte a quantidade de vezes", certo? Essa informação não está disponível ainda (afinal, você quer encontrar), mas você tentou implementar utilizando um for... que por sua vez funciona de modo a "repetir determinado número de vezes", ou seja, não é a estrutura adequada (no Pascal). Entende? está utilizando uma estrutura que usa uma quantidade de loops pré-determinados para encontrar essa própria quantidade de loops que precisa. Vê o paradoxo?

 

Para esse caso, você poderia utilizar um repeat ou while.

 

 

 

4#

Das 3 linhas de cada parte da estrutura de seleção (if e else) está utilizando 2 iguais. Como TODO número natural é SEMPRE par OU ímpar, necessariamente vai entrar em uma dessas partes, logo, sempre essas duas linhas vão ser executas. Resumindo: retire essas duas linhas do if e do else e coloque depois do else. Nas partes só vai ter as respectivas operações. E fora atualiza o contador e exibe o valor lá.

 

 

 

5#

Você inverteu a ordem das operações. Primeiro verifica se é par, depois verifica se é ímpar.

Faz diferença no resultado? nesse caso não (é fácil verificar), mas se a conjectura está numa ordem, porque mudá-la? (nem sempre é tão fácil verificar... e de qualquer forma, é preferível seguir do jeito que é)

 

obs.: como já sugerido, não precisa de 2 if, pois se não for um, será o outro, ou seja, basta verificar se é par, se não for, será ímpar. No seu código você está verificando se é ímpar antes. Julgo como errado.

 

 

 

***

 

No aguardo.

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

Muito obrigado, vou mandar o código aqui, ele está compilando e executando certinho.

Program Pzim ;
var n,resultado,contador:integer;
Begin
  writeln('digite um numero para aplicarmos a conjectura de collartz, mostrando cada resultado e quantas vezes foi aplicado');
  readln(n);
  while (n<>1) do
  begin
    if (n mod 2= 0) then
    begin
      n:= n div 2;
      contador:= contador+1;
      write(n,' ')
      end
      else 
      begin
        n:=(3*n)+1 ;
        contador:=contador+1;
        write(n,' ')
      end;
    end;
    writeln('o numero de vezes que foi utilizado a conjectura foi de ',contador)
  End.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Faltou:

4 horas atrás, Simon Viegas disse:

4#

Das 3 linhas de cada parte da estrutura de seleção (if e else) está utilizando 2 iguais. Como TODO número natural é SEMPRE par OU ímpar, necessariamente vai entrar em uma dessas partes, logo, sempre essas duas linhas vão ser executas. Resumindo: retire essas duas linhas do if e do else e coloque depois do else. Nas partes só vai ter as respectivas operações. E fora atualiza o contador e exibe o valor lá.

  • Curtir 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...