Você está na página 1de 13

Faculdade Pitgoras Estrutura de Dados Lineares Vetores e Matrizes

1. Vetores e Matrizes
1.1 Matrizes de uma Dimenso ou Vetor
Vetor so variveis que contm vrios valores de um mesmo tipo. Por exemplo, podemos criar o vetor exame_engenharia para armazenar as notas obtidas por 100 alunos em um exame, ou ento utilizar um vetor chamado gastos_mensais para anotar nossos gastos mensais ao longo do ano. Um vetor armazena vrios valores de um mesmo tipo: podemos criar vetor para armazenar qualquer um dos tipos bsicos de variveis, como int, float e char. Cada valor armazenado separadamente em um elemento do vetor, e pode ser acessado e modificado a qualquer momento. Pode se dizer que um vetor uma matriz de uma s dimenso.

1.2 Declarao de uma matriz/vetor.


Para criar uma matriz, precisamos declarar trs atributos dela: 1. O tipo de valor que vai ser armazenado na matriz, 2. O nome da matriz, para que possamos acess-la, 3. O nmero de elementos da matriz. A declarao de uma matriz muito parecida com a declarao de uma varivel, bastando adicionar o nmero de elementos que desejamos que ela tenha. A sintaxe a seguinte: <tipo> <nome> [<numero de elementos>]; Por exemplo, caso quisssemos criar uma matriz chamada endereos para armazenar 156 inteiros, a declarao seria assim: int endereco [156]; Podemos utilizar qualquer tipo de variveis j estudadas anteriormente para criar uma matriz, como float, int, char. Uma vez criada uma matriz de um determinado tipo, ela s pode receber valores deste tipo. Note que precisamos definir um tipo para uma matriz: no possvel criar uma matriz genrica que aceite um tipo qualquer, ou vrios tipos. Isso acontece porque ao declarar uma matriz, o compilador aloca memria suficiente para conter o nmero de valores especificado de acordo com o tipo da matriz. Por exemplo, uma matriz de 100 elementos do tipo int normalmente ir requerer 100*2 ou 200 bytes de memria. Por outro lado, uma matriz de 100 elementos do tipo float ir requerer 100*4 bytes ou 400 bytes. Assim como uma varivel normal, podemos atribuir valores para uma matriz no momento de sua declarao. Isto feito utilizando o operador de atribuio = seguido dos valores contidos entre chaves e separados por vrgulas. Por exemplo, considere a matriz de inteiros valor abaixo: int valor[5] = { 1, 2, 3, 4 , 5}; Tambm podemos atribuir apenas parte dos valores de uma matriz, por exemplo, podemos criar uma matriz que comporte 50 valores do tipo float e atribuir apenas cinco valores a ela, deixando para atribuir o restante dos valores no decorrer do programa. float notas[50] = { 7.65, 8.48, 4.27, 6.78, 9.10 };

Prof. Airton J. S. Garcia

Faculdade Pitgoras Estrutura de Dados Lineares Vetores e Matrizes

A linguagem C++ faz com que toda matriz parcialmente inicializada tenha seus valores restantes automaticamente transformados em zero. Assim, caso precisemos de uma matriz que s ontenha zeros, podemos atribuir o primeiro elemento da matriz como zero e deixar que o compilador transforme os elementos restantes em zero, como vemos abaixo: int var_inicializada[75] = {0};

1.3 Acessando Valores de uma Matriz


