Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Operador aritmético divisão não funciona


Ir à solução Resolvido por Simon Viegas,

Posts recomendados

Boa noite,

 

Sou educadora em uma escola de cursos da minha cidade. Tenho alguns alunos no módulo de Lógica de programação e estou fazendo algumas atividades complementares para ajudá-los. Estou com um certo problema com programinhas que usem o OP aritmético da divisão, só ele não funciona durante a execução.

Vou deixar as linhas aqui e peço que, quem identificar o erro me ajude, por favor. To quebrando a cabeça e não sei o que pode ser.

Program Multiplica_divide;
VAR
n1, n2, resultado: real;
Escolha: Char;
Begin
    Writeln('Digite M para Multiplicação');
    Writeln('Digite D para Divisão');
    Writeln('Qual operação deseja realizar? ');
    Readln(escolha);
    Writeln;
    Writeln('Digite o primeiro número: ');
    Readln(n1);
    Writeln('Digite o segundo número: ');
    Readln(n2);
        
     If escolha= 'M' then
    Begin
      resultado:=N1*N2;
      readln;
    end;
  If escolha= 'D' then
    Begin
      resultado:=N1/N2;
      readln;
    end
  Else
    Begin
      Writeln('O resultado e: ', resultado :2:2);
      readln;
    End;
  Readln;
End.

 

program Calculadora_N_divide;
Var
N1, N2, Resultado: real;
escolha: char;
begin
  Writeln('A para Somar');
  Writeln('B para Subtrair');
  Writeln('C para Multiplicar');
  Writeln('D para Dividir');
  Write('Escolha o que deseja fazer: ');
  Read(escolha);
  Writeln;
  Write('Digite o primeiro numero: ');
  read(N1);
  Write('Digite o segundo numero: ');
  read(N2);

  If escolha='A' then
    Begin
     Resultado:=N1+N2;
    End;

  If escolha='B' then
    Begin
      Resultado:=N1-N2;
    End;

  If escolha='C' then
    Begin
      Resultado:=N1*N2;
    End;

  If escolha='D' then
    Begin
      Resultado:=N1/N2;
    End

  Else
    Begin
      Writeln('Resultado: ', Resultado :2:2);
      readln;
    End;
  Readln;
end.

 

 

 

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

  • Membro VIP
  • Solução

Olá @Educador Prepara, seja bem-vinda ao Fórum do Clube do Hardware.

 

1# Causa raiz

Sobre:

12 horas atrás, Educador Prepara disse:

Estou com um certo problema com programinhas que usem o OP aritmético da divisão, só ele não funciona durante a execução.

 

Resumidamente ocorre que está sendo utilizado um else indevidamente em ambos os códigos. Esse else está vinculado justamente ao if que verifica se é divisão ou não, ou seja, quando entra no if da divisão, não vai entrar no else (pois é pra isso que o else serve). Para as outras opções o contrário. Como não vai entrar na divisão, vai entrar no else, e assim mostrando a resposta.

 

Uma maneira mais simples de resolver é: simplesmente remova os else. Ex.:

 

program Multiplica_divide;
var
  n1, n2,
  resultado :real;
  escolha   :char;
begin
writeln('Digite M para Multiplicação');
writeln('Digite D para Divisão');
writeln('Qual operação deseja realizar?');
readln(escolha);
writeln;
writeln('Digite o primeiro número: ');
readln(n1);
writeln('Digite o segundo número: ');
readln(n2);
if escolha = 'M' then
  begin
  resultado := N1*N2;
  readln;
  end;
if escolha = 'D' then
  begin
  resultado := N1/N2;
  readln;
  end;
writeln('O resultado e: ', resultado :2:2);
readln;
readln;
end.


RESUMIDAMENTE: o else do final deve ser removido. No caso, um else deveria existir entre os if (e não após o segundo if).

 

 

 

2# Outro pontos importantes

