Logo Hardware.com.br
NQuestions22
NQuestions22 Novo Membro Registrado
9 Mensagens 0 Curtidas

Programa em C que lê CPF usando vetor e laços de repetição

#1 Por NQuestions22 09/10/2020 - 17:28
Olá! Estou tendo muita dificuldade em elaborar um programa que verifica se um CPF é válido ou não. Eu já fiz uma versão desse programa anteriormente, só que agora, obrigatoriamente, tenho que elaborar o código utilizando laços de repetição, além de ler os números do CPF de maneira isolada e armazená-los em um vetor. Já tentei mudar diversas coisas, mas o programa continua atestando que o CPF é inválido. Por meio de um printf, já conferi a posição dos números do CPF nos vetores e esse não é o problema. No entanto, acredito que o problema, ao menos no cálculo do primeiro dígito verificador, parte de p+=cpf*(11-i), mas não tenho ideia do que está errado e de como corrigir. Alguém sabe qual o problema? Agradeço desde já.
#include <stdio.h>
main(){
int cpf[11],i,p,d1,d2;
for(i=1;i<=11;i++){
printf("Digite o CPF:&quot;
scanf("%d",&cpf[i]);
}
for(i=1;i<9;i++){
p+=cpf[i]*(11-i);
}
d1=p%11;
if(d1<2){
d1=0;
}
else{
d1=11-d1;
}
p=0;
for(i=1;i<9;i++){
p+=cpf[i]*(12-i);
}
d2=(p+(d1*2))%11;
if(d2<2){
d2=0;
}
else{
d2=d2-11;
}
if(cpf[10]==d1&&cpf[11]==d2){
printf("CPF Valido\n&quot;
}
else{
printf("CPF Invalido&quot;
}
}
esquiloesperto
esquiloesper... Cyber Highlander Moderador
7.1K Mensagens 2.2K Curtidas
#2 Por esquiloesper...
10/10/2020 - 22:33
Você diz que inserir o número de CPF não é problema, mas tem problema sim! — O problema é que não precisa (e nem deveria) chatear e obrigar o usuário a fornecer os dígitos 11 vezes quando isso pode ser feito de uma só vez... Basta utilizar o formato " %1d".

Melhor dizendo: não precisa daquele loop "for" para obter o CPF.
Quanto a validação em si ela está quase bem no caso do primeiro dígito, mas falha para o segundo verificador.

Para o primeiro dígito ficar perfeito, apenas faça [plain] i <= 9 [/plain] dentro do respectivo "for":
[code=c]for(i=1; i<=9; i++)[/code]

E no caso do segundo dígito você aplicou um algoritmo diferente do primeiro, mas saiba que são exatamente iguais. A única diferença é que ao invés de "9" o loop precisa seguir um algarismo a mais "10":
[code=c]for(i=1; i<=10; i++)[/code]

De tão idênticos você pode criar uma única função que retorna verdadeiro ou falso para validar a ambos, d1 e d2
— Veja:
[code=c]#include

int verificador(int pos, int* cpf) {
int i, p=0;
for(i=1;i<=pos;i++){
p+=cpf*(pos+2-i);
}

int d = 11 - p%11;
if (d >= 10) {
d = 0;
}
return d == cpf[i];
}

int main(){
int cpf[11]={0},i,d1,d2;

printf("Digite o CPF:");
scanf(" %1d", &cpf);

d1 = verificador(9, cpf);

d2 = verificador(10, cpf);

if(d1 && d2){
printf("CPF Valido\n");
}
else{
printf("CPF Invalido");
}

return 0;
}[/code]


- Aqui o algoritmo passo a passo da solução: [I]O cálculo do dígito verificador do CPF e do CNPJ
wink.png
Só é difícil enquanto estiver oculto! cool.png
Use a pesquisa


rolleyes.png  Navegar é preciso, viver... também.  smile.png
NQuestions22
NQuestions22 Novo Membro Registrado
9 Mensagens 0 Curtidas
#3 Por NQuestions22
11/10/2020 - 10:16
esquiloesperto disse:

Depois de muito quebrar a cabeça, notei alguns erros e consegui fazer funcionar! Quanto ao fato de "obrigar" o usuário a fornecer os números separadamente, eu esqueci de comentar, mas foi uma exigência da tarefa (ainda que não faça muito sentido), assim como os procedimentos para calcular os dígitos verificadores. De todo modo, o seu código ficou bem melhor que o meu! Agradeço a atenção!
© 1999-2025 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal