Validar CPF em C++ (esse funciona)

Publicado por Fernando (última atualização em 02/03/2018)

[ Hits: 42.378 ]

Homepage: https://github.com/phoemur/

Download 5751.validacpf.cpp

Download validacpf1.cxx (versão 2)




Mais um algoritmo para validação de CPF, de acordo com as regras da Receita Federal, em C++.
Basicamente ele cria o dígito verificador e compara com o fornecido.
Detalhes nos comentários.

  



Versões atualizadas deste script

Versão 2 - Enviado por César em 01/02/2018

Changelog: Eu baixei o seu codigo e modifiquei de forma a ficar dentro de uma classe para ter uma função de input e um get
só nao consegui fazer com que mostrasse com os separadores.

Download validacpf1.cxx


Esconder código-fonte

/* Programinha em C++ que checa se um número de CPF é válido
validacpf.cpp - abr/2013 - Fernando Bolonhezi Giannasi
Modificação do Script Referência: http://leowgweb.wordpress.com/2012/05/06/algoritmo-de-validacao-de-cpf */

#include <iostream>
using namespace std;

bool validaCPF(const int * const); //protótipo da função que checa o CPF, retorna true ou false

int main(void)
{
    int cpf[11];
    char input[12];

    cout << "Digite o número do CPF sem pontos, espaços ou traços:" << endl;
    cin.getline(input, 12, '\n');

    for(char i = 0; i < 11; i++)
    {
        cpf[i] = static_cast<int>(input[i] - 48); //Convertendo char para valor absoluto segundo tabela ASCII e passando para array de inteiros//

        if(cpf[i] < 0 || cpf[i] > 9){ //Validando a entrada de dados
            cout << "ENTRADA INVÁLIDA" << endl;
            return 1;}
    }

    cout << "\nO CPF digitado foi: " << endl;
    for(char i = 0; i < 11; i++)
    {
        cout << cpf[i];
        if(i == 2 || i == 5)
            cout << ".";
        if(i == 8)
            cout << "-";
    }

    cout << "\n\n";

    if(validaCPF(cpf) == true)
        cout << "O CPF digitado É válido" << endl;

    else
        cout << "O CPF digitado NÃO É VÁLIDO" << endl;

    return 0;
}

inline bool validaCPF(const int * const cpf)
{
    int digito1,
        digito2,
        temp = 0;

    /*Obtendo o primeiro digito verificador:

    Os 9 primeiros algarismos são multiplicados pela sequência 10, 9, 8, 7, 6, 5, 4, 3, 2
    (o primeiro por 10, o segundo por 9, e assim por diante);
    Em seguida, calcula-se o resto “r1″ da divisão da soma dos resultados das multiplicações por 11,
    e se o resto for zero ou 1, digito é zero, caso contrário digito = (11-r1) */
    
    for(char i = 0; i < 9; i++)
        temp += (cpf[i] * (10 - i));

    temp %= 11;

    if(temp < 2)
        digito1 = 0;
    else
        digito1 = 11 - temp;

    /*Obtendo o segundo digito verificador:

    O dígito2 é calculado pela mesma regra, porém inclui-se o primeiro digito verificador ao final
    da sequencia. Os 10 primeiros algarismos são multiplicados pela sequencia 11, 10, 9, ... etc...
    (o primeiro por 11, o segundo por 10, e assim por diante);
    procedendo da mesma maneira do primeiro digito*/

    temp = 0;
    for(char i = 0; i < 10; i++)
        temp += (cpf[i] * (11 - i));

    temp %= 11;

    if(temp < 2)
        digito2 = 0;
    else
        digito2 = 11 - temp;

    /* Se os digitos verificadores obtidos forem iguais aos informados pelo usuário,
       então o CPF é válido */

    if(digito1 == cpf[9] && digito2 == cpf[10])
        return true;
    else
        return false;
}

Scripts recomendados

Media de N numeros

Árvore binária

Multipla escolha

[C] Decompositor de números em fatores primos

A - Comando strdup


  

Comentários
[1] Comentário enviado por maurixnovatrento em 10/05/2020 - 22:37h


Legal vou ver como funciona isso. Eu não sabia que dava para postar atualizações de scripts de outros autores. Talvez eu melhore isso. Mas só se eu tiver tempo. Eu acredito que consigo colocar os separadores.

___________________________________
Conhecimento não se Leva para o Túmulo.

[2] Comentário enviado por vinniesilva em 26/10/2020 - 19:21h

#include <iostream>
#include <algorithm>
using namespace std;

bool valid(string);
char getDigit(string);
int quoc(int);
void split(string& data);

int main(int argc, char const *argv[])
{
string cpf = "";
bool next = true;
while (next)
{
cout << "Insert the cpf: ";
cin >> cpf;
string result = valid(cpf) ? "Valid":"Invalid";
cout << "The cpf " << cpf
<< " is " << result << endl
<< "[0] exit [1] continuie \n >>";
cin >> next;
}
return 0;
}

void split(string& data)
{
string str = "";
for (auto i: data)
{
if (isdigit(i)) str += i;
}
data = str;
}

int quoc(int sum)
{
sum %= 11;
return (sum < 2) ? 0: 11-sum;
}

int mult(char n1,int n2)
{
return (n1-'0') * n2;
}

char getDigit(string data)
{
reverse(data.begin(),data.end());
int sum = 0, count = 2;
for (auto i: data)
{
sum += mult(i,count);
count++;
}
sum = quoc(sum) + '0';
return sum;
}

bool valid(string data)
{
split(data);
if (data.length() != 11)
{
return false;
}

int checkDigits = stoi(data.substr(9,2));
string str = data.substr(0,9);
str += getDigit(str);
str += getDigit(str);
int result = stoi(str.substr(9,2));
return checkDigits == result;
}

[3] Comentário enviado por maurixnovatrento em 26/10/2020 - 23:31h


Opa. Bacana.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts