CAPÍTULO 3 - CONSTANTES, VARIÁVEIS, TIPOS, ATRIBUIÇÕES E EXPRESSÕES

 

         Os programas de computadores operam com valores de diversas características. Alguns valores permanecem sempre inalterados durante toda a execução do programa e são conhecidos como constantes. Outros valores podem variar com a execução do programa e são conhecidos como variáveis.

         Nomes de programas, nomes de subprogramas, nomes de constantes e de variáveis são também conhecidos como identificadores. Em PASCAL um identificador começa por letra e pode conter qualquer combinação de letras e/ou dígitos decimais e/ou o caráter de sublinhar (_). Alguns identificadores têm uma finalidade previamente definida em PASCAL e não podem ser utilizados para outros propósitos: são conhecidos como palavras reservadas - o Apêndice 1 contém a lista das palavras reservadas da Linguagem PASCAL.

 

3.1. CONSTANTES

         Os programas operam muito freqüentemente com valores que não variam ao longo do processamento. Geralmente estes valores (as constantes) podem ser identificados por um nome (tal como acontece com as constantes matemáticas Pi, e, por exemplo).

         A linguagem PASCAL oferece a facilidade de definição de constantes visando: i) melhorar a legibilidade dos programas; ii) eliminar possíveis erros de transcrição ao ser efetuada a digitação de uma mesma constante em vários locais de um programa; e iii) simplificar a tarefa de alterar o valor de uma constante que é referenciada várias vezes em um mesmo programa e que por alguma razão deve ser modificada antes de se executar o programa.

         A definição de constantes é feita na parte de declarações do programa PASCAL e tem a forma geral:

 

    CONST

         nome_da_constante = valor;

 

Onde:

CONST - é uma palavra reservada da linguagem PASCAL e serve para informar ao compilador que a seguir aparece uma declaração de constante;

nome_da_constante - é um identificador que representará a constante no programa (o identificador deve ser escolhido da mesma forma que os nomes de variáveis - veja a seção 3.2.1 a seguir); e

valor - é o valor da constante.

 

         A constante definida em uma declaração CONST poderá ser utilizada ao longo do programa através de uma referência ao nome_da_constante da mesma forma que seria referenciado o próprio valor da constante.

        

         As regras de compatibilidade de tipos devem ser observadas também para as constantes: o tipo da constante será implicitamente determinado pelo compilador em concordância com o valor que estiver sendo atribuído à constante na sua declaração.

A declaração

 

    CONST

         Pi = 3.1415;

         DESCONTO = 10;

         MENSAGEM = 'Ok';

 

define as constantes Pi, DESCONTO e MENSAGEM que são compatíveis com os tipos REAL, INTEGER e STRING, respectivamente.

         O programa apresentado a seguir determina a circunferência e a área para um círculo de raio 10.

 

PROGRAM CIRCULO;

    CONST Pi = 3.1415;

    VAR RAIO, CIRCUNFERENCIA, AREA: INTEGER;

BEGIN

    RAIO := 10;

    AREA := Pi * (RAIO * RAIO);

    CIRCUNFERENCIA := 2 * Pi * RAIO;

    WRITELN('RAIO= ', RAIO, ' AREA= ', AREA,' CIRCUNFERENCIA= ',            CIRCUNFERENCIA)

END.

 

3.2. VARIÁVEIS

 

Comentamos anteriormente sobre a capacidade dos computadores em lidar com grandes quantidades de cálculos repetitivos envolvendo muitos números. Esta capacidade perderia significado se tivéssemos que lidar com quantidades sempre constantes. Para atender às necessidades dos problemas que, em sua maioria, possuem valores que variam durante o processamento, as linguagens de programação oferecem o conceito de variáveis.

 

3.2.1. CONCEITOS

 

