sábado, 28 de março de 2015

Mega Sena - linguagem c

Entendendo claramente o que é variável, que  não passa de uma parte de memória onde se armazena valores de um determinado tipo,
podemos dizer que ponteiro também é uma variável que carrega um endereço de uma posição de outra variável.
Quando uma variável possui o endereço de outra, dizemos em C
que uma variável está apontando para outra.
Para declarar um ponteiro escolhemos primeiro o tipo, adequado permitido e em seguida damos um nome precedendo de um *.
Ex: tipo *nome_da_variavel;
Vale lembrar que podemos criar ponteiros para qualquer tipo aceito no C, e que são usados só dois operadores especiais, que são o * e o &.
O operador que devolve o endereço de memória é o & que é considerado um operador unário, isto é, trabalha sobre uma variável para modificar, ou manter um determinado valor.
A matriz de ponteiro static char *Mat_Mesg [ ] = {}; com a palavra reservada static declarada local, utiliza a passagem de parâmetros por valor, observe o uso do apontador e veja que uma cópia fiel
é passada para a função Sub_Titulos ( int x, char *Mat_Mesg [ ] );
De onde vem as chamadas das mensagens de interação com o usuário do programa.
Em outras funções que também receberam parâmetros forcei o uso de ponteiros, onde foram obrigatoriamente usados para um bom desempenho do programa.
A função Sorteia_Mega_Sena( int *A ); é a mais importante, é nela onde são gerados os números aleatórios dentro  de uma faixa estreita, entre 1 e 60, fiquei muitas horas empenhados nesta função porque os valores se repetiam, não foi fácil fazer isto que parece ser tão simples.
A lógica pra resolver isto foi trabalhar com estas repetições, anulando a sequência e gerando outra, isto é feito automaticamente pelo programa, e duvido que alguém perceba que houve repetições, porque tudo acontece muito rápido.
Fica bem claro que é exigido um bom conhecimento de ponteiros e alocação dinâmica para entender este código, portanto não é indicado a quem está iniciando agora.

Veja abaixo um vídeo não atualizado do programa:





Veja abaixo imagens do programa em execução:









Veja abaixo o código do programa:





