Ir ao conteúdo
  • Cadastre-se

C Porque esse programa de verificação de CPF está dando erro


Amanda Kellen

Posts recomendados

Tenho que criar um programa que faz a leitura de um cpf e verifica se é válido ou não,ele deve ser da forma que está abaixo,porém mesmo quando é digitado um cpf válido ele mostra que este cpf é inválido.Qual o erro do programa?

#include <stdio.h>
#include <string.h>

void leitura (char *);
int verificaCPF (char *);
void imprime (char *);

int main()
{
    char CPF[12];
    leitura(CPF);
    imprime(CPF);
    return 0;
}

void leitura(char *x)
{

    int ver;

    printf("Digite o numero de CPF (Obs: Somnente numeros): ");
    gets(x);

    ver=verificaCPF (x);
    while(ver!=1)
    {
    printf("CPF invalido. Digite novamente o numero de CPF (Obs: Somnente numeros): ");
    gets(x);
    ver=verificaCPF(x);
    }
}

int verificaCPF (char *y)
{
    int soma, i, ver;

    for(i=2;i<11;i++)
    {
        soma+=i*(y[10-i]-48);

    }


    if(soma%11==0 || soma%11==1)
    {
       ver=0;

    }else
    {
        ver=11-soma%11;
    }

    if(ver!=y[10]-48)
    {
      return -1;
    }else
    {
       for(i=2;i<12;i++)
    {
        soma+=i*(y[11-i]-48);

    }

    if(soma%11==0 || soma%11==1)
    {
       ver=0;

    }else
    {
        ver=11-soma%11;
    }

    if(ver!=y[11]-48)
    {
      return -1;

    }else
    {
        return 1;
    }


}
}

void imprime(char *z)
{
    int i;
    printf("CPF valido: ");

    for(i=0;i<3;i++)
    {
        printf("%c",z[i]);
    }

    printf(".");

    for(i=3;i<6;i++)
    {
        printf("%c",z[i]);
    }

    printf(".");

       for(i=6;i<9;i++)
    {
        printf("%c",z[i]);
    }

    printf("-");

    for(i=9;i<11;i++)
    {
        printf("%c",z[i]);
    }

}

 

Link para o comentário
Compartilhar em outros sites

2 erros que achei:

-Você não está zerando a variável soma.

-Os digitos verificadores estão nas posições 9 e 10, você usou 10 e 11.

 

int verificaCPF (char *y)
{
    int soma, i, ver;

    soma = 0;
    for(i=2; i<11; i++)
        soma+=i*(y[10-i]-48);
    if(soma%11==0 || soma%11==1)
        ver=0;
    else
        ver=11-soma%11;

    if(ver!=y[9]-48)
        return -1;
    else {
            soma = 0;
        for(i=2; i<12; i++)
            soma+=i*(y[11-i]-48);
        if(soma%11==0 || soma%11==1)
            ver=0;
        else
            ver=11-soma%11;

        if(ver!=y[10]-48)
            return -1;
        return 1;
    }
}

O código é o seu, só dei uma alteradinha para eu entender melhor com a identação correta.

Com o meu CPF funcionou, agora teria que testar com outros para ver se está certo.

 

 

Também fiz um seguindo a lógica desse site http://www.somatematica.com.br/faq/cpf.php

e ficou assim

int verificaCPF(char *y)
{
    int j, k, i;

    for(j = 0, i = 0; i < 9; i++)
        j += (y[i] - 48) * (10 - i);
    j %= 11;
    if(j == 0 || j == 1)
        j = 0;
    else
        j = 11 - j;

    for(k = 0, i = 0; i < 8; i++)
        k += (y[i] - 48) * (11 - i);
    k %= 11;
    if(k == 0 || k == 1)
        k = 0;
    else
        k = 11 - k;

    if(y[9] - 48 != j || y[10] - 48 != k)
        return -1;
    return 1;
}

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Quando uma variável é declarada no código (como "int soma;" por exemplo), o que o programa faz é reservar um espaço da memória do computador para armazenar os valores que forem atribuídos a esta variável posteriormente no programa.

 

Mas observe que esse espaço de memória provavelmente foi usado anteriormente por outros programas no seu computador, e após ser encerrado a memória foi liberada, podendo então ser usada pelo seu programa, mas nesse espaço de memória deve haver algum valor que foi deixado pelo programa anterior e agora é apenas lixo.

 

Então se a variável soma não for inicializada com valor 0 seu programa somará valores a esse valor lixo que já está lá nesse espaço de memória, logo muito provavelmente gerará um resultado errado.

Link para o comentário
Compartilhar em outros sites

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!