Expressão Condicional

Documentos relacionados
Expressões Condicionais

Expressões Condicionais

Casamento de Padrão. Programação Funcional. Capítulo 5. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Casamento de Padrão. Programação Funcional. Capítulo 6. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Introdução à Programação. Uma Abordagem Funcional

Programação Funcional. Aula 4. Definindo Funções. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2011.

Programação Funcional. Capítulo 13. Mônadas. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2012.

Funções de Ordem Superior

Programação Funcional

Linguagens de Programação Aula 13

Aula prática 14. Expressão Lambda

Linguagens de Programação. Programação Funcional e Haskell Programação Interativa Thiago Alves

Pedro Vasconcelos DCC/FCUP. Programação Funcional 3 a Aula Definição de funções

Computação L2. Linguagem C++ Observação: Material Baseado na Disciplina Computação Eletrônica.

Programas Interativos

Programas Interativos

Funções de Ordem Superior

Programas Interativos

Linguagem Haskell. Universidade Estadual Santa Cruz Conceitos de Linguagens de Programação. Tiago Carneiro 19 Agosto 2013

Aula Prática 3. Paradigmas da Programação I / Programação Funcional. ESI/MCC 1 o ano (2005/2006)

Programação Funcional. Aula 7. Entrada e Saída. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto /86 ...

Seleção Múltipla Laços (while, do-while, for) AULA 05

Aula Prática 2. Paradigmas da Programação I / Programação Funcional

Programação Funcional 9 a Aula Programas interativos

Simulação de Caixa Automático

Programação Funcional. Capítulo 21. Parsers. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2018.

Expressões Lambda. Programação Funcional. Capítulo 7. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Conceitos de Linguagens de Programação

Notas de Aula de Algoritmos e Programação de Computadores

CIT Aula 02 Variáveis e Estruturas de desvio condicional. Autor: Max Rodrigues Marques Carga Horária: 2 h 22/07/15 1

Aula prática 5. Funções Recursivas

Programação Funcional Capítulo 3 Tipos e Classes

Introdução à Programação uma Abordagem Funcional

Pedro Vasconcelos DCC/FCUP. Programação Funcional 2 a Aula Tipos e classes

Layout. Módulos. Normalmente, cada módulo está armazenado num ficheiro com o mesmo nome do módulo. Exemplo.hs

Programação Funcional 14 a Aula Classes de tipos revisitadas

UNISINOS - UNIVERSIDADE DO VALE DO RIO DOS SINOS CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS (C6/6) Curso: Informática

Aula 03 Introdução à Programação com a Linguagem Python

Sistemas Operacionais e Introdução à Programação. Programação com linguagem C

PROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95

Prática 10 - Funções

Programação Funcional. Aula 3. Tipos e Classes. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2011.

Conceitos básicos de programação

Tipos Algébricos. Programação Funcional. Capítulo 11. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Introdução à Programação. Expressões Booleanas e Comandos Condicionais

Computação 1 - Python Aula 3 - Teórica: Tipos de dados, Strings, Estrutura Condicional 1/ 28

Lógica de Hoare. Abordagem que usaremos: aplicar o método de Hoare sobre uma linguagem de programação imperativa simplificada.

Lógica e Linguagem de Programação Convertendo um algoritmo em pseudocódigo para a linguagem C Professor: Danilo Giacobo

Estruturas de Repetição

Programação Funcional. Capítulo 3. Tipos. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2017.

Linguagem C++ Estruturas de controle Parte II Estruturas de repetição

Linguagem Haskell. Riocemar S. de Santana

3. Linguagem de Programação C

Aula 01. Programação Condicional Programação repetitiva

Processamento da Informação Teoria. Desvio Condicional

PROGRAMAÇÃO em C. Vitor Valerio de Souza Campos

Linguagens de Programação I

Linguagem Pascal. Prof. Antonio Almeida de Barros Junior

Paradigmas de Programação

Programação Funcional Aulas 5 & 6

Aula 2 Comandos de Decisão

COMANDOS DE SELEÇÃO. > Maior que < Menor que >= Maior ou igual a <= Menor ou igual a == Igual a ~= Diferente de

Capítulo III : A Linguagem Pascal Estruturas de Controlo

LINGUAGEM C: COMANDOS DE CONTROLE CONDICIONAL

INTRODUÇÃO À PROGRAMAÇÃO

UNIVERSIDADE FEDERAL DO PAMPA CAMPUS BAGÉ ALGORITMOS E PROGRAMAÇÃO. Estruturas de condição. Prof. Alex Camargo

Algoritmos e Estruturas de Dados I IEC012. Linguagem C - Estruturas de Controle - Seleção. Prof. César Melo

MCG114 Programação de Computadores I. Comandos de condição 3/26/18. Comando if. Comando if. Até agora... Comandos de Condição! Comandos de Condição

Algoritmos e Programação

I1, I2 e In são instruções simples ou estruturadas da linguagem Pascal.

Programação Funcional Aulas 9, 10 & 11

Programação Funcional em Haskell

Elementos básicos das linguagens de programação

Aula 6 Instruções de Seleção Cleverton Hentz

ALGORITMOS COM SELEÇÃO 1 - ESTRUTURA CONDICIONAL (ESTRUTURAS DE CONTROLE)

2.2.5 EXPRESSÕES - Regras para o cálculo de valores

ESTRUTURA CONDICIONAL E SELEÇÃO

Algoritmos e Lógica de Programação 80 horas // 4 h/semana. Exercício... Para começar... Resolução... Para começar... Para começar...

Estruturas de controle no nível de sentença

Tipo de argumentos. valor. argumentos

Processamento da Informação Teoria Funções

4.2. CLASSES Versão

Olimpíadas de Informática Aulas preparatórias Introdução a Programação em C.

Comandos de Controle do Programa

Programação científica C++

CCO 016 / COM 110 Fundamentos de Programação

Linguagem C (estruturas condicionais)

INSTITUTO FEDERAL CATARINENSE Campus Ibirama

Algoritmos Estrutura Condicional

RESULUÇÃO DOS EXERCÍCIOS E INSTRUÇÕES DE DECISÃO (if{} e else{}) Profº André Aparecido da Silva Disponível em:

Linguagens de Programação

Compilação da linguagem Panda

Aula 8 Comandos de Seleção

Programação de Computadores

CCO 016 / COM 110 Fundamentos de Programação

puras um ou mais apenas mesmos

CCM0118 Computação I

Modularidade. Objetivos: Introduzir noções básicas de modularidade. Funções e procedimentos

ALGORITMOS COM SELEÇÃO 1 - ESTRUTURA CONDICIONAL (ESTRUTURAS DE CONTROLE)

Transcrição:

Programação Funcional UFOP DECOM 2014.1 Aula prática 4 Expressão Condicional Resumo Expressões condicionais permitem a escolha entre duas alternativas na obtenção do valor da expressão, com base em uma expressão condicional. Nesta aula vamos nos familiarizar com o uso de expressões condicionais. Vamos também aprender a fazer declarações locais a uma equação. Sumário 1 Expressão condicional 1 2 Definição de função com expressão condicional 2 3 Equações com guardas 3 4 Definições locais em uma equação 5 1 Expressão condicional Uma expressão condicional tem a forma if condição then exp 1 else exp 2 onde condição é uma expressão booleana (chamada predicado) e exp 1 (chamada consequência) e exp 2 (chamada alternativa) são expressões de um mesmo tipo. O valor da expressão condicional é o valor de exp 1 se a condição é verdadeira, ou o valor de exp 2 se a condição é falsa. Exemplos: if True then 1 else 2 1 if False then 1 else 2 2 if 2>1 then "OK" else "FAIL" "OK" if even 5 then 3+2 else 3-2 1 A expressão condicional é uma expressão, e portanto sempre tem um valor. Assim uma expressão condicional pode ser usada dentro de outra expressão. Exemplos: 5 * (if True then 10 else 20) 50 5 * if True then 10 else 20 50 (if even 2 then 10 else 20) + 1 11 if even 2 then 10 else 20 + 1 10 length (if 2<=1 then "OK" else "FAIL") 4 Observe que uma expressão condicional se extende à direita o quanto for possível. A cláusula else não é opcional em uma expressão condicional. Omiti-la é um erro de sintaxe. Se fosse possível omiti-la, qual seria o valor da expressão quando a condição fosse falsa? Assim uma expressão condicional sempre deve ter as duas alternativas. Exemplo: if True then 10 ERRO DE SINTAXE Regra de inferência de tipo test :: Bool e 1 :: a e 2 :: a if test then e 1 else e 2 :: a Observe que a consequência e a alternativa devem ser do mesmo tipo, que também é o tipo do resultado. Exemplos no ambiente interativo: 1

