introdução à programacao em processing

Post on 19-Jan-2015

3.284 Views

Category:

Education

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

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

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

Hardware

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

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

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

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

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

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

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

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

• 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. */}

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

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

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

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)

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;}

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?

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

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

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

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/)

Processing

• IDE (Integrated Development Environment)

10-04-2023 Jorge Cardoso

22 Processing - eixos da janela gráfica

Processing

• Algumas instruçõessizebackground

line, rect, ellipse, curve

fill, strokenoFill, noStroke

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);

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

Aviso!

http://xkcd.com/859/

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;}

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;

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';

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;

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.

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);

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

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

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

result = aNumber / anotherNumber;

println(result);

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

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

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] }

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;}

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);}

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;    

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

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

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

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

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

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”);}

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);}

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!

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));}

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

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); }

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); }*/ }

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;}

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);

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

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;}

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

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

Arrays - Declaração e Inicialização

• Declarar e inicializar num só passo

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

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

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]);}

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); }}

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.

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");}

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();

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);

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);}

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

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; }

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

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);}

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

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)

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()

Programação Orientada a Objectos

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

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

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.

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

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

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?

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?

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

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

NomeClasse nomeVariavel;

nomeVariavel = new NomeClasse();

Alguma sintaxe: instanciação

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)

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

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

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

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)

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

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. 

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

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

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.

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.

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.

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);

Herança em Java

Exemplo_16

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"). 

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").

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

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

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

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.

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

top related