Ir ao conteúdo
  • Cadastre-se

Preciso de ajuda com Pascal


Posts recomendados

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

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

Link para o comentário
Compartilhar em outros sites

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!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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.
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

Link para o comentário
Compartilhar em outros sites

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...