Jump to content
pokker

Divisão pelo método subtrações sucessivas

Recommended Posts

pokker

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 :D

Share this post


Link to post
Share on other sites
thoga31

@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!

Share this post


Link to post
Share on other sites
pokker

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 :D

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 by pokker

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
thoga31

@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!

Share this post


Link to post
Share on other sites
pokker

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.

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
thoga31

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!

Share this post


Link to post
Share on other sites
pokker

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

Share this post


Link to post
Share on other sites
HappyHippyHippo

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 by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
pokker

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?

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
pokker

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

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
pokker

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

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
thoga31

@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 by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
pokker

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


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