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

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

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

Linguagens de Programação Aula 13

Linguagem Haskell. Riocemar S. de Santana

Programação de Computadores III

Professor: Domingos Equipe Haskell: Lucas Montesuma, Francisco Leonardo CONCEITOS DA LINGUAGEM DE PROGRAMAÇÃO CÁLCULADORA EM HASKELL

Programação de Computadores III

Programação de Computadores:

Programação em C. Victor Amorim dos Santos

Programação Orientada a Objetos

Algoritmos: Conceitos Fundamentais. Slides de autoria de Rosely Sanches e Simone Senger de Souza

Programação Introdução

Fluxogramas e variáveis

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

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

Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Programação de Computadores I - BCC701

Aula prática 5. Funções Recursivas

Aula 03 - Introdução ao Scilab (p2)

Material Didático Unificado.

Oficina de Introdução de Programação usando Linguagem Python Prof. Ms. Perini

ALGORITMOS VARIÁVEIS E OPERADORES. Prof. Angelo Augusto Frozza, M.Sc.

Paradigmas de Linguagens de Programação. Expressões e Instruções de Atribuição

Programação de Computadores I Dados, Operadores e Expressões PROFESSORA CINTIA CAETANO

Algoritmos: Conceitos Fundamentais. Baseado nos slides de autoria de Rosely Sanches e Simone Senger de Souza

Introdução à Computação

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas. Aula Tópico 2

Algoritmos e Estruturas de Dados I (DCC/003) 2013/1. Estruturas Básicas. Aula Tópico 4

Material Didático Unificado. Variáveis correspondem a nomes para endereços de memória que são gerenciados pelo Scilab.

Capítulo 7. Expressões e Sentenças de Atribuição

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

Introdução à Linguagem C++

Listas em Haskell. Listas. Linguagem Haskell. Maria Adriana Vidigal de Lima. Faculdade de Computação - UFU. Setembro

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

7 Operadores e Expressões

Ambiente Scilab Variáveis, expressões, comando de atribuição Entrada e Saída básica

Algoritmos: tipos de dados, variáveis e expressões

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação

Computação Eletrônica. Tipos de dados, constantes, variáveis, operadores e expressões. Prof: Luciano Barbosa

Oficina de Python Prof. Me. José Carlos Perini

Linguagem Computacional

Resolução De Problemas Em Informática. Docente: Ana Paula Afonso Resolução de Problemas. 1. Analisar o problema

3. Linguagem de Programação C

Iteração e Pontos Fixos

4. Constantes. Constantes pré-definidas

Estrutura de Condição, Escolha e Repetição

ALGORITMOS E TÉCNICAS DE PROGRAMAÇÃO

Conceitos Básicos Linguagem C

Oficina de Python Prof. Me. José Carlos Perini

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

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

Introdução a JAVA. Variaveis, tipos, expressões, comandos e blocos

Ciência da Computação A&P

Paradigmas de Linguagem de Programação. Paradigma Imperativo

Programação Aplicada à Engenharia

Introdução à Computação - aulas 01 e 02 -

Algoritmos II prof. Daniel Oliveira

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

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

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

Aula prática 14. Expressão Lambda

Linguagens de Programação Aula 14

02 - Introdução ao Scilab

Conceitos Básicos de Programação

Transcrição:

Universidade Federal do Espírito Santo Introdução à Programação uma Abordagem Funcional Programação I Prof.ª Claudia Boeres boeres@inf.ufes.br CT VII - Sala 34 Departamento de Informática Centro Tecnológico Universidade Federal do Espírito Santo Co-Autoria: Clebson Oliveira

Tipo de Dado em Haskell Haskell possui um sistema de tipos estático: o tipo de qualquer expressão é conhecido durante a compilação do código É melhor identificar erros durante a compilação de programas do que durante a sua execução!

