• Prezados usuários,

    Por questões de segurança, a partir de 22/04/2024 os usuários só conseguirão logar no fórum se estiverem com a "Verificação em duas etapas" habilitada em seu perfil.

    Para habilitar a "Verificação em duas etapas" entre em sua conta e "Click" em seu nick name na parte superior da página, aparecerá opções de gestão de sua conta, entre em "Senha e segurança", a primeira opção será para habilitar a "Verificação em duas etapas".

    Clicando alí vai pedir a sua senha de acesso ao fórum, e depois vai para as opções de verificação, que serão as seguintes:

    ***Código de verificação via aplicativo*** >>>Isso permite que você gere um código de verificação usando um aplicativo em seu telefone.

    ***Email de confirmação*** >>>Isso enviará um código por e-mail para verificar seu login.

    ***Códigos alternativos*** >>>Esses códigos podem ser usados para fazer login se você não tiver acesso a outros métodos de verificação.

    Existe as 3 opções acima, e para continuar acessando o fórum a partir de 22/04/2024 você deverá habilitar uma das 03 opções.

    Tópico para tirar dúvidas>>>>https://forum.adrenaline.com.br/threads/obrigatoriedade-da-verificacao-em-duas-etapas-a-partir-de-24-04-2024-duvidas.712290/

    Atencionamente,

    Administração do Fórum Adrenaline

[Problema] Resolução de exercício simples em JAVA

xxleloxx

know-it-all Member
Registrado
Bom dia galera, comecei a estudar java e estou com problemas na resolução de um exercício bem simples ( ao meu ver )



O enunciado é esse

Escreva um programa que, dada uma variável x com algum valor inteiro, temos um novo x de acordo com a seguinte regra:

  • se x é par, x = x / 2
  • se x é impar, x = 3 * x + 1
  • imprime x
  • O programa deve parar quando x tiver o valor final de 1. Por exemplo, para x = 13, a saída será:40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1
Meu código atual esta da seguinte forma
Java:
class ValorX { 

  public static void main (String[] args ) {

int x = 13; 

         for (int i = 0; i < x; i++ ) { 

                   if ( x % 2 == 0 ) { 

                       x = x/2;

                  } else {

                          if ( x % 2 == 1 ) { 

                          x = (3*x)+1;

                          }
                    }
           System.out.print(x+" ");
         }
  } 
}

o problema é que só é exibido até o número 4, ja tentei colocar um IF para caso o i seja 2 ou 1 exibi-lo, fiz uma tentativa com While + For mas ainda to boiando quanto a utilização do While, alguem poderia apresentar uma solução dentro do meu código ? Estou seguindo a apostila FJ-11 da Caluem então não gostaria ainda de utilizar nada muito fora do padrão apresentado pela mesma.


Obrigado!.

-------------

Como diabos eu utilizo a tag CODE pra apresentar o código de uma forma amigavel ? .-.
 
Última edição:
Cara, procura sobre indentação no Java, pois ajuda muito você ler e para outras pessoas lerem seu código.

Não sei se intendi muito bem seu exercício, preciso praticar muito Java ainda. Mas veja se essa solução é a desejada.

Obs: Precisa por o System.out em todos os "if's / elses" se quiser que imprima tudo. Como tem duas condições para os resultados, se PAR ou IMPAR, você já verificou se era par, se não for, é impar na certa, então achei desnecessário verificar se é impar também.

Mas não sei se essa é a melhor solução. Talvez exista erro e outras melhores.

Qualquer coisa, só falar...

Java:
public class ValorX {
    public static void main (String[] args){
        
        int x = 13;
        
       for(int i = 0; i <= x; i++){
            if (x % 2 == 0){
                x = x/2;
                System.out.println(x);                       
            } else {
                x = (3 * x) + 1;
                System.out.println(x);
            }
            
        }
    }
}
 
Última edição:
Não resolveu, o problema é que tanto o meu código quanto o seu código só exibe os valores até o numero 4 considerando o exemplo - > x = 13, a saída será:40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1

A exibição termina em 4, o 2 e o 1 são ignorados.
 
Por que não usar

