Jump to content
Yana

[Resolvido] Dúvida - Calculadora

Recommended Posts

Yana

Boas, estive a resolver a primeira proposta de exercícios do Tutorial de Pascal do thoga31 e sempre que tento executar aparece um erro sintático.

O código:


Program calculadora ;
uses crt;
var num1, num2:real;
opcao:string;
Begin
 writeln('Calculadora simples, que realiza as operações básicas.');
 writeln ('Escreva 1 para somar, 2 para subtrair, 3 para multiplicar ou 4 para dividir.');
 readln(opcao);
 writeln('Insira o primeiro número: ');
 readln(num1);
 writeln('Insira o segundo número: ');
 readln(num2);
 if (opcao=4) and (num2=0) then begin
   writeln('Erro: O denominador não pode ser 0.');
   writeln('Insira o denominador: ');
   readln(num2)
 end
 else begin
   writeln(num1:0:3 '/' num2:0:3' = 'num1:0:3 / num2:0:3)
 end;
 if (opcao=1) then begin
   writeln(num1:0:3 '+' num2:0:3'='num1:0:3 + num2:0:3);
 end
 if (opcao=2) then begin
   writeln(num1:0:3 '-' num2:0:3' = 'num1:0:3 - num2:0:3);
 end;
 if (opcao=3) then begin
   writeln(num1:0:3 '*' num2:0:3' = 'num1:0:3 * num2:0:3);
 end;
End.

Aparece; erro sintático na linha 19, '/' não esperado.


Most people think programming is cold, precise, and mechanical. It's actually creative, perplexing and deeply personal.

Mitch Garnaat

Share this post


Link to post
Share on other sites
pwseo

Yana,

Existem outros erros nesse código.

Repara que opcao é uma string, e no entanto estás a compará-la com números inteiros na linha 13.

Quanto ao teu problema da linha 19, falta-te uma virgula entre cada elemento do output:

{ O correcto seria: }
writeln(num1:0:3, '/', num2:0:3, ' = ', num1:0:3 / num2:0:3);

Cometes este erro nos restantes writelns.

Share this post


Link to post
Share on other sites
Yana

Não faltam aí umas vírgulas a separar os componentes do writeln?

Ok, obrigado

Yana,

Existem outros erros nesse código.

Repara que opcao é uma string, e no entanto estás a compará-la com números inteiros na linha 13.

Quanto ao teu problema da linha 19, falta-te uma virgula entre cada elemento do output:

{ O correcto seria: }
writeln(num1:0:3, '/', num2:0:3, ' = ', num1:0:3 / num2:0:3);

Cometes este erro nos restantes writelns.

Ok, ja vou ver isso.


Most people think programming is cold, precise, and mechanical. It's actually creative, perplexing and deeply personal.

Mitch Garnaat

Share this post


Link to post
Share on other sites
thoga31

Atenção com o output do resultado, estás a fazer mal uma coisa:

num1:0:3 + num2:0:3

O :0:3 define o output de números reais para arredondar a 3 casas decimais. Não pode ser utilizado desta forma, onde arredondas para output e logo a seguir tentas fazer um cálculo: a formatação de output só pode ser feita após todos os cálculos feitos, e isso é feito com parêntesis:

(num1 + num2):0:3

De seguida, os teus if's não estão bem encadeados. Se houver um erro quando se tentar dividir por zero, tu 1) pedes um novo valor sem controlar de o utilizador volta a tentar introduzir zero e 2) após receber o valor, não realiza a divisão, porque esta só está definida para ser feita caso não haja o erro da divisão por zero. Em suma, tens algo assim:

SE (opção = divisão) E (valor2 = 0) ENTÃO
   ESCREVER "Erro"
   LER valor2
SE_NÃO
   ESCREVER valor1 / valor2
FIM_SE

O "SE_NÃO" não vai ser executado após o LER valor. Sabes porquê?

De seguida, não controlas o operador inserido pelo utilizador, ainda por cima comparas uma String com Integer's, como o @pwseo já referiu.

Por último, deverias ter os if's encadeados da seguinte forma:

if {condição 1} then begin
   {comandos 1}
end
else begin
   if {condição 2} then begin
       {comandos 2}
   end
   else begin
       if {condição 3} then begin
           {comandos 3}
       end;
   end;
end;

Por último, que IDE e compilador utilizas?


Knowledge is free!

Share this post


Link to post
Share on other sites
Yana

Atenção com o output do resultado, estás a fazer mal uma coisa:

num1:0:3 + num2:0:3

O :0:3 define o output de números reais para arredondar a 3 casas decimais. Não pode ser utilizado desta forma, onde arredondas para output e logo a seguir tentas fazer um cálculo: a formatação de output só pode ser feita após todos os cálculos feitos, e isso é feito com parêntesis:

(num1 + num2):0:3

De seguida, os teus if's não estão bem encadeados. Se houver um erro quando se tentar dividir por zero, tu 1) pedes um novo valor sem controlar de o utilizador volta a tentar introduzir zero e 2) após receber o valor, não realiza a divisão, porque esta só está definida para ser feita caso não haja o erro da divisão por zero. Em suma, tens algo assim:

SE (opção = divisão) E (valor2 = 0) ENTÃO
ESCREVER "Erro"
LER valor2
SE_NÃO
ESCREVER valor1 / valor2
FIM_SE

O "SE_NÃO" não vai ser executado após o LER valor. Sabes porquê?

De seguida, não controlas o operador inserido pelo utilizador, ainda por cima comparas uma String com Integer's, como o @pwseo já referiu.

Por último, deverias ter os if's encadeados da seguinte forma:

if {condição 1} then begin
{comandos 1}
end
else begin
if {condição 2} then begin
	{comandos 2}
end
else begin
	if {condição 3} then begin
		{comandos 3}
	end;
end;
end;

Por último, que IDE e compilador utilizas?

Ok obrigado, nao vai ser executado porque entra em conflito com os outros ifs? Eu acabei por usar o ciclo case of.

Uso o Free Pascal.

Edited by Yana

Most people think programming is cold, precise, and mechanical. It's actually creative, perplexing and deeply personal.

Mitch Garnaat

Share this post


Link to post
Share on other sites
thoga31

Ok obrigado, nao vai ser executado porque entra em conflito com os outros ifs? Eu acabei por usar o ciclo case of.

Uso o Free Pascal.

1) O que é um ciclo para estares a dizer que o Case Of é um ciclo?

2) Não há "conflitos". Revelas que não entendeste correctamente o que faz a estrutura de decisão If Then Else. Se a condição é satisfeita, executa o que está após o Then, mas se falhar executa o Else. No teu caso, se a opção for divisão e se o 2º valor for zero, volta a pedir esse valor, caso contrário faz a divisão. Tenta ver o que está mal nessa estrutura e porque é que ele não é executado como deveria ser.

Sugestão: parece-me que entendes Python e as suas estruturas. Python não foge muito ao Pascal no que diz respeito à estrutura de decisão If.


Knowledge is free!

Share this post


Link to post
Share on other sites
Yana

1) O que é um ciclo para estares a dizer que o Case Of é um ciclo?

2) Não há "conflitos". Revelas que não entendeste correctamente o que faz a estrutura de decisão If Then Else. Se a condição é satisfeita, executa o que está após o Then, mas se falhar executa o Else. No teu caso, se a opção for divisão e se o 2º valor for zero, volta a pedir esse valor, caso contrário faz a divisão. Tenta ver o que está mal nessa estrutura e porque é que ele não é executado como deveria ser.

Sugestão: parece-me que entendes Python e as suas estruturas. Python não foge muito ao Pascal no que diz respeito à estrutura de decisão If.

Ok, obrigado pela sugestão :) , vou dar mais umas voltinhas à parte teórica do tutorial :P


Most people think programming is cold, precise, and mechanical. It's actually creative, perplexing and deeply personal.

Mitch Garnaat

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.