Variáveis são objetos cujos valores podem variar durante a execução de um programa. Cada variável tem um nome único que a distingue das demais variáveis e deve assumir valores sempre com as mesmas características ao longo de um programa. Diz-se, portanto, que cada variável tem um tipo - este tipo deve obrigatoriamente ser declarado em uma declaração de tipo de variável, na parte de declarações do programa PASCAL, antes de sua primeira utilização no programa.

         Cada variável pode ser visualizada como um nome que se dá a uma dada posição da memória do computador: através do nome da variável podemos armazenar um valor nesta posição de memória (quando efetuamos uma atribuição direta ou indireta à variável) ou então recuperar um valor ali anteriormente armazenado (quando efetuamos uma referência a um nome de variável em qualquer outra situação em um programa PASCAL).

         Os nomes das variáveis são escolhidos pelo programador, e como os demais identificadores, devem começar por letra e ser formados apenas por letras e/ou dígitos (0 a 9) e/ou o caráter de sublinhar (_). Aconselha-se utilizar nomes de variáveis significativos que identifiquem bem a quantidade ali armazenada. São exemplos de nomes válidos de variáveis: A, B, X1, SOMA, MEDIA_DE_CONSUMO. Estes dois últimos são mais representativos.

 

3.2.2. DECLARAÇÕES DE VARIÁVEIS

 

         As características das variáveis são descritas para o computador quando é efetuada a declaração do tipo das variáveis. Logo após o cabeçalho do programa, na parte de declarações, incluímos a palavra reservada VAR e a seguir as declarações de tipos das variáveis. Cada declaração de tipo é iniciada por uma lista de variáveis separadas umas das outras por vírgula, seguindo-se o sinal de dois pontos (:), o tipo das variáveis e concluindo com ponto e vírgula (;). Uma variável pode ser de um tipo predefinido ou então de um novo tipo de dado definido pelo usuário.

 

3.3. TIPOS DE DADOS

 

3.3.1. CLASSIFICAÇÃO DOS TIPOS DE DADOS

 

         A linguagem PASCAL oferece várias opções de tipos para manipulação de dados. As três categorias básicas de tipos de dados em PASCAL são: 1) os tipos simples, conhecidos igualmente por tipos escalares e por tipos elementares, que tanto podem ser predefinidos (tais como INTEGER, REAL, BOOLEAN e CHAR) como podem ser definidos pelo próprio usuário (tipos subfaixa e escalar enumerado);2) os tipos estruturados: ARRAY, STRING, SET, RECORD, FILE e TEXT; e3) o tipo apontador.

         Os tipos simples predefinidos são discutidos na seção 3.3.2 e os tipos simples definidos pelo usuário são apresentados na seção 3.3.3.

         Os tipos estruturados ARRAY e STRING são apresentados nos capítulos 6 e 7, respectivamente. Os demais tipos estruturados e o tipo apontador geralmente não são apresentados num primeiro curso de programação e, portanto, não serão abordados neste texto.

 

3.3.2. TIPOS SIMPLES PREDEFINIDOS

 

         A linguagem PASCAL dispõe de tipos predefinidos de dados que podem ser utilizados nas declarações de tipo de variáveis. Apesar de haver pequenas variações de um compilador para outro quanto à quantidade de tipos predefinidos, examinaremos os tipos predefinidos padrão que são os tipos predefinidos mais comumente utilizados: INTEGER, REAL, CHAR e BOOLEAN.

 

O TIPO INTEGER

 

         O tipo INTEGER é um tipo simples predefinido padrão. É o tipo que deve ser empregado para declarar variáveis que armazenarão quantidades inteiras durante o processamento. Este tipo representa o subconjunto de números inteiros de MININT até MAXINT, onde MININT e MAXINT são constantes inteiras cujos valores representam, respectivamente, o menor e o maior inteiros que podem ser armazenados em uma dada máquina.

         As operações aritméticas de adição, subtração e multiplicação são representados por +, - e * respectivamente. A operação de divisão é representada por / quando se deseja um quociente real e por DIV quando se deseja o quociente inteiro (com truncamento da parte fracionária, caso exista).

         Funções predefinidas são subprogramas existentes nos compiladores para a solução de problemas que aparecem com muita freqüência no dia a dia dos programadores. As funções predefinidas que operam com números inteiros variam em quantidade de um compilador para outro: aconselhamos pesquisar o Apêndice 2 que contém uma lista das Funções Predefinidas Padrão e o Manual do Usuário do compilador que estiver sendo utilizado para uma referência completa das funções (incluindo as que não são padrão).

