22.10.2014 Views

Aprendendo a Programar Programando em Linguagem C - FSM

Aprendendo a Programar Programando em Linguagem C - FSM

Aprendendo a Programar Programando em Linguagem C - FSM

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

i = i + 1;<br />

}<br />

}<br />

8. A questão a seguir é b<strong>em</strong> interessante. Trata-se de um programa que determine o dígito verificador<br />

de um número de uma conta corrente, de um número de matrícula de um estudante de uma escola, etc. O<br />

dígito verificador serve para a prevenção de possíveis erros de digitação. Por ex<strong>em</strong>plo, se a matrícula 30245-<br />

7 fosse digitada erroneamente como 39245-7, o erro seria detectado, pois o dígito verificador da conta 39245<br />

seria 6 e não 7. Exist<strong>em</strong> vários métodos para a determinação do dígito verificador. Um deles é dado pelo<br />

seguinte algoritmo:<br />

1. Multiplica-se os números correspondentes aos dígitos da conta, da direita para esquerda,<br />

por 2, por 3, etc..<br />

2. Soma-se os produtos obtidos no it<strong>em</strong> 1.<br />

3. Determina-se o resto da divisão da soma obtida no it<strong>em</strong> 2 por 11.<br />

4. Subtrai-se de 11 o resto obtido no it<strong>em</strong> 3<br />

5. Se o valor obtido no it<strong>em</strong> 4 for 10 ou 11 o dígito verificado é igual a zero; senão, o dígito é o valor<br />

obtido no it<strong>em</strong> referido.<br />

Por ex<strong>em</strong>plo, se o número da conta for 30245, t<strong>em</strong>os<br />

1. 5x2 = 10, 4x3 = 12, 2x4 = 8, 0x5 = 0, 3x6 = 18<br />

2. 10 + 12 + 8 + 0 + 18 = 48<br />

3. Resto(48, 11) = 4<br />

4. 11 - 4 = 7<br />

5. Dígito verificador = 7.<br />

A função abaixo impl<strong>em</strong>enta este algoritmo. Observe que foi utilizado molde para converter caracteres<br />

<strong>em</strong> inteiros e vice-versa.<br />

int ArmazenaDigitos(char *s, int *v)<br />

{<br />

int i, Comp;<br />

Comp = strlen(s);<br />

for (i = 0; i < Comp; i = i + 1)<br />

v[i] = (int) (s[i] - '0');<br />

return(i);<br />

}<br />

char CalculaDigito(char *s)<br />

{<br />

char c;<br />

int t, i, j, Digito, *v;<br />

t = ArmazenaDigitos(s, v);<br />

Digito = 0;<br />

j = 2;<br />

for (i = t - 1; i >= 0; i = i - 1, j = j + 1)<br />

Digito = Digito + v[i]*j;<br />

Digito = Digito % 11;<br />

Digito = 11 - Digito;<br />

if ((Digito == 10) || (Digito == 11))<br />

Digito = 0;<br />

c = (char) Digito + '0';<br />

return (c);<br />

}<br />

8.4 Exercícios propostos<br />

1. Uma palavra é palíndroma se ela não se altera quando lida da direita para esquerda. Por ex<strong>em</strong>plo,

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!