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

ruigalvao112

Programa para adivinhar numeros (ISEL, 1º Trab, PG)

Mensagens Recomendadas

ruigalvao112

Boas :P

Tenho umas duvidas sobre um exercicio que me surgiu num trabalho.

É-me pedido que faça um programa que descbre um numero secreto em que o utilizador pensou. Esse numero tem que pertencer a um intervalo indicador pelo programa ao utilizador. A solicitação inicial feita ao utilizador será "Pense num numero inteiro entre Lmin e Lmax", onde Lmin e Lmax são dois valores inteiros gerados aleatoriamente pelo programa. Seguidamente o programa irá sugerir um valor e pedir ao utilizador para comparar o número sugerido com o numero inicialmente pensado pelo utilizador. O utilizador deverá usar os caracter <, > e = para indicar se o numero proposto é respectivamente menor, maior ou igual ao numero a descobrir. O programa termina quando o computador descobrir o numero screto. Sabe-se que, se o algoritmo for bem escolhido, o computador deverá descobrir o numero secreto em que o utilizador pensou com, no máximo, N perguntas, sendo N = 1 + log2 (Lmax - Lmin + 1).  Os limites de Lmax e Lmin têm que estar compreendidos entre [-1024;1023], sendo sempre Lmax>Lmin.

Traduzindo por outras palavras, os gajos querem um programa que escolha aleatoriamente os limites, de entre um limite pré-definido, e que, através da expressão  N = 1 + log2 (Lmax - Lmin + 1) o programa encontre o numero em que o utilizador pensou em N tentativas.

1ª pergunta - Como é que vou fazer o programa escolher aleatoriamente o intervalo?

2ª (meia) pergunta - Depois de ter os intervalos definidos, na pergunta ao utilizador apenas vou ter que restringuir mais o intervalo de busca, dependendo do sinal que o utilizador introduza, certo?

Se não fosse pedir demasiado seria possivel darem-me uma resposta rápida? É que já tenho pouco tempo para entregar o trabalho. Qualquer das formas, quando alguém me conseguir esclarecer estas duvidas aqui estarei para ler as explicações.

Desde já muitissimo obrigado por se terem dedicado a ler esta sucata toda xD

Cumps :D

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruigalvao112

import java.util.*;

public class Experiencia {

public static void main (String[]args){

int nmax, nmin, restricao1, restricao2, restricao3, tentativas;
String sinal;

nmax = (int) (Math.random() * (1024));
nmin = -1024 + nmax;
sinal = "";
restricao1 = (nmax + nmin)/2;
restricao2 = 0;
restricao3 = 0;
tentativas = 0;

System.out.println ("Pense num numero entre " + nmin + " e " + nmax + ".");
System.out.println ("O numero em que pensou e' maior, menor ou igual a " + restricao1 + "?");

Scanner keyboard = new Scanner (System.in);
sinal = keyboard.nextLine();


while(sinal == ">"){
++tentativas;
nmin = restricao1;
restricao2 = (nmax + nmin)/2;
System.out.println("O numero em que pensou e' maior, menor ou igual a " + restricao2 + "?");
sinal = keyboard.nextLine();
}

while(sinal == "<"){
++tentativas;
nmax = restricao1;
restricao3 = (nmax + nmin)/2;
System.out.println("O numero em que pensou e' maior, menor, ou igual a " + restricao3 + "?");
sinal = keyboard.nextLine();
}

while(sinal == "="){
System.out.println("Numero adivinhado em " + tentativas + " tentativas.");
}

}

}

Estou com um pequeno problema: Quando o programa me pergunta se o numero em que eu pensei é maior, menor ou igual ao que aparece e eu introduzo o sinal segundo seja maior, menor ou igual o programa termina. Alguém me sabe dizer o porquê disso? Será que fiz algum erro ao escrever o programa?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
vasco16

import java.util.*;

