A[10] B[8][6] Slides_Java_4 Sistemas Informáticos I 2005-2006 Imaginemos que é necessário escrever um programa que: 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 Isto não é exequível!... 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. -1 n 1
Para criar uma tabela: Declarar a tabela double [] notas; double notas[]; // declara uma tabela de floats // o mesmo efeito... 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. 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 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 [1] = 10.2; notas[49] = 20.0;... soma = notas [0] + notas [1]; System.out.println(notas [0]); 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]; 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); 2
// 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)); É 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;! int n[ ] = {103448355738612; Alternativamente: int n[] = new int[10]; n[0] = 10; n[1] = 34;... n[9] = 12; "!"! # $ % " ' * *++*)* 3
# $% -!"- -- -- - -- -- * *++*)* int tab[] = new int[100]; Escreva umas linhas de código para: (a) colocar os 100 primeiros inteiros (12...100) na tabela tab[0]...tab[99]; (b) colocar os 50 primeiros números pares (24...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]; ' ()length int tab[] = new int[100]; for(int i=0; i < 100; i++) tab[i] = i+1; for(int i=0; i < 50; i++) tab[i] = 2*(i+1); for(int i=0; i < 100 ; i++) tab[i] = 100-i; for(int i=100; i > 0 ; i--) tab[100-i] = i; 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:. /)( 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 4
)* ( (()0 1 /(2 / java.lang.arrayindexoutofboundsexception at ArrayBound.main(ArrayBound.java:7) Exception in thread "main" Finished executing 556 (((((() 7( (2! -$-- -"-''-##-8 #--!- *( 3 *+ )( *( 3!*+!)( *( 3*+)( 55 551 559+1 :(( (2 1 -!--#-$-%--"-'- * 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. 9(2 55; :( for(int i=0; i < 10; i++){ C[i] = A[i] + B[i]; System.out.println("C["+i+"]= "+ C[i]); As Strings têm que ser criadas explicitamente: frases [0] = new String ( Bom dia ); ou frases [1] = Bom dia ;... 5
(()0 6 *< ( ( * =()(> *><?@ 6A A B * 6(2 55 (C ( 3 4++ *< ( *++*D* 6=()(7(55 ( *< B. E * 3 4++ *< ( *++*D*+6 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: 2 A (2 $ 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; 6
+ + 1 3 2 4 -!- -# É possível criar e inicializar uma tabela bidimensional numa única instrução: 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 Alternativa: (2 34++ 3FF4F++ F+F ' # 3 4++ 3 FF4$F++ 2 A F++ ". / ( (2 (##!! +**+ +**+!+**+ +**+ +**+!+**+!+**+! +**+!!+**+! +**+ +**+!+**+ 7
# +. / ( ---- - -!-- -!-#-%- --%-'- +**+ +**+!+**+ +**+ +**+!+**+!+**+! +**+!!+**+! +**+ +**+!+**+ >A. / (>A >A (2 (## 3224#2++ 3 4#++ 32G >A 2) (( >A 2 ) 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 Como somar duas matrizes: A[n][m] B[n][m] C=A+B. ;( (2 1(2 9(2 55(HI);. ; DF 55(HI);. ; 1D1F! 3 FF4F++ F 1F! *. 6J>K 9* 3 FF4F++ 9FF+1F 9F+** 8
% Escreva um programa em Java para calcular o mínimo e o máximo valor numa matriz. % L. ;(2!! -/- -F *. ; >D* 34!++ 3FF4!F++ ;F. )3. )0 ;F+** 553 ; 55 M ; /8 55/( ( 8 55( (( 34!++ 3FF4!F++ 3;F4 ;F / F *. >< >. @. :7@ E*++*( ( *+/+*-*++** $ // Determinar qual a classificação mais alta da tabela. // Assume-se que as notas já foram introduzidas na tabela. float tabela[][] = new float[40][4]; // 40 alunos 4 testes Declaração de uma matriz tri-dimensional 10x10x10: int Mat3D [][][] = new int[10][10][10]; float notamax = tabela [0][0]; int lin = 0 col = 0; for (int i=0; i < tabela.length; i++) for (int j=0; j < tabela [0].length; j++) if (tabela [i][j] > notamax) { notamax = tabela [i][j]; lin = i; col = j System.out.println ("Nota máxima "+notamax); System.out.println ("Obtida pelo aluno "+lin); System.out.println ("No teste "+col); 9
((A. / ((A (2 #$ -F-N 34++ 3FF4#F++ 3NN4$N++ ((A FN0F0N 9 (2 $ 1(2 $ 9(2 $ 3 FF4F++ 3 NN4$N++ FN 1FN! 34++ 3FF4#F++ 3NN4$N++ ((A FN+** *9@ 1B 9* 3 4 ++ 3 FF4F++ 3 NN4$N++ 9FNFN+1FN 9FN+** -. - (()0 % L(L. (! *>; $O(D* /(2$55( ( ($ 3 4/)(++ 55P $( ( /=()(> +/ ((5(/)(55 M * M *+( ((. )( 8 / ( 3 4/)(++ (. )( 8 / 3Q( ( ( *< O( ( MD*+/( 10
/ 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: F1 F2 F3 O1 O2 O3 3 17 7 12 18 10 10 35 24 / Calcule o custo do esquema proposto. Escreva um programa em Java para calcular o custo deste cenário de transporte. 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 O2 O3 F14 0 0 F2 6 6 0 F3 0 3 5 %" (()0 (( -!- - - "-$- - -!# ((R( #--- %-%-- --$ 3 4()(++ 3 FF4()(F++ +(F0(R(F *9 ( *+ 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 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 11
%"0 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 1 2 3 4 4 5 6 7 7 8 9 0 0 1 2 3 1 2 3 4 4 5 6 7 7 8 9 0 0 1 2 3 1 2 3 4 4 5 5 7 7 1 9 0 0 1 2 3 %# 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: 1 2 2 2 5 4 2 2 5 5 4 2 5 5 5 4 1 5 5 5 2 4 5 5 2 2 4 5 2 2 2 4 x1 x3 x2 x4 A = B = y1 y3 y2 y4 ( -!- -# (1 $-%- -8 C = A x B = x1* y1 + x2 * y3 x3* y1 + x4* y3 x1* y2 + x2* y4 x3* y2 + x4 * y4 )(55O( ( ; )(55O( ( ; (( ( O( ( (1 1)(55O( ( (1 (:(2( C ij = m k = 1 A ik x B kj com m igual ao número de colunas de A. 1 2 3 4 x = 5 0 6 1 5 4 15 14 5 = 1x5 + 2x0 3 4++ 3 FF4F++ 9F 3 NN4N++ 9F+N01NF 3 49)(++ 3 FF49)(F++ 9F+*S* 12
1/2 1 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 =... +... (!--$-- - - - '-!-!'- --# -# public class prime_even{ public static void main(string args[]){ int primes[] = {2357111317192329313739414346; int ijsoma; boolean found=false; for(int N=8; N < 54; N=N+2){ //testa os primeiros 50 pares found = false; i = 0; while((!found) (i < primes.length)){ j = 0; while((!found) (j < primes.length)){ if(i!= j){ soma = primes[i] + primes[j]; if(soma == N){ found = true; System.out.println(N+" = "+primes[i]+" + "+primes[j]); j++; // 2o while i ++; // 1o while 3 Considere que tem uma tabela de 10 inteiros que é inicializada com valores aleatórios: (2 55;(( 3 4 ++. )0 Escreva um programa para ordenar esta tabela. 3 (2 55;((. )0 55(T( *1(3( D* **++**+ ( (3( 55( 2(G( (( 3 4'++ 3Q+ ( + + ( (3( 55(( *3( D* **++**+ 13