Vetores e Matrizes Programação de Computadores II Vetores e Matrizes Prof. Antônio Augusto Chaves Departamento de Matemática Bloco VI - sala 23 http://www.feg.unesp.br/∼chaves [email protected] 1 / 37 Vetores e Matrizes Comentários sobre a prova Momento fala que eu te escuto R. Sfair (FEG) PC - Aula 17 16 de agosto de 2008 5 / 27 2 / 37 Vetores e Matrizes Avisos I Os exercícios realizados no laboratório deverão ser entregues a partir da próxima aula prática (06/04/2010). 3 / 37 Vetores e Matrizes Importante I Só existe um jeito de aprender a programar: Programando !!! 4 / 37 Vetores e Matrizes Objetivos I Ao final desta lição, o estudante será capaz de: I Declarar e criar vetores I Acessar elementos de um vetor I Determinar o numero de elementos em um vetor I Declarar e criar vetores multi-dimensionais 5 / 37 Vetores e Matrizes Revisão Revisão I Como construir um objeto? I I Encapsulamento I I métodos construtores métodos set e get Escopo de variáveis I Variáveis estáticas e dinâmicas 6 / 37 Vetores e Matrizes Vetores Introdução I Suponha que tenhamos três variáveis do tipo int com diferentes identificadores para cada variável int numero1; int numero2; int numero3; numero1 = 1; numero2 = 2; numero3 = 3; 7 / 37 Vetores e Matrizes Vetores 3. Vetores e Matrizes Introdução • A Java API contém diversas classes para a manipulação de estruturas de dados. A estrutura de dados mais simples é o vetor ( array ). • Podemos uma variável para armazenar e manipular UmIvetor é umutilizar agrupamento de valores de um mesmo tipo uma primitivo lista de dados de forma mais eficiente. Este tipo de variável é ou um agrupamento de objetos de uma mesma classe. • Cada elemento de um vetor armazena um valor. Os elementos de um I Um vetor armazena múltiplos itens de dados do mesmo tipo vetor são referenciados por meio de um índice. O primeiro elemento (tipos primitivos ou objetos de uma mesma classe) em um bloco tem sempre o índice 0 (zero). Portanto, para um vetor de n continuo de memória, dividido-o em certa quantidade de casas elementos, os índices variam de 0 a n-1. chamada de vetor v[0] v[1] v[2] v[3] v[4] v[5] v • Em Java, vetores têm tamanho fixo e, uma vez criados, não podem ser redimensionados. O campo length contém o tamanho do vetor. 8 / 37 Vetores e Matrizes Vetores Declarando Vetores I Escreve-se o tipo de dado seguido por colchetes [ ] e por um identificador int [] idades; ou int idades[]; 9 / 37 Vetores e Matrizes Vetores Criando Vetores I Criar o vetor e especificar seu tamanho com um parâmetro no construtor I Escrever a palavra-chave new, definir o tipo de dado seguido por colchetes contendo a quantidade de elementos do vetor: // declaração int idades[]; // construindo um objeto idades = new int[100]; ou // declarando e construindo um objeto int idades[] = new int[100]; 10 / 37 Vetores e Matrizes Vetores Criando Vetores [0] [1] [2] [3] [4] idades . . . [99] length = 100 objeto vetor 11 / 37 Vetores e Matrizes Vetores Criando Vetores I Pode-se, também, construir um vetor ao iniciá-lo diretamente com dados int vet[] = {1, 2, 3, 4, 5}; I Este código declara e inicializa um vetor de inteiros com cinco elementos (inicializados com os valores 1, 2, 3, 4, e 5) 12 / 37 Vetores e Matrizes Vetores Exemplos boolean resultados[] = {true, false, true, false}; double graus[] = {100, 90, 80, 75, 30}; String dias[] = {“Seg”, “Ter”, “Qua”, “Qui”, “Sex”, “Sab”, “Dom”}; 13 / 37 Vetores e Matrizes Vetores Criando Vetores I Atenção: Um vetor pode ter exatamente o tamanho necessário, ou seja, o tamanho do vetor pode ser lido, atribuído ou calculado. String nome[]; int n = 3; nome = new String[n]; nome[0] = “Ze”; nome[1] = “Jó”; nome[2] = “Lu” I Neste código o tamanho do vetor é definido em tempo de execução 14 / 37 Vetores e Matrizes Vetores Exemplo LerTamanhoVetor.java 1 import javax.swing.JOptionPane; 2 3 public class LerTamanhoVetor 4 { 5 public static void main(String[] args) 6 { 7 int v[]; 8 String sTam; 9 int tam; 10 11 sTam = JOptionPane.showInputDialog("Tamanho do vetor"); 12 tam = Integer.parseInt(sTam); 13 14 // Construir o vetor do tamanho desejado 15 v = new int[tam]; 16 for (int i = 0; i < tam; i++) 17 v[i] = 2*(i + 1); 18 } 19 } 15 / 37 Vetores e Matrizes Vetores Acessando Elementos do Vetor I Utilizar um número chamado de índice I Índice numérico I I I I Atribuído a cada elemento do vetor Permite o acesso individual a seus elementos Iniciado com zero e progride sequencialmente até o fim do vetor Índices dentro de um vetor vão de 0 até (tamanhoVetor - 1) 16 / 37 Vetores e Matrizes Vetores Acessando Elementos do Vetor int idades[] = new int[100]; idades[0] = 10; System.out.printf(“%d”,idades[99]); 17 / 37 Vetores e Matrizes Vetores Acessando Elementos do Vetor I O valor armazenado de cada elemento do vetor será inicializado com zero para vetores com o tipo de dado numérico I Para referenciar os elementos em vetores de objetos, como as Strings, estes NÃO serão inicializados com brancos ou strings vazias “ ”. Em vez disso, deve-se preencher explicitamente cada elemento deste vetor 18 / 37 Vetores e Matrizes Vetores Acessando Elementos do Vetor I O seguinte código de exemplo mostra como imprimir todos os elementos de um vetor ExemploVetor.java 1 public class ExemploVetor 2 { 3 public static void main(String[] args) 4 { 5 int [] idades = new int[100]; 6 for( int i=0; i<100; i++ ) 7 { 8 System.out.print( idades[i] ); 9 } 10 } 11 } 19 / 37 Vetores e Matrizes Vetores Tamanho de um Vetor ExemploVetor.java 1 public class ExemploVetor 2 { 3 public static void main(String[] args) 4 { 5 int [] idades = new int[100]; 6 for( int i=0; i<idades.length; i++ ) 7 { 8 System.out.print( idades[i] ); 9 } 10 } 11 } 20 / 37 Vetores e Matrizes Vetores Exercício Resolvido I Implementar a classe Vetor com os métodos apresentados no diagrama UML abaixo: Vetor + lerVetor(int v[ ] ) + somarVetor(int v[ ] ) + mostrarVetor(int v[ ] ) 21 / 37 Vetores e Matrizes Vetores Exercício Resolvido Vetor.java 1 import java.util.*; 2 3 public class Vetor 4 { 5 public static void lerVetor(int v[]) 6 { 7 Scanner in = new Scanner(System.in); 8 for (int i = 0; i < v.length; i++) 9 { 10 System.out.print("v[" + i + "] = "); 11 v[i] = in.nextInt(); 12 } 13 } 14 15 public static int somarVetor(int v[]) 16 { 17 int soma = 0; 18 for (int i = 0; i < v.length; i++) 19 { 20 soma = soma + v[i]; 21 } 22 return soma; 23 } 24 public static void mostrarVetor(int v[]) 25 { 22 / 37 18 for (int i = 0; i < v.length; i++) { soma = soma + v[i]; } return soma; Vetores e Matrizes 19 Vetores 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 Exercício Resolvido } public static void mostrarVetor(int v[]) { System.out.print("["); for (int i = 0; i < v.length; i++) { System.out.print(v[i]); if (i < v.length-1) System.out.print(", "); } System.out.println("]"); } public static void main (String [] args) { int n,x[]; Scanner in = new Scanner(System.in); System.out.print("Tamanho do vetor: "); n = in.nextInt(); x = new int[n]; lerVetor(x); mostrarVetor(x); int s = somarVetor(x); System.out.println("Soma = " + s); } } 23 / 37 Vetores e Matrizes Vetores 3. Vetores e Matrizes Operações com Vetores Operações com Vetores •I Após SeSe istoisto Apósum umvetor vetor ter ter sido sidocriado criadonão nãoéépossível possívelredimensioná-lo. redimensioná-lo. for ee for necessário, necessário,deve-se deve-secriar criarum umoutro outrovetor vetorda dadimensão dimensãodesejada desejada fazer o vetor antigo apontar para o novo. fazer o vetor antigo apontar para o novo. •I A arraycopy(), que A classe classeSystem Systemoferece ofereceum ummétodo métodoespecial: especial: arraycopy(), que permite permite realizar cópias de vetores. realizar cópias de vetores. Exemplo: // redimensionamento através de uma cópia int v1[] = {1, 2, 3, 4, 5}; v1[5] = 10 // Erro: índice fora dos limites int v2[] = new int[10]; System.arraycopy(v1, 0, v2, 0, v1.length); v2[5] = 10; // Ok, os índices de v2 vão de 0 a 9 arraycopy(v1, i1, v2, i2, n) - Copia n elementos do vetor v1 (a partir do elemento de índice igual a i1) para posições do vetor v2 que iniciam em i2. Após a cópia, novos elementos podem ser definidos para o novo vetor. © ELFS 88 24 / 37 Vetores e Matrizes Vetores Operações com Vetores 3.IVetores e Matrizes Outra forma de copiar um vetor é produzir um “clone” do vetor • Outra forma de copiar um vetor é produzir um "clone" do vetor. TestaClone1.java public class TestaClone1 { public static void main(String[] args) { int a1[] = {1, 2, 3, 4}; int a2[] = (int[])a1.clone(); System.out.println((a1 == a2)); a1[1]++; System.out.println(a1[1]); System.out.println(a2[1]); } Note que os componentes de um vetor e de um clone } desse vetor são variáveis diferentes. public class TestaClone2 { public static void main(String[] args) { int m1[][] = {{1, 2}, {3, 4}}; int m2[][] = (int[][])m1.clone(); System.out.println((m1 == m2)); System.out.println(m1[0] == m2[0]); A saída será: false 3 2 TestaClone2.java 25 / 37 Vetores e Matrizes Matrizes Vetores Multidimensionais: Matrizes I Vetores podem ter diversas dimensões. Um vetor bidimensional é conhecido como Matriz I São implementados como vetores dentro de vetores I São criados adicionando-se mais um conjunto de colchetes após o nome do vetor declarado // array inteiro de 512 x 128 elementos int[][] twoD = new int[512][128]; // array de caracteres de 8 x 16 x 24 char[][][] threeD = new char[8][16][24]; // array de String de 4 linhas x 2 colunas String[][] dogs = {{ “terry”, “brown” }, { “Kris”, “white” }, { “toby”, “gray”}, { “fido”, “black”} }; 26 / 37 3. eVetores Vetores Matrizes e Matrizes Matrizes Vetores Multidimensionais • Vetores podem ter diversas dimensões. Um vetor bidimensional é também conhecido como matriz. Vetores Multidimensionais: Matrizes • É possível construir vetores multidimensionais não-retangulares em Java. I É possível construir vetores multidimensionais não-retangulares • Como vetor pode conter qualquer objeto, para definir vetores emum Java multidimensionais basta definir um vetor de vetores. I Exemplos: Exemplos: © ELFS int v[][] = new int[2][]; v[0] = new int[2]; v[1] = new int[2]; Vetor retangular 2x2 (ou matriz de 2 linhas e 2 colunas). int vet[][] = new int[3][]; vet[0] = new int[2]; vet[1] = new int[4]; vet[2] = new int[3]; Um vetor bidimensional não retangular. int m[][] = {{1,2},{3,4}}; Corresponde à matriz: 1 2 3 4 81 27 / 37 Vetores e Matrizes Matrizes Vetores Multidimensionais: Matrizes I Acessar um elemento em um vetor multi-dimensional é idêntico a acessar elementos de um vetor unidimensional I Acessando o primeiro elemento na primeira linha da matriz: nomeMatriz[0][0]; 28 / 37 Vetores e Matrizes Matrizes Exercício Resolvido I Implementar a classe Matriz com os métodos apresentados no diagrama UML abaixo: Matriz + lerMatriz(int m[ ][ ] ) + modificarMatriz(int m[ ][ ] ) + somarMatrizes(int a[ ][ ], int b[ ][ ] ) + mostrarMatriz(int m[ ][ ] ) 29 / 37 Vetores e Matrizes Matrizes Exercício Resolvido ExemploMatriz.java 1 import java.util.*; 2 3 public class ExemploMatriz 4 { 5 public static void lerMatriz(int m[][]) 6 { 7 Scanner in = new Scanner(System.in); 8 for (int i = 0; i < m.length; i++) 9 { 10 for (int j = 0; j < m[i].length; j++) 11 { 12 System.out.print("m[" + i + "," + j + "] = "); 13 m[i][j] = in.nextInt(); 14 } 15 } 16 } 17 18 public static void modificarMatriz(int n, int m[][]) 19 { 20 for (int i = 0; i < m.length; i++) 21 { 22 for (int j = 0; j < m[i].length; j++) 23 { 24 m[i][j] = n * m[i][j]; 25 } 26 } 27 } 30 / 37 20 for (int i = 0; i < m.length; i++) { 22 for (int j = 0; j < m[i].length; j++) Matrizes 23 { Exercício 24 Resolvido m[i][j] = n * m[i][j]; 25 } 26 } 27 } 28 public static int[][] somarMatrizes(int a[][], int b[][]) 29 { 30 int soma[][] = a; 31 for (int i = 0; i < a.length; i++) 32 { 33 for (int j = 0; j < a[i].length; j++) 34 { 35 soma[i][j] = a[i][j] + b[i][j]; 36 } 37 } 38 return soma; 39 } 40 41 public static void mostrarMatriz(int m[][]) 42 { 43 for (int i = 0; i < m.length; i++) 44 { 45 for (int j = 0; j < m[i].length; j++) 46 { 47 System.out.printf("%4d",m[i][j]); 48 } 49 System.out.println(); 50 } 51 } 52 public static void main (String [] args) 53 { Vetores e21 Matrizes 31 / 37 46 { Vetores e47 Matrizes System.out.printf("%4d",m[i][j]); } System.out.println(); 48 Matrizes 49 Exercício 50 Resolvido } 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 } public static void main (String [] args) { int numLins,numCols,mat1[][]; Scanner in = new Scanner(System.in); System.out.print("Número de linhas: "); numLins = in.nextInt(); System.out.print("Número de colunas: "); numCols = in.nextInt(); mat1 = new int[numLins][numCols]; lerMatriz(mat1); System.out.println("\nMatriz 1:"); mostrarMatriz(mat1); int mat2[][] = new int[numLins][numCols]; mat2 = (int[][])mat1.clone(); modificarMatriz(2,mat2); System.out.println("\nMatriz 2:"); mostrarMatriz(mat2); int mat3[][] = somarMatrizes(mat1,mat2); System.out.println("\nMatriz 3:"); mostrarMatriz(mat3); } } 32 / 37 Vetores e Matrizes Exercícios Exercícios I Construir um programa que simula o lançamento de dois dados. O programa deve usar um objeto da classe Random para lançar os dados. Como cada dado pode mostrar um valor de 1 a 6, a soma dos dois dados varia de 2 a 12. O programa deve lançar os dados 30000 vezes. Utilizar um vetor para guardar o número de vezes que cada possível valor da soma ocorreu. Mostrar o valor da soma mais frequente e o valor da soma menos frequente. I Qual deverá ser a soma mais frequente? I Qual deverá ser a soma menos frequente? 33 / 37 Vetores e Matrizes Exercícios Exercícios I Construir uma classe que represente uma carta de baralho. Construir um programa que simula a distribuição de um conjunto de cartas. 34 / 37 Vetores e Matrizes Sumário Revisando a aula de hoje I Vetores I I I I I I Definição Declaração Visão sobre criação e construtores Acessando um elemento O atributo length Vetores multi-dimensionais (Matrizes) 35 / 37 Vetores e Matrizes visos gerais - Sobre a aula de ontem Sumário Dúvidas??? O Grito (Edvard Munch, 1893) 36 / 37 Vetores e Matrizes Referências Bibliográficas Referências Bibliográficas I H.M. Deitel, P.J. Deitel. Java: Como Programar - 6a Edição. Bookman, 2006. I B. Eckel. Thinking in Java - 3a Edição. Livro on-line: http://mindview.net/Books/DownloadSites/ I C. Horstmann. Conceitos de Computação com o Essencial de Java - 3a Edição. Bookman, 2005. I J. Dean, R. Deam. Introduction to Programming with Java: A problem Solving Approach. McGraw-Hill, 2008. I R. Sedgewick, K. Wayne. Introduction to Programming in Java: An Interdisciplinary Approach. Addison Wesley, 2008. I H. Schildt, J. Holmes. A Arte do Java - 3a Edição. McGraw-Hill, 2003. I R. Sedwick. Algorithms in Java - Parts 1-5: Fundamentals, Data Structures, Sorting and Searching, Graph, 3rd Edition. Addison Wesley, 2003. I A.V. Matos. Unified Modeling Language - UML Prático e Descomplicado, 2a Edição. Érica, 2002. I G.T.A. Guedes. UML: Uma abordagem prática, 3a Edição. Novatec, 2008. 37 / 37