Tipo de Dado Um conjunto de valores, munido de um conjunto de operações aplicáveis a estes. Exemplo: S = {0,1,2,3,...}, munido das operações de adição (a) e multiplicação (m). Cada operação possui um tipo, indicando o domínio e o contradomínio. Exemplo: o domínio de a é S X S e o contradomínio é S. Assinatura de a e de m: a :: (S x) x x x m :: (S x) x x x

Tipo de Dado Básicos: numéricos, booleanos, caracteres; Compostos: tuplas e listas.

Linguagem fortemente tipada Em Haskell, conhecendo-se o tipo das operações e funções que compõem uma expressão podemos determinar o tipo do valor que dela resultará; Em linguagens de programação isto equivale a dizer que a linguagem é fortemente tipada.

Variáveis de tipo Função sqrt: :t sqrt sqrt :: (Floating a) => a a Função identidade: :t id id :: a a Funções definidas com variáveis de tipo são chamadas de funções polimórficas

Tipos Numéricos Tipos de dados fundamentais na computação; Inteiros e reais; Tratamentos de números pelo computador: requer adaptações e simplificações. Em HUGS é possível visualizar o tipo da expressão avaliada através do comando :set +t OBS: para desfazer a configuração use o comando :set -t

Exemplos > :set +t > 2^20 1048576 :: Integer > :set -t > 2^100 1267650600228229401496703205376

Números Inteiros tipo Integer: representação de números com uma quantidade ilimitada de algarismos. a memória do computador é finita: limites de representação são impostos; o limite pode estar bem longe e podemos não atingí-lo em nossas aplicações. > 2^1000 1071508607186267320948425049060001810561404811705533 607443750388370351051124936122493198378815695858127 59467291755314682518714528569231404359845775746985 748039345677748242309854210746050623711418779541821 530464749835819412673987675591655439460770629145711 96477686542167660429831652624386837205668069376

Números Inteiros Tipo Int: representação de inteiros mais restrita (intervalo fixo e reduzido de valores); minbound e maxbound Economia de memória do computador e tempo de processamento; Para que um número seja representado como tipo Int, devemos indicar explicitamente

Exemplos > 1234567890::Int 1234567890 :: Int > 12345678901::Int Program error: arithmetic overflow > 1089979879870979879 1089979879870979879 :: Integer > 1089979879870979879::Int Program error: arithmetic overflow

Operações sobre inteiros Nome Descrição + Adição * Multiplicação - Subtração div, quot divisão inteira ^ Potência rem resto da divisão inteira entre dois inteiros mod módulo do resto da divisão inteira entre dois inteiros (sempre positivo) abs valor absoluto signum -1, 0 ou 1, indicando se o número é negativo, zero ou positivo

Números Reais Tipo Float: representação dos números reais Para a representação, considera-se a magnitude e a precisão de um número; Precisão: nos diz quantos algarismos significativos são usados; Magnitude: nos diz qual o maior expoente admitido; Exemplo: uma determinada implementação pode utilizar 6 algarismos significativos: o número 123456.789 seria representado pelo número 123457.0, onde o 6 foi arredondado para 7. A magnitude permite a representação tanto de números bem pequenos e bem grandes. Exemplo: 99999999999999999999999999999 1.0e+29 0.00000000009999999999999999999999999999 1.0e-010

Exemplos > 0.1234567890123456789012345678901234567890 0.123456789012346 :: Double A representação científica é utilizada quando necessário: > 1234567890123456789012345678.9 1.23456789012346e+027 :: Double

Operações sobre reais Nome Descrição + Adição * Multiplicação - Subtração / Divisão ^ potência (o expoente tem que ser Int e positivo)

Operações sobre reais Nome Descrição sin Seno cos Coseno tan Tangente sqrt raiz quadrada log logbase logaritmo na base e logaritmo na base escolhida exp potência na base e

Conversão de tipos > 3 + 5 8 :: Integer > 3 + 5.0 8.0 :: Double

Conversão de tipos Existem funções específicas para conversão de tipos: a função truncate converte um real x para o menor inteiro menor ou gual x. > truncate pi 3 :: Integer > round pi a função round converte um real x para o inteiro mais próximo de x, ou seja: round x = truncate (x + 0.5) 3 :: Integer > round (exp 1) 3 :: Integer

