paulo1205
(usa Ubuntu)
Enviado em 02/10/2013 - 04:32h
Essa
itoa() que aparece no código que você mostrou se parece com a implementação que havia nos antigos compiladores da Borland para o MS-DOS (Turbo C e derivados). Não existe função parecida com essa na biblioteca padrão da linguagem C, de modo que ela provavelmente não estará disponível em compiladores para Linux ou mesmo em muitos compiladores para Windows.
(A implementação da Borland, aliás, é ruim do ponto de vista de segurança. Note que, no seu programa, se você digitar um número maior que ou igual a 512, o seu programa vai dar pau na hora de executar, pois a conversão vai extrapolar o tamanho de dez caracteres do array
b.)
A matemática envolvida para recriar essa função (de preferência tomando mais cuidado com a segurança da implementação) é simples; você só tem que lembrar alguns conceitos e assuntos que a gente aprende (ou aprendia, pelo menos no meu tempo) no primário mesmo.
A primeira coisa a trazer de volta para a mente é a diferença entre
número e
numeral. O número é uma grandeza matemática, e o numeral, uma forma qualquer de referir-se ao valor dessa grandeza. O décimo-sexto elemento do conjunto dos números naturais disposto em ordem crescente é sempre o mesmo número, quer eu me refira a ele como "15" (numeral usando algarismos indo-arábicos), "XV" (numeral romano), "quinze" (numeral cardinal em Português), "fifteen" (numeral cardinal em Inglês), "0xF" (notação hexadecimal da linguagem C), "1111" (numeral binário) ou até mesmo "décimo-sexto elemento do conjunto dos números naturais disposto em ordem crescente" (numeral ordinal em Português, com referência explícita ao conjunto dos números naturais, cujo primeiro elemento, é bom lembrar, é número cujo valor é zero).
No caso de
itoa(), o parâmetro inteiro guarda um número, cujo valor será convertido para um numeral e armazenado numa string.
Outro elemento de conhecimento usado por
itoa() é o de
notação posicional para representação de um número. Isso era coisa que a gente via na quarta série (eu acho -- e acho que hoje se diz "quinto ano do ensino fundamental"), quando se apresentava e explicava o funcionamento da representação de números com algarismos indo-arábicos.
A notação posicional para numerais depende de conjunto finito de
algarismos, que são símbolos associados a determinados
valores absolutos, e da posição que cada algarismo ocupa no numeral, pois isso indica os
valores relativos de cada um deles.
O funcionamento dessa notação é dado pelas seguintes premissas.
1) Se o número de algarismos for
n, os valores absolutos de cada um deles correspondem aos
n primeiros números naturais (por exemplo: se usarmos dez algarismos, o valor do menor deles é zero e o do maior, nove).
2) O valor relativo do algarismo é o produto do seu valor absoluto pelo valor absoluto da posição por ele ocupada no numeral.
3) O valor absoluto de cada posição cresce exponencialmente da direita para a esquerda: a posição mais à direta tem o valor da unidade (um), e a cada posição deslocada mais à esquerda tem seu valor multiplicado pelo número de algarismos
n.
4) O valor relativo de cada algarismo usado na composição do numeral é o produto do seu valor absoluto pelo valor absoluto da posição que ele ocupa.
5) O valor do número indicado pelo numeral é então a soma de todos os valores relativos da composição do numeral.
6) Cada número corresponde biunivocamente a um possível numeral usando a representação num sistema de numeração posicional com
n algarismos.
Assim sendo, quando se usam os algarismos indo-arábicos ("0", "1", "2", "3", "4", "5", "6", "7", "8" e "9"; dez ao todo), o numeral "2505" significa, literalmente, a soma de 2·10³ (valor absoluto dois, deslocado três posições para a esquerda a partir da posição da unidade, que resulta no valor relativo "dois vezes dez vezes dez vezes dez", ou "dois mil") com 5·10² (valor absoluto cinco, deslocado duas posições para a esquerda a partir da posição da unidade, que resulta no valor relativo "cinco vezes dez vezes dez", ou "quinhentos") com 0·10¹ (valor absoluto zero, deslocado uma posição para a esquerda a partir da unidade, que resulta no valor relativo "zero vezes dez", que é zero) com 5·1 (valor absoluto cinco vezes a unidade, já que esta é a posição mais à direita, que resulta o valor relativo "cinco" -- note que pode-se considerar que houve "zero deslocamentos à esquerda", e que dez elevado a zero realmente vale um).
Na quarta série se aprendia somente a notação posicional usando os dez algarismos indo-arábicos, mas note que as premissas acima enunciadas falam sobre uma quantidade de algarismos
n qualquer, desde que
n seja maior que ou igual a dois. Na oitava série, a gente aprendia sobre outros
sistemas de numeração e
mudança de base. Não raro os exercícios envolviam um conjunto de símbolos cujos algarismos eram "bolinha", "quadradinho", "tringulinho" e "cruzinha", ou coisa equivalente. Lembra de exercícios do tipo "
Num sistema de numeração cujos algarismos são, em ordem crescente, "@", "#", "$", "%" e "&", qual o valor do numeral '%@&&$#'?" ou "
Qual a representação do valor numérico cento e vinte e nove num sistema de numeração cujos algarismos são, em ordem crescente, 'A', 'B', 'C' e 'D'?"?
Pois, então:
itoa() é essencialmente a implementação da solução do segundo exercício.
Se você se lembra, a solução do exercício é a seguinte:
1) Começa-se na posição mais à direita.
2) Divide-se o valor a ser convertido pelo número
n de algarismos, guardando-se o quociente e o resto da divisão.
3) O resto da divisão corresponde ao algarismo que ocupa essa posição.
4) Se o quociente for zero, a conversão está encerrada.
5) Caso contrário, desloca-se uma posição a esquerda.
6) O valor a ser convertido passa a ser igual ao quociente.
7) Volta-se ao passo 2.
Obviamente, uma implementação de
itoa() teria de tomar cuidado com o tratamento de valores negativos.