crankisPT Posted September 25, 2011 at 11:42 AM Report #413509 Posted September 25, 2011 at 11:42 AM 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.
pmg Posted September 25, 2011 at 12:12 PM Report #413515 Posted September 25, 2011 at 12:12 PM 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!
crankisPT Posted September 25, 2011 at 01:55 PM Author Report #413526 Posted September 25, 2011 at 01:55 PM 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;
pmg Posted September 25, 2011 at 02:43 PM Report #413530 Posted September 25, 2011 at 02:43 PM 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!
igord Posted September 25, 2011 at 03:34 PM Report #413536 Posted September 25, 2011 at 03:34 PM 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.
crankisPT Posted September 25, 2011 at 05:36 PM Author Report #413545 Posted September 25, 2011 at 05:36 PM 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?
nunopicado Posted September 25, 2011 at 10:27 PM Report #413576 Posted September 25, 2011 at 10:27 PM 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.
passarito Posted September 25, 2011 at 10:46 PM Report #413578 Posted September 25, 2011 at 10:46 PM 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 '); .....
crankisPT Posted September 26, 2011 at 05:06 PM Author Report #413620 Posted September 26, 2011 at 05:06 PM 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! 👍
passarito Posted September 26, 2011 at 06:14 PM Report #413622 Posted September 26, 2011 at 06:14 PM 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!
crankisPT Posted September 26, 2011 at 07:05 PM Author Report #413625 Posted September 26, 2011 at 07:05 PM 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.
passarito Posted September 26, 2011 at 07:56 PM Report #413629 Posted September 26, 2011 at 07:56 PM 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);
nunopicado Posted September 26, 2011 at 08:19 PM Report #413632 Posted September 26, 2011 at 08:19 PM 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.
crankisPT Posted September 26, 2011 at 08:26 PM Author Report #413633 Posted September 26, 2011 at 08:26 PM Vou melhorar ... ( mas já percebi . Obrigado!)
nunopicado Posted September 26, 2011 at 08:36 PM Report #413637 Posted September 26, 2011 at 08:36 PM 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.
passarito Posted September 26, 2011 at 11:26 PM Report #413669 Posted September 26, 2011 at 11:26 PM 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.
ralmeidasantos Posted September 27, 2011 at 10:07 PM Report #413779 Posted September 27, 2011 at 10:07 PM 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now