Aps criar uma matriz, podemos acessar qualquer valor dentro dela. Cada valor, ou elemento de uma matriz, possui um nmero prprio. Toda matriz comea no item (elemento) 0. Precisamos ter isso em mente quando acessamos valores dentro de uma matriz, pois o primeiro item/elemento ser o elemento 0, o segundo elemento ser o elemento 1. Cada elemento de uma matriz tratado como uma varivel separada. Assim, podemos atribuir valor para um elemento, exib-lo na tela, utiliz-lo em operaes matemticas e em laos condicionais. O programa abaixo ilustra estas vrias aes: Portugus Estruturado ou Pseudocdigo: Algoritmo MDIA_ENGENHARIA Var MED : vetor[1..8] de real SOMA, MEDIA : real I : inteiro Inicio Soma 0 Para I de 1 at 8 passo 1 faa Leia MED[I] SOMA (SOMA + MD[I]) Fim_para MEDIA (SOMA/8) Escreva MEDIA fim c++ #include <iostream> using namespace std; int main() { int matriz[5] = {1,2,3,4,5}; cout<<"o primeiro valor da matriz : "<<matriz[0]<<endl; cout<<"o ltimo valor da matriz : "<<matriz[4]<<endl; cout<<"Somando o segundo e o quarto elementos da matriz temos: "<< matriz[1] + matriz[3]<<endl; matriz[2] = 27; cout<<"Mudamos o valor do terceiro elemento da matriz para: "<<matriz[2]<<endl; system(PAUSE > null); return 0; }

Prof. Airton J. S. Garcia

Faculdade Pitgoras Estrutura de Dados Lineares Vetores e Matrizes

1.4 Utilizando Laos para Percorrer Matrizes


Uma das utilizaes mais teis dos laos condicionais o acesso vrios (ou todos) elementos de uma matriz rapidamente. Podemos utilizar qualquer um dos laos estudado, mas sem dvida o lao for o mais prtico para trabalhar-se com matrizes. Utilizamos a varivel de controle do lao para acessar cada um dos elementos desejados (lembre-se que a matriz sempre comea no elemento 0), como vemos no programa abaixo que percorre os elementos de uma matriz, primeiro preenchendo a matriz com os dados entrados pelo usurio, depois exibindo estes dados na tela.

Fazer algoritmo acima que contenha a soma dos elementos da matriz, porema soma deve ficar em um comando para separado.

Mostrando a sequencia entrada pelo usuario:

C++

#include <iostream> using namespace std; int main() { int sequencia[4]; for (int i = 0; i < 4; i++) { cout << "Entre com o elemento numero "<<(i+1)<<" da sequencia: "; cin >> sequencia[i]; cout << endl; } cout << "A sequencia entrada pelo usuario foi: "; for (int i = 0; i < 4; i++) { cout << sequencia[i]<<" "; } system("PAUSE > null"); return 0; }

Prof. Airton J. S. Garcia

Faculdade Pitgoras Estrutura de Dados Lineares Vetores e Matrizes

Ateno: como vimos no exemplo anterior, podemos utilizar variveis para acessar os elementos de uma matriz. Da mesma forma, podemos definir constantes para indicar o nmero de elementos de uma matriz. Essa tcnica muito til, pois caso precisemos alterar o nmero de elementos da matriz ao invs de caarmos no cdigo todas as referncias este nmero, tudo que precisamos fazer alterar o valor da constante. Assim, veja o mesmo programa anterior reescrito utilizando uma definio de constante. C++ #include <iostream> using namespace std; int main() { const int TAMANHO = 4; int sequencia[TAMANHO]; for (int i = 0; i < 4; i++) { cout << "Entre com o elemento numero "<<(i+1)<<" da sequencia: "; cin >> sequencia[i]; cout << endl; } cout << "A sequencia entrada pelo usuario foi: "; for (int i = 0; i < 4; i++) { cout << sequencia[i]<<" "; } system("PAUSE > null"); return 0; }

1.5 Matrizes Multidimensionais


Alm das matrizes simples de uma nica dimenso, C++ permite a criao de matrizes de mltiplas dimenses. As matrizes bidimensionais so sem dvida as mais utilizadas e as mais teis, pois se comportam como tabelas com linhas e colunas. Ao declarar uma matriz multidimensional, adicionamos um conjunto de colchetes para cada dimenso extra. Entre os colchetes de cada dimenso, colocamos o nmero de elementos que aquela dimenso ter (ou uma varivel que represente o nmero de elementos). Assim: int tabela [10] [5]; //matriz bidimensional int horas [12] [30] [24]; //matriz de trs dimenses int minutos [12] [30] [24] [60]; //matriz de quatro dimenses Normalmente trabalhamos no mximo com matrizes bidimensionais, mas podem surgir ocasies onde matrizes de mais de duas dimenses sejam necessrias. Matrizes multidimensionais funcionam como matrizes dentro de matrizes. Por exemplo, uma matriz bidimensional pode ser vista como uma matriz de uma dimenso cujos elementos so outra matrizes. Esta analogia til para entender como feita a inicializao dos valores de matrizes multidimensionais: inicializamos a matriz separando seus elementos por vrgulas, onde cada elemento uma matriz individual e inicializada da mesma forma que a matriz principal. Por exemplo, seja a matriz bidimensional MatBi: int MatBi [2] [3] = { { 1, 2, 3} , { 4, 5, 6}};
Prof. Airton J. S. Garcia 4

