Simulação de uma estrutura de dados multi-dimensional

Um array em C++ consiste numa estrutura de dados na qual estes são agrupados em sequência e identificados pelo índice correspondente à sua posição nessa sequência. Por exemplo, um array admite a representação a=[1,2,3] onde, ao primeiro elemento, 1, se faz corresponder o índice 0. É obvio que o conjunto de índices nesta estrutura de dados varia entre 0 e 2. Para aceder ao elemento associado ao índice i usamos a sintaxe a[i]. Deste modo, a[0] correponde ao valor 1, a[1] ao valor 2 e a[2] corresponde ao elemento 3 do array exemplificativo. Para declarar uma variável que represente um array com capacidade para 30 valores do tipo inteiro, usamos a sintaxe

int a[30];

É possível generalizar esta definição a uma estrutura em matriz, isto é, uma estrutura na qual os dados são identificados por um par de dois inteiros (podemos identificá-los com linhas e colunas de uma tabela). De facto, é possível definir uma estrutura em tabelas multi-dimensionais, onde os dados são identificados por conjuntos ordenados de n indices. Suponhamos que queremos definir uma estrutura identificada por 4 índices onde cada um dos índices varia entre 0 e 10. Usamos a sintaxe

int b[10][10][10][10];

A sintaxe b[1][3][9][6] permite aceder ao elemento na posição indicada pelo conjunto ordenado (1,3,9,6). Esta abordagem apresenta um grande inconveniente. O número de dimensões (isto é, o número de índices no conjunto ordenado) tem de ser definido em tempo de compilação. Se pretendermos variar o nosso número de dimensões em tempo de execução teremos de criar uma nova estrutura.

Envidamos uma estrutura do género em C++ com o recurso à ideia de classe. Na classe, a qual iremos designar por range, definimos o construtor que recebe, como argumento, uma estrutura indexada  com tantos elementos quantas as respectivas dimensões. Por exemplo, se o range recebe como argumento o vector [2,3,4] então corresponde a uma matriz a três índices para a qual o primeiro índice varia entre 0 e 2, o segundo entre 0 e 3 e o terceiro entre 0 e 4.

Na pasta range coloco três ficheiros: range.h, range.cpp, symbol.cpp e main.cpp; estes foram compilados com sucesso no Dev-cpp. Para compilar, é suficiente descarregá-los para a mesma directoria, abrir o ficheiro main.cpp com o Dev-cpp e compilar. Programei a interface representada pictoricamente pela imagem que se segue.

range

O construtor cria a matriz com as dimensões especificadas pelo vector. A função insert_value permite inserir o valor value na posição especificada pelos índices associados ao vector coords. A função get_value retorna o valor na posição indexada por coords. As funções read e write permitem ler e escrever o range a partir de um stream. Escrevi a classe com o recurso ao conceito de programação genérica mas ainda contém erros relacionados com o uso de parâmetros especificados como const apesar de funcionar bem para as funções epecificadas na interface.

Quando corremos o programa, surge a consola com a frase

Insert number of range dimensions:

se pretendermos um range com duas dimensões, escolhemos 2. De seguida introduzimos o valor máximo de cada índice, por exemplo 3 e 2. Neste caso definimos uma matriz de 3 por 2. De seguida surge:

Please type range with the correct syntax:

Introduzimos [[1,2,3],[4,5,6]] e construímos o range. Sintaticamente (a sintaxe corresponde ao conjunto de regras que valida uma expressão), um range é definido como uma lista [a,b,c,…] que inclui listas no seu interior. As listas mais interiores correspondem à primeira dimensão. Neste caso são [1,2,3] e [4,5,6] com três elementos uma vez que a primeira dimensão contém três valores para os índices. A lista mais exterior [lst_1,lst_2] contém 2 elementos que corresponde à segunda dimensão. Para definir um range com mais dimensões é suficiente construir as sucessivas listas de forma recursiva. Por exemplo, um range definido pelo vector [3,4,2] tem a sintaxe válida

[ [ [1,2,3],[2,3,4],[3,4,5],[5,6,7] ], [ [1,2,3],[2,3,4],[6,7,8],[1,2,1] ] ]

Delego os aspectos relacionados com a implementação interna e a sintaxe para futuros textos. Não deve haver espaços para a sintaxe ser considerada correcta, algo que facilmente se altera no código em si.

Sobre Sérgio O. Marques

Licenciado em Física/Matemática Aplicada (Astronomia) pela Faculdade de Ciências da Universidade do Porto e Mestre em Matemática Aplicada pela mesma instituição, desenvolvo trabalho no PTC (Porto Technical Centre) - Yazaki como Administrador de bases-de-dados. Dentro o meu leque de interesses encontram-se todos os temas afins às disciplinas de Matemática, Física e Astronomia. Porém, como entusiasta, interesso-me por temas relacionados com electrónica, poesia, música e fotografia.
Esta entrada foi publicada em Computadores e Internet. ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s