Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

darkangel_13

Duvida em java , simples

Mensagens Recomendadas

darkangel_13

Boa tarde , estou com uma duvida, estava a tentar fazer um exercicio que tem como objectivo descobrir o menor numero cujo o factorial é maior que k ...

Só que o código compila mas está com um erro de lógica , se me puderem ajudar.. cumps

public class fact{
 public static void main(String[] args ) {
   int k = 10 ;
   int fact=1;
   int menor = 0;
   do{
     for(int i = 1; i>1 ; i++){
       for(int j=i;j>=1;j--){
         fact=fact*j;
         if(fact>k)
           menor = j;
       }
     }
   }while(fact <= k ); 
   System.out.println("soma : "+menor);
 }
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
darkangel_13

Separa o factorial para uma função à parte, primeiro que nada, para que possas aplicar no Main directamente este algoritmo:

i = 1

Fazer
Incrementa i
Enquanto factorial(i) <= k;

Escrever i

acho que já entendi ..

Ainda não testei mas penso que seja isto

public class fact{
 public static void main(String[] args ) {
   int k = 10 ;
   int fact=1;
   int menor = 0;
   do{
     int i =0;
     for(int j=i;j>=1;j--){
       fact=fact*j;
       if(fact>k)
         menor = j;
       }

       i++;

     }
   }while(fact <= k );
   System.out.println("soma : "+menor);
 }
}

Assim ?

Editado por Rui Carlos
Indentação

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

não ... pensa bem no problema : menor numero cujo o factorial é maior que k

1º - saber o factorial

2º - saber se o factorial é maior que k

são dois passos distintos

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
darkangel_13

Saber factorial

public static int fact(int n ){
int fact =1; // guardar o factorial
for(int i =n ; i>=1;i--){
fact*=i;
}
return fact;
}

public static int menor(){
int i =0;
int k=10;
int fact=0;
do{
fact = fact(i);
i++;
}while(fact(i)<=k)
System.out.println("o menor é " + i );
}

Aproveitando esta thread eu tenho uma duvida , quando me pedem por exemplo isto "Defina em Java um tipo Cor cujos únicos valores sejam

os seguintes: amarelo, vermelho, azul, branco." - Estão a pedir-me para criar um tipo enumerado ?

Editado por darkangel_13

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

ainda não está exactamente correcto, vê que estás a chamar a função fact duas vezes no mesmo ciclo, logo uma é desnecessária :

public static int menor(int k){
 int i = 0;
 while (fact(++i) <= k);
 System.out.println("o menor é " + i );
}

sim, está a pedir para criares um tipo enumerado


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
darkangel_13

Então por exemplo .

enum cor {'amarelo', 'vermelho', 'azul', 'branco'};

Será assim ?

Estou a fazer uma classe que me vai criar um tabuleiro

Como é que eu geraria um tabuleiro com os tipos enumerado ?

import java.util.Random;
public class Tabuleiro{
static final int[] tabuleiro = new int [20];
[b]enum cor {'amarelo', 'vermelho', 'azul', 'branco'};
public Tabuleiro(){
Random rd = new Random();
for(int i=0;i<=tabuleiro.length-1;i++){
tabuleiro[i]=..  // para atribuir uma cor
}
}
/*
*Metodo da a dimensao
**/
public static int dimensao(){
return tabuleiro.length;
}
/**
 *um método com a assinatura Cor cor(int casa) que, assumindo que 1≤casa≤
 *dimensao() , devolve a cor da casa dada;
 **/
public static Cor cor(int casa){
// tipo enumarado ?
}
}

No metodo Cor como é que eu o completaria ?

Editado por darkangel_13

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
darkangel_13

private final int cor1 = 0
private final int cor2 = 1
private final int cor3 = 2
private final int cor4 = 3

enum cor {'amarelo', 'vermelho', 'azul', 'branco'};

assim ?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

string : "amarelo" // <---- conjunto de bytes que cofifica o conjunto de caracteres de texto

identificador : amarelo // <---- nome com significado somente em código que representa um valor/método/classe/etc ...


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
darkangel_13

