Logo Hardware.com.br
chamuska
chamuska Veterano Registrado
1.4K Mensagens 16 Curtidas

[Resolvido] desmontar um numero em c???

#1 Por chamuska 07/09/2007 - 23:44
O galera, tenho q fazer um programa q valide o cpf digitado pelo usuario.
tentei de varias formas, mas percebi alguns erros e vi q a melhor manheira pro calculo dar certo é desmontando o numero, isso da pra fazer com calculos, mas um cpf tem 11 numeros, dai desenvolve o calculo pra isso me quebra as pernas.

Alguem sabe o comando em C q desmonta o numero pra eu faze os calculos da validação ??

vlws
The Doug
The Doug Super Participante Registrado
890 Mensagens 10 Curtidas
#2 Por The Doug
08/09/2007 - 00:11
chamuska disse:


Como assim desmontar o número? Quer pegar digito por digito, é isso? Se for isso é muito simples. É só usar um sprintf. Ex.

char CPF[11]

.
.
.

sprintf(CPF, "%d", CPF_Numerico);

onde CPF_Numerico é um numero q contém o cpf. Com isso a string CPF agora vai conter o cpf desejado......

É isso q vc queria?
Visitem meu site:

www.infotalkers.com
jofrelscalvet
jofrelscalve... Veterano Registrado
1.3K Mensagens 51 Curtidas
#4 Por jofrelscalve...
08/09/2007 - 00:51
Em C normalmente eu separava strings usando o fato de que elas são vetores de caracteres.
no caso str= "596";
"C"
str[0] = '5' E str[1] = '9' E str[2] = '6' E str[3] ='\0'


para numero inteiros podemos usar o seguinte truque:
"C"
596/100=5 E 596%100=96 ;
96/10=9 E 96%10=6
6/1 = 6

% é o operador "resto da divisão inteira"
Eu gostaria de saber explicar essa propriedade da representação dos numeros, mas acho melhor só dizer que para saber que devemos começar a divisão com o 100 podemos usar log(596)(base 10)= 2 + resto
A ultima vez que tentei explicar isto fiquei com a impressão que confundi muuuito a cabeça de meu "aluno"

[off]
ô loco! Enquanto eu escrevia houveram 2 respostas!
[/off]
Melhore o futuro do fórum: Diga se a dica funcionou ou conte-nos como conseguiu resolver a sua dúvida!
Se eu errar ou for pouco claro, reclame! Quando possivel eu tentarei melhorar.
chamuska
chamuska Veterano Registrado
1.4K Mensagens 16 Curtidas
#6 Por chamuska
08/09/2007 - 01:47
entao, fui ve o q vcs me passaram e pesquisa mais algumas coisas.

eu acho q o q o jofrelscalvet passo e o mais facil, nao consegui netende direito o q tinha no site o o codigo pra validar cpf, e o esquema do "sprintf(cpf, "%d", cpf_Numerico); " acabo nao dando muito certo, ma vlw ae povo!

so tenho um problema agora com o q o
jofrelscalvet passo, os numeros sao muito grandes e nao da pro programa fazer os calculos e imprimir eles corretamente, os resultados saem errados e negativos, como q fasso pra receber e imprimir o resultado do codigo abaixo??

