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 d1d2ldots d9. A regra é:
S1 = sumi=1^9 di times (10 - i)
Em seguida, calcule o resto
R1 = S1 bmod 11
Se R1 < 2, então o primeiro dígito verificador é 0; caso contrário, ele vale 11 - R1.

Passo 3

O segundo dígito verificador é obtido usando os nove dígitos originais mais o primeiro dígito verificador calculado, isto é d1d2ldots d9d10. Defina
S2 = sumi=1^10 di times (11 - i),
compute
R2 = S2 bmod 11
e aplique a mesma regra: se R2 < 2 então o segundo dígito verificador é 0, senão é 11 - R2.

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")

Exercícios relacionados