Ir ao conteúdo
  • Cadastre-se

Calculadora simples em PASCAL (Problema na estrutura de repetição)


Posts recomendados

Galera estou estudando em pascal, e resolvi fazer uma calculadora básica...
No campo que é para digitar a operação desejada, eu quero somente que o usuário digite as operações, caso ele digite uma letra ou número, quero que a pergunta seja refeita até que ele acerte alguma operação 
(estrutura de repetição)
Eu estou usando while e dando as sentenças, na hora de compilar não da erro algum, mas quando coloco de forma proposital algum numero ou carácter que não seja as operações, o while não fiunciona, e a pergunta não é refeita, aqui esta o código, se alguém puder me ajudar no meu possível erro eu agradeço...

Program Pzim ;var op : sring;soma1,soma2,resultado : real;Beginwrite ('Informe o primeiro número: ');read (soma1);write ('Informe a operação desejada ( + / * - ) ');read (op);while (op = '+') or (op = '-') or (op = '*') or (op = '+') dobeginwrite ('DIGITE SOMENTES AS OPERAÇÕES ( + / * - )');read (op);end;write ('Informe o segundo número: ');read (soma2);if op = '+' thenbeginresultado := soma1 + soma2;writeln('O Resultado é de: ', resultado:0:3);end; if op = '-' thenbeginresultado := soma1 - soma2;writeln('O Resultado é de: ', resultado:0:3); end; if op = '*' thenbeginresultado := soma1 * soma2;writeln('O Resultado é de: ', resultado:0:3); end; if op = '/' thenbeginresultado := soma1 / soma2;writeln('O Resultado é de: ', resultado:0:3); end;


 

// O Problema era esse, ignorava o WHILE. Resolvi usar o Repeat Untilwrite ('Informe o primeiro número: ');  read (soma1);   write ('Informe a operação desejada (  +  /  *   -  ) ');  read (op);  repeat    write ('DIGITE SOMENTES AS OPERAÇÕES ( + / * - )');    read (op);    until (op <> '+') or (op <> '-') or (op <> '*') or (op <> '+');   write ('Informe o segundo número: ');  read (soma2);      if op = '+' then    begin          resultado := soma1 + soma2;    writeln('O Resultado é de: ', resultado:0:3);    end;      if op = '-' then    begin          resultado := soma1 - soma2;    writeln('O Resultado é de: ', resultado:0:3);     end;       if op = '*' then    begin          resultado := soma1 * soma2;    writeln('O Resultado é de: ', resultado:0:3);     end;       if op = '/' then    begin          resultado := soma1 / soma2;    writeln('O Resultado é de: ', resultado:0:3);      end;

 
sendo que agora, ele ignora qualquer valor no campo de operedaroes somente pela primeira vez, e depois exibe a nova mensagem que eu coloquei no Until, deixando passar qualquer valor..

O que estou errando nessas sentenças de repetições galera?
E como criaria um Menu para o usuário querer sair do programa ou executar outro calculo?
to na espera, obrigado desde ja!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

Primeiramente, uma dica: "Nunca" use read, use somente readln. O read só é usando em caso específicos (mais avançados)

 

Então...

Faça um "teste de mesa". Dê valores as variáveis e siga os passos que foi determinado pelo código...

Ex.:

while (op = '+') or (op = '-') or (op = '*') or (op = '+') do

Supondo OP='2'.

Teríamos: (False) or (False) or (False) or (False), o que resulta em "False", logo não entraria no laço. Deveria entrar, correto? Logo a combinação de sentenças está errada.

Outro teste...
Se OP='*'
Teríamos: (False) or (False) or (True) or (False), o que resulta em "True", logo entraria no laço, mas não deveria entrar...


Para o outro laço temos:

until (op <> '+') or (op <> '-') or (op <> '*') or (op <> '+');

Supondo OP='h'.

Teríamos: (True) or (True) or (True) or (True), o que resulta em "True", logo sairia do laço. Não era para sair, correto? Logo a combinação de sentenças está errada.