A declaração VAR A, B, X1: INTEGER; informa ao compilador que neste programa as variáveis A, B, e X1 serão utilizadas para armazenar quantidades inteiras.

 

O TIPO REAL

 

         O tipo REAL é um tipo simples predefinido padrão e é utilizado para representar quantidades em ponto flutuante. As operações aritméticas de adição, subtração, multiplicação e divisão de números reais são representados, respectivamente, por +, -, * e /. As funções predefinidas aplicáveis aos números reais variam de compilador para compilador: devem ser consultados o Apêndice 2 que contém uma lista das Funções Predefinidas Padrão e o Manual do Usuário do seu compilador PASCAL para uma referência completa sobre estas funções (inclusive as funções que não são padrão).

A declaração:

 

    VAR SOMA, MEDIA_DE_CONSUMO: REAL;

 

informa ao compilador que neste programa as variáveis SOMA e MEDIA_DE_CONSUMO serão utilizadas para armazenar quantidades reais.

 

O TIPO CHAR

 

         O tipo CHAR é um tipo simples predefinido padrão que consiste de todos os valores do conjunto de caracteres disponível na sua instalação. As variáveis deste tipo conterão sempre um único caracter em cada instante. As funções para operação com caracteres são variáveis de acordo com o compilador: o Apêndice 2 contém uma lista das Funções Predefinidas Padrão. O Manual do Usuário de seu compilador deve ser consultado para uma referência completa às funções predefinidas

A declaração

 

VAR

    LETRA, SIMBOLO: CHAR;

 

informa ao compilador que as variáveis LETRA e SIMBOLO serão utilizadas para armazenar caracteres.

 

O TIPO BOOLEAN

 

         O tipo BOOLEAN é um tipo simples predefinido padrão que é definido como um escalar simples cujos valores são FALSE (falso) e TRUE (verdadeiro). Desta forma, SUCC(FALSE) resulta no valor TRUE, PRED(TRUE) resulta no valor FALSE e tanto PRED(FALSE) como SUCC(TRUE) são indefinidos. As variáveis do tipo BOOLEAN assumirão apenas um desses valores em cada instante e serão utilizadas em comandos condicionais para direcionar o fluxo do processamento.

A declaração

 

    VAR

         ACABOU_DADOS: BOOLEAN;

 

informa ao compilador que a variável ACABOU_DADOS neste programa será utilizada para armazenar um valor lógico (verdadeiro ou falso).

 

3.3.3. TIPOS SIMPLES DEFINIDOS PELO USUÁRIO

 

         A linguagem PASCAL, com os objetivos de melhorar a legibilidade dos programas (facilidade de leitura por parte das pessoas) e facilitar a sua documentação, permite que o usuário defina novos tipos de dados simples pertencentes a duas classes: o tipo subfaixa (ou subintervalo) e o tipo escalar enumerado.

 

