Conceitos Fundamentais de Programação Jorge C. S. Cardoso, Luís Gustavo Martins jorgecardoso@ieee.org, lmartins@porto.ucp.pt Cursos de Verão na Católica 2010
Apresentação Apresentação dos docentes Jorge  Cardoso - http://jorgecardoso.eu Luís  Gustavo  Martins - http://web.me.com/lgustavomartins Apresentação dos alunos Nome, background, expectativas... Âmbito deste curso Curso de nível introdutório Não requer conhecimentos prévios de programação Organizado em três módulos: 1 - Introdução aos princípios de programação 2 - Introdução aos princípios de Programação Orientada a Objectos (OOP) 3 - Programação para Android e iPhone
Apresentação Planos Futuros de Formação Avançada em: Programação  iOS  (iPhone, iPad, iPod Touch, ...) Programação  Android Programação  C++  e  openFramworks Programação  Java  e  Processing ... Formação Certificada em Som e Imagem da Escola das Artes da Universidade Católica http://www.artes.ucp.pt/criatividadedigital/
Introdução aos princípios de programação Conteúdo Introdução à Programação Conceitos e Definições Instalação de IDEs Linguagens de Programação Java e Objective C Estrutura do código fonte Hello World em Java e Objective C Programação em Java e Objective C Variáveis Operadores Condições Ciclos Arrays Apontadores Funções
O Que é Programar? Especificar um conjunto de  instruções  para serem executadas, seguindo uma determinada ordem, por uma máquina ou pessoa Exemplo Ligar o computador Esperar que o SO arranque Aceder ao Go do Finder Escolher a opção Connect to Server Esperar pela janela de login Inserir login e password Escolher o share igual ao login
Linguagens de Programação Um programa é uma sequência de números Interpretados como instruções pelo processador (CPU) Os primeiros “programadores” de computador escreviam programas em números 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 .data message db "Hello world, I'm learning Assembly !!!", "$" .code main proc mov ax,seg message mov ds,ax mov ah,09 lea dx,message int 21h mov ax,4c00h int 21h main endp end main
Linguagens de Programação O programa pode ser descrito usando vários tipos de linguagens: Natural   (e.g., Inglês) &quot; tell Finder to open myDocument.doc &quot; Diagrama   (e.g., fluxogramas) 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 As linguagens de programação foram evoluindo para sintaxes mais próximas da linguagem natural Linguagens de alto-nível source:  http://chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf
Linguagens de Programação Java Permite a criação de programas que podem ser executados em várias plataformas sem modificação A sua utilização tornou-se mais conhecida através das  applets pequenos programas que podem ser executados num browser. 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. Usada como linguagem preferencial nas  plataformas  Android
Linguagens de Programação Objective-C 2.0 Baseada na linguagem ANSI C, é uma linguagem de programação reflexiva orientada a objectos que implementa a transmissão de mensagens, ao estilo do Smalltalk. É utilizada principalmente no Apple Mac OS X e GNUstep, dois ambientes baseados no padrão OpenStep e é a principal linguagem utilizada em NeXTSTEP, OPENSTEP, Cocoa e dispositivos  Apple iOS (e.g. iPod Touch, iPhone e iPad) . Programas genéricos em Objective-C (que não façam uso destas bibliotecas) também podem ser  compilados  por qualquer sistema suportado pelo  gcc , que inclui um  compilador  Objective-C. Também conhecido como ObjC, Obj-C
Linguagens de Programação:    Conceitos de Hardware CPU (Central Processing Unit) é a parte de um sistema de computador que  executa as instruções  de um programa de computador RAM (Random Access Memory) É um tipo  de memória que permite a leitura e a escrita , utilizada como memória primária em sistemas electrónicos digitais. O termo acesso aleatório identifica a capacidade de acesso a qualquer posição em qualquer momento, por oposição ao acesso sequencial, imposto por alguns dispositivos de armazenamento, como fitas magnéticas Necessita de alimentação  para preservar os dados
Linguagens de Programação:   Conceitos de Hardware Memórias FLASH É uma  memória de computador  do tipo EEPROM (Electrically-Erasable Programmable Read-Only Memory) chip  re-escrevível  que, ao contrário de uma memória RAM convencional,  preserva o seu conteúdo sem a necessidade de fonte de alimentação comumente usada em cartões de memória, flash drives USB (pen drives), MP3 Players, dispositivos como câmeras digitais, leitores MP3, smart phones (incluindp iPhone e equipamentos Android)
Linguagens de Programação:  Código Fonte Texto que o programador escreve numa determinada linguagem de programação (e.g., ObjC, Java, ...) 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. */ }
Linguagens de Programação:  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 proc mov ax,seg message mov ds,ax mov ah,09 lea dx,message int 21h mov ax,4c00h int 21h main endp end main
Linguagens de Programação:    Criação de um executável em ObjC   Compilador Converte código fonte (em ObjC) em código máquina (específico para cada CPU - e.g. Intel Atom, Apple A4) Código máquina gerado pelo compilador também conhecido como &quot;código objecto&quot; Linker 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  Permite o uso de bibliotecas disponibilizadas por terceiros (e.g. Cocoa, no iPhone)
Linguagens de Programação:    Criação de executável em Java Compilador A linguagem Java é compilada em código máquina para um processador virtual (máquina virtual) O código máquina resultante é chamado &quot;bytecode&quot; Em Java não existe necessidade de &quot;linkagem&quot; Uma aplicação Java consiste num conjunto destes ficheiros (e não apenas um) 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)
Estrutura do Código Fonte  Entry point:  main Existe sempre um  bloco principal que é o primeiro a ser executado  quando se lança o programa:  a função   main Java  (myProgram.java) public static void main(String args[])  {      System.out.println(&quot;Hello world&quot;); //write your code here! } ObjC(myProgram.m) int main( int argc, const char *argv[] ) {     NSAutoreasePool * pool = [[NSAutoReleasePool alloc] init];      NSLog(@&quot;hello world&quot;);  //write your code here!!        [pool drain];        return 0; }
Hello World em ObjC Abrir o XCode File -> New Project... Selecionar: Mac OS X  no menu esquerdo Command Line Tool  no menu superior direito Choose... Dar um nome ao projecto (e.g. HelloWorld) Seleccionar o ficheiro  HelloWorld.m Implementa a função  main Rever código em ObjC  Compilar e &quot;Linkar&quot; (i.e., Build) e executar   Seleccionar  Build and Run  no menu superior do XCode  
Hello World em ObjC 7. Verificar resultado na  Debugger Console  do XCode
Hello World em Java Abrir Eclipse File -> New -> Java Project Preencher o campo &quot;Project Name&quot; com HelloWorld e clicar &quot;Finish&quot; File -> New -> Class Preencher o campo &quot;Name&quot; com HelloWord e marcar a opção &quot;public static void main....&quot;   Substituir a linha: // TODO Auto-generated method stub com a instrução    System.out.println(&quot;Hello world&quot;); Executar o programa: Run -> Run Ver o resultado na &quot;Console&quot;
Introdução à Programação  Objective C e Java 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 ;  - ponto e vírgula (semicolon); acaba quase todas as linhas de código ,  - vírgula (comma), separa parâmetros de funções Em Mac: { } – Chavetas (Curly braces): [Shift][Alt] + ( ou ) [ ] – Parentesis Rectos: [Alt] + ( ou ) 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; }
Programação em Java e ObjC: Variáveis Variáveis são uma forma de armazenar valores durante a execução de um programa Uma variável é um nome que podemos utilizar 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 = 6 result = someNumber * anotherNumber; 
Programação em Java e ObjC: Variáveis Antes de podermos usar uma variável temos de a  declarar .  A declaração implica indicar o  tipo  de dados  que a variável vai guardar. Inteiros ( int, long )  Decimais ( float, double ) Lógicos ( boolean, BOOL ) Caracteres ( char ) <tipo> nomeDaVariavel; <tipo> nomeDaVariavel = <valorinicial>; http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html http://www.webtechexpress.com/lessons/lesson-5-objective-c-basic-data-types-and-literal-constants/  http://en.wikipedia.org/wiki/C_syntax#Primitive_data_types  int myNumber; long anotherNumber = 13; float aFloatNumber = 0.24; double aDoublePrecisionNumber = 1.23e2; //for ObjC BOOL isActive = true; //for JAVA boolean isActive = true; char aLetter = 'P';
Para guardarmos um valor numa variável temos de atribuí-lo à variável. minhaVariavel = <valor>; Aquilo que atribuimos a uma variável não tem de ser um valor simples; pode ser 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; Programação em Java e ObjC: Variáveis
Algumas restrições no uso de nomes em variáveis: Nomes das variáveis devem 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 ObjC ou do Java não podem ser usadas como nomes de variáveis (e.g. i nt, 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. Para um guia de  estilo em programação , ver http://geosoft.no/development/cppstyle.html (focado na linguagem C++, mas aplicável ao ObjC e Java) Programação em Java e ObjC: Variáveis
Programação em Java e ObjC: 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
Programação em Java e ObjC: Exercício 1 Crie um programa em Java e ObjC 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...
Programação em Java e ObjC: Exercício 1 ObjC #import <Foundation/Foundation.h> int main (int argc, const char * argv[])  {      NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];      int aNumber = 5;      int anotherNumber = 2;      float aFloat = 2.0;      float result;      result = aNumber / anotherNumber;      NSLog(@&quot;%d divided by %d is equal to %f&quot;, aNumber, anotherNumber, result);      //try other combinations of int, floats and check the division results...      [pool drain];      return 0; } Consultar a documentação do NSLog() no XCode Docs (ou na web)! http://developer.apple.com/iphone/library/documentation/cocoa/reference/foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/func/NSLog http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html
Programação em Java e ObjC: Exercício 1 Java public class Exercicio {      public static void main(String[] args) { int aNumber = 5; int anotherNumber = 2; float aFloat = 2.0f; float result; result = aNumber / anotherNumber; System.out.println(String.format(&quot;%d divided by %d is equal to %f&quot;, aNumber, anotherNumber, result)); } } Consultar a documentação do System.out.println e String.format  http://download.oracle.com/javase/1.5.0/docs/api/java/io/PrintStream.html#println(java.lang.String) http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#format(java.lang.String, java.lang.Object...)
Programação em Java e ObjC: Condições Em quase todos os programas é necessário executar algumas acções apenas se uma determinada condição for verdadeira...
Programação em Java e ObjC: 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]  }
Programação em Java e ObjC: Condições  if A condição é uma expressão do tipo  boolean ,  BOOL   Literal  true  ou  false  Variável ( boolean, BOOL ) com o valor  true  ou  false   Expressão com  operadores condicionais //JAVA boolean isActive = true; //ObjC BOOL isActive = true; if(isActive) //eqv. a if (isActive == true) {      //do something...      isActive = false; }
Programação em Java e ObjC: 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 Em ObjC ao valor  false  corresponde o inteiro 0, e ao  true  corresponde qualquer valor diferente de 0 (normalmente 1)      int aNumber = 10; int anotherNumber = 6; //replace with boolean if in JAVA BOOL correct = false;  if(9 == aNumber)      correct = true; if (anotherNumber > aNumber)      aNumber = anotherNumber;     
Programação em Java e ObjC: Condições  if Algumas variantes da estrutura  if : If... Else...  If... Else if...  If... Else if... Else... Switch
Programação em Java e ObjC: 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... }
Programação em Java e ObjC: Condições  if... else... if É possível combinar  if s  sequencialmente if (<condição A>) {      <acções A> } else if (<condição B>){       <acções B> } else {       <acções C> }
Programação em Java e ObjC: Condições  switch É possível escolher de forma mais prática o caminho a executar se a escolha for baseada num valor numérico switch (<expressão>) {     case 1:          <Acções A>         break;     case 2:         <Acções B>         break;     case <X>:         <Acções X>         break;      default:          <Acções> }
Programação em Java e ObjC: 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
Programação em Java e ObjC: Operadores Lógicos Keywords  AND  :  && if (x > 10 && x < 20) { NSLog(@“Entre 10 e 20”); } OR  :  || if (x < 10 || x > 20) { NSLog(@“Fora do intervalo [10; 20]”); } NOT  :  ! if (!(x < 10)) { NSLog(@“X não é menor do que 10”); }
Programação em Java e ObjC: Exercício 2 Implemente em Java e ObjC 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  &quot;7 é maior do que 3&quot;. 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  &quot;7 está entre 2 e 15&quot;. Divida  num1  por  num2 , imprimindo o resultado, tendo o cuidado de verificar se  num2  é diferente de zero! Divisões por zero em Java e ObjC provocam o &quot;crash&quot; da aplicação!
Programação em Java e ObjC: Exercício 2 ObjC int num1 = 5; int num2 = 12; int num3 = 7; if(num1 == num2){      NSLog(@&quot;%d is equal to %d&quot;, num1, num2); } else if(num1 > num2){      NSLog(@&quot;%d is bigger than %d&quot;, num1, num2); } else {      NSLog(@&quot;%d is smaller than %d&quot;, num1, num2);      if (num3 > num1 && num3 < num2) { NSLog(@&quot;%d is between %d and %d&quot;, num3, num1, num2);      } } if(num2 != 0){      NSLog(@&quot;A divisão de %d por %d é %f&quot;, num1, num2, (float)num1/num2); }
Programação em Java e ObjC: Exercício 2 Java int num1 = 5; int num2 = 12; int num3 = 7; if(num1 == num2) {      System.out.println(String.format(&quot;%d is equal to %d&quot;, num1, num2)); } else if(num1 > num2){      System.out.println(String.format(&quot;%d is bigger than %d&quot;, num1, num2)); } else {      System.out.println(String.format(&quot;%d is smaller than %d&quot;, num1, num2));        if (num3 > num1 && num3 < num2) {      System.out.println(String.format(&quot;%d is between %d and %d&quot;, num3, num1, num2));      } } if(num2 != 0){      System.out.println(String.format(&quot;A divisão de %d por %d é %f&quot;, num1, num2, (float)num1/num2)); }
Programação em Java e ObjC: Exercício 3 Implemente em Java e ObjC um programa que: Defina 2 variáveis para armazenar dois inteiros à escolha ( num1 ,  num2 ), Defina uma variável para armazenar um caractere, correspondente às 4 operações aritméticas ( '+', '-', '*', '/' ) Dependendo do caractere armazenado na variável definida no ponto 2, realize a operação correspondente, usando  num1  como o primeiro operador e  num2  como o segundo, imprimindo o resultado da operação. No caso de o caractere não ser uma operação reconhecida, deverá imprimir uma mensagem de erro. Não permita divisões por zero!
Programação em Java e ObjC: Exercício 3 ObjC int num1 = 5; int num2 = 2; char op = '/'; if(num2 == 0 && op == '/'){      NSLog(@&quot;second operator is zero valued --> impossible to perform division&quot;);      return -1; } switch (op) {      case '+': NSLog(@&quot;%d + %d = %d&quot;, num1, num2, num1+num2); break;      case '-': NSLog(@&quot;%d - %d = %d&quot;, num1, num2, num1-num2); break;      case '*':          NSLog(@&quot;%d * %d = %d&quot;, num1, num2, num1*num2); break;      case '/': NSLog(@&quot;%d / %d = %f&quot;, num1, num2, num1/(float)num2); break;      default: NSLog(@&quot;Operation not recognized...&quot;); break; }
Programação em Java e ObjC: Exercício 3 Java int num1 = 5; int num2 = 0; char op = '/'; if(num2 == 0 && op == '/'){      System.out.println(String.format(&quot;second operator is zero valued --> impossible to perform division&quot;));      return; }  switch (op) {      case '+':       System.out.println(String.format(&quot;%d + %d = %d&quot;, num1, num2, num1+num2)); break;      case '-':       System.out.println(String.format(&quot;%d - %d = %d&quot;, num1, num2, num1-num2)); break;      case '*':       System.out.println(String.format(&quot;%d * %d = %d&quot;, num1, num2, num1*num2)); break;      case '/':       System.out.println(String.format(&quot;%d / %d = %f&quot;, num1, num2, num1/(float)num2)); break;      default:       System.out.println(String.format(&quot;Operation not recognized...&quot;)); break; }
Programação em Java e ObjC: 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
Programação em Java e ObjC: Ciclos  for Executado um número pré-determinado de vezes for (<inicialização>; <condição>; <incremento>)  {      <acções> } Exemplo: for (int i = 0; i < 10; i++) {       NSLog(@&quot;Counting... %d&quot;, i); //ObjC } 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 ++)
Programação em Java e ObjC: Ciclos  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> } Exemplo: int i = 0; while (i <= 10) {      NSLog(@&quot;Counting... %d&quot;, i);//ObjC      i = i + 1; }
Programação em Java e ObjC: Ciclos  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>); Exemplo: int i = 0; do {      NSLog(@&quot;Counting... %d&quot;,i);      i = i + 1; } while (i <= 10);
Programação em Java e ObjC: Exercício 4 Implemente em Java e ObjC 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  http://en.wikipedia.org/wiki/Fibonacci_number
Programação em Java e ObjC: Exercício 4.2 Implemente em Java e ObjC 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 Reparou em algo estranho nos últimos números da sequência?!? (como podem surgir valores negativos de uma soma de valores positivos???) Numeric overflow! Em ObjC, numa implementação de 32 bits, o intervalo máximo de representação para um  unsigned int  é [0, 4294967295]; num sistema de 64 bits o intervalo aumenta para [0, 18446744073709551615]. Se os inteiros tiverem sinal ( int ) os intervalos passam a ser [-2147483648, +2147483647] e [−9223372036854775808, +9223372036854775807], para implementações 32-bit e 64-bit, respectivamente. Em ObjC, o número de bits usados para representações numéricas de inteiros (bem como valores de vírgula flutuante -  float, double ) depende da plataforma (i.e. da CPU e do próprio compilador).  Ao escrever um programa em ObjC, a única garantia que se tem e que um  int  terá no mínimo 32 bits. De forma a evitar problemas futuros quando se compila o código noutras plataformas, dever-se-á sempre assumir por omissão um intervalo de representação para  int  de 32 bits.    
Programação em Java e ObjC: Exercício 4.1 ObjC  (ver solução Java para uma implementação algorítmica mais eficiente)              unsigned long long int valN_2 = 0; //F(0) --> use long long for a 64 bit int!! unsigned long long int valN_1 = 1; //F(1) unsigned long long int valN; int numFibonacciNumbers = 100; NSLog(@&quot;Printing the first %d Fibonacci  numbers...&quot;, numFibonacciNumbers);          NSLog(@&quot;0 --> %d&quot;, valN_2); //F(0) NSLog(@&quot;1 --> %d&quot;, valN_1); //F(1)          for(int n=2; n<numFibonacciNumbers; n++) { valN = valN_1 + valN_2; //F(n) = F(n-1) + F(n-2) NSLog(@&quot;%d --> %qu&quot;, n, valN); //update stored values... valN_2 = valN_1;  valN_1 = valN; }
Programação em Java e ObjC: Exercício 4.1 Java      int numFibonacciNumbers = 100; long valN = 0; long valN_1 = 1; for (int n = 0; n < numFibonacciNumbers; n++) {      System.out.println(String.format(&quot;%d --> %d&quot;, n, valN));      valN = valN + valN_1;      valN_1 = valN - valN_1; }
Programação em Java e ObjC: Exercício 4.2 ObjC  (ver solução Java para uma implementação algorítmica mais eficiente)              unsigned long long int valN_2 = 0; //F(0) --> use long long for a 64 bit int!! unsigned long long int valN_1 = 1; //F(1) unsigned long long int valN; int maxFibonacciNumber = 10000; NSLog(@&quot;Printing the Fibonacci numbers < %d&quot;, maxFibonacciNumber); if(maxFibonacciNumber >= 0) NSLog(@&quot;>> %d&quot;, valN_2); //F(0) if (maxFibonacciNumber >= 1) NSLog(@&quot;>> %d&quot;, valN_1); //F(1) valN = valN_1 + valN_2; //F(2) = F(1) + F(0) while (valN <= maxFibonacciNumber) { NSLog(@&quot;>> %qu&quot;, valN); //update stored values... valN_2 = valN_1; valN_1 = valN; valN = valN_1 + valN_2; //F(n) = F(n-1) + F(n-2) }  
Programação em Java e ObjC: Exercício 4.2 Java     int maxFibonacciNumber = 0; int valN = 0; int valN_1 = 1; while ( valN <= maxFibonacciNumber) {      System.out.println(String.format(&quot;>> %d&quot;, valN));      valN = valN + valN_1;      valN_1 = valN - valN_1; }
Programação em Java e ObjC: 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
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. Programação em Java e ObjC: Arrays - Declaração e Inicialização ObjC <tipo> meuArray[tamanho]; Exemplo: int idades[5]; Java <tipo> meuArray[]; meuArray = new <tipo>[tamanho]; Exemplo int idades[]; idades = new int[5];
Declarar e inicializar num só passo   int idade[] = {23, 47, 11, 92, 76}; Programação em Java e ObjC: Arrays - Declaração e Inicialização
Programação em Java e ObjC: Arrays   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 , ...
Programação em Java e ObjC: Arrays 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 array for (int i=0; i < arraySize; i++) {      //apenas um exemplo...          idade[i] = (i+1)*(i+1);  } //imprime idades inferiores a 20 for(int i=0; i < arraySize; i++) {      if (idade[i] < 20)          NSLog(@&quot;%d&quot;, idade[i]); }
Programação em Java e ObjC: Exercício 5 Implemente um programa em ObjC e Java que: guarde num array de valores inteiros 5 idades (e.g.,  {23, 47, 11, 92, 76} ) dada uma determinada idade, calcule as respectivas diferenças com as idade armazenadas no array criado no ponto anterior as diferenças de idade deverão ser sempre positivas! guarde as diferenças de idades num vector de inteiros, e imprima-as.  
Programação em Java e ObjC: Exercício 5 ObjC          int idade[] = {23, 47, 11, 92, 76}; int arraySize = 5; int dif[arraySize]; int age = 14; for(int i=0; i<arraySize; i++) { if(age > idade[i])      dif[i] = age - idade[i]; else      dif[i] = idade[i] - age; NSLog(@&quot;%d&quot;, dif[i]); }
Programação em Java e ObjC: Exercício 5 Java      int idade[] = {23, 47, 11, 92, 76};      int arraySize = 5;      int dif[] = new int[arraySize];      int age = 14;      for(int i=0; i<arraySize; i++) {          if(age > idade[i]) {              dif[i] = age - idade[i]; } else {              dif[i] = idade[i] - age; } System.out.println(String.format(&quot;%d&quot;, dif[i]));      }
Programação em ObjC: Apontadores Um apontador é uma referência para um qualquer elemento de dados (de um tipo particular - e.g.  int, float, char , ...), armazenado num qualquer lugar (i.e. endereço) de memória. é uma variável que guarda o endereço de memória onde está armazenado um determinado valor, ou dado int aNumber = 23; int *aNumberPtr;      aNumberPtr =  & aNumber; // get address NSLog(@&quot;Value of aNumber is: %d&quot;, aNumber); //23 NSLog(@&quot; Memory address  of aNumber is: %qX&quot;, aNumberPtr);//B745CD81 NSLog(@&quot; Value pointed  by aNumberPtr is: %d&quot;,  * aNumberPtr); //23 // change value pointed  by aNumberPtr (i.e. aNumber var) * aNumberPtr = 1234; NSLog(@&quot;Value pointed by aNumberPtr is now: %d&quot;,  * aNumberPtr); //1234 NSLog(@&quot;Value of aNumber is now also: %d&quot;, aNumber); //1234            
Programação em ObjC: Apontadores e Arrays Um apontador pode ser usado, de forma conveniente, para aceder a um array, ou até para &quot;simular&quot; um array No entanto, arrays e apontadores não são a mesma coisa! int idade[] = {23, 47, 11, 92, 76}; int  * ptr; // pointer  to int // o nome de um array é automaticamente e // convenientemente convertido num apontador! ptr = idade; // obtém o endereço do array idade NSLog(@&quot;%qX == %qX ?&quot;, ptr, idade); NSLog(@&quot;%d == %d ?&quot;, *ptr, idade[0]); //obtém o 1º valor do array NSLog(@&quot;%d == %d ?&quot;, *(ptr+3), idade[3]);//lê 4º valor do array NSLog(@&quot;%d == %d ?&quot;, *(ptr+2), *(idade+2));//lê 3º valor do array *(ptr+2) = 0; //altera valor do 3º elemento do array NSLog(@&quot;%d == %d ?&quot;, *(ptr+2), *(idade+2));//lê 3º valor do arr ay      
Programação em ObjC: Apontadores e Arrays Array de  char       char a[] = &quot;hello&quot;; char *p = &quot;world&quot;;
Programação em Java e ObjC: Exercício 6 Implemente um programa em ObjC que: guarde num array de valores inteiros 5 idades (e.g.,  {23, 47, 11, 92, 76} ) dada uma determinada idade, calcule as respectivas diferenças com as idade armazenadas no array criado no ponto anterior as diferenças de idade deverão ser sempre positivas! guarde as diferenças de idades num vector de inteiros, e imprima-as.   Usando apontadores em todos os acessos aos arrays!
Programação em Java e ObjC: Exercício 6 ObjC          int idade[] = {23, 47, 11, 92, 76}; int arraySize = 5; int dif[arraySize]; int age = 14; int *idadePtr = idade; int *difPtr = dif; for(int i=0; i<arraySize; i++) { if(age > *(idadePtr+i))      *(difPtr+i) = age - *(idadePtr+i); else      *(difPtr+i) = *(idadePtr+i) - age; NSLog(@&quot;%d&quot;, *(difPtr+i)); }
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 &quot;chamar&quot; e executar esse bloco de código Programação em Java e ObjC: Funções * 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.
Programação em Java e ObjC: Funções Exemplo (Java):  public static void main(String args[])  {      System.out.println(&quot;Executa o programa&quot;);      fazTarefaEspecifica1(); //chamada a uma função!      fazTarefaEspecifica2(); //chamada a outra função! } void fazTarefaEspecifica_1() {      System.out.println(&quot;Esta função executa uma série de operações para completar a tarefa 1&quot;); } void fazTarefaEspecifica_2() {      System.out.println(&quot;Esta função executa uma série de operações para completar a tarefa 2&quot;); }
Sintaxe para definir a função      void nomeFunção()           {             //código da função...         } void  é um tipo especial que significa &quot;vazio&quot;, &quot;sem tipo&quot; 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(); Programação em Java e ObjC: Funções
Programação em Java e ObjC: 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);
Programação em Java e ObjC: Funções com Parâmetros Exemplo (Java) public static void main(String args[])  {      soma(1, 2); // escreve &quot;3&quot;      soma(3, 5); // escreve &quot;8&quot; } void soma(int num1, int num2)  {      int resultado;      resultado = num1 + num2;      System.out.println(resultado); }
Programação em Java e ObjC: 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
Programação em Java e ObjC: Funções com valor de retorno Exemplo (Java) public static void main(String args[]) {      int num1;      int num2;      int r;      num1 = 1;      num2 = 2;      r = soma(1, 2);       System.out.println(String.format(&quot;%d&quot;, r)); } int  soma(int num1, int num2) {      int resultado;      resultado = num1 + num2;      return resultado;         }
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 Programação em Java e ObjC: Funções com valor de retorno
Programação em Java e ObjC: Exercício 7 Implemente um programa em Java/ObjC que: Permita calcular operações (+, -, /, *) sobre fracções (numerador/denominador) O programa deve ser estruturado em funções Uma função que recebe duas fracções (numerador1, denominador1, numerador2 e denominador2) e a operação a efectuar, e consoante a operação invoca outra função específica para a operação e retorna o resultado 
Programação em Java e ObjC: Exercício 7 Java (1/3) public static void main(String[] args) {      int num1 = 1;      int denom1 = 2;      int num2 = 2;      int denom2 = 3;      char op = '*';      operacao(num1, denom1, num2, denom2, op); }
Programação em Java e ObjC: Exercício 7 Java (2/3) static void operacao(int n1, int d1, int n2, int d2, char op) { int result[] = new int[2]; switch(op) { case '+': result = soma(n1, d1, n2, d2); break; case '-': result = subtraccao(n1, d1, n2, d2); break; case '*': result = multiplicacao(n1, d1, n2, d2); break; case '/': result = divisao(n1, d1, n2, d2); break; default: System.out.println(String.format(&quot;Operação não reconhecida&quot;)); } System.out.println(String.format(&quot;O resultado de %d/%d %c %d/%d é: %d/%d&quot;, n1, d1, op, n2, d2, result[0], result[1])); }
Programação em Java e ObjC: Exercício 7 Java (3/3) static int[] soma(int n1, int d1, int n2, int d2) {                 // result[0] guarda o numerador;                  // result[1] guarda o denominador int result[] = new int[2];  int resultNum, resultDenom; resultNum = n1*d2 + d1*n2; resultDenom = d1 * d2; result[0] = resultNum; result[1] = resultDenom; return result; }
Programação em Java e Obj-C: 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
Programação em Java e Obj-C: 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)
Fim Cursos de Verão na Católica 2010 http://porto.ucp.pt/cvc/ Jorge C. S. Cardoso, Luís Gustavo Martins jorgecardoso@ieee.org, lmartins@porto.ucp.pt http://slideshare.net/jorgecardoso (tag: cvc2010)

Conceitos Fundamentais de Programacao

  • 1.
    Conceitos Fundamentais deProgramação Jorge C. S. Cardoso, Luís Gustavo Martins jorgecardoso@ieee.org, lmartins@porto.ucp.pt Cursos de Verão na Católica 2010
  • 2.
    Apresentação Apresentação dosdocentes Jorge Cardoso - http://jorgecardoso.eu Luís Gustavo Martins - http://web.me.com/lgustavomartins Apresentação dos alunos Nome, background, expectativas... Âmbito deste curso Curso de nível introdutório Não requer conhecimentos prévios de programação Organizado em três módulos: 1 - Introdução aos princípios de programação 2 - Introdução aos princípios de Programação Orientada a Objectos (OOP) 3 - Programação para Android e iPhone
  • 3.
    Apresentação Planos Futurosde Formação Avançada em: Programação iOS (iPhone, iPad, iPod Touch, ...) Programação Android Programação C++ e openFramworks Programação Java e Processing ... Formação Certificada em Som e Imagem da Escola das Artes da Universidade Católica http://www.artes.ucp.pt/criatividadedigital/
  • 4.
    Introdução aos princípiosde programação Conteúdo Introdução à Programação Conceitos e Definições Instalação de IDEs Linguagens de Programação Java e Objective C Estrutura do código fonte Hello World em Java e Objective C Programação em Java e Objective C Variáveis Operadores Condições Ciclos Arrays Apontadores Funções
  • 5.
    O Que éProgramar? Especificar um conjunto de instruções para serem executadas, seguindo uma determinada ordem, por uma máquina ou pessoa Exemplo Ligar o computador Esperar que o SO arranque Aceder ao Go do Finder Escolher a opção Connect to Server Esperar pela janela de login Inserir login e password Escolher o share igual ao login
  • 6.
    Linguagens de ProgramaçãoUm programa é uma sequência de números Interpretados como instruções pelo processador (CPU) Os primeiros “programadores” de computador escreviam programas em números 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 .data message db &quot;Hello world, I'm learning Assembly !!!&quot;, &quot;$&quot; .code main proc mov ax,seg message mov ds,ax mov ah,09 lea dx,message int 21h mov ax,4c00h int 21h main endp end main
  • 7.
    Linguagens de ProgramaçãoO programa pode ser descrito usando vários tipos de linguagens: Natural (e.g., Inglês) &quot; tell Finder to open myDocument.doc &quot; Diagrama (e.g., fluxogramas) 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; }
  • 8.
    Linguagens de ProgramaçãoAs linguagens de programação foram evoluindo para sintaxes mais próximas da linguagem natural Linguagens de alto-nível source:  http://chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf
  • 9.
    Linguagens de ProgramaçãoJava Permite a criação de programas que podem ser executados em várias plataformas sem modificação A sua utilização tornou-se mais conhecida através das applets pequenos programas que podem ser executados num browser. 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. Usada como linguagem preferencial nas plataformas Android
  • 10.
    Linguagens de ProgramaçãoObjective-C 2.0 Baseada na linguagem ANSI C, é uma linguagem de programação reflexiva orientada a objectos que implementa a transmissão de mensagens, ao estilo do Smalltalk. É utilizada principalmente no Apple Mac OS X e GNUstep, dois ambientes baseados no padrão OpenStep e é a principal linguagem utilizada em NeXTSTEP, OPENSTEP, Cocoa e dispositivos  Apple iOS (e.g. iPod Touch, iPhone e iPad) . Programas genéricos em Objective-C (que não façam uso destas bibliotecas) também podem ser  compilados  por qualquer sistema suportado pelo  gcc , que inclui um  compilador  Objective-C. Também conhecido como ObjC, Obj-C
  • 11.
    Linguagens de Programação:   Conceitos de Hardware CPU (Central Processing Unit) é a parte de um sistema de computador que executa as instruções de um programa de computador RAM (Random Access Memory) É um tipo de memória que permite a leitura e a escrita , utilizada como memória primária em sistemas electrónicos digitais. O termo acesso aleatório identifica a capacidade de acesso a qualquer posição em qualquer momento, por oposição ao acesso sequencial, imposto por alguns dispositivos de armazenamento, como fitas magnéticas Necessita de alimentação para preservar os dados
  • 12.
    Linguagens de Programação:  Conceitos de Hardware Memórias FLASH É uma memória de computador do tipo EEPROM (Electrically-Erasable Programmable Read-Only Memory) chip re-escrevível que, ao contrário de uma memória RAM convencional, preserva o seu conteúdo sem a necessidade de fonte de alimentação comumente usada em cartões de memória, flash drives USB (pen drives), MP3 Players, dispositivos como câmeras digitais, leitores MP3, smart phones (incluindp iPhone e equipamentos Android)
  • 13.
    Linguagens de Programação: Código Fonte Texto que o programador escreve numa determinada linguagem de programação (e.g., ObjC, Java, ...) 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. */ }
  • 14.
    Linguagens de Programação: 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 proc mov ax,seg message mov ds,ax mov ah,09 lea dx,message int 21h mov ax,4c00h int 21h main endp end main
  • 15.
    Linguagens de Programação:   Criação de um executável em ObjC Compilador Converte código fonte (em ObjC) em código máquina (específico para cada CPU - e.g. Intel Atom, Apple A4) Código máquina gerado pelo compilador também conhecido como &quot;código objecto&quot; Linker 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 Permite o uso de bibliotecas disponibilizadas por terceiros (e.g. Cocoa, no iPhone)
  • 16.
    Linguagens de Programação:   Criação de executável em Java Compilador A linguagem Java é compilada em código máquina para um processador virtual (máquina virtual) O código máquina resultante é chamado &quot;bytecode&quot; Em Java não existe necessidade de &quot;linkagem&quot; Uma aplicação Java consiste num conjunto destes ficheiros (e não apenas um) A máquina virtual trata de carregar para a memória os ficheiros necessários à medida que o programa executa
  • 17.
    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)
  • 18.
    Estrutura do CódigoFonte Entry point: main Existe sempre um bloco principal que é o primeiro a ser executado quando se lança o programa: a função main Java  (myProgram.java) public static void main(String args[])  {      System.out.println(&quot;Hello world&quot;); //write your code here! } ObjC(myProgram.m) int main( int argc, const char *argv[] ) {     NSAutoreasePool * pool = [[NSAutoReleasePool alloc] init];     NSLog(@&quot;hello world&quot;);  //write your code here!!        [pool drain];       return 0; }
  • 19.
    Hello World emObjC Abrir o XCode File -> New Project... Selecionar: Mac OS X no menu esquerdo Command Line Tool no menu superior direito Choose... Dar um nome ao projecto (e.g. HelloWorld) Seleccionar o ficheiro HelloWorld.m Implementa a função main Rever código em ObjC  Compilar e &quot;Linkar&quot; (i.e., Build) e executar   Seleccionar  Build and Run no menu superior do XCode  
  • 20.
    Hello World emObjC 7. Verificar resultado na  Debugger Console do XCode
  • 21.
    Hello World emJava Abrir Eclipse File -> New -> Java Project Preencher o campo &quot;Project Name&quot; com HelloWorld e clicar &quot;Finish&quot; File -> New -> Class Preencher o campo &quot;Name&quot; com HelloWord e marcar a opção &quot;public static void main....&quot;   Substituir a linha: // TODO Auto-generated method stub com a instrução    System.out.println(&quot;Hello world&quot;); Executar o programa: Run -> Run Ver o resultado na &quot;Console&quot;
  • 22.
    Introdução à Programação Objective C e Java 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 ; - ponto e vírgula (semicolon); acaba quase todas as linhas de código , - vírgula (comma), separa parâmetros de funções Em Mac: { } – Chavetas (Curly braces): [Shift][Alt] + ( ou ) [ ] – Parentesis Rectos: [Alt] + ( ou ) 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; }
  • 23.
    Programação em Javae ObjC: Variáveis Variáveis são uma forma de armazenar valores durante a execução de um programa Uma variável é um nome que podemos utilizar 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 = 6 result = someNumber * anotherNumber; 
  • 24.
    Programação em Javae ObjC: Variáveis Antes de podermos usar uma variável temos de a declarar .  A declaração implica indicar o tipo de dados que a variável vai guardar. Inteiros ( int, long )  Decimais ( float, double ) Lógicos ( boolean, BOOL ) Caracteres ( char ) <tipo> nomeDaVariavel; <tipo> nomeDaVariavel = <valorinicial>; http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html http://www.webtechexpress.com/lessons/lesson-5-objective-c-basic-data-types-and-literal-constants/  http://en.wikipedia.org/wiki/C_syntax#Primitive_data_types  int myNumber; long anotherNumber = 13; float aFloatNumber = 0.24; double aDoublePrecisionNumber = 1.23e2; //for ObjC BOOL isActive = true; //for JAVA boolean isActive = true; char aLetter = 'P';
  • 25.
    Para guardarmos umvalor numa variável temos de atribuí-lo à variável. minhaVariavel = <valor>; Aquilo que atribuimos a uma variável não tem de ser um valor simples; pode ser 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; Programação em Java e ObjC: Variáveis
  • 26.
    Algumas restrições nouso de nomes em variáveis: Nomes das variáveis devem 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 ObjC ou do Java não podem ser usadas como nomes de variáveis (e.g. i nt, 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. Para um guia de estilo em programação , ver http://geosoft.no/development/cppstyle.html (focado na linguagem C++, mas aplicável ao ObjC e Java) Programação em Java e ObjC: Variáveis
  • 27.
    Programação em Javae ObjC: 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
  • 28.
    Programação em Javae ObjC: Exercício 1 Crie um programa em Java e ObjC 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...
  • 29.
    Programação em Javae ObjC: Exercício 1 ObjC #import <Foundation/Foundation.h> int main (int argc, const char * argv[])  {      NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];      int aNumber = 5;      int anotherNumber = 2;      float aFloat = 2.0;      float result;      result = aNumber / anotherNumber;      NSLog(@&quot;%d divided by %d is equal to %f&quot;, aNumber, anotherNumber, result);      //try other combinations of int, floats and check the division results...      [pool drain];      return 0; } Consultar a documentação do NSLog() no XCode Docs (ou na web)! http://developer.apple.com/iphone/library/documentation/cocoa/reference/foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/func/NSLog http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html
  • 30.
    Programação em Javae ObjC: Exercício 1 Java public class Exercicio {      public static void main(String[] args) { int aNumber = 5; int anotherNumber = 2; float aFloat = 2.0f; float result; result = aNumber / anotherNumber; System.out.println(String.format(&quot;%d divided by %d is equal to %f&quot;, aNumber, anotherNumber, result)); } } Consultar a documentação do System.out.println e String.format  http://download.oracle.com/javase/1.5.0/docs/api/java/io/PrintStream.html#println(java.lang.String) http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#format(java.lang.String, java.lang.Object...)
  • 31.
    Programação em Javae ObjC: Condições Em quase todos os programas é necessário executar algumas acções apenas se uma determinada condição for verdadeira...
  • 32.
    Programação em Javae ObjC: 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]  }
  • 33.
    Programação em Javae ObjC: Condições if A condição é uma expressão do tipo boolean , BOOL   Literal true ou false  Variável ( boolean, BOOL ) com o valor true ou false   Expressão com operadores condicionais //JAVA boolean isActive = true; //ObjC BOOL isActive = true; if(isActive) //eqv. a if (isActive == true) {      //do something...      isActive = false; }
  • 34.
    Programação em Javae ObjC: 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 Em ObjC ao valor false corresponde o inteiro 0, e ao true corresponde qualquer valor diferente de 0 (normalmente 1)      int aNumber = 10; int anotherNumber = 6; //replace with boolean if in JAVA BOOL correct = false;  if(9 == aNumber)      correct = true; if (anotherNumber > aNumber)      aNumber = anotherNumber;     
  • 35.
    Programação em Javae ObjC: Condições  if Algumas variantes da estrutura if : If... Else...  If... Else if...  If... Else if... Else... Switch
  • 36.
    Programação em Javae ObjC: 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... }
  • 37.
    Programação em Javae ObjC: Condições  if... else... if É possível combinar if s sequencialmente if (<condição A>) {      <acções A> } else if (<condição B>){      <acções B> } else {      <acções C> }
  • 38.
    Programação em Javae ObjC: Condições  switch É possível escolher de forma mais prática o caminho a executar se a escolha for baseada num valor numérico switch (<expressão>) {     case 1:          <Acções A>         break;     case 2:         <Acções B>         break;     case <X>:         <Acções X>         break;      default:          <Acções> }
  • 39.
    Programação em Javae ObjC: 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
  • 40.
    Programação em Javae ObjC: Operadores Lógicos Keywords AND : && if (x > 10 && x < 20) { NSLog(@“Entre 10 e 20”); } OR : || if (x < 10 || x > 20) { NSLog(@“Fora do intervalo [10; 20]”); } NOT : ! if (!(x < 10)) { NSLog(@“X não é menor do que 10”); }
  • 41.
    Programação em Javae ObjC: Exercício 2 Implemente em Java e ObjC 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 &quot;7 é maior do que 3&quot;. 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 &quot;7 está entre 2 e 15&quot;. Divida num1 por num2 , imprimindo o resultado, tendo o cuidado de verificar se num2 é diferente de zero! Divisões por zero em Java e ObjC provocam o &quot;crash&quot; da aplicação!
  • 42.
    Programação em Javae ObjC: Exercício 2 ObjC int num1 = 5; int num2 = 12; int num3 = 7; if(num1 == num2){      NSLog(@&quot;%d is equal to %d&quot;, num1, num2); } else if(num1 > num2){      NSLog(@&quot;%d is bigger than %d&quot;, num1, num2); } else {      NSLog(@&quot;%d is smaller than %d&quot;, num1, num2);      if (num3 > num1 && num3 < num2) { NSLog(@&quot;%d is between %d and %d&quot;, num3, num1, num2);      } } if(num2 != 0){      NSLog(@&quot;A divisão de %d por %d é %f&quot;, num1, num2, (float)num1/num2); }
  • 43.
    Programação em Javae ObjC: Exercício 2 Java int num1 = 5; int num2 = 12; int num3 = 7; if(num1 == num2) {      System.out.println(String.format(&quot;%d is equal to %d&quot;, num1, num2)); } else if(num1 > num2){      System.out.println(String.format(&quot;%d is bigger than %d&quot;, num1, num2)); } else {      System.out.println(String.format(&quot;%d is smaller than %d&quot;, num1, num2));        if (num3 > num1 && num3 < num2) {     System.out.println(String.format(&quot;%d is between %d and %d&quot;, num3, num1, num2));      } } if(num2 != 0){      System.out.println(String.format(&quot;A divisão de %d por %d é %f&quot;, num1, num2, (float)num1/num2)); }
  • 44.
    Programação em Javae ObjC: Exercício 3 Implemente em Java e ObjC um programa que: Defina 2 variáveis para armazenar dois inteiros à escolha ( num1 , num2 ), Defina uma variável para armazenar um caractere, correspondente às 4 operações aritméticas ( '+', '-', '*', '/' ) Dependendo do caractere armazenado na variável definida no ponto 2, realize a operação correspondente, usando num1 como o primeiro operador e num2 como o segundo, imprimindo o resultado da operação. No caso de o caractere não ser uma operação reconhecida, deverá imprimir uma mensagem de erro. Não permita divisões por zero!
  • 45.
    Programação em Javae ObjC: Exercício 3 ObjC int num1 = 5; int num2 = 2; char op = '/'; if(num2 == 0 && op == '/'){      NSLog(@&quot;second operator is zero valued --> impossible to perform division&quot;);      return -1; } switch (op) {      case '+': NSLog(@&quot;%d + %d = %d&quot;, num1, num2, num1+num2); break;      case '-': NSLog(@&quot;%d - %d = %d&quot;, num1, num2, num1-num2); break;      case '*':          NSLog(@&quot;%d * %d = %d&quot;, num1, num2, num1*num2); break;      case '/': NSLog(@&quot;%d / %d = %f&quot;, num1, num2, num1/(float)num2); break;      default: NSLog(@&quot;Operation not recognized...&quot;); break; }
  • 46.
    Programação em Javae ObjC: Exercício 3 Java int num1 = 5; int num2 = 0; char op = '/'; if(num2 == 0 && op == '/'){      System.out.println(String.format(&quot;second operator is zero valued --> impossible to perform division&quot;));      return; } switch (op) {      case '+':      System.out.println(String.format(&quot;%d + %d = %d&quot;, num1, num2, num1+num2)); break;      case '-':      System.out.println(String.format(&quot;%d - %d = %d&quot;, num1, num2, num1-num2)); break;      case '*':      System.out.println(String.format(&quot;%d * %d = %d&quot;, num1, num2, num1*num2)); break;      case '/':      System.out.println(String.format(&quot;%d / %d = %f&quot;, num1, num2, num1/(float)num2)); break;      default:      System.out.println(String.format(&quot;Operation not recognized...&quot;)); break; }
  • 47.
    Programação em Javae ObjC: 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
  • 48.
    Programação em Javae ObjC: Ciclos for Executado um número pré-determinado de vezes for (<inicialização>; <condição>; <incremento>)  {      <acções> } Exemplo: for (int i = 0; i < 10; i++) {       NSLog(@&quot;Counting... %d&quot;, i); //ObjC } 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 ++)
  • 49.
    Programação em Javae ObjC: Ciclos  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> } Exemplo: int i = 0; while (i <= 10) {      NSLog(@&quot;Counting... %d&quot;, i);//ObjC      i = i + 1; }
  • 50.
    Programação em Javae ObjC: Ciclos  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>); Exemplo: int i = 0; do {      NSLog(@&quot;Counting... %d&quot;,i);      i = i + 1; } while (i <= 10);
  • 51.
    Programação em Javae ObjC: Exercício 4 Implemente em Java e ObjC 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  http://en.wikipedia.org/wiki/Fibonacci_number
  • 52.
    Programação em Javae ObjC: Exercício 4.2 Implemente em Java e ObjC 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 Reparou em algo estranho nos últimos números da sequência?!? (como podem surgir valores negativos de uma soma de valores positivos???) Numeric overflow! Em ObjC, numa implementação de 32 bits, o intervalo máximo de representação para um unsigned int é [0, 4294967295]; num sistema de 64 bits o intervalo aumenta para [0, 18446744073709551615]. Se os inteiros tiverem sinal ( int ) os intervalos passam a ser [-2147483648, +2147483647] e [−9223372036854775808, +9223372036854775807], para implementações 32-bit e 64-bit, respectivamente. Em ObjC, o número de bits usados para representações numéricas de inteiros (bem como valores de vírgula flutuante - float, double ) depende da plataforma (i.e. da CPU e do próprio compilador).  Ao escrever um programa em ObjC, a única garantia que se tem e que um int terá no mínimo 32 bits. De forma a evitar problemas futuros quando se compila o código noutras plataformas, dever-se-á sempre assumir por omissão um intervalo de representação para int de 32 bits.    
  • 53.
    Programação em Javae ObjC: Exercício 4.1 ObjC  (ver solução Java para uma implementação algorítmica mais eficiente)              unsigned long long int valN_2 = 0; //F(0) --> use long long for a 64 bit int!! unsigned long long int valN_1 = 1; //F(1) unsigned long long int valN; int numFibonacciNumbers = 100; NSLog(@&quot;Printing the first %d Fibonacci  numbers...&quot;, numFibonacciNumbers);          NSLog(@&quot;0 --> %d&quot;, valN_2); //F(0) NSLog(@&quot;1 --> %d&quot;, valN_1); //F(1)          for(int n=2; n<numFibonacciNumbers; n++) { valN = valN_1 + valN_2; //F(n) = F(n-1) + F(n-2) NSLog(@&quot;%d --> %qu&quot;, n, valN); //update stored values... valN_2 = valN_1;  valN_1 = valN; }
  • 54.
    Programação em Javae ObjC: Exercício 4.1 Java      int numFibonacciNumbers = 100; long valN = 0; long valN_1 = 1; for (int n = 0; n < numFibonacciNumbers; n++) {      System.out.println(String.format(&quot;%d --> %d&quot;, n, valN));      valN = valN + valN_1;      valN_1 = valN - valN_1; }
  • 55.
    Programação em Javae ObjC: Exercício 4.2 ObjC  (ver solução Java para uma implementação algorítmica mais eficiente)              unsigned long long int valN_2 = 0; //F(0) --> use long long for a 64 bit int!! unsigned long long int valN_1 = 1; //F(1) unsigned long long int valN; int maxFibonacciNumber = 10000; NSLog(@&quot;Printing the Fibonacci numbers < %d&quot;, maxFibonacciNumber); if(maxFibonacciNumber >= 0) NSLog(@&quot;>> %d&quot;, valN_2); //F(0) if (maxFibonacciNumber >= 1) NSLog(@&quot;>> %d&quot;, valN_1); //F(1) valN = valN_1 + valN_2; //F(2) = F(1) + F(0) while (valN <= maxFibonacciNumber) { NSLog(@&quot;>> %qu&quot;, valN); //update stored values... valN_2 = valN_1; valN_1 = valN; valN = valN_1 + valN_2; //F(n) = F(n-1) + F(n-2) }  
  • 56.
    Programação em Javae ObjC: Exercício 4.2 Java     int maxFibonacciNumber = 0; int valN = 0; int valN_1 = 1; while ( valN <= maxFibonacciNumber) {      System.out.println(String.format(&quot;>> %d&quot;, valN));      valN = valN + valN_1;      valN_1 = valN - valN_1; }
  • 57.
    Programação em Javae ObjC: 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
  • 58.
    Tal como qualqueroutra 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. Programação em Java e ObjC: Arrays - Declaração e Inicialização ObjC <tipo> meuArray[tamanho]; Exemplo: int idades[5]; Java <tipo> meuArray[]; meuArray = new <tipo>[tamanho]; Exemplo int idades[]; idades = new int[5];
  • 59.
    Declarar e inicializarnum só passo   int idade[] = {23, 47, 11, 92, 76}; Programação em Java e ObjC: Arrays - Declaração e Inicialização
  • 60.
    Programação em Javae ObjC: Arrays   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 , ...
  • 61.
    Programação em Javae ObjC: Arrays 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 array for (int i=0; i < arraySize; i++) {      //apenas um exemplo...          idade[i] = (i+1)*(i+1);  } //imprime idades inferiores a 20 for(int i=0; i < arraySize; i++) {      if (idade[i] < 20)          NSLog(@&quot;%d&quot;, idade[i]); }
  • 62.
    Programação em Javae ObjC: Exercício 5 Implemente um programa em ObjC e Java que: guarde num array de valores inteiros 5 idades (e.g.,  {23, 47, 11, 92, 76} ) dada uma determinada idade, calcule as respectivas diferenças com as idade armazenadas no array criado no ponto anterior as diferenças de idade deverão ser sempre positivas! guarde as diferenças de idades num vector de inteiros, e imprima-as.  
  • 63.
    Programação em Javae ObjC: Exercício 5 ObjC          int idade[] = {23, 47, 11, 92, 76}; int arraySize = 5; int dif[arraySize]; int age = 14; for(int i=0; i<arraySize; i++) { if(age > idade[i])      dif[i] = age - idade[i]; else      dif[i] = idade[i] - age; NSLog(@&quot;%d&quot;, dif[i]); }
  • 64.
    Programação em Javae ObjC: Exercício 5 Java      int idade[] = {23, 47, 11, 92, 76};      int arraySize = 5;      int dif[] = new int[arraySize];      int age = 14;      for(int i=0; i<arraySize; i++) {          if(age > idade[i]) {              dif[i] = age - idade[i]; } else {              dif[i] = idade[i] - age; } System.out.println(String.format(&quot;%d&quot;, dif[i]));      }
  • 65.
    Programação em ObjC:Apontadores Um apontador é uma referência para um qualquer elemento de dados (de um tipo particular - e.g. int, float, char , ...), armazenado num qualquer lugar (i.e. endereço) de memória. é uma variável que guarda o endereço de memória onde está armazenado um determinado valor, ou dado int aNumber = 23; int *aNumberPtr;      aNumberPtr = & aNumber; // get address NSLog(@&quot;Value of aNumber is: %d&quot;, aNumber); //23 NSLog(@&quot; Memory address of aNumber is: %qX&quot;, aNumberPtr);//B745CD81 NSLog(@&quot; Value pointed by aNumberPtr is: %d&quot;, * aNumberPtr); //23 // change value pointed by aNumberPtr (i.e. aNumber var) * aNumberPtr = 1234; NSLog(@&quot;Value pointed by aNumberPtr is now: %d&quot;, * aNumberPtr); //1234 NSLog(@&quot;Value of aNumber is now also: %d&quot;, aNumber); //1234          
  • 66.
    Programação em ObjC:Apontadores e Arrays Um apontador pode ser usado, de forma conveniente, para aceder a um array, ou até para &quot;simular&quot; um array No entanto, arrays e apontadores não são a mesma coisa! int idade[] = {23, 47, 11, 92, 76}; int * ptr; // pointer to int // o nome de um array é automaticamente e // convenientemente convertido num apontador! ptr = idade; // obtém o endereço do array idade NSLog(@&quot;%qX == %qX ?&quot;, ptr, idade); NSLog(@&quot;%d == %d ?&quot;, *ptr, idade[0]); //obtém o 1º valor do array NSLog(@&quot;%d == %d ?&quot;, *(ptr+3), idade[3]);//lê 4º valor do array NSLog(@&quot;%d == %d ?&quot;, *(ptr+2), *(idade+2));//lê 3º valor do array *(ptr+2) = 0; //altera valor do 3º elemento do array NSLog(@&quot;%d == %d ?&quot;, *(ptr+2), *(idade+2));//lê 3º valor do arr ay      
  • 67.
    Programação em ObjC:Apontadores e Arrays Array de char       char a[] = &quot;hello&quot;; char *p = &quot;world&quot;;
  • 68.
    Programação em Javae ObjC: Exercício 6 Implemente um programa em ObjC que: guarde num array de valores inteiros 5 idades (e.g.,  {23, 47, 11, 92, 76} ) dada uma determinada idade, calcule as respectivas diferenças com as idade armazenadas no array criado no ponto anterior as diferenças de idade deverão ser sempre positivas! guarde as diferenças de idades num vector de inteiros, e imprima-as.   Usando apontadores em todos os acessos aos arrays!
  • 69.
    Programação em Javae ObjC: Exercício 6 ObjC          int idade[] = {23, 47, 11, 92, 76}; int arraySize = 5; int dif[arraySize]; int age = 14; int *idadePtr = idade; int *difPtr = dif; for(int i=0; i<arraySize; i++) { if(age > *(idadePtr+i))      *(difPtr+i) = age - *(idadePtr+i); else      *(difPtr+i) = *(idadePtr+i) - age; NSLog(@&quot;%d&quot;, *(difPtr+i)); }
  • 70.
    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 &quot;chamar&quot; e executar esse bloco de código Programação em Java e ObjC: Funções * 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.
  • 71.
    Programação em Javae ObjC: Funções Exemplo (Java):  public static void main(String args[])  {      System.out.println(&quot;Executa o programa&quot;);      fazTarefaEspecifica1(); //chamada a uma função!      fazTarefaEspecifica2(); //chamada a outra função! } void fazTarefaEspecifica_1() {      System.out.println(&quot;Esta função executa uma série de operações para completar a tarefa 1&quot;); } void fazTarefaEspecifica_2() {      System.out.println(&quot;Esta função executa uma série de operações para completar a tarefa 2&quot;); }
  • 72.
    Sintaxe para definira função      void nomeFunção()           {             //código da função...         } void  é um tipo especial que significa &quot;vazio&quot;, &quot;sem tipo&quot; 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(); Programação em Java e ObjC: Funções
  • 73.
    Programação em Javae ObjC: 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);
  • 74.
    Programação em Javae ObjC: Funções com Parâmetros Exemplo (Java) public static void main(String args[])  {      soma(1, 2); // escreve &quot;3&quot;      soma(3, 5); // escreve &quot;8&quot; } void soma(int num1, int num2)  {      int resultado;      resultado = num1 + num2;      System.out.println(resultado); }
  • 75.
    Programação em Javae ObjC: 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
  • 76.
    Programação em Javae ObjC: Funções com valor de retorno Exemplo (Java) public static void main(String args[]) {      int num1;      int num2;      int r;      num1 = 1;      num2 = 2;      r = soma(1, 2);       System.out.println(String.format(&quot;%d&quot;, r)); } int soma(int num1, int num2) {      int resultado;      resultado = num1 + num2;      return resultado;        }
  • 77.
    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 Programação em Java e ObjC: Funções com valor de retorno
  • 78.
    Programação em Javae ObjC: Exercício 7 Implemente um programa em Java/ObjC que: Permita calcular operações (+, -, /, *) sobre fracções (numerador/denominador) O programa deve ser estruturado em funções Uma função que recebe duas fracções (numerador1, denominador1, numerador2 e denominador2) e a operação a efectuar, e consoante a operação invoca outra função específica para a operação e retorna o resultado 
  • 79.
    Programação em Javae ObjC: Exercício 7 Java (1/3) public static void main(String[] args) {      int num1 = 1;      int denom1 = 2;      int num2 = 2;      int denom2 = 3;      char op = '*';      operacao(num1, denom1, num2, denom2, op); }
  • 80.
    Programação em Javae ObjC: Exercício 7 Java (2/3) static void operacao(int n1, int d1, int n2, int d2, char op) { int result[] = new int[2]; switch(op) { case '+': result = soma(n1, d1, n2, d2); break; case '-': result = subtraccao(n1, d1, n2, d2); break; case '*': result = multiplicacao(n1, d1, n2, d2); break; case '/': result = divisao(n1, d1, n2, d2); break; default: System.out.println(String.format(&quot;Operação não reconhecida&quot;)); } System.out.println(String.format(&quot;O resultado de %d/%d %c %d/%d é: %d/%d&quot;, n1, d1, op, n2, d2, result[0], result[1])); }
  • 81.
    Programação em Javae ObjC: Exercício 7 Java (3/3) static int[] soma(int n1, int d1, int n2, int d2) {                 // result[0] guarda o numerador;                 // result[1] guarda o denominador int result[] = new int[2];  int resultNum, resultDenom; resultNum = n1*d2 + d1*n2; resultDenom = d1 * d2; result[0] = resultNum; result[1] = resultDenom; return result; }
  • 82.
    Programação em Javae Obj-C: 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
  • 83.
    Programação em Javae Obj-C: 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)
  • 84.
    Fim Cursos deVerão na Católica 2010 http://porto.ucp.pt/cvc/ Jorge C. S. Cardoso, Luís Gustavo Martins jorgecardoso@ieee.org, lmartins@porto.ucp.pt http://slideshare.net/jorgecardoso (tag: cvc2010)