Manipulação de caracteres

C
O exercício é o seguinte: Desenvolva um subprograma para validação de CPF (Cadastro de Pessoas Físicas): desenvolva um algoritmo que dado um número de CPF, informado pelo usuário como uma cadeia de caracteres, ve- rifique se é válido e imprima a resposta na tela. A cadeia de caracteres digitada conterá pontos e traço conforme exemplo. char cpf[14]=“529.982.247-25”; Para verificar se um CPF é válido deve-se analisar os 2 (dois) últimos dígitos de acordo com alguns cálculos realizados com os demais números. Veja a seguir o cálculo para o exemplo: • Verificação do primeiro dígito: Primeiro: multiplica-se os 9 (nove) primeiros dígitos pela sequência decrescente de números intei- ros a partir de 10 (dez). 10 9 8 7 6 5 4 3 2 * * * * * * * * * 5 2 9 9 8 2 2 4 7 50 + 18 + 72 + 63 + 48 + 10 + 8 + 12 + 14 = 295 Segundo: multiplica-se o resultado por 10 (dez). 295 ∗ 10 = 2950 Terceiro: faz-se a divisão do resultado por 11 (onze) e pega-se o valor do resto da divisão. 2950 % 11 = 2 ++Caso o resultado do resto for maior que 10 (dez), então considera-se como resultado o valor 0 (zero). • Verificação do segundo dígito: Primeiro: multiplica-se os 10 (dez) primeiros dígitos pela sequência decrescente de números intei- ros a partir de 11 (onze). 11 10 9 8 7 6 5 4 3 2 * * * * * * * * * * 5 2 9 9 8 2 2 4 7 2 55 + 20 + 81 + 72 + 56 + 12 + 10 + 16 + 21 + 4 = 347 Segundo: multiplica-se o resultado por 10 (dez). 347 ∗ 10 = 3470 Terceiro: faz-se a divisão do resultado por 11 (onze) e pega-se o valor do resto da divisão. 3470 % 11 = 5 ++Caso o resultado do resto for maior que 10 (dez), então considera-se como resultado o valor 0 (zero). Desta forma temos como resposta os dígitos “25”, os quais correspondem aos dígitos do CPF dado como exemplo: “529.982.247-25”. OBS: Você pode usar as funções int tam = strlen(texto), int num = atoi(texto) {converte ca- deia de caracteres para inteiro} e int valor = isdigit(char) {se valor==0 o char é um número entre 0 e 9}. Todas das bibliotecas #include e #include Minha dúvida é a seguinte: eu passo o cpf pra função de validação como uma string ou eu já faço a conversão para inteiro? Essa função atoi não entendi como funciona. Sei como ela converte um único caractere em inteiro, mas com uma string como um CPF, que contém "." e "-", não consegui implementar. Eu teria que passar os números do cpf pra um vetor de inteiros, certo?
Foto de Pedro B.
Pedro Renato perguntou há 2 anos

Sabe a resposta?

Ganhe 10 pts por resposta de qualidade
Responder dúvida
1 resposta
0
votos
Nenhum usuário votou nessa resposta como útil.
Professor Rafael P.
Identidade verificada
  • CPF verificado
  • E-mail verificado
Respondeu há 1 ano

Você pode fazer um loop, e multiplicar por um valor relativo a i.

Lembrando que o CPF virá em forma de string (ou seja: char []), então deve-se subtrair o caractere em questão do caractere "0" para se obter o numeral.

As posições da string se dão da seguinte forma:

  • 0 a 2 - o primeiro grupo ternário (de três elementos)
  • 3 - o primeiro ponto
  • 4 a 6 - o segundo grupo ternário (veja que é equivalente a dizer "3 a 5" + 1)
  • 7 - o segundo ponto
  • 8 a 10 - o terceiro grupo ternário (veja que é equivalente a dizer "6 a 8" + 2)
  • 11 - o hífen
  • 12 a 13 - os dígitos verificadores

int soma = 0;
for (i = 0; i < 10; i++) {
  # Pequeno hack: nas posicoes [3-5], deve-se somar um ao indice da string, para se livrar do hifen
  soma += (cpf[i + (i / 3)] - '0') * (10 - i);
}
int dv = (soma * 10) % 11;
if (dv == (cpf[12] - '0')) {
  printf("O CPF %s e valido!", cpf);
} else {
  printf("O CPF %s e invalido!", cpf);
  return;
}
dv = soma + cpf[12];
dv = (dv * 10) % 11;
if (dv == (cpf[12] - '0')) {
  printf("O CPF %s e valido!", cpf);
} else {
  printf("O CPF %s e invalido!", cpf);
  return;
}

Envie uma dúvida gratuitamente

Envie sua primeira dúvida gratuitamente aqui no Tira-dúvidas Profes. Nossos professores particulares estão aqui para te ajudar.

Professores particulares de C

+ Ver todos
Encontre professor particular para te ajudar nos estudos
R$ 100 / h
Rafael P.
Campo Grande / MS
Rafael P.
4,8 (30 avaliações)
Horas de aulas particulares ministradas 3 horas de aula
Tarefas resolvidas 40 tarefas resolvidas
Identidade verificada
  • CPF verificado
  • E-mail verificado
1ª hora grátis
Estrutura de dados em C Programação em C Básico C - Ponteiros
Graduação: Engenharia de Computação (Instituto Militar de engenharia (IME))
Formado em engenharia de computação pelo instituto militar de engenharia em 2016. Atuando desde então em ti e segurança da informação.
R$ 60 / h
César D.
Mogi Guaçu / SP
César D.
4,9 (809 avaliações)
Horas de aulas particulares ministradas 87 horas de aula
Tarefas resolvidas 993 tarefas resolvidas
Identidade verificada
  • CPF verificado
  • E-mail verificado
1ª hora grátis
C - matriz C - string Programação em C Intermediário
Graduação: Matemática Aplicada e Computacional (Universidade Estadual de Campinas (UNICAMP))
Faça aulas de matemática, computação e programação em c, c++, java e python.
R$ 75 / h
Danilo L.
Campina Grande / PB
Danilo L.
4,9 (18 avaliações)
Horas de aulas particulares ministradas 27 horas de aula
Tarefas resolvidas 1 tarefa resolvida
Identidade verificada
  • CPF verificado
  • E-mail verificado
1ª hora grátis
Estrutura de dados em C Programação em C Básico C - Ponteiros
Graduação: Engenharia da Computação (IFPB - Campus Campina Grande )
Desenvolvedor web full stack. Acompanhamento particular em excel/vba, python, c/c++, java, selenium e js!