Ir ao conteúdo

Posts recomendados

Postado

Olá boa tarde!

 

Gostaria de uma ajuda no código abaixo! É um verificador dos dígitos do CPF, o programa esta funcionando com números de 11 dígitos, mas ao informar números com mais dígitos ou com dígitos sequencias (444444444444, 66666666666) ele informa que o código é válido. Alguém que conheça a lógica de verificação do CPF, pode me indicar o que deve implementar para inibir este erro!

 

#include <stdio.h>

int main()
{
    char cpf[12];
    int icpf[12];
    int i,somador=0,digito1,result1,result2,digito2,valor;
    
    printf("Digite o CPF: ");
    scanf(" %s",cpf);

    for(i=0; i<11; i++)
    {
        icpf[i]=cpf[i]-48;
    }

    for(i=0; i<9; i++)
    {
        somador+=icpf[i]*(10-i);
    }

    result1=somador%11;

    if( (result1==0) || (result1==1) )
    {
        digito1=0;
    }

    else
    {
        digito1 = 11-result1;
    }

    somador=0;

    for(i=0; i<10; i++)
    {
        somador+=icpf[i]*(11-i);
    }

    valor=(somador/11)*11;
    result2=somador-valor;

    if( (result2==0) || (result2==1) )
    {
        digito2=0;
    }

    else
    {
        digito2=11-result2;
    }

    if((digito1==icpf[9]) && (digito2==icpf[10]))
    {
        printf("\nEste CPF e valido!.\n");
    }
    else
    {
        printf("CPF Invalido e/ou problemas com os digitos.\n");
    }
    return 0;
}

 

Postado

@userpc_2020

6 horas atrás, userpc_2020 disse:

o programa esta funcionando com números de 11 dígitos, mas ao informar números com mais dígitos ou com dígitos sequencias (444444444444, 66666666666) ele informa que o código é válido.

Vá em uma calculadora de dígito verificador. Para o CPF 444.444.444, o DV é 44, e para o CPF 666.666.666 o DV é 66, então, se seu programa diz que o CPF é válido quando se insere 444444444444 e 666666666666, não está totalmente errado... Se você quer verificar um CPF, saiba que ele tem 11 dígitos, nenhum a mais, para isso, use %11s ao invés de %s para pedir o CPF. Se forem digitados mais do que 11 dígitos, ele pega só os 11 primeiros, mas saiba que o certo é imprimir uma mensagem de erro pedindo para digitar o CPF novamente, pois o usuário poderia ter errado ao digitá-lo.

Você não comentou nada em seu programa, se coloque em meu lugar, de tentar entender o programa de alguém do 0, e ainda mais se houver algum erro, é bem chato.

Não sei a lógica que você usou para o segundo dígito, mas deveria ser idêntica à lógica para o primeiro, exceto que a constante que vai multiplicar os dígitos do CPF começa no número 11 ao invés do 10, e no final soma-se digito1*2.

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

int main()
{
    setlocale (LC_ALL, "Portuguese");
    char cpf[12];
    int icpf[12];
    int i,somador=0,digito1,result1,result2,digito2,valor;
    
    printf("Digite o CPF: ");
    scanf("%11s", cpf);

    /*Primeiro dígito verificador*/
    for(i=0; i<11; i++) {
        //Converter char para int
        icpf[i]=cpf[i]-48;
    }

    for (i=0; i<9; i++){
        //Multiplicar CPF pelas constantes do primeiro dígito
        somador+= icpf[i]*(10-i);
    }
    result1= somador%11;

    //Obter primeiro dígito
    if(result1 <= 1) {
        digito1=0;
    } else {
        digito1 = 11-result1;
    }
    
    /*Segundo dígito verificador*/
    somador=0;
    for (i=0; i<9; i++){
        //Multiplicar CPF pelas constantes do segundo dígito
        somador+= icpf[i]*(11-i);
    }
    somador += digito1*2;

    result2= somador%11;
    
    //Obter segundo dígito
    if(result2 <= 1) {
        digito2=0;
    } else {
        digito2= 11-result2;
    }

    //Verificar CPF válido
    if((digito1==icpf[9]) && (digito2==icpf[10]))
    {
        printf("\nEste CPF é válido!\n");
    }
    else
    {
        printf("CPF Inválido e/ou problemas com os digitos.\n");
    }
    return 0;
}

 

  • Curtir 2

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!