Java:
while(x > 1) {

ao invés do loop-for?

Porque quando i == 6, x == 4 e aí ele vai sair do loop....
 
Última edição:
Escreva um programa que, dada uma variável x com algum valor inteiro, temos um novo x de acordo com a seguinte regra:
se x é par, x = x / 2
se x é impar, x = 3 * x + 1
imprime x
O programa deve parar quando x tiver o valor final de 1. Por exemplo, para x = 13, a saída será:40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1

Procurei no Google e encontrei esse problema, mas não havia verificado a questão de ter uma nova variável para receber o valor.

Veja se ficou legal assim e se resolve. Tentei fazer um breve comentário no código para explicar, mas não sei se está 100% e se fui claro.

Java:
public class ValorX {
    public static void main (String[] args){
        
       int x = 13; //VARIÁVEL X
       int x2 = 0; //NOVA VARIÁVEL X
        
       while (x != 1){ // ENQUANTO X FOR DIFERENTE DE 1 EXUCUTA O LOOP
            if (x % 2 == 0){
                x2 = x / 2;
                System.out.println(x2);                       
            } else {                 
                x2 = 3 * x + 1;                
                System.out.println(x2);       
            }            
            x = x2;               
       }
    }
}

/**
* Quando x = 13, vai cair no else,  x2 vai receber 40 e imprimir na tela, no final do while x recebe o x2,
* e o loop vai seguindo esses valores.
*
*/
 
Última edição:
Fiz rapidao aqui no trampo, mas tentei ser didatico o suficiente para que voce possa fazer os seus programas
Código:
package br.com.adrenaline.exercicio1;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Adrenaline {
	
	private JFrame frame;
	private String valorDigitado;
	
	public Adrenaline(){
		this.frame =new JFrame("Adrenaline o misterioso valor de X"); 
	}
	public void obterValorUsuario(){
		valorDigitado = JOptionPane.showInputDialog(frame, "Digite um valor inteiro maior que 0");
	}
	public void aplicarFormula(){
		if(valorDigitado!=null && !"".equals(valorDigitado)){
			try{
				Integer valorConvertido = Integer.parseInt(valorDigitado);
				CalculadorX calculadorX = new CalculadorX(valorConvertido);
				Integer novoX = calculadorX.calcular();
				JOptionPane.showMessageDialog(frame, "O novo X é :"+novoX);
			}catch(Exception e){
				System.out.println("V");
				JOptionPane.showMessageDialog(frame, "O valor digitado não corresponde a um inteiro");
			}
			
		}		
	}
	
	public static void main(String[] args) {
		Adrenaline exec1 = new Adrenaline();
		exec1.obterValorUsuario();
		exec1.aplicarFormula();
	}
	
	class CalculadorX{
		private Integer valorX;
		
		public CalculadorX(Integer x){
			this.valorX = x;
		}
		
		public Integer calcular(){
			//se for par OU (menor ou igual a zero retorna zero)
			Integer novoX = 0;
			
			if(this.valorX!=null){
				//se for par e maior que zero divide por 2
				if(this.valorX % 2 == 0 && this.valorX > 0){
					novoX = this.valorX/2;
					//se for impar faz a formula maluca
				}else if (this.valorX % 2 != 0){
					novoX = 3 * (this.valorX+1);
				}
				
			}
			
			return novoX;
		}
	}
}
 
Fiz rapidao aqui no trampo, mas tentei ser didatico o suficiente para que voce possa fazer os seus programas
Código:
package br.com.adrenaline.exercicio1;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Adrenaline {
	
	private JFrame frame;
	private String valorDigitado;
	
	public Adrenaline(){
		this.frame =new JFrame("Adrenaline o misterioso valor de X"); 
	}
	public void obterValorUsuario(){
		valorDigitado = JOptionPane.showInputDialog(frame, "Digite um valor inteiro maior que 0");
	}
	public void aplicarFormula(){
		if(valorDigitado!=null && !"".equals(valorDigitado)){
			try{
				Integer valorConvertido = Integer.parseInt(valorDigitado);
				CalculadorX calculadorX = new CalculadorX(valorConvertido);
				Integer novoX = calculadorX.calcular();
				JOptionPane.showMessageDialog(frame, "O novo X é :"+novoX);
			}catch(Exception e){
				System.out.println("V");
				JOptionPane.showMessageDialog(frame, "O valor digitado não corresponde a um inteiro");
			}
			
		}		
	}
	
	public static void main(String[] args) {
		Adrenaline exec1 = new Adrenaline();
		exec1.obterValorUsuario();
		exec1.aplicarFormula();
	}
	
	class CalculadorX{
		private Integer valorX;
		
		public CalculadorX(Integer x){
			this.valorX = x;
		}
		
		public Integer calcular(){
			//se for par OU (menor ou igual a zero retorna zero)
			Integer novoX = 0;
			
			if(this.valorX!=null){
				//se for par e maior que zero divide por 2
				if(this.valorX % 2 == 0 && this.valorX > 0){
					novoX = this.valorX/2;
					//se for impar faz a formula maluca
				}else if (this.valorX % 2 != 0){
					novoX = 3 * (this.valorX+1);
				}
				
			}
			
			return novoX;
		}
	}
}

Didático foi, mas para iniciante com o código orientado a objeto vai dar um nó na cabeça :haha:
 
Só para constar, dá para resolver de maneira recursiva também:

Java:
public void exercicio(int x) {
    System.out.println(x);
    if(x == 1) {
        return;
    } else if(x % 2 == 0){
       exercicio(x/2);
    } else {
       exercicio(3*x+1);
    }
}

Eu não testei o código, mas a idéia é essa aí. Como teste, veja o que acontece se você colocar o system.out como último comando da função, ao invés de deixá-lo como primeiro da forma que eu fiz.... ;)
 

Users who are viewing this thread

Voltar
Topo