Modelos de Linguagem de Programação I Aula 06 Prof. Silvestri www.eduardosilvestri.com.br Tipos de Dados Em ciência da computação tipos de variáveis ou dados é uma combinação de valores e de operações que uma variável pode executar, o que pode variar conforme o sistema operacional e a linguagem de computador. São utilizados para indicar ao compilador ou interpretador as conversões necessárias para obter os valores em memória durante a construção do programa. Por outro lado, ajudam também o programador a detectar eventuais erros (sintáticos). Tipos de Dados Dependendo da linguagem de programação, o tipo de um dado é verificado diferentemente, de acordo com a análise léxica, sintática e semântica do compilador ou interpretador da linguagem. Os tipos têm geralmente associações com valores na memória ou com objetos (para uma linguagem orientada a objeto) ou variáveis. Tipos de Dados Estáticos ou Dinâmicos A verificação do tipo de um dado é feita de forma estática em tempo de compilação ou de forma dinâmica em tempo de execução. Em C, C++, Java e Haskell os tipos são estáticos, em Scheme, Lisp, Smalltalk, Perl, PHP, Visual Basic, Ruby e Python são dinâmicos. Em C uma definição estática do tipo de uma variáveis ficaria assim: printf("O tipo char ocupa %d bytes\n", sizeof(char)); Tipos de Dados Estáticos ou Dinâmicos Em Linguagem Python a definição dinâmica do tipo de dado é feita em tempo de execução, por exemplo: Variável de tipo "inteiro": >>> a = 123 >>> type(a) <type 'int'> E logo a mudança de estado para tipo string: >>> a = 'teste' >>> type(a) <type 'str'> >>> Tipos de Dados Forte e Fraco Linguagens implementadas com tipos de dados fortes, tais como Java e Python, exigem que o tipo de dado de um valor seja do mesmo tipo da variável ao qual este valor será atribuído. Exemplo: Tipos de Dados Forte e Fraco (Sintaxe genérica) 1. Declarar Variáveis 2. TEXTO nome 3. INTEIRO idade 4. 5. Atribuições 6. nome = "Fulano" 7. idade = "13" Ocorrerá um erro ao compilar a linha 7, pois o valor "13" precisa ser convertido para o tipo de dado INTEIRO. Tipos de Dados Forte e Fraco Em linguagens com tipos de dados fracos, tais como PHP e VBScript, a conversão não se faz necessária, sendo realizada implicitamente pelo compilador ou interpretador. Tipos de Dados Primitivo e Composto Um tipo primitivo (também conhecido por nativo ou básico) é fornecido por uma linguagem de programação como um bloco de construção básico. Dependendo da implementação da linguagem, os tipos primitivos podem ou não possuir correpondência direta com objetos na memória. Um tipo composto pode ser construído em uma linguagem de programação a partir de tipos primitivos e de outros tipos compostos, em um processo chamado composição. Em C, cadeias de caracteres são tipos compostos, enquanto em dialetos modernos de Basic e em JavaScript esse tipo é nativo da linguagem. Tipos de Dados Primitivo e Composto Tipos primitivos típicos incluem caracter, inteiro (representa um sub-conjunto dos números inteiros, com largura dependente do sistema; pode possuir sinal ou não), ponto flutuante (representa o conjunto dos números reais), booleano (lógica booleana, verdadeiro ou falso) e algum tipo de referência (como ponteiro ou handles). Tipos primitivos mais sofisticados incluem tuplas, listas ligadas, números complexos, números racionais e tabela hash, presente sobretudo em linguagens funcionais. Tipos de Dados Primitivo e Composto Espera-se que operações envolvendo tipos primitivos sejam as construções mais rápidas da linguagem. Por exemplo, a adição de inteiros pode ser feita com somente uma instrução de máquina, e mesmo algumas CPUs oferecem instruções específicas para processar sequências de caracteres com uma única instrução. A maioria das linguagens não permite que o comportamento de um tipo nativo seja modificado por programas. como exceção, Smalltalk permite que tipos nativos sejam estendidos, adicionando-se operações e também redefinindo operações nativas. Tipos de Dados Primitivo e Composto Uma estrutura em C e C++ é um tipo composto de um conjunto determinado de campos e membros. O tamanho total da estrutura para o tipo composto corresponde a soma dos requerimentos de cada campo da estrutura, além de um possível espaço para alinhamento de bits. Por exemplo: struct Conta { int numero; char *nome; char *sobrenome; float balanco; }; Tipos de Dados Primitivo e Composto struct Conta define um tipo composto chamado Conta. A partir de uma variável minhaConta do tipo acima, pode-se acessar o número da conta através de minhaConta.numero. Conta minhaConta; Tipos de Dados Strings de Caracteres Em programação e em linguagens formais, uma cadeia de caracteres (também conhecida como string) é uma sequência ordenada de caracteres (símbolos) escolhidos a partir de um conjunto pré-determinado. Em programação, cada símbolo armazenado na memória é representado por um valor numérico. Uma variável declarada com tipo de dado cadeia geralmente armazena um número pré-determinado de caracteres. Tipos de Dados Strings de Caracteres – Teoria Formal Seja Σ um alfabeto, um conjunto finito e não vazio. Os elementos de Σ são chamados caracteres. Uma cadeia sobre Σ é qualquer sequência finita de caracteres de Σ. Por exemplo, se Σ = {0, 1}, então 0101 é uma cadeia sobre Σ. O tamanho da cadeia é a quantidade de caracteres, e pode ser qualquer valor inteiro não negativo. A cadeia vazia é uma cadeia única sobre Σ de tamanho 0, sendo denotada por ε ou λ. Tipos de Dados Strings de Caracteres – Concatenação e Sub Cadeias. Concatenação é uma importante operação binária em Σ*. Para qualquer duas cadeias s e t em Σ*, sua concatenação é definida pela sequência de caracteres de s seguida pela sequência de caracteres em t, denotada por st. Por exemplo se Σ = {a, b, …, z}, s = bear e t = hug, então st = bearhug e ts = hugbear. A concatenação de cadeias é uma operação associativa, mas não comutativa. A cadeia vazia serve como um elemento identidade; par qualquer cadeia s, εs = sε = s. Portanto, o conjunto Σ* e a operação de concatenação formam um monóide. A cadeia s é dita uma sub-cadeia (ou fator) de t se existem cadeias (possivelmente vazias) u e v de forma que t = usv. Tipos de Dados Strings de Caracteres – Tipo de Dados. Um tipo de dado cadeia de caracteres (referido em programação geralmente como string) é uma modelagem de uma cadeia formal de caracteres. São bastante usados em programação, sendo implementados em quase todas as linguagens de programação. Em algumas linguagens esse tipo é definido nativamente, em outras é um tipo composto, derivado. Tipos de Dados Arrays Em programação de computadores, um array, também conhecido como vetor ou lista (para arrays uni-dimensionais) ou matriz (para arrays bi-dimensionais), é uma das mais simples estruturas de dados. Os arrays mantêm uma série de elementos de dados, geralmente do mesmo tamanho e tipo de dados. Elementos individuais são acessados por sua posição no array. A posição é dada por um índice, também chamado de subscrição. Tipos de Dados Arrays O índice geralmente utiliza uma seqüência de números inteiros, (ao contrário de um array associativo) mas o índex pode ter qualquer valor ordinal. Alguns arrays são multi-dimensionais, significando que eles são indexados por um número fixo de números inteiros, por exemplo, por um seqüência (ou sucessão) finita de quatro números inteiros. Geralmente, arrays uni- e bidimensionais são os mais comuns. Tipos de Dados Arrays Os arrays podem-se considerar como as estruturas de dado mais simples que é possível imaginar. Têm a vantagem de que os seus elementos são acessíveis de forma rápida, mas têm uma notável limitação: são de tamanho fixo, não podem ser incrementados ou diminuídos sem implicar complexos processos de cópia. Estas estruturas de dado são ajeitadas nas situações em que o acesso aos dados seja realizado de forma aleatória e imprevisível. Porém, se os elementos podem estar ordenados e vai-se empregar um acesso seqüencial, seria mais ajeitada uma lista. Tipos de Dados Arrays – Forma de Acesso. A forma de acesso aos elementos de um array é direta, ao contrário das listas. Isto quer dizer que o elemento desejado obtêm-se a partir do seu índice e não é preciso procurá-lo elemento por elemento. No caso das listas, por exemplo, para alcançar o terceiro elemento ter-se-á de acessar primeiro aos dois anteriores (ou bem de guardar um ponteiro que permita acessar de maneira rápida a esse elemento em particular). Tipos de Dados Arrays – declarando e alocando um array. Em Java, os arrays são objetos que necessitam ser inicializados. Isto geralmente é feito usando o operador new. Para um array, o programador especifica o tipo dos elementos do array e o número de elementos como parte da operação new. Ex.: int[] A = new int[5]. String[] S = new String[5]; double[] d = new double[10]; int[][] d2 = new int[10][10]; // matriz 10x10 , array de arrays double[] a; a = new double[100]; Tipos de Dados Arrays – declarando e alocando um array. Em C, os arrays são declarados, defenindo primeiro o seu tipo, em seguida do seu nome e por fim a sua dimensão. Ex.: int array[10];. int quadro[10]; double array[100]; int matrix[20][10]; /* matriz 20x10 */ Tipos de Dados Arrays – declarando e alocando um array. Inicializando arrays no momento da criação int[] A = {5, 7, 9, 2, 0}; int[][] d2 = { {1,2,3} , {4,5,6} }; long[] a; a = new long[] {10,20,30,40}; Tipos de Dados Arrays – declarando e alocando um array. Automaticamente o Java inicializa com um valor default cada elemento do array: Null para tipo Objetos; 0 (zero) para short, byte, int, long, float e double; Unicode 0 para char; False para boolean; Em C, os arrays quando inicializados no momento da declaração, são definidos do seguinte modo: int array[5] = {3,4,5,6,3}; double quadro[5] = {3.0,4.0,5.0,6.03,3.0}; int matrix[4][4] = {{3,4,3,4},{5,6,2,3}}; Dúvidas www.eduardosilvestri.com.br Eduardo Silvestri [email protected] Questões Publicação 1. Fazer o mapa conceitual da aula.