• Nenhum resultado encontrado

Isto não é exequível!... B[8][6] A[10] Slides_Java_4

N/A
N/A
Protected

Academic year: 2021

Share "Isto não é exequível!... B[8][6] A[10] Slides_Java_4"

Copied!
13
0
0

Texto

(1)

Sistemas Informáticos I, 2005-2006

Slides_Java_4

A[10]

B[8][6]

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.

n

(2)

Para criar uma tabela:

–Declarar a tabela

double [] notas; // declara uma tabela de floats

double notas[]; // o mesmo efeito...

–Instanciar a tabela (é necessário usar newpara criar a tabela porque as tabelas são objectos)

notas = newdouble [50]; // cria uma tabela com 50 doubles

–Inicializar e aceder aos elementos

notas [0] = 14.7; notas [1] = 10.2; ...

soma = notas [0] + notas [1]; System.out.println(notas [0]);

notas[49] = 20.0;

• 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, …)

• 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]; classNotas {

public staticvoidmain(String arg[]) { finalintMAX = 50;

float []notas = newfloat[MAX];

intconta = 0;

floatn, 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 ++; }

(3)

// cálculo da média floatsoma=0; for(inti=0; i<conta; i++)

soma = soma + notas[i]; if(conta > 0)

media = soma / conta;

elsemedia = 0;

System.out.println (media);

// Diferenças para a média

System.out.println ("Diferenças para a média:");

for(inti=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[ ] = {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;

"

!" ! # $ % & " ' ( ) ) * * + + * )* , ,

(4)

#

-! " - - - - - - - - - - , ( ) ) * * + + * )* , ,

$

%

&

• 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];

'

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 lengthguarda 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

(5)

( ( )0 1 / (2 3 4 ++ / , , java.lang.ArrayIndexOutOfBoundsException at ArrayBound.main(ArrayBound.java:7)

Exception in thread "main" Finished executing

)

* (

55 6 ( ( ( ( ( ( ) 7( (2 ! -$ -& - -" -' ' -# # -8 , # - -! - , ( ) ) * ( 3 * + )( ( ) ) * ( 3 ! * + ! )( ( ) ) * ( 3 * + )( , ,

&

55 55 1 55 9 + 1 : ( ( (2 1 -! - -# -$ -% -& -" -' - , 9 (2 55 ; : ( 3 4 ++ , , ,

for(int i=0; i < 10; i++){ C[i] = A[i] + B[i];

System.out.println("C["+i+"]= "+ C[i]);

• 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.

– As Strings têm que ser criadas explicitamente:

frases [0] = new String (“Bom dia”); ou

frases [1] = “Bom dia”; ....

(6)

( ( )0 6 ( ) ) *< ( ( * = ( ) ( > ( ) ) * >< ?@ 6 A 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;

(7)

+

4

3

2

1

-!,- -#, ,

É possível criar e inicializar uma tabela

bi-dimensional numa única instrução:

(

- - ,- - - ,,

Esta instrução cria uma tabela de inteiros com duas

linhas e três colunas, inicializada com os valores dados

Alternativa:

(2

3

4

++

3

F

F 4

F++

F

+F

+

1 0 1 0 1 0

'

#

3

4

++

3

F

F 4 $ F++

2 A

F

++

"

. / ( (2 ( # # ! ! ( ) ) +* *+ +* *+ ! +* *+ ( ) ) +* *+ +* *+ ! +* *+ ( ) ) ! +* *+ ! +* *+ ! ! +* *+ ! ( ) ) +* *+ +* *+ ! +* *+ , ,

(8)

#

. / ( - - - - -! - ,- -! -#-% - -%-' ,- ,-, ( ) ) +* *+ +* *+ ! +* *+ ( ) ) +* *+ +* *+ ! +* *+ ( ) ) ! +* *+ ! +* *+ ! ! +* *+ ! ( ) ) +* *+ +* *+ ! +* *+ , ,

+

>A . / ( >A >A (2 ( # # 3 2 2 4 # 2 ++ 3 4 # ++ 3 2 G >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 ( H I) ; . ; D F 55 ( H I) ; . ; 1 D1 F ! 3 4 ++ 3 F F 4 F ++ F 1 F ! , ( ) ) *. 6 J >K 9* 3 4 ++ 3 F F 4 F ++ 9 F F + 1 F ( ) ) 9 F + * * , ( ) ) ,

(9)

%

• Escreva um programa em Java para calcular

o mínimo e o máximo valor numa matriz.

%

L . ; (2 ! ! -/--F ( ) ) *. ; > D* 3 4! ++ 3 F F4! F++ ; F . )3 . ) 0 ( ) ) ; F + * * , ( ) ) , ( ) ) 55 3 ; 55 M ; / 8 55 / ( ( 8 55 ( ( ( 3 4! ++ 3 F F4! F++ 3 ; F 4 ; 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

floatnotaMax = tabela [0][0]; intlin = 0, col = 0; for(inti=0; i < tabela.length; i++)

for(intj=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); }

,

$

• Declaração de uma matriz tri-dimensional 10x10x10:

int Mat3D [][][] = new int[10][10][10];

(10)

((A . / ((A (2 # $ -F-N 3 4 ++ 3 F F4# F++ 3 N N4$ N++ ((A F N 0 F 0 N 3 4 ++ 3 F F4# F++ 3 N N4$ N++ ( ) ) ((A F N + * * ( ) ) , ( ) ) , , ,

&

9 (2 $ 1 (2 $ 9 (2 $ 3 4 ++ 3 F F 4 F++ 3 N N 4 $ N++ F N 1 F N ! , ( ) ) *9@ 1 B 9* 3 4 ++ 3 F F 4 F++ 3 N N 4 $ N++ 9 F N F N + 1 F N ( ) ) 9 F N + * * , ( ) ) , , ,

%

-

.

-( -( )0 L ( L . ( ! ( ) ) *> ; $ O ( D* / (2 $ 55 ( ( ( $ 3 4 /)( ++ 55 P $ ( ( / =( ) ( > + / , ( ( 5 ( /)( 55 M ( ) ) * M * + ( ( ( . ) ( 8 / ( 3 4 /)( ++ ( . ) ( 8 / 3 Q ( ( ( , , ( ) ) *< O ( ( M D* + / ( , ,

(11)

/

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:

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: 24 10 7 35 18 17 10 12 3 3 2 1 F F F 5 3 0 0 6 6 0 0 4 3 2 1 F F F 3 2 1O O O 3 2 1O O O

/

• Calcule o custo do esquema proposto.

• Escreva um programa em Java para calcular

o custo deste cenário de transporte.

&

( ( )0 ( ( - ! - ,- & - " - $ ,- & - -! # ,, ( ( R ( # - - ,- % -% - ,- - -$ ,, 3 4 ()( ++ 3 F F 4 ( )( F++ + ( F 0 ( 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.

1 0 0 0

0 1 0 0

0 0 1 0

0 0 0 1

4

(12)

%

"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

diferentes.

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 4 4 4

%

#

• 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

• A =

B =

• C = A x B =

• C

ij

= A

ikx

B

kj

com m igual ao número de colunas de A. = m k 1 + + + + 4 * 4 2 * 3 3 * 4 1 * 3 4 * 2 2 * 1 3 * 2 1 * 1 y x y x y x y x y x y x y x y x 4 3 2 1 x x x x 4 3 2 1 y y y y 4 3 2 1 −1 0 6 5 14 15 4 5

x

=

5 = 1x5 + 2x0 ( -!,- -#,, ( 1 $-%,- -8 ,, )( 55 O ( ( ; )( 55 O ( ( ; ( ( ( O ( ( ( 1 1 )( 55 O ( ( ( 1 ( : (2 ( 3 4 ++ 3 F F 4 F++ 9 F 3 N N 4 N++ 9 F + N 01 N F , , 3 4 9)( ++ 3 F F 4 9 )( F++ ( ) ) 9 F + *S * ( ) ) , , ,

(13)

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[] = {2,3,5,7,11,13,17,19,23,29,31,37,39,41,43,46}; int i,j,soma;

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 ;( ( 3 4 ++ . ) 0 , 55 ( T ( ( ) ) *1 (3 ( D* 3 4 ++ ( ) ) * *+ +* * + , ( ( 3 ( 55 ( 2 ( G ( ( ( 3 4 ' ++ 3 Q + ( + + ( ( 3 ( , , , 55 ( ( ( ) ) ( ) ) * 3 ( D* 3 4 ++ ( ) ) * *+ +* * + , , ,

Referências

Documentos relacionados

Há quem diga que a Internet está ignorando o repórter profissional, já que computadores podem fazer muitos dos trabalhos que os jornalistas estão acostumados a fazer:

Uma empresa oferece serviços de acesso a internet cobrando uma quantia fixa por mês de cada assinante, independente das horas de uso, mais uma outra quantia, também

[r]

• Lista de argumentos tipados como uma função; • Resposta tipada declarada ou inferida;. • Captura de contexto no escopo onde foi declarado; • Modificar o contexto no escopo

Devido à disputa de nutrientes no solo, a cada árvore que é plantada a mais, cada uma das árvores produz 1/4 de cestas a menos.. Pode-se calcular a área do quadrado

Devido à disputa de nutrientes no solo, a cada árvore que é plantada a mais, cada uma das árvores produz 1/4 de cestas a menos.. Observando o que acontece em cada caso para

La caldera permanecerá en funcionamiento estival solamente para satisfacer la demanda de agua caliente para uso domiciliario, indicando la temperatura seleccionada.. Interrupção

Para tal, foram realizados um levantamento documental e análise de dados dos discentes egressos/as de dois Programas de Pós-Graduação (PPG) Stricto Sensu do