public class Experiencia {

public static void main (String[]args){

int nmax, nmin, restricao1, restricao2, restricao3, tentativas;
String sinal;

nmax = (int) (Math.random() * (1024));
nmin = -1024 + nmax;
sinal = "";
restricao1 = (nmax + nmin)/2;
restricao2 = 0;
restricao3 = 0;
tentativas = 0;

System.out.println ("Pense num numero entre " + nmin + " e " + nmax + ".");
System.out.println ("O numero em que pensou e' maior, menor ou igual a " + restricao1 + "?");

Scanner keyboard = new Scanner (System.in);
sinal = keyboard.nextLine();


while(sinal == ">"){
++tentativas;
nmin = restricao1;
restricao2 = (nmax + nmin)/2;
System.out.println("O numero em que pensou e' maior, menor ou igual a " + restricao2 + "?");
sinal = keyboard.nextLine();
}

while(sinal == "<"){
++tentativas;
nmax = restricao1;
restricao3 = (nmax + nmin)/2;
System.out.println("O numero em que pensou e' maior, menor, ou igual a " + restricao3 + "?");
sinal = keyboard.nextLine();
}

while(sinal == "="){
System.out.println("Numero adivinhado em " + tentativas + " tentativas.");
}

}

}

Estou com um pequeno problema: Quando o programa me pergunta se o numero em que eu pensei é maior, menor ou igual ao que aparece e eu introduzo o sinal segundo seja maior, menor ou igual o programa termina. Alguém me sabe dizer o porquê disso? Será que fiz algum erro ao escrever o programa?

Isso acontece porque tens isso em ciclos individuais, ou seja como o java é uma linguagem topdown, ele vai compilar o teu codigo e vai entrar no while em questao, se for "<" entra no while do < etc.. para resolveres isso, podes por exemplo: meter todos esses whiles dentro de um outro :D

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruigalvao112

Obrigado pelo dica =)

Vou já experimentar isso :P

edit: Não consegui =X Continua a não entrar dentro de qualquer while :D . Já experimentei fazer um while principal q fosse while( sinal != "=") e pus todos lá dentro excepto o ultimo, e continuo sem obter qualquer feedback.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Não percebi bem o que estás a tentar fazer mas uma coisa que salta à vista é que em Java os objectos não se comparam com == a não ser que queiras comparar referências e como String é um objecto imutável, duas strings nunca têm a mesma referência, nunca se comparam objectos do tipo String com os sinais de igual.

Uma string compara-se usando o método equals, comparteTo ou compareToIgnoreCase

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jarsantos

Para não me acusarem de dar as soluções:

1º Geração de Lmax e Lmin

- Deves começar por gerar 2 números aleatórios entre entre 0 e 1.

- Depois deves aplicar a seguinte transformação: 2048*num-1024 - Assim obtens 2 números entre os limites dados no enunciado.

- Comparas os dois e atribuis o maior número a Lmax e o menor a Lmin.

2º Descobrir o número que o utilizador escolhei

- Entras num ciclo while que termina quando o input do utilizador for '='

- Caso o input seja maior, defines Lmax igual ao número da sugestão

- Caso o input seja menor, definas Lmin igual ao número de sugestão

3º Definir o número de sugestão

- O número a sugerir é basicamente fazer (Lmax - Lmin)/2

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruigalvao112

Epah estou desesperado. Quando os calculos me fazem sentido é a String que falha, quando a String está fixe são os calculos que estão errados. Fogo, I'm going crazy  😡 . Se não fôr pedir muito alguém consegue arranjar-me o código a ver se eu percebo onde raio estou errado?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruigalvao112

import java.util.*;

public class Experiencia {

public static void main (String[]args){

int nmax, nmin, medio1, tentativas, medio2, medio3;
String sinal;

nmax = (int) (Math.random() * (1024));
nmin = -1024 + nmax;
medio1 = (nmax - nmin)/2;
tentativas = 0;


System.out.println ("Pense num numero entre " + nmin + " e " + nmax + ".");
System.out.println ("O numero em que pensou e' maior, menor ou igual a " + medio1 + "?");

Scanner keyboard = new Scanner (System.in);
sinal = keyboard.nextLine();

while (sinal.charAt(0) != '='){

	while (sinal.charAt(0) == '>'){
		nmax = medio1;
		medio2 = (nmax - nmin)/2;
		tentativas++;
		System.out.println("O numero em que pensou e' maior, menor ou igual a " + medio2 + "?");
		sinal = keyboard.nextLine();
		}

	while (sinal.charAt(0) == '<'){
		nmin = medio1;
		medio3 = (nmax - nmin)/2;
		tentativas++;
		System.out.println("O numero em que pensou e' maior, menor, ou igual a " + medio3 + "?");
		sinal = keyboard.nextLine();
		}
}

if(sinal.charAt(0) == '='){
	System.out.println("Numero adivinhado em " + tentativas + " tentativas.");
	}




}

}

