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;
}
}