int main()
{
int cpf, x1;

puts("digite o numero do cpf"
scanf("%d",&cpf);


x1=cpf/1000000000; //por causa do cpf ter 11 numeros
printf("\n%d\n",x1);


system("PAUSE"
return 0;
}

entao, vai ser preciso alguma biblioteca ou algum outro comando pra calcular e imprimir os valores corretamente??

vlws
André Krebs - programador web
krebscode.eti.br
peczenyj
peczenyj Geek Registrado
3K Mensagens 75 Curtidas
#8 Por peczenyj
08/09/2007 - 02:58
1234 = 1 * 1000 + 2 * 100 + 3 *10 + 4
= 1 * 10^3 + 2 * 10^2 + 3 * 10^1 + 4 * 10^0

ou seja, é muito facil desmontar um número inteiro em seus componentes da base 10 usando as operações divisão e módulo (basta fazer algumas experiências e ter um pouco de dedicação).

outra dica é converter para um array de chars. um char pode ser convertido em um inteiro, novamente basta querer e fazer algum estudo nos fundamentos da linguagem C ou ler atentamente tudo o que foi escrito aqui.
chamuska
chamuska Veterano Registrado
1.4K Mensagens 16 Curtidas
#9 Por chamuska
08/09/2007 - 03:02
cara, nao entendi, eu tenho q declarar o cpf_numerico como inteiro??

nao entendi o q "sprintf(cpf, "%d", cpf_Numerico);" faz cara.
e depois pra imprimi o numero, eu mando imprimir cpf_Numero como inteiro?

e alguem ai sabe como fazer pro programa aceita numero com mais de 10 digitos??

vls

obs: dedicaçao??, sao 3 da manha cara!!!!
André Krebs - programador web
krebscode.eti.br
jose_silva_neto
jose_silva_n... General de Pijama Registrado
4.6K Mensagens 98 Curtidas
#10 Por jose_silva_n...
08/09/2007 - 04:55
Bom dia,

Olhe esse código:


#include <stdio.h>

#define const 18157520821

long long int pot(int numero);

int main(int argc, char **argv)
{
long long int cpf_numerico;
long long int cpf_vector[11];
int contador;

cpf_numerico = const;
//scanf("%lli",&cpf_numerico);

for (contador = 0; contador < 11;++contador)
{
cpf_vector[contador] = cpf_numerico / (pot(11 - contador - 1));
cpf_numerico = cpf_numerico - cpf_vector[contador]*pot(11 - contador - 1);
printf("%lli %lli\n",cpf_vector[contador],pot(11 - contador - 1));
}

printf("\n&quot;

return(0);

}

long long int pot(int numero)
{

long long int potencia = 1;
int i;

for (i = 1; i <= numero; ++i)
potencia *= 10;

return (potencia);
}
Ele decompõe (captura os digitos) o número como você pensou, mas não resolve o seu problema porque um número de cpf é na verdade uma string numérica (ou alfanumérica, depende da notação), pense no caso de um cpf que começa por "0", o programinha acima não vai funcionar, porque eu tratei tudo de forma numérica.

O link que o peczenyj deu a entender deve ser esse aqui

http://www.vivaolinux.com.br/scripts/verFonte.php?codigo=1673&arquivo=cpf.c

É a melhor solução, o autor trata tudo em termos de vetores (sejam de caracteres ou inteiros), com a função convCPF() ela coleta os caracteres numéricos, e armazena num vetor de inteiros cpflimpo[ ] , depois ele usa duas funções digito1( ) e digito2( ) que calculam os dois últimos digitos esperados e armazena; no final ele compara os dígitos calculados para validação. Note também que o autor pede que o usuário entre com o cpf num dado formato, mas um usuário é uma entidade imprevisível, pode deliberadamente ou não entrar com um caracter inválido, e que não seja "." ou "-" (são os caracteres que a função do convCPF() trata. Estude esse código com calma e uma sugestão: modifique a convCPF() para que ela detecte caracteres quaisquer diferentes dos numéricos e os descarte.

Espero ter ajudado um pouquinho

Fique com Deus

Kali
chamuska
chamuska Veterano Registrado
1.4K Mensagens 16 Curtidas
#11 Por chamuska
08/09/2007 - 09:34
opa, vlw ae pelo site com o codigo!!

pena q ja to pra sai, tenho q da uma ajustada nele pra funciona.

ow, alguem ai sabe pq no final do codigo q o Kalicrates coloco ai ta com o final assim:


main()
{
digcpf(); //PRA QUE SERVE ISSO?
convCPF();//E ISSO?
digito1(); //E ISSO?
digito2(); //E ISSO?
printf("\e[H\e[2J&quot;
if (cpflimpo[9] == digitos[0] && cpflimpo[10] == digitos[1])
{
printf("\nC.P.F. valido\n &quot;
}
else
{
printf("Invalido !!!\n&quot;
}
}


aquilo q eu dechei marcado parece q so faz o programa ficar em "digcpf()".
André Krebs - programador web
krebscode.eti.br
jose_silva_neto
jose_silva_n... General de Pijama Registrado
4.6K Mensagens 98 Curtidas
#13 Por jose_silva_n...
08/09/2007 - 12:47
chamuska disse:


Você leu o meu post com calma ? Eu disse explicitamente o que as funções digito1(),digito2() e convCPF fazem. Uma pergunta mais básica: você sabe como se constrói um número de cpf ? Se trata de um exemplo de código matemático, antes de tentar entender a implementação é preciso entender o que se está implementando (pelo menos eu preciso), leia com cuidado o texto do seguinte link:

http://www.clubedainformatica.com.br/documentos/imprimir.php?cod=62

O link acima é uma descrição do algoritmo de cpf; depois, se quiser continuar a conversar, volte a postar.


Fique com Deus

Kali
chamuska
chamuska Veterano Registrado
1.4K Mensagens 16 Curtidas
#15 Por chamuska
09/09/2007 - 00:19
entao galera, consegui faze o codigo, e acho q pra quem e noob em programaçao como eu, o meu exemplo q vo decha aqui fica melhor.

flws galera

codigo:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

char recolhecpf[12];
int calc[9], numcpf[12], somacpf, divcpf, restodiv, dig_verif;
int fimcpf[2], corrige_fim[2];
int i;

void recebe();
void ajuste1();
void ajuste2();
void calculo1();
void calculo2();

int main()
{
recebe();
printf("\n&quot;
system("PAUSE&quot;
return 0;
}

void recebe()
{
//==================\\
/* zerador! */

recolhecpf[0]='\0';
numcpf[0]='\0';
corrige_fim[0]='\0';
fimcpf[0]='\0';
calc[0]='\0';
somacpf=0;
divcpf=0;
restodiv=0;
dig_verif=0;

/*printf("\n%c,recolhe cpf",recolhecpf[0]);
printf("\n%c,numcpf",numcpf[0]);
printf("\n%c,corrige fim",corrige_fim[0]);
printf("\n%c,fimcpf",fimcpf[0]);
printf("\n%c,calc\n",calc[0]);

puts("======================&quot;
printf("\n%d, soma",somacpf);
printf("\n%d,div",divcpf);
printf("\n%d,resto div",restodiv);
printf("\n%d,dig verificacao\n",dig_verif);*/

puts("digite o numero.&quot;
gets(recolhecpf);
getch();
ajuste1();
}
void ajuste1()
{
if(recolhecpf[9]=='-'
{
fimcpf[0]=recolhecpf[10]-48;
printf("\n%d\n",fimcpf[0]);
fimcpf[1]=recolhecpf[11]-48;
printf("\n%d\n",fimcpf[1]);
getch();
system("cls&quot;
}
else
{
fimcpf[0]=recolhecpf[9]-48;
printf("\n%d\n",fimcpf[0]);
fimcpf[1]=recolhecpf[10]-48;
printf("\n%d\n",fimcpf[1]);
getch();
system("cls&quot;
}

for(i=0;i<9;i++)
{
numcpf[i]=recolhecpf[i];
calc[i]=(numcpf[i]-48)*(10-i);
printf("%d\t",calc[i]);
somacpf+=calc[i];
}
getch();
calculo1();

}
void calculo1()//calcula primeioro numero verificador
{
divcpf=somacpf/11;
restodiv=somacpf%11;
dig_verif=11-restodiv;
if(restodiv<2 && fimcpf[0]!=0)
{
puts("o numero do cpf esta errado, digite novamente&quot;
getch();
system("cls&quot;
recebe();
}
if(restodiv>=2 && dig_verif!=fimcpf[0])
{
puts("o numero do cpf esta errado, digite novamente&quot;
getch();
system("cls&quot;
recebe();
}
//========================
printf("\n%d, soma",somacpf);
printf("\n%d,div",divcpf);
printf("\n%d,resto div",restodiv);
printf("\n%d,dig verificacao",dig_verif);
getch();
calculo2();
}
void calculo2()
{
somacpf=0;
divcpf=0;
restodiv=0;
dig_verif=0;

printf("\n\n&quot;
for(i=0;i<9;i++)
{
numcpf[i]=recolhecpf[i];
calc[i]=(numcpf[i]-48)*(11-i);
printf("%d\t",calc[i]);
somacpf+=calc[i];
}
calc[9]=2*(11-9);
printf("%d\t",calc[9]);
somacpf+=calc[9];

divcpf=somacpf/11;
restodiv=somacpf%11;
dig_verif=11-restodiv;

//========================
printf("\n%d, soma",somacpf);
printf("\n%d,div",divcpf);
printf("\n%d,resto div",restodiv);
printf("\n%d,dig verificacao",dig_verif);
getch();
printf("\n\n&quot;
if(restodiv<2 && fimcpf[1]!=0)
{
puts("o numero do cpf esta errado, digite novamente&quot;
getch();
system("cls&quot;
recebe();
}
if(restodiv>=2 && dig_verif!=fimcpf[1])
{
puts("o numero do cpf esta errado, digite novamente&quot;
getch();
system("cls&quot;
recebe();
}
printf("\nnumero de CPF correto\n&quot;
getch();



}
punk.gif
André Krebs - programador web
krebscode.eti.br
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal