ALGORITMOS COM PASCAL

 

Prof. Miguel Jonathan – Dept. Ciência da Computação – IM/UFRJ - 2003

 

CAPíTULO 1

 

 

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:

 

Operadores binários: 

    OU-INCLUSIVO (OU)

    E 

    OU-EXCLUSIVO  (XOU)

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