Precedência dos operadores 1ª) div, mod, abs, sqrt e qualquer outra função 2ª) ^ 3ª) * / 4ª) +, -

Exemplos > 2 + 3 * 5 17 > (2 + 3) * 5 25 > 3 * mod 10 4 + 5 11 > 3 ^ mod 10 4 9 > 4 ^ mod (div 20 4) 2 4

Ordem de associação Quando há ocorrência de operadores de mesma precedência leva-se em consideração a ordem de associação que pode ser à direita ou à esquerda. a) O operador unário deve ser sempre representado entre parênteses quando utilizado junto com outro operador (- x)^y ou - (x^y) e nunca -x^y ou x^-y b) A potência, quando repetida em uma expressão, é avaliada da direita para a esquerda 2^3^3 = 2^(3^3) c) Os demais operadores, na situação acima, são avaliados da esquerda para a direita 2-3 - 5 = (2-3) 5 e 2 + 3 + 3 = (2 + 3) + 3

Exemplos >3-7 - 2-6 > 3 * 7 + 4 25 > 3 * ( 7 + 4) 33 > 3 ^ ( 1 + 3) 81

Tipos de novas definições de funções As funções abaixo são de que tipo? mediaa x y = (x + y) / 2 e mediab x y = truncate ((x + y) / 2)

Hierarquia de tipos Eq, Ord: tudo menos I/O Num: Int, Integer, Float, Double Real: Int, Integer, Float, Double Fractional: Float, Double RealFrac: Float, Double Floating: Float, Double RealFloat: Float, Double Integral: Int, Integer OBS: Classes em Haskell representam um conjunto de tipos

Expressões Lógicas e o tipo Boolean importante para a tomada de decisão; tipo boolean: tipo de dados para representar a satisfação ou não de uma condição; George Boole: estudou e formalizou operações com estes tipos de valores.

Proposições Lógicas sentenças matemáticas: afirmações sobre elementos matemáticos; O número três é par O número cinco é maior que zero Proposições lógicas: afirmações sobre elementos do cotidiano. Hoje está chovendo Maria é irmã de José uma proposição lógica é verdadeira ou falsa

Sentenças fechadas e abertas Sentenças fechadas: todos os componentes da sentença estão explicitados, podendo ser avaliada imediatamente, conferindo o que elas afirmam com o mundo ao qual elas se referem; 7 + 3 < 20 Sentenças abertas: alguns componentes da sentença não estão devidamente explicitados. Para avaliá-la é preciso instanciar esses componentes x > 5

Sentenças compostas Formada a partir das proposições lógicas simples Hoje é domingo e faz sol 3 > 2 e 3 < 10 Flamengo não é o melhor time do Rio de Janeiro

Avaliação de sentenças compostas Como se avalia esse tipo de sentença? Hoje faz sol e eu vou à praia Nesta manhã Joãozinho não vai à escola Amanhã choverá ou ficará nublado

Tabelas verdade Palavras lógicas: e, ou e não e p q p e q V V V V F F F V F F F F ou p q p ou q V V V V F V F V V F F F não p não p V F F V

O tipo de dados boolean Formado pelas constantes True e False e as operações lógicas avalia :: <sentença> {True, False}

Operadores Lógicos Operação lógica e Operador lógico (Haskell) && ou não not

Operadores relacionais operador significado exemplo resultado == igualdade (2 + 3) == (8 3) True /= Diferença 5 /= (4 * 2-3) False < Menor (2 + 3) < 6 True <= Menor ou igual (2 * 3) <= 6 True > Maior (4 + 2) > (2 * 3) False >= Maior ou igual (8 3 * 2) >= (15 div 3) False

Qual é a resposta da avaliação das expressões abaixo? > 3 < 5 && 7 > 2 > (3 + 5) == 8 && 30 /= 24 && 10 > 4 > not (7 > 8) 4^2 == 16 && 50.5 <= 100

