/* =========================================================================
Linguagem: C'11 Compilador 4.9.2 GCC mingW32 Thread model: posix
Programa: DigitoNaPosicao.c
Data: 12 / 4 / 2018 13:10
Autor: Mauro Britivaldo
========================================================================= */
/* INCLUDE */
/* Incluir permite chamar as funçőes ou macros */
#include <stdio.h> /* printf; puts; scanf; ...*/
#include <assert.h> /* assert; ... */
/* DEFINE */
/* Definir o macro customizado */
#define posicao_t size_t/* se é posiçăo só pode ser năo negativo */
#define decimal_t signed int/* tipo padrăo inteiro com sinal */
#define POSICAO_INVALIDA exp/* etiqueta de exception */
#define BASE_NEGATIVA (0 <= numero)/* etiqueta de exception */
/* ------------------------------------------------ DIGITO_NA_POSICAO ------
Funçăo DIGITO_NA_POSICAO
PROPÓSITO: Identificar o dígito na referida posiçăo no conjuto de
dígitos da variável inteira, assumido que essa variável pode
ser tanto com sinal positivo.
PARÃMETROS:
posicao_t indice (IN) -- a variável da posiçăo a ser identificada,
índice, dígito deverá ser identificado
decimal_t numero (IN) -- é a base que contém todos os dígitos
RETORNA: Sem bem sucedido o dígito identificado na posiçăo da base
ERROS: Solicitar identificaçăo de índice maior que capacidade da
base também caso o número da base tenha sinal negativo.
ALGORITMO: Sistema décimal; base 10. Tem cada casa na sequência como
produto da potência de 10. O expoente da potência é a posição da
unidade a partir do 0; da direita para esquerda. Exemplo:
[!]O símbolo ( ^ ) representa operação de potência
Base ^ Expoente * Escalares = Casa Decimal.
Valor = Soma de todas as Casa Decimais
Base = 10
Se Valor = 2018 Então
3 2 1 0 = Expoentes
2 0 1 8 = Escalares
8 * (10 ^ 0 = 1) = 8
1 * (10 ^ 1 = 10) = 10
0 * (10 ^ 2 = 100) = 000
2 * (10 ^ 3 = 1000) = 2000
----+
2018
Observe que o enunciado do problema é logicamente inverso
as casas decimais, porque para a questão o índice mais
significativo é o menor índice 0. Que na ordem natural dos
números decimais é o menos significativo.
_Estapas do Processo_
INICIO
1# Step/> Obter cópia de :numero e verificar se é positivo
2# Step/> Determinar o expoente ou Base mais significativa
3# Step/> Obter um cópia de :numero e percorrer o :indice até
3.1# Step/> a cada interação na etapa #3 o valor :numero perde
seu dígito mais significativo para isso se atribui a
própria variável :numero o seu módulo( resto de divisão )
ao mesmo tempo que reduz o expoente na variável :exp ao
dividi-se por 10.
3.2# Step/> Se a variável :exp for igual a 0 então significa
que o valor na variável índice é maior que o valor do
expoente mais significativo, portanto, erro de usa da função
será chamado.
4# Step/> Se :indice for igual a 0 seguramente :valor e :exp são
divisor e módulo, respectivamente correspondentes ao :indice
FINAL
Resolve.
------------------------------------------------------------------------- */
decimal_t digito_na_posicao_( posicao_t indice, decimal_t numero ){
/* VARIÁVEIS */
register decimal_t valor;/* copia de decimal_t :numero */
register posicao_t exp;/* potencia do dígito mais significativo em
:numero */
assert( BASE_NEGATIVA );
exp = 1;
valor = numero;
while( valor /= 10 ){
exp *= 10; }
valor = numero;
while( indice-- ){
valor %= exp;
exp /= 10;
assert( POSICAO_INVALIDA ); }
return( valor / exp ); }
/* ------------------------------------------------------------- MAIN ------ */
int main( void ){
/* VARIÁVEIS */
posicao_t indice;/* índice do valor a ser identificado */
decimal_t numero;/* base / conjunto de elementos de valor */
puts(":::::: FUNCAO DIGITO NA POSICAO\n" );
printf( "[ << ] Entre com numero: " );
scanf( "%d", &numero );
printf( "[ << ] Entre com indice: " );
scanf( "%d", &indice );
printf( "[ >> ] O digito %d foi identificado!\n",
digito_na_posicao_( indice, numero ));
printf( "[ Ok ] Fim da funcao.\n");
return 0; }