Curso de Pascal
Começando a Programar
Você está em: MarMSX >> Cursos >> Pascal
O objetivo dessa seção é apresentar a estrutura completa de um programa em Pascal, bem como apresentar alguns programas exemplo para que o leitor possa rodar e observar os resultados.
Não é o objetivo ainda a compreensão do funcionamento detalhado das estruturas aqui apresentadas, mas apenas a sua organização dentro do programa. As explicações de cada uma dessas estruturas serão apresentadas nos capítulos seguintes, onde o leitor terá a oportunidade de retornar a esta seção e verificar como cada estrutura se encaixa.
Estruturação do programa em Pascal
Todas as estruturas de um programa em Pascal apresentadas aqui são opcionais, exceto o corpo principal do programa que é obrigatória a presença. Dessa forma, as estruturas opcionais são adicionadas conforme a necessidade do programador.
Estrutura do programa |
Descrição |
program teste; |
Ilustra o nome do programa. Não é necessário. |
type dia = 1..31;
cor =
(azul,amarelo,verde,vermelho);
ficha = record
nome : string[40];
idade : integer;
end;
|
Definição de estruturas do tipo type. |
var fichario : array[1..100] of ficha;
altura : real;
pais : string[20];
narea : integer;
|
Declaração das variáveis globais |
function area_triangulo(base, altura : real) : real;
begin
area := (base * altura) / 2.0;
end; |
Criação de funções. Podem ser criadas
n funções aqui. |
procedure crescimento(var a,b,c : real; x :
real);
var f : integer;
begin
while (a*b*c < x) do
begin
a = a + 0.1;
b = b + 0.3;
c = c + 0.5;
end;
end;
|
Criação de procedures. Podem ser criadas
n procedures aqui. |
begin
fichario[1].nome := "Marcelo";
narea := area(5,2,4);
end.
|
Corpo principal do programa. Gerencia funções e procedures. |
As estruturas do pascal como funções, procedimentos, corpo principal, if, while, do while etc são delimitadas pelas palavras reservadas "begin" e "end" (inicio e fim). Dessa forma, todo código relativo a cada uma dessas estruturas DEVERÁ estar contido dentro dessa limitação. Observe que as funções e procedimentos permitem apenas a declaração de variáveis e tipos fora dessa limitação.
Quando a delimitação de fim é seguida de ponto final ("end."), indica o fim da execução de um programa e é utilizado exclusivamente no corpo principal do programa. Já nas outras estruturas, o fim é sempre seguido de ponto e vírgula ("end;").
Conforme dito anteriormente, a única estrutura obrigatória (e mínima estrutura) é o corpo principal. Assim, pode-se fazer um programa bem simples como o a seguir:
begin
writeln('Olá mundo!');
end.
Os comentários em Pascal são trechos marcados do programa que serão ignorados pelo compilador, no qual servem para introduzir descrições de certas instruções ou até mesmo bloquear momentaneamente trechos do código para depuração.
A caractere abre chave "{" indica o inicio dos comentários e o caractere fecha chave "}" indica o final dos comentários. Exemplos:
begin
writeln('Olá'); { Imprime a mensagem "Olá" }
end.
O trecho em azul é ignorado e nesse caso serve para comentar a instrução "writeln('Olá');"
begin
writeln('Um');
{ writeln('Dois');
writeln('Três'); }
writeln('Quatro');
end.
O trecho em azul é ignorado e nesse caso serve para bloquear as instruções "writeln('Dois');" e "writeln('Três');", resultando no seguinte código:
begin
writeln('Um');
writeln('Quatro');
end.
Exemplos de programas em Pascal
A seguir, serão apresentados alguns programas de exemplo para que o leitor possa ir se familiarizando com o Pascal. O objetivo aqui é apresentar alguns problemas comuns e suas respectivas soluções, sem se prender ainda aos detalhes de cada estrutura apresentada, estruturas essas que serão abordadas nos capítulos seguintes.
Procure principalmente executar cada programa, entender a maneira de como eles são estruturados e seu funcionamento básico.
Problema 1
Fazer um programa que receba as horas do teclado e dê uma saudação de bom dia, boa tarde ou boa noite.
SOLUÇÃO:
var horas : integer;
begin
{ Imprime na tela a mensagem 'Qual a hora? ' }
write('Qual a hora? ');
{ Lê dados do teclado }
readln(horas);
{ Analisa a resposta do usuário }
if (horas >= 6) and (horas < 12) then
writeln('Bom dia.');
if (horas >=12) and (horas < 19) then
writeln('Boa tarde.');
if (horas >=19) or (horas < 6) then
writeln('Boa noite.');
end.
Obs:
1. As chaves indicam um comentário em seu conteúdo e não são levados em consideração (interpretados) pelo compilador Pascal.
2. Em estruturas como if, for etc onde o código interno tenha somente UMA linha, o begin e end podem ser omitidos (são opcionais).
Comentários:
1. Variáveis locais e globais
As variáveis globais são variáveis que podem ser lidas e escritas em qualquer trecho do programa. Elas são declaradas fora de qualquer estrutura. As variáveis globais ocupam espaço na memória, do princípio ao término do programa.
No programa anterior, a variável "horas" é global, pois foi declarada do lado de fora de qualquer estrutura.
As variáveis locais são variáveis que são criadas dentro de estruturas, como funções e procedures. Elas são criadas pela função ou procedure que a contém, e são destruídas assim que se encerra o processamento da sub-rotina. Dessa forma, o espaço de memória que a variável ocupava é liberado. As variáveis locais só podem ser acessadas pela função ou procedure que as criou.
No exemplo a seguir, "x" é uma variável local e somente pode ser acessada de dentro do procedimento "teste". Qualquer tentativa de acessar esta variável de outro procedimento, função ou corpo principal irá causar um erro em tempo de compilação.
procedure teste;
var x : integer;
begin
...
end;
É possível declarar uma variável local com o mesmo nome de uma variável global. Entretanto, a variável local prevalecerá dentro de sua respectiva estrutura. Exemplo:
var x : integer { Global }
procedure teste;
var x : integer; { Local }
begin
x:=8;
printf('Valor de x local: ', x);
end;
begin
x:=5;
teste;
printf('Valor de x global: ', x);
end.
Saída:
Valor de x local: 8
Valor de x global: 5
2. Estrutura de decisão IF
A estrutura IF testa se uma dada condição é verdadeira ou falsa. Caso seja verdadeira a condição, irá executar o trecho de código atrelado a ele. Os testes são sempre feitos no sentido da esquerda para a direita.
Uma observação que deve ser feita é que devemos utilizar parêntesis para eliminar ambiguidades em comparações lógicas. As operações entre parêntesis são realizadas primeiro, sempre partindo do parêntesis mais interno. Exemplos:
if (a=1) and (b=2) then ...
Primeiro testa se a=1, resultando em S e depois se b=2, resultando em R. Ao final, faz o teste lógico S and R.
O capítulo 5 apresenta a estrutura IF em detalhes.
Problema 2
Fazer um programa onde uma função calcula a média de 3 notas fornecidas.
SOLUÇÃO:
var a, b, c : real;
function media(na, nb, nc : real):real;
begin
media := (na+nb+nc)/3;
end;
begin
write('Entre com a nota 1: ');
readln(a);
write('Entre com a nota 2: ');
readln(b);
write('Entre com a nota 3: ');
readln(c);
writeln('A média final é: ',media(a,b,c));
end.
Comentários:
Nesse exemplo, encaixamos uma estrutura do tipo função para nos auxiliar a resolver o problema proposto. Uma função é uma espécie de "caixa preta", onde tem como por objetivo receber dados de entrada, realizar um processamento e fornecer uma resposta.
Qual a utilidade de uma função ou procedimento? Serve para isolar trechos de código que são responsáveis por uma determinada tarefa específica. Além disso, permite que esse trecho seja chamado e executado diversas vezes ao longo do programa, evitando que o mesmo código tenha que ser repetido ao longo do programa (economia de memória).
As funções podem ser portadas para outros programa, eliminando a necessidade de reescrever código no novo programa. Um bom exemplo disso são as rotinas do Lammassaari, que podem ser incorporadas a um programa através da cláusula include (ver capítulo de includes).
A ordem dos parâmetros declarados na função irá relacionar as variáveis passadas no seu chamamento. Assim, o comando media(a,b,c) irá fazer com que a variável local na receba o valor de a, nb o valor de b e nc o valor de c.
function media(na, nb, nc : real):real;
↕ ↕ ↕
media(a, b, c)
A função sempre retorna um valor. Nesse caso quando a chamarmos, devemos armazenar o resultado em uma variável ou utilizar a função como passagem de parâmetro para o chamamento de outra função, como é o caso do programa 2 (parâmetro para a função writeln).
Estrutura básica de uma função:
function nome(parametros):retorno;
Onde:
- nome - é o nome da função. Deve começar por uma letra e não pode haver espaços. Ex: soma, calcula_isto, p2, etc.
- parametros - valores que são passados para a função quando ela for chamada.
- retorno - indica o tipo de dados que será retornado pela função. Para retornar algum valor, coloque dentro da função o nome dela associado a algum valor. Ex: media := 4;
É possível receber diferentes tipos de dados nos parâmetros da função. Para isso, deve-se utilizar o ponto e vírgula ";" para separar os diferentes tipos de dados. Exemplo:
function rotate(zoom, x, y : integer; alfa, beta : real):integer;
O funcionamento das funções e procedimentos é detalhado no capítulo de função, procedimento e recursividade.
Problema 3
Calcule o valor da hipotenusa e a área de um triângulo retângulo, a partir dos valores dos catetos.
SOLUÇÃO:
var cateto_adjacente, cateto_oposto, hipotenusa, area : real;
begin
write('Valor do cateto adjacente: ');
readln(cateto_adjacente);
write('Valor do cateto oposto: ');
readln(cateto_oposto);
{ Calcula }
hipotenusa := sqrt(sqr(cateto_adjacente) + sqr(cateto_oposto));
area := (cateto_adjacente * cateto_oposto)/2.0;
writeln('Valor da hipotenusa: ', hipotenusa);
writeln('Valor da area: ', area);
end.
Saída na tela:
Valor do cateto adjacente: 3
Valor do cateto oposto: 4
Valor da hipotenusa : 5
Valor da area: 6
Comentários:
A função matemática "sqr" calcula o quadrado de um número, enquanto que a função "sqrt" calcula a raiz quadrada de um número.
O próximo capítulo apresenta uma lista com as funções matemáticas do Pascal.
Problema 4
Fazer um procedimento que escreva 100 vezes na tela "EU AMO O MSX".
SOLUÇÃO:
procedure repete_100;
var i : integer;
begin
for i:=1 to 100 do
writeln('EU AMO MSX');
end;
begin
repete_100;
end.
Comentários:
O procedimento se diferencia da função na questão de não retornar valor. Assim como a função, serve para realizar uma determinada tarefa a qualquer momento e quantas vezes for necessário.
Obs: quando uma função ou procedimento não tiver parâmetros de entrada, deve-se omitir os parêntesis, como mostra o programa acima.
  Estruturas de Repetição
