9.31 Escreva um programa de computador que receba um número de CPF e verifique a validade dos dígitos verificadores. O algoritmo para esse programa está ilustrado no Exemplo 9.2.
Passo 1
O enunciado pede um programa que leia um número de CPF e verifique se os dois dígitos verificadores (os dois últimos) estão corretos. O conteúdo da matéria envolve manipulação de strings para isolar cada dígito, conversão para inteiro e aplicação da regra de cálculo dos dígitos verificadores do CPF, que usa somas ponderadas e operações de resto de divisão.
Passo 2
Para calcular o primeiro dígito verificador, considere os nove primeiros dígitos do CPF como
. A regra é:
Em seguida, calcule o resto
Se
, então o primeiro dígito verificador é 0; caso contrário, ele vale
.
Passo 3
O segundo dígito verificador é obtido usando os nove dígitos originais mais o primeiro dígito verificador calculado, isto é
. Defina
compute
e aplique a mesma regra: se
então o segundo dígito verificador é 0, senão é
.
Passo 4
Agora que sabemos como gerar cada dígito, é só implementar em código: ler o CPF como texto, remover pontos e hífen, garantir que tenha 11 caracteres, extrair os dígitos, calcular os dois dígitos verificadores com os passos anteriores e comparar com os dois últimos dígitos fornecidos. Se baterem, o CPF é válido; caso contrário, é inválido.
Resposta
def validar_cpf(cpf_raw):
# Remove pontos e hífen
cpf = "".join(ch for ch in cpf_raw if ch.isdigit())
if len(cpf) != 11:
return False
# Função auxiliar para calcular dígito verificador
def calc_dv(digs, peso_inicial):
soma = 0
for i, d in enumerate(digs):
soma += int(d) * (peso_inicial - i)
resto = soma % 11
return '0' if resto < 2 else str(11 - resto)
# Nove primeiros dígitos
nove = cpf[:9]
dv1 = calc_dv(nove, 10)
dv2 = calc_dv(nove + dv1, 11)
# Verifica se os dígitos batem
return cpf.endswith(dv1 + dv2)
if __name__ == "__main__":
entrada = input("Digite o CPF (formato xxx.xxx.xxx-xx): ")
if validar_cpf(entrada):
print("CPF válido")
else:
print("CPF inválido")