Divisões sucessivas

446 views
Skip to first unread message

thadeu.penna

unread,
Aug 15, 2011, 10:52:49 AM8/15/11
to Latex-br
Eu quero demonstrar a transformação de um inteiro na base 10 para
binário usando divisões sucessivas. Uma dificuldade é criar o símbolo
(contorno da divisão). Por exemplo:

10 | 2
0 5 | 2
1 2 | 2
0 1 | 2
1 0

10 = 1010_2

Ao invés do |, eu queria o |____ e o símbolo para o resto ( como o
")" deitado). Como devo usar isto mais de uma vez, quanto mais
automático, melhor..

[]s


Renato

unread,
Aug 15, 2011, 10:56:20 AM8/15/11
to late...@googlegroups.com
Já vi algo assim com o TIKZ, se achar te envio.

REnato

2011/8/15 thadeu.penna <thadeu...@gmail.com>:

Miguel Frasson

unread,
Aug 16, 2011, 11:11:22 AM8/16/11
to Latex-br, thadeu...@gmail.com
Olá.

Programei uma solução que pode ser vista no arquivo cujo conteúdo está
abaixo.
O problema é como colocar as marcas nos números. Não achei uma forma
bonita de fazer.

Abraço

Miguel.



\documentclass[12pt]{article}

\usepackage{calc,ifthen}

