introdução à programação em android e ios - conceitos fundamentais de programação

83
Conceitos Fundamentais de Programação Jorge C. S. Cardoso, Luís Gustavo Martins [email protected], [email protected] Cursos de Verão na Católica 2011

Upload: luis-gustavo-martins

Post on 18-Dec-2014

9.968 views

Category:

Technology


2 download

DESCRIPTION

Slides usados na edição de 2011 do Curso de Verão da UCP (http://www2.porto.ucp.pt/cvc/?details=124)

TRANSCRIPT

Page 1: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

Conceitos Fundamentais de Programação

Jorge C. S. Cardoso, Luís Gustavo [email protected], [email protected]

Cursos de Verão na Católica 2011

Page 2: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 3: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

Introdução aos princípios de programaçãoConteú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

Page 4: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 5: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

.datamessage db "Hello world, I'm learning Assembly !!!", "$"

.code

main procmov ax,seg messagemov ds,ax

mov ah,09lea dx,messageint 21h

mov ax,4c00hint 21hmain endpend main

Page 6: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 7: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 8: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 9: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 10: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 11: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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)

Page 12: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

● Texto que o programador escreve numa determinada linguagem de programação (e.g., ObjC, Java, ...)

Linguagens de Programação: Código Fonte

int addTwoNumbers( int num1, int num2 ){ //This adds two numbers return num1 + num2;

/* Some other comment just to show how to do it for multiple lines. */}

Page 13: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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 procmov ax,seg messagemov ds,ax

mov ah,09lea dx,messageint 21h

mov ax,4c00hint 21hmain endpend main

Page 14: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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)

Page 15: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 16: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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)

Page 17: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 18: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

Hello World em ObjC1. 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

Page 19: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

Hello World em ObjC7. Verificar resultado na Debugger Console do XCode

Page 20: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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"

Page 21: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 22: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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 = 6result = someNumber * anotherNumber;

Page 23: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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.htmlhttp://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 ObjCBOOL isActive = true;

//for JAVAboolean isActive = true;

char aLetter = 'P';

Page 24: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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ávelidade = idadeJoao; // idadeJoao é outra variável–Função : O valor devolvido por uma função definida previamenteidade = 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

Page 25: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Programação em Java e ObjC:Variáveis

Page 26: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 27: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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 22. realize a divisão entre as variáveis (i.e. 5 / 2)3. guarde o resultado numa variável4. 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...

Page 28: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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/NSLoghttp://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html

Page 29: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

Programação em Java e ObjC:Exercício 1

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

Page 30: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 31: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 32: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

//JAVAboolean isActive = true;

//ObjCBOOL isActive = true;

if(isActive) //eqv. a if (isActive == true){ //do something... isActive = false;}

Page 33: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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 JAVABOOL correct = false;

if(9 == aNumber) correct = true;

if (anotherNumber > aNumber) aNumber = anotherNumber;

Page 34: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

Programação em Java e ObjC:Condições if

Algumas variantes da estrutura if:

● If... Else... ● If... Else if... ● If... Else if... Else...● Switch

Page 35: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 36: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 37: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 38: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 39: Introdução à programação em Android e iOS - Conceitos fundamentais de programaçã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”);

}

Page 40: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 41: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 42: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

Programação em Java e ObjC:Exercício 2

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

Page 43: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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!

Page 44: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

Programação em Java e ObjC:Exercício 3● ObjC

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

Page 45: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 46: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 47: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 48: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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;

}

Page 49: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 50: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 51: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 52: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 53: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 54: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 55: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 56: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 57: Introdução à programação em Android e iOS - Conceitos fundamentais de programaçã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.

Programação em Java e ObjC:Arrays - Declaração e Inicialização

Java

<tipo> meuArray[];

meuArray = new <tipo>[tamanho];

Exemplo

int idades[];

idades = new int[5];

ObjC

<tipo> meuArray[tamanho];

Exemplo:

int idades[5];

Page 58: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

● 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

Page 59: Introdução à programação em Android e iOS - Conceitos fundamentais de programaçã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, ...

Page 60: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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 arrayfor (int i=0; i < arraySize; i++){ //apenas um exemplo... idade[i] = (i+1)*(i+1); }

//imprime idades inferiores a 20for(int i=0; i < arraySize; i++){ if (idade[i] < 20) NSLog(@"%d", idade[i]);}

Page 61: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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.

Page 62: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 63: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 64: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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); //23NSLog(@"Memory address of aNumber is: %qX", aNumberPtr);//B745CD81NSLog(@"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

Page 65: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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 arrayNSLog(@"%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

Page 66: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

Programação em ObjC:Apontadores e Arrays

● Array de char

char a[] = "hello";

char *p = "world";

Page 67: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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!

Page 68: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 69: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

● 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

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.

Page 70: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 71: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Programação em Java e ObjC:Funções

Page 72: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 73: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 74: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 75: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 76: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

● 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

Page 77: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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)

Page 78: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

Programação em Java e ObjC:Exercício 7Java (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);}

Page 79: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

Programação em Java e ObjC:Exercício 7Java (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("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]));}

Page 80: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

Programação em Java e ObjC:Exercício 7Java (3/3)

static int[] soma(int n1, int d1, int n2, int d2) {

// result[0] guarda o numerador; // result[1] guarda o denominadorint result[] = new int[2];

int resultNum, resultDenom;

resultNum = n1*d2 + d1*n2;resultDenom = d1 * d2;result[0] = resultNum;result[1] = resultDenom;return result;}

Page 81: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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

Page 82: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

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)

Page 83: Introdução à programação em Android e iOS - Conceitos fundamentais de programação

Fim

Cursos de Verão na Católica 2011http://porto.ucp.pt/cvc/

Jorge C. S. Cardoso, Luís Gustavo [email protected], [email protected]

http://slideshare.net/jorgecardoso (tag: cvc2011)