Ir ao conteúdo

Posts recomendados

Postado

Preciso fazer um programa no pascal que adivinhe entre 1-60, o número que o usuário escolheu.
 

Eu tenho a lógica toda montada. Foi feita por binário, pegando a média aritmética das partes:

 

Escolha um número de 1 a 60

 

1 - É maior do que 30? (s/N)

 

Aí terei que fazer com que o pascal tenham outras duas perguntas (uma caso o usuário escolha sim e outra caso ele escolha não).

Se sim: 2 - É maior que 45

Se não: 2 - É maior do que 15

 

E assim até a sexta pergunta que me dará o resultado final.

Porém não sei mexer com o pascal ao ponto de conseguir formular essas perguntas para o usuário.

Quem puder me ajudar eu agradeço.
 

Um grande Abraço

 

  • Membro VIP
Postado

Olá.

 

Para criar o algoritmo, não necessariamente precisa saber "mexer com Pascal". Você poderia utilizar por exemplo um Pseudocódigo ou Portugol, que usam de uma linguagem mais natural.

 

Daria por exemplo para criar os passos num papel (ou bloco de notas) e executar os passos e tentar chegar a um algoritmo funcional. E depois converter o algoritmo para linguagem Pascal.

 

 

Imagine a situação: se eu precisasse de um "passo a passo para executar essa tarefa, quais passos deveriam ser seguidos?". Como é que você chegou a esse 45 e 15? qual a correlação deles com o 60.  Eu imaginei algo como: Valor do SIM=N/2+N/4 e Valor do NÃO=N/2-N/4. (X=60/2+60/4 -> X=30+15 -> X=45). Por ai vai.. (obs.: é apenas uma sugestão).

 

 

Tente fazer algo. Depois tente converter para o Pascal.

 

Poste aqui o que conseguiu fazer, ou o "pseudocódigo" ou o código em Pascal, e onde está com dúvidas.

 

No aguardo.

Postado

Bom então:

O professor passou essa lógica com menos numeros. porém conseguir acertar fazendo com todos os 60.

A logica é a seguinte:

Assim que o usuário escolhe um grupo dividido em 2 (1-30 ou 31-60). Nós novamente dividimos em 2 até acharmos o resultado.

Infelizmente esse trabalho é em Pascal.

Porém não tenho nocao de como fazer a parte da sitaxe para as duvidas que falei anteriormente.

Um grande abraço e obrigado!

  • Membro VIP
Postado

Olá.
 

Bom então:
O professor passou essa lógica com menos numeros. porém conseguir acertar fazendo com todos os 60.
A logica é a seguinte:
Assim que o usuário escolhe um grupo dividido em 2 (1-30 ou 31-60). Nós novamente dividimos em 2 até acharmos o resultado.
Infelizmente esse trabalho é em Pascal.
Porém não tenho nocao de como fazer a parte da sitaxe para as duvidas que falei anteriormente.
Um grande abraço e obrigado!


De certo modo, a quantidade de números não é relevante para lógica, pois o cálculo pode utilizar uma variável. Novamente tente imaginar esse processo no mundo real, se for 60, ou 100, ou1.500.000 etc..., o "passa a passo" será o mesmo... usando o algoritmo chego a 45 e 15, 75 e 25, 1125000 e 375000 respectivamente para primeira rodada... Entende?

 

 

Poste aqui o seu Pseudocódigo ou o código em Portugol. Depois vemos como converter para Pascal (converter para linguagem é a parte mais fácil)

 

No aguardo

Postado

Sim, a logica sempre será essa. Para mim isso esta resolvido. O problema é passar isso para o pascal. Ja que não sei os comandos para que isso possa ser lido no pascal.

  • Membro VIP
Postado

Sim, a logica sempre será essa. Para mim isso esta resolvido. O problema é passar isso para o pascal. Ja que não sei os comandos para que isso possa ser lido no pascal.

 

Poste aqui o que já conseguiu fazer. Te ajudamos a converter...

 

 

No aguardo

Postado

Bom eu faria assim:

 

Programa adivinhação de 1 - 60

 

