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:
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:
#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 );
}
/*============================================================================*/
Nenhum comentário:
Postar um comentário
Observação: somente um membro deste blog pode postar um comentário.