Prelude> :type if 4>5 then S else N if 4>5 then S else N :: Char Prelude> :type if odd 8 then 10 else 20 if odd 8 then 10 else 20 :: Num a => a Prelude> :type if mod 17 2 == 0 then 12 else 5.1 if mod 17 2 == 0 then 12 else 5.1 :: Fractional a => a Prelude> if fromenum A then "ok" else "bad" <interactive>:2:4: Couldn t match expected type Bool with actual type Int In the return type of a call of fromenum In the expression: fromenum A In the expression: if fromenum A then "ok" else "bad" Prelude> if mod 17 2 /= 0 then not True else H <interactive>:7:37: Couldn t match expected type Bool with actual type Char In the expression: H In the expression: if mod 17 2 /= 0 then not True else H In an equation for it : it = if mod 17 2 /= 0 then not True else H Tarefa 1 Determine o valor e o tipo das expressões seguintes caso a expressão esteja correta. Se a expressão estiver incorreta, indique qual é o problema encontrado. a) if sqrt (abs (10-35) * 100) < 5 then "aceito" else "negado" b) if pred B then 10 else 20 c) if odd 1 then sqrt 9 else pred B d) 4 * if B < A then 2 + 3 else 2-3 e) signum (if B < A then 2 + 3 else 2) - 3 2 Definição de função com expressão condicional Como na maioria das linguagens de programação, funções podem ser definidas usando expressões condicionais. Por exemplo, a função para calcular o valor absoluto de um número inteiro pode ser definida como segue: valorabsoluto :: Int -> Int valorabsoluto n = if n >= 0 then n else -n valorabsoluto recebe um inteiro n e retorna n se ele é não-negativo, e -n caso contrário. Expressões condicionais podem ser aninhadas, como mostra o exemplo a seguir onde é definida uma função para determinar o sinal de um número inteiro. sinal :: Int -> Int sinal n = if n < 0 then -1 else if n == 0 then 0 else 1 Tarefa 2: Maior de três valores Defina uma função max3 que recebe três valores e resulta no maior deles. Use expressões condicionais aninhadas. Faça uma anotação para a função em seu código, usando o tipo mais geral da mesma. 2

