#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
main()
{
   inicio:
   system("cls");
   fflush(stdin);
   int numero[11],soma1,soma2,i,erro,aux;
   int parte1,parte2,parte3,dig1,opc,invalido=0;
   int parte5,parte6,parte7,dig2;
   char cpf[11],resp;
   printf("*==================================================================*\n");
   printf("|___________________ VALIDADOR DE CPF's V. 1.0 ____________________|\n");
   printf("|                                                                  |\n");
   printf("|     Autor: Thiago C. Serrilho                                    |\n");
   printf("|     E-mail: webserrilho@gmail.com                                |\n");
   printf("|     3o. Semestre - Licenciatura em Computacao                    |\n");
   printf("|     Disciplina: Linguagem de Programacao I                       |\n");
   printf("|     Prof. Carlos Acacio                                          |\n");
   printf("*==================================================================*\n\n");
   printf("*========================================*\n");
   printf("|       O que voce deseja fazer?         |\n");
   printf("*----------------------------------------*\n");
   printf("| 1 - Descobrir os digitos verificadores |\n");
   printf("| 2 - Verificar a validade de um CPF     |\n");
   printf("| 3 - Finaliza o programa                |\n");
   printf("*========================================*\n");
   erro=0;
   do
   {
      erro++;
      if(erro>1)
      {
         printf("Erro: Opcao invalida!\n");
         erro=1;
      }
      printf("Informe a sua opcao: ");
      scanf("%d",&opc); fflush(stdin);
   }while(opc>3 || opc<1);
   printf("*==================================================================*\n");
   switch(opc)
   {
      case 1:
      {
         //*==========================================*
         //|        Leitura dos numeros do CPF        |
         //*==========================================*
         printf("Digite os 9 numeros do CPF: ",i);
         for(i=1;i<=9;i++)
         {
            if(i-1==3)printf(".");
            if(i-1==6)printf(".");
            cpf[i]=getche();
            aux=atoi (cpf);
            numero[i]=aux;
            cpf[i]=' '; 
         }
         break;
      }
      case 2:
      {
         //*==========================================*
         //|        Leitura dos numeros do CPF        |
         //*==========================================*
         printf("Digite os 11 numeros do CPF: ");
         for(i=1;i<= 11;i++)
         {
            if(i-1==3) printf(".");
            if(i-1==6) printf(".");
            if(i-1==9) printf("-");
            cpf[i]=getche();
            numero[i]=atoi (cpf);
            cpf[i]=' '; 
         }
         break;
      }
      case 3:
      {
         printf("Deseja continuar no programa (s/n)? ");
         scanf("%s",&resp);
         if((resp=='n') || (resp=='N')) goto fim;
         else goto inicio;
      }
   }
   //*=========================================*
   //|       Primeiro digito verificador       |
   //*=========================================*
   soma1=((numero[1]*10)+
         (numero[2]*9)+
         (numero[3]*8)+
         (numero[4]*7)+
         (numero[5]*6)+
         (numero[6]*5)+
         (numero[7]*4)+
         (numero[8]*3)+
         (numero[9]*2));
   parte1=int(soma1 / 11);
   parte2=(parte1 * 11);
   parte3=(soma1 - parte2);
   dig1=(11 - parte3);
   if(dig1>9)dig1=0;
   if(opc==1)
   {
      printf("\n*==================================================================*\n");
      printf("Primeiro digito: %d\n",dig1);
   }
   else
   printf("\n*==================================================================*\n");
   //*=========================================*
   //|       Segundo digito verificador        |
   //*=========================================*
   soma2=((numero[1]*11)+
         (numero[2]*10)+
         (numero[3]*9)+
         (numero[4]*8)+
         (numero[5]*7)+
         (numero[6]*6)+
         (numero[7]*5)+
         (numero[8]*4)+
         (numero[9]*3)+
         (dig1*2));
   parte5=int(soma2 / 11);
   parte6=(parte5 * 11);
   parte7=(soma2 - parte6);
   dig2=(11 - parte7);
   if(dig2>9)dig2=0;
   if(opc==1)
   {
      printf("Segundo digito.: %d\n",dig2);
      printf("*==================================================================*\n");
   }
   //*==========================================*
   //|       Impressao do numero completo       | 
   //*==========================================*
   printf("Numero completo do CPF\n");
   for(i=1;i<=9;i++)
   {
      printf("%d",numero[i]);//numeros do CPF
      if(i-1==2) printf(".");
      if(i-1==5) printf(".");
   }
   if(opc==1)
   printf("-%d%d\n",dig1,dig2);//dois últimos digitos
   if(opc==2)
   {
      if(dig1==numero[10] && dig2==numero[11])
      {
         printf("-%d%d\n",numero[10],numero[11]);
         if(opc==1)
         printf("Numero de CPF valido\n");
      }
      else
      {
         printf("-%d%d\n",numero[10],numero[11]);
         invalido++;
      }
   }
   //*============================================================================================================================================*
   //|     Invalida numeros de CPF com todos os digitos iguais Ex: 111.111.111-11                                                                 |
   //*============================================================================================================================================*
        if(numero[1]==1 && numero[2]==1 && numero[3]==1 && numero[4]==1 && numero[5]==1 && numero[6]==1 && numero[7]==1 && numero[8]==1 && numero[9]==1)
   printf("Erro: Numero de CPF invalido!\n",invalido++); 
   else if(numero[1]==2 && numero[2]==2 && numero[3]==2 && numero[4]==2 && numero[5]==2 && numero[6]==2 && numero[7]==2 && numero[8]==2 && numero[9]==2)
   printf("Erro: Numero de CPF invalido!\n",invalido++);
   else if(numero[1]==3 && numero[2]==3 && numero[3]==3 && numero[4]==3 && numero[5]==3 && numero[6]==3 && numero[7]==3 && numero[8]==3 && numero[9]==3)
   printf("Erro: Numero de CPF invalido!\n",invalido++);
   else if(numero[1]==4 && numero[2]==4 && numero[3]==4 && numero[4]==4 && numero[5]==4 && numero[6]==4 && numero[7]==4 && numero[8]==4 && numero[9]==4)
   printf("Erro: Numero de CPF invalido!\n",invalido++);
   else if(numero[1]==5 && numero[2]==5 && numero[3]==5 && numero[4]==5 && numero[5]==5 && numero[6]==5 && numero[7]==5 && numero[8]==5 && numero[9]==5)
   printf("Erro: Numero de CPF invalido!\n",invalido++);
   else if(numero[1]==6 && numero[2]==6 && numero[3]==6 && numero[4]==6 && numero[5]==6 && numero[6]==6 && numero[7]==6 && numero[8]==6 && numero[9]==6)
   printf("Erro: Numero de CPF invalido!\n",invalido++);
   else if(numero[1]==7 && numero[2]==7 && numero[3]==7 && numero[4]==7 && numero[5]==7 && numero[6]==7 && numero[7]==7 && numero[8]==7 && numero[9]==7)
   printf("Erro: Numero de CPF invalido!\n",invalido++);
   else if(numero[1]==8 && numero[2]==8 && numero[3]==8 && numero[4]==8 && numero[5]==8 && numero[6]==8 && numero[7]==8 && numero[8]==8 && numero[9]==8)
   printf("Erro: Numero de CPF invalido!\n",invalido++);
   else if(numero[1]==9 && numero[2]==9 && numero[3]==9 && numero[4]==9 && numero[5]==9 && numero[6]==9 && numero[7]==9 && numero[8]==9 && numero[9]==9)
   printf("Erro: Numero de CPF invalido!\n",invalido++);
   else if(numero[1]==0 && numero[2]==0 && numero[3]==0 && numero[4]==0 && numero[5]==0 && numero[6]==0 && numero[7]==0 && numero[8]==0 && numero[9]==0)
   printf("Erro: Numero de CPF invalido!\n",invalido++);

   if(opc==2 && invalido<1)
   printf("Numero de CPF valido\n");
   //else if(opc==1 && invalido<1)
   //printf("CPF Valido\n");
   if(opc==2 && invalido>=21)
   printf("Numero de CPF invalido\n");
   if(invalido<1)
   {
      //========================================================================*
      //|   Diz os estados onde o CPF foi emitido baseado no 9º digito do CPF   |
      //========================================================================*
      printf("*==================================================================*\n");
      printf("Informacao adicional:\n");
      if(numero[9]==0) printf("CPF emitido no estado do RS\n");
      if(numero[9]==1) printf("CPF emitido em um desses estados: DF-GO-MS-MT-TO\n");
      if(numero[9]==2) printf("CPF emitido em um desses estados: AC-AM-AP-PA-RO-RR\n");
      if(numero[9]==3) printf("CPF emitido em um desses estados: CE-MA-PI\n");
      if(numero[9]==4) printf("CPF emitido em um desses estados: AL-PB-PE-RN\n");
      if(numero[9]==5) printf("CPF emitido em um desses estados: BA-SE\n");
      if(numero[9]==6) printf("CPF emitido no estado de MG\n");
      if(numero[9]==7) printf("CPF emitido em um desses estados: ES-RJ\n");
      if(numero[9]==8) printf("CPF emitido no estado de SP\n");
      if(numero[9]==9) printf("CPF emitido em um desses estados: PR-SC\n");
   }
   printf("*==================================================================*\n");
   printf("Pressione \"enter\" para continuar...");
   getchar();
   goto inicio;
   fim:;
}