Jump to content

Recommended Posts

Posted

Ontem começei a aprender pascal , ja fiz os programas hello world e agora tenho como projeto fazer um calculadora em que o utilizador escolha a operação que deseja realizar. ainda não está completo, mas alguém me pode dizer onde estou a escrever mal ?

program calculadora;
uses crt;
var num1,num2:real;
var x:integer;

begin
write('Escolhe que operacao deseja fazer.');
writeln; // paragrafo
write('1 - Para adicao');
writeln; // paragrafo
write('2 - Para subtraçao');
writeln; // paragrafo
write('3- Para multiplicação');
writeln; // paragrafo
write('4- Para divisão');
writeln; // paragrafo
write( ' A operacao que desejo utilizar e ');
readln ( x );
write('Primeiro valor: ');
readln(num1);
write('Segundo valor: ');
readln(num2);
writeln; // paragrafo

if (x=1) then begin
writeln(num1:0:0,' + ',num2:0:0,' = ',num1+num2:0:0); 

if (x=2) then begin
writeln(num1:0:0,' - ',num2:0:0,' = ',num1-num2:0:0);

if (x=3) then begin
writeln(num1:0:0,' * ',num2:0:2,' = 'num1*num2:0:2);
readln;
end.
Posted

Eu nao sei Pascal. O meu conselho e seguires os "warnings" do teu compilador.

Alem disso conto 4 "begin" e 1 "end" -- como disse, nao sei Pascal -- faltam-te 3 "end" ???

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Como disse começei ontem... Mas penso que não... O meu compilador dá me um erro aqui.

if (x=3) then begin
        writeln(num1:0:0,' * ',num2:0:[b]2[/b],' = 'num1*num2:0:2);
        readln;
Posted

        writeln(num1:0:0,' * ',num2:0:2,' = 'num1*num2:0:2);
     //         --------,-----,--------,------------------

Nao falta uma virgula algures nos parametros?

Eu costumo usar um espaco a seguir a virgula. Acho que isso torna mais facil identificar as partes ...

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Eis o código:


program calculadora;
uses crt;
var num1,num2:real;
var x:integer;

begin
        write('Escolhe que operacao deseja fazer.');
        writeln; // paragrafo
        write('1 - Para adicao');
        writeln; // paragrafo
        write('2 - Para subtraçao');
        writeln; // paragrafo
        write('3- Para multiplicação');
        writeln; // paragrafo
        write('4- Para divisão');
        writeln; // paragrafo
        write( ' A operacao que desejo utilizar e ');
        readln ( x );
        write('Primeiro valor: ');
        readln(num1);
        write('Segundo valor: ');
        readln(num2);
        writeln; // paragrafo

        if (x=1) then
        writeln(num1:0:0,' + ',num2:0:0,' = ',num1+num2:0:0);

        if (x=2) then
        writeln(num1:0:0,' - ',num2:0:0,' = ',num1-num2:0:0);

        if (x=3) then
        writeln(num1:0:0,' * ',num2:0:2,' = ',num1*num2:0:2);

        readln;
end. 

Os erros foram:


if (x=1) then begin //Quando a somente uma operação, o begin e desnecessário
        writeln(num1:0:0,' + ',num2:0:0,' = ',num1+num2:0:0); 
        // Como você usou "begin", aqui deveria ter um "end;"
        
        if (x=2) then begin
        writeln(num1:0:0,' - ',num2:0:0,' = ',num1-num2:0:0);
        //idem 
        if (x=3) then begin
        writeln(num1:0:0,' * ',num2:0:2,' = 'num1*num2:0:2);//Faltou uma vírgula ao lado de "num1*num2:0:2"
        //idem 

Erros simples que para evita-lo é necessária atenção, mas não desanime de programar  👍🙂

Abraço.

