Função para verificar CPF.

1. Função para verificar CPF.

Hugo Sousa
goj1

(usa Debian)

Enviado em 17/02/2010 - 01:00h

Olá.

Estou estudando PHP e estou na parte das functions. E encontrei uma para verificar se o número de CPF foi digitado corretamente, fiquei assustado pelo tanho do código simplesmente para fazer uma simples verificação.

São 45 linhas de código.

Pergunto!

Não seria mais fácil fazer código mais enxuto com um simples "if" com variáveis de ambiente vindo do formulário? Por exemplo:

...
$cpf = $_GET["cpf"];
if($cpf != 11)
{
echo "Digite o número corretamente. São 11 algarísmos sua anta!"; //A mensagem é para descontraír.
}

O livro é bom, mas acho que isso complica meu entendimento!
Estou certo em meu pensamento?


  


2. Re: Função para verificar CPF.

Sergio Teixeira - Linux User # 499126
Teixeira

(usa Linux Mint)

Enviado em 17/02/2010 - 02:39h

45 linhas de código está de bom tamanho.
Se fosse em Assembly gastaria algumas páginas...

Acontece que os nove primeiros algarismos do CPF são testados um a um, e não em conjunto.
E depois, os dois últimos alagarismos são DOIS "check digits" de um algarismo cada, e não apenas um com dois algarismos.
Ou seja, o décimo-primeiro algarismo é o "check digit" do décimo.
Além do que, deve-se levar em consideração o módulo (que no caso do CPF é 11, e que nada tem a ver com o fato de serem 11 algarismos).

Bem, a função a que você se refere tem a finalidade de testar para ver SE O NÚMERO INFORMADO É VÁLIDO (para isso existem os dígitos de controle), não "se a string tem 11 caracteres".
Por isso ela é mais complexa do que você imaginou a princípio.

Programadores experimentados procuram desenvolver funções ainda mais complexas e abrangentes, que distinguem entre números de CPF e de CNPJ, por exemplo.
Como a montagem desses números é diferente, deve existir uma tomada de decisão logo após a leitura da string.
Se for CPF calcula de uma forma; Se for CNPJ, calcula de outra.

As "funções" costumam ser as ferramentas personalizadas de cada programador. Cada um monta a sua própria biblioteca.
E são muito importantes para o aprendizado.
Não basta "copiar e colar", temos de ENTENDER o seu significado, e porque foi feito de uma forma e não de outra.


3. Re: Função para verificar CPF.

Hugo Sousa
goj1

(usa Debian)

Enviado em 17/02/2010 - 03:35h

Vou digitar a função para você me explicar, Teixeira. Pois, se eu for parar nela, vou ficar muito tempo sem entender nada, já que há muita coisa que somente lendo não se aprende de imediato e eu preciso aprender logo e quanto mais explicações melhor! Espero contar com você e todos do Vol que puderem ajudar.
Já está tarde, escreverei o código quando acordar...
Até mais.


4. Tem uma opção

JOSE CARLOS CARVALHO
josecarlosweb

(usa Red Hat)

Enviado em 17/02/2010 - 11:28h

Se você quer realmente algo bem simples, monta apenas uma máscara... assim o campo só fica preenchido se for digitado todo od caracteres, além de não deixar que o usuário insira letras no campo. segue o link para a máscara.. http://razoesdeser.wordpress.com/2010/02/12/mascara-em-campos-em-um-formulario-com-jquery/


5. Re: Função para verificar CPF.

Hugo Sousa
goj1

(usa Debian)

Enviado em 18/02/2010 - 01:48h

Eu não entendo nada de javascript!

Farei duas perguntas e deixarei a questão do CPF para depois, pois me parece bem complicada!

Analisem os scripts abaixo e me respondam:

1. Quando exatamente se usa a função com e sem argumentos e qual a diferença?

2. Quando exatamento deve-se usar o "return" e o que ele faz exatamente?

3. Alguém pode me explicar o fluxo da 2ª função?

Algumas questões, o livro não explica claramente...





<?php
function soma_valores($v1, $v2, $v3, $v4)
{
$soma = $v1+$v2+$v3+$v4;
echo "A soma dos valores $v1, $v2, $v3 e $v4";
echo " é $soma";
}
$h1=3;
$h2=4;
$h3=5;
$h4=7;
soma_valores($h1, $h2, $h3, $h4);
?>



<?php

