Académique Documents
Professionnel Documents
Culture Documents
EXP(LN(X)*N)
Exemplos:
Expresso Resultado
ABS(-2.5) 2.5
ABS(8) 8
FRAC(5.234) 0.234
TRUNC(2.78) 2
ROUND(2.78) 3
SQR(2) 4
SQR(1.5) 2.25
SQRT(4) 2.0
SQRT(2.25) 1.5
EXP(LN(2)*3) 8
3Apostila de Delphi Marcos Ribeiro
Expresses Lgicas
As operaes lgicas podem ser consideradas afirmaes que sero testadas pelo computador,
endo como
resultado, um valor verdadeiro ou falso. So utilizadas com os operadores relacion
ais e lgicos.
Operadores Relacionais
So usados na comparao de duas expresses de qualquer tipo, retornando um valor lgico (
TRUE ou
FALSE) como resultado da operao.
Operador Operao
= igual
> maior
< menor
>= maior ou igual
<= menor ou igual
<> diferente
Obs: as operaes lgicas s podem ser efetuadas com relao a valores do mesmo tipo.
Exemplos:
Expresso Resultado
1 = 2 FALSE
'A' = 'a' FALSE
5 > 2 TRUE
3 <= 3 TRUE
TRUE < FALSE FALSE
'JOAO' > 'JOSE' FALSE
2 + 3 <> 5 FALSE
'comp' <> 'COMP' TRUE
'11' < '4' TRUE
Operadores Lgicos
So usados para combinar expresses lgicas.
Operador Operao
not no (negao)
and e (conjuno)
or ou (disjuno)
4Apostila de Delphi Marcos Ribeiro
A tabela verdade (abaixo) apresenta o resultado de cada operador lgico, com os va
lores dados para as
expresses lgicas A e B:
A B A and B A or B not A not B
TRUE TRUE TRUE TRUE FALSE FALSE
TRUE FALSE FALSE TRUE FALSE TRUE
FALSE TRUE FALSE TRUE TRUE FALSE
FALSE FALSE FALSE FALSE TRUE TRUE
Prioridade
Em uma expresso lgica, a ordem de avaliao dos operadores segue a tabela abaixo:
Prioridade Operadores
1 NOT
2 AND
3 OR
4 = > < >= <= <>
Como a ordem de precedncia dos operadores lgicos maior que a dos operadores relaci
onais, devem
sempre ser usados parnteses quando se escrever uma expresso lgica complexa. Por exe
mplo:
( A > B ) OR ( B = C )
Declarando variveis
A declarao de uma varivel define o nome e o tipo da varivel. Declaraes de variveis d
m ser
precedidas pela palavra-chave var. As declaraes, junto com a palavra-chave var con
stituem o chamado
bloco var.
Declaraes devem ser agrupadas no incio do programa, ou no incio de uma procedure ou
function (antes
da palavra-chave begin).
O programa (trivial) abaixo mostra um exemplo de declarao de variveis. So declaradas
trs variveis
inteiras (X, Y e Soma). Assume-se que h dois componentes Edit no formulrio, onde so
digitados os dois
valores a serem somados. As funes StrToInt e IntToStr convertem o tipo de String p
ara o Integer (Inteiro)
e de Integer para String, respectivamente. Um caixa de mensagem exibida no final
, com o resultado da
soma.
procedure TForm1.Button1Click(Sender: TObject);
var
X,Y : Integer;
Soma: Integer;
begin
X := StrToInt(Edit1.Text);
Y := StrToInt(Edit2.Text);
Soma := X + Y;
ShowMessage('Soma = ' + IntToStr(Soma));
end;
5Apostila de Delphi Marcos Ribeiro
Declarando constantes
Constantes so usadas em programas para armazenar valores que no podem (ou no devem)
ser
alterados em um programa. Declaraes de constantes devem ser precedidas pela palavr
a-chave const. As
declaraes das constantes, junto com a palavra-chave const constituem o chamado blo
co const.
Ao contrrio das variveis, as constantes devem ter seus valores definidos logo na d
eclarao. Alm disso,
os tipos das constantes no so definidos explicitamente. Eles so deduzidos pelo Delp
hi, de acordo com o
valor definido para cada constante. Veja alguns exemplos:
const
Altura = 100;
Largura = 200;
VelocidadeMaxima = 225.17;
Titulo = Ecossistemas ;
Aqui, as constantes "Altura" e "Largura" so armazenadas com tipo Integer, "Veloci
dadeMaxima" com tipo
Real (ou Double) e "Titulo" com tipo String.
Note como usado o smbolo "=" para definir os valores para as constantes e no o smbo
lo de atribuio:
":=".
Comentrios
Um comentrio usado para aumentar a clareza de um programa, embora no seja analisad
o pelo
computador.
Comentrio Simples para uma nica linha: //
Comentrio de Mltiplas linhas: { }
Ex:
{
************** PROGRAMA REAJUSTA SALRIO *****************
Finalidade.......: Calc. o reajuste de um salrio em 20%
Verso...........: 1.0.1
ltima Alterao.: 12/02/2008
***********************************************************
}
Program REAJUSTE_SALARIO;
{
Uses
Crt;
Const
IND = 0.20; //indice do reajuste}
Var
SAL_ATUAL, //salario atual
SAL_NOVO, //novo salario
AUMENTO: Real; //valor do aumento
Begin
{leitura do salario atual}
write('Digite o salario atual: ');
readln(SAL_ATUAL);
{calculo do reajuste}
AUMENTO := SAL_ATUAL * IND;
SAL_NOVO := SAL_ATUAL + AUMENTO;
{exibicao do resultado}
writeln('Novo Salario = ',SAL_NOVO:10:2);
End.
6Apostila de Delphi Marcos Ribeiro
Formato de Programa Pascal
Pascal uma linguagem altamente estruturada que possui uma rigidez definida, embo
ra sua estrutura de
programa seja flexvel. Cada seo ou parte de um programa em Pascal deve aparecer num
a seqncia
apropriada e ser sistematicamente correta, seno ocorrer um erro.
Por outro lado, no Pascal no h regras especficas para o uso de espao, linhas quebrad
as, requisies e
assim os comandos podem ser escritos no formato livre em quase todos os estilos
em que o programador
deseja utilizar.
Um programa escrito em Pascal tem o seguinte formato:
PROGRAM <identificador>;
<bloco>.
O <bloco>, por sua vez, est dividido em seis reas, onde somente a ltima obrigatria e
devem obedecer
a seqncia abaixo. So elas:
rea de declarao de uso de unidades
rea de declarao de tipos
rea de declarao de constantes
rea de declarao de variveis
rea de declarao de procedimentos e funes
rea de comandos
Declarao de uso de unidades
Um programa Object Pascal pode fazer uso de algumas unidades padro que esto disponv
eis no Sistema,
tais como: SysUtils, Windows, DOS, PRINTER, GRAPH, etc.
A rea de declarao de uso de unidades possui o seguinte formato:
USES <unidade> , ... , <unidade> ;
EXEMPLO:
USES SysUtils;
Declarao de Tipos
Serve para definirmos novos tipos e estruturas de dados. No detalharemos esse tpic
o agora por ser
assunto dos prximos captulos.
Ex:
type
TDiaUtil = (Segunda, Terca, Quarta, Quinta, Sexta);
TFabricante = (Chevrolet, Ford, Volkswagen);
TSexo = (Masculino, Feminino);
7Apostila de Delphi Marcos Ribeiro
Declarao de Procedimentos e Funes
Nesta rea so definidos os procedimentos e funes utilizados pelo programa. Tambm um a
sunto que
ser detalhado mais adiante.
Ex:
function Dobro1(Numero: Integer): Integer;
begin
Dobro := Numero*2;
end;
function Dobro2(Numero: Integer): Integer;
begin
Result := Numero*2;
end;
rea de Comandos
nesta rea onde inserido o algoritmo do programa. Os comandos so separados entre si
pelo
delimitador ponto-e-vrgula. A forma geral :
Begin
<comando> ;
... ;
<comando>
End
8Apostila de Delphi Marcos Ribeiro
Tipos de Dados
Tipos Simples
O tipo declarado para uma varivel define o conjunto de valores permitidos para aq
uela varivel. H uma
grande quantidade de tipos disponveis em Object Pascal. H vrios tipos muito parecid
os entre si, que so
usados apenas para manter compatibilidade com verses anteriores da linguagem Pasc
al. Abaixo listamos
os tipos mais comumente usados.
Nmericos
Inteiros
So caracterizados como tipos inteiros, os dados numricos positivos ou negativos. E
xcluindo-se destes
qualquer nmero fracionrio.
Ex: 0, -156, 10, 234, -80
Tipos Mnimo Mximo Tamanho
byte
Integer -2.147.483.647 2.147.483.647 4
Cardinal 0 4294967295 4
Shortint -128 127 1
Ex:
Var
Nome: String[10];
Begin
Nome := MARCOS ;
End;
Como as variveis strings longas so ponteiros, duas ou mais delas podem referenciar
o mesmo valor, sem
consumir memria adicional. O compilador explora isto para conservar os recursos e
executar tarefas de
forma mais rpida. Se o contador de referncia de uma string chegar a zero, a sua me
mria
11
MEMRIA
10 6 M A R C O S
HEAP
Nome
PILHAApostila de Delphi Marcos Ribeiro
automaticamente liberada do heap.
Registros
Muitas vezes precisa-se criar algum tipo de varivel que armazene informaes de tipos
de dados diferentes
numa nica estrutura, e o vetor no supre essas necessidades. para isso que existe a
estrutura de dados
esttica registro.
Um registro composto por elementos de dados ou por outras estruturas que no sejam
necessariamente
do mesmo tipo. Cada elemento de um registro conhecido como campo.
Para se declarar uma varivel do tipo registro em Pascal, usa-se a sintaxe:
Var
NomeDoRegistro: Record
Campo1: TipoDeDado;
Campo2: TipoDeDado;
CampoN: TipoDeDado;
End;
Ex:
Var
Funcionario: Record
Nome : String[60];
Endereco: String[50];
Salario : Real;
Idade : Byte;
End;
O tamanho total de uma varivel registro na memria ser o somatrio da quantidade de by
tes que cada
campo (que pode ser de elementos ou de estruturas de dados) ocupa na memria. A va
rivel Funcionario,
por exemplo, ocupar 119 bytes consecutivos na memria.
Para se atribuir valores nos campos referentes aos dados de um funcionrio, devemo
s utilizar as seguintes
notaes:
Funcionario.Nome := Manoel da Silva ;
Funcionario.Endereco := Avenida Maracan, 524 ;
Funcionario.Salario := 1597.00;
Funcionario.Idade := 29;
ou
with Funcionario do
Begin
Nome := Manoel da Silva ;
Endereco := Avenida Maracan, 524 ;
Salario := 1597.00;
Idade := 29;
End;
12Apostila de Delphi Marcos Ribeiro
Vetores
Arrays
O vetor uma estrutura de dados esttica e ordenada, com elementos do mesmo tipo. No
pode
armazenar numa posio um valor booleano e noutra um caractere, e nem aumentar de ta
manho no
momento da execuo de um programa. A definio de um vetor em Pascal feita da seguinte
maneira:
NomeDoVetor: array[ndiceMnimo..ndiceMximo] of TipoDeDado;
Ex:
var
Nomes : array[1..100] of String;
Salarios: array[1..50] of Real;
Meses : array[1..12] of integer
Vetor : array[-10..10] of array[1..5] of real;
Aqui, a varivel "Nomes" uma seqncia de 100 Strings e "Salarios" uma seqncia de 50
ores do
tipo Real.
Os elementos de um array so indexados: para acessar um valor de um array, digite
o nome do array,
seguido do ndice entre colchetes. Por exemplo: Nomes[32]. O ndice pode ser qualque
r expresso que
tenha como resultado um valor inteiro.
O exemplo a seguir declara um array "quadrados" com 100 inteiros e depois preenc
he esse array com os
quadrados dos nmeros de -50 a 250:
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
Quadrados: array[1..100] of Integer;
begin
for I := -50 to 250 do
Quadrados[I] := I*I;
end;
Tipos de Dados definidos pelo usurio
Tipos enumerados
A declarao de um tipo enumerado lista diretamente todos os valores que uma varivel
pode conter. Voc
define novos tipos usando a palavra-chave type, que deve ser colocada antes das
definies dos tipos (tal
como var e const). O bloco type deve ser posicionado antes dos blocos var e cons
t. Veja alguns
exemplos:
type
TDiaUtil = (Segunda, Terca, Quarta, Quinta, Sexta);
TFabricante = (Chevrolet, Ford, Volkswagen);
TSexo = (Masculino, Feminino);
Depois de definir os novos tipos, voc pode us-los normalmente nas declaraes das variv
eis, como se
fossem tipos predefinidos. Veja exemplos de declaraes que usam os tipos definidos
acima:
var
DiaInicial, DiaFinal: TDiaUtil;
Fab : TFabricante;
Sexo: TSexo;
13Apostila de Delphi Marcos Ribeiro
Nesse caso, por exemplo, a varivel Fab s pode ter trs valores diferentes. Qualquer
valor diferente de "Chevrolet", "Ford", ou
"Volkswagen" no permitido.
Voc atribui valores a uma varivel de tipo enumerado normalmente. Veja alguns exemp
los:
Fab := Ford;
Sexo := Masculino;
DiaDaSemana := Terca;
Note como no so usadas aspas para os valores. Isso acontece porque os valores de u
m tipo enumerado
so armazenados como valores inteiros, na seqncia em que so definidos (comeando a part
ir de zero).
Para o tipo TFabricante, por exemplo, temos Ford = 0, Chevrolet = 1 e Volkswagen
= 2. O uso de tipos
enumerados em vez de inteiros pode tornar um programa muito mais legvel.
Tipos de intervalo (Subrange)
Os tipos de intervalo so seqncias de valores dos tipos Boolean, Char, Integer, ou d
e tipos enumerados.
Tipos de intervalo so teis quando necessrio limitar uma varivel a um intervalo contn
o de valores,
como de 1 a 100, ou de "A" a "Z". Veja a seguir exemplos de definies de tipos de i
ntervalo:
type
TGraus = 0..360;
THoraValida = 0..23;
TMaiuscula = A .. Z ;
var
Hora : THoraValida;
Angulo: TGraus;
No exemplo, a varivel "hora" s pode estar entre 0 e 23 e a varivel "angulo" deve es
tar entre 0 e 360.
Quando uma varivel e definida com um tipo de intervalo, o Delphi verifica, durant
e a compilao, as
alteraes nesta varivel e gera erros de compilao quando os limites do intervalo so vio
ados. O seguinte
exemplo gera um erro de compilao, na linha destacada.
procedure TFormTesteRange.Button1Click(Sender: TObject);
type
TGrau = 0..360;
var
Temp: TGrau;
begin
for Temp := 0 to 720 do {Erro de compilao!}
begin
... {cdigo omitido}
end;
end;
A mensagem de erro gerada "Constant expression violates subrange bounds", indica
ndo que os limites do
intervalo foram violados (a varivel Temp passaria do limite, 360, no loop for).
No caso anterior, o Delphi pde detectar o erro, porque foram usados valores const
antes para a varivel.
Quando so usadas expresses mais complexas (clculos por exemplo), o Delphi s pode det
ectar o erro
em tempo de execuo. O exemplo a seguir passaria na compilao, mas a linha destacada g
eraria uma
exceo do tipo ERangeError (Temp receberia o valor 400, maior que o mximo permitido
pelo tipo Tgrau:
360).
14Apostila de Delphi Marcos Ribeiro
r aparece
esperando a digitao dos trs valores que devem ser separada por, pelo menos, um espao
em branco.
16Apostila de Delphi Marcos Ribeiro
3.5 ser armazenado na varivel NOTA1, o 7.0 em NOTA2 e o 8.2 em NOTA3.
2) Se o programa deve solicitar o nome e o salrio de um funcionrio teramos:
readln (NOME);
readln (SALRIO);
...
Sada
Um comando de sada serve para que o programa mostre ao usurio os resultados deseja
dos. A unidade de
sada padro o monitor de vdeo, podendo ser tambm a impressora ou uma memria auxiliar
omo o
disco.
Considerando a unidade de sada padro, o monitor de vdeo, o comando seria:
WRITE (<expresso-1>,...,<expresso-n>) ...
ou ...
WRITELN (<expresso-1>,...,<expresso-n>)
Com WRITE o cursor permanece na mesma linha aps a execuo do comando; com WRITELN o
cursor
muda para a prxima linha.
EXEMPLO: A:=1; B:=2;
writeln ('Soma de ',A,' e ',B,' = ',A+B);
No caso de variveis do tipo REAL os valores so mostrados na notao exponencial, num c
ampo de 16
posies, a menos que uma formatao seja especificada.
EXEMPLO: MEDIA := (8.0 + 2.0) / 2
writeln (MEDIA); {sada ?? 5.0000000000E+00}
writeln (MEDIA:5:2); {sada ?? 5.00}
Na formatao, se a varivel for real especificamos o total de posies ocupadas e a quant
idade de casas
decimais . Se inteira, s o total de posies.
Se desejarmos que a sada seja atravs da impressora e no do monitor de vdeo, devemos
especificar no
comeo da lista da sada o parmetro LST e a unidade PRINTER com o USES.
EXEMPLO: Uses PRINTER;
:::
writeln (LST, 'Media = ', MEDIA:5:2);
17Apostila de Delphi Marcos Ribeiro
No instante da solicitao de dados, podemos usar junto com o READ ou READLN um coma
ndo de sada
com a finalidade de emitir mensagens que orientem o usurio na digitao dos dados.
EXEMPLOS: writeln('Digite o Nome:');
readln(NOME);
writeln('Digite as 3 Notas:');
readln(NOTA1,NOTA2,NOTA3);
writeln('Digite o salrio do funcionrio:');
readln(SALARIO);
18Apostila de Delphi Marcos Ribeiro
Controle de fluxo
Os programas mostrados at aqui no fazem nada alm de definir novos tipos, declarar v
ariveis e alterlas. Para que programas realmente "faam alguma coisa", eles devem ser capazes de
tomar decises de
acordo com as entradas do usurio, ou repetir comandos, at que uma certa condio seja
satisfeita. So
var
Dividendo, Divisor, Resultado: Real;
begin
Dividendo := StrToFloat(Edit1.Text);
Divisor := StrToFloat(Edit2.Text);
if Divisor = 0 then
begin
Color := clRed;
ShowMessage('Divisor invlido');
end
else
begin
Color := clSilver;
Resultado := Dividendo/Divisor;
ShowMessage('Resultado = ' + FloatToStr(Resultado));
end;
end;
Note os dois blocos de comandos: um para o if-then e outro para o else. O progra
ma calcula a diviso de
dois valores do tipo Real (lidos a partir de dois componente Edit). Se o divisor
for zero, o primeiro bloco do if
executado: o formulrio muda para vermelho e uma mensagem exibida. Se o divisor no
for zero, o
segundo bloco (depois do else) executado, mudando a cor do formulrio para cinza.
As funes StrToFloat e FloatToStr convertem de Strings para nmeros reais e de nmeros
reais para
Strings, respectivamente.
Note como o end depois do primeiro bloco no seguido de ponto-e-vrgula (;). Essa um
a regra
obrigatria da linguagem Object Pascal: um end antes de um else nunca deve ser seg
uido por ";". Somente
o ltimo end do comando if deve terminar com ponto-e-vrgula.
20Apostila de Delphi Marcos Ribeiro
Aninhando comandos if
Muitas vezes, um programa deve decidir entre mais de duas opes. Para isso, pode-se
usar comandos if
aninhados (um if dentro de outro). Veja um exemplo:
procedure TForm1.Button1Click(Sender: TObject);
var
Nota: Real;
begin
Nota := StrToFloat(Edit1.Text);
if nota < 5.0 then
ShowMessage('Reprovado por mdia')
else
if (Nota >= 5.0) and (Nota < 7.0) then
ShowMessage('Aprovado na final')
else
if Nota > 8.5 then
ShowMessage('Aprovado com excelncia')
else
ShowMessage('Aprovado simplesmente')
end;
O exemplo l uma nota digitada pelo usurio e mostra uma mensagem que varia de acord
o com o valor da
nota. Acompanhe o fluxo do programa: se a nota for menor que 5, a primeira mensa
gem exibida; caso
contrrio (qualquer valor maior ou igual a 5), o programa checa a segunda condio: se
a nota estiver entre
5 e 7, a segunda mensagem exibida. Se no, o programa verifica se a nota maior que
8.5 e, se for,
mostra a terceira mensagem. A mensagem depois do ltimo else s exibida se nenhuma d
as condies
anteriores for verdadeira (isso acontece se a nota estiver entre 7 e 8.5).
NOTA: no programa acima foi usada a palavra chave and para criar uma condio mais c
omplexa. H mais
duas palavras-chaves semelhantes: or e not. Pode-se usar qualquer combinao de not,
and e or para
criar novas condies. Lembre-se, entretanto de usar parnteses para agrupar as condies.
Os parnteses
usados no programa anterior, por exemplo, so todos obrigatrios.
A estrutura case
Quando necessrio decidir entre muitas opes em um programa, a estrutura case da ling
uagem Object
Pascal em geral mais clara e mais rpida que uma seqncia de ifs aninhados. Uma estru
tura case s
pode ser usada com valores ordinais (inteiros, caracteres, tipos de intervalo e
tipos enumerados). Na
estrutura case uma varivel comparada com vrios valores (ou grupos de valores) e o
comando (ou bloco
de comandos) correspondente executado.
Veja a seguir um exemplo simples, que mostra mensagens diferentes, de acordo com
o nmero entrado em
um Edit.
procedure TForm1.Button1Click(Sender: TObject);
var
Numero: Integer;
begin
Numero := StrToInt(Edit1.Text);
case Numero of
1, 2, 3, 5, 7 :
begin
ShowMessage('Nmero primo menor que 10');
Color := clBlue;
21Apostila de Delphi Marcos Ribeiro
end;
4, 6, 8 : ShowMessage('Nmero par menor que dez');
9 : ShowMessage('Nmero mpar menor que dez');
10..1000 : ShowMessage('Nmero entre 10 e 1000');
else
ShowMessage('Outro nmero');
end; // final do case
end; // final da procedure
Uma estrutura case deve ser terminada com end e pode ter uma parte opcional else
. Os comandos depois
do else s so executados se a varivel no for igual a nenhum dos valores especificados
(se no houver a
parte else, a estrutura case pulada inteiramente). No exemplo acima, a mensagem
"Outro nmero" s
mostrada se o valor da varivel "numero" for maior que 1000 ou menor que 1.
22Apostila de Delphi Marcos Ribeiro
Usando loops
Os loops ("laos") so estruturas usadas para repetir vrias vezes sequncias de comando
s. H trs tipos
de loops em Object Pascal. O loop for usado para realizar um nmero fixo de repeties
. Os loops while
e repeat repetem um bloco de comandos at que uma condio se torne falsa ou verdadeir
a,
respectivamente.
O loop for
O loop for o mais rpido e mais compacto dos trs tipos de loops. Esse loop usa um c
ontador, uma
varivel inteira que aumentada (incrementada) automaticamente cada vez que o loop
executado. O
nmero de repeties do loop for fixo. Ele depende somente do valor inicial e do valor
final do contador,
que so definidos no incio do loop. Veja um exemplo:
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
Numero: Integer;
begin
Numero := StrToInt(Edit1.Text);
for I := 1 to 50 do
ListBox1.Items.Add(IntToStr(Numero*I));
end;
Este programa mostra os primeiros 50 mltiplos do nmero digitado em um Edit. Os mlti
plos so
adicionados a um ListBox. O loop for usado aqui contm um nico comando. Por isso no
necessrio
usar begin e end.
O loop while
O loop while um loop mais verstil que o for, embora um pouco mais complexo. O loo
p while repete um
comando, ou um bloco de comandos, at que a condio especificada se torne falsa. O nme
ro de
repeties no preestabelecido como no loop for.
No exemplo a seguir, o valor digitado em um Edit lido, convertido e colocado em
uma varivel "x". Em
seguida, subtrado 10 do valor de "x" e adicionado o resultado (convertido em um s
tring) a um ListBox,
repetindo o processo at que "x" seja menor ou igual a 0.
procedure TForm1.Button1Click(Sender: TObject);
var
x: Integer;
begin
x := StrToInt(Edit1.Text); {Ler valor inicial para x}
ListBox1.Items.Clear; {Limpar a lista de valores}
while x > 0 do
begin
x := x - 10;
ListBox1.Items.Add(IntToStr(x));
end;
end;
No loop while, a condio testada no incio de cada repetio. Quando a condio falsa,
rama sai
do loop e executa o comando imediatamente depois. Se a condio testada for verdadei
ra, o loop
23Apostila de Delphi Marcos Ribeiro
executado novamente.
Note que possvel que os comandos de um loop while no sejam executados nenhuma vez.
Isso
acontece quando a condio falsa j na entrada do loop. No programa acima, por exemplo
, um valor
inicial negativo para a varivel "x" faria com que o while fosse pulado inteiramen
te na primeira vez.
Outra caracterstica importante do loop while, que a condio usada no loop deve se to
rnar falsa em
algum momento. Caso contrrio, o loop executado para sempre. O programa entra em u
m "loop infinito".
Na verdade, qualquer programa que use repeat pode ser convertido em um programa
usando while,
fazendo-se mudanas semelhantes s mostradas aqui. O loop repeat apenas uma conveninc
ia, que
pode algumas vezes tornar o cdigo mais simples.
O comando break
O comando break usado para sair imediatamente de um loop (while, for ou repeat).
Veja um exemplo
simples:
var
A,B: array[1..1000] of Integer;
i: Integer;
...
for i:= 1 to 1000 do
if A[i] <> B[i] then break;
if i = 1000 then
ShowMessage('Todos os elementos so iguais')
else
ShowMessage('O elemento com ndice ' + IntToStr(i) + '
diferente');
...
O exemplo compara os elementos de dois arrays A e B, de 1000 elementos cada um (
o clculo para os
valores dos arrays no mostrado). Quando encontrada a primeira diferena nos arrays,
o comando
break interrompe o loop for imediatamente e os outros elementos dos arrays no so c
hecados. Se todos
os elementos forem iguais, o valor da varivel i no final do loop ser 1000 e a prim
eira mensagem
mostrada. Se o loop for quebrado antes de terminar, com o comando break, o valor
de i ser menor que
1000 e a segunda mensagem ser mostrada.
25Apostila de Delphi Marcos Ribeiro
Procedures e functions
A linguagem pascal permite que possamos declarar trechos de cdigo fora do program
a principal e
associados a um identificador que podem ser executadas sempre que invocados. Cha
maremos estes
trechos de cdigo por mdulos ou rotinas.
Uma das tcnicas mais utilizadas e tida como vantajosa na confeco de programas grand
es a modularizao.
Consiste em dividir o programa em diversos mdulos ou subprogramas, de certa forma
independentes uns dos outros. Existe um mdulo que o principal, a partir do qual so
chamados os outros
mdulos, esse mdulo recebe o nome de programa principal, enquanto que os outros so c
hamados de
subprogramas.
Os principais motivos para se usar rotinas so:
1. Evitar codificao: trocar certos trechos de programas que se repetem por chamada
s de apenas uma
rotina que ser codificada apenas uma vez.
2. Modularizar o programa, dividindo-o em mdulos (rotinas) logicamente coerentes,
cada uma com funo
bem definida. Isto facilita a organizao do programa, bem como o entendimento dele.
No sistema Turbo Pascal, existem dois tipos de subprogramas, a saber:
- Procedures (procedimentos)
- Functions (funes)
Procedures
A procedure como se fosse um programa. Ela tem a estrutura praticamente igual a
de um programa, como
veremos mais adiante. A procedure deve ser ativada(chamada) pelo programa princi
pal ou por uma outra
procedure, ou at por ela mesma.
Uma procedure tem praticamente a mesma estrutura de um programa, ou seja, ela co
ntm um cabealho,
rea de declaraes e o corpo da procedure. Na rea de declaraes, podemos ter as seguinte
subreas:
Const - Type - Var - Procedures - Functions
Devemos salientar que tudo que for declarado dentro das subreas s ser reconhecido d
entro da procedure.
Mais para frente, voltaremos a falar sobre isso.
Sintaxe das procedures
A sintaxe para uma procedure a seguinte:
procedure NomeDaProcedure(param1, param2, ...:Tipo1; param1,...:tipo2;
...);
type
{definies de tipos}
var
{declaraes de variveis }
const
{definies de constantes}
begin
{ corpo }
end;
26Apostila de Delphi Marcos Ribeiro
Ex:
Program Exemplo_1; (* cabealho do programa *)
Procedure linha; (* cabealho da procedure linha *)
Begin (* corpo da procedure linha *)
for i:=1 to 80 do
write('-');
End;
End;
Var
i : integer; (* subrea Var da procedure linha *)
Begin (* corpo do programa principal *)
linha; (* ativao da procedure linha *)
writeln('teste');
linha; (* ativao da procedure linha,novamente *)
End.
Funes
As funes so muito parecidas com as procedures. A principal diferena que o identifica
dor de uma funo assume o valor de retorno da funo. Uma funo deve sempre retornar um valor e em Turb
Pascal,
este valor retornado no nome da funo.
Para functions, a sintaxe praticamente idntica. A nica diferena que o tipo do valor
retornado deve ser
especificado no final da primeira linha.
function nome da function (param1, param2, ...:tipo1; param1,...:tipo2;
...): tipo de retorno;
type
{definies de tipos}
var
{declaraes de variveis }
const
{definies de constantes}
begin
{corpo}
end;
A primeira linha, chamada de cabealho, deve sempre terminar com ";". Os parmetros,
se existirem,
devem ter seus tipos especificados e devem ser separados por vrgulas. Parmetros do
mesmo tipo podem
ser agrupados; esses grupos devem ser separados por ";".
Depois do cabealho, vm os blocos de declarao type, var e const (no necessariamente ne
ssa ordem).
Todos estes so opcionais, pois a procedure ou functions pode no precisar de nenhum
a varivel alm das
especificadas nos seus parmetros. Em seguida, vem o bloco principal (ou corpo) da
procedure, delimitado
por begin e end. neste bloco que fica o cdigo executvel da procedure.
Definindo o valor de retorno de uma function
O valor retornado por uma function pode ser definido de duas maneiras: atribuind
o um valor para o nome da
function, ou alterando a varivel especial Result. As duas funes a seguir so exatamen
te equivalentes:
27Apostila de Delphi Marcos Ribeiro
function Dobro1(Numero: Integer): Integer;
begin
Dobro := Numero*2;
end;
function Dobro2(Numero: Integer): Integer;
begin
Result := Numero*2;
end;
Entendendo parmetros
Os parmetros so variveis passadas para as procedures e functions (rotinas). Os parme
tros de uma
rotina so opcionais. So comuns rotinas (principalmente procedures) sem nenhum parme
tro.
Quando so usados parmetros, estes podem ser passados por valor ou por referncia. A
forma como os
parmetros so passados definida no cabealho da rotina.
Quando uma varivel passada por valor, a rotina recebe apenas um cpia da varivel. A
varivel passada
se comporta como uma varivel local. Alteraes realizadas na varivel no tm efeito depoi
da rotina
terminar (ou retornar). A passagem por valor o tipo padro de passagem de parmetros
na linguagem
Object Pascal.
Quando uma varivel passada por referncia, a rotina recebe uma referncia varivel pas
ada ou, em
outras palavras, a prpria varivel. Com esse tipo de passagem de parmetros, a rotina
pode alterar
diretamente a varivel passada. Para especificar a passagem por referncia, use a pa
lavra-chave var antes
do nome do parmetro, no cabealho da rotina.Veja um exemplo que usa os dois tipos d
e passagem de
parmetros:
procedure Descontar(Taxa: Real; var Preco: Currency);
begin
Preco := Preco - Preco*(Taxa/100);
end;
Esta procedure recebe dois parmetros: Taxa e Preco. O parmetro Taxa passado por va
lor. O valor de
Taxa pode ser alterado dentro da procedure, mas as alteraes no tero efeito depois de
a procedure
retornar.
O parmetro Preco passado por referncia (usando-se a palavra var antes do parmetro).
Preco
alterado dentro da procedure e essa alterao permanente.
Chamando procedures e functions
Depois de definir uma procedure ou function, voc pode cham-la diretamente no seu cd
igo, em qualquer
lugar da Unit em que foi definida.
Para chamar uma procedure ou function, basta especificar o seu nome e valores pa
ra seus parmetros (se
houver). O seguinte trecho de cdigo mostra como chamar a procedure Descontar (def
inida acima) para
realizar um desconto de 10% sobre um preo p. (O valor de p no final ser 450.0).
...
p := 500.0;
Descontar(10, p);
...
28Apostila de Delphi Marcos Ribeiro
Onde criar procedures e functions
H regras para o posicionamento das procedures no cdigo: as procedures devem ser co
locadas somente
depois da parte implementation da Unit (veja a seguir), depois das declaraes das v
ariveis globais.
O exemplo a seguir usa a procedure Descontar e uma variao da function Dobrar, dos
exemplos
anteriores. Os valores de cem preos, armazenados no array Precos, so alterados no
evento OnClick do
componente Button1. (O programa, apesar de completo, foi mantido deliberadamente
simples, para ilustrar
melhor os conceitos envolvidos).
{Cdigo inicial da Unit}
...
implementation
var
Precos: array[1..100] of Currency;
procedure Descontar(Taxa: Double; var Preco: Currency);
begin
Valor := Preco - Preco*(taxa/100);
end;
function Dobrar(Preco: Currency): Currency
begin
Result := Preco*2;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
// Descontar em 25% os primeiros 20 produtos...
for i := 1 to 20 do
Descontar(25, Precos[i]);
//...descontar em 50% os prximos 30...
for i := 21 to 50 do
Descontar(50, Precos[i]);
//...e dobrar o preo dos 50 produtos restantes
for i := 51 to 100 do
Precos[i]:= Dobrar(Precos[i]);
end;
end.
29Apostila de Delphi Marcos Ribeiro
Entendendo o cdigo das Units
As Units contm praticamente todo o cdigo de um aplicativo no Delphi. As Units gera
lmente so
aplicativo. Essa parte geralmente usada para realizar "operaes de limpeza", como r
ecuperar memria e
outros recursos, ao final da execuo do aplicativo.
31Apostila de Delphi Marcos Ribeiro
Trabalhando com Excees
As excees so um mecanismo poderoso para lidar com erros nos seus programas. O uso d
e excees
permite uma separao entre o cdigo normal de um programa e o cdigo usado para lidar c
om erros que
podem surgir.
Quando ocorre um erro em um programa, o Delphi levanta uma exceo. Se uma exceo que f
oi levantada
no for tratada, o programa interrompido e mostrada uma caixa de dilogo com uma des
crio da
exceo. Uma exceo no-tratada pode causar danos aos seus dados, deixar o programa em um
a
situao instvel, ou at levar o programa a "travar".
Para evitar que isso acontea, voc deve tratar as excees, protegendo blocos de cdigo q
ue contenham
comandos que possam causar erros. Para proteger um bloco de cdigo cerque-o com as
palavras-chave try
e end. Dentro de um bloco protegido, pode-se usar as comandos except ou finally,
para tratar as
excees. H dois de tipos blocos protegidos:
try
{comandos que podem levantar excees }
except
{comandos executados quando uma exceo levantada}
end;
try
{comandos que podem levantar excees }
finally
{comandos sempre executados, havendo excees ou no}
end;
O primeiro tipo de bloco protegido chamado de bloco try-except. O segundo, de bl
oco try-finally.
No bloco try-except, os "comandos protegidos" ficam entre as palavras-chave try
e except. Quando uma
exceo ocorre em um desses comandos, o programa pula imediatamente para o primeiro
comando depois
de except.
No caso do bloco try-finally, os comandos depois de finally so executados sempre
(mesmo quando
excees no so levantadas). Pode-se usar esses comandos para realizar operaes de "limpe
a", como
destruir componentes que no so mais necessrios, por exemplo.
H vrios tipos de excees. Veja a seguir um exemplo que trata a exceo EDivByZero, gerad
quando
feita uma diviso por zero (o divisor aqui o valor contido no componente Edit1). A
ssume-se que os valores
dos arrays resultado e valores foram declarados e inicializados antes.
procedure TForm1.Button1Click(Sender: TObject);
var
Divisor: Real;
begin
Divisor:= StrToFloat(Edit1.Text);
for i:= 1 to 50 do
try
Resultado[i] := Valores[i]/Divisor;
except
on EDivByZero do Resultado[i] := 0;
end;
end;
32Apostila de Delphi Marcos Ribeiro
Note o uso da palavra-chave on dentro do bloco except. On usada para especificar
o tipo de exceo a
ser tratado. Um bloco except pode lidar com vrios tipos de exceo, definindo-se um b
loco.
on [tipo de exceo] do [comandos]para cada tipo.
Na tabela abaixo, listamos alguns tipos comuns de excees:
Tipo de exceo Quando ocorre
EDivByZero Quando se tenta dividir um inteiro por zero.
EZeroDivide Quando se tenta dividir um nmero real (de ponto flutuante) por zero.
EConvertError Quando feita uma converso ilegal de tipos.
EInOutError Quando h um erro de entrada ou sada.
EDatabaseError Quando ocorre um erro geral de banco de dados.
EDBEngineError Quando h um erro no BDE (Borland Database Engine).
Rotinas teis
Nas sees a seguir, apresentaremos algumas rotinas (functions e procedures) teis na
programao em
Object Pascal.
Rotinas para manipulao de strings
A manipulao de strings uma tarefa muito comum em programao. A seguir, listamos as pr
incipais
rotinas de manipulao de strings oferecidas pelo Delphi. (As rotinas cujos nomes co
meam com "Ansi" so
capazes de lidar com caracteres acentuados e, portanto, so muito teis para strings
em portugus).
Funo Descrio
Copy(S:string; Indice,Comp: Integer):
string
A funo Copy retorna um string contendo Comp
caracteres, comeando com S[Indice].
Delete(var S: string; Indice, Comp: Integer) A procedure Delete remove o substri
ng com Comp
caracteres do string S, comeando com S[Index].
O string resultante retornado na varivel S.
Length(S: string): Integer A funo Length retorna o nmero de caracteres
no string S.
Trim(S: string): string A funo Trim remove espaos esquerda e
direita do string S.
Funes de converso de tipo
A linguagem Object Pascal especialmente exigente com relao aos tipos usados em exp
resses, e nas
chamadas de procedures e functions. Se o tipo usado no for compatvel com o tipo es
perado, gerado um
erro de compilao. Funes de converso de tipo devem ser usadas para converter valores p
ara os tipos
adequados.
33Apostila de Delphi Marcos Ribeiro
As principais funes de converso de tipo so listadas na tabela a seguir. Se uma conve
rso for ilegal,
essas funes levantam a exceo EconvertError.
Funo Tipo de origem Tipo de destino
StrToCurr String Currency
StrToDate String TDate
StrToDateTime String TDateTime
StrToFloat String Real
StrToInt String Integer
StrToTime String TTime