quinta-feira, 30 de outubro de 2014

Memchr - Pesquisando Números em Matriz


Podemos realizar uma eficiente pesquiza numa Matriz de inteiros, ou até mesmo numa matriz do tipo char,
usando esta versátil função: memchr();
cuja sintaxe é: void * memchr ( const void *, int, size_t );
Na verdade só vi um único e simples exemplo mostrando como se pesquisar um
caractere numa string pré definida num vetor de caracteres,
então resolvi adapta-lo, pra que as pesquisas possam ser feitas também numa Matriz de inteiros
e fiquei satisfeito com o rendimento do programa.
Acho que não tem método mais simples de se fazer uma pesquisa numa Matriz,
do que este apresentado neste código, teste e aproveite este ótimo programa.

Veja abaixo imagens do programa em execução:









Veja abaixo o código do programa:

#include <stdio.h>
#include <string.h>
#include <conio.h>
#define tam 10
void Janela5 ( ) {
     int lin, col;
     for ( lin = 0; lin <= 25; lin++ ) {
         for ( col = 0; col <= 80; col++ ) {
              gotoxy ( col, lin );
              if ( lin == 2 ) {
                   textbackground ( LIGHTBLUE );
                   printf ( " " );
              }
              if ( col == 1 ) {
                   textbackground ( LIGHTBLUE );
                   printf ( " " );
              }
              if ( lin == 25 ) {
                   textbackground ( LIGHTBLUE );
              }
              if ( col == 80 ) {
                   textbackground ( LIGHTBLUE );
                   printf ( " " );
              }
         }
     }
     textbackground ( BLACK );
}
void inicio ( ) {
     system ( "title MEMCHR - PESQUISANDO NÚMEROS EM MATRIZ" );
     system ( "cls" );
     int i;
     Janela5 ( );
     textbackground ( WHITE );
     textcolor ( LIGHTRED );
     gotoxy ( 23, 7 );
     printf ( "MEMCHR - PESQUISANDO NÚMEROS EM MATRIZ " );
     textcolor ( BROWN );
     gotoxy ( 25, 10 );
     printf ( "Programa desenvolvido por:" );
     textcolor ( BLACK );
     gotoxy ( 52, 10 );
     printf ( "Samuel Lima" );
     textcolor ( BLUE );
     gotoxy ( 34, 12 );
     printf ( "sa_sp10@hotmail.com" );
     textcolor ( LIGHTBLUE );
     gotoxy ( 24, 14 );
     printf ( "DIGITE    PARA SAIR OU   PARA CONTINUAR  " );
     textcolor ( LIGHTRED );
     gotoxy ( 32, 14 );
     printf ( "1" );
     textcolor ( LIGHTRED );
     gotoxy ( 47, 14 );
     printf ( "2" );
     gotoxy ( 41, 16 );
     scanf ( "%d", &i );
     fflush ( stdin );
     if ( i == 1 ) {
         textcolor ( LIGHTRED );
         gotoxy ( 35, 20 );
         printf ( "MUITO OBRIGADO" );
         Sleep ( 1800 );
         exit ( 0 );
     }
     if ( i == 2 ) {
         system ( "cls" );
         return;
     } else {
         textcolor ( LIGHTRED );
         gotoxy ( 37, 20 );
         printf ( "\aOPÇÃO ERRADA" );
         Sleep ( 1800 );
         inicio ( );
     }
}
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 ( ) {
     int *pch;
     int i, j, n;
     int Vet [ tam ] [ tam ] =
   {{36, 48, 34, 89,  25, 56,  1, 59, 12, 81 },
   { 15, 22, 65, 17,  91,  6, 11, 93, 26, 54 },
   { 85, 8,  35, 24,  39, 27, 76, 14, 21, 99 },
   { 66, 95, 87, 69, 100, 51, 20, 18, 71, 46 },
   { 33, 45, 57, 67,  80, 50,  4, 82, 83, 92 },
   { 31, 13, 94, 16,  47, 10, 61, 63, 74, 60 },
   { 5,  88, 37, 77,  23, 38, 86, 43, 72, 78 },
   { 70, 98, 73, 52,  42, 28, 68,  3, 41, 75 },
   { 58, 79, 84, 97,  64, 55,  9, 19,  7, 32 },
   { 44, 62, 90, 53,  40, 30, 96, 29,  2, 49 }};
     char num [ 3 ];
     inicio ( );
     do {
         system ( "cls" );
         Janela5 ( );
         textbackground ( WHITE );
         textcolor ( LIGHTRED );
         gotoxy ( 23, 3 );
         printf ( "MEMCHR - PESQUISANDO NÚMEROS EM MATRIZ " );
         textcolor ( LIGHTBLUE );
         gotoxy ( 29, 5 );
         printf ( "Imprimindo abaixo a Matriz " );
         textcolor ( BLACK );
         for ( i = 0; i < tam; i++ ) {
              gotoxy ( 18, i + 8 );
              for ( j = 0; j < tam; j++ ) {
                   printf ( " %3d ", Vet [ i ] [ j ] );
              }
         }
         Sleep ( 1800 );
         textcolor ( LIGHTBLUE );
         gotoxy ( 18, 19 );
         printf ( "Digite um Número pra pesquisar ou " );
         textcolor ( LIGHTRED );
         printf ( "[ -1 ] " );
         textcolor ( LIGHTBLUE );
         printf ( "Para sair " );
         textcolor ( LIGHTRED );
         gets ( num );
         fflush ( stdin );
         n = atoi ( num );
         if ( n == -1 ) {
              textcolor ( LIGHTRED );
              gotoxy ( 35, 22 );
              printf ( "MUITO OBRIGADO" );
              Sleep ( 1800 );
              exit ( 0 );
         }
         if ( n < 0 ) {
              textcolor ( LIGHTBLUE );
              gotoxy ( 25, 21 );
              printf ( "\aO Unico Negativo Valido e o " );
              textcolor ( LIGHTRED );
              printf ( "-1" );
              Sleep ( 1800 );
         }
         if ( n > 100 ) {
              textcolor ( LIGHTBLUE );
              gotoxy ( 28, 21 );
              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 ( 35, 22 );
              printf ( "\aVoce digitou " );
              textcolor ( LIGHTRED );
              printf ( "%s", num );
              Sleep ( 1800 );
              textcolor ( LIGHTBLUE );
              gotoxy ( 35, 23 );
              printf ( "\aNão foi aceito" );
              Sleep ( 1800 );
         } else {
              pch = ( int* ) memchr ( Vet, n, sizeof ( Vet ) );
              if ( pch != NULL ) {
                   textcolor ( LIGHTBLUE );
                   gotoxy ( 18, 9 );
                   for ( i = 0; i < tam; i++ ) {
                        for ( j = 0; j < tam; j++ ) {
                            if ( n == Vet [ i ] [ j ] ) {
                                 textcolor ( LIGHTBLUE );
                                 gotoxy ( 21, 21 );
                                 printf ( "O valor " );
                                 textcolor ( LIGHTRED );
                                 printf ( "%d", n );
                                 textcolor ( LIGHTBLUE );
                                 printf ( " foi encontrado na linha " );
                                 textcolor ( LIGHTRED );
                                 printf ( "%d", i );
                                 textcolor ( LIGHTBLUE );
                                 printf ( " e coluna " );
                                 textcolor ( LIGHTRED );
                                 printf ( "%d ", j );
                                 Sleep ( 1800 );
                                 textcolor ( LIGHTRED );
                                 gotoxy ( 32, 23 );
                                 printf ( "PRESSIONE QUALQUER TECLA" );
                                 getche ( );
                            }
                        }
                   }
              }
         }
     } while ( 1 );
     return 0;
}