Faculdade Pitgoras Estrutura de Dados Lineares Vetores e Matrizes

Veja que cada elemento fechado por chaves e separado por vrgulas. A mesma coisa acontece com matrizes de trs dimenses, e assim por diante. O exemplo abaixo mostra a declarao de uma matriz tridimensional. Preste ateno na presena das chaves e das vrgulas separando cada elemento diferente: int MatTri [2] [2] [2] = { {{ 9, 8}, {7,6}} , {{5, 4},{3, 2}} }; Cada elemento de uma matriz multidimensional pode ser acessado individualmente, indicando a posio exata do valor dentro da matriz. Como vimos anteriormente no caso das matrizes simples, a utilizao dos laos condicionais facilita o acesso aos vrios elementos de uma matriz. No caso das matrizes multidimensionais, utilizamos laos aninhados para acessar cada dimenso de uma vez. O programa abaixo declara a matriz tridimensional que vimos anteriormente e utiliza uma sucesso de laos for aninhados para exibir a matriz na tela.

#include <iostream> using namespace std; int main() { int MatTri [2] [2] [2] = {{{ 9, 8}, {7,6}},{{5, 4},{3,2}}}; for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { for (int k = 0; k < 2; k++) { cout << MatTri [i][j][k]<<" "; } cout<<endl; } cout<<endl; } system("PAUSE > null"); return 0; }

1.5 Matrizes em Funes


Podemos utilizar matrizes como parmetros de funes com alguns cuidados simples. Ao declarar os parmetros que sero utilizados na funo, declaramos um parmetro para a matriz e um parmetro para seu tamanho separadamente. Fazemos isso para que possamos utilizar matrizes de qualquer tamanho utilizando a mesma funo. Ao criar o parmetro referente matriz, usamos um conjunto de colchetes vazios para indicar que se trata de uma matriz e no de uma varivel simples. No entanto, quando utilizarmos esta funo, passamos para ela somente o nome da matriz, sem os parnteses: o programa j sabe que uma matriz ser enviada, pois j declaramos isso no prottipo da funo. O programa abaixo mostra uma funo que soma todos os elementos de uma matriz.

Prof. Airton J. S. Garcia

Faculdade Pitgoras Estrutura de Dados Lineares Vetores e Matrizes

#include <iostream> using namespace std; int somamatriz( int matriz[], int tamanho) { int resultado = 0; for (int i = 0; i < tamanho; i++){ resultado = resultado + matriz[i]; } return resultado; } int main() { const int TAMANHO = 4; int sequencia[TAMANHO]; int result = 0; for (int i = 0; i < 4; i++) { cout << "Entre com o elemento numero "<<(i+1)<<" da sequencia: "; cin >> sequencia[i]; cout << endl; } result = somamatriz(sequencia, TAMANHO); cout << "A soma de todos os elementos da matriz e igual a "<<result<<"."<<endl; system("PAUSE > null"); return 0; } Tambm podemos utilizar funes que trabalhem com matrizes multidimensionais. Entretanto, ao criar o parmetro da matriz preciso declarar o tamanho de todas as dimenses da matriz com exceo da primeira. Por exemplo: int soma_matriz ( int matriz [ ] [3] [4], int elementos) { comandos; } A primeira dimenso deixada em branco, para ter seu tamanho definido pelo outro parmetro elementos. Entretanto, as outras duas dimenses tem seu tamanho definido respectivamente em 3 e 4. Caso deixssemos estas outras duas dimenses sem um tamanho definido, o programa no seria compilado. muito importante notar que, ao trabalhar com matrizes dentro de funes, estamos trabalhando com a prpria matriz, ou melhor, com o endereo dos dados desta matriz. Normalmente, quando trabalhamos com variveis dentro de uma funo, estamos trabalhando com cpias destes valores. Entretanto, isso no verdade para matrizes, por razes que veremos no mdulo sobre ponteiros. Por enquanto, basta saber que quando trabalhamos com matrizes dentro de funes, qualquer modificao feita na matriz feita para valer. Se somarmos mais 10 a todos os valores de uma matriz em uma funo, quando a funo terminar a matriz estar modificada. Esta caracterstica muito til para contornar o fato que no podemos utilizar uma matriz como retorno de uma funo: no precisamos que a funo retorne uma matriz, s precisamos fazer com que a funo altere a matriz. Por exemplo, o programa abaixo usa uma funo para ordenar os nmeros dentro de uma matriz.