Posted
program calculadora;
uses crt;
var num1,num2:real;
var x:integer;
begin
write('Escolhe que operacao deseja fazer.');
writeln; // paragrafo
write('1 - Para adicao');
writeln; // paragrafo
write('2 - Para subtracao');
writeln; // paragrafo
write('3- Para multiplicacao');
writeln; // paragrafo
write('4- Para divisao');
writeln;//paragrafo
writeln(' ----------------------');
        write( ' A operacao que desejo utilizar e ');
        readln ( x );
	writeln(' ----------------------');
        write('Primeiro valor: ');
        readln(num1);
        write('Segundo valor: ');
        readln(num2);
	writeln(' ----------------------');
if (x=1) then begin
writeln(num1:0:0,' + ',num2:0:0,' = ',num1+num2:0:0); 
end;
if (x=2) then begin
writeln(num1:0:0,' - ',num2:0:0,' = ',num1-num2:0:0);
end;
if (x=3) then begin
writeln(num1:0:0,' * ',num2:0:2,' = ',num1*num2:0:2);
end;
writeln; // paragrafo
if (x=4) and (num2=0) then begin
	write(' Divisao por 0 é impossivel!');
end;
if (x=4) and (num2 <>0) then begin
	writeln(num1:0:0,' / ',num2:0:0,' = ',num1/num2:0:2);
end;
readln;
end.

Ele já funciona como eu quero, mas agora tenho uma dúvida. Como dá para fazer "apagar" os resultados e voltar a dar hipótese ao utilizador  de escolher que conta quer fazer?

Posted

Todo o bloco que tens entre o primeiro Begin e o End. têm de ficar dentro de um ciclo, acrescentando é claro mais alguma coisa para apagar, e para que o utilizador escolha se quer ou não continuar...

.
.
.
var
    escolha:char;
begin
       repeat
              clrscr;  // Isto limpa o ecrã

              (* Inseres aqui o código que tens entre o primeiro begin e o end. *)

              writeln;
              write('Deseja continuar [s/N]? ');  // Aqui faz a pergunta
              escolha:=readkey;                       // Aqui lê uma tecla
       until (escolha <> 'S') and (escolha <> 's');  { Aqui testa a tecla lida. Se for diferente de S (ou s), termina o ciclo, e logo, o programa }
end.

Nota: Para definires variáveis de tipos diferentes, não precisas repetir a palavra VAR.

Em vez de:

var num1,num2:real;
var x:integer;

podes por simplesmente:

var num1,num2:real;
      x:integer;
      escolha:char;

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

CrankisPT, já deste funções e procedimentos?

É que isso iria facilitar-te muito a vida para aplicares a solução do Nuno.

Outra observação que te faço é que não necessitas usar o writeln sozinho para fazeres quebra da linha podes usá-lo directamente com o texto.

Repara:

// ......

writeln('Escolhe que operacao deseja fazer.');
writeln('1 - Para adicao');
writeln('2 - Para subtracao');
writeln('3- Para multiplicacao');
writeln('4- Para divisao');
writeln(' ----------------------');
write( ' A operacao que desejo utilizar e ');

   .....

Posted
program calculadora;
uses crt;
var num1,num2:real;
x:integer;
Escolha:char;
begin
repeat
              clrscr; // Limpar ecrã
writeln('Escolhe que operacao que deseja fazer.');
writeln('1 - Para adicao');
writeln('2 - Para subtracao');
writeln('3-  Para multiplicacao');
writeln('4-  Para divisao');
writeln(' ----------------------');
        write( ' A operacao que desejo utilizar e: ');
        readln ( x );
	writeln(' ----------------------');
        write('Primeiro valor: ');
        readln(num1);
        write('Segundo valor: ');
        readln(num2);
	writeln(' ----------------------');
if (x=1) then begin
writeln(num1:0:0,' + ',num2:0:0,' = ',num1+num2:0:0); 
end;
if (x=2) then begin
writeln(num1:0:0,' - ',num2:0:0,' = ',num1-num2:0:0);
end;
if (x=3) then begin
writeln(num1:0:0,' * ',num2:0:2,' = ',num1*num2:0:2);
end;
writeln; // paragrafo
if (x=4) and (num2=0) then begin
	write(' Divisao por 0 é impossivel!');
