introdução à programacao em processing

105
Introdução à Programação em Processing Jorge C. S. Cardoso http:// jorgecardoso.eu Programa de Doutoramento em Ciência e Tecnologia das Artes – Arte Interactiva 19 Fevereiro 2011

Upload: jorge-c-s-cardoso

Post on 19-Jan-2015

3.283 views

Category:

Education


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Introdução à Programacao em Processing

Introdução à Programação em Processing

Jorge C. S. Cardosohttp://jorgecardoso.eu

Programa de Doutoramento em Ciência e Tecnologia das Artes – Arte Interactiva

19 Fevereiro 2011

Page 2: Introdução à Programacao em Processing

Tópicos• Conceitos de programação de

computadores– Hardware, evolução das linguagens de

programação, código fonte vs código máquina, máquina virtual

• Estruturas básicas de programação em Processing– Variáveis, condições, ciclos, funções

• Programação orientada a objectos (OOP)– Classes, objectos, herança, construtores, destrutores,

encapsulamento, herança, method overriding

Page 3: Introdução à Programacao em Processing

Hardware

• Processador– CPU (Central Processing Unit)– É a parte de um sistema de computador

que executa as instruções de um programa de computador

Page 4: Introdução à Programacao em Processing

Hardware

• Memória RAM (Random Access Memory)– Volátil (precisa de alimentação eléctrica

para preservar os dados)– O CPU lê e escreve directamente para

esta memória– O programa que o CPU executa está

escrito na memória RAM

Page 5: Introdução à Programacao em Processing

Hardware• Memória persistente

– Não volátil (mantém os dados mesmo sem alimentação eléctrica)

• Exemplos– Disco duro– Memória Flash (cartões SD, Flash pen, …)

• Os programas são armazenados nesta memória– Quando os executamos passam para a RAM

Page 6: Introdução à Programacao em Processing

Linguagens de Programação

• Programa– Sequência de instruções que o CPU

executa– As instruções estão na RAM

• Exemplo– Somar 3 + 5 e multiplicar o resultado

por 2– Como é que o CPU faz isto?

Programa naMemória RAM

1

3

3

5

5

2

Page 7: Introdução à Programacao em Processing

CPU• Possui memória

interna – Muito pouco espaço– As unidades de

memória interna do processador chamam-se registos

• Conhece uma lista de instruções

• Percorre a memória RAM e lê e executa instrução a instrução

Instrução

Significado

1 [x] Coloca [x] no registo A

2 [x] Coloca [x] no registo B

3 [x] Soma [x] ao conteúdo do registo A

4 [x] Subtrai [x] ao conteúdo do registo A

5 [x] Multiplica [x] pelo conteúdo do registo A

6 Divide o conteúdo do registo A por B e coloca em A

7 [x] Compara o valor [x] com o conteúdo do registo A. Se forem iguais coloca o valor 1 no registo B, senão coloca o valor 0.

8 [x] Se o registo A tiver o valor zero, salta para a posição de memória [x]

9 [x] Salta para a posição [x] da memória

10 [x] Coloca o conteúdo do registo A na posição de memória [x]A B C D

Page 8: Introdução à Programacao em Processing

Evolução das linguagens• Os primeiros

“programadores” de computador escreviam programas em números– Usavam directamente a

tabela de instruções do processador

– muito sujeito a erros...– muito trabalhoso...

• Criou-se uma linguagem mais fácil de decorar e utilizar, baseada em mnemónicas– Assembly Language

.model small

.stack

.datamessage db "Hello world, I'm learning Assembly !!!", "$"

.code

main procmov ax,seg messagemov ds,ax

mov ah,09lea dx,messageint 21h

mov ax,4c00hint 21hmain endpend main

Page 9: Introdução à Programacao em Processing

Evolução das linguagens• As linguagens de programação foram evoluindo para

sintaxes mais próximas da linguagem naturalo Linguagens de alto-nível

source: http://chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf

Page 10: Introdução à Programacao em Processing

• Texto que o programador escreve numa determinada linguagem de programação (e.g., ObjC, Java, ...)

Código fonte

int addTwoNumbers( int num1, int num2 ){    //This adds two numbers    return num1 + num2;

    /* Some other comment    just to show how to do it    for multiple lines. */}

Page 11: Introdução à Programacao em Processing

Código Máquina

• Instruções executadas directamente pelo processador

• O código máquina resulta de um processo de tradução do código fonte numa linguagem entendida directamente pelo processador (sequência de números)

.code

main procmov ax,seg messagemov ds,ax

mov ah,09lea dx,messageint 21h

mov ax,4c00hint 21hmain endpend main

Page 12: Introdução à Programacao em Processing

Linguagens de Programação:  Criação de um executável

• Compiladoro Converte código fonte em código máquina

(específico para cada CPU - e.g. Intel Atom, Apple A4)

o Código máquina gerado pelo compilador também conhecido como "código objecto"

• Linkero Combina os diferentes módulos de código

máquina (i.e. previamente compilados) e gera o ficheiro final que irá ser executado pela CPU

o Permite o uso de bibliotecas disponibilizadas por terceiros

Page 13: Introdução à Programacao em Processing

Linguagens de Programação:  Criação de executável em Java

• Compiladoro A linguagem Java é compilada em código

máquina para um processador virtual (máquina virtual)

o O código máquina resultante é chamado "bytecode“

• Em Java não existe necessidade de "linkagem"

o Uma aplicação Java consiste num conjunto destes ficheiros (e não apenas um)

o A máquina virtual trata de carregar para a memória os ficheiros necessários à medida que o programa executa

Page 14: Introdução à Programacao em Processing