import java.util.Random;
public class Tabuleiro{
static final int[] tabuleiro = new int [20];
enum cor{amarelo,azul,branco,vermelho};
public Tabuleiro(){
Random rd = new Random();
for(int i=0;i<=tabuleiro.length-1;i++){
tabuleiro[i]=..  // para atribuir uma cor
}
}
/*
*Metodo da a dimensao
**/
public static int dimensao(){
return tabuleiro.length;
}
/**
 *um método com a assinatura Cor cor(int casa) que, assumindo que 1≤casa≤
 *dimensao() , devolve a cor da casa dada;
 **/
public static Cor cor(int casa){
// tipo enumarado ?
}
}

Como é que eu poderia pegar nesse tipo enumerado e fazer um random para poder preencher as casas do tabuleiro ?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Como é que eu poderia pegar nesse tipo enumerado e fazer um random

é uma maneira um bocado estranha, mas os dados enumerados são também objectos dos quais é possível adicionar métodos:

protected enum Cor {
   Amarelo,
   Azul,
   Branco,
   Vermelho;

   public static Cor getRandom() {
       return values()[(int) (Math.random() * values().length)];
   }
}

  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
darkangel_13

import java.util.Random;
public class Tabuleiro{
static final int[] tabuleiro = new int [20];
enum cor{amarelo,azul,branco,vermelho};
public Tabuleiro(){
Random rd = new Random();
for(int i=0;i<=tabuleiro.length-1;i++){
tabuleiro[i]=cor.getRandom();
}
}
/*
*Metodo da a dimensao
**/
public static int dimensao(){
return tabuleiro.length;
}
/**
 *um método com a assinatura Cor cor(int casa) que, assumindo que 1≤casa≤
 *dimensao() , devolve a cor da casa dada;
 **/
public static Cor cor(int casa){
// tipo enumarado ?
}

public static Cor getRandom() {
	return values()[(int) (Math.random() * values().length)];
}
}
}

Então seria assim que eu preencheria o tabuleiro?

Muito obrigado pelas respostas

é uma maneira um bocado estranha, mas os dados enumerados são também objectos dos quais é possível adicionar métodos:

protected enum Cor {
Amarelo,
Azul,
Branco,
Vermelho;

public static Cor getRandom() {
	return values()[(int) (Math.random() * values().length)]; // não percebo esta linha ...
}
}

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

seria se tivesses definido a enumeração como te disse : com o método getRandom

no entanto não o estás a fazer, logo a função getRandom não se encontra definida o que dará erro de compilaão na seguinte linha:

tabuleiro[i]=cor.getRandom();

olha bem para o que fiz : eu declarei uma enumeração com um método, e não um método estático solto da classe Tabuleiro


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
darkangel_13

Bom dia tenho outra duvida , estas duvidas surgem pois eu estou a estudar ...

Surgiu-me um exercicio que tem como objectivo substituir certas partes da frase .

Tenho como parte do enunciado isto :

String substituiCaracter(String frase1, String frase2, char ch1, char ch2) .

Exemplo de input : frase1 = “O aluno ***** teve * no exercicio * e * no exercicio *”

frase2 = “O ALUNO 54321 TEVE 5 NO EXERCICIO A”

ch1 = ‘*’ e ch2 = ‘%’

Output: “O aluno 54321 teve 5 no exercicio A e % no exercicio %”

Basicamente o objectivo é onde tem asterisco substituir pela mesma posição da frase 2 e quando não ha mais posição no asterisco substituir por % .

Eu já tentei fazer...

public static String substituiCaracter(String frase1, String frase2, char ch1, char ch2) {
String resultado = new String(frase1);
for(int i=0;i<resultado.length();i++){
if(resultado.indexOf(i)==ch1){
resultado = resultado.replace(resultado.indexOf(i), frase2.indexOf(i));
}
}
}

Ai está a minha ideia, só que não percebo como faço para verificar se existe mais posições para substituir por ch2 , será que tenho que fazer algum tipo de verificação deste genero

if(resultado.indexOf(i)==null && resultado.indexOf(i)==ch1)
resultado=resultado.replace(ch1,ch2);

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
darkangel_13

String resultado = new String(frase1);
while(frase2.length() != null){
int i=0;

if(resultado.indexOf(i)==ch1){

resultado = resultado.replace(resultado.indexOf(i), frase2.indexOf(i));

}
i++;
}

algo assim?

Editado por darkangel_13

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.