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

RufuZ

Programa Ciclo Repetitivo para adivinhar numero

Mensagens Recomendadas

RufuZ

Ora Boas pessoal,

tenho um trabalho para resolver, e vinha aqui pedir , digamos assim, umas dicas para o resolver..

O trabalho é o seguinte, elaborar um programa em PASCAL, que permita adivinhar um numero de 0 a 7, em tres tentativas/perguntas... O programa deve incluir um menu , com 2 opçoes, a 1º- Jogar e a 2º- Sair.. Quando o utilizador avança para a opçao 1 do menu, é-lhe questionado se o nr. é maior ou menor que 4, e mediante a resposta (s ou n), adivinhar o nr. que o utilizador está a pensar..

O meu problema aqui, está em montar o processo das 3 tentativas/perguntas (em que uma delas tem que ser obrigatoriamente a ser o nr. é maior ou menor que 4) de modo a que o programa consiga mesmo adivinhar o nr. pensado...

Se alguem me pudesse dar aqui uma ajuda de raciocínio, agradecia imenso...

Cumpz

RufuZ

Editado por RufuZ

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Tens de seguir sempre a mesma lógica, e ir perguntando (das 3 vezes) se o número é maior (ou igual) ou menor que o numero do meio.

0 a 7 (imagina que eu pensei no 6:

1º O numero é >= ou < do que 4? Resposta: >=

2º O numero é >= ou < do que 6? Resposta: >=

3º O numero é >= ou < do que 7? Resposta: <

Resultado: Se é >= a 6 e menor que 7, o numero era o 6.

0 a 7 (imagina que eu pensei no 3:

1º O numero é >= ou < do que 4? Resposta: <

2º O numero é >= ou < do que 2? Resposta: >=

3º O numero é >= ou < do que 3? Resposta: >=

Resultado: Se é >= a 3 e menor que 4, o numero era o 3.

Tenta por aí...


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
I-NOZex

uiiiiiiiiiiiii

isto é simplerrimo se usares um algoritmo chamado de "bi-section search" ;)

procura no google ;)

edit: a resposta do @nunopicado é exactamente isso :thumbsup:

Editado por I-NOZex

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
RufuZ

Desde já agradeço imenso aos dois pela disponibilidade em me ajudarem :)

nunopicado, estou a entender o que tu estas a querer dizer... entao e para construir essa sintaxe, utilizo que tipo de estrutura?? for? repeat? while?

Nozex, o problema é que apenas posso aplicar a matéria que dei até agora (estruturas de decisao simples e encadeadas- ifs; estruturas de selecçao multipla- case of ; estrutura de repetiçao- for, while e repeat)...

Mais uma vez muito obrigado ;)

Cumpz

RufuZ

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
I-NOZex

e entao? uma coisa nao impede a outra, o algoritmo de bisection search e tal e qual como o @nuno mostrou, e usa apenas aquilo que deste

apenas fica a dica do nome tecnico para que possas aprofundar mais, caso queiras!

acredita que é algo dito basico, mas que infelizmente a nivel de secundario nao é ensinado --"


B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

A repetição centra-se, aliás, ou num ciclo for ou num ciclo repeat ou ainda num ciclo while. Tens de ter em atenção o caso em que conseguiste adivinhar o número em menos do que 3 tentativas - não vale a pena perguntar mais vezes.

EDIT: a matéria dada serve perfeitamente para o caso. A algoritmia, infelizmente, é subvalorizada nas escolas por uma razão qualquer. Eu por exemplo aprendi em Aplicações Informáticas a organizar uma lista por ordem crescente, e só 2 anos mais tarde descobri que afinal o algoritmo que usava era o tão famoso Bubble Sort.

Editado por thoga31
  • Voto 1

Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
RufuZ

Mas eu pesquisei um pouco no google sobre o bi-section search, e só vi programaçao com arrays.

Eu entendi o que o Nuno explicou, no entanto nao estou a conseguir montar mentalmente o codigo... Será que é possivel darem-me um exemplo pratico do código com essa sintaxe que estão a dizer para que eu perceba melhor?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Não. Isso seria dar-te o exercício feito, basicamente. :)

Pensa lá um pouco. Divide o problema em pedacinhos:

1) Como determinas um número aleatório segundo o limite definido pelo utilizador (>= ou < do que o último número)?

2) Como verificas se é igual, maior, menor?

3) Como determinas se já chegaste a uma conclusão concreta acerca do número?

4) Como repetes este processo 3 vezes?


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
RufuZ

ora bem , perdoem-me se vou dizer algum disparate, mas ja tive um dia de escola e de imenso estudo, e a minha cabeça já esta um pouco cansada ehehe

1) entao, faria como o @ nuno disse, o primeiro teste, seria traçar o meio do limite definido e testar o nr. aleatorio em relaçao a esse nr central( maior, menor ou igual)

2) com uma estrutura de decisao (if), iria comparar o numero aleatorio com o nr central que traçei em 1)

