Jump to content

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


pokker

Recommended Posts

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 😄

Link to comment
Share on other sites

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 by pokker
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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. 🙂

Link to comment
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.