introdução à programação: uma abordagem funcional programação i engenharia de computação...

23
Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

Upload: internet

Post on 16-Apr-2015

113 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

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

Programação IEngenharia de Computação

Prof.ª Claudia Boeres eProf. Estefhan Dazzi Wandekokem

2010/1

Page 2: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

O que é um tipo de dado?

• um conjunto de valores, munido de um conjunto de operações sobre esses valores.

• 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 → xm :: (S x) x → x → x

Page 3: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

Tipos de dados

Básicos: numéricos, booleanos, caracteres

Compostos: tuplas e listas

Page 4: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

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.

Page 5: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

Tipos Numéricos

Tipo de dados fundamental 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

Page 6: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

Exemplos

> :set +t

> 2^20

1048576 :: Integer

> :set -t

> 2^100

1267650600228229401496703205376

Page 7: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

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

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

Page 8: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

Números Inteiros

Tipo Int: representação de inteiros mais restrita (intervalo fixo e reduzido de valores);

Economia de memória do computador e tempo de processamento;

Para que um número seja representado como tipo Int, devemos indicar explicitamente

Page 9: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

Exemplos

> 1234567890::Int1234567890 :: Int> 12345678901::IntProgram error: arithmetic overflow> 10899798798709798791089979879870979879 :: Integer > 1089979879870979879::IntProgram error: arithmetic overflow

Page 10: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

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 da divisão inteira entre dois inteiros

abs valor absoluto

signum produz -1, 0 ou 1, indicando se o número é negativo, zero ou positivo

Page 11: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

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

Page 12: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

Exemplos

> 0.1234567890123456789012345678901234567890

0.123456789012346 :: Double

A representação científica é utilizada quando necessário:

> 1234567890123456789012345678.9

1.23456789012346e+027 :: Double

Page 13: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

A constante pi

> pi

3.14159265358979 :: Double

Page 14: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

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)

sin Seno

cos Coseno

tan Tangente

sqrt raiz quadrada

log logaritmo na base e

logBase logaritmo na base escolhida

exp potência na base e

Page 15: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

Conversão de tipos

> 3 + 5

8 :: Integer

> 3 + 5.0

8.0 :: Double

Page 16: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

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

> truncate pi

3 :: Integer a função round converte um real x para o inteiro mais próximo

de x, ou seja:

round x = truncate (x + 0.5)

> round pi

3 :: Integer

> round (exp 1)

3 :: Integer

Page 17: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

Conversão de tipos

As funções fromInteger e fromRational também servem para conversão de tipos:

fromInteger  :: (Num a) => Integer -> a

fromRational :: (Fractional a) => Rational -> a

Page 18: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

Precedência dos operadores

1ª) div, mod, abs, sqrt e qualquer outra função

2ª) ^

3ª) * /

4ª) +, -

Page 19: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

Exemplos

> 2 + 3 * 517

> (2 + 3) * 525

> 3 * mod 10 4 + 511

> 3 ^ mod 10 49

> 4 ^ mod (div 20 4) 24

Page 20: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

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^-yb) 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

Page 21: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

Exemplos

>3 - 7 - 2- 6

> 3 * 7 + 425

> 3 * ( 7 + 4)33

> 3 ^ ( 1 + 3)81

Page 22: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

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)

Page 23: Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekokem 2010/1

Hierarquia de tipos

Eq, Ord: tudo menos I/ONum: Int, Integer, Float, DoubleReal: Int, Integer, Float, DoubleFractional: Float, DoubleRealFrac: Float, DoubleFloating: Float, DoubleRealFloat: Float, DoubleIntegral: Int, Integer