Top Sertanejo

terça-feira, 29 de novembro de 2011

Validação de CPF em C usando vetor


A validação de CPF na linguagem C e uma dúvida bastante comum por parte dos iniciantes, neste artigo irei explicar passo a passo como ela e feita, e no final segue um código fonte para que possam estuda-lo e aprenderem.
O CPF tem obrigatoriamente 11 dígitos, então ele não deverá ter nem mais nem menos do que onze caracteres. O primeiro digito do cpf e resultado de uma aritmética bastante simples. Vamos pega o CPF 123456789-09 como exemplo.
Multiplicarem o primeiro digito por 10, o segundo por 9, o terceiro por 8 o quarto por 7, quinto por 6, sexto por 5, sétimo por 4, oitavo por 3 e nono por 2. Da mesma forma abaixo.

Após efetuamos as multiplicações somamos os resultados, neste caso obtemos: 210, calculamos o mod(o resto) da soma.
  • Caso o resultado seja igual a 1 ou 0, o primeiro digito verificador sera 0.
  • Caso o resultado contrário efetuamos a subtração, 11 – resultado. O resultado dessa subtração nos trara o digito validador.
Obtemos o primeiro digito validador :) agora vamos ao segundo digito, o processo e basicamente o mesmo!
Fazemos a mesma aritmética só que ao invés de começamos com 10 a aritmética, começamos com 11 e terminamos no 3.

Obteremos o resultado: 255, calculamos o mod de 255 por 11.
  • Caso o resultado seja igual a 1 ou 0, o primeiro digito verificador sera 0.
  • Caso o resultado contrário efetuamos a subtração, 11 – resultado, o resultado dessa subtração nos trara o digito validador.
Segue abaixo um código fonte da validação.
  1. //VALIDADOR CPF.  
  2.   
  3. #include <stdio.h>  
  4.   
  5. int main()  
  6. {  
  7. char cpf[12];  
  8. int icpf[12];  
  9. int i,somador=0,digito1,result1,result2,digito2,valor;  
  10.   
  11. printf("Digite o cpf: ");  
  12. scanf(" %s",cpf);  
  13.   
  14. //Efetua a conversao de array de char para um array de int.  
  15. for(i=0;i<11;i++)  
  16. {  
  17. icpf[i]=cpf[i]-48;  
  18. }  
  19.   
  20. //PRIMEIRO DIGITO.  
  21.   
  22. for(i=0;i<9;i++)  
  23. {  
  24. somador+=icpf[i]*(10-i);  
  25. }  
  26.   
  27. result1=somador%11;  
  28.   
  29. if( (result1==0) || (result1==1) )  
  30. {  
  31. digito1=0;  
  32. }  
  33.   
  34. else  
  35. {  
  36. digito1 = 11-result1;  
  37. }  
  38.   
  39. //SEGUNDO DIGITO.  
  40.   
  41. somador=0;  
  42.   
  43. for(i=0;i<10;i++)  
  44. {  
  45. somador+=icpf[i]*(11-i);  
  46. }  
  47.   
  48. valor=(somador/11)*11;  
  49. result2=somador-valor;  
  50.   
  51. if( (result2==0) || (result2==1) )  
  52. {  
  53. digito2=0;  
  54. }  
  55.   
  56. else  
  57. {  
  58. digito2=11-result2;  
  59. }  
  60.   
  61. //RESULTADOS DA VALIDACAO.  
  62.   
  63. if((digito1==icpf[9]) && (digito2==icpf[10]))  
  64. {  
  65. printf("\nCPF VALIDADO.\n");  
  66. }  
  67. else  
  68. {  
  69. printf("Problema com os digitos.\n");  
  70. }  
  71. return 0;  
  72. }  

6 comentários:

  1. Faça um programa C que leia a parte do CPF e gere os digitos do mesmo.
    A descrição é a mesma o numero é 111.444.777 . Ai tem que multiplicar cada digito por numeros a partir do 10 até o 2, isso para o primeiro digito. Se essa soma dividida por 11 {utilizando o resto} for < 2 entao o digito 10 é zero.

    #include
    #include
    #include

    int main ( )
    {
    int CPF , x1 , x2 , x3 , x4 , x5 , x6 , x7 , x8 , x9 , x10 , x11 , D1 , D2 ;
    printf("\n dar valor CPF \n" ) ;
    scanf("%d" , &CPF ) ;
    x1 = CPF / 100000000 ;
    x2 = ( CPF / 10000000 ) % 10 ;
    x3 = ( CPF / 1000000 ) % 10 ;
    x4 = ( CPF / 100000 ) % 10 ;
    x5 = ( CPF / 10000 ) % 10 ;
    x6 = ( CPF / 1000 ) % 10 ;
    x7 = ( CPF / 100 ) % 10 ;
    x8 = ( CPF / 10 ) % 10 ;
    x9 = CPF % 10 ;

    D1 = ( ( x1 * 10 + x2 * 9 + x3 * 8 + x4 * 7 + x5 * 6 + x6 * 5 + x7 * 4 + x8 * 3 + x9 * 2 ) % 11 ) ;

    if ( D1 < 2 )
    {
    printf ( "\n x10 == 0 \n" ) ;
    }
    else
    {
    x10 = 11 - D1 ;
    } ;
    D2 = ( ( x1 * 11 + x2 * 10 + x3 * 9 + x4 * 8 + x5 * 7 + x6 * 6 + x7 * 5 + x8 * 4 + x9 * 3 + x10 * 2 ) % 11 ) ;

    if ( D2 < 2 )
    {
    x11 = 0 ;
    }
    else
    {
    x11 = 11 - D2 ;
    } ;
    system ("pause") ;
    return 0 ;
    }

    corrige por favor ?

    Sou pessima nessa materia :/

    ResponderExcluir
  2. #include
    #include

    int main ( )
    {
    int CPF , x1 , x2 , x3 , x4 , x5 , x6 , x7 , x8 , x9 , x10 , x11 , D1 , D2 ;
    printf("\n digite o CPF: " ) ;
    scanf("%d" , &CPF );
    x1 = CPF /100000000;
    x2 = (CPF/10000000)%10;
    x3 = (CPF/1000000)%10;
    x4 = (CPF/100000)%10;
    x5 = (CPF/10000)%10;
    x6 = (CPF/1000)%10;
    x7 = (CPF/100)%10;
    x8 = (CPF/10)%10;
    x9 = CPF %10;
    D1 = ((x1*10)+(x2*9)+(x3*8)+(x4*7)+(x5*6)+(x6*5)+(x7*4)+(x8*3)+(x9*2))%11;
    D2 = ((x1*11)+(x2*10)+(x3*9)+(x4*8)+(x5*7)+(x6*6)+(x7*5)+(x8*4)+(x9*3)+(D1*2))%11;
    if(D2<2)
    D2=0;
    else
    D2=11-D2;
    printf("x1: %d\n",x1);
    printf("x2: %d\n",x2);
    printf("x3: %d\n",x3);
    printf("x4: %d\n",x4);
    printf("x5: %d\n",x5);
    printf("x6: %d\n",x6);
    printf("x7: %d\n",x7);
    printf("x8: %d\n",x8);
    printf("x9: %d\n",x9);
    printf("D1: %d\n",D1);
    printf("D2: %d\n",D2);

    getch();
    }

    ResponderExcluir
  3. Por que você colocou -48 dentro do for na converção de arrays? -->
    //Efetua a conversao de array de char para um array de int.
    for(i=0;i<11;i++)
    {
    icpf[i]=cpf[i]-48; <-- Aqui oh
    }

    ResponderExcluir
  4. eu compilei esse código na minha máquina mas todos os cpfs que digitei disse que era válido, inclusive o numero "0000000000", nao sei o porque, estou um pouco confusa

    ResponderExcluir
    Respostas
    1. precisa de colocar varios if's para invalidar numeros iguais

      Excluir