O Pascal tem 3 tipos de laços de repetição: FOR, WHILE e REPEAT. Para estas estruturas, além o IF, devemos colocar um begin e um end (com ponto e vírgula) toda vez que o código dentro da estrutura tiver mais que uma linha, conforme visto no exemplo acima.
FOR variável := valor_inicio to valor_fim DO
begin
bla, bla, bla ....
end;
WHILE condição do
begin
bla, bla, bla ...
end;
REPEAT
bla, bla, bla ...
UNTIL condição
A condição é um teste lógico entre uma variável e uma constante ou entre uma variável e outra variável. O teste lógico também aceita a comparação entre constantes, porém irá sempre produzir os mesmos resultados. Exemplos:
- a > 10
- b < c
- idade = 15
- 4 < 3
Obs: Repare que o teste (condição) tem o sinal de igual SEM OS DOIS PONTOS. Nesse caso, o sinal de igual é um teste lógico de igualdade, enquanto que o sucedido pelos dois pontos indica atribuição de valor.
O capítulo 5 irá abordar as estrturas de repetição em detalhes.
Problema 5
Fazer um procedimento que escreva N vezes na tela "EU AMO O MSX".
SOLUÇÃO:
var n : integer;
procedure repete(n : integer);
var i : integer;
begin
for i:=1 to n do
writeln('EU AMO MSX');
end;
begin
write('Repete quantas vezes?');
readln(n);
repete(n);
end.
Comentários:
Esta solução é mais genérica que a solução do problema 4, pois permite com o mesmo código imprimir diferentes quantidades da mensagem, bastando alterar o valor do parâmetro passado.
Apesar de parecer simples a alteração da quantidade de repetições no problema 4, imagine um código mais complexo com diversas informações. Cada vez que um valor relativo a esse procedimento tivesse que ser modificado, todo o código dele teria que ser analisado e modificado nos locais apropriados. Além de ser trabalhoso, poderia gerar erros.
Problema 6
Criar um programa que receba o nome de 10 alunos, os armazene em um vetor (array) e depois imprima todos os nomes.
SOLUÇÃO:
var nome : array[1..10] of string[40];
i : integer;
begin
{ Lê os nomes }
for i:=1 to 10 do
begin
write('Nome do aluno ',i,': ');
readln(nome[i]);
end;
{ Escreve os nomes }
for i:=1 to 10 do
writeln('Nome do aluno ',i,': ',nome[i]);
end.
Comentários:
Um vetor é uma espécie de variável que pode armazenar diversas informações do mesmo tipo, diferente da variável comum que só pode armazenar uma informação.
Um vetor com 10 posições, variando de 1 a 10, foi criado para armazenar o nome dos alunos.
Os colchetes indicam que a variável é um vetor, e o conteúdo dos colchetes indicam qual é a posição dessa lista que será acessada para consulta ou modificação do dado.
Exemplo:
nome_atual := nome[5];
Lê a quinta posição do vetor.
+--+--------+
|1 | Bia |
+--+--------+
|2 | Renata |
+--+--------+
| | ... |
+--+--------+
|5 | Paula | ← nome_atual
+--+--------+
| | ... |
+--+--------+
|10| Pâmela |
+-+---------+
Os vetores e matrizes são detalhados no capítulo 6.