O TIPO ESCALAR ENUMERADO

 

         A definição de um tipo escalar enumerado é feita quando o programador deseja deixar explícitos na parte de declarações do programa PASCAL todos os valores que as variáveis daquele tipo podem vir a assumir: isto geralmente é recomendado para tipos que possam assumir um conjunto finito e relativamente pequeno de valores. Também nestes casos a definição de um tipo escalar enumerado visa melhorar a documentação do programa e aumentar sua legibilidade.

         Os tipos escalares enumerados são definidos como conjuntos ordenados de todos os valores válidos para o tipo: a ordem de colocação de qualquer componente dentro do tipo pode ser obtida com o uso da função predefinida ORD(COMPONENTE) que retorna valores entre zero, para o primeiro componente, e N - 1 para o último componente.

         Os operadores relacionais também podem ser aplicados a quaisquer operandos de tipos escalares enumerados, desde que os operandos sejam do mesmo tipo. A ação dos operadores relacionais dependerá da ordem de enumeração dos componentes do tipo que estiver sendo definido. As funções predefinidas PRED(X) e SUCC(X) são igualmente aplicáveis às variáveis do tipo escalar enumerado: o programador deve estar atento ao fato de os valores referentes a PRED(X) quando X é o primeiro componente do tipo escalar enumerado, e SUCC(X) quando X referencia o último componente de um tipo escalar enumerado, serem ambos indefinidos.

         A declaração de um tipo escalar enumerado é feita na parte de declarações do programa PASCAL e obedece à forma geral:

 

    TYPE

         nome_do_tipo = (lista_de_componentes);

 

Onde:

TYPE - é uma palavra reservada - deve ser escrita uma única vez antecedendo todas as declarações de tipos;

nome_do_tipo - é o nome escolhido pelo usuário para identificar o novo tipo de dado - é um identificador válido em PASCAL;

= (igual) - é o símbolo de igualdade - indica que a seguir encontra-se a enumeração dos componentes do tipo;

( ) (parêntesis) - indicam o início e o fim, respectivamente, da enumeração dos componentes do tipo;

lista_de_componentes - é uma lista, ordenada sob algum critério desejado pelo usuário, de todos os componentes possíveis para o tipo declarado.

 

         Um exemplo clássico de utilização de tipo escalar enumerado envolve a declaração de variáveis para representar os dias de uma semana:

 

TYPE

    dias_da_semana = (DOMINGO, SEGUNDA, TERÇA, QUARTA, QUINTA, SEXTA, SABADO);

 

         Neste caso, a avaliação de DOMINGO < SEGUNDA resulta em TRUE, SUCC(TERÇA) resulta em QUARTA, SUCC(SABADO) é um valor indefinido e ORD(QUARTA) resulta no valor inteiro 3. Qualquer variável declarada como sendo do tipo dias_da_semana só poderá assumir valores dentre os que estão enumerados na declaração do tipo. Muitas vezes a utilização de um tipo escalar enumerado ocorre simultaneamente com a utilização de um tipo subfaixa e de outros tipos mais complexos (inclusive os estruturados) para a elaboração de estruturas de dados a critério do usuário.

 

O TIPO SUBFAIXA

 

         O tipo subfaixa é definido pelo usuário para representar uma faixa de valores que as variáveis desse tipo podem assumir. A faixa de valores que um tipo subfaixa pode assumir é sempre um subconjunto de algum outro tipo escalar já definido (pelo usuário ou não), excetuando-se o tipo REAL. A definição de um tipo subfaixa é feita na parte de declarações do programa PASCAL de acordo com a seguinte forma geral:

 

TYPE

    nome_do_tipo = limite_inferior..limite_superior;

 

Onde:

         TYPE - é uma palavra reservada - deve ser escrita uma única vez antecedendo todas as declarações de tipos;

         nome_do_tipo - é o nome escolhido pelo usuário para identificar o novo tipo de dado;

         = (igual) - é o símbolo de igualdade - indica que a seguir encontram-se as especificações do tipo;

         limite_inferior - é o valor mínimo da subfaixa a ser assumido pelo tipo;

         ..(dois pontos) - é o símbolo de faixa;

         limite_superior - é o valor máximo da subfaixa que poderá ser assumido pelo tipo.

 

