Upload
internet
View
113
Download
1
Embed Size (px)
Citation preview
Introdução à Programação: uma Abordagem Funcional
Programação IEngenharia de Computação
Prof.ª Claudia Boeres eProf. 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
Tipos de dados
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.
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
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
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
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
Exemplos
> 1234567890::Int1234567890 :: Int> 12345678901::IntProgram error: arithmetic overflow> 10899798798709798791089979879870979879 :: Integer > 1089979879870979879::IntProgram 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 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
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
A constante pi
> pi
3.14159265358979 :: 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)
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
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 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
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
Precedência dos operadores
1ª) div, mod, abs, sqrt e qualquer outra função
2ª) ^
3ª) * /
4ª) +, -
Exemplos
> 2 + 3 * 517
> (2 + 3) * 525
> 3 * mod 10 4 + 511
> 3 ^ mod 10 49
> 4 ^ mod (div 20 4) 24
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
Exemplos
>3 - 7 - 2- 6
> 3 * 7 + 425
> 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/ONum: Int, Integer, Float, DoubleReal: Int, Integer, Float, DoubleFractional: Float, DoubleRealFrac: Float, DoubleFloating: Float, DoubleRealFloat: Float, DoubleIntegral: Int, Integer