Este documento introduz conceitos básicos de programação, como:
1) Hardware de computadores, evolução das linguagens de programação e máquinas virtuais.
2) Estruturas básicas de programação em Processing, como variáveis, condições e ciclos.
3) Programação orientada a objetos em Processing, incluindo classes, objetos, herança e encapsulamento.
2. Tópicos Conceitos de programação de computadores Hardware, evolução das linguagens de programação, códigofontevscódigomáquina, máquina virtual Estruturasbásicas de programaçãoem Processing Variáveis, condições, ciclos, funções Programaçãoorientada a objectos (OOP) Classes, objectos, herança, construtores, destrutores, encapsulamento, herança, method overriding
3. Hardware Processador CPU (Central Processing Unit) Éa parte de um sistema de computadorqueexecuta as instruções de um programa de computador
4. Hardware Memória RAM (Random Access Memory) Volátil (precisa de alimentaçãoeléctricaparapreservaros dados) O CPU lêe escrevedirectamenteparaestamemória O programaque o CPU executaestáescritonamemória RAM
5. Hardware Memóriapersistente Nãovolátil (mantémos dados mesmosemalimentaçãoeléctrica) Exemplos Disco duro Memória Flash (cartões SD, Flash pen, …) Osprogramassãoarmazenadosnestamemória Quandoosexecutamospassampara a RAM
6. Linguagens de Programação Programa Sequência de instruçõesque o CPU executa As instruçõesestãona RAM Exemplo Somar 3 + 5 e multiplicar o resultadopor2 Como éque o CPU fazisto?
7. 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
8. Evolução das linguagens Osprimeiros “programadores” de computadorescreviamprogramasemnúmeros Usavamdirectamente a tabela de instruções do processador muitosujeito a erros... muitotrabalhoso... Criou-se umalinguagemmaisfácil de decorar e utilizar, baseadaemmnemónicas Assembly Language .model small .stack .data message db "Hello world, I'm learning Assembly !!!", "$" .code main proc movax,seg message movds,ax mov ah,09 lea dx,message int 21h mov ax,4c00h int 21h main endp end main
25. Para correr um programa Java temos de ter instalado este processador virtual (Java Virtual Machine - JVM)
26.
27. Linguagens de Programação Na descrição de um programaéessencialdefinir: Ponto de entrada. Qual a primeirainstrução a executar? Sequência: comoavanço de instruçãoeminstrução?
28.
29. Permite a criação de programasquepodemserexecutadosemváriasplataformassemmodificação
33. 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
34. 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/)
41. IntroduçãoàProgramação Comentários Servempara o programador se ajudar a simesmo a lembrarporqueéque fez as coisas de determinada forma São ignoradaspelocompilador // Comentáriode umalinha /* Comentário de várias linhas */ intaddTwoNumbers( 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;}
42. Variáveis Variáveissãouma forma de armazenarvaloresdurante a execução de um programa Uma variávelé um nomequeutilizamosparanosreferirmos a um valor Podemosalterar o valor durante o programa Sempreque o nomeéutilizado no programaéautomaticamentesubstituídopelo valor correspondente intsomeNumber; intanotherNumber; int result; someNumber = 3; anotherNumber = 2; //result stores the value 3 * 2 = 6 result = someNumber * anotherNumber;
43. Variáveis Antes de podermosusarumavariáveltemos de a declarar. A declaraçãoindica o tipo de dados que a variávelvaiguardar. Inteiros (int, long) Decimais(float, double) Lógicos (boolean) Caracteres (char) Sintaxe: <tipo> nomeDaVariavel;<tipo> nomeDaVariavel = <valorinicial>; intmyNumber; long anotherNumber = 13; float aFloatNumber = 0.24; double aDoublePrecisionNumber = 1.23e2; booleanisActive = true; char aLetter = 'P';
44. Variáveis Para guardarmos um valor numavariáveltemos de atribuí-lo àvariável. minhaVariavel = <valor>; Aquiloqueatribuimos a umavariávelé o resultado de umaexpressão. Uma expressãopodeser: Literal : Um valor escritodirectamente no código idade= 33; // 33 é um literal Variável: O valor de umavariável idade= idadeJoao; // idadeJoaoéoutravariável Função: O valor devolvidoporumafunçãodefinidapreviamente idade= random(10); // random éumafunção Expressõesanterioresligadas com operadoresaritméticos : Definiçãorecursiva! idade= idadeJoao + 10 * 3;
45. Variáveis Algumasrestrições no uso de nomesemvariáveis: Nomes das variáveistêmcomeçarcom umaletra do alfabeto (dígitosnãosãopermitidos) oupor um underscore (_) Nomes de variáveispodemconterletras e dígitos, mas espaçosou outros caracteresespeciaisnãosãopermitidos. Osnomes de variáveissão case sensitive (e.g. myNumberédiferente de mynumber) Palavrasreservadas do Java nãopodemserusadascomonomes de variáveis (e.g. int, float, for, while, do, break, ...) Osnomes das variáveisdevemserescolhidos de forma a tornar o seusignificado o maisclaro e legívelpossível.
47. Operadores Operadoresaritméticos + (adição) - (subtracção) * (multiplicação) / (divisão, inteiraoufraccionária) % (resto da divisãointeira - modulo) Osoperadoresnumaexpressãosãoaplicados da esquerdapara a direita, mas os operadores *, / e % têmprecedênciasobre + e - Se quisermosalterar a precedência, temos de usarparêntesis: ( ) 1+2*3 = 1+6 = 7 (1+2)*3 = 3*3 = 9
48. Exercício 1 Crie um programaem Java que: armazeneemduasvariáveisosvalores 5 e 2 realize a divisão entre as variáveis (i.e. 5 / 2) guarde o resultadonumavariável imprima o resultado da operação Decisões a tomar: Quetipo de variáveisdefinir? int, float, double, ...?? Quetipo a usarpara o resultado da divisão? int, float, double, ...?? Existemdiferenças no resultado? divisãointeira VS divisãovírgulaflutuante...
52. Condiçõesif A condiçãoéumaexpressão do tipoboolean Literal true ou false Variável (boolean) com o valor true ou false Expressão com operadorescondicionais booleanisActive = true; if(isActive) //eqv. a if (isActive == true) { //do something... isActive = false; }
54. Condições if As condiçõesusadasnos testes podemusarosoperadorescondicionais: igual a: == (atenção!) maior do que: > menor do que: < maiorouigual a: >= menorouigual a: <= diferente: != O resultado de umaoperaçãocondicionalé um valor true ou false intaNumber = 10; intanotherNumber = 6; boolean correct = false; if(9 == aNumber) correct = true; if (anotherNumber > aNumber) aNumber = anotherNumber;
57. Condições if... else if Épossívelcombinar ifs sequencialmente if (<condição A>) { <acções A> } else if (<condição B>){ <acções B> } else { <acções C> }
58. OperadoresLógicos Épossíveltestarcondiçõescomplexasatravés dos operadoreslógicos: operadoresquecombinamcomparações simples: AND : As duascomparaçõestêm de serverdadeirasaomesmo tempo OR : Pelomenosuma das comparações tem de serverdadeiro NOT : Inverte (i.e. nega) o valor da comparação
59. OperadoresLó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”); }
61. Exercício 2 Implementeum programaque: Defina 3 variáveisparaarmazenartrêsinteirosàescolha (num1, num2 e num3) Teste se num1 éigual, maioroumenorque num2, e imprimaumamensagem do tipo "7 émaior do que 3". No caso de num1 sermenorque num2, verifique se num3 estádentro do intervalo [num1, num2], e emcasoafirmativoimprimaumamensagem 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õespor zero em Java provocamo "crash" da aplicação!
62. Exercício 2 int 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)); }
63. Ciclos Osciclospermitem-nosexecutar um conjunto de instruçõesrepetidamente Existemduas classes de ciclos: Ciclosqueexecutam um númeropré-determinado de vezes: for Ciclosqueexecutamenquantoumacondiçãoéverdadeira: do e while
64. Ciclofor Executado um númeropré-determinado de vezes for (<inicialização>; <condição>; <incremento>) { <acções>} Variável de cicloinicia-se em zero (e declara-se dentro do própriociclo) Condição simples com o limite de iterações Incremento da variávelemumaunidade (através do operadorincremento ++) for (inti = 0; i < 10; i++) { println("Counting… ” + i); }
65. 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); }*/ }
66. Ciclo while Executa um conjunto de instruçõesenquantoumacondição for verdadeira O testeéfeito antes da execução while (<condição>) { <acções> } inti = 0; while (i <= 10) { println("Counting... “ + i); i = i + 1; }
67. Ciclo do Executa um conjunto de instruçõesenquantoumacondição for verdadeira O testeéfeitodepois da execução do { <acções> } while (<condição>); inti = 0; do { println("Counting... “ + i); i = i + 1; } while (i <= 10);
68. Exercício Implementeum programaque calculeumasequência de Fibonacci, segundo a seguinterelaçãorecorrente: 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. Imprimaosprimeiros 100 números da sequência 4.2. Imprimatodososnúmeros da sequênciainferiores a 10000
69. Solução intnumFibonacciNumbers = 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; }
70. Arrays Um array é um contentor de valores do mesmotipoarmazenadanumaregiãocontígua da memória RAM Um vector tem um nome e váriasposiçõesquepodemseracedidasatravé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; intage = idade[3]; //age = 92
71. Arrays - Declaração e Inicialização Tal comoqualqueroutravariável, énecessárioindicarqual o tipo de valoresque o array iráguardar. Énecessáriotambémdefinirqual o tamanho do array, antes de o utilizar. <tipo> meuArray[]; meuArray = new <tipo>[tamanho]; intidades[]; idades = new int[5];
72.
73. Arrays - índices Indiceéumaexpressão do tipointeiro Literal idade[1] Variável idade[i] Expressãocomplexa idade[2*i+n] Podeserusadoparapercorrer um array através de um ciclo for, while, ...
74. Arrays - índices Percorreros dados de um array Para leitura Para escrita O índicenãodeveultrapassar o tamanho do array! int age = idade[5] // ERROR!! intarraySize = 5; //escreve dados no array for (inti=0; i < arraySize; i++) { //apenas um exemplo... idade[i] = (i+1)*(i+1); } //imprimeidadesinferiores a 20 for(inti=0; i < arraySize; i++) { if (idade[i] < 20) println(idade[i]); }
75. Exemplo 6 intcenterX = 200; intcenterY = 300; boolean v1 = true; boolean v2 = true; int n = 10; // o numero de circulos color colors[] = new color[n]; for (inti = 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 (inti = 0; i < n; i++) { fill(colors[i]); ellipse(centerX, centerY-150-20-100+i*100/n, 40, 40); } }
76. Funções Uma função* éumaporção de códigoqueefectuaumatarefaespecífica. A divisão de um programaemváriasfunçõespermitecriarprogramasmaisestruturados, fáceis de manter e permitetambém a reutilização de código Na sua forma mais simples, umafunçãoé um bloco de código com um nomequepodemosusaremqualquer parte do programapara "chamar" e executaressebloco de código * Existemmuitasdesignaçõespara o conceito de função: procedimento, rotina, subrotina, método, subprograma. Todoselessignificam a mesmacoisa, mas sãousadosemdiferentescontextos.
77. Funções void draw() { println("Executa o programa"); fazTarefaEspecifica1(); //chamada a umafunção! fazTarefaEspecifica2(); //chamada a outrafunção! fazTarefaEspecifica1(); //chamaoutravez a função 1! } void fazTarefaEspecifica1() { println("Estafunçãoexecutaumasérie de operaçõesparacompletar a tarefa 1"); } void fazTarefaEspecifica2() { println("Estafunçãoexecutaumasérie de operaçõesparacompletar a tarefa 2"); }
78. Funções Sintaxeparadefinir a função void nomeFunção() { //código da função... } void é um tipo especial quesignifica "vazio", "semtipo" e nestecasoindicaque a funçãonãoretornaqualquer valor (verpróximos slides) Para invocar (i.e., executar o códigodentro da função) nomeFunção();
79. Funções com Parâmetros Funções com parâmetros Podemoperarsobre dados diferentes de cadavezqueexecutam. Nestecaso, o códigoquechama a funçãodevepassarosvaloressobreosquais a funçãoiráexecutar Para issotemos de parametrizar a função (i.e., definirque dados o programa principal deveenviarpara a função) Usode funções com parâmetros (de entrada) Sintaxeparadefinir funções com parâmetros void nomeFunção(<tipo> nomeParam1, <tipo> nomeParam2, [...]) { //código da função... } Para invocar (i.e., executar o códigodentro da função) nomeFunção(valorParam1, valorParam2);
81. Funções com valor de retorno Funções com valor de retorno int soma(int num1, int num2) Emfunçõescomo a anterior, fazmaissentidoque a funçãodevolva o valor calculadoaocódigoquechamou a função (emvez de o imprimir, comoemexemplosanteriores...) Para tal a funçãodeveindicarqueretorna um valor e qual o seutipo (nesteexemplo um int) Na implementação da funçãoéobrigatóriofinalizar com um comando return
82. 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) { intresultado; resultado = num1 + num2; return resultado; }
83. Funções com valor de retorno Sintaxeparadefinir 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ódigodentro da função) variavel = nomeFunção(valorParam1, valorParam2); Nãoénecessárioatribuir o resultado a umavariável, podeserusadodirectamentenumaexpressãoouusadocomoparâmetroparaoutrafunção
85. Visibilidade das variáveis As variáveispodemserdeclaradasemváriossítios do programa fora de qualquerfunção (variável global) dentro de umafunção (variável local àfunção) dentro de outros blocos de código: { } (ifs, ciclos, etc) O sítioondesãodeclaradasdeterminaondepodemserlidas/escritas Uma variável global podeserusadaemqualquer parte do programa Uma variável local apenaspodeserusada no bloco (funçãooubloco de código) ondefoideclarada, incluindoblocosinternos a essebloco
86. Visibilidade das variáveis Se tentarmosusarumavariável local fora do blocoondefoideclarada, o compiladorassinala um erro No entanto, énecessárioalgumcuidadoquando as variáveisglobais e locaistêm o mesmonome Nessasituaçãoéusada a variável com menorvisibilidade (a quefoideclaradadentro do bloco superior hierarquicamentemaispróximo)
87. Processing – animação Exemplo9 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; }
109. travar(O comportamento não se refere necessariamente a comportamento autónomo, mas simplesmente a acções que o objecto pode realizar.)
110. Classes no mundo real Os 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.
111.
112. Os atributos são representados através de variáveis e o comportamento através de métodos.
113. Em OOP, ao processo de criar um objecto a partir de uma classe dá-se o nome de instanciação.
114. 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
118. Para acedermosàsvariáveisoumétodos do objectousamos a notaçãoponto (.):MinhaClasse v, v1; v = new MinhaClasse(); v1 = null; v.nomePropriedade; v.nomeMetodo(); v1.nomePropriedade; // erro
138. Por um lado, permite agrupar numa unidade lógica dados associados a um determinado conceito e operações sobre esses dados.
139. Por outro lado, permite "esconder" informação do exterior, prevenindo erros e estados inconsistentes.
140.
141. 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.
171. Method overriding em Java No casodaclasseRectangulo, épossívelcalcularoperímetro de forma maisrápida do que a implementação do Polígono… Exemplo_17
172. 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
173. Relação is-a (é um) Exemplo_18 Nesteexemploinvocamos “desenha()” emtodososobjectoscomo se fossemtodosPoligono. Nestecasotodas as classes herdam a mesmaimplementação de “desenha()” daclassemãe. O queaconteceria se invocassemos “perimetro()” damesma forma? “perimetro()” tem umaimplementaçãodiferenteemRectangulo Exemplo_19
174. 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.