3) Quando as opçoes terminarem e forem todas verdadeiras, isto é , quando as "perguntas" feitas forem todas respondidas correctamente

4) com um ciclo for/repeat/while

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
I-NOZex

ai thoga, depois disso ate fiquei com vontade de fazer o dito programa xD

eu aprendi este algoritmo num curso online de python (que infelizmente por nao ter tido mais tempo, nao o conclui :\ e porque começaram a abstrair demasiada matematica...)

edit: exactamente!!! a ideia tao basica deste algoritmo é:

tens um inicio e tens um fim

divides

é o numero correcto? se nao, maior ou igual?

(imaginando que seja menor): o valor fim(limite, aquel numero inicial divido) é atribuido

divides, faz a pergunta outra vez, e isto assim, 3x...

Editado por I-NOZex

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Com certeza que não tiveste um dia tão pesado como o meu, mas adiante :D

A tua ideia geral está bem. Agora convém é começares a delinear um algoritmo e estruturá-lo em código... com pés e cabeça. Estamos aqui para ajudar, don't worry ;)

@I-NOZex, tu tem calma, moço. Inspira... respira... fundo... ok, melhor? Good. Faz lá então o programa, mas não o mostres! :D


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
RufuZ

ora entao, vou tentar fazer aqui uma primeira versao à pressa e em linguagem corrente:

1) Nr maior ou igual a 4?

se sim

nr maior que 6?

se sim: o nr é o 7

senao

(deu-se-me aqui um break, nao tou a conseguir pensar nesta parte eheh)

se nao

nr maior que 2?

se sim: o nr é o 3

senao

(novamente deu-se-me um break... nao tou a conseguir achar soluçao para aqui, porque ficam muitos nrs por testar...)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
RufuZ

ahaha, concordo contigo thoga... está dificil de entender isto xD

ora bem, com variaveis?? ui, aí é que nao estou a ver mesmo ehehehe o meu cerebro nao esta a deixar raciocinar direito hoje -.-

tive aqui a fazer um rascunho no papel, mas ha aqui uns numeros que me escapam sempre:

maior ou menor que 4?

maior:

maior ou menor que 6?

maior:7

menor:5

menor:

maior ou menor que 2?

maior: 3

menor: 0 ou 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Tens de ter, a cada iteração, um mínimo e um máximo a analisar. Na primeira iteração não há limites, apenas perguntas se é maior ou menor do que 4. A partir daí, terás que calcular os limites mínimo e máximo. Pensa lá mais um pouco, não estás no mau caminho, apenas tens de largar os números e pensar abstracto.


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
RufuZ

uii, essa complicou-me... entao o que estas a dizer é +/- isto? :

maior ou menor que 4?

maior:

1)maior que 5? se nao for, é 5, senao passa à 2)

2)maior que 6?se nao for é 6, se for é 7

menor:

1)maior que 0?se nao for é 0, se for passa à 2)

2)maior que 1? se nao for é 1, se for passa à 3)

3)maior que 2? se nao for é 2, se for é 3

se nao for nem 1 nem outro, entao e o 4...

continuo a pensar em concreto pq nao me estou a conseguir focar no abstrato ehehe

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Tanto te focas no concreto que não consegues pensar direito. Isso são tudo raciocínios muito particulares que nunca vão funcionar na prática.

Eu quero que me digas algo assim:

VARIÁVEIS
  max, min : Inteiros

min <- 0
max <- 7

LER opção
SE (opção="maior") ENTÃO
   max/min? <- ???
SE NÃO
   max/min? <- ???

Agora tens de preencher os pontos de interrogação e determinar, em casa caso, se mudas max ou min.

Dica: repara nos valores novos que aparecem na pergunta - são médias.

Editado por thoga31

Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
I-NOZex

para ajudar, vamos aqui simular o input/output do programa:

(vamos supor que pensamos no numero 3)

numero maior ou igual a 4?

menor

numero maior ou menor que 2?

maior

o numero é o 3!

explicaçao:

no primeiro passo, o valor minimo era 0 e o maximo 7

depois, o programa divide a margem entre o 0 e o 7, e atribui a uma variavel intermedia (sao 8 digitos de diferença, metade de 8 é 4)

pergunta entao se o numero é maior ou menor que 4

neste caso é menor, o maximo passa a ser 4, o minimo continua 0

dividimos a meio o 4, da 2

é menor ou maior que 2? neste caso maior

o minimo passar a ser 2 e o maximo continua 4

ora se o numero é menor que 4, e maior que 2, so pode ser o 3!

agora o numero é imaginamos o 7:

numero maior ou igual a 4?

maior

numero maior ou menor que 6?

maior

o numero é o 7!

explicaçao:

no primeiro passo, o valor minimo era 0 e o maximo 7

depois, o programa divide a margem entre o 0 e o 7, e atribui a uma variavel intermedia (sao 8 digitos de diferença, metade de 8 é 4)

pergunta entao se o numero é maior ou menor que 4

