Dígito verificador ou algarismo de controle é um mecanismo de autenticação utilizado para verificar a validade e a autenticidade de um valor numérico, evitando dessa forma fraudes, erros de transmissão ou erros de digitação. Dígitos verificadores são um ou mais algarismos acrescentados ao valor original e calculados a partir deste através de um determinado algoritmo. Números de documentos de identificação, de matrícula, cartões de crédito e quaisquer outros códigos numéricos que necessitem de maior segurança utilizam dígitos verificadores. Essa prática consiste em calcular o dígito verificador do CPF. Dado um CPF como um número, sem os dois últimos dígitos verificadores, seu programa deve imprimir o CPF com os dígitos verificadores. Você pode usar o seu CPF e de parentes e colegas para testar o programa. A seguir, as regras para o cálculo do dígito verificador são definidas através de um exemplo. É utilizado como exemplo o número: 123456789.
Calcule a soma dos produtos dos nove dígitos utilizando peso 2 para unidade, peso 3 para dezena, peso 4 para centena e assim sucessivamente. Exemplo: \(9 \times 2 + 8 \times 3 + 7 \times 4 + 6 \times 5 + 5 \times 6 + 4 \times 7 + 3 \times 8 + 2 \times 9 + 1 \times 10 = 210.\)
A dezena do número verificador é 0 caso o resto da divisão por 11 da soma dos produtos acima seja 0 ou 1. Caso contrário, a dezena corresponde a subtrair de 11 o resto da divisão por 11 da soma dos produtos. Exemplo: O resto da divisão de 210 por 11 é 1 então a dezena do número verificador é 0.
Calcule a soma dos produtos dos dez dígitos, onde o digito menos significativo passa a ser a dezena do número verificador, calculada no passo 2. Utilize os seguintes pesos: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Exemplo: \(2 \times 0 + 3 \times 9 + 4 \times 8 + 5 \times 7 + 6 \times 6 + 7 \times 5 + 8 \times 4 + 9 \times 3 + 10 \times 2 + 11 \times 1 = 255.\)
A unidade do número verificador é 0 caso o resto da divisão da soma dos produtos acima seja 0 ou 1. Caso contrário, a unidade corresponde a 11 menos o resto da divisão por 11 da soma dos produtos. Exemplo: O resto da divisão de 255 por 11 é 2; a unidade do número verificador é 9.
Seu programa irá receber os dados de um arquivo de texto. Utilize o esqueleto abaixo, ele lê a entrada e coloca o CPF na variável CPF:
#include <stdio.h>
#define BUFSZ 256
int main(void)
{
// Lendo arquivo de entrada:
char line[BUFSZ];
fgets(line, BUFSZ, stdin);
// Lendo e inicializando o CPF lido da entrada:
int CPF = 0;
sscanf(line, "%ld\n", &CPF);
// Insira codigo para calcular a unidade e a dezena do CPF aqui.
// Nao modifique as outras linhas.
int dezena = 0;
int unidade = 0;
// Imprimir o resultado:
printf("%09d-%d%d\n", CPF, dezena, unidade);
// Terminar de executar com sucesso:
return 0;
}Seu programa deve imprimir CPF com nove digítos (sem pontos), um hífen, a dezena e a unidade verificadoras. O esqueleto acima já imprime a saída no formato correto. Exemplo de saída:
123456789-09
Para resolver esse problema, você precisa utilizar dois conceitos: calcular o resto da divisão entre dois números utilizando o operador de módulo e processamento condicional. Para o primeiro conceito, procure saber como funciona o operador de módulo (%, veja o exemplo abaixo). Para o segundo, utilize as primitivas if e else da linguagem C.
int x = 5 % 2; /* x = 1 */
int y = 21 % 3; /* y = 0 */
int z = 43 % 5; /* z = 3 */