1 Vetores e Matrizes em C/C++ECT - UFRN Ítalo Mendes da Silva Ribeiro
2 Sumario Vetores: definição e motivaçãoVetores: declaração e inicialização em C/C++ Passando vetores para funções C/C++ Busca em vetores em C/C++ Ordenação de vetores em C/C++ Uso de vetores com classes em C++ Matrizes: definição e motivação Matrizes: declaração e inicialização em C/C++ Passando matrizes para funções em C/C++ Vetores usando a biblioteca padrão de C++ (STD) Exemplos do uso de vetores e matrizes em C/C++
3 Vetores: Definição e Motivação
4 Vetores: Definição e MotivaçãoÉ um conjunto de variáveis de mesmo tipo, que possuem o mesmo identificador (nome) e são alocadas sequencialmente na memória Para se referir a uma localização ou elemento particular do vetor, usa-se o nome do vetor e a posição do elemento particular dentro de colchetes nomeDoVetor[posiçãoDoElemento] A posição de um elemento no vetor é chamado de índice O índice do primeiro elemento de um vetor em C/C++ é sempre zero
5 Vetores: Definição e MotivaçãoValor do elemento do vetor 3 4 8 9 15 Vetor chamado n n[0] n[1] n[2] n[3] n[4] Nome de um elemento do vetor
6 Vetores: Definição e MotivaçãoO valor do índice do vetor deve ser um número inteiro Expressões são permitidas para se calcular o valor do índice desde que o resultado seja inteiro Exemplo: x = 4 e y = 2 com n[x + y] = 15; atribuição do valor 15 para a 7º posição do vetor n
7 Declarando e Inicializando Vetores
8 tipo nomeDoVetor[tamanhoDoVetor]Declarando Vetores Declaração de vetor em C/C++ é: tipo nomeDoVetor[tamanhoDoVetor] O tamanho do vetor deve ser um inteiro maior que zero Compilador reservar 6 elementos para um vetor do tipo inteiro chamado numeros declara-se int numeros[ 6 ];
9 Inicializando VetoresImportante inicializar os valores das variáveis para evitar comportamentos inesperados Exemplo: inicializando todos os elementos do vetor com valor zero int n[ 5 ]; for( int i = 0; i < 5; i++ ) n[ i ] = 0;
10 Inicializando VetoresInicializando vetor com uma lista de valores int n[ 5 ] = {17, 18, 19 , 20, 21}; for( int i = 0; i < 5; i++ ) cout << “indice: “ << i << “, valor: ” << n[ i ] << endl; indice: 0, valor: 17 indice: 1, valor: 18 indice: 2, valor: 19 indice: 3, valor: 20 indice: 4, valor: 21
11 Inicializando VetoresSe o tamanho da lista de inicialização do vetor for menor que o tamanho do vetor, o valor dos elementos não inicializados com a lista é definido como zero int n[ 5 ] = {17, 18}; for( int i = 0; i < 5; i++ ) cout << “indice: “ << i << “, valor: ” << n[ i ] << endl; indice: 0, valor: 17 indice: 1, valor: 18 indice: 2, valor: 0 indice: 3, valor: 0 indice: 4, valor: 0
12 Inicializando VetoresO tamanho do vetor será o mesmo da lista de inicialização caso o tamanho do vetor seja omitido int n[ ] = {17, 18, 19 , 20, 21}; //vetor de tamanho 5 Caso a lista de inicialização seja maior que o tamanho do vetor ocorrerá um erro int n[ 3 ] = {17, 18, 19 , 20, 21};
13 Inicializando VetoresDefinir o tamanho do vetor com uma constante Tornar o algoritmo mais escalável const int tamanhoVetor = 5; int n[ tamanhoVetor ]; for( int x=0; x < tamanhoVetor; x++ ) n[ x ] = 2 * x;
14 Somando Elementos do Vetorconst int tamanhoVetor = 5; int n[ tamanhoVetor ] = {10, 15, 20, 25, 30}; int somaTotal = 0; for( int x=0; x < tamanhoVetor; x++ ) somaTotal += n[ x ]; cout << somaTotal << endl; //a soma total é 100
15 Passando Vetores para Funções
16 Passando Vetores para FunçõesPassar o nome do vetor sem os colchetes como parâmetro int numeros[ 5 ]; modificaVetor( numeros, 5 ); void modificaVetor( int n[], int tamanhoDoVetor ){ } C: vetor passado por valor (cópia de todos os elementos do vetor) C++: vetor passado por referência (endereço na memória do primeiro elemento do vetor)
17 Passando Vetores para FunçõesExemplo de manipulação de vetores em funções int main(){ const int tamanhoVetor = 3; int numeros[ tamanhoVetor ] = {0, 1, 2}; cout << “valores originais do vetor” << endl; for( int i=0; i
18 Passando Vetores para Funçõesvoid modificaVetor( int n[], int tamVetor){ for( int t=0; t
19 Passando Vetores para FunçõesExemplo de manipulação de vetores em funções int main(){ const int tamanhoVetor = 3; int numeros[ tamanhoVetor ] = {0, 1, 2}; cout << “valores originais do vetor” << endl; for( int i=0; i
20 Passando Vetores para Funçõesvoid modificaVetor( int n[], int tamVetor){ for( int t=0; t
21 Passando Vetores para FunçõesExemplo de manipulação de vetores em funções int main(){ const int tamanhoVetor = 3; int numeros[ tamanhoVetor ] = {0, 1, 2}; cout << “valores originais do vetor” << endl; for( int i=0; i
22 Passando Vetores para FunçõesPara impedir a modificação dos elementos de um vetor em uma função, define-se o vetor como constante no parâmetro da função Os valores do vetor poderão apenas serem lidos void modificaVetor( const int n[], int tamVetor){ for( int t=0; t
23 Busca em Vetor
24 Busca em Vetor Busca Linearif( elemento != -1){ cout << “valor na posição: “ << elemento << endl; }else{ cout << “valor não encontrado” << endl; } return 0;} //end main int buscaLinear(const int n[], int v, int tamVetor){ for(int x=0; x < tamVetor; x++){ if( n[ x ]== v ){ return x; } return -1; Busca Linear Compara cada posicação do vetor em busca de um determinado elemento Baixo desempenho int main{ const int tamanhoVetor = 5; int numeros[ tamanhoVetor ] = {2, 7, 9, 10, 13}; int valor; cin >> valor; int elemento = buscaLinear( numeros, valor, tamanhoVetor);
25 Busca em Vetor Busca Binária Vetor deve estar ordenado int main{const int tamanhoVetor = 5; int numeros[ tamanhoVetor ] = {2, 7, 9, 10, 13}; int valor; cin >> valor; int elemento = buscaBinaria( numeros, valor, tamanhoVetor); if( elemento != -1){ cout << “valor na posição: “ << elemento << endl; }else{ cout << “valor não encontrado” << endl; } return 0;} //end main
26 Busca em Vetor v = 10 meio 2 7 9 10 13 meio 2 7 9 10 13int buscaBinaria(const int n[], int v, int tamVetor){ int esq = 0; 3 int dir = tamVetor – 1; 4 while(esq <= dir){ int meio = (esq+dir)/2 if(v == n[meio]){ return meio; }else{ if(v < n[meio]){ dir = meio-1; } else{ esq = meio+1; } } } //fim while return -1; } //fim buscaBinaria v = 10 meio 2 7 9 10 13 meio 2 7 9 10 13
27 Ordenação em Vetor
28 Ordenação em Vetor Ordenação por Inserçãofor(int proximo=1; proximo < tamanhoVetor; proximo++){ insercao = numeros[ proximo ]; int mudaItem = proximo; while( (mudaItem > 0) && (numeros[ mudaItem-1 ] > insercao ) ){ numeros[mudaItem] = numeros[mudaItem-1]; mudaItem--; } numeros[mudaItem] = insercao; } // end for return 0;} // end main Ordenação por Inserção Implementação simples, mas com baixa eficiência Ordenação em ordem crescente int main{ const int tamanhoVetor = 5; int numeros[ tamanhoVetor ] = {7, 2, 13, 9, 10};
29 Uso de Vetores com Classes
30 Uso de Vetores com ClassesVetor com o tipo da classe desejada class Alunos { protected: int matricula, idade; public: void setMatricula (int a) { matricula = a; } int getMatricula() { return matricula; } }; int main(){ Alunos alunos[2]; alunos[0].setMatricula(3); alunos[1].setMatricula(5); cout << alunos[0].getMatricula() << endl; cout << alunos[1].getMatricula() << endl; return 0; }
31 Matrizes: Definição e Motivação
32 Matrizes: Definição e MotivaçãoVetores multimensionais Matriz que requer dois índices, possui duas dimensões e é chamada de matriz bidimensional ou vetor 2D. Matriz bidimensional é dividida em linhas e colunas Para se referir a uma localização ou elemento particular da matriz, usa-se o nome da matriz e os índices do elemento particular para linha e coluna dentro de colchetes nomeDaMatriz[índiceDaLinha][índiceDaColuna]
33 Matrizes: Definição e MotivaçãoVetor chamado n[3][4] coluna 1 coluna 2 coluna 3 coluna 4 Linha 1 n[0][0] n[0][1] n[0][2] n[0][3] Linha 2 n[1][0] n[1][1] n[1][2] n[1][3] Linha 3 n[2][0] n[2][1] n[2][2] n[2][3]
34 Matrizes: Definição e MotivaçãoVetor chamado n[3][4] na memória Linha 1 Linha 2 Linha 3 n[0][0] n[0][1] n[0][2] n[0][3] n[1][0] n[1][1] n[1][2] n[1][3] n[2][0] n[2][1] n[2][2] n[2][3] Coluna 1 Coluna 2 Coluna 3 Coluna 4
35 Matrizes: Definição e MotivaçãoOs valores dos índices da matriz devem ser números inteiros Expressões são permitidas para se calcular o valor do índice desde que o resultado seja inteiro Exemplo: x = 3 e y = 2 com n[2][x + y] = 11; atribuição do valor 11 para o elemento da linha 2 e coluna 5 da matriz n
36 Declarando Matrizes
37 tipo nomeDaMatriz[numeroDeLinhas][numeroDeColunas]Declarando Matrizes Declaração de matrizes bidimensionais em C/C++ é: tipo nomeDaMatriz[numeroDeLinhas][numeroDeColunas] Declaração de matrizes multidimensionais em C/C++ é: tipo nomeDaMatriz[tamanhoDimensao1][tamanhoDimensao2]...[tamanhoDimensaoN] int numeros[3][5][2]
38 Inicializando MatrizesInicializando matriz com uma lista de valores int n[ 2 ][ 2 ] = { {3, 4}, {5, 6} }; coluna 1 coluna 2 Linha 1 3 4 Linha 2 5 6
39 Inicializando MatrizesSe não houverem elementos suficientes na lista de inicialização os valores serão prenchidos com zero int n[ 2 ][ 2 ] = { {10}, {11, 12} }; for( int i = 0; i < 2; i++ ){ for( int j = 0; j < 2; j++) cout << n[i][j] << “ – “; cout << endl; } 10 – 0
40 Passando Matrizes para Funções
41 Passando Matrizes para FunçõesPassar o nome da matriz sem os colchetes como parâmetro const int linhas = 2; const int colunas = 3; int numeros[ linhas ][ colunas ]; modificaMatriz( numeros ); É necessário definir o tamanho a partir da segunda dimensão void modificaMatriz( int n[][colunas]){ } C: vetor passado por valor (cópia de todos os elementos do vetor) C++: vetor passado por referência (endereço na memória do primeiro elemento do vetor)
42 Vector usando a Biblioteca Padrão de C++
43 Vector usando a Biblioteca Padrão de C++Vetores em C/C++ tem potencial para erros como acesso a posições inexistentes no vetor A biblioteca padrão STD (Standard Library) possui várias funcionalidades que facilitam a utilização de vetores em C++ #include
44 Vector usando a Biblioteca Padrão de C++Inicialização vector< int > inteiros(5); //todos os valores com zero //recebe o mesmo tamanho e conteúdo de inteiros vector< int > inteiros2( inteiros ); //tamanho 5 e todos os elementos com alor 100 vector< int > inteiros3( 5, 100 ); for(int x=0; x
45 Vector usando a Biblioteca Padrão de C++Várias funções e alguns operadores inteiros.size() tamanho do vetor inteiros.size() verificar se o vetor está vazio inteiros.at(i) retorna o valor do elemento da posição i inteiros.front() retorna o primeiro elemento do vetor inteiros.back() retorna o último elemento do vetor inteiros.push_back( elemento ) insere elemento no final do vetor inteiros == inteiros2 verifica se os dois vetores são iguais, analisando cada elemento dos vetores inteiros = inteiros2 todo o conteúdo e tamanho do vetor inteiros2 é passado para o vetor inteiros Inteiros < inteiros2 compara elementos individualmente e para na primeira ocorrência verdadeira
46 Vector usando a Biblioteca Padrão de C++Tratamento de exceção: tentativa de acessar um elemento fora do tamanho do vetor try{ cout << inteiros.at(400) << endl; //erro: fora do tamanho }catch(out_of_range &e){ cout << “Ocorreu uma exceção: “ << e.what() << endl; }
47 Vector usando a Biblioteca Padrão de C++Passando vetores para funções usando STD vector< int > numeros(5); void escreveVetor( vector< int > &n ){ for(int i=0; i < n.size(); i++){ cout << n.at(i) << “ “ << n[i] << endl; }
48 Referências DEITEL, Harvey. DEITEL, Paul. C++: Como programar. 5ª ed., Editora Pearson MALIK, D. S. C++ Programming: From Problem Analysis to Program Design, 5ª ed., Cengage Learning HERBERT, S. C Completo e total. 3ª ed. São Paulo: Pearson, 1997.
49 Vetores e Matrizes em C/C++ECT - UFRN Ítalo Mendes da Silva Ribeiro