end;
if (x=4) and (num2 <>0) then begin
	writeln(num1:0:0,' / ',num2:0:0,' = ',num1/num2:0:2);
end;
writeln;
              write('Deseja continuar [s/N]? ');  
              escolha:=readkey;                       
       until (escolha <> 'S') and (escolha <> 's');
end.

Já está resolvido. Obrigado! 👍

Posted

Olá outra vez,

Tens um erro no teu código, quando seleccionas a divisão e num2 é gual a zero vai te dar a mensagem "Divisao por 0 é impossivel!" e então se não for igual a Zero?.... Ah pois é! Há que haver cuidado com estes promenores....

então deveria ficar assim:

    if x=4 then
      if num2=0 then writeln(' Divisao por 0 é impossivel!')
      else writeln(num1:0:0,' / ',num2:0:2,' = ',num1*num2:0:2)

mais, lembrei-me de outras duas soluções mais à programador que amador. Uma mais complicada e outra mais simples mas mais avançada.

1ª mais complicada

------------------------

Se reparares quando X é igual a 1 o programa vai, desnecessariamente, testar se X é igual a 2, 3, 4, etc.

Ora, num programa destes não é grave mas num programa complexo pode ser então a solução seria testar até encontrar o valor e "saltar fora", isto com IF's seria assim:

if (x=1) then
  writeln(num1:0:0,' + ',num2:0:0,' = ',num1+num2:0:0)
else
  if (x=2) then
    writeln(num1:0:0,' - ',num2:0:0,' = ',num1-num2:0:0)
  else
    if (x=3) then
      writeln(num1:0:0,' * ',num2:0:2,' = ',num1*num2:0:2)
    else
      if x=4 then begin
        if num2=0 then writeln(' Divisao por 0 é impossivel!')
        else writeln(num1:0:0,' / ',num2:0:2,' = ',num1*num2:0:2)
      else writeln(' Selecção inválida')  (* Mensagem que aparece se não se tiver carregado em 1, 2, 3 ou 4 as tuas opções válidas *)

Vez a diferença? É um pouco mais complicado mas mais optimizado

2ª Opção - Mais simples mas mais avançada

--------------------------------------------------------

Em vez do IF usa a estrutura CASE que funciona como o código acima. É para este tipo de situações que ele existe!

case x of
  1:writeln(num1:0:0,' + ',num2:0:0,' = ',num1+num2:0:0);
  2:writeln(num1:0:0,' - ',num2:0:0,' = ',num1-num2:0:0);
  3: writeln(num1:0:0,' * ',num2:0:2,' = ',num1*num2:0:2);
  4:begin
       if num2=0 then writeln(' Divisao por 0 é impossivel!')
       else writeln(num1:0:0,' / ',num2:0:2,' = ',num1*num2:0:2)
     end;
  else writeln(' Selecção inválida')  (* Mensagem que aparece se não se tiver carregado em 1, 2, 3 ou 4 as tuas opções válidas *)

Soooo simple!!!!!

Have fun!

Posted

Ainda nao cheguei a essa parte. Estava a tentar resolver com o que já sabia. Mas obrigado

Tens um erro no teu código, quando seleccionas a divisão e num2 é gual a zero vai te dar a mensagem "Divisao por 0 é impossivel!" e então se não for igual a Zero?.... Ah pois é! Há que haver cuidado com estes promenores....

Eu compilei e dá me correto. Resolve a conta normalmente.

Posted

Então é porque não colocaste o código todo, porque senão onde é que mostras o resultado da divisão quando o num2 for diferente de zero?

tens de ter algum sitio com um código semelhante a este: writeln(num1 / num2);

Posted