% \divbox -> mesmo que \fbox, mas omite as barras de cima e da
direita
\makeatletter
% copiado descaradamente do codigo do \fbox,
% visto com \show\fox e \makeatletter\show\@frameb@x\makeatother
\newcommand{\divbox}[1]{%
\leavevmode\setbox\@tempboxa
\hbox{\color@begingroup\kern\fboxsep{#1}\kern\fboxsep
\color@endgroup}\@divb@x\relax}
\newcommand{\@divb@x}{%
\@tempdima\fboxrule
\advance\@tempdima\fboxsep
\advance\@tempdima\dp\@tempboxa
\hbox{\lower\@tempdima
\hbox{\vbox{\hbox{\vrule\@width\fboxrule
\vbox{\vskip\fboxsep\box\@tempboxa\vskip\fboxsep}}%
\hrule\@height\fboxrule}}}}
\makeatletter


%
\newcounter{quociente}
\newcounter{resto}

% \CalculaQuocienteResto{#1} -> calcula o quociente e o resto de #1
% por 2 e armazena os valores nos comandos \Quociente e \Resto
\newcommand{\CalculaQuocienteResto}[1]{%
\setcounter{quociente}{#1/2}%
\setcounter{resto}{#1-2*\value{quociente}}%
\edef\Quociente{\thequociente}%
\edef\Resto{\theresto}%
}

\newlength{\ComprimentoCaixas}
\newlength{\AlturaCaixas}
\setlength{\ComprimentoCaixas}{2em}
\setlength{\AlturaCaixas}{\heightof{2}+2\fboxsep+\fboxrule}

% Assume que o ponto de referencia eh a barra vertical da divisao.
% Imprime dividendo, divisor quociente e resto em caixas,
% Todos menos o divisor sao alinhados a direita.
% Usa \raisebox para elevar caixas
\newcommand{\ImprimeChaveDivisao}[4]{%
%dividendo
\makebox[0pt][r]{#1\hskip\fboxsep}%
% divisor
\makebox[0pt][l]{\divbox{\makebox[\ComprimentoCaixas-2\fboxsep][l]
{#2}}}%
% resto
\makebox[0pt][r]{%
\raisebox{-\AlturaCaixas}{#4\hskip\fboxsep}}%
% quociente
\makebox[0pt][l]{%
\raisebox{-\AlturaCaixas}{%
\makebox[\ComprimentoCaixas][r]{#3}}}}

% modo como marca um numero
\newcommand{\Marcar}[1]{$\underline{#1}$}
% para remover marcas, use o comando abaixo
% \newcommand{\Marcar}[1]{#1}

% imprime a divisao continuada com as marcas
\newcommand{\DivisaoContinuada}[1]{%
\CalculaQuocienteResto{#1}
\ifnum\Quociente<2\relax
\ImprimeChaveDivisao{#1}{2}{\Marcar{\Quociente}}{\Marcar{\Resto}}%
\else
\ImprimeChaveDivisao{#1}{2}{\DivisaoContinuada{\Quociente}}
{\Marcar{\Resto}}%
\fi
}

\begin{document}

\DivisaoContinuada{10}

\DivisaoContinuada{125}

\DivisaoContinuadaMarcada{125}

\end{document}

Thadeu Penna

unread,
Aug 16, 2011, 11:20:51 AM8/16/11
to late...@googlegroups.com
Olá Miguel

muito obrigado pela sua solução!!

Eu havia encontrado outra
(http://newsgroups.derkeiler.com/Archive/Comp/comp.text.tex/2011-05/msg00092.html)
mas que não ficou bonita como a sua (tive que comentar o
DivisaoContinuadaMarcada). Eu modifiquei o box de divisão e coloquei o
smile no resto (usei o relsize para aumentar o número no \stackrel):

\documentclass{minimal}
\usepackage{relsize}

\makeatletter
\newbox\nb@box
\newcount\nb@a
\newcount\nb@b
\newcount\iter@
\newcommand\conversion[2][2]{%
\def\dividende@{#2}\def\base@{#1}\iter@\@ne\conversion@{#2}{#1}}
\newcommand\conversion@[2]{%
\setbox\nb@box\hbox{\kern0.5em#1\kern0.5em}%
\nb@a#1 \nb@b#1 \divide\nb@b#2
\vtop{%
\multiply\nb@b#2 \advance\nb@a-\nb@b
\hbox to\wd\nb@box{\hfil#1\hfil}%
\vskip3pt\hrule height\z@ width\wd\nb@box\vskip3.4pt
\hbox to\wd\nb@box{\hfil$\stackrel{\mathlarger{\number\nb@a}}{\smile}$\kern0.5em}%
\expandafter\xdef\csname reste@\number\iter@\endcsname
{\number\nb@a}%
}%
\setbox\nb@box\hbox{8}\vrule height\ht\nb@box depth0.5ex
\setbox\nb@box\hbox{%
\kern0.5em
\ifnum#2>\nb@b\relax
#2%
\else
\number\nb@b
\fi
\kern0.5em}%
\vtop{%
\hbox to\wd\nb@box{\kern0.5em#2\hfil}%
\vskip3pt\hrule height0.4pt width\wd\nb@box\vskip3pt
\hbox{%
\csname @\ifnum\nb@b>0 first\else second\fi oftwo\endcsname
{\advance\iter@\@ne\gdef\maxiter{\number\iter@}%
\expandafter\conversion@\expandafter{\number\nb@b}{#2}}%
{\kern0.5em\number\nb@b\xdef\maxiter{\number\iter@}}}%
}%
}

\newcommand\displayresult{%
$(\dividende@)_{10}=(\displayresult@\maxiter)_{\base@}$}
\newcommand\displayresult@[1]{%
\csname reste@#1\endcsname
\ifnum#1>\@ne
\expandafter\displayresult@\expandafter
{\number\numexpr#1-1\expandafter}%
\fi
}
\makeatother


\begin{document}
\parindent0pt
Successive divisions by 2: \conversion{197}

And the result: \displayresult
\bigskip

Successive divisions by 3: \conversion[3]{197}

And the result: \displayresult
\end{document}


2011/8/16 Miguel Frasson <mvsfr...@gmail.com>:

--
Thadeu Penna
Prof.Associado
Instituto de Ciências Exatas - Volta Redonda
Universidade Federal Fluminense
INCT - Sistemas Complexos
Linux User #50500 (counter.li.org)

Jorge Barros de Abreu

unread,
Aug 16, 2011, 5:48:37 PM8/16/11
to late...@googlegroups.com
On Tuesday 16 August 2011 12:20:51 Thadeu Penna wrote:
> Olá Miguel
>
> muito obrigado pela sua solução!!
>
> Eu havia encontrado outra
> (http://newsgroups.derkeiler.com/Archive/Comp/comp.text.tex/2011-05/msg0009
> 2.html) mas que não ficou bonita como a sua (tive que comentar o

> DivisaoContinuadaMarcada). Eu modifiquei o box de divisão e coloquei o
> smile no resto (usei o relsize para aumentar o número no \stackrel):


Maravilhoso.
Brilhante.

Parabéns a todos.

--
Data Estelar 2455790,400289
http://sites.google.com/site/ficmatinf
Desejo-lhe Paz, Vida Longa e Prosperidade.
São Bem Vindas Mensagens no Formato texto UTF-8 com Acentos.

Reply all
Reply to author
Forward
0 new messages