introdução à programacao em processing
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