Agora não dá erros de compilação

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruigalvao112

Não seguiste nenhum conselho que te foi dado. Desculpa mas assim não mereces qualquer tipo de ajuda.

Não? Então não pus um ciclo while principal como dois utilizadores disseram para fazer?!

O resto de dicas que me foram dando era dicas teoricas, como é que pudia aplicá-las no código?

Mas pronto, tudo bem, não queres ajudar não há problema. Thanks anyway

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DVD

Estive a tentar não me meter na conversa, mas tu nem digas que és do isel que eu fico cheio de vergonha lool, já agora és de Redes certo?

Indo ao topico, esses whiles que tens:

while  (sinal.charAt(0) == '>')

podem muito bem ser ifs, algo que qualquer engº de PG ensina no isel é dividir o problema por vários sub problemas, e resolve-lo no papel antes sequer de fazer qualquer linha de código. . .

Isso resolve-se tudo com um métodozeco sem repetir tanta linha de codigo como repetiste.

Sendo este o semestre de Verão certamente já aprendes-te isso no semestre passado.

BTW posts anteriores descreveram-te completamente o algoritmo tenta ler com atenção e seguir passinho a passinho e vais ver que vais lá.

PS: se tiveres a utilizar o eclipse experimenta usar o debugger é algo muito util quando não percebemos o que o programa está a fazer.

Cumpz

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jarsantos

Ok, vou deduzir que não queres realmente perceber:

Lmax = 2048*Random-1024;

Lmin = 2048*Random-1024;

if(Lmin > Lmax)

{

aux = Lmax

Lmax = Lmin

Lmin = Lmax

}

do

{

sugest = (Lmax - Lmin) / 2

input = ...

if(input == '>') Lmin = sugest

else if(input == '<') Lmax = sugest

while(input != '=');

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruigalvao112

Estive a tentar não me meter na conversa, mas tu nem digas que és do isel que eu fico cheio de vergonha lool, já agora és de Redes certo?

Indo ao topico, esses whiles que tens:

while  (sinal.charAt(0) == '>')

podem muito bem ser ifs, algo que qualquer engº de PG ensina no isel é dividir o problema por vários sub problemas, e resolve-lo no papel antes sequer de fazer qualquer linha de código. . .

Isso resolve-se tudo com um métodozeco sem repetir tanta linha de codigo como repetiste.

Sendo este o semestre de Verão certamente já aprendes-te isso no semestre passado.

BTW posts anteriores descreveram-te completamente o algoritmo tenta ler com atenção e seguir passinho a passinho e vais ver que vais lá.

PS: se tiveres a utilizar o eclipse experimenta usar o debugger é algo muito util quando não percebemos o que o programa está a fazer.

Cumpz

Quanto a ser do ISEL, qual é o mal? Não sou engenheiro, não tenho obrigação de ser nenhum "génio". Até porque é dificil fazer-se um trabalho com coisas que ainda não foram dadas nas aulas, digo eu. E não, não sou de Redes, sou de Telecomunicações.

Quanto ao método de resolução, já fiz várias vezes no papel, como surgeria que fizesse antes de avançar para o PC. Outra questão, utilizo o programa que a escola que frequento disponibilizou. E não, não aprendi as bases (como é notório) pois só entrei na 2ª fase, ou seja, com 1 mês de aulas decorrido.

Mas obrigado pelas dicas. Cumps

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DanWilliams

Well, in java we can use import java.util.Random class to create random number.

You can refer this resource with some beautiful explanation and examples.

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.