Comandos e expressões
-
Upload
sergio-souza-costa -
Category
Technology
-
view
468 -
download
1
Transcript of Comandos e expressões
Sobre mim
Sérgio Souza CostaProfessor - UFMADoutor em Computação Aplicada (INPE)
https://sites.google.com/site/profsergiocosta/home
https://twitter.com/profsergiocosta
http://gplus.to/sergiosouzacosta
http://www.slideshare.net/skosta/presentations?order=popular
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
Skips
● U skip é um comando com nenhum efeito.● Exemplo:
○ “;” in C and Java○ “null;” in Ada.
● Skips podem ser usados em com comandos condicionais.
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;”.
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
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.
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
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.
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
Comando ifGeneralizando multiplas condições (em Ada):
if E1 then C1elsif E2 then C2…elsif En then Cnelse C0end if;
Comando case
● Em C e Java: switch (E) { case v1: C1 … case vn: Cn default: C0}
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;
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");}
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.
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 }
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)
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)
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
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”.
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 ..
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
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.
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
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);
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)
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]
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)
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.
Chamada de funções, operadores
ϴ
ϴ ϴϴ
ϴ ϴ
←
←
Chamada de funções, operadores
Ordem de Avaliação
●
●
●
●
○
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
●
●
○○
●
○
Operadores - Haskell
●
●
●
●
●
●
●
●●●
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;}
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:
Haskell: Expressão if
Guards - Haskell
Haskell ainda tem outros elementos como guards e casamento de padrões.
menor x y |if x <= y = x | otherwise = y