Hierarquia dos operadores relacionais e lógicos Operadores relacionais: todos estão no mesmo nível de hierarquia, que está abaixo dos operadores aritméticos e de funções e primitivas; Operadores lógicos && e : estão abaixo dos operadores aritméticos e o operador && tem precedência sobre ; O operador not tem prioridade idêntica a qualquer outra primitiva do Haskell; Se a expressão possui operadores no mesmo nível de hierarquia, são avaliados da esquerda para a direita.

Definição de funções booleanas Funções booleanas: o contradomínio destas funções consiste no conjunto {True, False} Exemplos: Verificar se um número é ímpar: impar x = mod x 2 /= 0 Verificar se um número pertence ao intervalo [0,1]: intervalo0-1 x = x >= 0 && x <= 1

Mais exemplos Verificar se um número está dentro do intervalo [a,b], com a <= b; Verificar se um número é maior que o outro; Verificar se um ponto pertence ao primeiro quadrante do plano cartesiano

Exemplos > 3+4 > 7 False :: Bool > 3>4 && 5 < 9 3 ==3 True :: Bool

Exercício Faça uma função que verifique se um ponto P (x, y) pertence ao círculo de raio r e centro Q (x1, y1). P (x,y) r Q (x1,y1)

O ponto P (x, y) pertence à área cinza? P (x, y)? C (x1, y1) a/2 a

Definições Condicionais Adequadas para representação de situações de tomada de decisão

Estrutura if-then-else Sintaxe: if <expressão lógica> then <expressão 1> else <expressão 2>

Exemplo Considere a função que determina o valor da passagem aérea de um adulto, para um determinado trecho, por exemplo, Vitória-Manaus, considerando a sua idade. Pessoas com idade a partir de 60 anos possuem um desconto de 40% do valor. Considere ainda que a passagem para o trecho considerado custe R$ 600,00.

Exemplo Considere a função que associa com um determinado rendimento o Imposto de Renda a ser pago. Até um determinado valor, o contribuinte não paga imposto, e a partir de então o rendimento é dividido em faixas (intervalos), aos quais se aplicam diferentes taxas: Faixa inferior ou igual a 10.800 entre 10.801 e 20.000 entre 20.001 e 30.000 alíquota 0 10 20 Desconto 0 1000 1500 acima de 30.000 25 1800

Árvore de Decisão

Árvore de decisão s <= 10800 ir1 s (10800, 20000] ir2 s (20000, 30000] ir3 ir4

Solução ir s = if s <= 10800 then ir1 else if pert s 10800 20000 then ir2 else if pert s 20001 30000 then ir3 else ir4 where ir1 = 0 ir2 = s * 0.1-1000 ir3 = s * 0.2-1500 ir4 = s * 0.25-1800 pert x a b = x>=a && x<=b

Qual o problema do código anterior? Alternativa: Solução ir s = if s <= 10800 then ir1 else if s <= 20000 then ir2 else if s <= 30000 then ir3 else ir4 where ir1 = 0 ir2 = s * 0.1-1000 ir3 = s * 0.2-1500 ir4 = s * 0.25-1800

Exercício Dados três números, determine o maior deles. Faça a árvore de decisão Descreva a solução em haskell usando expressões condicionais

Guarded commands Permite que uma mesma função seja descrita por várias definições, cada uma delas protegida por uma expressão lógica; Sintaxe: <nome da função> <parâmetros> <proteção 1> = <definição 1> <proteção 2> = <definição 2> <proteção 3> = <definição 3>... <proteção n> = <definição n> otherwise = <definição n + 1>

Exemplo ir2 s s <= 10800 = ir1 s <= 20000 = ir2 s <= 30000 = ir3 otherwise = ir4 where ir1 = 0 ir2 = s * 0.1-1000 ir3 = s * 0.2-1500 ir4 = s * 0.25-1800

O ponto P (x, y) pertence a qual das áreas 1, 2, 3 e 4? P (x, y)? 4 1 a/2 C (x1, y1) 2 3 a