quarta-feira, 6 de abril de 2016

Matriz - preenchimento sem repetição

Graças aos ponteiros podemos obter tudo o que precisamos para
alocar memória dinâmicamente, isto é em tempo de execução.
O sistema de alocação dinâmica do C é soberbo e flexível, tendo
como ponto negativo a necessidade do programador alocar e desalocar
manualmente.
É bem importante lembrar que variáveis locais usam a pilha,
e as globais trabalham num armazenamento alocado em tempo de compilação,
Observe então o quanto é útil e seguro contar memórias em tempo de execução,
porque vai chegar o momento em que você futuro programador
escreverá um programa em que precisará usar armazenamento variáveis.
Quando uma função usa memória alocada dinâmicamente o C recorre ao
heap, que é a região de memória livre que está entre o programa em execução
 e a área de armazenagem efetiva e a pilha.
Não consigo saber o tamanho do heap, más posso imaginar que
seja  grande o suficiente para atender estes casos.
Não quero estender ainda mais esta breve descrição sobre alocação
más recomendo sobre tudo que se empenhem a aprender o funcionamento
das muitas funções de alocação dinâmica do C.

Para esclarecer na prática como alocar memória dinamicamente em C,
apresento este excelente exemplo de uma matriz onde será preenchida
sem que um número se quer se repita.
A função got_color ( ); usa seis parâmetros, e foi criada para
mostrar uma moldura na tela do dos, com côr de frente e fundo.
Os números inseridos pela entrada de dados são copiados no vetor
dinâmico *vx, que por sua vez recebe cada número contido na variável
inteira h, onde h recebe da matriz dinâmica cada algarismo recebido pela entrada de dados.
Esta é a lógica do programa, *vx memoriza os números digitados
e se o usuário digitar um número repetido será rejeitado com certeza.


Veja abaixo imagens do programa em execução:



Veja abaixo o código do programa:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define l 3
#define c 3
#define tam 9
void got_color ( int tam_lin_ini , int tam_lin_fim , int tam_ini_col ,
         int tam_fim_col , int a , int b ) {
     int i, e;
     if ( a >= 1 && a <= 16 ) {
         textcolor ( a );
     }
     if ( b >= 1 && b <= 16 ) {
         textbackground ( b );
     }
     for ( i = tam_lin_ini; i < tam_lin_fim ; i++ ) {
         for ( e = tam_ini_col; e < tam_fim_col ; e++ ) {
              gotoxy ( e , i );
              printf ( " " );
         }
     }
}
int main ( ) {
     system ( "title MATRIZ - PREENCHIMENTO SEM REPETIÇÃO" );
     int aut, h = 0, x = 0, y = 0;
     int *vx;
     vx = ( int* ) malloc ( tam * sizeof(int) );
     int a = 0;
     int i, j;
     int **M;
     M = ( int** ) malloc ( 9 * sizeof(int**) );
     for ( i = 0; i < l ; i++ ) {
         M [ i ] = ( int* ) malloc ( 9 * sizeof(int*) );
         for ( j = 0; j < c ; j++ ) {
              do {
                   got_color ( 2 , 25 , 3 , 79 , 2 , 15 ); //Moldura
                   gotoxy ( 25 , 3 );
                   textcolor ( LIGHTRED );
                   printf ( "MATRIZ - PREENCHIMENTO SEM REPETIÇÃO" );
                   textcolor ( LIGHTBLUE );
                   gotoxy ( 15 , 5 );
                   printf ( "Digite um número para a Posição" );
                   textcolor ( LIGHTRED );
                   printf ( " [ %d ] [ %d ]" , i + 0 , j + 0 );
                   textcolor ( BLACK );
                   gotoxy ( 59 , 5 );
                   scanf ( "%d" , &M [ i ] [ j ] );
                   h = M [ i ] [ j ];
                   aut = 0;
                   for ( a = 0; a < 9 ; a++ )
                        if ( h == vx [ a ] )
                            aut = 1;
                   if ( aut == 0 ) {
                        vx [ x ] = h;
                        x++;
                   } else {
                        textcolor ( LIGHTBLUE );
                        gotoxy ( 22 , 9 );
                        printf ( "Número já digitado veja abaixo:" );
                        y = x;
                        textcolor ( LIGHTRED );
                        gotoxy ( 22 , 11 );
                        for ( x = 0; x < y ; x++ )
                            printf ( " %i " , vx [ x ] );
                        textcolor ( LIGHTRED );
                        gotoxy ( 30 , 23 );
                        printf ( "PRESSIONE QUALQUER TECLA" );
                        getche ( );
                        gotoxy ( 34 , 9 );
                        clreol ( );
                        gotoxy ( 30 , 23 );
                        clreol ( );
                   }
              } while ( aut == 1 );
         }
     }
     textcolor ( LIGHTBLUE );
     gotoxy ( 22 , 7 );
     printf ( "Veja abaixo a matriz preenchida" );
     textcolor ( BLACK );
     for ( i = 0; i < l ; i++ ) {
         gotoxy ( 35 , i + 9 );
         for ( j = 0; j < c ; j++ ) {
              printf ( "%3d" , M [ i ] [ j ] );
         }
     }
     Sleep ( 1800 );
     textcolor ( LIGHTBLUE );
     gotoxy ( 26 , 15 );
     printf ( "Por: " );
     textbackground ( WHITE );
     printf ( "Samuel Lima" );
     textcolor ( BLACK );
     gotoxy ( 26 , 16 );
     printf ( "sa_sp10@hotmail.com" );
     Sleep ( 1800 );
     textcolor ( LIGHTRED );
     gotoxy ( 37 , 23 );
     printf ( "MUITO OBRIGADO" );
     Sleep ( 2800 );
     getche ( );
     free ( vx );
     free ( M );
     return 0;
}

Nenhum comentário:

Postar um comentário

Observação: somente um membro deste blog pode postar um comentário.