#include <stdio.h>
#include <stdlib.h>
#include <conio2.h>
#include <time.h>
#define tam 60
#define T 6
/*============================================================================*/
int Moldura ( int tam_lin_ini, int tam_lin_fim, int tam_ini_col, int tam_fim_col ) {
     int i, c;
     for ( i = tam_lin_ini; i < tam_lin_fim; i++ ) {
         for ( c = tam_ini_col; c < tam_fim_col; c++ ){
              gotoxy ( c, i );
              textbackground ( WHITE );
              printf(" ");
         }
     }
     return 0;
}
/*============================================================================*/
void Informe ( ) {
     textcolor ( LIGHTBLUE );
     gotoxy ( 26, 20 );
     printf ( "Criado por: " );
     textcolor ( LIGHTMAGENTA );
     gotoxy ( 126, 20 );
     printf ( "Samuel Lima" );
     textcolor ( BLACK );
     gotoxy ( 26, 21 );
     printf ( "sa_sp10@hotmail.com" );
     textcolor ( LIGHTRED );
     gotoxy ( 36 , 24 );
     printf ( "MUITO OBRIGADO" );
}
/*============================================================================*/
int Sorteia_Mega_Sena ( int *A ) {
     int V = 6;
     int i, j, vezes;
     srand ( time ( NULL ) );
     for ( i = 0; i < T; i++ ) {
         A [ i ] = rand ( ) % 60;
     }
     for ( i = 0; i < T; i++ ) {
         vezes = 1;
         j = i + 1;
         while ( j < T )
              if ( A [ j ] != A [ i ] )
                   j++;
              else {
                   vezes++;
                   V--;
                   A [ j ] = A [ T ];
              }
         if ( vezes > 1 ) {
              return ( 0 );
         }
     }
     return ( 0 );
}
/*============================================================================*/
int Me_Ga_Se_na ( int x, int y, int Megasena [ 6 ] [ 10 ] ) {
     int **pont;
     pont = ( int** ) malloc ( 60 * sizeof(int**) );
     *pont = *Megasena;
     printf ( " %3d ", Megasena [ x ] [ y ] );
     return ( 0 );
}
/*============================================================================*/
void Sub_Titulos ( int x, char *Mat_Mesg [ ] ) {
     printf ( "%s\n", Mat_Mesg [ x ] );
}
/*============================================================================*/
int Val_Apos_tas ( int x, int Me_ga [ 10 ] ) {
     int *p_t = 0;
     p_t = Me_ga;
     printf ( "%d\n", p_t [ x ] );
     return ( 0 );
}
/*============================================================================*/
int Val_Ap_os_tas ( int x, float M_eg_a [ 5 ] ) {
     float *ptr = 0;
     ptr = M_eg_a;
     printf ( "%.5f\n", ptr [ x ] );
     return ( 0 );
}
/*============================================================================*/
int Val_Apostas ( int x, float Mega [ 5 ] ) {
     float *pt = 0;
     pt = Mega;
     printf ( "%.2f\n", pt [ x ] );
     return ( 0 );
}
/*============================================================================*/
int Meg_Sen ( char num [ 4 ] ) {
     unsigned int i;
     for ( i = 0; i < strlen ( num ); i++ ) {
         if ( num [ i ] < '0' || num [ i ] > '9' )
              return 0;
     }
     return 1;
}
/*============================================================================*/
int main ( ) {
     system ( "title PROGRAMA MEGA-SENA" );
     char num [ 4 ];
     char n_um [ 4 ];
     int Vetor [ tam ], Vet [ tam ], Vet_o_r [ tam ];
     int aut, *A, i, j, k = 0, h = 0, n = 0,
              n1 = 0, q = 0, x = 0;
     A = ( int* ) malloc ( n * sizeof ( int ) );
     static char *Mat_Mesg [ ] = {
              "PROGRAMA MEGA-SENA"                      ,//0
              "Veja abaixo os 60 números da Mega sena"  ,//1
              "Escolha quantos números deseja jogar: "  ,//2
              "Não é possível jogar menos de"           ,//3
              "números"                                 ,//4
              "Nem mais que "                           ,//5
              "num bilhete"                             ,//6
              " Você escolheu jogar"                    ,//7
              " O valor da aposta será "                ,//8
              "PRESSIONE QUALQUER TECLA"                ,//9
              "Jogue o "                                ,//10
              "Número : "                               ,//11
              "Números menores que 1 não são aceitos"   ,//12
              "Nem maiores que 60"                      ,//13
              "Você já escolheu o número "              ,//14
              "Veja abaixo os Números jogados até aqui ",//15
              "Números jogados"                         ,//16
              "Números sorteados"                       ,//17
              "Você não acertou nenhum número"          ,//18
              "Você acertou "                           ,//19
              "veja abaixo"                             ,//20
              "Você digitou: "                          ,//21
              "Isso não é um número válido !"           ,//22
              "Por:"                                    ,//23
              "Samuel Lima"                             ,//24
              "MUITO OBRIGADO"                         };//25
     int Me_ga [ 10 ] = { 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
     float Mega [ 5 ] = { 3.50, 24.50, 98.00, 294.00, 735.00 };
     float M_eg_a [ 5 ] = { 1.61700, 3.23400, 6.00600, 10.51050, 17.517500 };
     int Megasena [ 6 ] [ 10 ] =
               { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10        },
               { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 },
               { 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 },
               { 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 },
               { 41, 42, 43, 44, 45, 46, 47, 48, 49, 50 },
               { 51, 52, 53, 54, 55, 56, 57, 58, 59, 60 }};
     do {
         Moldura ( 2, 25, 3, 79 );
         textcolor ( LIGHTRED );
         gotoxy ( 33, 3 );
         Sub_Titulos ( 0, Mat_Mesg );
         textcolor ( LIGHTBLUE );
         gotoxy ( 24, 5 );
         Sub_Titulos ( 1, Mat_Mesg );
         textcolor ( BLACK );
         for ( i = 0; i < 6; i++ ) {
              gotoxy ( 16, i + 7 );
              for ( j = 0; j < 10; j++ ) {
                   Me_Ga_Se_na ( i, j, Megasena );
              }
         }
         textcolor ( LIGHTBLUE );
         gotoxy ( 24, 14 );
         Sub_Titulos ( 2, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 62, 14 );
         gets ( num );
         fflush ( stdin );
         n = atoi ( num );
         if ( Meg_Sen ( num ) == 0 ) {
              textcolor ( BLACK );
              gotoxy ( 30, 16 );
              Sub_Titulos ( 22, Mat_Mesg );
              Sleep ( 1000 );
              gotoxy ( 33, 23 );
              textcolor ( LIGHTRED );
              Sub_Titulos ( 9, Mat_Mesg );
              getche ( );
              gotoxy ( 30, 16 );
              clreol ( );
              gotoxy ( 30, 17 );
              clreol ( );
              gotoxy ( 61, 14 );
              clreol ( );
              gotoxy ( 30, 19 );
              clreol ( );
              //erro = 0;
              continue;
         }
         if ( n < Me_ga [ 0 ] || n > Me_ga [ 9 ] ) {
              textcolor ( LIGHTBLUE );
              gotoxy ( 24, 16 );
              Sub_Titulos ( 3, Mat_Mesg );
              textcolor ( LIGHTRED );
              gotoxy ( 53, 16 );
              printf ( " %d", Me_ga [ 0 ] );
              textcolor ( LIGHTBLUE );
              gotoxy ( 56, 16 );
              Sub_Titulos ( 4, Mat_Mesg );
              textcolor ( LIGHTBLUE );
              gotoxy ( 24, 17 );
              Sub_Titulos ( 5, Mat_Mesg );
              textcolor ( LIGHTRED );
              gotoxy ( 37, 17 );
              printf ( "%d", Me_ga [ 9 ] );
              textcolor ( LIGHTBLUE );
              gotoxy ( 40, 17 );
              Sub_Titulos ( 6, Mat_Mesg );
              Sleep ( 1000 );
              gotoxy ( 30, 23 );
              textcolor ( LIGHTRED );
              Sub_Titulos ( 9, Mat_Mesg );
              getche ( );
         }
     } while ( ( n < Me_ga [ 0 ] ) || ( n > Me_ga [ 9 ] ) );
     if ( n == Me_ga [ 0 ] ) {
         textcolor ( LIGHTBLUE );
         gotoxy ( 12, 16 );
         Sub_Titulos ( 7, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 33, 16 );
         Val_Apos_tas ( 0, Me_ga );
         textcolor ( LIGHTBLUE );
         gotoxy ( 36, 16 );
         Sub_Titulos ( 4, Mat_Mesg );
         gotoxy ( 12, 17 );
         Sub_Titulos ( 8, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 36, 17 );
         Val_Apostas ( 0, Mega );
     }
     if ( n == Me_ga [ 1 ] ) {
         textcolor ( LIGHTBLUE );
         gotoxy ( 12, 16 );
         Sub_Titulos ( 7, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 33, 16 );
         Val_Apos_tas ( 1, Me_ga );
         textcolor ( LIGHTBLUE );
         gotoxy ( 36, 16 );
         Sub_Titulos ( 4, Mat_Mesg );
         gotoxy ( 12, 17 );
         Sub_Titulos ( 8, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 36, 17 );
         Val_Apostas ( 1, Mega );
     }
     if ( n == Me_ga [ 2 ] ) {
         textcolor ( LIGHTBLUE );
         gotoxy ( 12, 16 );
         Sub_Titulos ( 7, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 33, 16 );
         Val_Apos_tas ( 2, Me_ga );
         textcolor ( LIGHTBLUE );
         gotoxy ( 36, 16 );
         Sub_Titulos ( 4, Mat_Mesg );
         gotoxy ( 12, 17 );
         Sub_Titulos ( 8, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 36, 17 );
         Val_Apostas ( 2, Mega );
     }
     if ( n == Me_ga [ 3 ] ) {
         textcolor ( LIGHTBLUE );
         gotoxy ( 12, 16 );
         Sub_Titulos ( 7, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 33, 16 );
         Val_Apos_tas ( 3, Me_ga );
         textcolor ( LIGHTBLUE );
         gotoxy ( 36, 16 );
         Sub_Titulos ( 4, Mat_Mesg );
         gotoxy ( 12, 17 );
         Sub_Titulos ( 8, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 36, 17 );
         Val_Apostas ( 3, Mega );
     }
     if ( n == Me_ga [ 4 ] ) {
         textcolor ( LIGHTBLUE );
         gotoxy ( 12, 16 );
         Sub_Titulos ( 7, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 33, 16 );
         Val_Apos_tas ( 4, Me_ga );
         textcolor ( LIGHTBLUE );
         gotoxy ( 36, 16 );
         Sub_Titulos ( 4, Mat_Mesg );
         gotoxy ( 12, 17 );
         Sub_Titulos ( 8, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 36, 17 );
         Val_Apostas ( 4, Mega );
     }
     if ( n == Me_ga [ 5 ] ) {
         textcolor ( LIGHTBLUE );
         gotoxy ( 12, 16 );
         Sub_Titulos ( 7, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 33, 16 );
         Val_Apos_tas ( 5, Me_ga );
         textcolor ( LIGHTBLUE );
         gotoxy ( 36, 16 );
         Sub_Titulos ( 4, Mat_Mesg );
         gotoxy ( 12, 17 );
         Sub_Titulos ( 8, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 36, 17 );
         Val_Ap_os_tas ( 0, M_eg_a );
     }
     if ( n == Me_ga [ 6 ] ) {
         textcolor ( LIGHTBLUE );
         gotoxy ( 12, 16 );
         Sub_Titulos ( 7, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 33, 16 );
         Val_Apos_tas ( 6, Me_ga );
         textcolor ( LIGHTBLUE );
         gotoxy ( 36, 16 );
         Sub_Titulos ( 4, Mat_Mesg );
         gotoxy ( 12, 17 );
         Sub_Titulos ( 8, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 36, 17 );
         Val_Ap_os_tas ( 1, M_eg_a );
     }
     if ( n == Me_ga [ 7 ] ) {
         textcolor ( LIGHTBLUE );
         gotoxy ( 12, 16 );
         Sub_Titulos ( 7, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 33, 16 );
         Val_Apos_tas ( 7, Me_ga );
         textcolor ( LIGHTBLUE );
         gotoxy ( 36, 16 );
         Sub_Titulos ( 4, Mat_Mesg );
         gotoxy ( 12, 17 );
         Sub_Titulos ( 8, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 36, 17 );
         Val_Ap_os_tas ( 2, M_eg_a );
     }
     if ( n == Me_ga [ 8 ] ) {
         textcolor ( LIGHTBLUE );
         gotoxy ( 12, 16 );
         Sub_Titulos ( 7, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 33, 16 );
         Val_Apos_tas ( 8, Me_ga );
         textcolor ( LIGHTBLUE );
         gotoxy ( 36, 16 );
         Sub_Titulos ( 4, Mat_Mesg );
         gotoxy ( 12, 17 );
         Sub_Titulos ( 8, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 36, 17 );
         Val_Ap_os_tas ( 3, M_eg_a );
     }
     if ( n == Me_ga [ 9 ] ) {
         textcolor ( LIGHTBLUE );
         gotoxy ( 12, 16 );
         Sub_Titulos ( 7, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 33, 16 );
         Val_Apos_tas ( 9, Me_ga );
         textcolor ( LIGHTBLUE );
         gotoxy ( 36, 16 );
         Sub_Titulos ( 4, Mat_Mesg );
         gotoxy ( 12, 17 );
         Sub_Titulos ( 8, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 36, 17 );
         Val_Ap_os_tas ( 4, M_eg_a );
     }
     Sleep ( 1000 );
     gotoxy ( 30, 23 );
     textcolor ( LIGHTRED );
     Sub_Titulos ( 9, Mat_Mesg );
     getche ( );
     for ( i = 0; i < n; i++ ) {
         do {
              do {
                   Moldura ( 2, 25, 3, 79 );
                   textcolor ( LIGHTRED );
                   gotoxy ( 33, 3 );
                   Sub_Titulos ( 0, Mat_Mesg );
                   textcolor ( LIGHTBLUE );
                   gotoxy ( 32, 5 );
                   Sub_Titulos ( 10, Mat_Mesg );
                   textcolor ( LIGHTRED );
                   gotoxy ( 40, 5 );
                   printf ( "%do", i + 1 );
                   textcolor ( LIGHTBLUE );
                   gotoxy ( 44, 5 );
                   Sub_Titulos ( 4, Mat_Mesg );
                   textcolor ( LIGHTRED );
                   gotoxy ( 53, 5 );
                   gets ( n_um );
                   fflush ( stdin );
                   n1 = atoi ( n_um );
                   if ( Meg_Sen ( n_um ) == 0 ) {
                        textcolor ( BLACK );
                        gotoxy ( 30, 16 );
                        Sub_Titulos ( 22, Mat_Mesg );
                        textcolor ( BLACK );
                        Sleep ( 1000 );
                        gotoxy ( 30, 23 );
                        textcolor ( LIGHTRED );
                        Sub_Titulos ( 9, Mat_Mesg );
                        getche ( );
                        gotoxy ( 30, 12 );
                        clreol ( );
                        gotoxy ( 30, 13 );
                        clreol ( );
                        gotoxy ( 53, 5 );
                        clreol ( );
                        gotoxy ( 30, 19 );
                        clreol ( );
                        continue;
                   }
                   if ( n1 < 1 || n1 > 60 ) {
                        textcolor ( LIGHTBLUE );
                        gotoxy ( 24, 7 );
                        Sub_Titulos ( 12, Mat_Mesg );
                        textcolor ( LIGHTBLUE );
                        gotoxy ( 24, 8 );
                        Sub_Titulos ( 13, Mat_Mesg );
                        gotoxy ( 30, 23 );
                        textcolor ( LIGHTRED );
                        Sub_Titulos ( 9, Mat_Mesg );
                        getche ( );
                        continue;
                   }
              } while ( ( n1 < 1 ) || ( n1 > 60 ) );
              aut = 0;
              for ( j = 0; j < n; j++ )
                   if ( n1 == A [ j ] )
                        aut = 1;
              if ( aut == 0 ) {
                   A [ i ] = n1;
                   Vetor [ x ] = A [ i ];
                   x++;
              } else {
                   textcolor ( LIGHTBLUE );
                   gotoxy ( 22, 7 );
                   Sub_Titulos ( 14, Mat_Mesg );
                   textcolor ( LIGHTRED );
                   gotoxy ( 47, 7 );
                   printf ( " %d", n1 );
                   textcolor ( LIGHTBLUE );
                   gotoxy ( 22, 9 );
                   Sub_Titulos ( 15, Mat_Mesg );
                   k = x;
                   textcolor ( LIGHTRED );
                   gotoxy ( 22, 11 );
                   for ( x = 0; x < k; x++ )
                        printf ( " %i ", Vetor [ x ] );
                   textcolor ( LIGHTRED );
                   gotoxy ( 32, 23 );
                   Sub_Titulos ( 9, Mat_Mesg );
                   getche ( );
              }
         } while ( aut == 1 );
     }
     textcolor ( LIGHTBLUE );
     gotoxy ( 22, 7 );
     Sub_Titulos ( 16, Mat_Mesg );
     textcolor ( LIGHTRED );
     gotoxy ( 22, 9 );
     for ( i = 0; i < n; i++ ) {
         printf ( " %d ", A [ i ] );
         Vet_o_r [ q ] = A [ i ];
         q++;
     }
     Sleep ( 800 );
     Sorteia_Mega_Sena ( A );
     textcolor ( LIGHTBLUE );
     gotoxy ( 22, 11 );
     Sub_Titulos ( 17, Mat_Mesg );
     textcolor ( LIGHTRED );
     gotoxy ( 22, 13 );
     for ( i = 0; i < T; i++ ) {
         printf ( " %d ", A [ i ] + 1 );
     }
     Sleep ( 800 );
     for ( i = 0; i < n; i++ ) {
         for ( q = 0; q < n; q++ ) {
              if ( A [ i ] + 1 == Vet_o_r [ q ] ) {
                   Vet [ h ] = Vet_o_r [ q ];
                   h++;
              }
         }
     }
     k = h;
     if ( k == 0 ) {
         textcolor ( BLACK );
         gotoxy ( 23, 15 );
         Sub_Titulos ( 18, Mat_Mesg );
         Sleep ( 1800 );
         Informe ( );
         textcolor ( WHITE );
         gotoxy ( 35, 23 );
         Sub_Titulos ( 19, Mat_Mesg );
         Sleep ( 800 );
         getche ( );
         exit ( 0 );
     }
     if ( k == h ) {
         textcolor ( LIGHTBLUE );
         gotoxy ( 22, 15 );
         Sub_Titulos ( 19, Mat_Mesg );
         textcolor ( LIGHTRED );
         gotoxy ( 35, 15 );
         printf ( "%d", k );
         textcolor ( LIGHTBLUE );
         gotoxy ( 38, 15 );
         Sub_Titulos ( 4, Mat_Mesg );
         textcolor ( LIGHTBLUE );
         gotoxy ( 46, 15 );
         Sub_Titulos ( 20, Mat_Mesg );
     }
     textcolor ( LIGHTRED );
     gotoxy ( 22, 17 );
     for ( h = 0; h < k; h++ )
         printf ( " %i ", Vet [ h ] );
     Sleep ( 1800 );
     textcolor ( LIGHTRED );
     gotoxy ( 35, 21 );
     Sub_Titulos ( 23, Mat_Mesg );
     textcolor ( BLACK );
     gotoxy ( 41, 21 );
     Sub_Titulos ( 24, Mat_Mesg );
     textcolor ( LIGHTRED );
     gotoxy ( 35, 23 );
     Sub_Titulos ( 25, Mat_Mesg );
     getche ( );
     free ( A );
     return ( 0 );
}
/*============================================================================*/