O codigo não está mal, e por isso é que dá correctamente o resultado, mas a verdade é que pode melhorar (estou a falar deste caso especifico da divisão por 0, já que não vi o codigo todo...)

crankisPT: Tu tens em cima isto:

        if (x=4) and (num2=0) then begin
                write(' Divisao por 0 é impossivel!');
        end;
        if (x=4) and (num2 <>0) then begin
                writeln(num1:0:0,' / ',num2:0:0,' = ',num1/num2:0:2);
        end;

passarito: Não reparaste na segunda parte, certo?

Ora, isto funciona, não há duvida, mas é ao que se chama "más práticas de programação". Se estas a testar em cima se é igual a 0, é de evitar volta a testar em baixo se não é.

Assim, o ideal aqui seria mesmo o indicado pelo passarito:

        if (x=4) then if (num2=0) then writeln(' Divisao por 0 é impossivel!')
                                              else writeln(num1:0:0,' / ',num2:0:0,' = ',num1/num2:0:2);

Grosso modo, no teu código o compilador tem de fazer para este bloco 8 operações (só na parte das condições dos if's, não estou a incluir a execução do writeln.

São elas:

a. x=4

b. num2=0

c. (resultado de a.) and (resultado de b.)

d. Teste ao resultado de c.

e. x=4

f. num2<>0

g. (resultado de e.) and (resultado de f.)

h. Teste ao resultado de g.

Com a sugestão do passarito, o compilador passaria a fazer apenas 4 operações:

a. x=4

b. Teste ao resultado de a.

c. num2=0

d. Teste ao resultado de c.

Num programa simples como este, isto é indiferente em termos de performance do computador, mas num programa mais complexo, todos estes pormenores são importantes para deixar o programa mais rápido.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Nota: Estas sugestões são uteis para ires melhorando, mas não quer dizer que estivesses mal.

Na programação, como em tudo na vida, há sempre espaço para melhorar, e é nesse sentido que o pessoal aqui vai dando dicas (que nada têm a ver com a questão original).

Mas quanto mais percebermos esses pormenores onde podemos melhorar, menos tempo perdemos depois a corrigir enganos. 👍

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

        if (x=4) and (num2=0) then begin
                write(' Divisao por 0 é impossivel!');
        end;
        if (x=4) and (num2 <>0) then begin
                writeln(num1:0:0,' / ',num2:0:0,' = ',num1/num2:0:2);
        end;

passarito: Não reparaste na segunda parte, certo?

Eh... tens razão... como a janela não abrange tudo esqueci-me de fazer o scroll down....

É que não estou habituado àquela forma de código....

CrankisPT, a ideia é quanto mais "limpo" for o teu código mais facilmente podes alterá-lo, melhorá-lo e/ou detectares erros.

Posted

Boas de pascal ainda me vou safand apesar de ter começador ha um ano ve la se é mais ou menos isto?

program calculadora;
uses crt;

var
x, y, resultado : real;
operador, resp : char;
cont: integer;

begin
resultado := 0;
cont := 1;
Repeat
	clrscr;
		writeln ('Entre com o numero:');
		readln (y);
		writeln ('Escolha a operacao (+,-,*,/):');
		readln (operador);
  		{soma}
  		if (operador='+') then
  		resultado := resultado + y
   		{subtaracao}
   		else if (operador='-') then
   		resultado := resultado -y
   		{mutiplicacao}
   		else if (operador='*') then
   		resultado := resultado *y
   		{divisao}
   		else if (operador='/') then
   		resultado := resultado /y;
   		writeln (resultado:8:3);
   		WriteLn('');
   		WriteLn('');
   		if(cont=1) then
   		 	cont := cont + 1
   		else
   		begin
   			WriteLn('Continuar(C), Zerar(Z), Sair(S): ');
   			Readln(resp);
   		end;
   		If(resp='Z') then
   		Begin
   			resultado := 0;
   			cont := 1;
   		End;
   	Until resp = 'S';
end.

HTML Master

The programs change the world

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.