Você está na página 1de 57

Estruturas de Dados

Amílcar Cardoso

Dep. Engª. Informática

Universidade de Coimbra

http://www.dei.uc.pt/amilcar

amilcar@dei.uc.pt

© Amílcar Cardoso
Linha de Quadrados

• Construir um programa que


desenhe 8 quadrados numa
janela (660x400) de forma a
obter o resultado ilustrado. O
espaço entre cada quadrado e
entre os quadrados das pontas
e o bordo da janela é de 20
píxeis.

© Amílcar Cardoso Programação Multimédia 2


Linha de Quadrados

int x = 50;
int l = 60;
int sp = 20;

void setup() {
size(660,400);
background(255);
rectMode(CENTER);

for (int i=0; i<8; i++) {


fill(183, 236, 255);
rect(x, height/2, l, l);
x = x + l + sp;
}
}

© Amílcar Cardoso Programação Multimédia 3


Linha de Quadrados que mudam de cor

• Desafio: como faria se


quisesse que a cor de
cada um dos quadrados
pudesse ser alterada
individualmente de cada
vez que se desse um
clique nesse quadrado?

© Amílcar Cardoso Programação Multimédia 4


Linha de Quadrados que mudam de cor

• Vamos por partes.


Comecemos por admitir que
apenas um quadrado (o
último premido) tem uma
cor diferente

• Convenção:

• variável n contém o número


do quadrado com cor
diferente

• inicialmente: n = <um inteiro n=2


fora do intervalo de 0 a 7>

© Amílcar Cardoso Programação Multimédia 5


Linha de Quadrados que mudam de cor, versão 0
int n = 8, l = 60, sp = 20;

