comandos e expressões

43

Upload: sergio-souza-costa

Post on 23-Jun-2015

468 views

Category:

Technology


1 download

TRANSCRIPT

Page 2: Comandos e expressões

Sobre mim

Sérgio Souza CostaProfessor - UFMADoutor em Computação Aplicada (INPE)

[email protected]

https://sites.google.com/site/profsergiocosta/home

https://twitter.com/profsergiocosta

http://gplus.to/sergiosouzacosta

http://www.slideshare.net/skosta/presentations?order=popular

Page 3: Comandos e expressões

Comandos

Comando (ou statement) é uma construção que ira ser executada para atualizar variáveis.

São característicos de linguagens imperativas.

Tipos de comandos:○ skips○ atribuições○ chamadas de procedimentos○ comandos sequenciais○ comandos de seleção○ comandos iterativos

Page 4: Comandos e expressões

Skips

● U skip é um comando com nenhum efeito.● Exemplo:

○ “;” in C and Java○ “null;” in Ada.

● Skips podem ser usados em com comandos condicionais.

Page 5: Comandos e expressões

Atribuições

● Uma atribuição armazena um valor em uma variavel.● Atribuição simples:

■ “V = E;” em C e Java■ “V := E;” em Ada

– o valor da expressão E é armazenada em variavel V.

● Atribuição múltipla:○ “V1 = ... = Vn = E;” em C e Java

– o valor de E é armazenada em cada de V1,..., Vn.

● Atribuição combinada com operador binario:○ “V (x)= E;” em C e Java significa o mesmo como “V = V (x) E;”.

Page 6: Comandos e expressões

Exemplo Lua - Atribuições

Lua ainda permite atribuir dois valores distintos a variáveis distintas. Trocar dois valores é tão simples assim:

a= 10b = 5a, b = b, a

Page 7: Comandos e expressões

Chamadas de procedimento

● Uma chamada de procedimento alcança seus efeitos pela aplicação de um procedimento a alguns argumentos.

● Forma: P(E1,..., En);

Aqui P determina procedimento ser aplicada, e E1, ... , En são avaliados para determinar os argumentos. Cada argumento pode ser ou um valor ou uma referencia para a variável.

Page 8: Comandos e expressões

Comandos sequencias

Comando sequenciais, condicionais e iterativos (encontrados em todas linguagens imperativas) permite compor comandos alcançando controle de fluxo.

Comando sequencia especifica que dois (ou mais) comandos são executado em sequencia:

C1C2

Page 9: Comandos e expressões

Comandos condicionais

● Um comando condicional escolhe um dos subcomandos para ser executado dependendo da condição.

● Um comando if escolhe entre dos subcomando usando uma condição booleana.

● Um comando case escolhe entre vários subcomandos.

Page 10: Comandos e expressões

Comando ifForma (Ada e C/Java, respectivamente): if E then if (E) C1 C1else else C2 C2end if; – se E é verdadeiro C1 é executado; caso contrario C2 é executado

Abreviação (Ada):if E then if E then C1 C1end if; else null; end if;

E deve ser um boolean

Page 11: Comandos e expressões

Comando ifGeneralizando multiplas condições (em Ada):

if E1 then C1elsif E2 then C2…elsif En then Cnelse C0end if;

Page 12: Comandos e expressões

Comando case

● Em C e Java: switch (E) { case v1: C1 … case vn: Cn default: C0}

Page 13: Comandos e expressões

Ada: exemplo

today: Date; ...case today.m is when jan => put("JAN"); when feb => put("FEB"); ...

when nov => put("NOV"); when dec => put("DEC");end case;

Page 14: Comandos e expressões

Java - C : Exemplo

Date today;...

switch (today.m) { case 1: System.out.print("JAN"); break; case 2: System.out.print("FEB"); break; ...

case 11: System.out.print("NOV"); break; case 12: System.out.print("DEC");}

Page 15: Comandos e expressões

Comandos iterativos

● Um comando iterativo (ou laço) executa repetidamente um subcomando que é o corpo do laço.

● Cada execução do corpo do laço é chamado de iteração.● Os comandos iterativos podem ser:

○ Indefinidos: o número de iterações não é predeterminada.○ Definido: o número de iterações é predeterminada.

Page 16: Comandos e expressões

Comandos iterativos

● Indefinido é comumente suportado pelo comando while● Forma (Ada e C/Java):

while E loop while (E)C Cend loop;

● Interação definida (estilo C):for (C1; E; C2) C1 C3 while (E) { C3 C2 }

Page 17: Comandos e expressões

Comandos iterativos: mais formas

Lua:

t = {1,2,3}for i, v in pairs (t) do print (i, v)do

JavaScript:

a = [1,2,3]for (x in a){ ..}

Python:

a = ['cat', 'window', 'defenestrate']for x in a: print x, len(x)

Page 18: Comandos e expressões

Comandos iterativos: mais formas

Podemos ainda usar funções de alta ordem (funções que recebem outras funções como parametros)

Lua:

tabela = {4,7,8,12,55}table.foreach (tabela, function (i, v) print (i, v) end)

Page 19: Comandos e expressões

Efeitos colaterais

Está ligado ao indeterminismo, por exemplo

int a = 10;int f (int x) { a = a + 1; return a + x;}

