Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
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};
Fazer algoritmo acima que contenha a soma dos elementos da matriz, porema soma deve ficar em um comando para separado.
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; }
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; }
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; }
#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.
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; }
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
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; }
int vetor[MAX];
float matriz[M][N];
Exemplos:
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
float f;
int *p;
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.