void setup() {
size(660,400); void mousePressed() {
rectMode(CENTER); if (mouseY>((height-l)/2) && mouseY<((height+l)/2)
} {
if (mouseX>20 && mouseX<80) n = 0;
void draw() { if (mouseX>100 && mouseX<160) n = 1;
int x = 50; if (mouseX>180 && mouseX<240) n = 2;
background(255); if (mouseX>260 && mouseX<320) n = 3;
for (int i=0; i<8; i++) { if (mouseX>340 && mouseX<400) n = 4;
if (i==n) if (mouseX>420 && mouseX<480) n = 5;
fill(255,255,0); if (mouseX>500 && mouseX<560) n = 6;
else if (mouseX>580 && mouseX<640) n = 7;
fill(183,236,255); }
rect(x, height/2, l, l); }
x = x + l + sp;
}
}
© Amílcar Cardoso Programação Multimédia 6
Alternativa para “mousePressed”
void mousePressed() {
if (mouseY>((height-l)/2) && mouseY<((height+l)/2)
{
if (mouseX>20 && mouseX<80) n = 0;
if (mouseX>100 && mouseX<160) n = 1;
if (mouseX>180 && mouseX<240) n = 2;
if (mouseX>260 && mouseX<320) n = 3;
if (mouseX>340 && mouseX<400) n = 4;
if (mouseX>420 && mouseX<480) n = 5;
if (mouseX>500 && mouseX<560) n = 6;
if (mouseX>580 && mouseX<640) n = 7;
} void mousePressed() {
} if (mouseY>((height-l)/2) && mouseY<((height+l)/2)) {
int p = mouseX / (l+sp);
int q = mouseX % (l+sp);
if (q>sp) n = p;
if (q==0) n=p-1;
}
}
© Amílcar Cardoso Programação Multimédia 7
Linha de Quadrados que mudam de cor

• Desafio: queremos que cada


quadrado mantenha a nova cor
depois de premido e que comute
a cor alternadamente de cada
vez que seja premido

Para controlar a cor


individualmente, é necessário
armazenar a cor de cada um.
Como são 8…

© Amílcar Cardoso Programação Multimédia 8


Arrays

• Array: lista ordenada de elementos

• Elementos podem ser de qualquer tipo

• Elementos têm que ser todos do mesmo tipo

• Elementos indexados por um índice que pode variar entre 0 e n-1, sendo
n a dimensão do array

© Amílcar Cardoso Programação Multimédia 9


Declaração de Arrays

• Declarar a referência para o array:

• int[ ] anArray; // anArray é um array de inteiros

Tipo de cada
elemento Array de... nome do array

• Outros exemplos:

• float[ ] anArrayOfFloats;

• boolean[ ] anArrayOfBooleans;

• char[ ] anArrayOfChars;

• PacMan[ ] anArrayOfPacMan;

© Amílcar Cardoso Programação Multimédia 10


Criação, inicialização, acesso

// Declarar array
int[ ] umArray;

// Criar o array (novo objeto)


umArray = new int[150]; // espaço para 150 inteiros

// Inicializar e aceder aos elementos:


umArray[0] = 14;
umArray[45] = 10;
int soma = umArray[0] + umArray[45];

println("Elemento com índice 0: " + umArray[0]);


println("Elemento com índice 45: " + umArray[45]);
println(“Soma dos dois: “ + soma);

© Amílcar Cardoso Programação Multimédia 11


Criação, inicialização, acesso

• Formas simplificadas:

• Declarar e criar numa instrução:

• int[ ] umArray = new int [150];

• Declarar, criar, inicializar:

• int[ ] intArray = {100, 200, 300, 400, 500, 600, 700, 800};

• float[] floatArray = { 1.2, 3.5, 2.0, 3.4123, 9.9 };

• Para obter o tamanho de um array:

• int tamanho = anArray.length;

atributo do objeto
© Amílcar Cardoso Programação Multimédia 12
Operações simples sobre arrays

• Inicializar array com números aleatórios:

// Array para 10 valores inteiros


int[ ] values = new int[10];

// Inicializar com números aleatórios


for (int i = 0; i < values.length; i++ ) {
values[i] = (int) random(0,20);
}

• Calcular somatório:

// Calcular somatório dos valores do array


float soma = 0;
for (int i = 0; i < values.length; i++ ) {
soma = soma + values[i];
}
© Amílcar Cardoso Programação Multimédia 13
Mostrar valores

// Array com 10 valores inteiros


int[ ] values = new int[10];

// Inicializar com valores aleatórios


for (int i = 0; i < values.length; i++ ) {
values[i] = (int) random(0,20);
}

// Mostrar valores
for (int i = 0; i < values.length; i++ ) {
println(values[i]);
}

// Calcular média dos valores do array


float soma = 0;
for (int i = 0; i < values.length; i++ ) {
soma = soma + values[i];
}
println("Média = " + soma/values.length);
© Amílcar Cardoso Programação Multimédia 14
Gráfico de barras

size(600,300);
background(0);
fill(0,255,0);
int origem = 10; // Calcular média dos valores do array
float soma = 0;
// Array com 300 valores inteiros for (int i = 0; i < values.length; i++ ) {
int[ ] values = new int[300]; soma = soma + values[i];
}
// Inicializar com valores aleatórios println("Média = " + soma/values.length);
for (int i = 0; i < values.length; i++ ) {
values[i] = (int) random(0,280); // Desenhar nível da média
} stroke(255,255,0);
line(0, origem +soma/values.length, width,
// Desenhar um retangulo de larg = 2 origem +soma/values.length);
// por cada elemento do array
for (int i = 0; i < values.length; i++ ) {
rect(i*2, origem, 2, values[i]);
}
© Amílcar Cardoso Programação Multimédia 15
Linha de Quadrados que mudam de cor

• Desafio: como faria se


quisesse que a cor de
cada um dos quadrados
pudesse ser alterada
individualmente de cada
vez que se desse um
clique nesse quadrado?

© Amílcar Cardoso Programação Multimédia 16


Linha de Quadrados, versão com arrays
boolean[ ] azul = new boolean[8];
int l = 60, sp = 20;

void setup() { void mousePressed() {


size(660,400); if (mouseY>((height-l)/2) &&
rectMode(CENTER); mouseY<((height+l)/2)) {
for (int i=0; i<8; i++) { int p = mouseX / (l+sp);
azul[i] = true; } int q = mouseX % (l+sp);
} if (q>sp)
if (azul[p])
void draw() { azul[p] = false;
int x = 50; else
background(255); azul[p] = true;
for (int i=0; i<8; i++) { }
if (azul[i]) fill(183,236,255); }
else fill(255,255,0);
rect(x, height/2, l, l);
x = x + l + sp;
}
}
© Amílcar Cardoso Programação Multimédia 17
Exemplo

© Amílcar Cardoso Programação Multimédia 18


Exemplo

void draw() {
// Array com 10 valores inteiros
frameRate(1);
int[ ] y = new int[10];
// Array com 10 cores
// Mostrar circulo
color[ ] c = new color[10];
for (int i = 0; i < y.length; i++ ) {
int raio = 20;
fill(c[i]);
ellipse((i+1)*width/11, y[i], 2*raio, 2*raio);
void setup () {
}
size(500,200);
}
background(150,180,255);
void mousePressed() {
for (int i = 0; i < y.length; i++ ) {
// Inicializar com valores aleatórios
float d = dist(mouseX, mouseY, (i+1)*width/11,
for (int i = 0; i < y.length; i++ ) {
y[i]);
y[i] = (int) random(20,height-20);
if (d <= raio)
c[i] = color(0, 0, 255);
c[i] = color(255,255,0);
}
}
}
}

© Amílcar Cardoso Programação Multimédia 19


Bolas

size(450,300);
background(0);
smooth();
stroke(255);

// Array com 8 niveis de cinzento


int[ ] cinz = new int[8];

// Inicializar com números aleatórios


for (int i = 0; i < cinz.length; i++ ) {
cinz[i] = (int) random(0,255);
}

// Mostrar circulos
for (int i = 0; i < cinz.length; i++ ) {
fill(cinz[i]);
ellipse((i+1)*50, height/2, 30, 30);
}
© Amílcar Cardoso Programação Multimédia 20
Outro exemplo

© Amílcar Cardoso Programação Multimédia 21


Outro exemplo

void draw() {
// Array com 24 valores inteiros (ordenadas) frameRate(1);
int[ ] y = new int[24];
// Mostrar circulos
void setup () { fill(200,0,200);
size(500,200); for (int i = 0; i < y.length; i++ ) {
background(0); ellipse((i+1)*20, y[i], 18, 18);
}
// Inicializar com números aleatórios
for (int i = 0; i < y.length; i++ ) { // Sortear um e mudar a cor
y[i] = (int) random(9,200-9); int k = (int) random(24);
} fill(255,255,0);
} ellipse((k+1)*20, y[k], 18, 18);
}

© Amílcar Cardoso Programação Multimédia 22


A tinta que desaparece

© Amílcar Cardoso Programação Multimédia 23


A tinta que desaparece
void draw() {
background(255);

// deslocar valores
int[] xpos = new int[100];
for (int i = 0; i < xpos.length-1; i++ ) {
int[] ypos = new int[100];
xpos[i] = xpos[i + 1];
ypos[i] = ypos[i + 1];
void setup() {
}
size(400,400);
smooth();
// Nova posicao
xpos[xpos.length-1] = mouseX;
// Inicializar arrays
ypos[ypos.length-1] = mouseY;
for (int i = 0; i < xpos.length; i++ ) {
xpos[i] = 0;
// Desenhar tudo
ypos[i] = 0;
for (int i = 0; i < xpos.length; i++ ) {
}
noStroke();
}
fill(255-i*2);
ellipse(xpos[i],ypos[i],i/2,i/2);
}
}
© Amílcar Cardoso Programação Multimédia 24
Arrays multidimensionais

• Um array bi-dimensional representa uma matriz, com linhas e


colunas:

• Cada elemento referenciado com dois índices (coluna, linha)

• Exemplo para armazenar matriz de níveis de cinzento:

• int [ ][ ] cinzentos = new int [60][100];

• Acesso a elementos:

• cinzentos [20][3] = 143;

• int n = cinzentos [133][0];

© Amílcar Cardoso Programação Multimédia 25


Ladrilho

size(300,500);

int [][] cinzentos = new int [60][100];

// Preenche matriz
for (int i=0; i<60; i++)
for (int j=0; j<100; j++) {
cinzentos[i][j] = int(random(0,255));
}

// Desenha matriz
for (int i=0; i<60; i++)
for (int j=0; j<100; j++) {
fill(cinzentos[i][j]);
rect(i*5, j*5, 5, 5);
}

© Amílcar Cardoso Programação Multimédia 26


Ladrilho a cores

size(300,500);

color [][] matriz = new color [60][100];

// Preenche matriz
for (int i=0; i<60; i++)
for (int j=0; j<100; j++) {
matriz[i][j] = color(int(random(0,255)),
int(random(100,200)),0);
}

// Desenha matriz
for (int i=0; i<60; i++)
for (int j=0; j<100; j++) {
fill(matriz[i][j]);
rect(i*5, j*5, 5, 5);
}

© Amílcar Cardoso Programação Multimédia 27


Ladrilho a cores animado

void draw() {
color [][] matriz = new color [60][100]; frameRate(1);
int lazul = 0;
// Rendering da matriz
for (int i=0; i<60; i++)
void setup() {
for (int j=0; j<100; j++) {
size(300,500);
fill(matriz[i][j]);
rect(i*5, j*5, 5, 5);
// Preenche matriz
}
for (int i=0; i<60; i++)
for (int j=0; j<100; j++) {
// Linha a azul
matriz[i][j] = color(int(random(0,255)),
for (int i=0; i<60; i++)
int(random(100,200)),0);
matriz[i][lazul] = color(0,0,255);
}
}
if (lazul < 99) lazul++;
}

© Amílcar Cardoso Programação Multimédia 28


Varrimento de um array bidimensional

• Número de colunas de um array bidimensional “grelha”:

• grelha.length

• Número de linhas:

• grelha[0].length tamanho de uma coluna

for (int i=0; i<grelha.length; i++)


for (int j=0; j<grelha[0].length; j++) {
grelha[i][j] = color(int(random(255)), int(random(255)), int(random(255)));
}
}

© Amílcar Cardoso Programação Multimédia 29


Exercício (Teste Formativo 2015/16)

© Amílcar Cardoso Programação Multimédia 30


Exercício do Teste Formativo - possível resolução

void draw(){
int nb=10; ellipseMode(CENTER);
int nb_max=20; fill (mouseY/2);
int [][] centros = new int [nb_max][2]; for(int i=0;i<nb;i++){
int [] raios = new int [nb_max]; ellipse(centros[i][0],centros[i][1],
raios[i], raios[i]);
void setup(){ }
size(500,500); }
background(255); void mousePressed(){
for (int i=0;i<nb;i++){ if (nb<nb_max){
centros[i][0]=int(random(0,500)); centros[nb][0]=mouseX;
centros[i][1]=int(random(0,500)); centros[nb][1]=mouseY;
raios[i]=int(random(50,100)); raios[nb]=int(random(50,100));
} nb++;
} }
}

© Amílcar Cardoso Programação Multimédia 31


Estruturas de Dados Dinâmicas

© Amílcar Cardoso
Estruturas de Dados

• Estáticas:

• Têm tamanho fixo (capacidade fixa)

• Exemplo: arrays

• Dinâmicas:

• Têm tamanho variável (capacidade pode aumentar/diminuir)

• Exemplo: arrayLists

© Amílcar Cardoso Programação Multimédia 33


ArrayList
lista.size()-1
0 1
lista

lista.size()

• Criada com uma capacidade inicial (pode ser nula)

• Podemos acrescentar novos elementos

• Podemos eliminar elementos

© Amílcar Cardoso Programação Multimédia 34


ArrayList de objetos
lista.size()-1
0 1
lista

lista.size()

• Criação:
Inicialmente vazia

• ArrayList<Classe> lista = new ArrayList( );

• alternativa:

• ArrayList<Classe> lista = new ArrayList( cap );

Capacidade inicial (inteiro)


Classe dos elementos da lista

© Amílcar Cardoso Programação Multimédia 35


ArrayList para tipos de dados primitivos
lista.size()-1
0 1
lista

lista.size()

• Criação:
Inicialmente vazia

• ArrayList lista = new ArrayList( );

Para já, consideramos


• alternativa:
apenas ArrayList de tipos
de dados primitivos
• ArrayList lista = new ArrayList( cap );

Capacidade inicial (inteiro)


Sem indicação de Classe!

© Amílcar Cardoso Programação Multimédia 36


Adicionar elemento: add( )

• Adicionar elemento:

• lista.add('a'); // adiciona carater 'a' na posição 0

• lista.add(2); // adiciona inteiro 2 na posição 1

• lista.add(0,'c'); // adiciona carater ‘c' na posição 0

• Notas:

• elemento pode ser de qualquer tipo primitivo

• elemento é adicionado no final da lista, exceto se mencionarmos


explicitamente outra posição (2 argumentos)

• só se pode adicionar no final ou numa posição já existente

© Amílcar Cardoso Programação Multimédia 37


Ler elementos: get( )

lista a 2 c

• Copiar para variável: necessário respeitar o tipo!

char c = (char) lista.get(0);

int n = (int) lista.get(1);


int n = (int) lista.get(2);

Necessário moldar (“cast”) o


tipo do valor copiado
ERRO: o tipo original era char

© Amílcar Cardoso Programação Multimédia 38


Outros métodos
lista.size()-1
0 1
lista

lista.size()

• Apagar elemento na posição i:

• lista.remove(1); // apaga elemento na posição 1

• Verificar se elemento existe na lista:

• if (lista.contains(2)) (…)

• Posição de um elemento na lista:

• int i = lista.indexOf(‘a’); // i é a posição de ‘a' na lista; se não existir, i = -1

© Amílcar Cardoso Programação Multimédia 39


Exemplo

ArrayList a = new ArrayList();

a.add('a');

a.add('b');

a.add('c');

a.add('d');

a.add(2, 'e');

terminal:

a.add('f');
Conteúdo de a após adições: [a, b, e, c, d, f]

// Display the array list


Conteúdo de a após apagamentos: [a, b, e, c, f]
println("Conteúdo de a após adições: " + a);

// Remove elements from the array list

if (a.contains('z')) a.remove(a.indexOf('z'));

if (a.contains('d')) a.remove(a.indexOf('d'));

println("Conteúdo de a após apagamentos: " + a);

© Amílcar Cardoso Programação Multimédia 40


Outros métodos

• Adicionar uma ArrayList a outra:

• lista1.addAll(pos, lista2);

lista1 b a t e m

Adiciona ArrayList lista2 na


lista2 l e v e
posição pos da lista1

lista1.addAll(2, lista2) b a l e v e t e m

• Remover todos os elementos de uma lista:

• lista.clear( );

© Amílcar Cardoso Programação Multimédia 41


Exemplo

ArrayList a1 = new ArrayList();

ArrayList a2 = new ArrayList();

a1.add('a');

a1.add('b');

a1.add('c');

a1.add('d');

a2.add(1);

a2.add(2);
terminal:

Conteúdo de a1 após adição: [a, 1, 2, b, c, d]


a1.addAll(1,a2);

println("Conteúdo de a1 após adição: " + a1);

© Amílcar Cardoso Programação Multimédia 42


Mostrar conteúdo de ArrayLists

ArrayList a = new ArrayList();


a.add('a');
a.add('b');
a.add('c');
a.add('d');

for(int i=0; i<a.size(); i++)


print("(" + a.get(i)+ ")");
println( );
terminal:

(a)(b)(c)(d)

© Amílcar Cardoso Programação Multimédia 43


Voltemos aos ArrayList de objetos
lista.size()-1
0 1
lista

lista.size()

• Criação:
Inicialmente vazia

• ArrayList<Classe> lista = new ArrayList( );

• alternativa:

• ArrayList<Classe> lista = new ArrayList( cap );

Capacidade inicial (inteiro)


Classe dos elementos da lista

© Amílcar Cardoso Programação Multimédia 44


Uma classe

• Classe para representar posições:

public class Pos {


int x, y;

Pos(int x, int y) {
this.x = x;
this.y = y;
}
(…)
}

© Amílcar Cardoso Programação Multimédia 45


Melhorar classe Pos

• Criar posições relativas a uma posição já existente (por translação):

public class Pos {


int x, y;

Pos(int x, int y) {
this.x = x;
this.y = y;
}

// Cria posição por translação


public Pos transl(int xi, int yi) {
return new Pos(x+xi, y+yi);
}
}

© Amílcar Cardoso Programação Multimédia 46


Listas de posições

ArrayList<Pos> lista = new ArrayList();

// adiciona duas posições


Pos p1 = new Pos(3,3);
lista.add(p1);
Pos p2 = new Pos(0,1);
lista.add(p2);

alternativa
// adiciona duas posições
lista.add(new Pos(3,3));
lista.add(new Pos(0,1));

© Amílcar Cardoso Programação Multimédia 47


Mostrar conteúdo de listas de posições

void printlist(ArrayList<Pos> lista) {


for(int i=0; i<lista.size(); i++)
print("(" + lista.get(i).x+ ", " + lista.get(i).y+ ") ");
println( );
}

© Amílcar Cardoso Programação Multimédia 48


Mais sobre listas de posições

ArrayList<Pos> lista1 = new ArrayList();


ArrayList<Pos> lista2 = new ArrayList();

// adiciona quatro posições a lista 1


Pos p1 = new Pos(3,3);
lista1.add(p1); // insere posição (3,3)
Pos p2 = new Pos(0,1);
lista1.add(p2); // insere posição (0,1)
lista1.add(p1.transl(0,1)); // insere posição (3,4)
lista1.add(p2.transl(0,1)); // insere posição (0,2)
print("lista1:" ); printlist(lista1);

// adiciona duas posições a lista 2


Pos p3 = new Pos(0,2);
lista2.add(p3); // insere posição (0,2)
lista2.add(p3.transl(0,1)); // insere posição (0,3) terminal:

print("lista2:" ); printlist(lista2); lista1:(3, 3) (0, 1) (3, 4) (0, 2)

lista2:(0, 2) (0, 3)

© Amílcar Cardoso Programação Multimédia 49


Exemplo

• Resolver usando
lista de Pos( )

© Amílcar Cardoso Programação Multimédia 50


Exemplo

reta 0 reta 1 reta i

ArrayList p

pos 0 pos 2 pos 2*i pos 2*i+1

reta i

© Amílcar Cardoso Programação Multimédia 51


Exemplo ArrayList p
reta 0 reta 1 reta i

ArrayList<Pos> p = new ArrayList(); pos 0 pos 2 pos 2*i pos 2*i+1

reta i
void setup () {
size(500,500);
}

void draw() {
background(255);
// Desenhar retas número de retas
for (int i = 0; i < p.size()/2; i++ ) {
line((int)p.get(i*2).x, (int)p.get(i*2).y,
(int)p.get(i*2+1).x, (int)p.get(i*2+1).y);
}
// Desenhar pontos
fill(0); número de pontos
for (int i=0; i<p.size(); i++) void mousePressed() {
ellipse((int)p.get(i).x, (int)p.get(i).y, 5, 5); p.add(new Pos(mouseX,mouseY));
} }

© Amílcar Cardoso Programação Multimédia 52


Operações sobre listas de posições

• Saber se lista contém uma posição dada:

• O método “contains” da ArrayList vai recorrer ao método “equals” da


classe Pos -> temos de implementar o método!

• Uma possibilidade seria:

(…)
// Posições iguais?
public boolean equals(Pos p) {
return (this.x==p.x) && (this.y==p.y);
}

• Porém…

© Amílcar Cardoso Programação Multimédia 53


Operações sobre listas de posições

• Saber se lista contém uma posição dada:

• Porém… (…)
// Posições iguais?
public boolean equals(Pos p) {
return (this.x==p.x) && (this.y==p.y);
}

ArrayList<Pos> lista1 = new ArrayList();

Pos p1 = new Pos(3,3);


lista1.add(p1); // insere posição (3,3)

println(lista1.contains(new Pos(3,3)));

O resultado não é o esperado: dá falso.


© Amílcar Cardoso Programação Multimédia 54
Operações sobre listas de posições

• O problema está na forma como o “contains” está implementado


no Java. Para termos o comportamento esperado, temos de
reimplementar o “equals” na classe “Pos”:

public class Pos {


int x, y;

(…) //Make sure we override the right equals


boolean equals(Object pos) {
if(!(pos instanceof Pos)) return false;

return this.x == ((Pos) pos).x && this.y == ((Pos) pos).y;


}

© Amílcar Cardoso Programação Multimédia 55


Operações sobre listas de posições

• Saber se lista contém uma posição dada:

• Agora sim:

ArrayList<Pos> lista1 = new ArrayList();

Pos p1 = new Pos(3,3);


lista1.add(p1); // insere posição (3,3)

println(lista1.contains(new Pos(3,3)));

O resultado é o esperado: dá verdadeiro

© Amílcar Cardoso Programação Multimédia 56


§

© Amílcar Cardoso Programação Multimédia 57

Você também pode gostar