f (5) leva a 16f (5) leva a 17

Page 20: Comandos e expressões

Expressões com efeitos colaterais

● O proposito principal de avaliar uma expressão é o retorno de um valor.

● Em muitos casos em linguagens imperativas, a avaliação de uma expressão pode atualizar valor de variáveis – efeitos colaterais.

● In C e Java, atribuições são na verdade expressões com efeitos colaterais: “V = E” armazena o valor de E em V. Similarmente “V (X) = E”.

Page 21: Comandos e expressões

Efeitos colaterais: Exemplo C

● A funcão C getchar(f) lê um character e atualiza a variavel file que f aponta.

● O seguinte código é correto e conciso: char ch;while ((ch = getchar(f)) != NUL)putchar(ch);

● O seguinte codigo é incorreto (Por que?): enum Gender {female, male};Gender g;if (getchar(f) == 'F') g = female;else if (getchar(f) == 'M') g = male;else ..

Page 22: Comandos e expressões

Efeitos colaterais e funcionais

Funções em linguagens funcionais não podem ter efeitos colaterais.

Esse sempre foi o grande desafio para as linguagens funcionais, como tratar entradas e saídas ?

LF consiste num conjunto de funções, sem efeitos colaterais

O objetivo de executar qualqer programa é ter algum efeito colateraltensão

Page 23: Comandos e expressões

Efeitos colaterais e funcionais

Funções em linguagens funcionais não podem ter efeitos colaterais.

Esse sempre foi o grande desafio para as linguagens funcionais, como tratar entradas e saídas ?

LF consiste num conjunto de funções, sem efeitos colaterais

O objetivo de executar qualqer programa é ter algum efeito colateraltensão

Haskell usou o conceito de monadas IO, que permite separar comando com efeitos de funções puras.

Page 24: Comandos e expressões

Expressões

● Uma expressão é uma construção que pode ser avaliada para um dado valor

● Formas de expressão:○ literals (trivial)○ constant/variable accesses (trivial)○ construções○ chamada de funções○ expressões condicionais○ expressões iterativas

Page 25: Comandos e expressões

Construtores

● Construtor é uma expressão que constrõe um valor composto a partir dos seus componentes

● Em C, os valores componentes são restrito a literais.

{jan, 1}

● Ada, Java, e Haskell, os valores componentes são avaliadas como subexpressões:

tomorrow: Date := (today.m, today.d + 1);

Page 26: Comandos e expressões

Construtores - Ada

● Registros: type Date is record m: Month;

d: Day_Number;

end record;today: Date := (Dec, 25);

tomorrow: Date := (today.m, today.d+1);

● Arranjo: leap: Integer range 0 .. 1;…

month_length: array (Month) of Integer :=(31, 28+leap, 31, 30, 31, 30,

31, 31, 30, 31, 30, 31)

Page 27: Comandos e expressões

Construtores - Haskell

● Tupla today = (Dec, 25)(m, d) = todaytomorrow = (m, d+1)

● Lista: monthLengths =[31, if isLeap y then 29 else 28,31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

Page 28: Comandos e expressões

Construtores - Java

● Classes: class Date { public int m, d; public Date (int m, int d) { this.m = m; this.d = d;} … }

● Objeto: Date today = new Date(12, 25);Date tomorrow =new Date(today.m, today.d+1)

Page 29: Comandos e expressões

Chamada de funções

● Calcula um resultado aplicando uma função a seus argumentos.● Se uma função tem um único argumento, então uma chamada é

tipicamente na forma○ “F(E)”, ○ ou apenas “F E”,

● Onde F determina a função ser aplicada, e a expressão E é avaliada para um determinada argumento.

Page 30: Comandos e expressões

Chamada de funções, operadores

ϴ

ϴ ϴϴ

ϴ ϴ

Page 31: Comandos e expressões

Chamada de funções, operadores

Page 32: Comandos e expressões

Ordem de Avaliação

Page 33: Comandos e expressões

Ordem de Avaliação - Precedência

Nas linguagens , a ordem de precedência normalmente é a mesma (baseada na matemática)

Ruby C Ada

Mais alta ** ++ e -- posfixados

**, abs

+ e – unários ++ e – préfixados, + e – unários

*, /, mod, rem

*, / e % *, / e %

Mais baixa + e – binários + e – binários

Page 34: Comandos e expressões

○○

Page 35: Comandos e expressões

Operadores - Haskell

Page 36: Comandos e expressões

Page 37: Comandos e expressões

Page 38: Comandos e expressões

Page 39: Comandos e expressões

●●●

Page 40: Comandos e expressões

Expressões condicionais

● Java if-expression: x>y ? x : y

● Comparando expressões e comandos

int max1 (int x, int y) { return (x>y ? x : y);} int max2 (int x, int y) { if (x>y) return x; else return y;}

Page 41: Comandos e expressões

Expressões condicionais

Haskell case-expression:

case m offeb -> if isLeap y then 29 else 28apr -> 30jun -> 30sep -> 30nov -> 30_ -> 31

if x>y then x else y

Haskell if-expression:

Page 42: Comandos e expressões

Haskell: Expressão if

Page 43: Comandos e expressões

Guards - Haskell

Haskell ainda tem outros elementos como guards e casamento de padrões.

menor x y |if x <= y = x | otherwise = y