Prof. Airton J. S. Garcia

Faculdade Pitgoras Estrutura de Dados Lineares Vetores e Matrizes

C++ #include <iostream> using namespace std; int ordena( int matriz[], int tamanho) { int temp = 0; for (int i = 0; i < tamanho; i++){ for (int j = i; j < tamanho; j++){ if (matriz[j] < matriz [i]) { temp = matriz[i]; matriz[i] = matriz[j]; matriz[j] = temp; } } } } int main() { const int TAMANHO = 4; int sequencia[TAMANHO] = {27, 12, 42, -8}; cout <<"Sequencia original: "; for (int i = 0; i < 4; i++) { cout << sequencia[i]<<" "; } cout<<endl; ordena(sequencia, TAMANHO); cout <<"Sequencia ordenada: "; for (int i = 0; i < 4; i++) { cout << sequencia[i]<<" "; } cout<<endl; system("PAUSE > null"); return 0; }

1.7 Criando Matrizes Dinamicamente


A linguagem C++ prima pela economia de memria durante a execuo de seus programas. Quando declaramos uma matriz no incio de um programa, o compilador separa um pedao da memria do computador de tamanho equivalente ao tamanho mximo da matriz. Assim, se criarmos uma matriz de inteiros com 200 elementos, o compilador separa na memria do computador um espao de 400 bytes (2 bytes x 200 elementos). Entretanto, quando trabalhamos com matrizes frequentemente no sabemos qual o tamanho exato de elementos que precisamos. Ao criar uma matriz, estipulamos um valor que seja maior do que o valor mximo de elementos que precisamos, mesmo que no utilizemos todos os espaos disponveis na matriz. Isso causa desperdcio de memria do computador e lentido na execuo de programas. Para evitar este problema, a linguagem C++ introduz dois novos operadores de controle de memria. Em primeiro lugar, temos o operador new, que utilizado para alocar espaos na memria de computador durante a execuo de um programa. Em segundo lugar, o operador

Prof. Airton J. S. Garcia

Faculdade Pitgoras Estrutura de Dados Lineares Vetores e Matrizes

delete, que libera a memria alocada com o operador new aps sua utilizao. Este tipo de criao e destruio de variveis chamado de alocao dinmica. Uma matriz criada dessa forma chamada de matriz dinmica. A vantagem de se criar matrizes dinmicas que a memria utilizada pela matriz s tirada do sistema aps a execuo do operador new, e pode ser liberada novamente aps sua utilizao com o operador delete. Quando criamos uma matriz do jeito normal, a memria utilizada por ela guardada pelo programa durante toda sua execuo, consumindo recursos desnecessrios do computador. A sintaxe para criar-se uma matriz utilizando o operador new a seguinte: <tipo> * <nome> = new <tipo> [ <numero de elementos> ]; Por exemplo, para criar uma matriz do tipo float com 10 elementos: float * lista = new float [10]; O acesso aos elementos da nova matriz feito de forma anloga ao de uma matriz criada do jeito normal: utilizamos o nome da matriz seguido do nmero do elemento acessado. Como j dito anteriormente, o primeiro elemento de uma matriz sempre o elemento 0. Note que no podemos inicializar automaticamente os valores de uma matriz criada dessa forma. Cada elemento da matriz deve ter seu valor atribudo separadamente. A outra face do operador new o operador delete. S podemos utilizar este operador com matrizes criadas pelo operador new, ou seja, matrizes criadas por declarao normal no podem ser apagadas durante a execuo do programa. Para utilizar o operador delete para apagar uma matriz, a sintaxe a seguinte: delete <nome_matriz>; O programa abaixo pede ao usurio o nmero de elementos da matriz, cria uma matriz e depois volta a pedir ao usurio os valores de cada um dos elementos da matriz. No final do programa, a matriz deletada. C++ #include <iostream> using namespace std; int main() { int tamanho = 0; cout<<"Entre com o tamanho da matriz: "; cin>>tamanho; cout<<endl; int *sequencia = new int[tamanho]; for (int i = 0; i < tamanho; i++) { cout << "Entre com o elemento "<<(i+1)<<" da matriz: "; cin>>sequencia[i]; cout<<endl; } cout<<"A matriz entrada e: "; for (int i = 0; i < tamanho; i++) { cout << sequencia[i]<<" "; }
Prof. Airton J. S. Garcia 8