neste caso é maior, o minimo passa a ser 4, o maximo continua 7

entre o 4 e o 7 ha 3 digitos, sendo o 6 o do meio

é menor ou maior que 6? neste caso maior

o minimo passar a ser 6 e o maximo continua 7

ora se o numero é maior que 6, so pode ser o 7!


B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
RufuZ

Mais uma vez, agradeço a paciência q estão a ter comigo... Confesso que está a ser dificil reflectir sobre este código por um motivo qulquer que desconheço ( suponho que seja burrice mesmo ehehe)

Ora bem theoga, olhando para a dica que deste, só consigo imaginar um ciclo repeat, em que cada vez que o ciclo é efectuado, o centro, ou seja, o resultado da divisão inteira entre o máximo e o mínimo ( que se vai adaptando e- diminuindo ou aumentando conforme a resposta que o utilizador dá as perguntas), vai.se também adaptando até chegar ao sítio em que não há mais possibilidades lógicas, e encontra.se então o nr.pensado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
passarito

Não sei o teu nivel de conhecimentos, mas isto cheira-me a recursividade.

Se ainda não deste, é bem provavel que seja a prepareção para a aprenderes!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
passarito

Acho que ainda não chegaste ao segredo da questão.

Não és tu que tem de descobrir o é o programa. Como? (Segredo da questão) Vais diminuir o intervalo até a divisão inteira da soma das extermidades dê o número que pretendes.

Parece dificil mas não é...

De inicio sabes que o Intervalo é de 0 a 7, então Menor=0 e Maior=7

Agora queres encontrar o teu numero mistério: Misterio

x := (Menor + Maior) div 2

Depois de testares s X é igual ao Misterio e caso não o seja o programa tem de decidir se vai procurar na metade inferior (0..2) ou na superior (4..7)

Nota: Repara que o 3 já foi excluido, pois é o valor da primeira conta anterior (0+7) div 2 = 3. Se Mistério for 3 está encontrado!

Depois vais ter de testar o teu Mistério.

Então, se Misterio<X procura no intervalo inferior para isso o Menor mantem-se na mesma enquanto que o maior passa a ser igual ao X-1: Maior:=X-1

Assim, o teu intervalo passará a ser entre 0 e 2 e assim sucessivamente até encontrares o valor.

O que expliquei aqui para o intervalo inferior é análogo para o intervalo superior com as devidas adaptações.

Exemplo de iterações, Misterio=4

Menor - Maior - X

0 - 7 - 3

4 - 7 - 5

4 - 4 - 4

Editado por passarito

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
RufuZ

O meu problema aqui, acho que está nas perguntas, ou seja, o que devo perguntar.... Vejam se esta correcto asim:

1º Pergunta: nr maior ou menor q 4

se for menor:

2º pergunta: maior ou menor que 2

se for maior: é 3

se for menor: 3º pergunta maior ou menor que 1?- daqui se retira se é o 0 ou o 1

se for maior:

2º pergunta: maior ou menor que 6

se for maior é 7

se for menor: é 5....

Aqui o meu problema é que ficam nrs por testar, entre eles o 4, 2 e 6, pq eu estou a testar apenas se é maior ou menor...

Editado por RufuZ

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Aqui o meu problema é que ficam nrs por testar, entre eles o 4, 2 e 6, pq eu estou a testar apenas se é maior ou menor...

Por isso é que te disse lá em cima que é para testares se é menor (<) ou maior igual (>=).

Assim testas sempre todos.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Além do mais, enquanto não abstraires mais o teu pensamento, pegares em pseudocódigo ou mesmo em Pascal, e começar a efectivar isso tudo, nunca mais saímos daqui e ficamo-nos por uma série de testes pseudovirtuais de I/O. O @passarito já deu um excelente avanço. Eu aconselho a fazer (maior + menor + 1) div 2 para que o 1º número seja 4 e não 3, tal como temos vindo a falar.


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
RufuZ

Bem, sentei.me aqui à frente do pc , enquanto faço uma breve paragem de estudar os lusíadas :confused: e a mensagem, e fiz isto:

maior=7
menor=0
1) < ou >= que (maior+menor+1)div 2?
  se (opcao= <) entao
   incio
    maior: 3
	   2) < ou >= que (maior+menor+1)div 2?
  se (opcao= <) entao
   inicio
 maior=1
 3) < ou >= que (maior+menor+1)div 2?
  se (opcao=< ) entao o nr é 0
  senao o nr é 1
  senao
   inicio
 menor=2
 3) <= ou > que menor?
  se (opcao=> ) entao o nr é 3
  senao o nr é 2
 senao
inicio
 menor=4
  2) < ou >= que (maior+menor+1)div 2?
  se (opcao=<) entao
   incio
 maior=5
 3)<= ou > que menor?
  se (opcao = >) entao o nr é 5
  senao o nr é o 4
  senao
   inicio
 menor=6
 3)<= ou > que menor?
  se (opcao = >) entao o nr é 7
  senao o nr é o 6

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.