Aproveitando o contexto, revisemos alguns outros pontos... especialmente para outros membros que venham a ler o tópico.

 

Vamos lá:


obs.: no código mais abaixo, demonstro cada uma das alíneas que se seguem.

  1. O Pascal/Delphi NÃO é Case-sensitive para os comandos, ou seja, tanto faz, por exemplo, usar writeln, quanto Writeln, ou WriteLN etc. Entretanto, para as comparações sim... ou seja, 'M' é diferente de 'm'. No seu código só vai funcionar se usar as "escolhas" com letras maiúsculas.... logo, seria interessante aceitar as duas possibilidades (eu por exemplo costumo usar em minúsculo).
  2. Os if das "escolhas" são mutuamente excludentes, logo, aqui sim, fazem-se necessário o uso de estrutura if/else em vez de dois ou quanto, respectivamente, if simples. Os if simples são independentes, fazem as suas verificações sem se importar com o(s) resultado(s) anteriores. Tipo: no segundo código, mesmo sendo 'A', seu código irá verificar se é 'B", depois se é 'C' e depois se é 'D'. São verificações desnecessárias... (é possível uma variável ter dois valores ao mesmo tempo simultaneamente? não!). Já com if/else, não não verificará. Se um if anterior for verdadeiro, não fará as verificações posteriores. Por exemplo: é 'A'?, não. Senão, é 'B'? sim! entra no 'B' e quando terminar pulará para próxima instrução após a estrutura (que fica depois do end; do if 'D'). Assim não verificando se é 'C' ou 'D'.

  3. Não use read, use apenas readln. Nesse tópico tentamos justificar. Mas resumidamente é isso: evite possíveis "bugs". Simplesmente use (e orientem a usar) somente o readln. Quem perguntar é só dizer: "o read pode dar problemas em alguns caso. Não vale a pena se aprofunda, simplesmente não use e se tiver curiosidade, pesquise sobre".

Segue o segundo código aplicado as alterações:

program Calculadora_4_operacoes_basicas;
var
  n1, n2,
  resultado :real;
  escolha   :char;
begin
writeln('A para Somar      ');
writeln('B para Subtrair   ');
writeln('C para Multiplicar');
writeln('D para Dividir    ');
write('Escolha o que deseja fazer: ');
readln(escolha); //aqui o citado na alínea 3
writeln;
write  ('Digite o primeiro numero: ');
readln(n1); //aqui o citado na alínea 3
write  ('Digite o segundo numero : ');
readln(n2); //aqui o citado na alínea 3
if (escolha = 'A') or (escolha = 'a') then //aqui o citado na alínea 1
  begin
  resultado := n1+n2;
  end
else //aqui o citado na alínea 2
  if (escolha = 'B') or (escolha = 'B') then //aqui o citado na alínea 1
    begin
    resultado := n1-n2;
    end
  else //aqui o citado na alínea 2
    if (escolha = 'C') or (escolha='c') then //aqui o citado na alínea 1
      begin
      resultado := n1*n2;
      end
    else //aqui o citado na alínea 2
      if (escolha = 'D') or (escolha = 'd') then //aqui o citado na alínea 1
        begin
        resultado := n1/n2;
        end;
writeln('Resultado: ',resultado:1:3);
readln;
end.


Dúvida, críticas, sugestões... é só postar.

adicionado 23 minutos depois

ADENDO:

Esqueci de comentar... Na divisão, é comum implementar um tratamento para evitar a tal "divisão por zero". Ex.:

      if (escolha = 'D') or (escolha = 'd') then
        begin
        if (n2 <> 0) then
          begin
          resultado := n1/n2;
          end
        else
           begin
           writeln('ERRO: Divisão por 0'); //pois se for 0/0 será uma INDETERMINAÇÃO (poderia ser qualquer valor), e, para os outros casos, será uma indefinição (operação impossível).
           readln;
           exit; //vai para o "end."
           end;
        end;   

 

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

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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