ALGORITMOS
COM PASCAL
Prof. Miguel Jonathan – Dept. Ciência da Computação – IM/UFRJ - 2003
TIPOS E
VALORES:
A cada tipo básico da linguagem corresponde um conjunto de valores possíveis. Os tipos que usaremos e que existem na linguagem Pascal, são inteiro, real, lógico e caractere. Valores podem ser armazenados em variáveis na memória da máquina, e podem ser manipulados na unidade aritmética-lógica.
Tipos de valores
disponíveis:
- números inteiros ex: 10 345 -27
- números reais ex: 2.45 2.450 2.4500 1267.54 (os 3 primeiros representam o mesmo valor)
(e também em notação cientifica: 1.6754 x 103 ou 1.6754E+3 ou 1.6754e3 ou 0.126754E4 )
- valores lógicos (verdadeiro/sim e falso/não)
- caracteres (símbolos) ex: ‘*’ ‘?’ ‘G’ ‘p’ ‘4’
OPERAÇÕES:
Uma operação é realizada com valores, na Unidade Aritmética-Lógica da máquina, e produz como resultado outro valor, que fica armazenado temporariamente nos registros, podendo ser usado em operações subseqüentes.
As operações podem ser unárias ou binárias , dependendo se operam sobre um ou dois valores. Uma operação é formada por um operador e um ou dois operandos (operação unária ou binária). Os operadores possíveis dependem do tipo dos operandos envolvidos.
a) Operações sobre inteiros, com resultado inteiro:
operadores binários: + - * div e mod
+ (soma) ex: 10 + 30 resultado: 40
- (subtração) ex: 30 - 12 resultado: 18
* (multiplicação) ex: 20 * 4 resultado: 80
div (divisão inteira) ex: 30 div 4 resultado: 7
mod (módulo, ou resto da divisão inteira) ex: 30 mod 7 resultado: 2
operador unário: - (produz o negativo do seu operando)
ex: - 7 operador - aplicado sobre o operando 7 produz o resultado –7
-(-7) produz o resultado 7.
b) Operações sobre reais com resultado real:
operadores binários: + - * /
+ (soma) ex: 10.5 + 30.27 resultado: 40.77
- (subtração) ex: 30.2 - 12.8 resultado: 17.4
* (multiplicação) ex: 20.0 * 4.2 resultado: 84.0
/ (divisão real) ex: 30.0 / 4.0 resultado: 7.5
Caso a operação envolva um operando real e um inteiro, o resultado será sempre real:
30 – 2.5 resultado: 27.5
30 / 4.0 resultado: 7.5
O operador / quando usado com 2 operandos inteiros, produz o resultado real: 30/4 resultado: 7.5
c) Operadores relacionais binários, operando sobre inteiros e reais, com resultado lógico:
>
< >= <=
<> =
> (maior) ex: 20 > 30 resultado: falso (não)
< (menor) ex: 20 < 30 resultado: verdadeiro (sim)
>= (maior ou igual) ex: 20 >= 30 resultado: falso 20>=20 resultado: verdadeiro
<= (menor ou igual) ex: 20 <= 30 resultado: verdadeiro
<> (diferente) ex: 20 <> 30 resultado: verdadeiro 30.6 <> 10.78 (verdadeiro)
= (igual) ex: 20 = 20 resultado: verdadeiro
Comparação de caracteres:
O operadores relacionais também podem ser usados para comparar dois valores do tipo caractere. Por exemplo, é correto escrever a operação: ‘d’ > ’b’
Nas linguagens de programação em geral, e em Pascal em particular, essas comparações devem ser interpretadas de forma especial.
A linguagem permite utilizar 256 caracteres diferentes. Os caracteres são colocados em ordem, em uma tabela que começa na posição 0 e vai até 255. Essa tabela é hoje em dia um padrão da indústria, e é conhecida como “tabela ASCII”. A cada posição da tabela corresponde um caractere. O “valor” de cada caractere é na realidade o numero inteiro que representa a posição desse caractere na tabela. O caractere em si deve ser visto apenas como um símbolo, ou um desenho.
A tabela é longa, mas é importante saber alguns detalhes úteis:
- os caracteres das letras maiúsculas estão na tabela em ordem alfabética
- os caracteres das letras minúsculas também.
- os caracteres dos algarismos (‘0’ a ‘9’) seguem a ordem crescente dos números
- as letras acentuadas estão em posições sempre acima de 128
- algumas teclas do teclado correspondem a 2 caracteres seguidos. A tecla ENTER corresponde ao caractere CR (carriage return, ou retorno de carro), da posição 13, seguido do caractere LF (line feed, ou alimentação de linha), da posição 10.
O programador Pascal não precisa saber mais detalhes sobre as posições dos caracteres na tabela para poder programar sem problemas, mas por curiosidade a tabela é mostrada parcialmente abaixo:
TABELA ASCII (American Standard Code for Information Interchange)
|
0 |
. |
|
1 |
. |
|
2 |
. |
|
. |
. |
|
10 |
LF |
|
. |
. |
|
13 |
CR |
|
. |
. |
|
48 |
‘0 |
|
49 |
‘1’ |
|
50 |
‘2’ |
|
. |
. |
|
. |
. |
|
56 |
‘8’ |
|
57 |
‘9’ |
|
. |
. |
|
. |
. |
|
. |
. |
|
65 |
‘A’ |
|
66 |
‘B’ |
|
67 |
‘C’ |
|
. |
. |
|
. |
. |
|
89 |
‘Y’ |
|
90 |
‘Z’ |
|
. |
. |
|
. |
. |
|
97 |
‘a’ |
|
98 |
‘b’ |
|
. |
. |
|
. |
. |
|
121 |
‘y’ |
|
122 |
‘z’ |
|
. |
. |
|
. |
. |
|
133 |
‘à’ |
|
. |
. |
|
. |
. |
|
160 |
‘á’ |
|
|
|
|
etc |
etc |
Então, quando fazemos a comparação de dois caracteres usando operadores relacionais, o que é comparado na realidade são as posições correspondentes na tabela. Como as letras estão em ordem alfabética crescente na tabela, teremos que: ‘D’ < ‘F’ resulta em verdadeiro (na realidade estará sendo feita a operação 68< 70)
Da mesma forma, ‘d’ < ‘f’ também resulta em verdadeiro (será feito 100 < 102 ), ou seja, os operadores < , >, etc, podem ser interpretados como “antes” e “depois” na ordem alfabética. Mas isso só vale para comparação entre letras maiúsculas ou entre letras minúsculas. Se compararmos uma maiúscula com outra minúscula, essa interpretação pode falhar. Por exemplo, ‘D’ < ‘a’ dará verdadeiro (pois 68 < 97), embora a letra ‘D’ esteja alfabeticamente “depois” da letra ‘a’.
Para evitar isso é comum, em programas que comparam palavras alfabeticamente, primeiro converter todas as letras para maiúsculas ou para minúsculas, e só depois fazer as comparações. Mas isso será visto mais adiante.
Outro ponto importante a ressaltar, é que fica difícil comparar letras acentuadas com as demais, para determinar a ordem alfabética relativa. Vemos acima o exemplo de ‘à’ e do ‘á’, em posições muito distantes das demais letras. Infelizmente o padrão da tabela ASCII vale apenas para os primeiros 128 caracteres, e as letra acentuadas estão em uma área da tabela que não é padronizada. Ainda existem em operação muitos ambientes de programação com valores diferentes entre si para as letras acentuadas. Por esse motivo, o uso de letras acentuadas em muitas aplicações é desencorajado. Neste curso evitaremos trabalhar com letras acentuadas.
Também é importante observar que os caracteres que representam os algarismos estão também em posições contíguas na tabela, e seguem a ordem crescente dos números que representam. Assim vemos que, por exemplo, ‘7’ > ‘3’ dará verdadeiro (porque 55 > 51).
d) Operadores lógicos operando sobre valores lógicos, com resultado lógico:
Operador unário:
NÃO
Significados:
OU : para a OU b ser Verdadeiro, basta um dos operandos, ou ambos, ter o valor Verdadeiro.
E: para a E b valer Verdadeiro, ambos os operandos devem valer Verdadeiro
XOU:
para a XOU b valer
Verdadeiro, apenas um dos operandos pode valer Verdadeiro, o outro deve valer
Falso.
NÃO: negação do operando.
A tabela verdade abaixo resume essas operações: (V – verdadeiro, F – falso)
|
x |
y |
x ou y |
x E y |
x XOU y |
não x |
|
F |
F |
F |
F |
F |
V |
|
F |
V |
V |
F |
V |
V |
|
V |
F |
V |
F |
V |
F |
|
V |
V |
V |
V |
F |
F |
Equivalente
em inglês: os operadores lógicos têm nomes
consagrados na língua inglesa, que são usados na grande maioria das linguagens
de programação. Usaremos também a notação em inglês, por ser universal.
|
OU-INCLUSIVO (OU) |
INCLUSIVE-OR (OR) |
|
E |
AND |
|
OU-EXCLUSIVO (XOU) |
EXCLUSIVE-OR (XOR) |
|
NÃO |
NOT |
VARIÁVEIS, CONSTANTES, MEMÓRIA e IDENTIFICADORES
Uma variável consiste de um identificador ao qual é associada uma área de memória onde podem ser armazenados valores de um determinado tipo. Uma variável simples corresponde a apenas um valor. Uma variável composta representa um agrupamento de valores na memória da máquina.
Por exemplo, o identificador nota pode representar uma área da memória onde é armazenado um valor real (a nota de um aluno). Então, se a nota do aluno for, digamos, 8.5, podemos associar o identificador nota com o valor 8.5. Variáveis compostas serão vistas mais adiante.
Uma constante é um identificador que corresponde a uma área da memória onde fica armazenado um valor que não deve ser alterado pelo algoritmo. Por exemplo, o identificador PI pode ser associado a uma área da memória onde será armazenado o valor 3.1416 no inicio de um algoritmo, mas que não deverá ser mais modificado.
Um identificador pode ser formado por letras, algarismos e o caractere sublinhado (‘_’) em qualquer quantidade, desde que não iniciado por um algarismo. Em geral procura-se formar uma palavra que lembre mnemonicamente o significado do valor correspondente no problema que está sendo resolvido pelo algoritmo.
Por exemplo, o identificador salário pode ser associado a um valor real que representa o salário de alguém, e o identificador achou pode ser associado a um valor lógico que indica se a busca por um determinado valor numérico em uma lista foi bem sucedida ou não.
EXPRESSÕES:
Uma expressão é uma fórmula contendo valores, operandos, identificadores de variáveis ou constantes, e outros símbolos permitidos, e que pode ser calculada de modo a ser reduzida a um valor final. No cálculo de uma expressão os identificadores são substituídos pelos valores correspondentes que estão na memória no momento em que a expressão é calculada.
As operações que fazem parte de uma expressão são executadas da esquerda para a direita, respeitando as regras de precedência.
Regras de Precedência:
maior precedência: -
unário, NÃO
*
/ div mod E
+
- (binário) OU
OU-EXCLUSIVO
menor precedência >
< >= <=
<> =
Além disso, se houver parênteses na expressão, terão prioridade de execução as operações que estiverem nos níveis mais internos de parênteses.
Exemplo de expressão: PI + 3 * x – 2.5
onde PI tem o valor 3.1416 e x tem o valor 10, no momento em que a expressão será calculada na Unidade Aritmética Lógica da máquina.
Para reduzir
essa expressão a um valor, os identificadores são inicialmente substituídos
pelos valores correspondentes na memória. A seguir, as operações são executadas
da esquerda para a direita. Como o operador * tem precedência sobre o operador
+, a operação 3 * x será feita primeiro. Como + e – têm a mesma
precedência, a operação de soma será feita a seguir, e finalmente a subtração.
Os valores intermediários resultantes de cada operação são usados como
operandos das operações seguintes.
O gráfico abaixo indica os passos que levam à redução da expressão ao seu valor final:
PI + 3 * x – 3.1
3.1416 + 3 * 10 –
3.1 (subst.
dos valores dos identificadores)
3.1416 + 30 – 3.1 (* tem precedência sobre +)
33.1416 – 3.1 ( + e – tem a mesma precedência, então
a operação mais à esquerda é feita primeiro)
30.0416 (valor final da expressão)
Uso de parênteses permite violar as regras de precedência:
PI + 3 *( x – 3.1)
3.1416 + 3 * (10
– 3.1 )
3.1416 + 3 * 6.9
3.1416 + 20.70
23.8416 (valor final da expressão)
OBS: usar parênteses em excesso não é erro: (3+4) ou ((3+4)) tem o mesmo valor que 3+4
Neste próximo exemplo, a expressão se reduz a um valor lógico. Note que não são necessários parênteses porque a precedência dos operadores relacionais é menor que a dos operadores aritméticos:
PI + 3*x
> x – 2
3.1416 + 3 * 10
> 10 –2
3.1416 + 30 >
10-2
33.1416 > 10 –
2
33.1416 > 8 ( - tem precedência sobre >)
verdadeiro (valor final da expressão)
Expressões bem e mal formadas:
Uma expressão precisa estar bem formada sintaticamente para poder ser calculada. Por exemplo, a expressão abaixo não pode ser calculada, pois exige operações impossíveis:
10 > 20 OU 100 = 40 (expressão mal-formada )
Como o operador OU tem precedência sobre o operador >, a operação 20 OU 100 deveria ser feita primeiro. Mas não é possível fazer essa operação, porque o operador OU só se aplica a operandos lógicos. Existe nessa fórmula um erro de sintaxe (forma gramatical errada). Para corrigir o erro, introduzimos parênteses para forçar que a operação relacional seja feita antes:
(10 > 20) OU (100 = 40)
falso OU falso
falso
Nota: essa observação é válida para a linguagem Pascal. Na linguagem C, por exemplo, os operadores lógicos têm menor precedência que os operadores relacionais. Por isso, em C, a expressão acima sem parênteses estaria correta.
Expressões Triviais:
Uma única constante literal, ou um único identificador de variável, constitui uma expressão trivial, mas é uma expressão legitima:
Por exemplo:
3 é uma expressão trivial, seu valor é 3.
Se x tem o valor 3, a expressão: x é trivial, com valor 3.
Expressões envolvendo funções:
Assim como na Matemática, uma expressão pode conter também o uso de funções com argumentos que são também expressões. Funções serão vistas mais adiante, mas para ilustrar a expressão abaixo usa a função sqrt( ) (de square root – raiz quadrada):
____
x + 3 * sqrt(y-2) equivalente em Matemática a x + 3 Ö y-2