CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES 3.1 - IDENTIFICADORES Os objetos que usamos no nosso algoritmo são uma representação simbólica de um valor de dado. Assim, quando executamos a seguinte instrução: atribua o valor 2 ao objeto valor; O valor 2 fica associado ao objeto valor. Assim, cada vez que mencionamos o nome do objeto valor, nós estaremos referenciando, implicitamente, ao valor que foi associado a ele. Isto torna o algoritmo mais prático, pois além de ser fácil lembrarmos de um nome do que de um valor de dado, o nome de um objeto permanece inalterada durante toda a execução de um algoritmo, ao passo que o valor a ele associado pode mudar com o dinamismo do algoritmo, como por exemplo: objetos x, y; início das ações: atribua 3 ao objeto x; calcule 2 x e atribua o resultado ao objeto y; calcule 4 y e atribua o resultado ao objeto x; fim das ações. Note que os valores de x e y variam no decorrer da execução do algoritmo. O objeto x começa com o valor 3 e termina com o valor 24, e o y começa com um valor não definido e termina com 6. Note que não nos preocupa a variação de valores dos objetos, pois eles continuam a ter o mesmo nome. Por este motivo, dizemos que os objetos de um algoritmo identificam valores a eles associados, e por isto, estes objetos são chamados de identificadores. Como os nossos algoritmos têm como finalidade a comunicação do homem com a máquina (computador), podemos dizer, de uma forma grosseira, que um identificador do algoritmo será associado com uma célula de memória do computador, a qual armazenará o valor associado ao identificador. E toda vez que mencionamos o nome do identificador no algoritmo, o computador irá "buscar", na célula de memória associada com o identificador, o valor armazenado e realizará a operação descrita no algoritmo. Existe uma certa semelhança entre identificadores e variáveis matemáticas, logo é comum, em literaturas do gênero computacional encontrar, também, esta denominação para os identificadores. Mas queremos deixar claro que esta analogia nem sempre é possível, pois, considere a seguinte expressão matemática: x = x + 1. Esta expressão matemática não tem solução, pois qual é o número que é igual a ele mesmo somado em uma unidade. CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES 39 Já computacionalmente está expressão é válida, pois o significado semântico é diferente, o qual é: Calcule a expressão x + 1 e atribua o resultado a x; Para o computador, isto significa: “recupere o valor que está armazenado na célula x some uma unidade e armazene o resultado na própria célula x”. É importante deixar claro que um identificador (objeto) só pode armazenar um único valor por vez. E sempre armazenará o último valor que lhe for fornecido. Assim, se fizermos o identificador x receber o valor 100, e logo mais adiante atribuirmos ao mesmo identificador x o valor 50, a partir deste ponto o valor associado a x será 50. Você deverá escolher os nomes dos identificadores que serão utilizados, mas devendo respeitar as seguintes regras na escolha dos nomes: 1) Use somente letras e números na escolha dos nomes; 2) O primeiro caractere do nome deve ser sempre uma letra; 3) Não é permitido o uso de qualquer caractere especial (;, ’, -, +, é, á, ., ?, espaço em branco) no nome de identificador. Exemplos de identificadores válidos: ImpostoDeRenda, F1, soma, produto, desconto, SalarioHora Exemplos de identificadores não válidos: 1 f não começa com uma letra Imposto-renda tem caractere especial "-" no nome do identificador salário hora espaço em branco no nome do identificador Obs.: Procure sempre adotar nomes de identificadores curtos mas que se relacionem com as funções que eles irão representar no decorrer do algoritmo, será muito mais fácil de lembrar dos identificadores e para que eles servem. Um exemplo, para representar o número de matrícula de um funcionário de uma empresa, você poderia escolher qualquer identificador, como x1, xurt23, ..., mas seria muito mais esclarecedor e de bom gosto adotar um nome de identificador NumeroFuncionário, ou simplesmente NumFunc. No conceito de identificador de dado estão associadas quatro características (figura 3.1): o seu nome, o seu tipo, endereço da célula de memória do computador associado ao identificador e o valor armazenado na célula de memória. Nome nome do identificador conteúdo (valor armazenado na célula de memória ) célula de memória Figura 3.1 - Atributos de um identificador. CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES 40 O tipo do identificador especifica uma classe de valores que podem ser armazenados na célula de memória associada ao identificador, além de definir quais são as operações legais que poderão ser usadas para criar, acessar e modificar o conteúdo da célula de memória, isto é, supondo que na célula esteja armazenado um número, poderemos fazer uma operação de subtração com um outro número, mas se for uma letra, a operação de subtração não pode ser feita. 3.2 - IDENTIFICADOR E O TIPO DO DADO ARMAZENADO Um identificador, como já vimos, armazena um único valor de dado por vez. Mas, será que ele pode armazenar qualquer dado? Os dados podem ter estruturas físicas diferentes na representação do seu valor. Vejamos, como exemplo. Os valores: 1 1,00 0,1 x 10 +1 representam a mesma grandeza, mas possuem estruturas de organização diferentes. Observe que estamos tratando somente com dados numéricos. Caso, resolvamos envolver outros tipos de dados (como dados caracteres, dados lógicos, dados cadeias de caracteres, entre outros) teríamos estruturas completamente diferentes. As células de memória do computador precisam ser compatível com o tipo da estrutura do dado que ela irá armazenar, e como vimos estas estruturas variam com o tipo dado. Isto quer dizer que, precisamos informar ao computador quais serão as células de memória que serão utilizadas e qual o tipo de dado que será armazenado na mesma. A informação do tipo do dado armazenado na célula de memória tem outra função, que é a de definir quais serão as operações válidas que poderão ser aplicadas sobre o dado armazenado. Por exemplo: Se o dado for numérico podemos fazer operações aritméticas (adição, subtração, multiplicação, divisão e exponenciação). Caso, o dado seja uma cadeia de caracteres, poderemos efetuar uma operação de concatenação (juntar dois textos, armazenados em duas células de memória distintas em uma única célula de memória). Os tipos de dados são classificados em dois grandes grupos: os tipos simples (ou primitivos) e os tipos estruturados (capítulo 8). Os dados do tipo simples (figura 3.2) se subdividem em conjuntos específicos, como ilustra a árvore a seguir. CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES 41 Tipos de dados simples numérico inteiro caractere lógico real Figura 3.2 - Representação dos tipos de dados simples. 3.2.1 - Tipo de dados numéricos A princípio, podemos admitir a existência de dois grandes conjuntos de natureza numérica: o conjunto dos números reais e o conjunto dos números inteiros. Com exceção do conjunto dos números complexos, os outros (naturais, fracionários) são subconjunto dos conjuntos dos inteiros e reais, respectivamente. Os números complexos não serão abrangidos no contexto deste trabalho. 3.2.1.1 - Inteiros Os números inteiros podem ser positivos, negativos ou nulos e não possuem um componente decimal. Na notação matemática em forma de conjunto, poderíamos ter a seguinte representação: Z = {..., -2, -1, 0, 1, 2,...}. Matematicamente, os números inteiros são compatíveis com os números reais, pois o conjunto dos reais contém o conjunto dos inteiros. Mas, a recíproca não é verdadeira, pois, nem todo número real é um inteiro, mas todo inteiro é um real. Adotaremos aqui, esta definição matemática. Todo identificador definido como real poderá receber um valor inteiro, mas os identificadores inteiros nunca poderão receber um valor real, mesmo que a parte fracionária do mesmo seja nula. Identificadores que forem deste tipo serão declarados como sendo do tipo inteiro. 3.2.1.2 - Reais Os números podem ser positivos, negativos ou nulos, e possuem, sempre, um componente decimal. Exemplificando alguns números reais: 2,34 -3,14 0,0 34,0 -214,123 224x10+1 1000x10-4 Computacionalmente, existem muitas diferenças na forma de armazenamento de números inteiros e reais. Geralmente, valores inteiros exigem um espaço de memória menor do que os reais. CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES 42 Identificadores que forem deste tipo serão declarados como sendo do tipo real. 3.2.2 - Tipos de dados não numéricos Os tipos simples não numéricos representam os conjuntos dos caracteres e dos valores lógicos (ou booleanos). 3.2.2.1 - Caractere O conjunto dos caracteres são formados por letras (de A a Z), dígitos (de 0 a 9) e caracteres especiais (~, ., ?, >, <, ...). As diferenças entre dados numéricos e caracteres estão na forma de armazenamento e nas operações legais que podem manipular dados. Podemos fazer operações aritméticas com os dados numéricos, mas estas operações não são permitidas para os caracteres. Para diferenciar um dado numérico e um identificador de um caractere, utilizaremos sempre o dado caractere entre apóstrofes (’ ’). Assim poderíamos ter: 8 é numérico '8' é caractere A é um identificador 'A' é um caractere Identificadores que forem deste tipo serão declarados como sendo do tipo caractere. Identificadores que forem declaradas como sendo do tipo caractere poderão armazenar um único caractere. Para armazenar uma seqüência de caracteres, criaremos a estrutura cadeia de caracteres, a qual, consideraremos aqui como sendo um tipo de dado estruturado, e por ser mais complexa a estudaremos mais adiante. Mas para diferenciar a duas estruturas, eis um exemplo: ‘Z’ é um caractere ‘ANA’ é uma cadeia de caracteres 3.2.2.2 - Lógicos O conjunto dos valores lógicos é formado, unicamente por duas possibilidades (falso e verdadeiro). Isto que dizer que, qualquer identificador que for declarado como sendo deste tipo, só poderá armazenar um destes valores. Os dados do tipo lógico são muito utilizados para controle do fluxo lógico do algoritmo. Os únicos operadores que podem manipular dados deste tipo são os operadores relacionais (<>, <, =, ...) e os operadores lógicos (E, OU, NÃO), os quais serão inseridos posteriormente. Identificadores que forem deste tipo serão declarados como sendo do tipo booleano ou lógico. CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES 43 3.3 - DECLARAÇÃO DO TIPO DO IDENTIFICADOR A declaração do tipo do identificador deve ser feita na seção de declaração dos objetos que serão utilizadas no algoritmo. Esta declaração deve ser feita com a seguinte sintaxe: objetos identificador : tipo; Caso haja mais de um identificador com o mesmo tipo no mesmo algoritmo, poderemos declará-los da seguinte forma: objetos identificador1, identificador2, identificador3: tipo; Supondo que em um algoritmo, tenhamos os identificadores i1, i2 e i3 do tipo inteiro e c1, c2 do tipo caractere e b do tipo booleano e r do tipo real, teríamos a seguinte declaração dos tipos dos objetos: objetos i1, i2, i3 cl, c2 b r : inteiro; : caractere; : booleano; : real; Uma das dificuldades de definição de tipo de um identificador ocorre quando temos que declará-lo como sendo de um tipo numérico, pois o mesmo poderá ser do tipo real ou inteiro. A priori, não existe um receituário para a escolha do tipo do identificador. O próprio problema, ou o caminho escolhido para a sua solução é que permitirá a escolha do tipo do identificador. Mas enxergaremos isto somente se, estivermos devidamente afinados com a solução do problema, isto é, devemos conhecer profundamente a solução do problema, suas limitações e restrições. Exemplo de números inteiros: número de pessoas convidadas para uma festa; um número par ou ímpar; um número primo; idade de uma pessoa (geralmente é tratada como inteiro); quantidade de mercadorias em estoque. Exemplos de números reais: o peso de uma pessoa (em Kg); percentual; nota de uma avaliação; média aritmética; preço de um produto. CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES 44 Existem situações em que podemos ficar em dúvida quanto ao tipo de resultado esperado em uma expressão, como por exemplo: a raiz quadrada de um número inteiro a divisão entre dois números inteiros Se quisermos calcular a raiz quadrada de 4, matematicamente, podemos admitir que o resultado é do tipo inteiro, mas se calcularmos a raiz quadrada de 5, o resultado obtido será do tipo real. Logo, qual deverá ser a tipo do identificador que receberá o resultado desta expressão? Quando houver alguma possibilidade do resultado de uma expressão ser do tipo real, o identificador que receberá o resultado da mesma deverá ser sempre do tipo real, pois os inteiros estão contidos nos reais, assim, se atribuirmos um valor inteiro a um identificador real nenhum erro ocorrerá, mas a recíproca não é verdadeira. Exemplo: Dados dois números inteiros, diferentes de zero, faça um algoritmo que calcule a razão entre os mesmos. ae (n1, n2); as (razão); objetos n1, n2 : inteiro; razão : real; inicio das ações: conheça dois valores inteiros diferentes de zero e atribua-os a n1 e a n2, respectivamente; calcule a expressão n1/n2 e atribua o resultado ao identificador razão; informe o valor armazenado no identificador razão; fim das ações. 3.4 - VALORES DOS DADOS Os dados são os valores que serão armazenados em células de memória e que poderão ser acessados por referência aos identificadores, respectivos, associados com estas células. Assim, se tivermos os identificadores i, r, c e b como sendo inteiro, real, caractere e booleano, respectivamente, e atribuirmos a estes identificadores os valores de dados 100; 3,14, 'Z' e falso, teríamos a seguinte configuração: i r c b 100 3,14 ‘Z’ falso Se executarmos a ação informe o valor de r o resultado obtido será 3,14, pois este valor está associado com o identificador r. Assim, qualquer referência que fizermos a um identificador, estaremos, implicitamente, nos referenciando ao valor do dado associado ao mesmo.