Jump to content

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


ruigalvao112
 Share

Recommended Posts

Boas 😛

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 😄

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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 😄

Link to comment
Share on other sites

Obrigado pelo dica =)

Vou já experimentar isso 😛

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
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
 Share

×
×
  • Create New...

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.