pokker Posted February 15, 2013 at 04:37 PM Report #495441 Posted February 15, 2013 at 04:37 PM Tendo sido inspirado por este tópico http://www.portugal-a-programar.pt/topic/58936-saber-resultado-exato/ e após algumas pesquisas na net sobre o dito método, pois no meu tempo de escola primária aprendi a dividir pelo método das reguadas e puxões de orelhas, não havia cá nada destas modernices lololol. Se bem percebi o método: 31:5= 6, resto 1 ou seja; 31-5=26 26-5=21 21-5=16 16-5=11 11-5=6 6-5=1 Vai dai, resolvi tentar em pascal. Program metodo; var dividendo, divisor, quociente, resto: integer; begin writeln('Escreva o dividendo e o divisor'); readln(dividendo, divisor); resto:=0; quociente :=0; resto:=dividendo-divisor; quociente:=quociente+1; while resto >= divisor do begin resto:=resto - divisor; quociente:=quociente +1; end; writeln(dividendo,' : ',divisor,' = ',quociente,' resto:= ',resto); readln; end. No dito enunciado também pedia para avisar caso a divisão não seja exacta, era só acrescentar algo como se resto<>0 então a divisão não é exacta. Qualquer coisa avisem, estou um bocado(muito) enferrujado e gosto sempre de aprender mais algumas coisas 😄
HappyHippyHippo Posted February 15, 2013 at 08:21 PM Report #495474 Posted February 15, 2013 at 08:21 PM tenta fazer a divisão de 5 por 8 IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
thoga31 Posted February 15, 2013 at 09:07 PM Report #495486 Posted February 15, 2013 at 09:07 PM @pokker, porque é que tu incrementas o quociente em 1 antes do ciclo? Aconselho, entretanto, a inicialização das variáveis na sua declaração e não em runtime. E recomendo o uso do método Inc para incrementar o quociente e Dec para decrementar o resto, faz um código mais bonito. Knowledge is free!
pokker Posted February 16, 2013 at 12:38 PM Author Report #495545 Posted February 16, 2013 at 12:38 PM (edited) 5 dividir por 8 não dá, fiz o programa para divisões em que o dividendo seja sempre maior que o divisor; o quociente vai contar o número de vezes que se faz a subtracção, como antes do ciclo já está resto:=dividendo-divisor incrementei o quociente. Vou explorar o método inc e dec. Isto está um bocado esquecido, mas nada melhor do que ler e ir fazendo experiências 😄 Edit: Já agora no Lazarus, como faço para correr o programa passo-a-passo (step over acho que é isto), é que fiz uns add watch e ao clicar no F8 ele executa o programa todo de uma só vez, queria fazer passo a passo(linha a linha) para ver o comportamento das variáveis. Edited February 16, 2013 at 12:42 PM by pokker
HappyHippyHippo Posted February 16, 2013 at 05:47 PM Report #495593 Posted February 16, 2013 at 05:47 PM 5 dividir por 8 não dá, fiz o programa para divisões em que o dividendo seja sempre maior que o divisor; a questão é que a alteração para ser possível fazer isso é do mais simples que existe ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
thoga31 Posted February 16, 2013 at 08:49 PM Report #495655 Posted February 16, 2013 at 08:49 PM @pokker, retira esta linha de código antes do ciclo... quociente:=quociente+1; ...e depois volta a testar a divisão de 5 por 8, sim? Knowledge is free!
pokker Posted February 16, 2013 at 09:45 PM Author Report #495662 Posted February 16, 2013 at 09:45 PM Fazendo a conta à mão, lápis e papel, 5/8=0,625 e resto 0; tirando essa linha o resto vai dar -3 e nem entra no ciclo while. Outro exemplo, fazendo à mão 5/6=0,83(3) resto 2. (acho que as contas estão bem feitas) Acho que o algoritmo do método da divisão usando subtracções sucessivas não funciona quando o dividendo é menor que o divisor; pelo método das subtracções sucessivas, o quociente é dado pelo número de vezes que se subtrai sendo o resto dado pela última subtracção. Se calhar não estou a ver bem a coisa.
HappyHippyHippo Posted February 16, 2013 at 09:53 PM Report #495663 Posted February 16, 2013 at 09:53 PM Se calhar não estou a ver bem a coisa. nop é mais do que possível. o problema está na tua inicialização IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
thoga31 Posted February 16, 2013 at 09:58 PM Report #495665 Posted February 16, 2013 at 09:58 PM Pois não estás a ver bem a coisa, não estás a jogar com os dados todos 🙂 Não é obrigatório entrares no ciclo While. Não entras nele quando o dividendo é menor que o divisor. E, nestes casos, o resto é sempre igual ao dividendo. 😉 Knowledge is free!
pokker Posted February 17, 2013 at 09:29 AM Author Report #495754 Posted February 17, 2013 at 09:29 AM Bem, tive uma epifania na casa de banho lololol Acho que arranjei uma possivel solução, e pelo que dizem deve haver mais do que uma. O que fiz foi verificar se o dividendo é menor que o divisor, se sim, então multiplico o dividendo por 10 (é o que se faz quando temos 5:8, acrescenta-se um zero ao 5 e no quociente mete-se 0,qualquer coisa) E assim o programa (com as devidas alterações, meti quociente como real e caso o dividendo seja menor que o divisor, incremento o quociente a 0,1 caso contrario incrementa a 1), já funciona, 5/8=0,6 resto 2
HappyHippyHippo Posted February 17, 2013 at 10:10 AM Report #495761 Posted February 17, 2013 at 10:10 AM (edited) Bem, tive uma epifania na casa de banho lololol Acho que arranjei uma possivel solução, e pelo que dizem deve haver mais do que uma. O que fiz foi verificar se o dividendo é menor que o divisor, se sim, então multiplico o dividendo por 10 (é o que se faz quando temos 5:8, acrescenta-se um zero ao 5 e no quociente mete-se 0,qualquer coisa) E assim o programa (com as devidas alterações, meti quociente como real e caso o dividendo seja menor que o divisor, incremento o quociente a 0,1 caso contrario incrementa a 1), já funciona, 5/8=0,6 resto 2 como diriam os Gato Fedorento : "Cá bolta grande ..." já te disso : é mais do que possível. o problema está na tua inicialização experimenta isto : Program metodo; var dividendo, divisor, quociente, resto: integer; begin writeln('Escreva o dividendo e o divisor'); readln(dividendo, divisor); resto:=0; quociente :=0; resto:=dividendo; while resto >= divisor do begin resto:=resto - divisor; quociente:=quociente +1; end; writeln(dividendo,' : ',divisor,' = ',quociente,' resto:= ',resto); readln; end. Edited February 17, 2013 at 10:11 AM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pokker Posted February 17, 2013 at 10:33 AM Author Report #495764 Posted February 17, 2013 at 10:33 AM Sim, percebi, mas eu queria usar à força as subtracções sucessivas independentemente do dividendo ser maior ou menor que o divisor. Como eu expliquei também funciona, devolve o quociente como 0,6 e resto 2. Já agora, quais são as opções de saída do write, tá a sair assim 6.00000000E-001, existe alguma opção para mostrar 0,6?
HappyHippyHippo Posted February 17, 2013 at 10:37 AM Report #495765 Posted February 17, 2013 at 10:37 AM Sim, percebi, mas eu queria usar à força as subtracções sucessivas independentemente do dividendo ser maior ou menor que o divisor. Como eu expliquei também funciona, devolve o quociente como 0,6 e resto 2. Já agora, quais são as opções de saída do write, tá a sair assim 6.00000000E-001, existe alguma opção para mostrar 0,6? como ? é impossível devolve 0.6 IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pokker Posted February 17, 2013 at 11:06 AM Author Report #495770 Posted February 17, 2013 at 11:06 AM Tens razão, 6.00000000E-001 não dá 0,6, não meti os zeros todos, são 14 zeros, algo assim 6.00000000000000E-001, mas já encontrei a notação, basta fazer isto à frente da variavel xpto:1:1 e assim já mostra 0,6
HappyHippyHippo Posted February 17, 2013 at 11:20 AM Report #495773 Posted February 17, 2013 at 11:20 AM epa ... se não existe divisão no código como pode aparecer esse valor, seja que notação for !!!! estás a testar o código que apresentei ou não !! IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pokker Posted February 17, 2013 at 11:45 AM Author Report #495780 Posted February 17, 2013 at 11:45 AM Sim testei o código que deste, este resultado que estou a referir está no meu código que atrás referi, o da epifania O que fiz foi verificar se o dividendo é menor que o divisor, se sim, então multiplico o dividendo por 10 (é o que se faz quando temos 5:8, acrescenta-se um zero ao 5 e no quociente mete-se 0,qualquer coisa) E assim o programa (com as devidas alterações, meti quociente como real e caso o dividendo seja menor que o divisor, incremento o quociente a 0,1 caso contrario incrementa a 1), já funciona, 5/8=0,6 resto 2
HappyHippyHippo Posted February 17, 2013 at 11:52 AM Report #495785 Posted February 17, 2013 at 11:52 AM então estás a responder ao meu código com o resultado do teu ... isso é para eu ficar esclarecido não ? corre o meu código e diz se qual o resultado de 5 / 8 !!! o da tua epifania está incrivelmente desnecessário e nem sei de errado mesmo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pokker Posted February 17, 2013 at 11:59 AM Author Report #495790 Posted February 17, 2013 at 11:59 AM Sim, já corri o teu, dá quociente 0, resto 5. E percebi.
thoga31 Posted February 17, 2013 at 03:33 PM Report #495824 Posted February 17, 2013 at 03:33 PM (edited) @Happy, em 6000 posts nunca tinhas participado neste quadro até muito recentemente; pedia-te que mantivesses um pouco mais a calma na forma como falas. @pokker, de facto não era suposto em nenhum dos programas sair o output do 0.6. A não ser que tenhas alterado isso com uma linha de teste para mostrar o resultado da divisão aí do teu lado. Para formatar este output existe a seguinte notação: variavel : espaco_minimo_ocupado : casas_decimais Exemplo: writeln(3.14); // output por defeito - modo científico writeln(3.14 : 0 : 2); // arredondado a 2 casas, ocupa o espaço que for preciso writeln(3.14 : 10 : 2); // arredondado a 2 casas, ocupa pelo menos 10 caracteres - o número fica alinhado à direito, e o resto é preenchido com espaços Output: 3.1400000000000000E+0000 3.14 3.14 Edited February 17, 2013 at 03:33 PM by thoga31 Knowledge is free!
pokker Posted February 17, 2013 at 05:14 PM Author Report #495848 Posted February 17, 2013 at 05:14 PM Sim, nenhum dos códigos aqui postados dá na saída 0.6, eu é que alterei aqui uma versão de modo a apresentar o resultado da divisão, daí a minha pergunta sobre as opções de notação do write. Aproveito para agradecer aos dois e pedir desculpas, pois acredito que em alguns momentos não me soube explicar/expor convenientemente as minhas dúvidas. 🙂
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