Outro teste...
Se OP='+'
Teríamos: (False) or (True) or (True) or (True), o que resulta em "True", logo também sairia do laço, o que estaria correto para esse caso.

 

...se analisar bem, QUALQUER valor que "op" venha a ter, a sentença do until vai resultar em "True", o que obviamente está errado.

Então, dê uma revisada na "tabela verdade" dos operadores lógicos... "or", "and", "not" (tem o "xor" também) que você consegue ajustar fácil...

Qualquer dúvida é só postar.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Obrigado cara por ter aberto a minha mente.
Tirei o diferente  e atribui o valor iguale  realmente funcionou..

write ('DIGITE SOMENTES AS OPERAÇÕES ( + / * - )');    read (op);    until (op = '+') or (op = '-') or (op = '*') or (op = '+');
 
Uma dúvida..
porque o readln em vez do somente read? 
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá

 

1) Sobre a sentença

(op = '+') or (op = '-') or (op = '*') or (op = '+');

Agora ficou certo, ou seja, "se for algum dos válidos, então sai do loop". Ou seja, utilzando o "or", como no nesse contexto, se "apenas um for verdadeiro, a sentença toda passa a ser verdadeira". E serve exatamente para o seu propósito...

 

1.1) Sugestão de implementação

Antes, já cito que você poderia USAR QUALQUER LAÇO DE REPETIÇÂO, como while, repeat ou for... SEMPRE o que dá para fazer em um, dá para fazer em outro, beleza?... o que ocorre é que cada um é mais apropriado para determinados contextos, ou seja, é mais prático/conveniente etc, ou não...

O uso de um laço ou outro, depende da lógica do programa... neste contexto, o While tem a vantagem de usar "duas perguntas diferentes", um normal, e outro sugerindo que houve falha na primeira. Já com o repeat, fica uma só, e também estaria relativamente correta, já que "sempre vai perguntar uma vez e só continuará após confirmar"... escolher um outro, vai depender da análise.
Obs.: dá também para usar o for também, mas fugiria muito do escopo que geralmente é proposto para ele (o for).

 

Sugiro que tente fazer também essa lógica com o While... como treinamento...

 

DICA: A sentença usada no while é a "negação" da usada no until do repeat. (poderia colocar um "not" para toda a sentença, mas o que recomentado seria "negar a sentença em si", ou seja, trocar os operadores, de forma que a senteça "correspoda" a negação da utilizada no until).

PS: A negação utilizando o Not, seria algo assim:

while not ((op = '+') or (op = '-') or (op = '*') or (op = '+')) do  begin  end;

Mas, como já comentado, não é isso estou sugerindo tentar... seria "nega a sentença em si".

 

 

2) Sobre o read x readln

2.1) "inversão de afirmativa"

Só uma pequena correção: quando você relata "porque o readln em vez do somente read?", em vez disso, deveria ser algo como "porque somente o readln em vez do read?". Percebe a pequena diferênça? :).  É sutil, mas muda totalmente o sentido da frase... concorda? rs.

2.2) "sobre a iniciativa em perguntar o 'porque' "

Essa justumente é a ideia, tenha curiosidade... é algo assim que se espera dos "estudantes" como nós... :)

Então, sugiro que dê uma lida nesse tópico. Lá chegamos a tentar analisar o motivo...

Obs.: A dica permance: nunca use read, use somente readln, ou seja, só use o read quando já tiver conhecimento sobre as suas característas... RESUMINDO: erroneamente alguns programadores confundem esse "ln" que é usado no writeln, que nesse caso serve para "descer uma linha após... como um ENTER"... só que para o read, ele não serve para isso... e no final das contas, o uso "indevido" do read, pode ocasionar um comportamento adverso no algoritmo...

 

***

 

Qualquer dúvida é só postar.

 

 

 

 

Obrigado cara por ter aberto a minha mente.
Tirei o diferente  e atribui o valor iguale  realmente funcionou..

write ('DIGITE SOMENTES AS OPERAÇÕES ( + / * - )');    read (op);    until (op = '+') or (op = '-') or (op = '*') or (op = '+');
 
Uma dúvida..
porque o readln em vez do somente read? 

 

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