Linguagens de Programação:Máquina Virtual Java

• A máquina virtual Java é um processador que não existe fisicamente (apenas existe a sua especificação)

• Este processador virtual é implementado através de software em qualquer computador

• Para correr um programa Java temos de ter instalado este processador virtual (Java Virtual Machine - JVM)

• A vantagem é que o nosso programa corre em qualquer plataforma que tenha uma JVM instalada (só temos de compilar uma vez)

Page 15: Introdução à Programacao em Processing

Linguagens de Programação

•O programa pode ser descrito usando vários tipos de linguagens:

– “Natural”• "tell Finder to open myDocument.doc”

– Diagrama

– Programação • (e.g., Java, C, Obj-C, C++)

void draw() {background(0);

/* actualizar posição */x = x + dirX;if ( x < minX || x > maxX ) {     dirX = -dirX;    x = x + dirX;    lX = x;}

Page 16: Introdução à Programacao em Processing

Linguagens de Programação

• Na descrição de um programa é essencial definir:– Ponto de entrada. Qual a primeira

instrução a executar?– Sequência: como avanço de instrução

em instrução?

Page 17: Introdução à Programacao em Processing

Linguagens de Programação

• Java

o Permite a criação de programas que podem ser executados em várias plataformas sem modificação

o A sua utilização tornou-se mais conhecida através das applets pequenos programas que podem ser executados num browser.

o Os programas escritos em Java são compilados num código máquina virtual que é depois (aquando da execução do programa) transformado em código máquina real

Page 18: Introdução à Programacao em Processing

Linguagens de Programação• Processing

“Processing is an open source programming language and environment for people who want to create images, animations, and interactions. Initially developed to serve as a software sketchbook and to teach fundamentals of computer programming within a visual context, Processing also has evolved into a tool for generating finished professional work. Today, there are tens of thousands of students, artists, designers, researchers, and hobbyists who use Processing for learning, prototyping, and production.” – http://processing.org

Page 19: Introdução à Programacao em Processing

Processing• “Free to download and open source• Interactive programs using 2D, 3D or PDF

output• OpenGL integration for accelerated 3D• For GNU/Linux, Mac OS X, and Windows• Projects run online or as double-clickable

applications• Over 100 libraries extend the software into

sound, video, computer vision, and more...• Well documented, with many books available” –

http://processing.org

Page 20: Introdução à Programacao em Processing

Processing Examples• Animation

– Nokia Friends (http://postspectacular.com/process/20080810_nokiafriends)– ImaViz – Sound Visualizer (http://www.openprocessing.org/visuals/?visualID=9923hh)

• “Music”– Ball droppings (http://balldroppings.com/js/)– PSO

• Video– Catalina music video (http://moullinex.tumblr.com/post/3180520798/catalina-music-video)– Papa Roach – Getting away with murder (http://processing.org/exhibition/works/papa/

index.html)• 3D

– Hair Ball (http://www.openprocessing.org/visuals/?visualID=12399)

• (Generative) Design– Marius Watz (http://www.unlekker.net)– http://artes.ucp.pt/blogs/index.php/PMultimedia/2009/10/03/capas-de-livros

• Games – Pong Multiplayer (http://artes.ucp.pt/ftp/a0306005/index.html)

• Instalations– My little piece of privacy (http://www.niklasroy.com/project/88/my-little-piece-of-privacy/)

Page 21: Introdução à Programacao em Processing

Processing

• IDE (Integrated Development Environment)

Page 22: Introdução à Programacao em Processing

10-04-2023 Jorge Cardoso

22 Processing - eixos da janela gráfica

Page 23: Introdução à Programacao em Processing

Processing

• Algumas instruçõessizebackground

line, rect, ellipse, curve

fill, strokenoFill, noStroke

Page 24: Introdução à Programacao em Processing

Exemplo 1size(400, 600);

background(255);

stroke(0);strokeWeight(3);line(100, 150, 300, 450);line(100, 450, 300, 150);

// curva superiorstrokeWeight(2);stroke(0);noFill();curve(0, 0, 100, 150, 300, 150, 400, 0);

// pontos de controlo//fill(255, 0, 0);//noStroke();//ellipse(0, 0, 5, 5);//ellipse(400, 0, 5, 5);

//curva inferiorstroke(0);noFill();curve(0, 600, 100, 450, 300, 450, 400, 600);

Page 25: Introdução à Programacao em Processing

Introdução à programação • Comentários• Variáveis• Condições• Ciclos• Funções

Page 26: Introdução à Programacao em Processing

Aviso!

http://xkcd.com/859/

Page 27: Introdução à Programacao em Processing

Introdução à Programação• Comentários

– Servem para o programador se ajudar a si mesmo a lembrar porque é que fez as coisas de determinada forma

– São ignoradas pelo compilador

// Comentário de uma linha/* Comentário de várias linhas */

int addTwoNumbers( int num1, int num2 ){    //a comment: add the two numbers    int result = num1 + num2;

    /* Some other comment    just to show how to do it    for multiple lines. */

    return result;}

Page 28: Introdução à Programacao em Processing

Variáveis• Variáveis são uma forma de armazenar valores durante

a execução de um programa– Uma variável é um nome que utilizamos para nos referirmos a

um valor– Podemos alterar o valor durante o programa– Sempre que o nome é utilizado no programa é

automaticamente substituído pelo valor correspondente

int someNumber;int anotherNumber;int result;

someNumber = 3;anotherNumber = 2;

//result stores the value 3 * 2 = 6result = someNumber * anotherNumber;

Page 29: Introdução à Programacao em Processing

Variáveis• Antes de podermos usar uma variável temos de a

declarar. – A declaração indica o tipo de dados que a variável vai guardar.

• Inteiros (int, long) • Decimais (float, double)• Lógicos (boolean)• Caracteres (char)

• Sintaxe:<tipo> nomeDaVariavel;<tipo> nomeDaVariavel = <valorinicial>;

int myNumber;

long anotherNumber = 13;

float aFloatNumber = 0.24;double aDoublePrecisionNumber = 1.23e2;

boolean isActive = true;

char aLetter = 'P';

Page 30: Introdução à Programacao em Processing

Variáveis• Para guardarmos um valor numa variável temos de

atribuí-lo à variável.minhaVariavel = <valor>;

• Aquilo que atribuimos a uma variável é o resultado de uma expressão. Uma expressão pode ser:– Literal : Um valor escrito directamente no código

• idade = 33; // 33 é um literal– Variável : O valor de uma variável

• idade = idadeJoao; // idadeJoao é outra variável– Função : O valor devolvido por uma função definida previamente

• idade = random(10); // random é uma função – Expressões anteriores ligadas com operadores aritméticos : Definição

recursiva!•  idade = idadeJoao + 10 * 3;

Page 31: Introdução à Programacao em Processing

Variáveis• Algumas restrições no uso de nomes em

variáveis:– Nomes das variáveis têm começar com uma letra do alfabeto

(dígitos não são permitidos) ou por um underscore (_)– Nomes de variáveis podem conter letras e dígitos, mas

espaços ou outros caracteres especiais não são permitidos.

– Os nomes de variáveis são case sensitive (e.g. myNumber é diferente de mynumber)

– Palavras reservadas do Java não podem ser usadas como nomes de variáveis (e.g. int, float, for, while, do, break, ...)

– Os nomes das variáveis devem ser escolhidos de forma a tornar o seu significado o mais claro e legível possível.

Page 32: Introdução à Programacao em Processing

Exemplo 2int centerX = 100;int centerY = 100;

size(400, 600);

background(255);

stroke(0);strokeWeight(3);line(centerX-100, centerY-150, centerX+100, centerY+150);line(centerX-100, centerY+150, centerX+100, centerY-150);

// curva superiorstrokeWeight(2);stroke(0);noFill();curve(centerX-200, centerY-300, centerX-100, centerY-150, centerX+100, centerY-150, centerX+200, centerY-300);

//curva inferiorstroke(0);noFill();curve(centerX-200, centerY+300, centerX-100, centerY+150, centerX+100, centerY+150, centerX+200, centerY+300);

Page 33: Introdução à Programacao em Processing

Operadores• Operadores aritméticos

+ (adição)- (subtracção)* (multiplicação)/ (divisão, inteira ou fraccionária)% (resto da divisão inteira - modulo)

• Os operadores numa expressão são aplicados da esquerda para a direita, mas os operadores *, / e % têm precedência sobre + e -– Se quisermos alterar a precedência, temos de usar parêntesis:  (  )

1+2*3 = 1+6 = 7(1+2)*3 = 3*3 = 9

Page 34: Introdução à Programacao em Processing

Exercício 1• Crie um programa em Java que:

– armazene em duas variáveis os valores 5 e 2– realize a divisão entre as variáveis (i.e. 5 / 2)– guarde o resultado numa variável– imprima o resultado da operação

• Decisões a tomar:– Que tipo de variáveis definir?

• int, float, double, ...??

• Que tipo a usar para o resultado da divisão?– int, float, double, ...??

• Existem diferenças no resultado?– divisão inteira VS divisão vírgula flutuante...

Page 35: Introdução à Programacao em Processing

Soluçãoint aNumber = 5;int anotherNumber = 2;float aFloat = 2.0f;float result;

result = aNumber / anotherNumber;

println(result);

Page 36: Introdução à Programacao em Processing

Condições• Em quase todos os programas é necessário executar

algumas acções apenas se uma determinada condição for verdadeira...

Page 37: Introdução à Programacao em Processing

Condições if• Na sua forma mais simples a estrutura if resume-se

a executar um conjunto de acções se determinada condição for verdadeira. 

• As chavetas { } delimitam as acções executadas condicionalmente. 

if ([condição]) {     [acções] }

Page 38: Introdução à Programacao em Processing

Condições if• A condição é uma expressão do tipo

boolean – Literal true ou false – Variável (boolean) com o valor true ou false – Expressão com operadores condicionais

boolean isActive = true;

if(isActive) //eqv. a if (isActive == true){    //do something...    isActive = false;}

Page 39: Introdução à Programacao em Processing

Exemplo 3int centerX = 200;int centerY = 300;

boolean v1 = false;

size(400, 600);

background(255);

stroke(0);strokeWeight(3);line(centerX-100, centerY-150, centerX+100, centerY+150);line(centerX-100, centerY+150, centerX+100, centerY-150);

strokeWeight(2);stroke(0);noFill();

if (v1) { // curva superior curve(centerX-100-100, centerY-150-150, centerX-100, centerY-150, centerX+100, centerY-150, centerX+100+100, centerY-150-150); // curva inferior curve(centerX-100-100, centerY+150+150, centerX-100, centerY+150, centerX+100, centerY+150, centerX+100+100, centerY+150+150);} else { // curva superior curve(centerX-100-100, centerY-150+150, centerX-100, centerY-150, centerX+100, centerY-150, centerX+100+100, centerY-150+150); // curva inferior curve(centerX-100-100, centerY+150-150, centerX-100, centerY+150, centerX+100, centerY+150, centerX+100+100, centerY+150-150);}

Page 40: Introdução à Programacao em Processing

Condições if• As condições usadas nos testes podem

usar os operadores condicionais: – igual a: == (atenção!) – maior do que: > – menor do que: < – maior ou igual a: >= – menor ou igual a: <= – diferente: != 

• O resultado de uma operação condicional é um valor true ou false

int aNumber = 10;int anotherNumber = 6;

boolean correct = false; 

if(9 == aNumber)    correct = true;

if (anotherNumber > aNumber)    aNumber = anotherNumber;    

Page 41: Introdução à Programacao em Processing

Condições if• Algumas variantes da estrutura if:

– If... Else... – If... Else if... – If... Else if... Else...– Switch

Page 42: Introdução à Programacao em Processing

Condições if... else...• O if também nos permite executar acções

se a condição for falsa

if (<condição>) {<acções A> //executado se a condição for true...

} else {    <acções B> //executado se a condição for false...}

Page 43: Introdução à Programacao em Processing

Condições if... else if• É possível combinar ifs sequencialmente

if (<condição A>) {    <acções A>} else if (<condição B>){     <acções B>} else {     <acções C>}

Page 44: Introdução à Programacao em Processing

Operadores Lógicos• É possível testar condições complexas

através dos operadores lógicos: operadores que combinam comparações simples:– AND : As duas comparações têm de ser

verdadeiras ao mesmo tempo– OR : Pelo menos uma das comparações tem

de ser verdadeiro– NOT : Inverte (i.e. nega) o valor da

comparação

Page 45: Introdução à Programacao em Processing

Operadores Lógicos• AND : &&

• OR : ||

• NOT : !

if (x > 10 && x < 20) {println(“Entre 10 e 20”);

}

if (x < 10 || x > 20) { println(“Fora do intervalo [10; 20]”);}

if (!(x < 10)) { println(“X não é menor do que 10”);}

Page 46: Introdução à Programacao em Processing

Exemplo 4int centerX = 200;int centerY = 300;

boolean v1 = true;boolean v2 = true;

size(400, 600);

background(255);

stroke(0);strokeWeight(3);line(centerX-100, centerY-150, centerX+100, centerY+150);line(centerX-100, centerY+150, centerX+100, centerY-150);

strokeWeight(2);stroke(0);noFill();

if (v2) { // curva superior curve(centerX-100-100, centerY-150-150, centerX-100, centerY-150, centerX+100, centerY-150, centerX+100+100, centerY-150-150); // curva inferior curve(centerX-100-100, centerY+150+150, centerX-100, centerY+150, centerX+100, centerY+150, centerX+100+100, centerY+150+150);}

if (v1) { // curva superior curve(centerX-100-100, centerY-150+150, centerX-100, centerY-150, centerX+100, centerY-150, centerX+100+100, centerY-150+150); // curva inferior curve(centerX-100-100, centerY+150-150, centerX-100, centerY+150, centerX+100, centerY+150, centerX+100+100, centerY+150-150);}

if (v1 && v2) { strokeWeight(1); fill(150); ellipse(centerX, centerY-150-20, 40, 40);}

Page 47: Introdução à Programacao em Processing

Exercício 2• Implemente um programa que:

– Defina 3 variáveis para armazenar três inteiros à escolha (num1, num2 e num3)

– Teste se num1 é igual, maior ou menor que num2, e imprima uma mensagem do tipo "7 é maior do que 3".

– No caso de num1 ser menor que num2, verifique se num3 está dentro do intervalo [num1, num2], e em caso afirmativo imprima uma mensagem do tipo "7 está entre 2 e 15".

– Divida num1 por num2, imprimindo o resultado, tendo o cuidado de verificar se num2 é diferente de zero!

– Divisões por zero em Java provocam o "crash" da aplicação!

Page 48: Introdução à Programacao em Processing

Exercício 2int num1 = 5;int num2 = 12;int num3 = 7;if(num1 == num2) {    println(num1 + “ is equal to ” + num2);} else if(num1 > num2){    println(num1 + “ is bigger than “ + num2);} else {    println(num1 + “ is smaller than ” + num2);     if (num3 > num1 && num3 < num2) {    println(num3 + “ is between “ + num1 + “ and “ + num2);    }}

if(num2 != 0){    println("A divisão de ” + num1 + “ por “ + num2 + “ é “ + ((float)num1/num2));}

Page 49: Introdução à Programacao em Processing

Ciclos• Os ciclos permitem-nos executar um

conjunto de instruções repetidamente

• Existem duas classes de ciclos:– Ciclos que executam um número pré-

determinado de vezes: for– Ciclos que executam enquanto uma

condição é verdadeira: do e while

Page 50: Introdução à Programacao em Processing

Ciclo for• Executado um número pré-determinado

de vezes

for (<inicialização>; <condição>; <incremento>) {    <acções>}

• Variável de ciclo inicia-se em zero (e declara-se dentro do próprio ciclo)

• Condição simples com o limite de iterações

• Incremento da variável em uma unidade (através do operador incremento ++) for (int i = 0; i < 10; i++)

{     println("Counting… ” + i); }

Page 51: Introdução à Programacao em Processing

Exemplo 5

if (v1 && v2) { strokeWeight(1); fill(150); for (int i = 0; i < 5; i++) { ellipse(centerX, centerY-150-20-100+i*20, 40, 40); } /* int n = 10; for (int i = 0; i < n; i++) { ellipse(centerX, centerY-150-20-100+i*100/n, 40, 40); }*/ /* for (int y = centerY-150-20-100; y < centerY-150-20; y = y + 1) { ellipse(centerX, y, 40, 40); }*/ }

Page 52: Introdução à Programacao em Processing

Ciclo while• Executa um conjunto de

instruções enquanto uma condição for verdadeira– O teste é feito antes da

execução

while (<condição>) {    <acções>}

int i = 0;while (i <= 10) {    println("Counting... “ + i);    i = i + 1;}

Page 53: Introdução à Programacao em Processing

Ciclo do• Executa um conjunto de

instruções enquanto uma condição for verdadeira– O teste é feito depois da

execução

do { <acções>} while (<condição>);

int i = 0;do {    println("Counting... “ + i);    i = i + 1;} while (i <= 10);

Page 54: Introdução à Programacao em Processing

Exercício• Implemente um programa que calcule

uma sequência de Fibonacci, segundo a seguinte relação recorrente:– F(n) = F(n-1) + F(n-2), com F(0) = 0 e F(1) = 1– e.g.: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

• 4.1. Imprima os primeiros 100 números da sequência

• 4.2. Imprima todos os números da sequência inferiores a 10000

Page 55: Introdução à Programacao em Processing

Soluçãoint numFibonacciNumbers = 100;long valN = 0;long valN_1 = 1;for (int n = 0; n < numFibonacciNumbers; n++) {    println(n + “ -> “ + valN));    valN = valN + valN_1;    valN_1 = valN - valN_1;}

Page 56: Introdução à Programacao em Processing

Arrays• Um array é um contentor de valores do mesmo tipo

armazenada numa região contígua da memória RAM• Um vector tem um nome e várias posições que podem

ser acedidas através de um índice (entre parêntesis rectos [ ] ) :

• O índice tem de ser um valor inteiro

     idade[0] = 23;   idade[1] = 47;   idade[2] = 11;   idade[3] = 92;   idade[4] = 76;

   int age = idade[3]; //age = 92

Page 57: Introdução à Programacao em Processing

Arrays - Declaração e Inicialização

• Tal como qualquer outra variável, é necessário indicar qual o tipo de valores que o array irá guardar. 

• É necessário também definir qual o tamanho do array, antes de o utilizar.

<tipo> meuArray[];meuArray = new <tipo>[tamanho];

int idades[];

idades = new int[5];

Page 58: Introdução à Programacao em Processing

Arrays - Declaração e Inicialização

• Declarar e inicializar num só passo

 int idade[] = {23, 47, 11, 92, 76};

Page 59: Introdução à Programacao em Processing

Arrays - índices• Indice é uma expressão do tipo

inteiro– Literal

idade[1]– Variável

idade[i]– Expressão complexa

idade[2*i+n]

• Pode ser usado para percorrer um array– através de um ciclo for, while, ...

Page 60: Introdução à Programacao em Processing

Arrays - índices• Percorrer os dados de um

array– Para leitura– Para escrita– O índice não deve ultrapassar

o tamanho do array!

int age = idade[5] // ERROR!!    

int arraySize = 5;

//escreve dados no arrayfor (int i=0; i < arraySize; i++){    //apenas um exemplo...        idade[i] = (i+1)*(i+1); }

//imprime idades inferiores a 20for(int i=0; i < arraySize; i++){    if (idade[i] < 20)        println(idade[i]);}

Page 61: Introdução à Programacao em Processing

Exemplo 6int centerX = 200;int centerY = 300;

boolean v1 = true;boolean v2 = true;

int n = 10; // o numero de circulos color colors[] = new color[n];

for (int i = 0; i < n; i++) { colors[i] = color(random(255), random(255), random(255));}

size(400, 600);

background(255);

stroke(0);strokeWeight(3);line(centerX-100, centerY-150, centerX+100, centerY+150);line(centerX-100, centerY+150, centerX+100, centerY-150);

strokeWeight(2);stroke(0);noFill();

if (v2) { // curva superior curve(centerX-100-100, centerY-150-150, centerX-100, centerY-150, centerX+100, centerY-150, centerX+100+100, centerY-150-150); // curva inferior curve(centerX-100-100, centerY+150+150, centerX-100, centerY+150, centerX+100, centerY+150, centerX+100+100, centerY+150+150);}

if (v1) { // curva superior curve(centerX-100-100, centerY-150+150, centerX-100, centerY-150, centerX+100, centerY-150, centerX+100+100, centerY-150+150); // curva inferior curve(centerX-100-100, centerY+150-150, centerX-100, centerY+150, centerX+100, centerY+150, centerX+100+100, centerY+150-150);}

if (v1 && v2) { strokeWeight(1);

for (int i = 0; i < n; i++) { fill(colors[i]); ellipse(centerX, centerY-150-20-100+i*100/n, 40, 40); }}

Page 62: Introdução à Programacao em Processing

Funções• Uma função* é uma porção de código que efectua

uma tarefa específica. • A divisão de um programa em várias funções permite

criar programas mais estruturados, fáceis de manter e permite também a reutilização de código

• Na sua forma mais simples, uma função é um bloco de código com um nome que podemos usar em qualquer parte do programa para "chamar" e executar esse bloco de código

* Existem muitas designações para o conceito de função: procedimento, rotina, subrotina, método, subprograma. Todos eles significam a mesma coisa, mas são usados em diferentes contextos.

Page 63: Introdução à Programacao em Processing

Funções

void draw() {    println("Executa o programa");

    fazTarefaEspecifica1(); //chamada a uma função!

    fazTarefaEspecifica2(); //chamada a outra função!

    fazTarefaEspecifica1(); //chama outra vez a função 1!}

void fazTarefaEspecifica1() {    println("Esta função executa uma série de operações para completar a tarefa 1");}

void fazTarefaEspecifica2() {    println("Esta função executa uma série de operações para completar a tarefa 2");}

Page 64: Introdução à Programacao em Processing

Funções• Sintaxe para definir a função

 void nomeFunção()  {      //código da função... }

• void é um tipo especial que significa "vazio", "sem tipo" e neste caso indica que a função não retorna qualquer valor (ver próximos slides)

• Para invocar (i.e., executar o código dentro da função)     nomeFunção();

Page 65: Introdução à Programacao em Processing

Funções com Parâmetros• Funções com parâmetros

– Podem operar sobre dados diferentes de cada vez que executam.• Neste caso, o código que chama a função deve passar os valores sobre os quais a

função irá executar

– Para isso temos de parametrizar a função (i.e., definir que dados o programa principal deve enviar para a função)

• Uso de funções com parâmetros (de entrada)– Sintaxe para definir  funções com parâmetros

void nomeFunção(<tipo> nomeParam1, <tipo> nomeParam2, [...]) {        //código da função...}

– Para invocar (i.e., executar o código dentro da função)

nomeFunção(valorParam1, valorParam2);

Page 66: Introdução à Programacao em Processing

Funções com Parâmetros

void draw() {    soma(1, 2); // escreve "3"    soma(3, 5); // escreve "8"}

void soma(int num1, int num2) {    int resultado;    resultado = num1 + num2;    println(resultado);}

Page 67: Introdução à Programacao em Processing

Funções com valor de retorno

• Funções com valor de retorno

int soma(int num1, int num2)

• Em funções como a anterior, faz mais sentido que a função devolva o valor calculado ao código que chamou a função (em vez de o imprimir, como em exemplos anteriores...)

• Para tal a função deve indicar que retorna um valor e qual o seu tipo (neste exemplo um int)

• Na implementação da função é obrigatório finalizar com um comando return

Page 68: Introdução à Programacao em Processing

Funções com valor de retorno

void draw()    int num1;    int num2;    int r;

    num1 = 1;    num2 = 2;

    r = soma(num1, num2);     println(r);}

int soma(int num1, int num2) {    int resultado;    resultado = num1 + num2;    return resultado; }

Page 69: Introdução à Programacao em Processing

Funções com valor de retorno

• Sintaxe para definir  funções com valor de retorno

<tipo> nomeFunção(<tipo> nomeParam1, <tipo> nomeParam2, [...]) {    //código da função...    return valorDeRetorno;}

• Para invocar (i.e., executar o código dentro da função)

variavel = nomeFunção(valorParam1, valorParam2);

• Não é necessário atribuir o resultado a uma variável, pode ser usado directamente numa expressão ou usado como parâmetro para outra função

Page 70: Introdução à Programacao em Processing

Exemplo 7void setup() { size(400, 600);}void draw() {

background(255); duploCone(0, 0, 100, 100); duploCone(100, 100, 200, 200); duploCone(200, 200, 300, 300); duploCone(300, 300, 400, 400);}

void duploCone(int x1, int y1, int x2, int y2) { stroke(0); strokeWeight(3); line(x1, y1, x2, y2); line(x1, y2, x2, y1);

strokeWeight(2); stroke(0); noFill();

// curvas superiores curve(x1-100, y1-100,x1, y1, x2, y1, x2+100,y1-100); curve(x1-100, y1+100,x1, y1, x2, y1, x2+100,y1+100); // curvas inferiores curve(x1-100, y2-100,x1, y2, x2, y2, x2+100,y2-100); curve(x1-100, y2+100,x1, y2, x2, y2, x2+100,y2+100);}

Page 71: Introdução à Programacao em Processing

Visibilidade das variáveis• As variáveis podem ser declaradas em vários

sítios do programa– fora de qualquer função (variável global)– dentro de uma função (variável local à função)– dentro de outros blocos de código: { } (ifs, ciclos, etc)

• O sítio onde são declaradas determina onde podem ser lidas/escritas– Uma variável global pode ser usada em qualquer parte

do programa– Uma variável local apenas pode ser usada no bloco

(função ou bloco de código) onde foi declarada, incluindo blocos internos a esse bloco

Page 72: Introdução à Programacao em Processing

Visibilidade das variáveis• Se tentarmos usar uma

variável local fora do bloco onde foi declarada, o compilador assinala um erro

• No entanto, é necessário algum cuidado quando as variáveis globais e locais têm o mesmo nome– Nessa situação é usada a

variável com menor visibilidade (a que foi declarada dentro do bloco superior hierarquicamente mais próximo)

Page 73: Introdução à Programacao em Processing

Processing – animaçãoExemplo 9

int x;

void setup() { size(400, 400); frameRate(10); x = 0;}

void draw() { background(0); fill(244); rect(x, 10, 40, 40); x = x + 1;}

Declaração de variáveis

Programa Terminou?

draw()

Não

Sim

setup()

Page 74: Introdução à Programacao em Processing

Programação Orientada a Objectos

Page 75: Introdução à Programacao em Processing

Objectos no mundo realObjectos no mundo real podem ser descritos através de duas características essenciais: atributos e comportamento. 

Por exemplo, o cão do João tem: •  atributos :

o Cor:  castanhoo Tamanho pêlo: curtoo Raça: Rafeiroo Idade: 3 anoso Nome: Bobi

• comportamentoo correo ladrao senta-seo comeo dorme

Page 76: Introdução à Programacao em Processing

Objectos no mundo realOutro exemplo: o automóvel do Jorge 

• Atributos:o Cor: azul escuroo Marca: Opelo Modelo: Corsao Velocidade: paradoo Combustível: 30%

• Comportamento:o arrancaro aceleraro travar

(O comportamento não se refere necessariamente a comportamento autónomo, mas simplesmente a acções que o objecto pode realizar.)

Page 77: Introdução à Programacao em Processing

Classes no mundo realOs dois exemplos anteriores, cão e automóvel, referiam-se a objectos concretos (o cão do João e o automóvel do Jorge).

No entanto, existem milhares de automóveis diferentes, com o mesmo comportamento e com os mesmos atributos (cor, marca, modelo, etc - embora não com os mesmos valores)

A este conjunto genérico de comportamentos e atributos dá-se o nome de classe.

Page 78: Introdução à Programacao em Processing

Classes em OOP

• Uma classe é, basicamente, um molde para a criação de objectos. 

• Os atributos são representados através de variáveis e o comportamento através de métodos.

• Em OOP, ao processo de criar um objecto a partir de uma classe dá-se o nome de instanciação.o Usando o exemplo anterior, o objecto "Automóvel do Jorge" seria uma

instância da classe "Automóvel".

http://www.stanford.edu/class/cs193p/cgi-bin/drupal/downloads-2010-winter

Page 79: Introdução à Programacao em Processing

Classes em OOP• A classe passa a ser mais um tipo de dados• As nossas variáveis podem ser declaradas como sendo de um tipo igual ao nome

da classe• Essas variáveis contêm “objectos” ou null

• Para acedermos às variáveis ou métodos do objecto usamos a notação ponto (.):

MinhaClasse v, v1;

v = new MinhaClasse();v1 = null;

v.nomePropriedade;v.nomeMetodo();

v1.nomePropriedade; // erro

Page 80: Introdução à Programacao em Processing

Um exemplo concreto: Classe Polígono

Atributos:- ?

Comportamento:- ?

Fase de desenho• Criar uma classe

o Poligono

• Que propriedades são necessárias/vou precisar para a classe?

• Que acções deve ela implementar?

Page 81: Introdução à Programacao em Processing

Um exemplo concreto: Classe Polígono

Atributos:-Pontos-Cor interior-Cor linha exterior-Perímetro-Área-Bounding box

Comportamento:- desenhar-se- Rodar- Escalar- transladar

Fase de desenho• Criar uma classe

o Poligono

• Que propriedades são necessárias/vou precisar para a classe?

• Que acções deve ela implementar?

Page 82: Introdução à Programacao em Processing

class Poligono { int x[] = {10, 50, 25}; int y[] = {10, 10, 25};

public void desenha() { beginShape(); for (int i = 0; i < x.length; i++) { vertex(x[i], y[i]); } endShape(CLOSE); }}

Implementação inicial: Exemplo 10

Page 83: Introdução à Programacao em Processing

class NomeClasse {//declaração de variáveis (propriedades)

//implementação de métodos// metodos privados apenas podem ser invocados por codigo dentro // da propria classeprivate void metodoPrivado() {

}

//metodos públicos podem ser invocados por codigo exterior à classepublic void metodoPublico() {}

}

Alguma sintaxe

Page 84: Introdução à Programacao em Processing

NomeClasse nomeVariavel;

nomeVariavel = new NomeClasse();

Alguma sintaxe: instanciação

Page 85: Introdução à Programacao em Processing

Encapsulamento• Uma das vantagens da programação orientada a objectos é a de

permitir o encapsulamento dos dados/comportamento:o  Por um lado, permite agrupar numa unidade lógica

dados associados a um determinado conceito e operações sobre esses dados.

o  Por outro lado, permite "esconder" informação do exterior, prevenindo erros e estados inconsistentes.  (Dentro do possível as classes devem ser implementadas de forma a

não ser possível que código externo à classe altere dados, colocando o objecto num estado de erro)

Page 86: Introdução à Programacao em Processing

Encapsulamento

• Estas duas propriedades facilitam o trabalho do programador que utiliza os objectos: tal como no caso das funções, não é necessário compreender o funcionamento interno do objecto para tirar partido dele.

• A estruturação de um programa em classes/objectos permite também ao programador definir e restringir as interdependências entre código, tornando-o mais robusto e compreensível. 

• (Sem objectos teríamos programas em que o estado e comportamento de diferentes componentes estariam todos misturados).

Page 87: Introdução à Programacao em Processing

Encapsulamento em Java 

• A linguagem Java não força o encapsulamento na perspectiva do "esconder" a informação do exterior

• O programador escolhe:o Os atributos podem ser declarados como vísiveis do

exterior (access modifier)  keyword public 

o Ou podem ser declarados como visíveis apenas pela classe keyword private

Page 88: Introdução à Programacao em Processing

Encapsulamento: exemplo 

• Acrescentar pontos ao polígono• Tal como está a nossa classe poderiamos fazer:

p = new Poligono(); p.x = expand(p.x, p.x.length+1); p.x[p.x.length-1] = 25; p.y = expand(p.y, p.y.length+1); p.y[p.y.length-1] = 15;

– Exemplo_11

Page 89: Introdução à Programacao em Processing

Encapsulamento: exemplo • Se me enganar, o código da classe pode deixar de funcionar:

p = new Poligono(); p.x = expand(p.x, p.x.length+1); p.x[p.x.length-1] = 25; p.y = expand(p.y, p.y.length); p.y[p.y.length] = 15;

– Exemplo_12

– Aceder directamente às propriedades quebra o encapsulamento da classe. O objecto deixa de ter controlo sobre as suas próprias propriedades.

– Para além disso, é necessário conhecer o funcionamento interno da classe (nome e tipo das variáveis)

Page 90: Introdução à Programacao em Processing

Encapsulamento: exemplo • Para manter o encapsulamento:class Poligono { private int x[] = { 10, 50, 25 }; private int y[] = { 10, 10, 25 };

public void desenha() {… }

public void addPoint(int x, int y) { p.x = expand(p.x, p.x.length+1); p.x[p.x.length-1] = x;

p.y = expand(p.y, p.y.length+1); p.y[p.y.length-1] = y; }}

• Exemplo_13

Page 91: Introdução à Programacao em Processing

Construtores

• Muitas vezes, a inicialização do objecto é complexa  e apenas faz sentido ser realizada pelo próprio objecto que está a ser criado (em vez de ser feita pelo código externo à classe que está a criar o objecto).

• Por isso, quando um objecto é criado, é invocado um método especial chamado construtor. 

Page 92: Introdução à Programacao em Processing

Construtores em Java 

• Em Java, o construtor é um método com o mesmo nome da classe, mas sem tipo de retorno.

•  

• É o nome do construtor (e parâmetros) que colocamos a seguir à keyword 'new' quando criamos um objecto.

• Exemplo_14

Page 93: Introdução à Programacao em Processing

Construtores em Java 

• Uma classe pode definir vários construtores com parâmetros diferentes (número e/ou tipo).

• Normalmente, define-se um construtor geral que aceita todos os parâmetros possíveis e outros mais simples, que usam alguns valores por omissão.

•Para poupar trabalho, define-se primeiro o construtor geral •Os outros podem invocar o geral com valores pré-definidos

•Exemplo_15

Page 94: Introdução à Programacao em Processing

Destrutores

• Um destrutor é o oposto de um construtor: é um método especial invocado quando o objecto é destruído. 

• O destrutor é usado para dar oportunidade ao objecto de libertar recursos (por exemplo memória).

• Em Java não existem destrutores porque a gestão de memória é feita automaticamente pelo garbage collector.o Existe um método que é invocado antes de o objecto ser

recolhido pelo garbage colector mas raramente se usa.

Page 95: Introdução à Programacao em Processing

Herança• Em muitos casos existe uma relação entre

classes diferentes num programa. • Voltando aos veículos, o nosso programa

poderia necessitar de trabalhar com bicicletas e automóveis.

• Apesar de ambos serem veículos, uma parte do estado e alguns comportamentos são completamente diferentes.

Page 96: Introdução à Programacao em Processing

Herança• Nestes casos, faz mais sentido

modelar três classes: Automóvel e Bicicleta como classes derivadas da classe Veículo. 

• Desta forma, evita-se repetir o estado e comportamento partilhados.

• Nesta situação, as classes Automóvel e Bicicleta, herdam o estado e comportamento de Veículo, podendo estendê-los.

• A classe Veículo é a superclasse e as classes Automóvel e Bicicleta as subclasses.

Page 97: Introdução à Programacao em Processing

Herança• As subclasses herdam todos os atributos e métodos da

superclasse, excepto os construtores.

• O construtor da subclasse deve invocar o construtor da superclasse 

• (se a superclasse tiver um construtor vazio - sem parâmetros, este é invocado automaticamente).

• Para invocarmos o construtor da classe mãe usa-se a instrução o super()o super(param1, param2, etc);

Page 98: Introdução à Programacao em Processing

Herança em Java

Exemplo_16

Page 99: Introdução à Programacao em Processing

Method Overriding

• Method overriding ("sobreposição de método") é uma funcionalidade das linguagens OOP que permite a uma subclasse definir uma implementação mais específica de um método da superclasse.o Por exemplo, a classe Veículo define um método buzinar() com uma

implementação genérica para todos os tipos de veículo ("horn"). No entanto, faz mais sentido a uma Bicicleta proporcionar uma

implementação mais específica deste método ("ring ring"). 

Page 100: Introdução à Programacao em Processing

Method overriding

Method overriding permite à classe Bicicleta re-implementar um método da classe Veículo.

A classe Automóvel, como não re-implementa o método buzinar(), usa a implementação de Veículo ("horn").

Page 101: Introdução à Programacao em Processing

Method overriding em Java

No caso da classe Rectangulo, é possível calcular o perímetro de forma mais rápida do que a implementação do Polígono…

Exemplo_17

Page 102: Introdução à Programacao em Processing

Relação is-a (é um)

A herança permite definir relações do tipo “é um” entre classes:

Um Rectangulo é um Poligono

Um PoligonoRegular é um Poligono

Isto significa que tanto um Rectangulo como um PoligonoRegular podem ser tratados no código como se fossem do tipo Poligono

Page 103: Introdução à Programacao em Processing

Relação is-a (é um)

Exemplo_18

Neste exemplo invocamos “desenha()” em todos os objectos como se fossem todos Poligono. Neste caso todas as classes herdam a mesma implementação de “desenha()” da classe mãe.

O que aconteceria se invocassemos “perimetro()” da mesma forma?

“perimetro()” tem uma implementação diferente em Rectangulo

Exemplo_19

Page 104: Introdução à Programacao em Processing

Polimorfismo

Dois tipos de polimorfismo:

Overloading: possibilidade de definir métodos com o mesmo nome para número ou tipo de parâmetros diferentes. É invocado o método que tem os parâmetros em número e tipo de acordo com a invocação.

Overriding: possibilidade de definir implementações mais concretas de um método numa subclasse. Por omissão, é a implementação mais concreta que é invocada.

Page 105: Introdução à Programacao em Processing

Fim

Programação em Processing

http://slideshare.net/jorgecardoso (tag: ea-phd-ia-2011)

Exemplos: http://dl.dropbox.com/u/1460217/UCP/2011-PhD-AI-Processing/src.zip