OneCompiler

MD2 - atividade 2 - CPF e ISBN

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

// Função para validar CPF e retornar os dígitos verificadores calculados
int validar_cpf(int cpf[], int *digito1_calculado, int *digito2_calculado) {
int soma1 = 0, soma2 = 0;

for (int i = 0; i < 9; i++) {
    soma1 += cpf[i] * (10 - i);
    soma2 += cpf[i] * (11 - i);
}

*digito1_calculado = (soma1 * 10) % 11;
if (*digito1_calculado == 10) *digito1_calculado = 0;

soma2 += (*digito1_calculado) * 2;
*digito2_calculado = (soma2 * 10) % 11;
if (*digito2_calculado == 10) *digito2_calculado = 0;

return *digito1_calculado == cpf[9] && *digito2_calculado == cpf[10];

}

// Função para validar ISBN e retornar o dígito verificador calculado
int validar_isbn(int isbn[], int *digito_calculado) {
int soma = 0;

for (int i = 0; i < 9; i++) {
    soma += isbn[i] * (10 - i);
}

*digito_calculado = 11 - (soma % 11);
if (*digito_calculado == 10) *digito_calculado = 'X';
else if (*digito_calculado == 11) *digito_calculado = 0;

return *digito_calculado == isbn[9];

}

int main() {
int escolha;
printf("O que você deseja verificar?\n");
printf("1 - CPF\n");
printf("2 - ISBN\n");
printf("Digite sua escolha (1 ou 2): ");
scanf("%d", &escolha);

if (escolha == 1) {
    // Validação do CPF
    char cpf_input[12];
    int cpf[11], digito1_calculado, digito2_calculado;

    printf("Digite os 11 dígitos do CPF (apenas números): ");
    scanf("%s", cpf_input);

    // Verificar se o CPF tem exatamente 11 dígitos
    if (strlen(cpf_input) != 11) {
        printf("Erro: O CPF deve ter exatamente 11 dígitos.\n");
        return 1;
    }

    // Converter a string para um array de inteiros
    for (int i = 0; i < 11; i++) {
        if (!isdigit(cpf_input[i])) {
            printf("Erro: O CPF deve conter apenas números.\n");
            return 1;
        }
        cpf[i] = cpf_input[i] - '0';
    }

    if (validar_cpf(cpf, &digito1_calculado, &digito2_calculado))
        printf("CPF válido.\n");
    else {
        printf("CPF inválido.\n");
        printf("Os dígitos verificadores corretos seriam: %d e %d.\n", digito1_calculado, digito2_calculado);
    }
} else if (escolha == 2) {
    // Validação do ISBN
    char isbn_input[11];
    int isbn[10], digito_isbn_calculado;

    printf("Digite os 10 dígitos do ISBN (último dígito pode ser 'X'): ");
    scanf("%s", isbn_input);

    // Verificar se o ISBN tem exatamente 10 caracteres
    if (strlen(isbn_input) != 10) {
        printf("Erro: O ISBN deve ter exatamente 10 caracteres.\n");
        return 1;
    }

    // Converter a string para um array de inteiros
    for (int i = 0; i < 9; i++) {
        if (!isdigit(isbn_input[i])) {
            printf("Erro: O ISBN deve conter apenas números nos primeiros 9 dígitos.\n");
            return 1;
        }
        isbn[i] = isbn_input[i] - '0';
    }

    // Tratar o último dígito do ISBN (pode ser número ou 'X')
    if (isbn_input[9] == 'X' || isbn_input[9] == 'x') {
        isbn[9] = 'X';
    } else if (isdigit(isbn_input[9])) {
        isbn[9] = isbn_input[9] - '0';
    } else {
        printf("Erro: O último dígito do ISBN deve ser um número ou 'X'.\n");
        return 1;
    }

    if (validar_isbn(isbn, &digito_isbn_calculado)) {
        printf("ISBN válido.\n");
    } else {
        printf("ISBN inválido.\n");
        if (digito_isbn_calculado == 'X')
            printf("O dígito verificador correto seria: X.\n");
        else
            printf("O dígito verificador correto seria: %d.\n", digito_isbn_calculado);
    }
} else {
    printf("Escolha inválida. Digite 1 para CPF ou 2 para ISBN.\n");
}

return 0;

}

}