A declaração TYPE maiúsculas = 'A'..'Z'; idade = 0..150; informa ao compilador que qualquer variável que seja declarada como sendo do tipo maiúsculas só poderá assumir valores que estejam na subfaixa de 'A' até 'Z' e que as variáveis declaradas como sendo do tipo idade só poderão assumir valores na subfaixa de 0 a 150.

         Como um tipo subfaixa é sempre um subconjunto de um outro escalar já existente (o tipo hospedeiro), o tipo subfaixa é compatível com o tipo do qual a subfaixa é subconjunto e todos os operadores deste tipo hospedeiro são aplicáveis ao novo tipo subfaixa. Na declaração apresentada anteriormente, o tipo maiúsculas é compatível com o tipo hospedeiro CHAR e o tipo idade é compatível com o hospedeiro INTEGER.

         É importante observar que caso a definição de um novo tipo de dado seja feita visando uma única declaração de variáveis, podemos omitir esta definição através de uma referência direta quando da declaração da variável. Por exemplo, caso o tipo maiúsculas, declarado anteriormente, fosse utilizado apenas para a declaração de uma variável tal como LETRA_INICIAL e o tipo idade apenas para declarar as variáveis MAIS_JOVEM e MAIS_IDOSO, as declarações (dos tipos e das variáveis) poderiam ser simplificadas para algo como:

 

VAR

    LETRA_INICIAL: 'A'..'Z';

    MAIS_JOVEM, MAIS_IDOSO: 0..150;

 

Da mesma forma como acontecia com as declarações explícitas dos tipos maiúsculas e idade, neste caso, a variável LETRA_INICIAL só poderá assumir valores que estejam incluídos na subfaixa de 'A' até 'Z' e as variáveis MAIS_JOVEM e MAIS_IDOSO só assumirão valores inteiros no intervalo de 0 a 150. A variável LETRA_INICIAL é compatível com o tipo CHAR e pode, portanto, ser manipulada com todos os operadores válidos para o tipo char. O mesmo é válido para as variáveis MAIS_JOVEM e MAIS_IDOSO em relação ao tipo INTEGER e seus operadores.

 

3.4. ATRIBUIÇÕES E EXPRESSÕES ARITMÉTICAS

 

         Antes de ser utilizadas nos cálculos e nos comandos de saída de dados as variáveis devem ter sido declaradas (em uma declaração de tipos) e definidas (através da atribuição de um valor de tipo correspondente ao da variável). A atribuição pode ser feita de forma indireta, através de um comando de entrada de dados; ou de forma direta através de um comando de atribuição (ou simplesmente atribuição).

         No comando de atribuição escreve-se o nome da variável à qual será atribuído o valor, seguido do operador de atribuição (:=) e de uma expressão aritmética cujo valor será computado e atribuído à variável. Uma expressão aritmética é formada por uma constante, uma variável, uma chamada a uma função, ou qualquer combinação de constantes e/ou variáveis e/ou chamadas a funções, unidas por operadores aritméticos.

         Os operadores aritméticos disponíveis em PASCAL são +, -, *, /, DIV e MOD. Apenas o operador MOD ainda não nos é familiar: ele serve para determinar o resto da divisão inteira do primeiro operando pelo segundo. Os operadores em PASCAL possuem uma ordem de precedência, semelhante às regras de precedência dos operadores algébricos, para indicar a seqüência de avaliação das expressões. A ordem de precedência em PASCAL é:

         1. Expressões incluídas dentro de parêntesis;

         2. Operador unário menos ou negação;

         3. Operador NOT;

         4. Operadores multiplicativos: *, /, DIV, MOD, AND;

         5. Operadores aditivos: +, -, OR;

         6. Operadores relacionais: =, <>, <, >, <=, >=, IN.

 

         Quando numa mesma expressão forem encontrados dois ou mais operadores com mesmo nível de precedência, então a expressão será avaliada da esquerda para direita. São exemplos de expressões aritméticas em PASCAL:

 

    A := 0;

    MEDIA := SOMA / QUANTIDADE;

    RESTO := A MOD B;

 

         A Linguagem PASCAL não dispõe de um operador de exponenciação. No entanto, como a Linguagem oferece funções predefinidas padrão (Apêndice 2) para cálculo de Logaritmos Naturais (LN(X)) e de e (EXP(X)), podemos computar exponenciações com auxílio dessas funções. Desta forma, para calcularmos o valor da expressão y = x , por exemplo, primeiro efetuamos algumas transformações: y = x ==> y = e ==> y = e . O valor de y em PASCAL seria obtido com a atribuição Y := EXP(N * LN(X));.

 

