Ir para o conteúdo
pokker

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

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por pokker

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por thoga31

Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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. :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.