function retorna_data()
{
$agora = time();
$data = getdate($agora);
if($data["wday"]==0){echo "Domingo, "; }
elseif($data["wday"]==1){echo "Segunda-feira, "; }
elseif($data["wday"]==2){echo "Terça-feira, "; }
elseif($data["wday"]==3){echo "Quarta-feira, "; }
elseif($data["wday"]==4){echo "Quinta-feira, "; }
elseif($data["wday"]==5){echo "Sexta-feira, "; }
elseif($data["wday"]==6){echo "Sábado, "; }
if($data["mon"]==1){echo "Janeiro, " ;}
elseif($data["mon"]==1){ $mes="Janeiro, " ;}
elseif($data["mon"]==2){ $mes="Fevereiro, " ;}
elseif($data["mon"]==3){ $mes="Março, " ;}
elseif($data["mon"]==4){ $mes="Abril, " ;}
elseif($data["mon"]==5){ $mes="Maio, " ;}
elseif($data["mon"]==6){ $mes="Junho, " ;}
elseif($data["mon"]==7){ $mes="Julho, " ;}
elseif($data["mon"]==8){ $mes="Agosto, " ;}
elseif($data["mon"]==9){ $mes="Setembro, " ;}
elseif($data["mon"]==10){ $mes="Outubro, " ;}
elseif($data["mon"]==11){ $mes="Novembro, " ;}
elseif($data)["mon"]==12){ $mes="Dezembro, " ;}
$data_atual = $data["mday"]." de " .$mes. " de ".$data["year"];
return $data_atual
}
$hoje = retorna_data();
echo $hoje;

?>




6. Re: Função para verificar CPF.

Erick Gallani
ErickVOL

(usa Ubuntu)

Enviado em 04/03/2010 - 09:36h

Bom primeiro vamos responder a pergunta principal do tópico.
Para verificar CPF não basta apenas conferir se foram digitas 11 dígitos numéricos, pois a própria criação do CPF consiste em um lógica onde os 2 últimos dígitos são de controle. Para isso você teria mesmo que criar uma função com toda uma lógica para verificar se o CPF é válido ou não.

Segue um link que explica detalhadamente a lógica de verificação do CPF:
http://homepages.dcc.ufmg.br/~rodolfo/aeds-1-05/regrasDigitosVerificadoresCPF.html

Agora com relação a suas outras dúvidas, vamos la.

"1. Quando exatamente se usa a função com e sem argumentos e qual a diferença?"

Usa-se funções com argumentos quando você precisa passa para a função um valor de fora. Por exemplo:

function multiplica($x,$y)
{
$multi = $x*$y;

echo $multi;
}

$Num1 = 2;
$Num2 = 4;
multiplica($Num1,$Num2);

O que exatamente este "programinha" está fazendo, você declarou uma função multiplica certo? O que ela faz? Simples, ela pega 2 valores externos e multiplicam um pelo outro. É por isso que estamos passando 2 argumentos para a função, porque como você pode ver esses números serão pegos de fora da função.
Onde o valor de $Num1 vai ser atribuido a $x e de $Num2 a $y. Funções sem argumentos são funções que não necessitam de valores externos, mais um exemplo (bem bobo) seria:

function imprimi_erro()
{
echo "Ocorreu um erro durante a execução."
}

Essa função não necessita argumentos pois ela só imprimi a mensagem e nada mais, esse foi um exemplo bem simples, espero que você tenha intendido essa parte.
O critério de uso das funções com o sem argumentos vai depender do problema que você está tentando resolver.

"2. Quando exatamento deve-se usar o "return" e o que ele faz exatamente?"

O return serve para retornar valores das funções. Vamos refazer o function multiplica($x,$y) usando return agora.

function multiplica($x,$y)
{
$multi = $x*$y;

return $multi
}

$Num1 = 2;
$Num2 = 4;

$resultado = multiplica($Num1,$Num2);
echo $resultado;

O que está funções a função está fazendo agora, ela recebe os valores externos $Num1 e $Num2, multiplica eles, mais agora ao invés de dar um echo dentro da função eu quero pegar o resultado dessa multiplição e usar ele fora da função, então eu uso o return. Por tanto o que o return faz? simples, nesse caso ele vai "retornar" o valor de $x*$y e armazenar em $resultado e depois eu dei um echo $resultado ou seja ele vai imprimir o valor obtido na função.
Um detalhe importante sobre o return, duração a execução sempre que o compilador achar o return ele sai da função, não importa onde ele esteja, por isso ele deve ser posicionado com cuidado. Outro exemplo:

function verifica($x)
{
if($x > 0)
return 0;

else
return 1;
}

$Num = 25;

$resultado = verifica($Num);
if($resultado == 1)
echo "Numero negativo";

else
echo "Numero positivo";

O que está função faz é bem simples ela vai me dizer se um numero é positivo ou negativo. Se o numero passado para a função for maior que zero a função retorna 0 caso contrario ela returna 1, veja bem que assim que o compilador(interpretador) encontrar o return ele automaticamente sai da função e não executa mais nenhuma linha de código que a função contém depois dele.

Uma maneira mais profissional de se escrever o programa acima é:

function verifica($x)
{
if($x > 0)
return 0;

else
return 1;
}

$Num = 25;

if(verifica($Num))
echo "Numero negativo";

else
echo "Numero positivo";

O que mudou aqui foi o IF, pense, se a função vai retornar 0 ou 1 e se 0 é falso(false) e 1 é verdade(true), ele só vai entrar no IF se for verdade ou seja o o valor retornado for 1. O que você ganhou com isso? Uma variável a menos e 1 atribuição a menos, quanto menor processamento e memória seu programa usar melhor.