Faculdade Pitgoras Estrutura de Dados Lineares Vetores e Matrizes

cout<<endl; cout<<"Programa encerrado. A matriz criada ser deletada, e a memria ser devolvida para o processador."; delete sequencia; system("PAUSE > null"); return 0; }

Prof. Airton J. S. Garcia

Faculdade Pitgoras Estrutura de Dados Lineares Vetores e Matrizes

2.Resumo de Vetores e Matrizes


Permitem armazenamento de vrios dados na memria RAM ao mesmo instante de tempo e com contigidade fsica, ou seja, uma varivel com possui vrios elementos, igualmente distanciados, ou seja, um ao lado do outro.

2.1 Conceitos Bsicos

Vetor: ( uma matriz unidimensional)


#define MAX 7

int vetor[MAX];

Matriz: (Possui mais de uma dimenso)


#define M 3 #define N 4

float matriz[M][N];

ndice: Constante numrica inteira que referencia cada elemento

Prof. Airton J. S. Garcia 10

Faculdade Pitgoras Estrutura de Dados Lineares Vetores e Matrizes

Exemplos:

Dada a definio acima:

vetor[0]...................... primeiro elemento vetor[MAX-1].............. ltimo elemento m[0][0]...................... primeiro elemento m[M-1][N-1]............... ltimo elemento

Entrada de um Vetor

Entrada de uma Matriz Bidimensional

for (i = 0;i < MAX;i++) scanf(%d, &vetor[i]);

for (i = 0;i < M;i++) for (j = 0;j < N;j++)

Prof. Airton J. S. Garcia 11

Faculdade Pitgoras Estrutura de Dados Lineares Vetores e Matrizes

Operaes sobre os Dados


Criao dos Dados Manuteno dos Dados 1. Insero de um Componente 2. Remoo de um Componente 3. Alterao de um Componente Consulta aos Dados Destruio dos Dados Pesquisa e Classificao

Alocao de Memria (RAM - Random Access Memory)

Alocao Esttica de Memria


a forma mais simples de alocao, na qual cada dado tem sua rea reservada, no variando em tamanho ou localizao ao longo da execuo do programa.

float f;

// a varivel f ocupa 4 bytes durante toda a execuo do programa

Alocao Dinmica de Memria


Nesta forma de alocao, so feitas requisies e liberaes de pores da memria ao longo da execuo do programa. Para isto, so usadas variveis do tipo Ponteiro.

int *p;

// a varivel p poder ocupar n bytes a qualquer momento

Prof. Airton J. S. Garcia 12

Faculdade Pitgoras Estrutura de Dados Lineares Vetores e Matrizes

Clula, Nodo ou N

Espao reservado (alocado) na memria RAM para uma varivel (tipo primitivo ou complexo), ou seja, nmero de bytes gastos para o armazenamento de um dado.

Campo
uma subdiviso de uma clula, ou seja, cada elemento de uma estrutura (struct). No exemplo abaixo, tempo uma clula e horas, minutos e segundos so os campos.

struct TEMPO { int horas; int minutos; int segundos; } *tempo;

Prof. Airton J. S. Garcia 13

Você também pode gostar