Jump to content
Fórum Script Brasil
  • 0

validar um cpf de acordo com o bv


wllington duarte
 Share

Question

gente eu tenho um trabalho para fazer que divide se em 2 parte eu já fiz boa parte do trabalho mas eu não consigo termina -lo e ele é para amanha e vale metade da nota por favor me ajudem

Primeira metade: Deve ser criado um algoritmo que leia um CPF e armazene em uma variável do tipo cadeia. Em seguida, um teste deve ser feito para verificar se o que foi lido é um CPF em formato válido. Os formatos válidos são:  Três números, um ponto, três números, um ponto, três números, um traço, dois números (xxx.xxx.xxx-xx);  Apenas números. Sendo assim, um CPF 111.222.333-45 está no formato válido, assim como 11122233345 também está. Segunda metade: Após o teste do formato, deverá ser verificado se o CPF lido é de fato um CPF válido ou não. Para isso, o algoritmo de verificação especificado na página seguinte deverá ser implementado. A resposta final do algoritmo deve ser: i. Que o CPF está no formato correto e também é válido de acordo com o DV. ii. Que o CPF está no formato correto, mas é inválido de acordo com o DV. iii. Que o CPF não está no formato correto.

Método de Validação

No CPF (primeiros 9 digitos), o primeiro DV (penúltimo digito) é obtido através do somatório da multiplicação de cada digito do CPF por respectivamente 9, 8, 7, 6, 5, 4, 3, 2, 1 a partir da unidade. Do resultado desta soma é obtido o resto da divisão por 11 e este será o primeiro DV. Caso o resto seja 10, o DV será 0. Por exemplo, no CPF 111.222.333-__, o primeiro DV será calculado da seguinte forma: 1 1 1 2 2 2 3 3 3 (CPF) x x x x x x x x x 1 2 3 4 5 6 7 8 9 (Multiplicadores) 1 +2 +3 +8 +10+12+21+24+27 = 108 (Somatório das multiplicações) 108/11 = 9 com resto 9 (Divisão por 11) Sendo assim, 9 (resto da divisão) é o primeiro DV. Portanto, já fica claro que o CPF 111.222.333-45 é INVÁLIDO, pois o primeiro DV informado foi 4, e através do cálculo vimos que deveria ser 9. O segundo DV (último digito) é calculado de maneira similar. É feito o somatório da multiplicação de cada digito do CPF mais o primeiro DV (obtido anteriormente) por respectivamente 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 a partir da unidade. Do resultado também é pego o resto da divisão por 11. Por exemplo, no CPF 111.222.333-9_, o segundo DV será calculado da seguinte forma: 1 1 1 2 2 2 3 3 3 9 (CPF + primeiro DV) x x x x x x x x x x 0 1 2 3 4 5 6 7 8 9 (Multiplicadores) 0 +1 +2 +6 +8 +10+18+21+24+81 = 171 (Somatório das multiplicações) 171/11 = 15 com resto 6 (Divisão por 11) Sendo assim, 6 é o segundo DV. Por isso, a única forma do CPF 111.222.333 ser válido é se os dois dígitos DV forem 96. O CPF informado é inválido, já que os DVs informados foram 45.

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main (){
    
    setlocale(LC_ALL, "");
    char cpf[15];
    int v1, v2, dv1, dv2, temp1, temp2;
    int tam=0;
    int i, x;
    printf("%s, digite seu cpf: ");
    fflush(stdin);
    scanf("%s", &cpf);

    for(i = 0; i< 15; i++){
        if(cpf == '\0'){
            tam = i;
        }    
    }
    if(tam == 11){
        printf("CPF está no formato correto");
        v1 = cpf[9];
        v2 = cpf[10];
            temp1 = (cpf[0] * 1) + (cpf[1] * 2 ) + (cpf[2] * 3) + (cpf[3] * 4) + (cpf[4] * 5) + (cpf[5] * 6) + (cpf[6] * 7) + (cpf[7] * 8) + (cpf[8] * 9);
            dv1 = temp1 % 11;
        if (dv1 == 0){
            dv1= 0;
        }
            cpf[9] = '\0';
            cpf[9] = dv1;    
        
            temp1 = (cpf[0] * 0) + (cpf[1] * 1) + (cpf[2] * 2) + (cpf[3] * 3) + (cpf[4] * 4) + (cpf[5] * 5) + (cpf[6] * 6) + (cpf[7] * 7) + (cpf[8] * 8) + (cpf[9] * 9);
            dv2 = temp2 % 11;        
            if(v1 == cpf[9] && v2 == cpf[10]){
        }
        else{
            printf("CPF NÃO está de acordo com os DV's");
        }
    }
    else if(tam == 14){
        if(cpf[3] == '.' && cpf[7] == '.' && cpf[11] == '-'){
            cpf[3] = '\0';
            cpf[7] = '\0';
            cpf[11] = '\0';
            
            cpf[3] = cpf[4];    
            cpf[4] = cpf[5];
            cpf[5] = cpf[6];
            cpf[6] = cpf[7];
            cpf[8] = cpf[9];
            cpf[9] = cpf[10];
            cpf[11] = cpf[12];
        } 
        for(x = 0; x < 15; x++){
            if(cpf[x] == 0 || cpf[x] == 1 || cpf[x] == 2 || cpf[x] == 3 || cpf[x] == 4 || cpf[x] == 5 || cpf[x] == 6 || cpf[x] == 7 || cpf[x] == 8 || cpf[x] == 9){
                temp1 = (cpf[0] * 1) + (cpf[1] * 2 ) + (cpf[2] * 3) + (cpf[3] * 4) + (cpf[4] * 5) + (cpf[5] * 6) + (cpf[6] * 7) + (cpf[7] * 8) + (cpf[8] * 9);
                dv1 = temp1 % 11;
                if (dv1 == 0){
                dv1= 0;
                }
                cpf[9] = '\0';
                cpf[9] = dv1;    
            
                temp1 = (cpf[0] * 0) + (cpf[1] * 1) + (cpf[2] * 2) + (cpf[3] * 3) + (cpf[4] * 4) + (cpf[5] * 5) + (cpf[6] * 6) + (cpf[7] * 7) + (cpf[8] * 8) + (cpf[9] * 9);
                dv2 = temp2 % 11;
                
                cpf[10] = '\0';
                cpf[10] = dv2;    
                
                if (dv2 == 0){
                    dv2= 0;}
                }        
                if(v1 == cpf[9] && v2 == cpf[10]){
                    printf("CPF está de acordo com os DV's");
                }
                else{
                    printf("CPF NÃO está de acordo com os DV's");
                }        
         }
        }
    }

Link to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 0
#include <stdio.h>
#include <string.h>
#include <locale.h>

char* cpfClean( char cpf[15] ){
    int z, i;
    printf("\n\nProcesso de Limpesa de simbolos de pontuaçoes ");
    if(cpf[3]=='.' && cpf[7]=='.' && cpf[11]=='-' ){
        for ( i = ; i < 15; i++ ) {
            if( cpf[i] == '.' || cpf[i] == '-' ){
                for ( z=i; cpf[z] != '\0'; z++ ) {
                    cpf[z] = cpf[z+1];
                }
            }
        }
        
        printf("concluido satisfatoriamente: \n%s\n\n", cpf);
    }else{
        printf("pulado.\n\n");
    }   
    return (char*)cpf;
}
int validaCPF ( const int * const );

int main ( void ) {
    setlocale(LC_ALL, "portuguese");
    
    int cpf[11];
    //char input[15] = "52998224725";
    //char input[15] = "529.982.247-25";
    char input[15] = {};
    
    printf("Digite o número do CPF. Exemplo: \"529.982.247-25\" ou \"52998224725\":\n");
    scanf("%14[^\n]%*c", input ); //Exemplo: "529.982.247-25" ou "52998224725"    
 
    //Retirando caracteres que não sejam numeros
    strcpy( input, cpfClean(input));
    
    //comprovando si todos os caracteres são numeros
    for ( char i = ; i < 11; i++ ) {
        cpf[(int)i] = (int) input[(int)i] - 48;
        
        if ( cpf[(int)i] <  || cpf[(int)i] > 9 ) { //Validando a entrada de dados
            printf("ENTRADA INVÁLIDA\n");
            return 1;
        }
    }
    printf("\nO CPF digitado foi: \n");
    
    for ( char i = ; i < 11; i++ ) {
        printf("%d", cpf[(int)i]);
        if ( i == 2 || i == 5 )
            printf(".");
        if ( i == 8 )
            printf("-");
    }
    
    printf("\n\n");
    
    if ( validaCPF (cpf)==1 )
        printf("O CPF digitado É válido =)\n");
        
    else
        printf("O CPF digitado NÃO É VÁLIDO =(\n");
        
    return ;
}

//funçao que valida CPF
int validaCPF ( const int * const cpf ) {
    int digito1,
        digito2,
        temp = ;
        
    for ( char i = ; i < 9; i++ )
        temp += ( cpf[(int)i] * ( 10 - i ) );
        
    temp %= 11;
    
    if ( temp < 2 )
        digito1 = ;
    else
        digito1 = 11 - temp;
        
    temp = ;
    
    for ( char i = ; i < 10; i++ )
        temp += ( cpf[(int)i] * ( 11 - i ) );
        
    temp %= 11;
    
    if ( temp < 2 )
        digito2 = ;
    else
        digito2 = 11 - temp;
        
    if ( digito1 == cpf[9] && digito2 == cpf[10] )
        return 1;
    else
        return ;
}

Esse fiz faz algum tempo, compare ele com o seu e veja se te serve, comentei ele um pouco, porem não completamente, acho que as partes omitidas são claras, si tiver duvida pergunte.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.8k
    • Total Posts
      646.6k
×
×
  • Create New...