3 Equações com guardas Funções podem ser definidas através de equações com guardas, onde uma sequência de expressões lógicas, chamadas guardas, é usada para escolher entre vários possíveis resultados. Uma equação com guarda é formada por uma sequência de cláusulas escritas logo após a lista de argumentos. Cada cláusula é introduzida por uma barra vertical ( ) e consiste em uma condição, chamada guarda, e uma expressão (resultado), separados por =. f arg 1... arg n guarda 1 = exp 1. guarda m = exp m Observe que: cada guarda deve ser uma expressão lógica. os resultados devem ser todos do mesmo tipo. Quando a função é aplicada, as guardas são verificadas na sequência em que foram escritas. A primeira guarda verdadeira define o resultado. Como exemplo, considere uma função para calcular o valor absoluto de um número: vabs :: (Num a, Ord a) => a -> a vabs n n >= 0 = n n < 0 = - n Nesta definição de abs, as guardas são n >= 0 n < 0 e as expressões associadas são respectivamente n -n Aplicação da função: vabs 89?? 89 >= 0?? True 89 Observe que quando o cálculo do valor de uma expressão é escrito passo a passo, indicamos o cálculo das guardas separadamente em linhas que começam com??. Outra exemplo de aplicação da função: vabs (75-2*50)?? 75-2*50 >= 0?? 75-100 >= 0?? -25 >= 0?? False?? -25 < 0?? True - (-25) 25 Note que o argumento (75-2*50) é avaliado uma única vez, na primeira vez em que ele é necessário (para verificar a primeira guarda). O seu valor não é recalculado quando o argumento é usado novamente na segunda guarda ou no resultado. Esta é uma característica da avaliação lazy: Um argumento é avaliado somente se o seu valor for necessário, e o seu valor é guardado caso ele seja necessário novamente. Logo um argumento nunca é avaliado mais de uma vez. Observe que na definição de vabs o teste n < 0 pode ser substituído pela constante True, pois ele somente será usado se o primeiro teste n >= 0 for falso, e se isto acontecer, com certeza n < 0 é verdadeiro: 3

vabs n n >= 0 = n True = -n A condição True pode também ser escrita como otherwise: vabs n n >= 0 = n otherwise = -n otherwise é uma condição que captura todas as outras situações que ainda não foram consideradas. otherwise é definida no prelúdio simplesmente como o valor verdadeiro: otherwise :: Bool otherwise = True Equações com guardas podem ser usadas para tornar definições que envolvem múltiplas condições mais fáceis de ler, como mostra o exemplo a seguir para determinar o sinal de um número inteiro: sinal :: Int -> Int sinal n n < 0 = -1 n == 0 = 0 otherwise = 1 Como outro exemplo temos uma função para análisa o índice de massa corporal: analisaimc :: (Fractional a, Ord a) => a -> String analisaimc imc imc <= 18.5 = "Você está abaixo do peso, seu emo!" imc <= 25.0 = "Você parece normal. Deve ser feio!" imc <= 30.0 = "Você está gordo! Perca algum peso!" otherwise = "Você está uma baleia. Parabéns!" Uma definição pode ser feita com várias equações. Se todas as guardas de uma equação forem falsas, a próxima equação é considerada. Se não houver uma próxima equação, ocorre um erro em tempo de execução. Por exemplo: minhafuncao :: (Ord a, Num b) => a -> a -> b minhafuncao x y x > y = 1 x < y = -1 minhafuncao 2 3-1 minhafuncao 3 2 1 minhafuncao 2 2 ERRO Tarefa 3: Menor de três valores Dada a definição de função min3 a b c a < b && a < c = a b < c = b otherwise = c mostre o cálculo passo a passo das expressões: a) min3 2 3 4 b) min3 5 (4-3) 6 c) min3 (div 100 5) (2*6) (4+5) Tarefa 4 Redefina a função a seguir usando guardas no lugar de expressões condicionais. describeletter :: Char -> String describeletter c = if c >= a && c <= z then "Lower case" else if c >= A && c <= Z then "Upper case" else "Not an ASCII letter" 4

