Descrição
Leiam a observação na parte comentada do algoritmo.
Sugestões são bem aceitas.
Caso encontrem erros me informem e demonstrem soluções.
Ficarei satisfeito em aprender mais com vcs.
Abraço a todos.
[ Download:
verificacpf.c ]
[
Enviar nova versão ]
[ Esconder código-fonte ]
/*
* Programa: verificacpf.c
* Autor: thiagoamm
* Data: 06/03/06
* OBS: Esse programa e essecialmente baseado em algoritmo testado no laboratorio
* da Universidade.
* Atraves dele estuda-se o conceito de modularizacao.
* Estao sendo usadas variaveis globais propositalmente para nocao do conceito
* de escopo e consequentemente deixando um guancho para o topico (parametros). *
*
*/
#include <ncurses.h>
#include <string.h>
/* Cabecalho de funcoes e subrotinas */
void calcdig(void);
/* Variaveis globais */
int aux,dc;
/* Modulo principal */
int main(void)
{
long int cpf;
int d1,d2,n9;
char sair;
char titulo[] = {"._.**.._.*%%*., VERIFICADOR DE CPF ,.*%%*._..**._."};
WINDOW *wstd, *j1, *jmsg, *jsair;
/* Iniciando modo ncurses */
initscr();
j1 = newwin(3,60,7,20);
wstd = newwin(15,60,10,20);
jmsg = newwin(5,20,15,40);
jsair = newwin(3,40,1,30);
start_color();
init_pair(1,COLOR_GREEN,COLOR_BLACK);
init_pair(2,COLOR_YELLOW,COLOR_BLUE);
init_pair(3,COLOR_RED,COLOR_BLACK);
init_pair(4,COLOR_BLUE,COLOR_BLACK);
wbkgd(j1,COLOR_PAIR(2) | A_BOLD);
wbkgd(wstd,COLOR_PAIR(1) | A_BOLD);
box(j1,0,0);
box(wstd,0,0);
sair = 'n'; // Flag.
do
{
mvwprintw(j1,1,5,"%s",titulo);
wrefresh(j1);
mvwprintw(wstd,2,2,"Informe seu CPF: ");
mvwscanw(wstd,2,19,"%ld",&cpf);
d2 = cpf % 10;
d1 = (cpf / 10) % 10;
n9 = (cpf / 10) / 10;
aux = n9;
calcdig(); // Chamando a subrotina.
if (dc == d1)
{
aux = n9 * 10 + dc;
calcdig();
if (dc == d2)
{
wbkgd(jmsg,COLOR_PAIR(4) | A_BOLD);
box(jmsg,0,0);
mvwprintw(jmsg,2,2," CPF VALIDO");
wrefresh(jmsg);
}
else
{
wbkgd(jmsg,COLOR_PAIR(3) | A_BOLD);
box(jmsg,0,0);
mvwprintw(jmsg,2,2," CPF INVALIDO!");
wrefresh(jmsg);
}
}
else
{
wbkgd(jmsg,COLOR_PAIR(3) | A_BOLD);
box(jmsg,0,0);
mvwprintw(jmsg,2,2," CPF INVALIDO!");
wrefresh(jmsg);
}
wbkgd(jsair,COLOR_PAIR(1));
box(jsair,0,0);
mvwprintw(jsair,1,2,"Deseja sair ? (s / n): ");
mvwscanw(jsair,1,24,"%c",&sair);
wclear(jsair);
wrefresh(jsair);
mvwprintw(wstd,2,19," ");
wclear(jmsg);
wrefresh(jmsg);
} while (sair != 's');
/* Finalizando modo ncurses */
endwin();
return(0);
}
/* Implementando a subrotina */
void calcdig(void)
{
int cont = 2, s = 0, n;
while (aux != 0)
{
n = aux % 10; // resto de divisao inteira.
s = s + n * cont;
cont++;
aux = aux / 10; // quociente de divisao inteira.
}
s = s * 10;
dc = s % 11;
if (dc == 10)
dc = 0;
}
Scripts recomendados
Soma de números através de strings
gerenciador de historico de comandos
Antecessor e sucessor
validaCPF
Lista ligada simples, algoritmos de inserção, busca e impressão
Comentários
[1] Comentário enviado por
humbhenri em 07/03/2006 - 19:58h:
Não entendi como ele calcula a validez do cpf, que eu saiba tem algo a ver com os dígitos verificadores. Entrei com meu cpf tanto com eles como sem eles e deu cpf inválido
[2] Comentário enviado por
thiagoamm em 07/03/2006 - 20:10h:
********************** AVISO ******************************
Galera esse programa utiliza a biblioteca ncurses.h e só funciona no linux (desde que este possua a ncurses em sua coleção de bibliotecas), caso não tenha procure no google, baixe o pacote e instale.
O PROGRAMA NÃO ACEITA CPF COM CARACTERES ESPECIAIS (OS PONTOS E O TRAÇO). Ex: Ao invés de informar um cpf xxx.xxx.xxx-xx, informe xxxxxxxxxxx
[3] Comentário enviado por
thiagoamm em 15/11/2007 - 00:22h:
Este programa tá bugado.
Vou corrigí-lo.
Me desculpem.