Ir para conteúdo
Fórum Script Brasil
  • 0

validar um cpf de acordo com o bv


wllington duarte

Pergunta

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 para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...