Ir ao conteúdo

Posts recomendados

Postado

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.

 

  • Membro VIP
Postado

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
Postado

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.

 

  • Membro VIP
Postado

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

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!