Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
ruigalvao112

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

Recommended Posts

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

Share this post


Link to post
Share on other sites
ruigalvao112

Não há outra forma para fazer sem ser atraves da criação de um método?

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
ruigalvao112

Obrigado aos dois pelas dicas =)

Vou reescrever isto para ver se já funciona :D

Obrigado mais uma vez :P

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
jarsantos

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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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 != '=');

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.