1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

comparação de matrizes em c

Discussão em 'Programação' iniciada por SanGokA, 7 de Novembro de 2008. (Respostas: 8; Visualizações: 4626)

  1. SanGokA

    SanGokA Power Member

    oi...estou a fazer um trabalho para a universidade e cheguei a um ponto no trabalho onde tenho que comparar uma matriz de [3][3] com uma de [50][80], e dizer quantas vezes a matriz de [3][3] aparece... o meu problema está a ser a comparação.... se alguém puder ajuda sff....obrigado...
     
  2. Olá SanGokA,

    Acho que você pode fazer uma pesquisa na Internet com o tema: "busca de padrões" ou "comparação de strings".
    Também seria bom tentar encontrar o código fonte da função STRCMP.
    Nesses casos, a comparação é entre vetores.
    Para fazer a comparação entre matrizes seria necessário algumas modificações.

    []'s.

    ---------------------------------------------
    Boa sorte a todos nós!
    Computação não é Ciência é Magia!!!
    :205:
    ---------------------------------------------
     
  3. dreamerboy

    dreamerboy Power Member

    Uma pergunta:

    Que tipo de elementos a matriz tem? inteiros, boleanos, caracteres, strings..?


    Posto isto aconselho-te a desenvolveres primeiro que tudo uma função que te consiga comparar uma matriz 3X3 com outra matriz 3X3, tendo como resposta 1 ou 0, caso sejam iguais ou diferentes respectivamente.

    Depois disso poderás avançar para o desenvolvimento do resto do programa.

    É sempre bom desenvolver o código por passos, ou seja, "peça" por "peça".
     
  4. SanGokA

    SanGokA Power Member

    É assim, os numeos sao inteiros.
    Mas e em pseudo codigo, como fazer a compação dos mesmos?
     
  5. dreamerboy

    dreamerboy Power Member

    Podes fazer a comparação com um for dentro de outro for, o primeiro a percorrer as colunas e o segundo a percorrer as linhas.
    Dentro do segundo for fazes a comparação de célula a célula.
     
  6. Neptune

    Neptune 1st Folding then Sex

    Isso exigia que as matrizes tivessem dimensões iguais. Não vou dar a solução porque acho que isso deve vir do raciocínio do programador e um programador tem que ganhar independência nos seus raciocínio lógicos. Apenas dou uma dica: desenha um esboço em papel e vê o que tens que fazer. Depois aí sim, pensas em código ou pseudo-código.
     
  7. tiagopestana

    tiagopestana Power Member

    Dado que as matrizes nao têm a mesma dimensao vao ser precisos mais do que dois ciclos.
     
  8. dreamerboy

    dreamerboy Power Member

    Era mesmo para comparar duas matrizes de dimensões iguais que eu estava a dar a ideia. Se ele conseguir fazer isso parte para o resto da solução.
     
  9. Granadafeup

    Granadafeup Power Member

    Tens aqui uma solução com uso extensivo de pointer (muito bom para performance).

    Tens de mudar algumas coisas no código para passar para C puro e tb adaptar ao teu problema

    Código:
    
    // teste.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <time.h>
    #define SIDE_SIZE_REF 3
    #define SIZE_REF SIDE_SIZE_REF*SIDE_SIZE_REF
    
    #define SIDE_SIZE 38
    #define SIZE SIDE_SIZE*SIDE_SIZE
    
    using namespace std;
    
    bool initArray(int size, int* array)
    {
        srand ( time(NULL) );
    
        for(int i = 0; i < size; i++)
        {
            *(array+i) =  rand() % 2;
        }
    
        return true;
    }
    
    void printArray(int size, int sizeLine, int* array)
    {
        srand ( time(NULL) );
    
        for(int i = 0; i < size; i++)
        {
            if(i%sizeLine == 0 && i != 0)
                cout << endl;
    
            cout << *(array+i) << " " ;
    
            
        }
    
        cout << endl << endl;
    }
    
    void wait()
    {
        cout<<"Press ENTER to continue....."<<endl<<endl;
        cin.ignore(1);
    }
    
    bool findArray(int sideSizeRef,int sizeRef,int *arrayRef,int sideSizeSearch,int sizeSearch, int *arraySearch)
    {
    
        bool result = false;
    
        //posição em que cabe o ultimo arrayRef no arraySearch
        int limit = sizeSearch - (sideSizeRef*sideSizeSearch+sideSizeRef);
        int offset;
    
        /*
            Ser offset fosse igual sideSizeSearch a comparação era feita 
    
            1100 em vez de    1100  por causa do l
            0011            1100
        */
        const int offsetVal = sideSizeSearch - sideSizeRef;
    
        for(int i = 0; i < limit; i++)
        {
            //fica fica a zero na primeira iteração do 2º ciclo
            offset = 0 - offsetVal;
    
            //protecção para não comparar para alem dos limites da matriz
            if(sideSizeSearch - i%sideSizeSearch < sideSizeRef)
                continue;
    
            for(int l = 0; l < sizeRef; l++)
            {
    
                //tem em conta a mudança de linha
                if(l%sideSizeRef == 0){
                    offset += offsetVal;
                }
    
                //comparação
                if( *(arrayRef+l) != *(arraySearch+i+l+offset)  ){
                    result = false;
                    break;
                } else {
                    result = true;
                }
    
            }
    
            if(result)
            {
                int line = (int) ((i+1)/sideSizeSearch) + 1;
                int col = ((i+1)%sideSizeSearch);
                cout << "Encontrado --> Linha: " << line << " Col: " << col <<endl;
            }
    
        }
    
        return result;
    }
    
    
    int main(int argc, char* argv[])
    {
    
        int ObjArray[SIDE_SIZE][SIDE_SIZE];
        int ArrayREF[SIDE_SIZE_REF][SIDE_SIZE_REF];
    
        initArray(SIZE_REF, &ArrayREF[0][0]);
        printArray(SIZE_REF,SIDE_SIZE_REF, &ArrayREF[0][0]);
    
    
        initArray(SIZE, &ObjArray[0][0]);
        printArray(SIZE,SIDE_SIZE, &ObjArray[0][0]);
    
        
        findArray(SIDE_SIZE_REF, SIZE_REF, &ArrayREF[0][0], SIDE_SIZE, SIZE, &ObjArray[0][0]);
    
        wait();
    
        return 0;
    }
    
    
    
    
    PS: Até curtia meter syntax highlight aqui no post mas não sei fazer isso
     

Partilhar esta Página