PARADIGMAS DE LINGUAGENS
Prof. Paulo Malcher
prcmalcher@gmail.com
https://sites.google.com/site/professorpaulomalcher/
Agenda
•
Introdução
•
Tipos de dados primitivos
•
Tipos String de caracteres
•
Tipos ordinais definidos pelo usuário
•
Tipos matriz (array)
•
Tipos registro
Introdução
•
Os programas de computador produzem
resultados manipulando dados.
Introdução
•
Um tipo de dado define uma coleção de dado
se um conjunto de operações pré-definidas
sobre esses dados.
Introdução
•
É importante que uma LP forneça uma coleção
a propriedade coleção apropriada de tipos de
dados.
•
Utilidade:
o Detecção de erros
o Modularização
Tipos de dados primitivos
•
Tipos de dados primitivos são aqueles não
definidos em termos de outros tipos.
•
Praticamente todas as LP oferecem um
conjunto de tipos de dados primitivos.
•
Usados com construções de tipo para fornecer
os tipos estruturados (abstratos). Os mais
comuns são:
o Tipos numéricos (Inteiros, Pontos-flutuantes, decimais).
o Tipos booleanos
Tipos de dados primitivos
•
Tipos numéricos
–
Inteiro:
o O tipo de dados primitivo numérico mais comum é o inteiro.
o Quase sempre um reflexo do hardware.
• Assim, seu mapeamento é trivial
o Muitos computadores suportam diversos tamanhos de inteiros.
• Em Ada
• SHORT INTEGER, INTEGER, LONG INTEGER
• Em Java
Tipos de dados primitivos
Tipos de dados primitivos
•
Tipos numéricos
–
Ponto-flutuante:
o Modelam os números reais mas as representações são apenas aproximações.
o Valores de ponto flutuante são representados como frações expoentes (máquinas mais antigas). Máquinas atuais usam o formato padrão IEEE Floating Point Standard 754.
o A maioria das LP‟s de fins científicos suportam pelo menos dois tipos de ponto flutuante:
• float: é o tamanho padrão.Ocupa 4 bytes de memória.
• double: fornecido para situações nas quais partes
Tipos de dados primitivos
•
Tipos numéricos
–
Ponto-flutuante (ou
vírgula-flutuante):
Tipos de dados primitivos
•
Tipos numéricos
–
Ponto-flutuante (ou
vírgula-flutuante):
o Os valores que podem ser representados pelo tipo ponto flutuante é definido em termos de precisão e faixa.
• Precisão: exatidão da parte fracionária de um valor
(medida pela quantidade de bits).
• Faixa: combinação da faixa de frações e, o mais
Tipos de dados primitivos
IEEE Padrão de Ponto Flutuante754 (a)Precisão simples
Tipos de dados primitivos
•
Tipos numéricos
–
Decimais:
o São armazenados usando códigos binários para os dígitos decimais.
o Representação BCD (Binary-Coded Decimal)
o São necessários pelo menos 4 bits para codificar um dígito decimal.
Tipos de dados primitivos
•
Tipos numéricos
–
Decimais:
o Para aplicações comerciais (formato moeda)
• Essencial para COBOL.
• C# oferece um tipo de dado decimal.
o Vantagem
• Precisão
o Desvantagens
• Faixa de valores restrita.
Tipos de dados primitivos
•
Tipos booleanos:
o Mais simples de todos.
o Sua faixa de valores tem somente dois elementos.
• Dois elementos, um para “true” e um para “false”.
• Um inteiro poderia ser utilizado para representá-lo, porém dificulta a legibilidade.
o Uma exceção popular é o C, no qual expressões numéricas podem ser usadas como condicionais. C não apresenta o tipo booleano.
Tipos de dados primitivos
•
Tipos caractere:
o Armazenados como codificações numéricas.
o Tradicionalmente, a codificação mais utilizada era o ASCII de 8bits.
• Faixa de valores entre 0 e 127 para codificar 128 caracteres diferentes.
• Se tornou inadequado (>computadores; >necessidade de comunicação)
o Uma alternativa, codificação de 16 bits: Unicode(UCS-2).
• Inclui caracteres da maioria das linguagens naturais
• Usado em Java
• C# e JavaScript também suportam Unicode
Tipos String de caracteres
•
Um tipo cadeia de caracteres (String) é aquele
cujos valores consistem em sequências de
caracteres.
•
Os dados das cadeias normalmente são
Tipos String de caracteres
•
Ada
o STRING é um tipo formado por elementos CHARACTER.
o Referência a subcadeias, concatenação, operadores relacionais e atribuição são operações oferecidas para os tipos STRING.
• NAME1(2:4)
Tipos String de caracteres
•
C e C++
o Vetores char para armazenar cadeias de caracteres.
o Biblioteca padrão (string.h)
o As cadeias de caracteres são finalizadas com um caractere especial nulo (zero).
• Ex: char *str = “apples”;
Tipos String de caracteres
•
Opções de tamanho da cadeia
o String de Tamanho Estático: Tamanho especificado na declaração. “Stringscheias”, caso uma string mais curta for atribuída, os caracteres vazios são definidos como brancos (espaços).
• Linguagens: FORTRAN 90, COBOL, Pascal e Ada.
o String de Tamanho Dinâmico Limitado: Possuem tamanhos variáveis até um máximo declarado e fixo estabelecido pela definição da variável. Tais variáveis podem armazenar qualquer número de caracteres entre zero e o máximo.
Tipos String de caracteres
•
Opções de tamanho da cadeia
Tipos String de caracteres
•
Operações típicas:
o Atribuição e cópia.
o Comparação (=, >, etc.)
o Concatenação
Tipos ordinais definidos pelo usuário
•
Um tipo ordinal é aquele cuja faixa de valores
possíveis pode ser associada ao conjunto dos
números inteiros positivos. Podem ser:
o Tipos Enumeração
o Tipos Subfaixa
•
Exemplos de tipos primitivos ordinais em Java:
o integer
o char
Tipos ordinais definidos pelo usuário
•
Tipos Enumeração
o São aqueles em que todos os valores possíveis, os quais se tornam constantes simbólicas e são enumerados na definição.
• Exemplo Ada: type DIAS is (Seg, Ter, Qua, Qui, Sex, Sab, Dom)
• Exemplo C#: enumdias {seg, ter, qua, qui, sex, sab, dom};
Tipos ordinais definidos pelo usuário
•
Tipos Enumeração
o Linguagens C e Pascal incluem enumeração
o Ex:
• Enumcolors {vermelho, azul, verde, amarelo, preto}
• Colors MinhaCor = vermelho
Como o tipo colors armazena internamente 0, 1, 2.. Para as cores
Caso ocorre-se:
• MinhaCor++ ou MinhaCor+1
Tipos ordinais definidos pelo usuário
•
Tipos Enumeração
o
Vantagens
• Legibilidade:
• Valores nomeados são facilmente reconhecidos, enquanto os codificados não.
• Confiabilidade:
• Nenhuma operação aritmética é permitida.
Tipos ordinais definidos pelo usuário
•
Tipos Subfaixa
o
Um
tipo
subfaixa
(subrange)
é
uma
subsequência contígua de um ordinal.
• Por exemplo,10..14 é uma subfaixa do tipo inteiro → incluídos em Pascal e Ada.
o
enumeração
enumdias {seg, ter, qua, qui, sex, sab, dom};
o
subfaixa
Tipos ordinais definidos pelo
usuário
•
Tipos Subfaixa
o Todas as operações para o tipo pai também são definidas para o subtipo, exceto atribuição fora da faixa de valores.
o Ex:
DIA1:DIAS;
DIA2:DIASSEMANA; ...
DIA2:=DIA1;
Tipos matriz (array)
•
Uma matriz é um agregado homogêneo de
elementos de dados
o Cada elemento é identificado por sua posição em relação ao primeiro.
Tipos matriz (array)
•
Matrizes e índices
o Elementos são referenciados através do nome do agregado mais subscritos (ou índices).
o Se todos os índices em uma referência forem constantes, o seletor será estático; caso contrário, será dinâmico.
o Mapeamento finito
• nome_da_matriz(lista_de_valores_indice) →
Tipos matriz (array)
•
Matrizes e índices
o Sintaxe de referência mais ou menos universal: ao nome da matriz segue-se a lista de índices entre parênteses ou colchetes.
o Problema com parênteses (também usados em listas de parâmetros)
o Exemplo FORTRAN:
• SOMA = SOMA + B(I)
Tipos matriz (array)
•
Matrizes e índices
o Dois tipos distintos são envolvidos em tipo de matriz: o do elemento e o do subscrito.
o As primeiras linguagens de programação não especificavam que as faixas de subscrito deveriam ser implicitamente verificadas.
o O C, o C++ e o FORTRAN não especificam a verificação de faixa de subscritos.
Tipos matriz (array)
•
Vinculações de subscrito
o Vinculação do tipo do subscrito: normalmente estática.
o Vinculação das faixas de valor de subscrito: às vezes dinâmica.
o Em algumas linguagens, o limite inferior da faixa de subscrito é implícito.
• No C, no C++ e no Java, o limite inferior é fixado em zero (0).
Tipos matriz (array)
•
Inicialização de matrizes
o No FORTRAN 77, todo o armazenamento de dados é alocado estaticamente.
o Assim, é permitida a inicialização no momento de execução usando-se a instrução DATA.
o Por exemplo:
Tipos matriz (array)
•
Inicialização de matrizes
o O ANSI C, o C++ e o Java também permitem inicialização de suas matrizes
o Exemplo:
int lista[] = {4, 5, 7, 83};
Tipos matriz (array)
•
Inicialização de matrizes
o As cadeias de caracteres no C e no C++ são implementadas como vetores de char.
o Exemplo:
• char nome[] = “freddie”;
o O vetor terá oito elementos
Tipos matriz (array)
•
Inicialização de matrizes
o Vetores de cadeias no C e no C++ também podem ser inicializados com literais de cadeira (vetor de ponteiros para caracteres).
o Exemplo:
• char *nomes[] = {“Bob”, “Jake”, “Darcie”};
o As literais são consideradas ponteiros para os caracteres.
Tipos matriz (array)
•
Inicialização de matrizes
o A Ada fornece dois mecanismos para inicializar matrizes na instrução de declaração
o Primeiro mecanismo (exemplo):
• LISTA: array (1..5) of INTEGER := (1, 3, 5, 7, 9);
o Segundo mecanismo (exemplo):
• GRUPO: array (1..5) of INTEGER := (1 => 3, 3 => 4, others => 0);
Tipos registro
•
Definições de registros
o Um registro é um agregado possivelmente heterogêneo de elementos de dados.
o Cada elemento possui um nome.
o Exemplo: informações sobre um estudante
• Nome
• Número do estudante
Tipos registro
•
Definições de registros
o Os elementos (ou campos) do registro são referenciados utilizando-se seus identificadores.
o Considere a forma COBOL de uma declaração de registro:
01 REGISTRO-EMPREGADO.
02 NOME-EMPREGADO.
05 PRIMEIRO PICTURE IS X(20). 05 MEIO PICTURE IS X(10).
Tipos registro
•
Definições de registros
o O Pascal e a Ada usam uma sintaxe diferente para os registros.
o Considere a seguinte declaração Ada:
REGISTRO_EMPREGADO: record
NOME_EMPREGADO:
record
PRIMEIRO: STRING (1..20); MEIO: STRING (1..10);
ULTIMO: STRING (1..20); end record;
Tipos registro
•
Referências a campos do registro
o As referências aos campos individuais são sintaticamente especificadas por diversos métodos diferentes.
o As referências a campos do COBOL têm a forma:
• Nome_do_campo OF nome_do_registro_1 OF ... OF nome_do_registro_n
• MEIO OF NOME-EMPREGADO OF
Tipos registro
•
Referências a campos do registro
o A referência ao campo MEIO da Ada tem a forma a seguir (notação de pontos)
• REGISTRO_EMPREGADO.NOME_EMPREGADO.M
Tipos ponteiro
•
Definição
o Um tipo ponteiro é aquele em que as variáveis têm uma faixa de valores que consiste em endereços de memória e um valor especial, o nil.
o Os ponteiros, ao contrário das matrizes e dos registros, não são tipos estruturados (* no C e no C++, access na Ada e ^ no Pascal).
Tipos ponteiro
•
Operações com ponteiros
o Atribuição
Tipos ponteiro
•
Ponteiros em C e C++
o Operação de desreferenciamento (*)
o Endereço de uma variável (&)
o Exemplo:
int *ptr;
int cont, init; ...
Tipos ponteiro
•
Ponteiros em C e C++
o Ponteiros podem receber o valor de endereço de qualquer objeto do tipo de domínio correto e a constante zero, usada para nil.
o A aritmética de ponteiros também é possível, embora restrita.
Tipos ponteiro
•
Ponteiros em C e C++
o Os nomes de vetores sem subscritos sempre se referem ao endereço do primeiro elemento.
o Exemplo:
int list[10]; int *ptr;
Tipos ponteiro
•
Ponteiros em C e C++
o Podemos concluir que:
o *(ptr + 1) equivale a list[1]
o *(ptr + indice) equivale a list[indice]
referência
• SEBESTA, R. W. Conceitos de Linguagens de