java slides on vectors and matrices

Propaganda
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
Download