(vamos imaginar que o usuário tenha escolhido 54, só para eu poder ser mais claro)

 

1 - O número é maior do que 30? (digite S ou N)

Resp. S

(como é maior do que 30 o único bloco que me interessa é o 31 - 60, agora só pegar a mediana)

 

2 - O número é maior do que 45? (digite S ou N)

 (da mesma forma pegarei apenas o bloco que me interessa)

Resp. S

3 - O número é maior do que 53? (digite S ou N)

(da mesma forma pego o que me interessa)

Resp. S

 

4 - O numero é maior do que 57? (digite S ou N)

(aqui a primeira resposta não para o numero escolhido)

Resp. N

 

5 - O numero é maior do que 55 ? (digite S ou N)

Resp. N

6 - O numero é maior do que 54? (digite S ou N)

Resp. N

Resultado: O número é 54

 

 

Isso é o que eu pensei para que apareça na tela do executável

Agora na parte da criação do programa:

Variáveis..... Begin    Writeln ('Pense num número de 1 a 60');    Writeln ('1 - O número é maior do que 30?');    readln (S ou N) -> Não sei como escrever isso    while (i >30) do -> Aqui entra a parte da mediana que não sei fazer no pascal
e por aí vai....

Desculpe, mas realmente estou muito zerado. Já procurei até em sites estrangeiros, mas não estou conseguindo usar as semânticas. É o meu primeiro contato com Pascal e o professo já manda isso!rs. E eu nem vou usar isso mais, além desse período.

Mas desde já agradeço a ajuda que esta me dando!

Um grande abraço

Postado
Consegui fazer, porém há um erro, onde não consigo colocar upp para 'h' e low para 'l'

 

 


Program GuessIt(input, output);



var
  ok:           boolean;
  resposta, low, upp: integer;
  res:                char;
  
begin
  writeln ('Pense em um número entre 1 e 60.');
  writeln ('Pressione ENTER para começar');
readln;
  low := 1;
  upp := 60;
  repeat
    ok := false;
    resposta := ( ( upp - low ) div 2 ) + low;
    write ('O seu número é ',resposta:4, '?');
    write ('   
Digite : ''l'' = não, ele é menor, ''h'' = não, ele é maior, ''c'' = correto:  ');
    repeat
      readln (res);
      res := (res);
    until (res = 'c') or (res = 'l') or (res = 'h');
    case  res  of
      'l': upp := resposta; Aqui está o erro!
      'h': low := resposta; Se eu trocar dá erro!
    else
      ok := true
    end;
  until ok;
  writeln ('Então seu número é: ', resposta:4);


end.
  • Membro VIP
Postado

Olá.

 

A cálculo está errado...
 

resposta:=((upp - low) div 2 )+low;

 

Ex.: pensei no tal 52, 60-1=59, 50 div 2=29, 29+1 = 30. OK.

 

Após o case, low=30, 60-30=30, 30 div 2=15, 15+1= 16. De cara vemos que tá errado, já que o número é maior que 30!

 

 

No aguardo.

Postado

Olá.

 

A cálculo está errado...

 

 

Ex.: pensei no tal 52, 60-1=59, 50 div 2=29, 29+1 = 30. OK.

 

Após o case, low=30, 60-30=30, 30 div 2=15, 15+1= 16. De cara vemos que tá errado, já que o número é maior que 30!

 

 

No aguardo.

 

Desculpe, mas não entendi o que você falou.

Sou muito ruim em programação e peço desculpas por não está entendendo de forma mais objetiva.

Então, coloquei o 52 e acertei pelo programa já na 3 pergunta.

 

Porque agora a lógica é a seguinte:

O número é 30?

l  = se for menor do que 30, h = se for maior do que 30, c = se estiver correto

então o 52 já aparece na 3 pergunta

  • Membro VIP
Postado

Desculpe, mas não entendi o que você falou.

Sou muito ruim em programação e peço desculpas por não está entendendo de forma mais objetiva.

Então, coloquei o 52 e acertei pelo programa já na 3 pergunta.

 

Porque agora a lógica é a seguinte:

O número é 30?

l  = se for menor do que 30, h = se for maior do que 30, c = se estiver correto

então o 52 já aparece na 3 pergunta

 

Desculpe, eu tinha feito a conta errada.

 

Corrigindo: Após o case, low=30, 60-30=30, 30 div 2=15, 15+30=45.  (OK)

 

 

Pelo visto, o código já está correto, qual seria a sua dúvida? veja, quando selecionado h, o que atualiza é o low mesmo e l, o upp.

 

No aguardo.

Postado

Apos ter feito isso tudo, o professor disse que podem existir duas possibilidades: sim ou nao.

Nao posso fazer com essas minhas 3: maio, menor ou igual.

Agora me enrolei todo.

você sabe como eu poderia fazer?

Mais uma vez agradeço

  • Membro VIP
Postado

Olá. Desculpe pela demora, ontem não entrei no Fórum...
 

Apos ter feito isso tudo, o professor disse que podem existir duas possibilidades: sim ou nao.
Nao posso fazer com essas minhas 3: maio, menor ou igual.
Agora me enrolei todo.
você sabe como eu poderia fazer?
Mais uma vez agradeço

  
Eu acho que eu entendi o que ele solicita, no caso, você precisa efetuar verificações até "apertar" o número, ou seja, não ter mais divisões possíveis e acabar tendo que ser determinado número.. o programa que deve achar o número, e não o usuário... o usuário apenas diz se é maior ou não.

 

 

1) É maior do que 30? (s/N)

