Este documento apresenta um resumo de três frases ou menos:
O documento apresenta um curso introdutório de programação que inclui módulos sobre conceitos fundamentais de programação, programação orientada a objetos e programação para Android e iPhone. É destacado que o curso não requer conhecimentos prévios de programação.
A Computational Framework for Sound Segregation in Music Signals using Marsyas
Introdução à programação em Android e iOS - Conceitos fundamentais de programação
1. Conceitos Fundamentais de
Programação
Cursos de Verão na Católica 2011
Jorge C. S. Cardoso, Luís Gustavo Martins
jorgecardoso@ieee.org, lmartins@porto.ucp.pt
2. 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
3. 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
4. O Que é Programar?
● Indicar um conjunto de instruções para serem
executadas, seguindo uma determinada ordem, por uma
máquina
● Semelhante ao que fazemos quando queremos dar
instruções a uma pessoa
○ Instruções para aceder a uma pasta de rede
■ Ligar o computador
■ Esperar que o S.O. arranque
■ Aceder ao Go do Finder
■ Escolher a opção Connect to Server
■ Escrever o nome do servidor
■ Clicar “Connect”
■ Esperar pela janela de login
■ Inserir login e password
5. Linguagens de Programação
.model small
.stack
● Um programa é uma sequência de .data
message db "Hello world, I'm learning Assembly
números !!!", "$"
○ Interpretados como instruções pelo
processador (CPU) .code
main proc
● Os primeiros “programadores” de mov ax,seg message
computador escreviam programas em mov ds,ax
números mov ah,09
○ muito sujeito a erros... lea dx,message
○ muito trabalhoso... int 21h
mov ax,4c00h
● Criou-se uma linguagem mais fácil de int 21h
decorar e utilizar, baseada em main endp
end main
mnemónicas
○ Assembly Language
6. Linguagens de Programação
● O programa pode ser descrito usando
vários tipos de linguagens:
○ Natural (e.g., Inglês)
■ "tell Finder to open myDocument.doc"
○ 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;
}
7. 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
8. 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
9. 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
10. 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
11. 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)
12. 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. */
}
13. Linguagens de Programação:
Código Máquina .code
main proc
● Instruções executadas directamente pelo mov ax,seg message
processador mov ds,ax
mov ah,09
● O código máquina resulta de um lea dx,message
int 21h
processo de tradução do código fonte
mov ax,4c00h
numa linguagem entendida directamente int 21h
pelo processador (sequência de main endp
end main
números)
14. 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 "código
objecto"
● 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)
15. 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
"bytecode"
● Em Java não existe necessidade de "linkagem"
○ 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
16. 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)
17. 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("Hello world"); //write your code here!
}
ObjC(myProgram.m)
int main( int argc, const char *argv[] )
{
NSAutoreasePool * pool = [[NSAutoReleasePool alloc] init];
NSLog(@"hello world"); //write your code here!!
[pool drain];
return 0;
}
18. Hello World em ObjC
1. Abrir o XCode
2. File -> New Project...
3. Seleccionar:
○ Mac OS X no menu esquerdo
○ Command Line Tool no menu superior direito
○ Choose...
4. Dar um nome ao projecto (e.g. HelloWorld)
5. Seleccionar o ficheiro HelloWorld.m
○ Implementa a função main
○ Rever código em ObjC
6. Compilar e "Linkar" (i.e., Build) e executar
○ Seleccionar Build and Run no menu superior
do XCode
19. Hello World em ObjC
7. Verificar resultado na Debugger Console do XCode
20. Hello World em Java
● Abrir Eclipse
● File -> New -> Java Project
● Preencher o campo "Project Name" com
HelloWorld e clicar "Finish"
● File -> New -> Class
● Preencher o campo "Name" com HelloWord e
marcar a opção "public static void main...."
● Substituir a linha:
○ // TODO Auto-generated method stub
● com a instrução
○ System.out.println("Hello world");
● Executar o programa: Run -> Run
● Ver o resultado na "Console"
21. 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
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 Em Mac:
for multiple lines. */ ● { } – Chavetas (Curly braces): [Shift][Alt] + ( ou )
○ //- Comentário de uma linha ● [ ] – Parentesis Rectos: [Alt] + ( ou )
○ /* */ Comentário de várias linhas
return-result;
○} ; - ponto e vírgula (semicolon); acaba quase todas as linhas de código
○ , - vírgula (comma), separa parâmetros de funções
22. 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 utilizamos para nos referirmos a um valor
○ Podemos alterar o valor durante o programa
○ Sempre que o nome é utilizado no programa é automaticamente
substituído pelo valor correspondente
int someNumber;
int anotherNumber;
int result;
someNumber = 3;
anotherNumber = 2;
//result stores the value 3 * 2 = 6
result = someNumber * anotherNumber;
23. 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) int myNumber;
long anotherNumber = 13;
■ Decimais (float, double)
■ Lógicos (boolean, BOOL) float aFloatNumber = 0.24;
double aDoublePrecisionNumber = 1.23e2;
■ Caracteres (char)
//for ObjC
<tipo> nomeDaVariavel; BOOL isActive = true;
<tipo> nomeDaVariavel = <valorinicial>;
//for JAVA
boolean isActive = true;
char aLetter = 'P';
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
24. Programação em Java e ObjC:
Variáveis
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;
25. Programação em Java e ObjC:
Variáveis
● Algumas restrições no uso de nomes em variáveis:
1. Nomes das variáveis devem começar com uma letra do alfabeto (dígitos não são
permitidos) ou por um underscore (_)
2. Nomes de variáveis podem conter letras e dígitos, mas espaços ou outros
caracteres especiais não são permitidos.
3. Os nomes de variáveis são case sensitive (e.g. myNumber é diferente de
mynumber)
4. Palavras reservadas do ObjC ou do Java não podem ser usadas como nomes
de variáveis (e.g. int, float, for, while, do, break, ...)
5. Os nomes das variáveis devem ser escolhidos de forma a tornar o seu
significado o mais claro e legível possível.
6. 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)
26. 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
27. Programação em Java e ObjC:
Exercício 1
● Crie um programa em Java e ObjC que:
1. Armazene em duas variáveis os valores 5 e 2
2. realize a divisão entre as variáveis (i.e. 5 / 2)
3. guarde o resultado numa variável
4. 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...
28. 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(@"%d divided by %d is equal to %f", 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
29. 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("%d divided by %d is equal to %f",
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...)
30. 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...
31. 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]
}
32. 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;
}
33. Programação em Java e ObjC:
Condições if
● As condições usadas nos testes podem usar os operadores
condicionais: int aNumber = 10;
int anotherNumber = 6;
○ igual a: == (atenção!)
○ maior do que: > //replace with boolean if in JAVA
BOOL correct = false;
○ menor do que: <
if(9 == aNumber)
○ maior ou igual a: >= correct = true;
○ menor ou igual a: <=
if (anotherNumber > aNumber)
○ diferente: != aNumber = anotherNumber;
● 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)
34. Programação em Java e ObjC:
Condições if
Algumas variantes da estrutura if:
● If... Else...
● If... Else if...
● If... Else if... Else...
● Switch
35. 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...
}
36. Programação em Java e ObjC:
Condições if... else... if
● É possível combinar ifs
sequencialmente
if (<condição A>) {
<acções A>
} else if (<condição B>){
<acções B>
} else {
<acções C>
}
37. 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>
}
38. 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
39. 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”);
}
40. Programação em Java e ObjC:
Exercício 2
● Implemente em Java e ObjC um programa que:
1. Defina 3 variáveis para armazenar três inteiros à escolha (num1,
num2 e num3)
2. Teste se num1 é igual, maior ou menor que num2, e imprima uma
mensagem do tipo "7 é maior do que 3".
3. No caso de num1 ser menor que num2, verifique se num3 está
dentro do intervalo [num1, num2], e em caso afirmativo imprima uma
mensagem do tipo "7 está entre 2 e 15".
4. 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:
■ Se operandos inteiros: provocam o "crash" da aplicação!
■ Se operandos com vírgula flutuante: resulta em Infinity
41. Programação em Java e ObjC:
Exercício 2
● ObjC int num1 = 5;
int num2 = 12;
int num3 = 7;
if(num1 == num2){
NSLog(@"%d is equal to %d", num1, num2);
}
else if(num1 > num2){
NSLog(@"%d is bigger than %d", num1, num2);
}
else {
NSLog(@"%d is smaller than %d", num1, num2);
if (num3 > num1 && num3 < num2) {
NSLog(@"%d is between %d and %d", num3, num1, num2);
}
}
if(num2 != 0){
NSLog(@"A divisão de %d por %d é %f", num1, num2, (float)num1/num2);
}
42. 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("%d is equal to %d", num1, num2));
} else if(num1 > num2){
System.out.println(String.format("%d is bigger than %d", num1, num2));
} else {
System.out.println(String.format("%d is smaller than %d", num1, num2));
if (num3 > num1 && num3 < num2) {
System.out.println(String.format("%d is between %d and %d", num3, num1, num2));
}
}
if(num2 != 0){
System.out.println(String.format("A divisão de %d por %d é %f", num1, num2, (float)num1/num2));
}
43. Programação em Java e ObjC:
Exercício 3
● Implemente em Java e ObjC um programa que:
1. Defina 2 variáveis para armazenar dois inteiros à escolha (num1,
num2),
2. Defina uma variável para armazenar um caractere, correspondente
às 4 operações aritméticas ('+', '-', '*', '/')
3. 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.
4. No caso de o caractere não ser uma operação reconhecida, deverá
imprimir uma mensagem de erro.
5. Não permita divisões por zero!
44. Programação em Java e ObjC:
● ObjC Exercício 3
int num1 = 5;
int num2 = 2;
char op = '/';
if(num2 == 0 && op == '/'){
NSLog(@"second operator is zero valued --> impossible to perform division");
return -1;
}
switch (op) {
case '+':
NSLog(@"%d + %d = %d", num1, num2, num1+num2);
break;
case '-':
NSLog(@"%d - %d = %d", num1, num2, num1-num2);
break;
case '*':
NSLog(@"%d * %d = %d", num1, num2, num1*num2);
break;
case '/':
NSLog(@"%d / %d = %f", num1, num2, num1/(float)num2);
break;
default:
NSLog(@"Operation not recognized...");
break;
}
45. Programação em Java e ObjC:
● Java Exercício 3
int num1 = 5;
int num2 = 0;
char op = '/';
if(num2 == 0 && op == '/'){
System.out.println(String.format("second operator is zero valued --> impossible to perform division"));
return;
}
switch (op) {
case '+':
System.out.println(String.format("%d + %d = %d", num1, num2, num1+num2));
break;
case '-':
System.out.println(String.format("%d - %d = %d", num1, num2, num1-num2));
break;
case '*':
System.out.println(String.format("%d * %d = %d", num1, num2, num1*num2));
break;
case '/':
System.out.println(String.format("%d / %d = %f", num1, num2, num1/(float)num2));
break;
default:
System.out.println(String.format("Operation not recognized..."));
break;
}
46. 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
47. 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(@"Counting... %d", 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 ++)
48. 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(@"Counting... %d", i);//ObjC
i = i + 1;
}
49. 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(@"Counting... %d",i);
i = i + 1;
} while (i <= 10);
50. 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
51. 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.
52. 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(@"Printing the first %d Fibonacci numbers...", numFibonacciNumbers);
NSLog(@"0 --> %d", valN_2); //F(0)
NSLog(@"1 --> %d", 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(@"%d --> %qu", n, valN);
//update stored values...
valN_2 = valN_1;
valN_1 = valN;
}
53. 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("%d --> %d", n, valN));
valN = valN + valN_1;
valN_1 = valN - valN_1;
}
54. 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(@"Printing the Fibonacci numbers < %d", maxFibonacciNumber); if(maxFibonacciNumber >= 0) NSLog(@">> %d", valN_2); //F(0)
if (maxFibonacciNumber >= 1) NSLog(@">> %d", valN_1); //F(1) valN = valN_1 + valN_2; //F(2) = F(1) + F(0) while (valN <=
maxFibonacciNumber) { NSLog(@">> %qu", valN); //update stored values... valN_2 = valN_1; valN_1 = valN; valN = valN_1 + valN_2; //F
(n) = F(n-1) + F(n-2)
}
55. 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(">> %d", valN));
valN = valN + valN_1;
valN_1 = valN - valN_1;
}
56. 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
57. Programação em Java e ObjC:
Arrays - Declaração e Inicialização
● Tal como qualquer outra variável, é necessário indicar qual o tipo de
valores que o array irá guardar.
● É necessário também definir qual o tamanho do array, antes de o utilizar.
Java ObjC
<tipo> meuArray[]; <tipo> meuArray[tamanho];
meuArray = new <tipo>[tamanho]; Exemplo:
Exemplo int idades[5];
int idades[];
idades = new int[5];
58. Programação em Java e ObjC:
Arrays - Declaração e Inicialização
● Declarar e inicializar num só passo
int idade[] = {23, 47, 11, 92, 76};
59. 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, ...
60. Programação em Java e ObjC:
Arrays
● Percorrer os dados de um array int arraySize = 5;
○ Para leitura
//escreve dados no array
○ Para escrita for (int i=0; i < arraySize; i++)
{
//apenas um exemplo...
○ O índice não deve ultrapassar o idade[i] = (i+1)*(i+1);
tamanho do array! }
int age = idade[5] // ERROR!! //imprime idades inferiores a 20
for(int i=0; i < arraySize; i++)
{
if (idade[i] < 20)
NSLog(@"%d", idade[i]);
}
61. 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.
62. 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(@"%d", dif[i]);
}
63. 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("%d", dif[i]));
}
64. 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(@"Value of aNumber is: %d", aNumber); //23
NSLog(@"Memory address of aNumber is: %qX", aNumberPtr);//B745CD81
NSLog(@"Value pointed by aNumberPtr is: %d", *aNumberPtr); //23
//change value pointed by aNumberPtr (i.e. aNumber var)
*aNumberPtr = 1234;
NSLog(@"Value pointed by aNumberPtr is now: %d", *aNumberPtr); //1234NSLog(@"Value of aNumber is now also: %
d", aNumber); //1234
65. Programação em ObjC:
Apontadores e Arrays
● Um apontador pode ser usado, de forma conveniente, para
aceder a um array, ou até para "simular" 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(@"%qX == %qX ?", ptr, idade);
NSLog(@"%d == %d ?", *ptr, idade[0]); //obtém o 1º valor do array
NSLog(@"%d == %d ?", *(ptr+3), idade[3]);//lê 4º valor do array
NSLog(@"%d == %d ?", *(ptr+2), *(idade+2));//lê 3º valor do array
*(ptr+2) = 0; //altera valor do 3º elemento do array
NSLog(@"%d == %d ?", *(ptr+2), *(idade+2));//lê 3º valor do array
66. Programação em ObjC:
Apontadores e Arrays
● Array de char
char a[] = "hello";
char *p = "world";
67. 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!
68. 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(@"%d", *(difPtr+i));
}
69. Programação em Java e ObjC:
Funções
● Uma função* é uma porção de código que efectua uma
tarefa específica.
● A divisão de um programa em várias funções permite criar
programas mais estruturados, fáceis de manter e permite
também a reutilização de código
● Na sua forma mais simples, uma função é um bloco de código
com um nome que podemos usar em qualquer parte do
programa para "chamar" e executar esse bloco de código
* Existem muitas designações para o conceito de função: procedimento, rotina, subrotina,
método, subprograma. Todos eles significam a mesma coisa, mas são usados em
diferentes contextos.
70. Programação em Java e ObjC:
Funções
Exemplo (Java):
public static void main(String args[])
{
System.out.println("Executa o programa");
fazTarefaEspecifica1(); //chamada a uma função!
fazTarefaEspecifica2(); //chamada a outra função!
fazTarefaEspecifica1(); //chama outra vez a função 1!
}
void fazTarefaEspecifica_1() {
System.out.println("Esta função executa uma série de operações para completar a tarefa 1");
}
void fazTarefaEspecifica_2() {
System.out.println("Esta função executa uma série de operações para completar a tarefa 2");
}
71. Programação em Java e ObjC:
Funções
● Sintaxe para definir a função
● void nomeFunção()
{
//código da função...
}
○ void é um tipo especial que significa "vazio", "sem tipo" e neste caso indica
que a função não retorna qualquer valor (ver próximos slides)
● Para invocar (i.e., executar o código dentro da função)
nomeFunção();
72. 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);
73. Programação em Java e ObjC:
Funções com Parâmetros
Exemplo (Java)
public static void main(String args[])
{
soma(1, 2); // escreve "3"
soma(3, 5); // escreve "8"
}
void soma(int num1, int num2)
{
int resultado;
resultado = num1 + num2;
System.out.println(resultado);
}
74. 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
75. 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(num1, num2);
System.out.println(String.format("%d", r));
}
int soma(int num1, int num2) {
int resultado;
resultado = num1 + num2;
return resultado;
}
76. Programação em Java e ObjC:
Funções com valor de retorno
● Sintaxe para definir funções com valor de retorno
<tipo> nomeFunção(<tipo> nomeParam1, <tipo> nomeParam2, [...])
{
//código da função...
return valorDeRetorno;
}
● Para invocar (i.e., executar o código dentro da função)
variavel = nomeFunção(valorParam1, valorParam2);
// Não é necessário atribuir o resultado a uma variável, pode ser usado directamente numa
expressão ou usado como parâmetro para outra função
77. 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)
○ A operação deve ser implementada numa fracção
■ Começar com a soma (+) apenas
■ A função deverá receber os 4 parâmetros que definem as
duas fracções (num1, denom1, num2, denom2) e a
operação
■ A função deve devolver o resultado como uma fracção
também (num, denom)
78. Programação em Java e ObjC:
Java (1/3)
Exercício 7
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);
}
79. Programação em Java e ObjC:
Java (2/3) Exercício 7
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("Operação não reconhecida"));
}
System.out.println(String.format("O resultado de %d/%d %c %d/%d é: %d/%d", n1, d1, op, n2, d2, result[0], result
[1]));
}
80. Programação em Java e ObjC:
Java (3/3) Exercício 7
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;
}
81. 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
82. 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)
83. Fim
Cursos de Verão na Católica 2011
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: cvc2011)