Tabelas e Matrizes B[8][6] A[10] Arrays e Matrizes em Java Slides_Java_4 Sistemas Informáticos Arrays Necessidade de usarmos Tabelas • Imaginemos que é necessário escrever um programa que: • Solução: utilizar tabelas (arrays) • Uma tabela é um objecto que contém uma lista ordenada de elementos, todos do mesmo tipo. • Os elementos são indexados por um índice que pode variar entre 0 e n-1, sendo n a dimensão da tabela. – leia uma lista de 50 alunos e as respectivas notas. – calcule a nota média. – escreva a diferença da nota de cada aluno para a nota média. • Seria necessário declarar variáveis separadas para cada um dos 50 alunos: String nome1, nome2, nome3, …, nome50 int nota1, nota2, nota3, …, nota50 43 22 77 12 89 23 66 25 99 46 77 39 24 27 11 87 ... 26 0 Isto não é exequível!... – Declarar a tabela double [] notas; double notas[]; // declara uma tabela de floats // o mesmo efeito... – Instanciar a tabela (é necessário usar new para criar a tabela porque as tabelas são objectos) notas = new double [50]; // cria uma tabela com 50 doubles 3 4 5 6 7 8 9 10 11 12 13 14 15 … n-1 length n Exemplo • Para criar uma tabela: 1 2 Elementos dos Arrays • Um elemento de uma tabela é um espaço onde se pode armazenar um valor do tipo declarado. • Os elementos de uma tabela podem ser usados em qualquer ponto de um programa onde possa ser usado um elemento desse tipo. – Ex: notas [1] pode ser usado nas mesmas circunstâncias em que uma variável do tipo double pode ser usada (podemos atribuir-lhe um valor, imprimi-la, utilizá-la em expressões, …) – Inicializar e aceder aos elementos notas [0] = 14.7; notas[49] = 20.0; notas [1] = 10.2; ... soma = notas [0] + notas [1]; System.out.println(notas [0]); 1 Em resumo... • Declarar um array: int r[]; double nums[]; String nomes[]; • Criar um array r = new int[10]; nums = new double[100]; int s[] = new int[20]; char c[] = new char[20]; • Indexar os elementos de um array: r[0] = 20; r[9] = 100; nums[99] = 3.2; s[0] = 5; s[1] = r[0]; continuação... // cálculo da média float soma=0; for (int i=0; i<conta; i++) soma = soma + notas[i]; if (conta > 0) media = soma / conta; else media = 0; System.out.println (media); // Diferenças para a média System.out.println ("Diferenças para a média:"); for (int i=0; i<conta; i++) System.out.println ("Aluno "+i+" "+(notas[i]-media)); } } Duas formas de criar tabelas int n[ ] = {10,34,48,35,5,7,3,8,6,12}; • Alternativamente: int n[] = new int[10]; n[0] = 10; n[1] = 34; ... n[9] = 12; Voltando ao problema... class Notas { public static void main(String arg[]) { final int MAX = 50; float [] notas = new float [MAX]; int conta = 0; float n, media; // leitura das notas (termina com nº negativo) do { System.out.print ("Nota do aluno "+conta+" "); n = Keyboard.readFloat(); if (n >=0) { notas [conta] = n; conta ++; } }while (n >= 0 && conta < MAX); Criação de Tabelas • É possível criar e inicializar uma tabela de forma semelhante aos tipos simples: int diasMes[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; – A tabela é criada com o espaço suficiente para os dados fornecidos na inicialização (12 neste caso). – Assim, a instrução anterior é equivalente a: int diasMes[] = new int [12]; diasMes [0] = 31; diasMes [1] = 28; … diasMes [11] = 31; Exemplo1 class Array { public static void main(String args[]) { int month_days[]; month_days = new int[12]; month_days[0] = 31; month_days[1] = 28; month_days[2] = 31; month_days[3] = 30; month_days[4] = 31; month_days[5] = 30; month_days[6] = 31; month_days[7] = 31; month_days[8] = 30; month_days[9] = 31; month_days[10] = 30; month_days[11] = 31; System.out.println("April has " + month_days[3] + " days."); } } 2 Exemplo2 class AutoArray { public static void main(String args[]) { int month_days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; System.out.println("April has " + month_days[3] + " days."); 3 Exercícios Simples • int tab[] = new int[100]; • Escreva umas linhas de código para: (a) colocar os 100 primeiros inteiros (1,2,...,100) na tabela tab[0],...,tab[99]; (b) colocar os 50 primeiros números pares (2,4,...,100) na tabela tab[0],...,tab[49]; (a) colocar os 100 primeiros inteiros em ordem inversa (100, 99,...,1) na tabela tab[0],...,tab[99]; } } Tamanho de Arrays: length • Quando se cria uma tabela com n elementos, esse é o número máximo que a tabela pode armazenar. – Uma vez criada não é possível alterar o seu tamanho. – O campo length guarda o número máximo de elementos que a tabela pode armazenar. Este campo apenas pode ser lido: Exemplo import essential.*; public class ArrayBound { public static void main(String[] args){ int x[] = new int[10]; for(int i=0; i <= 10; i++) x[i] = i; } int numMax = notas.length; • Isto não implica que a tabela deva estar sempre cheia: – Em cada momento poderá conter entre 0 e n elementos – Um cuidado importante quando se usam tabelas é respeitar os limites para os índices (0 a n-1) – A utilização de índices fora dos limites leva o Compilador de Java a gerar uma excepção: } java.lang.ArrayIndexOutOfBoundsException at ArrayBound.main(ArrayBound.java:7) Exception in thread "main" Finished executing Java.lang.ArrayIndexOutOfBoundsException Exemplo: uso de length // This program demonstrates the length array member. class Length { public static void main(String args[]) { int a1[] = new int[10]; int a2[] = {3, 5, 7, 1, 8, 99, 44, -10}; int a3[] = {4, 3, 2, 1}; Soma de dois Vectores // A[n] // B[n] // C = A + B class SomaVectores{ public static void main(String args[]){ int A[] = new int[10]; int B[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int C[] = new int[10]; System.out.println("length of a1 is " + a1.length); System.out.println("length of a2 is " + a2.length); System.out.println("length of a3 is " + a3.length); // inicializar Vector A for(int i=0; i < 10; i++) A[i] = 100; } } for(int i=0; i < 10; i++){ C[i] = A[i] + B[i]; System.out.println("C["+i+"]= "+ C[i]); } } } 3 Tabelas de Strings • Uma tabela tanto pode conter elementos de um tipo simples, como referências para outros objectos, como Strings por exemplo. – String [] frases = new String [25]; reserva espaço para 25 referências para objectos String. – No entanto, esta instrução não cria as Strings propriamente ditas, mas apenas as referências respectivas. Exemplo import essential.*; class Tab_Strings { public static void main(String args[]) { int n; System.out.print("Numero de alunos = "); n = Keyboard.readInt(); System.out.println("======INPUT DADOS========="); String Tab[] = new String[n]; // aloca espaço para a tabela for(int i=0;i < n; i++){ System.out.print("Nome do aluno "+i+" :"); Tab[i] = Keyboard.readLine(); // guarda strings na tabela } – As Strings têm que ser criadas explicitamente: frases [0] = new String (“Bom dia”); ou frases [1] = “Bom dia”; .... System.out.println("======NOMES========="); for(int i=0;i < n; i++) System.out.println("Nome do aluno "+i+" :"+ Tab[i]); } } Matrizes Matrizes em Java • Uma tabela bi-dimensional representa uma matriz, com linhas e colunas. • Cada elemento de uma tabela bi-dimensional é referenciado usando dois índices: um para as linhas e outro para as colunas. • Na realidade, uma tabela bi-dimensional é uma tabela de tabelas, ou seja é uma tabela uni-dimensional em que cada elemento é uma referência para um objecto tabela. • Exemplo: int[ ][ ] twoD = new int[3][5]; Matrizes Inicialização de uma Matriz • Por exemplo, imaginemos que precisamos de armazenar as classificações de 200 alunos em 4 testes. • Poderíamos usar: float [][] notas = new float [200][4]; – Neste caso os índices podem variar entre 0 e 199 e entre 0 e 3, sendo errado tentar aceder a índices fora destas gamas. – Para aceder a um dado elemento usam-se 2 índices: notas [0][0] = 14.3; notas [199][3] = 10.2; – Para saber a dimensão da tabela: int numLinhas = notas.length; int numColunas = notas [0].length; 1 2 3 4 int[][] m = { {1,2}, {3,4} }; 4 Inicialização de Matrizes • É possível criar e inicializar uma tabela bidimensional numa única instrução: Representação Array 2D 101 010 int [] [] tabela = {{1,0,1}, {0,1,0}} – Esta instrução cria uma tabela de inteiros com duas linhas e três colunas, inicializada com os valores dados int n = 0; for(int i = 0; i < 3; i++) for(int j = 0; j < 5; j++) twoD[i][j] = n++; • Alternativa: int A[][] = new int[n][m]; for(int i=0; i < n; i++) for(int j=0; j < m;j++) A[i][j] = i+j; Exemplo1 Exemplo2 class Matrix { public static void main(String args[]) { double m[][]; m = new double[4][4]; m[0][0] = 1; m[1][1] = 1; m[2][2] = 1; m[3][3] = 1; System.out.println(m[0][0] +" "+ m[0][1] +" "+ m[0][2] +" "+ m[0][3]); System.out.println(m[1][0] +" "+ m[1][1] +" "+ m[1][2] +" "+ m[1][3]); System.out.println(m[2][0] +" "+ m[2][1] +" "+ m[2][2] +" "+ m[2][3]); System.out.println(m[3][0] +" "+ m[3][1] +" "+ m[3][2] +" "+ m[3][3]); } class AutoMatrix { public static void main(String args[]) { double m[][] = { { 0, 0, 0, 0}, { 0, 1, 2, 3}, { 0, 2, 4, 6}, { 0, 3, 6, 9}, }; System.out.println(m[0][0] +" "+ m[0][1] +" "+ m[0][2] +" "+ m[0][3]); System.out.println(m[1][0] +" "+ m[1][1] +" "+ m[1][2] +" "+ m[1][3]); System.out.println(m[2][0] +" "+ m[2][1] +" "+ m[2][2] +" "+ m[2][3]); System.out.println(m[3][0] +" "+ m[3][1] +" "+ m[3][2] +" "+ m[3][3]); } } } Matriz Identidade • Como somar duas matrizes: class IDMatrix { – A[n][m] – B[n][m] – C=A+B public static void main (String args[]) { double[][] ID; ID = new double[4][4]; for (int row=0; row < 4; row++) { for (int col=0; col < 4; col++) { if (row != col) { ID[row][col]=0.0; } else { ID[row][col] = 1.0; } } } } Somar duas matrizes 1000 0100 0010 0001 5 Soma de duas Matrizes class SomaMatrizes{ public static void main(String args[]){ int A[][] = new int[10][3]; int B[][] = new int[10][3]; int C[][] = new int[10][3]; Exercício • Escreva um programa em Java para calcular o mínimo e o máximo valor numa matriz. // comentário…. inicializar Matriz A: A[i][j]= 1 // comentário…. inicializar Matriz B: B[i][j]= 2 for(int i=0; i < 10; i++) for(int j=0; j < 3; j ++){ A[i][j] = 1; B[i][j] = 2; } System.out.println("MATRIZ C"); for(int i=0; i < 10; i++){ for(int j=0; j < 3; j ++){ C[i][j]= A[i][j] + B[i][j]; System.out.print(C[i][j]+ " "); } System.out.println(); } } } Matrizes 3D • Declaração de uma matriz tri-dimensional 10x10x10: int Mat3D [][][] = new int[10][10][10]; Exemplo class threeDMatrix { public static void main(String args[]) { int threeD[][][] = new int[3][4][5]; int i, j, k; for(i=0; i<3; i++) for(j=0; j<4; j++) for(k=0; k<5; k++) threeD[i][j][k] = i * j * k; for(i=0; i<3; i++) { for(j=0; j<4; j++) { for(k=0; k<5; k++) System.out.print(threeD[i][j][k] + " "); System.out.println(); } System.out.println(); } } } Soma de dois Cubos class SomaCubos{ public static void main(String args[]){ int A[][][] = new int[10][3][5]; int B[][][] = new int[10][3][5]; int C[][][] = new int[10][3][5]; for(int i=0; i < 10; i++) for(int j=0; j < 3; j++) for(int k=0; k < 5; k++){ A[i][j][k] = 1; B[i][j][k] = 2; } Exercícios sobre Arrays e Matrizes System.out.println("CUBO C"); for(int i=0; i < 10 ; i++){ for(int j=0; j < 3; j++) for(int k=0; k < 5; k++){ C[i][j][k] = A[i][j][k] + B[i][j][k]; System.out.print(C[i][j][k]+ " "); } System.out.println(); } } } 6 Exercício Problema Transporte Uma empresa de betão tem 3 fábricas (F1, F2, F3) que devem fornecer 3 obras de construção (O1, O2, O3). Os custos por transporte de uma carga de cada fábrica para cada obra são os representados na seguinte matriz: O1 O 2 O3 F1 3 12 10 F 2 17 18 35 F 3 7 10 24 Calcular a Média de Um Array e o Elemento mais distante da média Considere agora que as 3 fábricas podem produzir 4, 12 e 8 cargas por dia e as obras precisam de 10, 9 e 5 cargas por dia, respectivamente. Suponha agora que o gestor das fábricas propõe o seguinte esquema de transporte representado na matriz seguinte: O1 O 2 O3 F1 4 0 0 F 2 6 6 0 F 3 0 3 5 Problema Transporte Exercício 1A • Calcule o custo do esquema proposto. Custo = 3x4 + 12x0 + ... + 24x5 • Escreva um programa em Java para calcular o custo deste cenário de transporte. • Escreva um programa em Java que leia uma matriz de um ficheiro em disco “matriz.txt”. • O programa deve indicar se é uma matriz identidade ou não. 4 1000 0100 0010 0001 Exercício 1B Exercício 2 • Escreva um programa em Java que leia duas matrizes de dois ficheiros em disco “mat_A.txt” e “mat_B.txt”. • O programa deve indicar se as duas matrizes são iguais ou diferentes. Se forem diferentes deve indicar quantos são os valores 4 diferentes. 4 4 1234 • Escreva um programa em Java que verifique se uma matriz A[N][N] é ou não uma matriz simétrica. 1 2 3 4 2 5 6 7 3 6 9 0 4 7 0 3 • Caso não seja uma matriz simétrica deve inverter a matriz da seguinte forma: 1234 1234 4557 1 2 2 2 4567 4567 7190 5 4 2 2 2 4 5 5 7890 7890 0123 5 5 4 2 2 2 4 5 0123 0123 5 5 5 4 2 2 2 4 1 5 5 5 7 Multiplicação de Matrizes • A= x1 x2 x3 x4 • C=AxB= • Cij = B= y1 y3 y 2 y 4 Exercício • Write a java program to multiply two matrices. x1 * y1 + x2 * y3 x1 * y 2 + x 2 * y 4 x3 * y1 + x 4 * y3 x3 * y 2 + x4 * y 4 m ∑Aik x Bkj k =1 5 = 1x5 + 2x0 com m igual ao número de colunas de A. 1 2 3 4 x 5 6 0 −1 = 5 4 15 14 Número Par = Soma de dois números primos • Será que cada número par é igual à soma de dois números primos? • Verifique com a tabela de primos em baixo (N >= 8 até 52) • Exemplos: 12 = 5 + 7 28 = ... + ... 40 = ... + ... 52 = ... + ... int primes[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43}; Ordenar uma Tabela • Considere que tem uma tabela de 10 inteiros que é inicializada com valores aleatórios: n = new int[10]; // initialize the array for (int i = 0; i < 10; i++) { n[i] = (int)(Math.random()*100); } • Escreva um programa para ordenar esta tabela. 8