2) Se sim: 2 - É maior que 45   ou  Se não: 2 - É maior do que 15

Veja, a pergunta é sempre "maior". Daí, por exemplo, se for 15, a primeira pergunta vai dar não e a segunda também. Continua dividido até não ter mais jeito!, e acabará descobrindo que é 15.

 

No aguardo.

  • Membro VIP
Postado

Olá.

Exatamente. Essa é a minha dúvida. Como fazer o pascal ler isso!
Um grande abraço!

 

Tente fazer... entenda melhor o que está pedindo, e ajuste o código... basicamente precisa só ajustar de acordo com ele pediu...

Program GuessIt(input, output);var  ok:           boolean;  resposta, low, upp: integer;  res:                char;beginwriteln ('Pense em um número entre 1 e 60.');writeln ('Pressione ENTER para começar');readln;low := 1;upp := 60;repeat  ok := false;  resposta := ( ( upp - low ) div 2 ) + low;  write ('O seu número é ',resposta:4, '?');  write ('Digite : ''l'' = não, ele é menor, ''h'' = não, ele é maior, ''c'' = correto:  ');  repeat    readln (res);    res := (res);  until (res = 'c') or (res = 'l') or (res = 'h');  case  res  of    'l': upp := resposta; Aqui está o erro!    'h': low := resposta; Se eu trocar dá erro!  else    ok := true  end;until ok;writeln ('Então seu número é: ', resposta:4);end.

No aguardo.

Postado

Eu fiz o meu dessa forma:

 

Fiz dessa maneira abaixo e já está funcionando, só preciso do FLUXOGRAMA. Posso até fazer um depósito na sua conta pela ajuda.

Segue o programa abaixo:

Program Adivinhacao_UERJ ;varmenor,maior,metade,opcao : integer;Beginwriteln('Pense em um número no intervalo de 1 a 60');menor:=1;maior:= 60;repeatmetade:=(maior+menor)div 2;writeln('Por acaso o número é menor ou maior que ',metade,'?');writeln('Se o número for igual digite 1.');writeln('Se o número for maior digite 2.');writeln('Se o número for menor digite 3.');readln(opcao);if (opcao=2) then menor:=metade+1;if (opcao=3) then maior:=metade-1;if maior<=menor then beginmetade:=(maior+menor)div 2;opcao:=1;end;until (opcao=1);writeln('Seu número é ',metade,'!');End.

