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