3.5. VARIÁVEIS E EXPRESSÕES LÓGICAS

 

         Variáveis lógicas (ou booleanas) são aquelas cujos valores são apenas verdadeiro ou falso. Normalmente são utilizadas com a finalidade de melhorar a legibilidade dos programas pelas pessoas. Seu uso mais freqüente ocorre nas estruturas de controle que serão detalhadas no capítulo 5.

         As expressões lógicas são escritas com o auxílio:

         1) dos operadores relacionais:

                   maior que >;

                   maior ou igual >=;

                   menor que <;

                   menor ou igual <=;

                   diferente <> ou ~= ou != dependendo do compilador;

                   igual a =; e

         2) dos conectivos AND, OR e NOT.

 

O resultado da avaliação de uma expressão lógica será sempre um valor lógico (verdadeiro ou falso). A avaliação de uma expressão lógica é feita na seguinte seqüência:

         1. Expressões incluídas entre parêntesis;

         2. NOT;

         3. AND;

         4. OR.

 

         Conhecendo-se as variáveis A, B, e C do tipo inteiro, com valores 20, 50 e 90, respectivamente, e a variável lógica ACABOU com valor FALSE, podemos determinar o resultado da avaliação de expressões como:

         1)      ACABOU OR (B >= A)

                            ß

                   FALSE OR (50>= 20)

                            ß

                   FALSE OR TRUE Þ TRUE

 

2)      NOT ACABOU AND (C DIV B + 1 = A)

                            ß

NOT FALSE AND (90 DIV 50 + 1 = 2)

                            ß

                   TRUE AND ( 1 + 1 = 2)

                            ß

                   TRUE AND TRUE Þ  TRUE

 

3.6. EXERCÍCIOS PROPOSTOS

 

1. O que é uma constante?

2. Como é feita a definição de constantes em PASCAL?

3. Quais as vantagens da utilização de constantes como permitido em PASCAL?

4. O que é uma variável?

5. Como devem ser formados os nomes de variáveis em PASCAL?

6. Como determinamos o tipo de uma variável em PASCAL?

7. Quais são os tipos simples predefinidos padrão de variáveis em PASCAL?

8. Qual a ordem de precedência para a execução das operações em uma expressão aritmética em PASCAL?

9. Qual a ordem de precedência para a avaliação de uma expressão lógica em PASCAL?

10. As variáveis que aparecem nas expressões abaixo são todas do tipo inteiro. Considerando valores iniciais de 6, 5, 4, 3, 2 e 1 para as variáveis A, B, C, D, E e F respectivamente, determine o valor de cada variável que aparece à esquerda de um comando de atribuição:

         1. G := D + B / E * C;

         2. H := D + B DIV E * C;

         3. I := SQR(SQR(C) + SQR(D));

         4. J := SQRT(SQR(C) + SQR(D));

         5. K := A / (B + C) - D / (E + F) + D DIV E + F;

11. Escreva em PASCAL comandos para avaliar as seguintes expressões algébricas:

         1. a = r

         2. c = 2 r

         3. v = 1/4 (a + b)(b - a)

         4. d = V(x - x ) + (y - y )

         5. e = a +

         6. f = - 3x

12. Escreva um programa em PASCAL para converter 45 graus centígrados em graus Kelvin e Fahrenheit.

13. Escreva um programa em PASCAL para calcular e imprimir os valores das áreas hachureadas nas figuras abaixo, considerando que r = 10cm.

14. Escreva um programa em PASCAL para calcular os rendimentos de uma caderneta de poupança com saldo inicial de R$5.000,00 durante o primeiro trimestre de 1997.

 

Avançar para o Capítulo Anterior     Voltar para o Índice     Avançar para o Próximo Capítulo