Douglas, na sala de aula você falou que usando o igual com o menor e o maior não teria como, mas se você parar pra ver, na linha onde tem "if (opção=2) then menor:=metade+1" continua tendo duas saídas. Se for verdadeiro, o menor vai ser igual a metade e vai voltar o metade =(maior+menor)div2 e se for falso vai para a opção 3. O igual, no caso a opção 1 está separado, por isso não haveria problema. É o que eu raciocinei.

 

E tipo, se o programa está funcionando normalmente, existe um fluxograma pra ele.

 

O fluxograma ficou do jeito que está no arquivo anexado, só que eu não sei se está certo. Gostaria da ajuda do SImon.

post-783472-0-88368600-1443881370_thumb.

  • Membro VIP
Postado

Olá Comédia Tube.

 

 

Eu fiz o meu dessa forma:

 

Fiz dessa maneira abaixo e já está funcionando, só preciso do FLUXOGRAMA. Posso até fazer um depósito na sua conta pela ajuda.

Segue o programa abaixo:

Program Adivinhacao_UERJ ;varmenor,maior,metade,opcao : integer;Beginwriteln('Pense em um número no intervalo de 1 a 60');menor:=1;maior:= 60;repeatmetade:=(maior+menor)div 2;writeln('Por acaso o número é menor ou maior que ',metade,'?');writeln('Se o número for igual digite 1.');writeln('Se o número for maior digite 2.');writeln('Se o número for menor digite 3.');readln(opcao);if (opcao=2) then menor:=metade+1;if (opcao=3) then maior:=metade-1;if maior<=menor then beginmetade:=(maior+menor)div 2;opcao:=1;end;until (opcao=1);writeln('Seu número é ',metade,'!');End.

Douglas, na sala de aula você falou que usando o igual com o menor e o maior não teria como, mas se você parar pra ver, na linha onde tem "if (opção=2) then menor:=metade+1" continua tendo duas saídas. Se for verdadeiro, o menor vai ser igual a metade e vai voltar o metade =(maior+menor)div2 e se for falso vai para a opção 3. O igual, no caso a opção 1 está separado, por isso não haveria problema. É o que eu raciocinei.

 

E tipo, se o programa está funcionando normalmente, existe um fluxograma pra ele.

 

O fluxograma ficou do jeito que está no arquivo anexado, só que eu não sei se está certo. Gostaria da ajuda do SImon.

 

A princípio o seu programa também está funcionando... talvez precise ajustar algo, como utilizar IF/ELSE, em vez de só IF, pois são condições mutuamente exclusivas entre si, ou seja, se for um, não pode ser o outro (isso pode ser considerado um erro de lógica).

 

Em relação ao funcionamento em si, os dois estão utilizando 3 possíveis respostas... ai tem que vê se vai poder ser assim ou não...

 

Apos ter feito isso tudo, o professor disse que podem existir duas possibilidades: sim ou nao.
Nao posso fazer com essas minhas 3: maio, menor ou igual.
Agora me enrolei todo.
você sabe como eu poderia fazer?
Mais uma vez agradeço

 

Então, vocês precisam verificar com o professor o que ele quer!

 

A depender faz (implementa e entende a fundo) as duas formas, ou seja, com 3 respostas como já está E com 2 respostas, no caso só com SIM ou NÃO.

 

O importante é que seja feito o que está pedindo...

 

 

Em relação ao FLUXOGRAMA, infelizmente não lembro como se faz e no momento não dá para revisar e tentar te ajudar...

 

 

 

Em relação:

 

.... Posso até fazer um depósito na sua conta pela ajuda.

 

Não se preocupe com isso, estamos aqui compartilhar conhecimento e aprendizagem mútua.

 

 

 

No aguardo.

Postado

Então, estou tentando aqui fazer com as duas opções de verdadeiro ou falso. Qualquer coisa eu posto aqui. Você pode estar certo com esse fluxograma também, porém eu ainda nao consegui raciocinar dessa forma (memoria de pentiunII! Rs).

  • Membro VIP
Postado

e aí, ainda precisa de ajuda? Querem revisar o código?

A depender, entrega novamente... talvez não falha pontos, mas pelo menos ajuda no aprendizado e ganha mais moral com professor.

 

No aguardo.

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!