4 Definições locais em uma equação A palavra reservada é utilizada para introduzir definições locais cujo contexto (ou escopo) é a expressão no lado direito e as guardas (quando houver) de uma equação. Por exemplo: f :: Fractional a => a -> a -> a f x y = (a + 1) * (a + 2) a = (x+y)/2 f 2 3 15.75 f 5 1 20.0 Quando há duas ou mais definições locais, elas podem ser escritas em diferentes estilos. Por exemplo: f x y = (a+1)*(b+2) { a = (x+y)/2; b = (x+y)/3 } f x y = (a+1)*(b+2) a = (x+y)/2; b = (x+y)/3 f x y = (a+1)*(b+2) a = (x+y)/2 b = (x+y)/3 Neste último exemplo foi usada a regra de layout, que dispensa os símbolos ;, { e } mas exige que cada definição local esteja alinhada em uma mesma coluna. Outro exemplo: square x = x * x g x y x <= 10 = x + a x > 10 = x - a a = square (y+1) O escopo de a inclui os dois possíveis resultados determinados pelas guardas. Tanto funções como variáveis podem ser definidas localmente. A ordem das equações locais é irrelevante. Por exemplo: h y = 3 + f y + f a + f b f x = x + 7*c a = 3*c b = f 2 c = 10 h 5 320 Exemplo: análise do índice de massa corporal analisaimc peso altura imc <= 18.5 = "Você está abaixo do peso, seu emo!" imc <= 25.0 = "Você parece normal. Deve ser feio!" imc <= 30.0 = "Você está gordo! Perca algum peso!" otherwise = "Você está uma baleia. Parabéns!" imc = peso / altura^2 Ou ainda: analisaimc peso altura imc <= magro = "Você está abaixo do peso, seu emo!" imc <= normal = "Você parece normal. Deve ser feio!" imc <= gordo = "Você está gordo! Perca algum peso!" otherwise = "Você está uma baleia. Parabéns!" imc = peso / altura^2 magro = 18.5 normal = 25.0 gordo = 30.0 Definições locais com não são compartilhadas entre diferentes equações de uma função. Por exemplo: 5

saudacao :: String -> String saudacao "Joana" = saudacaolegal ++ " Joana!" saudacao "Ferando" = saudacaolegal ++ " Fernando!" saudacao nome = saudacaoinfeliz ++ " " ++ nome saudacaolegal = "Olá! Que bom encontrar você, " saudacaoinfeliz = "Oh! Pfft. É você, " Esta definição de função está incorreta. Para corrigi-la, transforme as definições locais de saudacaolegal e saudacaoinfeliz em definições globais. Tarefa 5: Equação do segundo grau Defina uma função chamada numraizes que recebe os três coeficientes de uma equação do segundo grau e calcula a quantidade de raízes reais distintas da equação. Assuma que a equação é não degenerada (isto é, o coeficiente do termo de grau dois não é zero). Use uma declaração local para calcular o discriminante da equação. Especifique o tipo mais geral da função. Tarefa 6: Notas de um estudante A nota final de um estudante é calculada a partir de três notas atribuídas, respectivamente, a um trabalho de laboratório, a uma avaliação semestral e a um exame final. A média das três notas mencionadas obedece aos pesos a seguir: nota peso trabalho de laboratório 2 avaliação semestral 3 exame final 5 O programa a seguir, que está incompleto, deve receber as três notas e determinar e exibir o conceito obtido pelo aluno usando a tabela: Considere que as notas digitadas são válidas. module Main média ponderada conceito [8.0 10.0] A [7.0 8.0[ B [6.0 7.0[ C [5.0 6.0[ D [0.0 5.0[ E import System.IO (hsetbuffering, stdout, BufferMode(NoBuffering)) main :: IO () main = do hsetbuffering stdout NoBuffering putstr "Digite a nota do trabalho de laboratório: " laboratório <- readln putstr "Digite a nota da avaliação semestral: " semestral <- readln putstr "Digite a nota do exame final: " final <- readln putstrln ("Conceito: " ++ [conceito laboratório semestral final]) conceito :: Float -> Float -> Float -> Char -- complete a definição da função 6

Exemplo de execução da aplicação *Main> main Digite a nota do trabalho de laboratório: 7.8 Digite a nota da avaliação semestral: 8.0 Digite a nota do exame final: 4.9 Conceito: C Você deve completar a definição do função conceito. Use uma definição local para calcular a média, e guardas para selecionar uma das cinco alternativas. 7