Professional Documents
Culture Documents
+3 22 77 12 89 23 66 25 99 +6 77 39 2+ 27 11 87 ... 26
Arrays
n
-1
2
Para criar uma tabela:
Declarar a tabela
double [] notas; // declara uma tabela de floats
double notas[]; // o mesmo efeito...
Instanciar a tabela ( necessrio usar new para criar a tabela
porque as tabelas so objectos)
notas = new double [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]);
Exemplo
notas[49] = 20.0;
Elementos dos Arrays
Um elemento de uma tabela um espao 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 circunstncias em que
uma varivel do tipo double pode ser usada (podemos atribuir-lhe
um valor, imprimi-la, utiliz-la em expresses, )
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];
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);
Voltando ao problema...
3
// clculo da mdia
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);
// Diferenas para a mdia
System.out.println ("Diferenas para a mdia:");
for (int i=0; i<conta; i++)
System.out.println ("Aluno "+i+" "+(notas[i]-media));
}
}
continuao...
possvel 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 espao suficiente para os dados
fornecidos na inicializao (12 neste caso).
Assim, a instruo anterior equivalente a:
int diasMes[] = new int [12];
diasMes [0] = 31;
diasMes [1] = 28;
4 3
2 1
inf[][] m ~ { {I,Z}, {3,4} },
possvel criar e inicializar uma tabela bi-
dimensional numa nica instruo:
inf [] [] fobeIo ~ {{I,0,I}, {0,I,0}}
Esta instruo cria uma tabela de inteiros com duas
linhas e trs colunas, inicializada com os valores dados
Alternativa:
inf A[][] ~ new inf[n][m],
for(inf i~0, i n, i++)
for(inf j~0, j m,j++)
A[i][j] ~ i+j,
Inicializao de Matrizes
1 0 1
0 1 0
Representao Array 2D
inf n ~ 0,
for(inf i ~ 0, i 3, i++)
for(inf j ~ 0, j b, j++)
fwoD[i][j] ~ n++,
Exemplo1
cIoss Mofrix {
pubIic sfofic void moin(Sfring orgs[]) {
doubIe m[][],
m ~ new doubIe[4][4],
m[0][0] ~ I,
m[I][I] ~ I,
m[Z][Z] ~ I,
m[3][3] ~ I,
Sysfem.ouf.prinfIn(m[0][0] +" "+ m[0][I] +" "+ m[0][Z] +" "+ m[0][3]),
Sysfem.ouf.prinfIn(m[I][0] +" "+ m[I][I] +" "+ m[I][Z] +" "+ m[I][3]),
Sysfem.ouf.prinfIn(m[Z][0] +" "+ m[Z][I] +" "+ m[Z][Z] +" "+ m[Z][3]),
Sysfem.ouf.prinfIn(m[3][0] +" "+ m[3][I] +" "+ m[3][Z] +" "+ m[3][3]),
}
}
8
Exemplo2
cIoss AufoMofrix {
pubIic sfofic void moin(Sfring orgs[]) {
doubIe m[][] ~ {
{ 0, 0, 0, 0},
{ 0, I, Z, 3},
{ 0, Z, 4, o},
{ 0, 3, o, 9},
},
Sysfem.ouf.prinfIn(m[0][0] +" "+ m[0][I] +" "+ m[0][Z] +" "+ m[0][3]),
Sysfem.ouf.prinfIn(m[I][0] +" "+ m[I][I] +" "+ m[I][Z] +" "+ m[I][3]),
Sysfem.ouf.prinfIn(m[Z][0] +" "+ m[Z][I] +" "+ m[Z][Z] +" "+ m[Z][3]),
Sysfem.ouf.prinfIn(m[3][0] +" "+ m[3][I] +" "+ m[3][Z] +" "+ m[3][3]),
}
}
Matriz Identidade
cIoss IDMofrix {
pubIic sfofic void moin (Sfring orgs[]) {
doubIe[][] ID,
ID ~ new doubIe[4][4],
for (inf row~0, row 4, row++) {
for (inf coI~0, coI 4, coI++) {
if (row l~ coI) {
ID[row][coI]~0.0,
}
eIse {
ID[row][coI] ~ I.0,
}
}
}
}
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Somar duas matrizes
Como somar duas matrizes:
A[n][m]
B[n][m]
C=A+B
Soma de duas Matrizes
cIoss SomoMofri;es{
pubIic sfofic void moin(Sfring orgs[]){
inf A[][] ~ new inf[I0][3],
inf 8[][] ~ new inf[I0][3],
inf C[][] ~ new inf[I0][3],
// comenforio,. inicioIi;or Mofri; A: A[i][j]~ I
// comenforio,. inicioIi;or Mofri; 8: 8[i][j]~ Z
for(inf i~0, i I0, i++)
for(inf j~0, j 3, j ++){
A[i][j] ~ I,
8[i][j] ~ Z,
}
Sysfem.ouf.prinfIn("MATPIZ C"),
for(inf i~0, i I0, i++){
for(inf j~0, j 3, j ++){
C[i][j]~ A[i][j] + 8[i][j],
Sysfem.ouf.prinf(C[i][j]+ " "),
}
Sysfem.ouf.prinfIn(),
}
}
}
9
Exerccio
Escreva um programa em Java para calcular
o mnimo e o mximo valor numa matriz.
Encontrar Mnimo numa Matriz
cIoss Find_Minimum{
pubIic sfofic void moin(Sfring Args[]) {
inf mofri;[][] ~ new inf[Z0][Z0],
inf minimum, x, y,
inf i,j,
Sysfem.ouf.prinfIn("Mofri; InicioI: " ),
for (i ~0, iZ0,i++){
for(j~0, jZ0, j++) {
mofri;[i][j] ~ (inf) Mofh.fIoor((Mofh.rondom() ^ I00)),
Sysfem.ouf.prinf(mofri;[i][j] + " " ),
}
Sysfem.ouf.prinfIn(),
}
Sysfem.ouf.prinfIn(),
// find minimum
minimum ~ mofri;[0][0], // no inicio o minimo e iguoI mofri;[0][0]
x ~ -I, // x e y voo guordor os coordenodos
y ~ -I, // onde se enconfror o voIor minimo
for (i~0, iZ0,i++)
for(j~0, jZ0, j++) {
if(mofri;[i][j] minimum){
minimum ~ mofri;[i][j],
x ~ i,
y ~ j,
}
}
Sysfem.ouf.prinfIn("MIMIMUM VALUE ~ " + minimum + " enconfrodo no coordenodo ("+x+","+y+")"),
Sysfem.ouf.prinfIn(),
}
}
// Determinar qual a classificao mais alta da tabela.
// Assume-se que as notas j foram introduzidas na tabela.
float tabela[][] = new float[40][4];
// 40 alunos, 4 testes
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 mxima "+notaMax);
System.out.println ("Obtida pelo aluno "+lin);
System.out.println ("No teste "+col);
}
Encontrar o Mximo Matrizes 3D
Declarao de uma matriz tri-dimensional 10x10x10:
int Mat3D [][][] = new int[10][10][10];
10
Exemplo
cIoss fhreeDMofrix {
pubIic sfofic void moin(Sfring orgs[]) {
inf fhreeD[][][] ~ new inf[3][4][b],
inf i, j, k,
for(i~0, i3, i++)
for(j~0, j4, j++)
for(k~0, kb, k++)
fhreeD[i][j][k] ~ i ^ j ^ k,
for(i~0, i3, i++) {
for(j~0, j4, j++) {
for(k~0, kb, k++)
Sysfem.ouf.prinf(fhreeD[i][j][k] + " "),
Sysfem.ouf.prinfIn(),
}
Sysfem.ouf.prinfIn(),
}
}
}
Soma de dois Cubos
cIoss SomoCubos{
pubIic sfofic void moin(Sfring orgs[]){
inf A[][][] ~ new inf[I0][3][b],
inf 8[][][] ~ new inf[I0][3][b],
inf C[][][] ~ new inf[I0][3][b],
for(inf i~0, i I0, i++)
for(inf j~0, j 3, j++)
for(inf k~0, k b, k++){
A[i][j][k] ~ I,
8[i][j][k] ~ Z,
}
Sysfem.ouf.prinfIn("CU8O C"),
for(inf i~0, i I0 , i++){
for(inf j~0, j 3, j++)
for(inf k~0, k b, k++){
C[i][j][k] ~ A[i][j][k] + 8[i][j][k],
Sysfem.ouf.prinf(C[i][j][k]+ " "),
}
Sysfem.ouf.prinfIn(),
}
}
}
Exerccios sobre Arrays e
Matrizes
Calcular a Mdia de Um Array e o
Elemento mais distante da mdia
imporf essenfioI.^,
pubIic cIoss FurfhesfFromMeonZ {
pubIic sfofic void moin(Sfring[] orgs) {
Sysfem.ouf.prinfIn("Infrodu;o b nmeros:"),
inf x[] ~ new inf[b], // decIoro umo fobeIo de b infs
inf sum ~ 0,
for(inf i~0, i x.Iengfh, i++){ // I os b infeiros e coIcuIo o suo somo
x[i] ~ Ieyboord.reodInf(),
sum ~ sum + x[i],
}
doubIe medio ~ sum/(doubIe)x.Iengfh, // coIcuIo o medio
Sysfem.ouf.prinfIn("A medio ~ " + medio),
doubIe femp ~ Mofh.obs(medio - x[0]),
inf ifem ~ 0,
for(inf i~I, i x.Iengfh, i++){
doubIe gop ~ Mofh.obs(medio - x[i]),
if (gop femp){
femp ~ gop,
ifem ~ i,
}
}
Sysfem.ouf.prinfIn("Mmero mois disfonfe do medio: " + x[ifem]),
}
}
11
Problema Transporte
Uma empresa de beto tem 3 fbricas (F1, F2, F3) que devem
fornecer 3 obras de construo (O1, O2, O3). Os custos por
transporte de uma carga de cada fbrica para cada obra so os
representados na seguinte matriz:
Considere agora que as 3 fbricas 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 fbricas prope
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 1 O O O
3 2 1 O O O
Problema Transporte
Calcule o custo do esquema proposto.
Custo = 3x+ + 12x0 + ... + 2+x5
Escreva um programa em Java para calcular
o custo deste cenrio de transporte.
Soluo
imporf essenfioI.^,
pubIic cIoss fronsporf {
pubIic sfofic void moin(Sfring[] orgs){
doubIe [][] cosf_fobIe ~ {{3,IZ,I0},{I7,I8,3b},{7,I0,Z4}},
doubIe [][] esquemo ~ {{4,0,0},{o,o,0},{0,3,b}},
inf cusfo~0,
for(inf i~0, i cosf_fobIe.Iengfh, i++)
for(inf j~0, j cosf_fobIe[0].Iengfh, j++)
cusfo ~ cusfo + cosf_fobIe[i][j] ^ esquemo[i][j],
Sysfem.ouf.prinfIn("Cusfo fofoI do fronsporfe ~ "+cusfo),
}
}
Exerccio 1A
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 no.
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
4
12
Exerccio 1B
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
so iguais ou diferentes. Se forem diferentes
deve indicar quantos so 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
Exerccio 2
Escreva um programa em Java que verifique
se uma matriz A[N][N] ou no uma matriz
simtrica.
1 2 3 4
2 5 6 7
3 6 9 0
4 7 0 3
Caso no seja uma matriz simtrica 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
Multiplicao de Matrizes
A = B =
C = A x B =
C
ij
= A
ik
x B
kj
com migual ao nmero 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
Multiplicao de Matrizes
pubIic cIoss MuItipIy{
pubIic sfofic void moin(Sfring orgs[]){
doubIe [][] A ~ {{I,Z},{3,4}},
doubIe [][] 8 ~ {{b,o},{0,-I}},
inf n ~ A.Iengfh, //nmero de Iinhos do mofri; A
inf m ~ A[0].Iengfh, //nmero de coIunos do mofri; A (deve ser iguoI oo nmero de Iinhos de 8)
inf p ~ 8[0].Iengfh, //nmero de coIunos de 8
doubIe [][] V ~ new doubIe[n][p],
for (inf i ~ 0, i n, i++){
for (inf j ~ 0, j p, j++){
C[i][j] ~ 0,
for (inf k ~ 0, k m, k++)
C[i][j] +~ A[i][k]^8[k][j],
}
}
for (inf i ~ 0, i C.Iengfh, i++){
for (inf j ~ 0, j C[0].Iengfh, j++)
Sysfem.ouf.prinf(C[i][j] + "\f"),
Sysfem.ouf.prinfIn(),
}
}
}
13
Nmero Par = Soma de dois
nmeros primos
Ser que cada nmero par igual soma de dois
nmeros primos?
Verifique com a tabela de primos em baixo (N >= 8 at 52)
Exemplos: 12 = 5 + 7
28 = ... + ...
40 = ... + ...
52 = ... + ...
inf primes[] ~ {Z,3,b,7,II,I3,I7,I9,Z3,Z9,3I,37,4I,43},
Soluo
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
}
}
}
Ordenar uma Tabela
Considere que tem uma tabela de 10 inteiros
que inicializada com valores aleatrios:
n ~ new inf[I0],
// inifioIi;e fhe orroy
for (inf i ~ 0, i I0, i++) {
n[i] ~ (inf)(Mofh.rondom()^I00),
}
Escreva um programa para ordenar esta
tabela.
Ordenar uma Tabela
cIuss ubbIeSort {
pubIic sfofic void moin(Sfring orgs[]) {
inf[] n,
n ~ new inf[I0],
// inifioIi;e fhe orroy
for (inf i ~ 0, i I0, i++) {
n[i] ~ (inf)(Mofh.rondom()^I00),
}
// prinf fhe orroys inifioI order
Sysfem.ouf.prinfIn("8efore sorfing:"),
for (inf i ~ 0, i I0, i++) {
Sysfem.ouf.prinfIn("n["+i+"] ~ " + n[i]),
}
booIeon sorfed ~ foIse,
// sorf fhe orroy
whiIe (lsorfed) {
sorfed ~ frue,
for (inf i~0, i 9, i++) {
if (n[i] n[i+I]) {
inf femp ~ n[i],
n[i] ~ n[i+I],
n[i+I] ~ femp,
sorfed ~ foIse,
}
}
}
// prinf fhe sorfed orroy
Sysfem.ouf.prinfIn(),
Sysfem.ouf.prinfIn("Affer sorfing:"),
for (inf i ~ 0, i I0, i++) {
Sysfem.ouf.prinfIn("n["+i+"] ~ " + n[i]),
}
}
}