quinta-feira, 26 de fevereiro de 2015

Matriz tridimensional dinâmica

Matriz pode ser definida como uma variável capaz de guardar diversos valores
porém do mesmo tipo.Matrizes estáticas são sem dúvidas mais fácil de usar e de entender, más se você não especificar o tamanho correto, provavelmente haverá
desperdício de memória, e isto num computador de pouca memória pode ser um problema. Quando não sabemos o tamanho de que precisamos recorremos a uma alocação dinâmica, que recebe memória do computador em tempo de execução, ao contrário de variáveis globais que são alocadas na hora da compilação, ou locais que usam a pilha.
Quando alocamos memória dinamicamente usando as funções do C, ela é obtida de áreas de memórias livres que se encontra na armazenagem real do computador, e a pilha.
Neste código aloquei memória usando a função malloc(); e liberei com free();
ambas da biblioteca stdlib.h, más o C possui outras funções de alocação dinâmica, porém para a demonstração deste exemplo não se fez necessárias.
A matriz é preenchida por um contador com laço for(); e a finalidade destes vários ifs(); com
gotoxy(); é de organizar a saída no vídeo dentro da moldura.

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 tam 4
void Moldura ( int a, int c, int b, int d, int e, int f ) {
         system ( "Color 10" );
     for ( a = e; a < c; a++ ) {
         for ( b = f; b < d; b++ ) {
              gotoxy ( b, a );
              textbackground ( WHITE );
              printf ( " " );
         }
     }
}
int Imp_Matr ( char *num ) {
     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 MATRIZ TRIDIMENSIONAL DINÂMICA" );
     do {
         system ( "cls" );
         Moldura ( 2, 28, 2, 79, 2, 3 );
         int ***M, i, j, l, n, cont = 0;
         char num [ 3 ];
         M = ( int*** ) malloc ( tam * sizeof(int**) );
         textcolor ( LIGHTRED );
         gotoxy ( 36, 5 );
         printf ( "MATRIZ TRIDIMENSIONAL DINÂMICA" );
         textcolor ( WHITE );
         gotoxy ( 5, 5 );
         int a = 15;
         int b = 20;
         int c = 25;
         textcolor ( BLACK );
         for ( i = 0; i < tam; i++ ) {
              M [ i ] = ( int** ) malloc ( tam * sizeof(int*) );
              for ( j = 0; j < tam; j++ ) {
                   M [ i ] [ j ] = ( int* ) malloc ( tam * sizeof(int) );
                   for ( l = 0; l < tam; l++ ) {
                        cont++;
                        M [ i ] [ j ] [ l ] = cont;
                        printf ( "%5d", M [ i ] [ j ] [ l ] );
                        if ( M [ i ] [ j ] [ l ] == 4 )
                            gotoxy ( 5, i + 6 );
                        if ( M [ i ] [ j ] [ l ] == 8 )
                            gotoxy ( 5, i + 7 );
                        if ( M [ i ] [ j ] [ l ] == 12 )
                            gotoxy ( 5, i + 8 );
                        if ( M [ i ] [ j ] [ l ] == 16 )
                            gotoxy ( 5, i + 10 );
                        if ( M [ i ] [ j ] [ l ] == 20 )
                            gotoxy ( 5, a - 4 );
                        if ( M [ i ] [ j ] [ l ] == 24 )
                            gotoxy ( 5, i + 11 );
                        if ( M [ i ] [ j ] [ l ] == 28 )
                            gotoxy ( 5, i + 12 );
                        if ( M [ i ] [ j ] [ l ] == 32 )
                            gotoxy ( 5, b - 5 );
                        if ( M [ i ] [ j ] [ l ] == 36 )
                            gotoxy ( 5, i + 14 );
                        if ( M [ i ] [ j ] [ l ] == 40 )
                            gotoxy ( 5, i + 15 );
                        if ( M [ i ] [ j ] [ l ] == 44 )
                            gotoxy ( 5, i + 16 );
                        if ( M [ i ] [ j ] [ l ] == 48 )
                            gotoxy ( 5, c - 5 );
                        if ( M [ i ] [ j ] [ l ] == 52 )
                            gotoxy ( 5, i + 18 );
                        if ( M [ i ] [ j ] [ l ] == 56 )
                            gotoxy ( 5, i + 19 );
                        if ( M [ i ] [ j ] [ l ] == 60 )
                            gotoxy ( 5, i + 20 );
                   }
              }
         }
         textcolor ( LIGHTBLUE );
         gotoxy ( 36, 8 );
         printf ( "Digite um Número " );
         printf ( "para pesquisar " );
         gotoxy ( 36, 9 );
         printf ( "ou [ -1 ] para sair " );
         textcolor ( LIGHTRED );
         gets ( num );
         fflush ( stdin );
         n = atoi ( num );
        if ( n == -1 ) {
              textcolor ( LIGHTBLUE );
              gotoxy ( 37, 22 );
              printf ( "Por: " );
              textcolor ( LIGHTMAGENTA );
              printf ( "Samuel Lima" );
              textcolor ( BLACK );
              gotoxy ( 37, 23 );
              printf ( "sa_sp10@hotmail.com" );
              Sleep ( 1800 );
              textcolor ( LIGHTRED );
              gotoxy ( 37, 25 );
              printf ( "MUITO OBRIGADO" );
              getche ( );
              exit ( 0 );
         }
         if ( n < 0 ) {
              textcolor ( LIGHTBLUE );
              gotoxy ( 36, 10 );
              printf ( "\aO único negativo válido é o " );
              textcolor ( LIGHTRED );
              printf ( "-1" );
              Sleep ( 1800 );
         }
         if ( n > 64 ) {
              textcolor ( LIGHTBLUE );
              gotoxy ( 36, 12 );
              printf ( "\aO número " );
              textcolor ( LIGHTRED );
              printf ( "%d", n );
              textcolor ( LIGHTBLUE );
              printf ( " não existe na Matriz" );
              Sleep ( 1800 );
              system ( "cls" );
         }
         if ( Imp_Matr ( num ) == 0 || n == 0 ) {
              textcolor ( LIGHTBLUE );
              gotoxy ( 36, 12 );
              printf ( "\aVocê digitou " );
              textcolor ( LIGHTRED );
              printf ( "%s", num );
              Sleep ( 1800 );
              textcolor ( LIGHTBLUE );
              gotoxy ( 36, 13 );
              printf ( "\aNão foi aceito" );
              Sleep ( 1800 );
         } else {
              textcolor ( LIGHTBLUE );
              gotoxy ( 18, 9 );
              for ( i = 0; i < tam; i++ ) {
                   for ( j = 0; j < tam; j++ ) {
                        for ( l = 0; l < tam; l++ ) {
                            if ( n == M [ i ] [ j ] [ l ] ) {
                                 textcolor ( LIGHTBLUE );
                                 textcolor ( LIGHTBLUE );
                                 gotoxy ( 36, 12 );
                                 printf ( "O valor " );
                                 textcolor ( LIGHTRED );
                                 printf ( "%d", n );
                                 textcolor ( LIGHTBLUE );
                                 printf ( " foi encontrado na tabela " );
                                 textcolor ( LIGHTRED );
                                 printf ( "%d", i );
                                 textcolor ( LIGHTBLUE );
                                 gotoxy ( 36, 13 );
                                 printf ( "e linha " );
                                 textcolor ( LIGHTRED );
                                 printf ( "%d ", j );
                                 textcolor ( LIGHTBLUE );
                                 printf ( " e coluna " );
                                 textcolor ( LIGHTRED );
                                 printf ( "%d ", l );
                                 Sleep ( 1800 );
                                 textcolor ( LIGHTRED );
                                 gotoxy ( 33, 26 );
                                 printf ( "PRESSIONE QUALQUER TECLA" );
                                 getche ( );
                                 free ( M );
                            }
                        }
                   }
              }
         }
     } while ( 1 );
     return 0;
}