"3. Alguém pode me explicar o fluxo da 2ª função?"

Bom com todas essas explicações sobre função, return e argumentos, você consegue já intender o fluxo da 2ª função, de datas.

Algumas dicas.

Pesquise sobre as funções: time() e getdate()
Repare no return, $data_atual = $data["mday"]." de " .$mes. " de ".$data["year"]; podemos ver que ele está usando varios "." ex: ".$mes.", ".$data["year"], etc. Bom no que isso ajuda? Simples, " . "(ponto) em PHP serve para concatenar strings(palavras), ou seja ele está retornando uma frase aqui.

Bom o resto deixo para você, pesquise e quebre um pouco a cabeça que é o melhor jeito de se aprender =D
Espero ter ajudado, qualquer dúvida só postar.

Att,
Erick.




7. Re: Função para verificar CPF.

Hugo Sousa
goj1

(usa Debian)

Enviado em 05/03/2010 - 01:19h

Erik!

Muito obrigado pela excelente resposta!
Bom, de início estou quebrando a cabeça sim! Estou estudando PHP, e minhas próximas perguntas não serão mais "como" ou "o que é" mas sim, descreverei o que não entendi, procurarei dizer o que aprendi e no que tenho dúvida assim será mais emocionante.
Não fecharei este tópico, pois pretendo fazer dele uma sala de aula. Percebi que aqui há pessoas como você com vontade de compartilha conhecimento (afinal optamos por ser livres!). Voltarei a postar os resultados de meus estudos e dúvidas e quem sabe sugestões?!!

Um abraço e obrigado!


8. Re: Função para verificar CPF.

Sergio Teixeira - Linux User # 499126
Teixeira

(usa Linux Mint)

Enviado em 06/03/2010 - 22:08h

Gostei muito das explicações do Erik.
É importante observar que não se deve ficar preso exclusivamewnte ao conhecimento do repertório de comandos de uma linguagem. Quam procede assim não consegue programar quase nada.
A lógica é muito mais importante.
Depois dela, saber como resolver cada desafio.
Como você já deve ter percebido, existem várias formas de resolver o mesmo problema, e assim o programador deve ir-se familiarizando gradativamente com as características de cada linguagem.
Na minha época existiam os fluxogramas. Eram MUITO chatos, porém bastante úteis. As linguagens mais modernas e de alto nível permitiram que eles fossam gradativa e preguiçosamente substituídos por pseudocódigos e hoje praticamente não se fala em fluxograma.
Pseudocódigo é bem mais fácil de escrever, mas quando a porca torce o rabo (quando o grito de Eureka! não sai nem a pau), é muito bom conhecer um pouquinho de fluxogramação.
Fluxograma não é que seja difícil. Mas passar diariamente por expedientes de 8 horas fazendo fluxogramação não há cristão que aguente...
A falta de disciplina conduz a distrações que um programador não deve cometer. Ao aderir ao Clipper, eu mesmo passei a dispensar tanto fluxogtramas quanto pseudocódigos e muito embora na maioria das vezes eu ainda me saísse bem, quando dava zebra ficava muito difícil e demorado para localizar erros (principalmente aqueles mais idiotas).


9. Re: Função para verificar CPF.

Erick Gallani
ErickGallani

(usa Outra)

Enviado em 08/03/2010 - 09:47h

Agradeço os elogios, e fico muito feliz que tenha ajudado na dúvida do colega "goj1".
E concordo plenamente com o colega "Teixeira", devemos aprender sim a lógica(com enfâse aqui) de uma determinada linguagem e para isso fazemos uso dos comandos nativos para se resolver um problema if's, for's, while's, etc. Por exemplo na faculdade é muito comum um professor pedir para você fazer um pequeno programa que conte quantos caracteres tem a string "Hello Wolrd" usando for ou while com contadores, percorrendo o vetor de caracteres e contadando letra a letra e retornando(return) o contador com o número de caracteres encontrados. Não seria mais fácil simplemente usar o strlen() do C por exemplo que retorna direto o tamanho da string? Sim claro que seria, aliás é esse comando que deve ser usado para essa tarefa e não ficar fazendo for's e while's. Mais então porque meu professor insiste que eu faço isso a não? Lógica, para se programar bem deve-se exercitar a lógica, uma vez adquirida você pode fazer uso das funções pre-definidas, que facilitam muito a programação e melhoram o código.
Mais ao passo que temos um pouco de domino sobre a sintaxe, lógica e o paradigma sobre uma determinada linguagem devemos dar foco a deixar o código o mais simples, dinâmico, legível, económico e rápido possível. PHP tem milhares de funções pré-definidas(prontas) que resolvem nossos problemas.
Lembrando que é muito importante aprender a se adaptar aos diferentes paradigmas em linguagens. Por exemplo, não posso querer programar em Java (OO - Orientação a Objeto) do mesmo jeito que eu programo em C (Estruturado) são maneiras diferentes de se pensar para se resolver o mesmo problema.

Att,
Erick.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts