Вы находитесь на странице: 1из 48

Tipos de dados predefinidos standard (simples)

1. Identificadores
Um identificador uma sequncia de letras, dgitos e underscore (_), por qualquer ordem e at um mximo de 255 caracteres, desde que o 1 carcter seja uma letra ou um underscore. Um identificador um nome que dado a um elemento do programa, tais como constantes, tipos, variveis, procedimentos, funes, unidades, programas e campos de registos.

2. Tipos de dados predefinidos standard (simples)


Os tipos de dados predefinidos standard dividem-se em duas categorias : fundamentais e genricos. Nos tipos fundamentais, a cadeia e o formato so independentes do CPU e do Sistema Operativo, mantendo-se inalteradas com as diferentes implementaes (verses) do Delphi. Ao contrrio, nos tipos genricos, a cadeia e o formato dependem do CPU e do Sistema Operativo. Existem 3 classes de tipos predefinidos que distinguem os seus elementos em tipos fundamentais e genricos, que so : inteiros, caracteres e strings. Todas as restantes classes, apenas consideram os tipos como fundamentais.

2.1. Inteiros (Integer)


Um nmero inteiro uma sequncia de dgitos, precedida por um sinal +/ (opcional o +). Os tipos inteiros fundamentais so os que constam na tabela seguinte : Nome Shortint Smallint Longint Byte Word Gama de valores -128 . . 127 -32768 . . 32767 -2147483648 . . 2147483647 0 . . 255 0 . . 65535 Formato 8-bit com sinal 16-bit com sinal 32-bit com sinal 8-bit sem sinal 16-bit sem sinal

Os tipos inteiros genricos so os que constam na tabela seguinte : Nome Integer Cardinal Integer Cardinal Gama de valores -32768 . . 32767 0 . . 65535 -2147483648 . . 2147483647 0 . . 2147483647 Formato 16-bit com sinal 16-bit sem sinal 32-bit com sinal 32-bit sem sinal

As aplicaes devem utilizar o formato inteiro genrico sempre que possvel, uma vez que, geralmente, tiram o mximo rendimento do CPU e do Sistema Operativo.

2.2. Reais (Real)


Um nmero real representado usando a notao em Ponto Flutuante ("Floating-Point") com ou sem expoente. A notao sem expoente denomina-se por simples (por ex., 34.78) e a sua forma geral a seguinte : [+/] (Inteiro sem sinal) . (Inteiro sem sinal) Apontamentos de Delphi Pascal

Tipos de dados predefinidos standard (simples) A forma geral de um nmero real com expoente a seguinte : [+/] Mantissa E Expoente { [+/] Mantissa 10Expoente }

em que Mantissa um inteiro ou real em notao simples sem sinal, Expoente um inteiro que varia entre dois valores, de acordo com a sua preciso (tabela seguinte). Tipo Real Single Double Extended Comp Currency Gama de valores 2.9 x 10-39 . . 1.7 x 1038 1.5 x 10-45 . . 3.4 x 1038 5.0 x 10-324 . . 1.7 x 10308 3.4 x 10-4932 . . 1.1 x 104932 263+1 . . 2631 922337203685477.5808 . . 922337203685477.5807 Dgitos significativos 11 12 78 15 16 19 20 19-20 19-20 Tamanho (em bytes) 6 4 8 10 8 8

2.3. Lgicos (Boolean)


Os valores lgicos so denominados pelos identificadores predefinidos True e False. Existem predefinidos 4 tipos lgicos : Boolean, ByteBool, WordBool e LongBool. Como qualquer destes tipos so enumerados, isto , constituem um conjunto ordenado, existem as seguintes relaes : Boolean False < True Ord (False) = 0 Ord (True) = 1 Succ (False) = True Pred (False) = True ByteBool, WordBool, LongBool False <> True Ord (False) = 0 Ord (True) = N (N 0) Succ (False) = True Pred (False) = True

Um elemento do tipo Boolean ou ByteBool ocupa 1 byte, do tipo WordBool ocupa 2 bytes (1 palavra) e do tipo LongBool ocupa 4 bytes (2 palavras). O tipo Boolean o mais utilizado e usa menos memria; os restantes tipos existem essencialmente para estabelecer compatibilidade com outras linguagens e com o ambiente Windows. Um elemento do tipo Boolean apenas pode assumir o valor 0 ou 1, mas se for de um dos restantes tipos, pode assumir qualquer outro valor ordinal. Uma expresso do tipo ByteBool, WordBool ou LongBool considerada False quando o seu valor ordinal 0 (zero) e True quando o seu valor ordinal diferente de zero (0).

2.4. Caracteres (Char)


Um carcter representa-se entre plicas () para se distinguirem de nmeros e identificadores. Tambm aqui existem tipos fundamentais e genricos. Os tipos caracteres fundamentais so o AnsiChar e WideChar. Os valores do tipo AnsiChar so representados por 1 byte, ordenados de acordo com o conjunto de caracteres ANSI/ASCII. Os valores do tipo WideChar representam-se por 2 bytes (1 palavra), ordenados de acordo com o conjunto de caracteres Unicode sistema que utiliza 2 bytes para Apontamentos de Delphi Pascal

Tipos de dados predefinidos no standard

guardar a informao de um carcter (mais de 65000 caracteres). Os primeiros 256 caracteres Unicode correspondem aos caracteres ANSI. O tipo carcter genrico o Char. Nesta verso do Delphi Pascal, o tipo Char corresponde ao tipo AnsiChar, mas noutras verses para outros CPUs e Sistemas Operativos, pode corresponder ao WideChar. No tipo Char existem vrios subconjuntos ordenados importantes de referir, como : { A, ..., Z } Letras maisculas { a, ..., z } Letras minsculas

2.5. String
Uma string uma sequncia de caracteres ASCII entre plicas. Por exemplo, Delphi Pascal. Existem 2 tipos fundamentais de strings, que so : ShortString e AnsiString. O tipo ShortString representa as strings com, no mximo, 255 caracteres ASCII. O tipo AnsiString representa as strings, cujo comprimento apenas limitado pela memria disponvel (1 GB). O nico tipo genrico o tipo String, que, por defeito, corresponde ao tipo ShortString no Delphi 16, e ao tipo AnsiString no Delphi 32 (verso 3 ou mais).

3. Tipos de dados predefinidos no standard


Um tipo de dados no standard definido a partir de tipos de dados predefinidos standard.

3.1. TDateTime
O Delphi guarda os valores da data e hora num elemento do tipo TDateTime. O tipo TDateTime pertence unidade System e est definido como real (Double) da seguinte forma : type TDateTime = type Double ; A parte inteira de um valor do tipo TDateTime corresponde ao nmero de dias que passaram desde 30-12-1899; a parte fraccionria uma fraco de um dia com 24 horas que j passou. A tabela seguinte ilustra alguns exemplos : Data em real 0.0 2.75 1.25 35065.0 Data em TDateTime 30-12-1899 00:00 01-01-1900 18:00 29-12-1899 06:00 01-01-1996 00:00

3.2. TTimeStamp
O tipo TTimeStamp utilizado para representar datas e horas com muita preciso. Este tipo definido como um registo da seguinte forma : type TTimeStamp = record Time : Integer ; Date : Integer ; end ; em que, Time corresponde ao nmero de milsimos de segundo desde as 00:00 horas Date corresponde ao nmero de dias passados desde 01-01-0001 Apontamentos de Delphi Pascal

Operadores

4. Operadores
4.1. Aritmticos
Neste tipo de operadores, os operandos e os resultados so apenas dos tipos inteiro e real. A tabela seguinte descreve os operadores aritmticos existentes : Operador + * / Div Mod Descrio Adio Subtraco Produto Diviso Real Diviso Inteira Resto da Diviso Inteira Operandos (Inteiro, Inteiro) (Inteiro/Real, Real) (Real, Inteiro/Real) (Inteiro/Real, Inteiro/Real) (Inteiro, Inteiro) Resultado Inteiro Real Real Real Inteiro

4.2. Lgicos
Neste tipo de operadores, os operandos e os resultados so apenas do tipo lgico. A tabela seguinte descreve os operadores lgicos existentes : Operador = Not And Or Xor Operao Igualdade Negao Conjuno (e) Disjuno (ou) Ou exclusivo Descrio Verifica se 2 expresses lgicas so iguais Troca o valor da expresso lgica Devolve True apenas se as duas expresses so True Devolve True se uma das 2 expresses True Devolve True apenas se as expresses so diferentes

4.3. Relacionais
Neste tipo de operadores, os operandos so ambos do mesmo tipo simples (inteiro, real, lgico, carcter ou string) e o resultado do tipo lgico. A tabela seguinte descreve os operadores relacionais : Operador = <> < <= > >= Descrio Igualdade Desigualdade Menor Menor ou Igual Maior Maior ou Igual

Apontamentos de Delphi Pascal

Constantes tipificadas (typed constants)

5. Constantes
Muitas vezes conveniente associar um dado de qualquer tipo com um identificador, proporcionando, assim, um nome ao elemento de informao. O identificador designado por constante se o elemento de informao lhe afecto permanentemente (isto , se o valor do elemento de informao de mantm inalterado ao longo do programa). Uma constante deve ser sempre definida antes de poder aparecer numa instruo do Delphi Pascal. Esta definio tem 2 funes : estabelece que o identificador uma constante e associa um valor constante. O tipo da constante ser implicitamente determinado pelo elemento de informao. A forma geral de definio de uma constante a seguinte : const Exemplos : const Nome = Valor (expresso) ;

pi = 3.14159265 ; termo = 2 * pi ; cadeira = 'Informatica' ;

Existem 3 identificadores predefinidos que representam constantes : maxint, true e false. O primeiro, maxint, especifica o maior valor que pode ser atribudo a uma quantidade de tipo Integer. As outras, true e false, representam os 2 valores que podem ser atribudos a uma varivel lgica.

6. Variveis
O identificador cujo valor pode variar durante a execuo do programa designado por varivel. Todas as variveis devem ser individualmente declaradas (i.e., definidas) antes de poderem aparecer numa instruo. A declarao de variveis estabelece o facto de que o identificador uma varivel e especifica o seu tipo. A forma geral da declarao de uma varivel a seguinte : var var Nome : Tipo ; Nome_1, Nome_2, . . . , Nome_N : Tipo ; Para se declarar N variveis do mesmo tipo, a forma geral a seguinte :

Exemplos : var Linha, Coluna : Integer ; X, Y : Double ; Achou : Boolean ; Bandeira : Char ; Notas : A declarao de variveis implica a reserva de espao de memria. Por exemplo, a 2 declarao define 2 registos de memria de tipo Double, identificados por X e Y. X Y Estes espaos permanecem vazios at que uma instruo adequada os mande preencher.

7. Constantes tipificadas (typed constants)


So identificadores que no so constantes, mas que so declaradas na seco das constantes. Estes identificadores funcionam como variveis, s quais so atribudos valores iniciais, apenas Apontamentos de Delphi Pascal

Expresses

quando se inicia a execuo do programa. Estas variveis podem ser alteradas atravs de instrues adequadas, sempre que se desejar. A sntaxe a seguinte : const Exemplo : const Nome : Tipo = Valor (expresso) ;

Cont : Integer = 0 ; Apelido : String = Almeida ;

8. Expresses
Uma expresso um conjunto de operandos (nmeros, constantes, variveis, etc.) agrupados por certos operadores, constituindo uma forma algbrica que representa um valor (um elemento simples). Existem 2 tipos de expresses : numricas e lgicas. Uma expresso numrica representa um valor numrico e uma expresso lgica representa um valor lgico (true ou false). Uma expresso pode, por vezes, tornar-se bastante complexa, devido presena de mltiplos operadores. Nestes casos torna-se necessrio especificar a ordem pela qual as operaes so efectuadas.

8.1. Prioridades dos operadores


A ordem pela qual as operaes so efectuadas, pode ser determinada pelas prioridades naturais dos operadores. A tabela a seguir indica essas prioridades. OPERADORES NOT * / DIV MOD AND + OR XOR = <> > Exemplos : >= < <= PRIORIDADES 1 2 3 4

1. 3 + 6 * 2 = 3 + 12 = 15 2. true and false or not true = true and false or false = false or false = false

8.2. Operadores com a mesma prioridade


Dentro de um dado grupo de prioridades, as operaes so efectuadas medida que aparecem, isto , o clculo efectua-se da esquerda para a direita. Exemplo : 193 mod 19 div 3 * 127 = 3 div 3 * 127 = 1 * 127 = 127

8.3. Uso de parntesis


As duas regras anteriores podem ser alteradas pelo uso de parntesis. Neste caso, em primeiro calcula-se o que se encontra entre parntesis.

Apontamentos de Delphi Pascal

Dados definidos pelo utilizador Exemplos :

1. 12 / (3 * 2) = 12 / 6 = 2.0 (12 / 3 * 2 = 4.0 * 2 = 8.0 ) 2. ( (3 > 7) or (3 <= 7) ) and ( 7 <> 10 ) = (false or (3 <= 7) ) and (7 <> 10) = (false or true) and
(7 <> 10) = true and (7 <> 10) = true and true = True

8.4. Concluso
Para se determinar o valor de uma expresso, deve-se proceder da seguinte forma : 1 Reduzir a expresso, eliminando todos os parntesis que existam, comeando pelos que se encontram mais esquerda; 2 Verificar quais as operaes mais prioritrias e efectuar as que aparecem em primeiro.

9. Dados definidos pelo utilizador


Existem 2 tipos de dados simples definidos pelo utilizador : por enumerao e por subdomnio.

9.1. Dados definidos por enumerao


Este tipo de dados consiste numa sequncia ordenada de identificadores, em que cada um destes interpretado como um elemento individual. Estes elementos esto colectivamente associados a um nome particular que serve para identificar o tipo de informao. A forma geral desta definio a seguinte : type NomeTipo = ( Elemento_1, Elemento_2, . . . , Elemento_N ) ; onde as reticncias (...) sero substitudas pelas restantes alternativas. Exemplos : type Dia_Semana = (segunda, tera, quarta, quinta, sexta, sabado, domingo) ; Cor = (amarelo, verde, vermelho, azul) ; Naipe = (ouros, copas, paus, espadas) ; feriado : Dia_Semana ; tinta : Cor ; trunfo : Naipe ;

var

9.2. Dados definidos por subdomnio (gama de valores)


Um subdomnio refere-se a uma parte do intervalo original de um tipo de dados simples e ordenado. Dados deste tipo so elementos que caem nesse intervalo de valores, formando um subconjunto de dados contguos e ordenados. O conceito de subdomnio pode ser aplicado a qualquer conjunto de dados ordenados e simples. Isto inclui dados enumerados previamente definidos, assim como do tipo inteiro, carcter e lgico. A forma geral desta definio a seguinte : type NomeTipo = PrimeiroElemento . . UltimoElemento ; em que, PrimeiroElemento UltimoElemento e { PrimeiroElemento, ... , UltimoElemento } um conjunto simples ordenado. Exemplo : type var Digito = 0 . . 9 ; Dia_Util = Segunda . . Sexta ; i, j : Digito ; dia : Dia_Util ; Apontamentos de Delphi Pascal

Instrues

9.3. Observaes

Para os elementos de um qualquer tipo definido pelo utilizador, so vlidos os operadores relacionais (<, >, =, <>, >=, <= ) e as funes de ordem. Refira-se tambm que o tipo pode ser definido na declarao das variveis. Exemplo : var i, j : 1 . . 10 ; tinta : (amarelo, verde, vermelho, azul) ;

10. Instrues
Uma instruo do Delphi Pascal uma ordem, ou conjunto de ordens, que obriga o computador a efectuar certas aces. Existem 2 conjuntos de instrues : simples e estruturadas. As instrues simples, que so essencialmente nicas e incondicionais, so de 3 tipos : de atribuio; que acedem a procedimentos; GOTO. As instrues estruturadas so de 3 tipos : compostas; condicionais; repetitivas.

10.1. De atribuio
A instruo de atribuio uma instruo simples, que usada para atribuir um valor a uma varivel. Esta instruo tem a seguinte forma : Varivel := Valor (expresso) ; ( := significa toma o valor de ) em que, Valor uma expresso, que pode ser um elemento simples (nmero, carcter ou lgico). No entanto, a informao deve ser do mesmo tipo que a varivel a que est afecta, exceptuando o caso em que um valor inteiro pode ser atribudo a uma varivel real. Exemplos : 1. w : = x + y 300 ; 2. L := ( j > 0 ) or ( i > 0 ) ; 3. letra := chr (k) ;

10.2. Composta
Antes do mais, refira-se que as instrues so obedecidas sequencialmente, como mostra o seguinte esquema : ... Instruo_1 ; Instruo_2 ; ...

Apontamentos de Delphi Pascal

Instrues

Uma instruo composta consiste numa sequncia de 2 ou mais instrues consecutivas, envolvidas pelas palavras-chave BEGIN e END. A sua forma geral a seguinte : begin Instruo_1 ; Instruo_2 ; ... Instruo_N end Refira-se que todas as instrues terminam necessariamente com ponto e vrgula, excepto a ltima (Instruo_N), pois esta est imediatamente antes da palavra END. No entanto, se o ponto e vrgula for colocado naquela instruo, isso no significa erro, apenas desnecessrio. Uma instruo composta deve ter a seguinte indentao : ... begin Instruo_1 ; Instruo_2 ; begin Instruo_3 ; Instruo_4 ; Instruo_5 end ; Instruo_6 end ... Exemplo : begin IntroduzirDados (raio) ; area := 3.14159 * sqr (raio) ; MostrarResultados (raio, area) end ;

10.3. Condicionais
Este tipo de instrues so importantes, j que, normalmente, necessrio efectuar testes lgicos e ento tomar uma determinada atitude que depende do resultado do teste seleco alternativa . Ou ento, escolher entre um grupo de instrues de entre os grupos disponveis seleco mltipla.

10.3.1. Seleco alternativa (estrutura IF)


Esta estrutura permite que uma aco se realize, unicamente, se uma condio lgica tem um determinado valor lgico (true/false). Esta estrutura tem duas formas : if...then... e if...then...else... . A forma geral da estrutura if ... then ... a seguinte : if ExpressoLgica then Instruo ; em que Instruo ser executada se e s se a ExpressoLgica for verdadeira (se for falsa ignorada nenhuma aco executada) e pode ser de qualquer tipo.

Apontamentos de Delphi Pascal

10 A forma geral da estrutura if ...then ...else ... a seguinte : if ExpressoLgica then Instruo_1 else Instruo_2 ;

Instrues

em que, Instruo_1 ser executada se a ExpressoLgica for verdadeira; caso contrrio, ser executada a Instruo_2. Note-se que apenas uma das instrues executada, mas nunca ambas. As instrues podem ser de qualquer tipo. Refira-se ainda que, no fim da Instruo_1 no pode aparecer o ponto e vrgula (sinaltica de fim de instruo); no final da Instruo_2, o critrio o aplicado para o caso geral. Exemplos : 1. if (saldo < 1000.0) or (estado = 'R') then MostrarResultados (saldo) ; O valor da varivel real saldo mostrado se ela for menor que 1000 ou se a varivel do tipo carcter estado representar o carcter 'R'. 2. if circulo then begin IntroduzirDados (raio) ; area := 3.14159 * sqr (raio) ; MostrarResultados ('Area do circulo = ', area) end else begin IntroduzirDados (comprimento, largura) ; area := comprimento * largura ; MostrarResultados ('rea do rectngulo = ', area) end ; Este exemplo permite determinar a rea de 2 figuras geomtricas diferentes. Se a varivel lgica circulo verdadeira (pretende-se determinar a rea dum crculo), ento executada a seguinte instruo composta : introduzir o valor do raio, clcular o valor da rea e mostrar como resultado o valor da area; caso contrrio (pretende-se determinar a rea dum rectngulo), executada a seguinte instruo composta : introduzir os valores do comprimento e largura do rectngulo, clcular o valor da rea e mostrar como resultado o valor da rea.

10.3.2. Seleco mltipla (estrutura CASE)


Esta estrutura permite que grupos particulares de instrues sejam escolhidos de entre os vrios disponveis. A seleco baseada no valor corrente de uma expresso referida como selector. A forma geral desta estrutura a seguinte : case Expresso of ListaOpes_1 : Instruo_1 ; ... ListaOpes_N : Instruo_N end ; em que, Expresso pode ser de qualquer tipo predefinido standard ordenado (no real), ListasOpes_k correspondem a conjuntos de constantes de um certo tipo (1 k N) Instruo_k podem ser de qualquer tipo (1 k N) Cada opo representa um dos valores permitidos da expresso. Assim, se a expresso dum tipo T, as opes so valores deste tipo que caiam dentro de uma gama permitida. As opes no tm que aparecer por uma ordem especfica, embora cada opes deva ser nica. Apontamentos de Delphi Pascal

Instrues Exemplo : case mes of 1, 3, 5, 7, 8, 10, 12 : 2 :

11

11, 6, 4, 9 : end ; mes { 1, 3, 5, 7, 8, 10, 12 } mes { 2 } mes { 11, 6, 4, 9 }

quantidade_dias := 31 ; if ano_bissexto then quantidade_dias := 29 else quantidade_dias := 28 ; quantidade_dias := 30

quantidade_dias = 31 quantidade_dias = 29/28 quantidade_dias = 30

Observao : Se a expresso (selector) no tomar nenhum dos valores das listas de opes (clusulas), ento tal facto pode provocar um erro de algoritmo. Outra forma da estrutura CASE : No Delphi Pascal existe uma forma alternativa da estrutura CASE, mais desenvolvida que a normal, cuja sintaxe a seguinte : case Expresso of ListaOpes_1 : Instruo_1 ; ... ListaOpes_N : Instruo_N else Instruo end ;

10.4. Repetitivas (ciclos)


Com estas instrues, possvel que um grupo de instrues consecutivas quaisquer seja executado repetidas vezes. Existem 2 tipos de instrues repetitivas : condicional e incondicional.

10.4.1. Repetio "Enquanto" (estrutura While ... Do)


Neste tipo de estrutura, um grupo de instrues consecutivas executado repetidamente, "enquanto" uma condio lgica satisfeita (tem o valor true). Logo, esta instruo uma repetio condicional, sendo a condio lgica testada no inicio do ciclo. A forma geral da estrutura WHILE a seguinte : while ExpressoLgica do Instruo ; em que, Instruo de qualquer tipo e inclui uma caracterstica que deve influenciar o valor da ExpressoLgica. Generalidades : A instruo do ciclo executada enquanto a expresso lgica for verdadeira. Ou seja, para cada iterao do ciclo, se a expresso lgica for verdadeira, a instruo executada; caso contrrio, a prxima instruo a ser executada aquela a seguir ao referido ciclo. Refira-se ainda que devido ao facto da expresso lgica ser avaliada antes do ciclo ser executado pela 1 vez, ela pode nunca ser executada se a ExpressoLgica falsa logo no incio.

Apontamentos de Delphi Pascal

12

Instrues

Exemplos : 1. Elaborar um bloco que escreva numa tabela as potncias de 2, inferiores a 1000. i := 1 ; potencia := 2 ; while potencia <= 1000 do begin MostrarResultados (potencia) ; i := i + 1 ; potencia := potencia * 2 end ; 2. Elaborar um bloco que escreva numa tabela os primeiros 20 nmeros inteiros e o seu dobro. i := 1 ; while i <= 20 do begin MostrarResultados (2 * i) ; i := i + 1 end ;

10.4.2. Repetio "At Que" (estrutura Repeat ... Until)


Neste tipo de estrutura, um grupo de instrues consecutivas executado repetidamente, "at que" uma condio lgica seja satisfeita. Logo, esta instruo uma repetio condicional, sendo a condio lgica testada no fim do ciclo. A forma geral da estrutura REPEAT, a seguinte : repeat Instruo_1 ; ... Instruo_N until ExpressoLgica ; em que as instrues so de qualquer tipo e incluem caractersticas que devem influenciar o valor da ExpressoLgica. Generalidades : O conjunto de instrues deste ciclo (Instruo_1, ... , Instruo_N) so executadas at que a expresso lgica seja verdadeira (condio de paragem). Portanto, aquele conjunto de instrues so executadas enquanto a expresso lgica for falsa. Como o teste condio de paragem efectuado no fim do ciclo, este efectuado pelo menos uma vez no ciclo 'While ... Do', este pode nunca ser efectuado. Exemplos : 1. Elaborar um bloco que escreva numa tabela as potncias de 2, inferiores a 1000. i := 1 ; potencia := 2 ; repeat MostrarResultados ( potencia ) ; i := i + 1 ; potencia := potencia * 2 until potencia > 1000 ;

Apontamentos de Delphi Pascal

Instrues 2. Elaborar um bloco que escreva numa tabela os primeiros 20 nmeros inteiros e o seu dobro. i := 1 ; repeat MostrarResultados ( 2 * i ) ; i := i + 1 until i > 20 ;

13

10.4.3. Repetio com controlador (estrutura For)


Neste tipo de estrutura, um grupo de instrues consecutivas executado repetidamente, um certo nmero de vezes. Logo, esta instruo uma repetio incondicional. A forma geral da estrutura FOR a seguinte : for VarControlo := ExpInicial { to | downto } ExpFinal do Instruo ; em que, VarControlo uma varivel pr-declarada de qualquer tipo ordenado (no reais); ExpInicial e ExpFinal so expresses do mesmo tipo de VarControlo e constituem os limites do domnio daquela varivel, durante a execuo do ciclo; to e downto determinam se as iteraes so para ser incrementadas ou decrementadas, respectivamente, em 1 unidade. O incremento ou decremento efectuado automaticamente; Instruo uma instruo de qualquer tipo, mesmo outras estruturas de controlo. Generalidades : O ciclo executado um nmero fixo de vezes, assumindo a varivel de controlo (VarControlo) valores de ExpInicial at ExpFinal. Portanto, este ciclo apenas pode ser utilizado quando se sabe, priori, o nmero de vezes que vai ser efectuado. Com a directiva to (downto) necessrio que o valor de ExpInicial seja menor (maior) ou igual ao valor de ExpFinal. O ciclo cessa quando a varivel de controlo, VarControlo, assume o valor dado por ExpFinal. A VarControlo e as expresses ExpInicial e ExpFinal, no podem ser alteradas dentro do ciclo. Exemplos : 1. Elaborar um bloco que escreva numa tabela os primeiros 20 nmeros inteiros e o seu dobro. for i := 1 to 20 do MostrarResultados ( 2 * i ) ; 2. Elaborar um bloco que calcule o factorial de um nmero inteiro N N! = N.(N-1).... .2.1 . fact := 1 ; for i := N downto 1 do factorial := factorial * i ;

10.4.4. Rotinas de controlo dos ciclos


Existem duas rotinas que permitem alterar o normal funcionamento dos ciclos, que so os procedimentos Continue e Break. O procedimento CONTINUE permite saltar para a prxima iterao do ciclo ou deixar o ciclo permaturamente em resposta a uma condio especfica. No entanto, as condies necessrias para que a prxima iterao tenha sentido tm de ser garantidas. A forma geral deste procedimento a seguinte : procedure Continue ;

Apontamentos de Delphi Pascal

14

Instrues

Exemplo : determinar o produto de, no mximo, 100 valores positivos (os outros so ignorados). prod := 1 ; for i := 1 to 100 do begin IntroduzirDados ( X ) ; if X < 0 then Continue ; prod := prod * X ; end ; O procedimento BREAK permite terminar com o ciclo, saltando imediatamente para a primeira instruo que se encontra depois do referido ciclo. A forma geral deste procedimento a seguinte : procedure Break ; Exemplo : somar valores positivos (para terminar, introduzir um valor negativo). soma := 0 ; while True do begin IntroduzirDados ( X ) ; If X < 0 then Break ; soma := soma + X end ;

10.5. Goto
A instruo GOTO uma instruo simples, que usada para alterar a sequncia de execuo de um programa, transferindo o controlo (saltando) para uma parte diferente do mesmo programa. A forma geral da instruo GOTO a seguinte : Goto Etiqueta ; onde Etiqueta representa um inteiro positivo inferior a 9999. Cada etiqueta deve ser declarada antes de poder ser utilizada no programa (deve preceder as declaraes de constantes e variveis). As declaraes das etiquetas feito da seguinte forma : Label Etiqueta_1, Etiqueta_2, ... , Etiqueta_N ; onde Etiqueta_1, Etiqueta_2, ..., Etiqueta_N representam as etiquetas de instrues individuais. As etiquetas de instruo so escritas sob a seguinte forma : Etiqueta : Instruo ; em que as instrues podem preceder ou suceder as instrues GOTO. Nota : Podem ser efectuados saltos (GOTO) dentro do mesmo nvel de estrutura ou para fora de estruturas (ciclos, subprogramas, ...) mas nunca para dentro de estruturas. Generalidades : A execuo de uma instruo GOTO obriga a uma transferncia de controlo para a correspondente instruo etiquetada. Portanto, essa instruo a prxima a ser executada.

Apontamentos de Delphi Pascal

Tabelas (Arrays)

15

Um programa pode conter vrias instrues GOTO diferentes que transferem o controlo para o mesmo lugar do programa. No entanto, cada instruo etiquetada deve ter a sua prpria etiqueta especfica (no podem existir 2 instrues "objectivo" com a mesma etiqueta). O controlo pode ser transferido para fora, para dentro e para o princpio de uma instruo composta. No entanto, o controlo no pode ser transferido para o meio de uma dessas instrues. Alm disso, se o controlo transferido internamente para o fim (END) de uma instruo composta (END etiquetado), ento a etiqueta deve ser precedida por uma instruo vazia (;). Isto , colocar ponto e vrgula a seguir instruo que precede END. sempre possvel no utilizar GOTO's. Um programa que utiliza GOTO's perde toda a clareza, pois a estrutura do algoritmo deixou de ser facilmente detectada pela leitura do programa. Ou seja, este tipo de instruo tpica de linguagens de programao no-estruturada (o que no o caso do Pascal). A instruo GOTO deve ser encarada como uma instruo demasiado poderosa e usada apenas como ltimo recurso. A instruo GOTO utilizada positivamente como sada directa de um processo recursivo.

11. Tabelas (Arrays)


At aqui, os tipos de dados estudados tm a caracterstica comum de, aquando da declarao de variveis destes tipos, cada uma representar um nico elemento. No tipo de dados estruturados ("arrays"), um nico identificador pode representar mltiplos elementos (variveis), os quais, podem ser acedidos individualmente e separadamente. No entanto, os "arrays" tm um nmero fixo de componentes e todas do mesmo tipo.

11.1. Tabela de uma dimenso


11.1.1. Definio
Os "arrays" de uma dimenso podem ser imaginados como uma lista de elementos, todos do mesmo tipo; ou seja, um vector. A maneira mais til e usual de definir (construir) um "array" de uma dimenso, inseri-la como parte da declarao de tipo, da seguinte forma : type Nome = array [ TipoIndice ] of Tipo ; em que, Nome o identificador do tipo estruturado que se pretende criar; TipoIndice o tipo dos ndices das componentes (tem de ser simples ordenado e definido por subdomnio por ex., TipoIndice = Indice_1 . . Indice_N); Tipo corresponde ao tipo das componentes e pode ser qualquer (incluindo estruturados).

11.1.2. Declarao de variveis


Existem duas formas de declarar variveis deste tipo : declarando variveis de um tipo j definido ou introduzindo a definio do tipo na declarao das variveis. A sntaxe para a primeira forma a seguinte : var var Nome_1, ... , Nome_N : NomeTipo ; Nome_1, ... , Nome_N : array [ TipoIndice ] of Tipo ; A sntaxe da segunda forma a seguinte :

Apontamentos de Delphi Pascal

16

Tabelas (Arrays)

11.1.3. Declarao de constantes


A sntaxe da declarao de constantes de um tipo destes a seguinte : const Nome : NomeTipo = ( Valor_1, Valor_2, , Valor_N ) ; em que N corresponde ao nmero de elementos do conjunto TipoIndice (nmero de elementos do array ou tabela).

11.1.4. Identificao dos elementos


Os elementos do "array" so identificados escrevendo a varivel declarada como do tipo NomeTipo, seguido pelo seu ndice entre parntesis recto : NomeVarivel [ndice]

11.1.5. Representao grfica


Considere-se uma tabela unidimensional com 8 elementos do tipo carcter.
0 1 2 3 4 5 6 7

M [ 0 ] = F M [ 2 ] = G M [ 3 ] = C M [ 6 ] = H M [ 7 ] = D

M : array [ 0 . . 7 ] of Char ;

11.1.6. Generalidades
O tipo dos ndices das componentes pode ser um qualquer simples ordenado (excepto reais), mas considerando apenas subdomnios. Ou seja, o ndice do tipo escalar no real, mas tambm no pode tomar todo o domnio dos inteiros, nem todo o domnio dos caracteres, mas apenas subdomnios daqueles conjuntos. Os elementos individuais de um vector podem ser usados em expresses, instrues de atribuio, etc., como se fossem variveis. O valor do ndice pode ser expresso como uma constante, uma varivel ou uma expresso. Contudo o ndice deve ser do tipo correcto e estar dentro do intervalo correcto.

11.1.7. Exemplos
1. Declarao de um tipo de nome vector, com 100 elementos do tipo real, e de uma varivel. type vector = array [1 . . 100] of Real; var x : vector; Para se aceder ao elemento k (1 k 100), basta escrever x [k]. Por ex., para k=34, x [34]. No entanto, a declarao var x : array [ 1 . . 100 ] of Real; equivalente s duas anteriores, se se pretende apenas declarar uma varivel daquele tipo. 2. Declarao de uma varivel indexada de nome vencimentos, com 6 elementos do tipo real. var Vencimentos : array [ 'A' . . 'F' ] of Real ; Para se aceder ao elemento de ndice 'C', basta escrever vencimentos ['C']. 3. Definir 2 tipos e declarar constantes evariveis desses tipo. type Dia_Semana = ( Segunda, Tera, Quarta, Quinta, Sexta, Sbado, Domingo ) ; Gastos = array [ Dia_Semana ] of Real ; const GastosIniciais : Gastos = ( 15.5, 25.8, 23.9, 14.75, 18.0, 20.5, 22.3 ) ; var A, B, C : Gastos ; Apontamentos de Delphi Pascal

Tabelas (Arrays)

17

11.2. Tabela de duas dimenses


11.2.1. Definio
Pode-se pensar em "arrays" de 2 dimenses como uma tabela de elementos, formada por linhas e colunas. O primeiro ndice corresponde ao n da linha e o segundo ao n da coluna; ou seja, uma matriz. Independentemente da sua dimenso, um "array" bidimensional (matriz) consiste sempre numa coleco de elementos do mesmo tipo. A maneira mais til e usual de definir (construir) um "array" de duas dimenso, inseri-la como parte da declarao de tipo, da seguinte forma : type Nome = array [ TipoIndice1, TipoIndice2 ] of Tipo ; em que, Nome o identificador do tipo estruturado que se pretende criar; TipoIndice1 e TipoIndice2 so os tipos dos ndices das componentes e podem ser diferentes; Tipo corresponde ao tipo das componentes.

11.2.2. Declarao de variveis


Existem duas formas de declarar variveis deste tipo : declarando variveis de um tipo j definido ou introduzindo a definio do tipo na declarao das variveis. A sntaxe para a primeira forma a seguinte : var var Nome_1, ... , Nome_N : NomeTipo ; Nome_1, ... , Nome_N : array [ TipoIndice1, TipoIndice2 ] of Tipo ; A sntaxe da segunda forma a seguinte :

11.2.3. Declarao de constantes


A sntaxe da declarao de constantes de um tipo destes, a seguinte : const Nome : NomeTipo = ( (Val_11, , Val_1N ), , (Val_M1, , Val_MN ) ) ; em que M e N so o nmero de elementos dos conjuntos TipoIndice1 e TipoIndice2, respectivamente (ou seja, as quantidades de linhas e colunas, respectivamente).

11.2.4. Identificao dos elementos


Os elementos do "array" so identificados escrevendo a varivel declarada como do tipo NomeTipo, seguido pelos ndices da linha e coluna, entre parntesis recto : NomeVarivel [indice1, indice2].

11.2.5. Representao grfica


Considere-se uma tabela bidimensional com 28 elementos do tipo carcter (4 linhas e 7 colunas). j=1 j=2 j=3 j=4 j=5 j=6 j=7 M [ 0, 1 ] = 9.0
i = 0 9.0 i=1 i=2 i=3

12.7 3.45 65.7 1.5 5.78

M [ 0, 7 ] = 12.7 M [ 1, 3 ] = 3.45 M [ 1, 5 ] = 5.78 M [ 2, 4 ] = 65.7 M [ 3, 6 ] = 1.5

M : array [ 0 . . 3, 1 . . 7 ] of Real ; Apontamentos de Delphi Pascal

18

Registos

11.2.6. Exemplos
1. Definir um "array" de 2 dimenses de nome quadro com 66 elementos (6 11) reais, indexados por [i, j] (i = -10, ... , -5 e j = -5, ... , 5) e declarao de uma varivel q daquele tipo. type quadro = array [ -10 . . -5, -5 . . 5 ] of Real ; var q : quadro ; 2. Definio de um "array" de 2 dimenses de nome tabuleiro, constitudo por 8 8 = 64 elementos do tipo cor (definido antes), indexados por [i, j] ( i, j = 1, ... , 8) e declarao de uma varivel de nome tab daquele tipo. type cor = ( branco, preto ) ; tabuleiro = array [1 . . 8, 1 . . 8] of cor ; var tab : tabuleiro ; A definio do tipo de nome tabuleiro equivalente seguinte definio : type tabuleiro = array [1 . . 8] of array [1 . . 8] of cor ; 3. Sabendo que var M : array [1 . . 10, 1 . . 10] of integer ; uma seco de programa para determinar o nmero de elementos nulos a seguinte : nulos := 0 ; for i := 1 to 10 do for j := 1 to 10 do if M [i, j] = 0 then nulos := nulos + 1 ;

11.3. "Arrays" de vrias dimenses


Independentemente da sua dimenso, um "array" consiste sempre numa coleco de elementos do mesmo tipo. Todos os elementos podem ser colectivamente referidos por um nico identificador (o nome comum do "array"). A forma geral da definio de um "array" de dimenso N a seguinte : type Nome = array [ TipoIndice1, . . . , TipoIndiceN ] of Tipo ; em que, Nome o identificador do tipo estruturado que se pretende criar; TipoIndice1, ..., TipoIndiceN so os tipos dos ndices das componentes e podem ser diferentes; Tipo corresponde ao tipo das componentes. Observao : Tudo o que se disse para os "arrays" de 1 e 2 dimenses, aplica-se aos de vrias dimenses.

12. Registos
12.1. Definio
Os registos so um tipo de dados estruturados, com um nmero fixo de componentes (campos do registo), os quais podem ser de diferentes tipos. Pode-se definir um registo incluindo-o como parte de uma declarao de tipo ou de varivel. No entanto, a forma mais til e usual quando se declara como tipo.

Apontamentos de Delphi Pascal

Registos A forma geral da definio do tipo registo a seguinte : type Nome = record ListaCampos_1 : Tipo_1 ; ... ListaCampos_N : Tipo_N end ;

19

em que Tipo_k (1 k N) pode ser de qualquer tipo definido pelo utilizador ou padro; ListaCampos_k representa o grupo de campos do Tipo_k (1 k N), em que a sua declarao feita numa maneira semelhante a um conjunto de variveis.

12.2. Declarao de variveis


Existem duas formas de declarar variveis deste tipo : declarando variveis de um tipo j definido ou introduzindo a definio do tipo na declarao das variveis. A sntaxe para a primeira forma a seguinte : var var Var_1, Var_2, . . ., Var_M : Nome_Registo ; Var_1, Var_2, . . ., Var_M : record ListaCampos_1 : Tipo_1 ; ... ListaCampos_N : Tipo_N end ; A sntaxe para a segunda forma a seguinte :

12.3. Declarao de constantes


A sntaxe da declarao de constantes de um tipo destes, a seguinte : const Nome : Nome_Registo = ( Campo_1 : Val_1, , Campo_N : Val_N) ; em que N o nmero de campos do registo.

12.4. Exemplos
type Complexo = record Re, Im : Real ; end ; Data = record Dia : 1 . . 31 ; Mes : 1 . . 12 ; Ano : 1900 . . 2000 end ; Z1, Z2 : Complexo ; Sistema : Array [1 . . 10] Of Complexo ; Aniversario : Data ; Cliente_1, Cliente_2 : record Nome : String ; Numero : 1 . . 9999 ; Saldo : Real ; end ;

var

Apontamentos de Delphi Pascal

20

Registos

12.5. Observaes
Um registo pode ser um campo num outro registo, assim como se pode definir tabelas cujos elementos sejam registos, registos cujos campos (ou alguns) sejam tabelas, e assim sucessivamente. Cada registo considerado como uma entidade autnoma no que diz respeito s definies de campo. Portanto, cada campo dentro de um dado registo deve ter um nome nico, mas o mesmo nome de campo pode ser usado em diferentes registos.

12.6. Acesso aos campos do registo


O acesso a cada uma dos campos dum registo feito atravs de uma combinao do nome duma varivel do tipo registo e do campo que se pretende aceder, separados por um ponto (.). Isto , Varivel.Campo Se um campo representa um elemento estruturado, ento os elementos desse campo podem ser acedidos incluindo o elemento estruturado na designao de campo. Por exemplo, se um campo representa uma tabela, um seu elemento pode ser acedido pela expresso Varivel.Campo [ndice] Identicamente, se um campo representa um registo, um elemento desse registo pode ser acedido pela expresso Varivel.Campo.Subcampo onde Subcampo refere-se a um campo dentro desse registo. Se definir-se uma tabela unidimensional (vector) cujos elementos sejam registos, a acesso a um desses registos feito atravs da seguinte forma : Tabela [indice] e o acesso a um determinado campo feito da seguinte forma : Tabela [indice].Campo Exemplos : Z1.Re := 2 ; Z1.Im := -3 ; Aniversario.Dia := 1 ; Aniversario.Mes := 4 ; Aniversario.Ano := 1994. Sistema[5].Re := -1 ; Sistema[5].Im := 2 ; Observao : Os campos de um registo podem ser utilizados da mesma forma que as variveis normais. As caractersticas particulares que se aplicam a cada campo so determinadas pelo seu tipo.

12.7. A instruo WITH


A necessidade de especificar vrias designaes de campo, pode tornar-se fastidiosa e reduzir a legibilidade do programa. Em tais situaes, a estrutura WITH permite referenciar as componentes de um registo, utilizando apenas os seus identificadores de campo (omitindo o nome do registo). A forma geral da estrutura WITH a seguinte : with VarRegisto do Instruo ; ou se 2 ou mais variveis de registo so includos na estrutura : with VarRegisto_1, . . . , VarRegisto_N do Instruo ;

Apontamentos de Delphi Pascal

Registos

21

A parte da instruo na estrutura refere-se a qualquer instruo executvel, podendo ser estruturada. Dentro desta instruo qualquer referncia a um campo duma das variveis de registo especificadas, no necessita de incluir o respectivo nome, a no ser que aquele nome de campo seja comum a 2 ou mais variveis. Se um nome de campo comum a 2 ou mais registos, o seu mbito limitado ao registo mais interno. Qualquer referncia a um campo com o mesmo nome, mas associado a outra varivel de registo, deve incluir o nome daquela varivel como parte da designao de campo. A forma geral especificada em segundo lugar equivalente seguinte estrutura encaixada : with VarRegisto_1 do ... with VarRegisto_N do Instruo ; Por esta razo que, se um nome de campo comum a 2 ou mais registos, o seu mbito limitado ao registo mais interno (ltima varivel de registo especificada). Exemplos : with Z1, Z2 do begin Re := 2 ; Im := -3 end ; { Z1 = ? ; Z2 = 2 3 i } with Aniversario do begin Dia := 1 ; Mes := 4 ; Ano := 1994 end ;

12.8. Operaes com registos


O tipo mais simples de operao que envolve registos, a atribuio de uma varivel de registo completo a outra. Isto obriga a que ambas as variveis tenham a mesma composio, isto , que sejam do mesmo tipo de registo. Por exemplo, Z1 := Z2 ; No entanto, as operaes mais comuns so aquelas que envolvem os elementos individuais da varivel de registo (campos).

12.9. Registos variantes


At agora, apenas se consideraram registos cuja composio se mantm invarivel ao longo do programa. Contudo, tambm possvel definir um registo cuja composio (ou parte) possa variar ao longo do programa, dependendo do valor que atribudo a um dado campo do registo (o campo das etiquetas). Tal registo designa-se por registo variante (ou parte variante do registo). A forma geral da parte variante de um registo, a seguinte : case CampoEtiquetas : Tipo of Etiqueta_1 : ListaCamposVariantes_1 ; ... Etiqueta_N : ListaCamposVariantes_N { Variante_1 } { Variante_N }

em que, CampoEtiquetas um tipo ordenado j definido anteriormente; Tipo fora previamente definido por enumerao ou subdomnio (ou Boolean); ListaCamposVariantes_k (1 k N) expressa sob a forma de uma enumerao de campos, isto , ( CampoVariante_1, ... , CampoVariante_M ) Cada valor do tipo associado ao CampoEtiquetas deve aparecer uma vez (e uma s vez) como uma etiqueta de CASE, na parte variante subsequente da definio do registo. A parte activa do

Apontamentos de Delphi Pascal

22

Registos

registo consistir ento nos campos que correspondem a uma dada etiqueta de CASE, correspondente ao valor atribudo ao identificador do campo das etiquetas. Os campos de um registo variante e o identificador de campo das etiquetas podem ser acedidos da mesma maneira que os campos dos registos fixos. Exemplo : type Divisoes = ( Primeira, Divisao_Honra, Segunda_B, Terceira ) ; Equipa = record Nome : String ; { parte fixa } Jogos, Vitorias, Empates, Derrotas : 0 . . 34 ; Pontos : 0 . . 102 ; case Divisao : Divisoes of Primeira : ( ) ; { parte variante } Divisao_Honra : ( ) ; Segunda_B : ( Zona : ( Norte, Centro, Sul ) ) ; Terceira : ( Serie : ( 'A' . . 'F' ) ) ; end ;

Generalidades : S pode haver uma parte variante em cada registo que est sempre depois da sua parte fixa. A um CampoEtiquetas corresponde uma s ListaCamposVariantes. Todas as possveis variantes devem aparecer listadas. Se a uma etiqueta no corresponder nenhum novo campo indicar ( ). A cada variante corresponde uma s lista de campos (que por sua vez pode ter variantes). possvel definir um registo sem parte fixa. A estrutura WITH pode ser usada, tanto com registos do tipo variante como do tipo fixo. Se um campo variante individual for acedido, ento deve estar atribudo um valor apropriado ao identificador do campo das etiquetas. Os nomes dos campos num registo, incluindo os dos campos variantes, devem ser nicos. Embora um dado registo possa ter s uma parte fixa e uma parte variante, possvel incluir uma definio variante noutra. Pode-se criar campos variantes encaixados num nico registo. Advertncia : Um novo grupo de campos variantes torna-se activo, sempre que um novo valor for atribudo ao identificador de campo das etiquetas. Alm disso, se o identificador de campo das etiquetas no existir, ento um novo grupo de variantes ficar activo como resultado de uma referncia a um campo variante no activo. Qualquer mudana inadvertida (ou indesejada) nos campos variantes activos podem, portanto, ser evitada. Este problema surge nos programas que utilizam subprogramas. Para minimizar a probabilidade de tais erros, uma mudana de variante no permitida nas seguintes circunstncias : numa estrutura WITH se um nome de um campo variante aparece naquela instruo. sempre que um campo variante tenha sido transferido para um subprograma como um parmetro actual passado por referncia. Alm disso, um identificador de campo das etiquetas no pode ser transferido para um subprograma como parmetro actual passado por referncia.

Apontamentos de Delphi Pascal

Conjuntos (SET)

23

12.10. Registos de registos (exemplo)


Existe a possibilidade de um campo dum registo ser tambm um registo. type Pessoa = record Nome : record Proprio, Apelido : String; end ; BIdentidade : Integer ; Sexo : ( Masculino, Feminino ) ; DNascimento : Data end ;

12.11. Variantes com variantes (exemplo)


type Tipodomeio Tipodometodo Tipodomaterial Instrumento = = = = ( Cordas, Sopro ) ; ( Percursao, Arco ) ; ( Metal, Madeira ) ; record case Meio : Tipodomeio of Cordas : ( case Metodo : Tipodometodo of Percursao : ( case Teclado : Boolean of False : (Gama : 1 . . 20000) ; True : (Teclas : 1 . . 100) ) Arco : ( Tamanho : (Viola, Violoncelo, Violino) ) ) Sopro : ( case Material : Tipodomaterial of Metal : ( Tecnica : (Pistoes, Vara) ) ; Madeira : ( Palheta : (Simples, Dupla) ) ) end;

13. Conjuntos (SET)


Em Delphi Pascal, define-se formalmente um conjunto (SET), como uma coleco de objectos do mesmo tipo (simples e ordenado). Portanto, um conjunto pode ser uma coleco de inteiros, caracteres ou elementos enumerados.

13.1. Definio
Pode-se definir um conjunto incluindo-o como parte de uma declarao de tipo ou de varivel. No entanto, a forma mais til e usual quando se declara como tipo. A Definio dum conjunto como tipo, pode ser feita de 2 maneiras : Comea-se por construir um tipo de dados (TipoBase), cujos elementos so simples e ordenados; depois, define-se o tipo conjunto que se deseja, em termos do tipo base. Ou seja, type TipoBase = ( Elem1, ..., ElemN ) ; TipoBase = PrimElem . . UltElem ; TipoConjunto = set of TipoBase ; O TipoBase construdo aquando da definio do tipo conjunto. Ou seja, type TipoConjunto = set of ( Elem1, ..., ElemN ) ; type TipoConjunto = set of PrimElem . . UltElem ; Apontamentos de Delphi Pascal

24

Conjuntos (SET)

A definio dum conjunto como varivel, tambm pode ser feita de 2 maneiras : Comea-se por construir o TipoBase e, depois, so declaradas variveis, em termos do tipo base. Ou seja, type TipoBase = ( Elem1, ... , ElemN ) ; PrimElem . . UltElem ; var Var1, ..., VarN : set of TipoBase ; O TipoBase construdo aquando da declarao das variveis de conjunto. Ou seja, var Var1, ..., VarN : set of ( Elem1, ... , ElemN ) ; Var1, ..., VarN : set of PrimElem . . UltElem ; Observaes : Cada varivel de conjunto, pode representar um subconjunto de elementos do TipoBase. Pode-se tambm definir um conjunto em termos de um tipo simples, padro e ordenado (por ex., inteiros e caracteres), ou de uma gama de valores de um tipo simples, padro e ordenado. Em tais situaes, o referido tipo torna-se no TipoBase. Exemplos : type cor_primaria cor conj_alg = = = ( vermelho, amarelo, azul ) ; set of cor_primaria ; set of 0 . . 9 ;

var

roxo, verde, castanho : cor ; conj_letras : set of 'a' . . 'z' ;

13.2. Construo de um conjunto


Cada elemento do conjunto consiste na enumerao (ordenada ou no) de elementos da base, separados por vrgulas (,) e delimitados por parntesis rectos ([ ]). A forma geral para a construo de um conjunto, a seguinte : [ Expr1, Expr2, ..., ExprN ] onde os valores associados s expresses includas so do mesmo tipo do tipo base e, so conhecidos por elementos do conjunto. Estas expresses podem ser constantes, variveis, etc. Se alguns dos elementos do conjunto so valores consecutivos, ento podem ser representados como uma gama de valores.

13.3. Exemplos
1. 2. 3. 4. 5. 6. 7.
verde := [amarelo, azul] ; castanho := [vermelho, amarelo, azul] ; preto := [ ] ; conj_letras := ['s', 'e', 't'] ; [13] ; [i+j, i-j] ; ['0' . . '9', 'A', 'B', 'C'] ;

13.4. Generalidades

Uma coleco de elementos no pode ser includa num conjunto mais do que uma vez. Contudo, possvel que um nico elemento seja especificado uma ou mais vezes, particularmente se a especificao do conjunto incluir quer elementos explcitos quer variveis (uma varivel pode representar um elemento do conjunto que j foi especificado, resultando, portanto, numa duplicao desejada). Em tais situaes, a especificao repetida ignorada.

Apontamentos de Delphi Pascal

Conjuntos (SET)

25

Exemplo : [ amarelo, azul, cor ] Se cor for amarelo ou azul aquele conjunto formado por amarelo e azul (o outro repetido). Se cor for vermelho aquele conjunto formado por amarelo, azul e vermelho. O mesmo acontece se alguns elementos do conjunto forem expressos como gama de valores. Se o 1 e o ltimo da gama forem o mesmo, ento a gama ser interpretada como um nico elemento. Alm disso, se a ordem do 1 for superior do ltimo, ento o conjunto vazio. Exemplos : a) [ '9'. .'6', 'A', 'B', 'C' ] [ 'A', 'B', 'C' ] b) [ '0'. .'0', 'A', 'B', 'C' ] [ '0', 'A', 'B', 'C' ] Um conjunto pode conter um nico elemento, vrios elementos ou estar vazio ([ ]). O n mximo de elementos da base depende do computador utilizado. Para N elementos da base, existem 2N elementos possveis do SET. Uma vez construdo um conjunto, este pode ser atribudo a uma varivel do mesmo tipo, utilizando uma instruo de atribuio, da seguinte forma : Varivel := [ Expr1, Expr2, ..., ExprN ]

13.5. Operaes com conjuntos


Existem 3 operaes diferentes que podem ser efectuadas em conjuntos, resultando da novos conjuntos. Estes novos conjuntos designam-se por conjunto unio, intercepo e diferena, dos 2 conjuntos iniciais, conforme o caso. As 3 operaes so as seguintes : Unio + Ex: [ verde, azul ] + [ verde, preto ] [ verde, azul, preto ] Intercepo Ex: [ verde, azul ] * [ verde, preto ] [ verde ] Complementar Ex: [ verde, azul ] [ verde, preto ] [ azul ]

13.6. Comparao de conjuntos


Pode-se utilizar 4 operadores relacionais a conjuntos para formar expresses lgicas. Estes operadores so os seguintes : Igualdade = Os conjuntos contm os mesmos elementos, por qualquer ordem. Desigualdade <> Os conjuntos no contm exactamente os mesmos elementos. Est Contido <= Todos os elementos do 1 conjunto pertencem ao 2. Contm >= Todos os elementos do 2 conjunto pertencem ao 1.

13.7. Teste de pertena


Existe um operador relacional adicional, IN, que usado para formar expresses lgicas. Este operador permite determinar se um dado valor pertence ou no a um dado conjunto (se o valor ou no elemento do conjunto). Este operador usado da seguinte forma : Expresso IN Conjunto ; em que, Expresso, um elemento dum conjunto ou uma varivel, desde que pertena ao conjunto, Conjunto, geralmente um conjunto ou uma varivel do tipo conjunto. Exemplo : If not dia IN [1 . . 31] Then writeln ('No dia do ms de Abril') ;

Apontamentos de Delphi Pascal

26

Subprogramas

13.8. Problema
O Crivo de Eratstenes o mtodo mais eficiente para gerar os nmeros primos (2 ... N), pois no efectua multiplicaes nem divises. Este mtodo consiste nos seguintes passos : 1. Considerar o conjunto com todos os nmeros inteiros de 2 at N. 2. O 1 elemento daquele conjunto primo; logo, colocado no conjunto dos primos. 3. Retirar do conjunto aquele elemento, assim como todos os seus mltiplos. 4. Voltar ao passo 2, at que o conjunto fique vazio. Resoluo (Algoritmo) : Inicializar os 2 conjuntos (Crivo e Primos) Enquanto o Crivo no ficar vazio Procurar o 1 elemento do Crivo (que primo) Acrescentar aquele elemento ao conjunto dos Primos Retirar aquele elemento e todos os seus mltiplos do Crivo

14. Subprogramas
14.1. Introduo
As aplicaes (programas) em Delphi Pascal podem ser escritos facilmente numa forma modular, permitindo que um problema global seja decomposto numa sequncia de subproblemas individuais. A modularidade proporciona 2 importantes vantagens : Para tarefas que devem ser efectuadas mais do que uma vez a modularidade evita a necessidade de programao redundante (repetida) do mesmo conjunto de instrues. Em vez disso, cada mdulo pode ser definido uma vez e depois acedido de vrios pontos diferentes do programa. Um conjunto diferente de dados pode ser processado de cada vez que o mdulo acedido. O uso de mdulos num programa pode reduzir consideravelmente o comprimento do programa. De ainda maior importncia a clareza lgica resultante da decomposio de um programa em mdulos individuais e concisos, em que cada mdulo representa uma parte bem definida do problema global. Tais programas so mais fceis de escrever e corrigir, e a sua estrutura lgica mais evidente do que programas que no tenham este tipo de estrutura. Isto particularmente verdade em relao a programas muito compridos e complicados. Muitos programas em Pascal esto modularizados ainda que no envolvam a execuo repetida das mesmas tarefas. De facto, a decomposio de um programa em mdulos individuais geralmente considerada uma parte importante de uma boa prtica de programao. Em Delphi Pascal existe dois tipos de mdulos (subprogramas ou rotinas) : procedimentos e funes. Apesar destas estruturas serem semelhantes, so acedidas e trocam informao de forma diferente.

14.2. Conceito de procedimento (procedure)


Um procedimento uma subdiviso do programa em unidades correspondentes a subproblemas definidos durante o desenvolvimento do algoritmo. O compilador do Delphi Pascal possu procedimentos predefinidos, tais como : continue, break, writeln, readln, etc. .

Apontamentos de Delphi Pascal

Subprogramas

27

14.2.1. Definio
A estrutura geral de um procedimento a seguinte forma : procedure Nome ( ListaParmetrosFormais ) ; declaraes begin instrues end; { cabealho }

em que, ListaParmetrosFormais consiste numa sequncia de parmetros (pode ser vazia), os quais esto associados troca de informao (entrada/saida) entre o procedimento e o local de chamada; declaraes onde se declaram os identificadores locais (que apenas so utilizados dentro do procedimento; instrues traduzem o algoritmo necessrio para calcular o resultado pretendido, utilizando os informao introduzida pelo cabealho.

14.2.2. Chamada
Um procedimento referenciado (chamado) simplesmente escrevendo o seu nome, seguido por uma lista de parmetros reais, tal como se mostra a seguir : NomeProcedimento ( ListaParmetrosActuais ) ; em que, ListaParmetrosActuais est relacionada com a ListaParmetrosFormais, contendo exactamente a mesma quantidade de parmetros, dos mesmos tipos e a mesma sequncia.

14.2.3. Exemplo
procedure maximo ( x, y : real ; var max : real ) ; begin if (x > y) then max := x else max := y end ; O parmetro max (varivel real) que devolve o resultado pretendido pelo procedimento. Exemplos de chamadas do procedimento maximo : maximo ( 4.5, 7.8, M ) { M varivel real } maximo ( a, b, c ) ; { a, b variveis ou constantes reais; c varivel real }

14.3. Conceito de funo (function)


Uma funo um subprograma, em muitos aspectos semelhante ao procedimento que, ao contrrio daquele, fornece apenas um valor no seu ponto de chamada. O compilador de Delphi Pascal possu funes standard, tais como : round, sqrt, sqr, exp, ... .

14.3.1. Definio
A estrutura geral de um procedimento a seguinte forma : function Nome ( ListaParmetrosFormais ) : Tipo ; declaraes begin instrues end; { cabealho }

Apontamentos de Delphi Pascal

28

Subprogramas

em que, ListaParmetrosFormais consiste numa sequncia de parmetros (pode ser vazia), os quais esto associados entrada de informao para a funo; Tipo especifica o tipo de dados do resultado produzido pela funo; declaraes onde se declaram os identificadores locais (que apenas so utilizados dentro da funo; instrues traduzem o algoritmo necessrio para calcular o resultado pretendido, utilizando os informao introduzida pelo cabealho; numa destas instrues, ao identificador que representa o nome da funo deve ser atribudo o valor que a funo fornece ao seu ponto de chamada (isto , o resultado da execuo da funo, que um elemento do tipo Tipo). Podem ser atribudos valores ao nome da funo em 2 ou mais pontos do bloco; no entanto, uma vez feita uma atribuio esta no pode ser alterada posteriormente.

14.3.2. Chamada
A funo chamada, no por uma instruo de chamada (como nos procedimentos), mas por qualquer expresso que envolva o clculo do seu valor. Ou seja, especificando o seu nome numa expresso como se fosse uma normal varivel. O nome da funo deve ser seguido por uma lista de parmetros actuais, a qual est relacionada com a lista de parmetros formais. Portanto, no existe uma forma geral de chamada da funo, pois depende de como se pretende utilizar.

14.3.3. Exemplo
function maximo ( x, y : real ) : real ; begin if x > y then maximo := x else maximo := y end ; Note-se que a instruo maximo := x (y) que atribui o valor do mximo ao resultado da funo. Exemplos de chamadas da funo maximo : m := 2 * maximo (a, b); x := maximo (x, maximo (y, z) ); MostrarResultados (maximo (k, 2.5) );

14.4. Generalidades

Quando um subprograma chamado, o controlo automaticamente transferido para o princpio do subprograma. As instrues de execuo dentro do subprograma so ento executadas, tomando em conta quaisquer declaraes especiais que sejam nicas ao subprograma. Quando todas as instrues de execuo tiverem sido executadas, o controlo automaticamente devolvido instruo imediatamente a seguir chamada do subprograma. Cada subprograma pode ser chamado vrias vezes no mesmo programa, assim como pode ser chamado por outros subprograma (procedimentos e funes). Os subprogramas podem (em certos casos) ser testados independentemente. O subprograma j testado, pode ser utilizado em novos programas. Quanto mais complexo o programa, maior a necessidade de subdiviso em subprogramas. Os subprogramas aumentam a clareza do programa, tornando mais simples a sua compreenso, modificao ou extenso. A utilizao de subprograma reduz : o comprimento total do programa, as reas de potenciais erros, o esforo de programao.

Apontamentos de Delphi Pascal

Subprogramas

29

14.5. Declarao dos subprogramas


Os subprogramas so declarados na zona reservada a declaraes, imediatamente antes da palavra-chave BEGIN do corpo do programa principal. Dentro de um mesmo programa, no existe uma ordem para a escrita dos subprogramas. Apenas se um determinado subprograma faz uso de outros subprogramas, estes tm que estar declarados antes.

14.6. Domnio dos identificadores


O domnio de um identificador refere-se regio na qual o identificador est declarado e pode ser utilizado. Este conceito aplica-se a todos os tipos de declaraes, e no somente a variveis e constantes. Os identificadores que aparecem nas instrues de execuo de um subprograma podem ter sido declarados externamente, num bloco de programa que contm o subprograma, ou localmente, dentro do prprio subprograma. Os identificadores que so declarados dentro de um bloco que contm o subprograma podem ser utilizados em qualquer ponto dentro desse bloco, quer internamente quer externamente ao subprograma identificadores globais ao subprograma. Os identificadores locais no so definidos fora do subprograma e, portanto, no podem ser utilizados externamente. Exemplo : program amostra (input, output) ; var a, b, c : integer ; procedure mximo ; var max : integer ; begin if a > b then max := a else max := b ; if c > max then max := c ; Writeln ('O mximo ', max ) end ; begin Writeln ('Quais os valores de a, b e c ?') ; Readln (a, b, c) ; while (a <> 0) do begin maximo ; Writeln ('Quais os valores de a, b e c ?') ; Readln (a, b, c) end end . Identificadores locais ao procedimento maximo : max. Identificadores globais ao procedimento maximo : a, b, c. Generalidades : Os identificadores locais so preferveis aos globais, desde que isto no seja inconsistente com a lgica global do programa. Desta forma, o programa torna-se mais legvel. Tambm minimiza a probabilidade de erros de programao causada por referncias incorrectas ou inconsistentes aos identificadores.

Apontamentos de Delphi Pascal

30

Subprogramas possvel utilizar o mesmo identificador para representar entidades diferentes em partes diferentes de um programa (um identificador declarado localmente dentro de um subprograma, pode ter o mesmo nome de um outro declarado globalmente que foi declarado externamente). Em tais situaes, a definio local ter maior precedncia no seu domnio; contudo, fora deste domnio, o identificador local est indefinido. A utilizao de identificadores locais facilita a minimizao do espao de memria usado por esses identificadores. possvel declarar um subprograma dentro de outro, permitindo que os subprogramas sejam encaixados uns dentro dos outros. Nestes casos, um subprograma no pode ser chamado de fora do bloco que o contm.

14.7. Parmetros
Muitos programas em Pascal requerem que a informao seja transferida entre um subprograma e o ponto em que o subprograma chamado. Uma maneira de conseguir isto, utilizar variveis globais, apesar de existirem alguns aspectos no desejveis no seu uso alterando o valor de uma varivel global num subprograma, pode, inadvertidamente alterar alguma informao fora deste e vice-versa. Outra maneira, usar parmetros, o que oferece uma melhor abordagem referida transferncia. Cada valor transferido entre o parmetro actual, que est includo na chamada do subprograma e o correspondente parmetro formal, que est definido no prprio subprograma. Quando o subprograma chamado, os parmetros actuais substituem os parmetros formais, criando assim um mecanismo de transferncia de informao entre o subprograma e o seu ponto de chamada. A maneira pela qual a informao transferida depende, contudo, da maneira como os parmetros so definidos e utilizados. Um subprograma pode conter 4 classes diferentes de parmetros formais : parmetros passados por valor, parmetros passados por referncia (varivel), parmetros de procedimento e, parmetros de funo.

14.7.1. Regras
Existem certas regras que se devem respeitar de forma a se estabelecer a correspondncia, ao substituir a lista de parmetros reais pela lista de parmetros formais, que so : O nmero de parmetros nas duas listas deve ser o mesmo. Cada parmetro actual corresponde ao parmetro formal que ocupa a mesma posio na lista. Parmetros formais e reais correspondentes devem ser da mesma classe e do mesmo tipo.

14.7.2. Parmetros passados por valor


Os parmetros passados por valor podem considerar-se como parmetros de entrada nos seus subprogramas respectivos. Quando a informao transferida entre um parmetro actual e um parmetro passado por valor, o valor do parmetro actual atribudo quele. Este valor pode ento ser processado dentro do subprograma. Valores que so representados por parmetros passados por valor no podem, contudo, ser transferidos na direco contrria, isto , do subprograma para a parte de chamada do programa. Os parmetros passados por valor so declarados simplesmente ao incluir os seus nomes e correspondentes tipos de dados dentro do cabealho do subprograma, sem prefixos (tal como VAR). a ausncia de tais prefixos que automaticamente identifica esta classe de parmetros. Refira-se que qualquer alterao do valor dos parmetros passados por valor dentro do subprograma no afectar o valor de nenhum dos parmetros reais. Tais parmetros permitem uma transferncia de informao num nico sentido. Apontamentos de Delphi Pascal

Subprogramas

31

Alm disso, e uma vez que so os valores dos parmetros actuais que so transferidos, e no os parmetros propriamente ditos, existe uma flexibilidade considervel na maneira como os parmetros reais podem ser escritos. Em particular, um parmetro actual pode ser expresso como uma constante, varivel ou expresso (desde que o valor do parmetro seja do mesmo tipo de dados). Geralmente, os parmetros formais utilizados em funes, so parmetros passados por valor, j que, o nico valor de sada produzido pela funo representado pelo nome da funo e no por um parmetro (por definio, uma funo produz apenas um valor simples no seu ponto de chamada).

14.7.3. Parmetros passados por referncia


Este tipo de parmetros so normalmente usados para transferir a informao entre os subprogramas e as suas instrues de chamada, permitindo a entrada e a sada do bloco de chamada. Os parmetros passados por referncia so declarados, incluindo-os nos cabealhos dos respectivos subprogramas, com o prefixo VAR. Quando um subprograma contendo um parmetro passado por referncia acedido, o parmetro actual na chamada ao subprograma substitudo pelo parmetro formal no subprograma propriamente dito. Portanto, o parmetro actual ser utilizado durante a execuo do subprograma. este processo de substituio que permite uma transferncia de informao nos 2 sentidos, entre a chamada ao subprograma e o subprograma propriamente dito. Por outro lado, deve ser salientado que s uma varivel pode ser substituda por outra varivel. Portanto, os parmetros actuais que so substitudos por parmetros passados por referncia devem ser eles prprios variveis; no podem ser constantes ou expresses. Outra consequncia do processo de substituio o facto que qualquer mudana do valor do parmetro passado por referncia dentro de um subprograma, mudar tambm o valor do correspondente parmetro actual fora do subprograma. Estes parmetros podem afectar o programa globalmente, mesmo que o seu mbito seja local ao subprograma em que esto declarados.

14.7.4. Exemplo
Program exemplo (input, output); Var a, b, c : real ; Procedure maximo1 ( x, y : real; var aux : real ) ; begin If ( x > y ) Then aux := x Else aux := y end ; Function maximo2 (x, y : real) : real ; begin If (x > y) Then maximo2 := x Else maximo2 := y end ; Begin write ('Quais os valores de a e de b ?') ; readln (a, b) ; maximo1 (a, b, c) ; writeln ('O mximo entre a e b : ', c) ; c := maximo2 (a, b) ; writeln ('O mximo entre a e b : ', c) End . { x, y parmetros formais }

Nas chamadas do procedimento e da funo, os respectivos parmetros formais so substitudos pelos correspondentes parmetros actuais. Apontamentos de Delphi Pascal

32

Subprogramas

No procedimento maximo1, os parmetros formais x e y, so passados por valor, e o aux passado por referncia. Na funo maximo2, os parmetros formais x e y, so passados por valor.

14.8. Recursividade
Uma das caractersticas mais interessantes da linguagem Pascal a capacidade de um subprograma se chamar a si mesmo. Isto conhecido por recursividade. Ao escreverse um subprograma recursivo, essencial que este inclua uma condio de finalizao, para evitar que a recursividade continue indefinidamente. Contudo, enquanto a condio de finalizao se mantiver insatisfeita, o subprograma simplesmente se chama a si mesmo no local apropriado, tal como faria qualquer outro subprograma. Por exemplo, considere-se o problema do clculo de factoriais. Para um dado N, a expresso que define o factorial de N a seguinte : N=0 1 factorial (0) 1 N != N (N 1)! N 0 factorial (N) N factorial (N - 1) Neste caso, a condio de finalizao a seguinte : N = 0 N! = 1. Algoritmo : Se N = 0 Ento factorial 1 Seno factorial N factorial (N 1) Funo recursiva : Function factorial (N : integer) : integer; Begin If (N = 0) Then factorial := 1 Else factorial := N * factorial (N - 1) End;

Simulao : factorial (3) = ? 3 0 factorial 3 factorial (2) factorial (2) = ? 2 0 factorial 2 factorial (1) factorial (1) = ? 1 0 factorial 1 factorial (0) factorial (0) = ? 0=0 factorial (0) = 1 factorial 1 1 = 1 factorial 2 1 = 2 factorial 3 2 = 6 Observaes :

A execuo da funo faz criar diferentes registos de memria para as sucessivas chamadas :
N factorial 3 6 2 2 1 1 0 1

A utilizao de diferentes registos para as sucessivas chamadas de um algoritmo recursivo, torna-o muitas vezes menos eficiente (em termos de espao de memria) que o correspondente algoritmo iterativo.

Apontamentos de Delphi Pascal

Subprogramas

33

14.9. Rotinas predefinidas


14.9.1. Rotinas aritmticas
A seguir apresentam-se algumas funes e procedimentos predefinidos, cujos argumentos e resultados so valores numricos.
function Abs (X : Integer) : Integer ;

Devolve o valor absoluto de X


function Abs (X : Real) : Real ;

Devolve o valor absoluto de X


function Arctan (X : Extend) : Extend ;

Devolve o arco-tg de X (resultado em radianos)


function Cos (X : Extend) : Extend ;

Devolve o coseno de X (X em radianos)


function Exp (X : Real) : Real ;

Devolve a exponencial, de base e, de X


function Frac (X : Extend) : Extend ;

Devolve a parte fraccionria de X


function Int (X : Extend) : Extend ;

Devolve a parte inteira de X


function Ln (X : Real) : Real ;

Devolve o logaritmo neperiano de X


function Pi : Extend ;

Devolve o valor de Pi = 3.1415926535897932385


function Random (X : Integer) : Integer ;

Devolve um inteiro aleatrio entre 0 e X-1


function Random : Extend ;

Devolve um real aleatrio entre 0 e 1


procedure Randomize ;

Inicia o gerador de nmeros aleatrios automaticamente com um valor aleatrio (obtido a partir do relgio do sistema)
function Round (X : Extend) : LongInt ;

Devolve o arredondamento s unidades de X


function Sin (X : Extend) : Extend ;

Devolve o seno de X (X em radianos)

Apontamentos de Delphi Pascal

34 function Sqr (X : Extend) : Extend ;

Subprogramas

Devolve o quadrado X
function Sqrt (X : Extend) : Extend ;

Devolve a raiz quadrada de X


function Trunc (X : Extend) : LongInt ;

Devolve a parte inteira de X

14.9.2. Rotinas de ordem


Uma rotina de ordem envolve apenas tipos ordenados, como sejam os inteiros, os caracteres e os lgicos. No entanto, se o argumento e o resultado so do mesmo tipo. A seguir apresentam-se algumas dessas rotinas.
procedure Dec (var X : Tipo [ ; N : Longint] ) ;

Devolve X com o elemento do conjunto Tipo que se encontra N posies atrs do valor X (Tipo corresponde a um qualquer tipo ordenado) Dec (X, N) = X N. Quando no se especifica o valor de N, est implicito que N = 1 Dec (X) = X 1.
procedure Inc (var X : Tipo [ ; N : Longint] ) ;

Devolve X com o elemento do conjunto Tipo que se encontra N posies frente do valor X (Tipo corresponde a um qualquer tipo ordenado) Inc (X, N) = X + N. Quando no se especifica o valor de N, est implicito que N = 1 Dec (X) = X + 1.
function Ord (X : Tipo) : LongInt ;

Devolve a ordem de X (posio de X) no conjunto Tipo, em que Tipo corresponde a um tipo ordenado (se Tipo = Char a ordem est associada tabela ASCII)
function Succ (X : Tipo) : Tipo ;

Devolve o sucessor de X no conjunto Tipo (Tipo um qualquer tipo ordenado)


function Pred (X : Tipo) : Tipo ;

Devolve o antecessor de X no conjunto Tipo (Tipo um qualquer tipo ordenado)

14.9.3. Rotinas lgicas


Estas rotinas devolvem um valor lgico (True ou False), consoante um determinado teste verdadeiro ou falso. A seguir apresentam-se algumas dessas rotinas.
function Odd (X : LongInt) : Boolean ;

Devolve True se X impar e False, caso contrrio.


procedure IsValidIdent (Ident : String) : Boolean ;

Devolve True se Ident for um identificador vlido em Delphi Pascal (ver Identificadores).

Apontamentos de Delphi Pascal

Subprogramas

35

14.9.4. Rotinas com strings e caracteres


So rotinas em que os argumentos e/ou os resultados so strings. Algumas dessas rotinas apresentam-se a seguir :
function AnsiCompareStr (S1, S2 : String) : Integer ;

Compara S1 com S2 e devolve um valor positivo se S1 > S2, negativo se S1 < S2 ou 0 se S1 = S2. Esta comparao influenciada pelo local do Windows e a ordem dos caracteres contrria que consta na tabela ASCII. Por ex. : AnsiCompareStr (a, A) < 0.
function AnsiCompareText ( S1, S2 : String ) : Integer ;

O mesmo que AnsiCompareStr, s que na comparao efectuada, no h distino entre caracteres minsculos e maisculos. Por ex. : AnsiCompareText (DELPHI, delphi) = 0.
function AnsiLowerCase ( S : String ) : String ;

Converte todos os caracteres da string S em caracteres minsculos. Esta converso usa o local do Windows corrente.
function AnsiUpperCase ( S : String ) : String ;

Converte todos os caracteres da string S em caracteres maisculas. Esta converso usa o local do Windows corrente.
procedure AppendStr ( var Dest : String ; S : String ) ;

Junta ao fim da string Dest a string S. o mesmo que : Dest : = Dest + S.


function CompareStr ( S1, S2 : String ) : Integer ;

Compara S1 com S2 e devolve um valor positivo se S1 > S2, negativo se S1 < S2 ou 0 se S1 = S2. Esta comparao baseada na ordem (valor em 8-bit) de cada carcter da tabela ASCII e no est dependente do local do Windows. Por ex. : CompareStr (a, A) > 0.
function CompareText ( S1, S2 : String ) : Integer ;

O mesmo que CompareStr, s que na comparao efectuada, no h distino entre caracteres minsculos e maisculos. Por ex. : CompareText (DELPHI, delphi) = 0.
function Concat ( S1 , S2 [, S3, , Sn] : String ) : String ;

Concatena 2 ou mais strings numa s. o mesmo que : S := S1 + S2 [+ S3 + + Sn].


function Copy ( S : String ; I , N : Integer ) : String ;

Devolve uma sub-string da string S, contendo N caracteres com incio em S[I]. Se I superior que o comprimento de S, devolvido uma string vazia. Se N especificar mais caracteres que os disponveis, apenas so devolvidos os restantes caracteres, de S[I] at ao fim de S. Por exemplo, Copy(Delphi Pascal, 8, 6) = Pascal.
procedure Delete ( var S : String ; I , N : Integer ) ;

Remove a sub-string com N caracteres da string S, com incio em S[I]. Se I maior que o comprimento de S, nenhum carcter eliminado. Se N especificar mais caracteres do que o que resta desde S[I], removido o resto da string. Por ex. : Delete(Delphi Pascal, 7, 7) = Delphi (estrutura incorrecta s para exemplificar).

Apontamentos de Delphi Pascal

36 procedure Insert ( S1 : String ; var S2 : String ; I : Integer ) ;

Subprogramas

Insere S1 em S2 a partir da posio S2[I]. Por ex. : Insert (3.0 , Delphi Pascal, 8) = Delphi 3.0 Pascal (estrutura incorrecta s para exemplificar).
procedure Length (S : String) : Integer ;

Devolve o nmero de caracteres da string S. Por ex., Length (Delphi) = 6.


function LowerCase (S : String) : String ;

Devolve uma string com o mesmo texto da string S, mas com todas as letras convertidas em minsculas. A converso afecta apenas os caracteres ASCII (em 7-bit) entre 'A' e 'Z'. Para converter os caracteres internacionais (em 8-bit), usar AnsiLowerCase.
function UpperCase (S : String) : String ;

Devolve uma string com o mesmo texto da string S, mas com todas as letras convertidas em maisculas. A converso afecta apenas os caracteres ASCII (em 7-bit) entre 'a' e 'z'. Para converter os caracteres internacionais (em 8-bit), usar AnsiUpperCase.
function Pos (S1, S2 : String) : Integer ;

Procura a string S1 em S2 e devolve um inteiro, que corresponde ao ndice do primeiro carcter de S1 dentro de S2. Pos no distingue as letras minsculas das maisculas. Se S1 no for encontrada em S2, devolvido zero (0).
function UpCase (Ch : Char) : Char ;

Devolve o carcter maisculo do carcter Ch, em que Ch est no conjunto { a, , z }.


function Chr (X : Byte) : Char ;

Devolve o carcter de ordem X, segundo a tabela ASCII

14.9.5. Rotinas de data/hora


So rotinas que servem para consultar qualquer informao relativa a uma data ou hora, a qual dada pelo relgio do sistema.
function Now : TDateTime ;

Devolve a data e a hora actual, armazenada no relgio do sistema.


function Time : TDateTime ;

Devolve apenas a hora actual, armazenada no relgio do sistema.


function Date : TDateTime ;

Devolve apenas a data actual, armazenada no relgio do sistema.


function DayOfWeek (DT : TDateTime) : Integer ;

Devolve o dia da semana da data DT, atravs de um inteiro entre 1 e 7 : Domingo o primeiro dia da semana e Sbado o stimo.

14.9.6. Rotinas de converso


As rotinas de converso permitem converter um valor de um certo tipo para um valor de um outro tipo (converter a string 452 no inteiro 452). Para que a converso tenha xito, necessrio que o valor a converter tenha sentido no novo tipo (converter a string 452A para inteiro no faz sentido);

Apontamentos de Delphi Pascal

Subprogramas

37

no entanto, caso isso no acontea, provocada uma excepo EConvertError. A seguir apresentamse algumas dessas rotinas.
function IntToStr (X : Integer) : String ;

Converte o inteiro X numa string. O inteiro tem que estar na sua representao decimal.
function StrToInt (S : String) : Integer ;

Converte a string S num nmero inteiro (na notao decimal ou hexadecimal).


function FloatToStr (X : Extended) : String ;

Converte o valor real X, em ponto flutuante, numa string. A converso usa o formato geral do nmero com 15 dgitos significantes.
function StrToFloat (S : String) : Extended ;

Converte a string S num valor real em ponto flutuante. A string S deve consistir de uma sinal opcional (+ ou ), uma string de dgitos com um ponto decimal opcional e um 'E' ou 'e' opcional seguido por um inteiro com sinal. Caracteres brancos no incio e no fim da string so ignorados. A varivel global DecimalSeparator define o carcter que deve ser usado como um ponto decimal. Milhares de separadores e smbolos correntes no so permitidos na string.
function StrToDateTime (S : String) : TDateTime ;

Converte uma string numa data/hora. A string especificada como parmetro S deve estar no formato MM/DD/AA HH:MM:SS. A especificao de AM ou PM como parte da hora opcional, assim como os segundos.
function DateTimeToStr (DT : TDateTime) : String ;

Converte a data/hora DT numa string. Se a data contida em DT no vlida, a data a converter a 00/00/00; se a hora contida em DT no for vlida, a hora a converter 00:00:00 AM.
function StrToDate (S : String) : TDateTime ;

Converte a string S numa data, segundo o formato do Windows. A string S deve consistir em dois ou trs nmeros, separados pelo carcter definido pela varivel global DateSeparator. A ordem para o ms, o dia e o ano determinado pela varivel global ShortDateFormat possveis combinaes so : m/d/a, d/m/a e a/m/d. Se a string contm apenas dois nmeros, isto interpretado como uma data (m/d ou d/m) do ano actual. Os valores para o ano entre 0 e 99 assumem-se ser do sculo actual.
function DateToStr (DT : TDateTime) : String ;

Converte a data contida na data DT numa string.


function StrToTime (S : String) : TDateTime ;

Converte a string S numa hora. A string deve consistir em dois ou trs nmeros, separados pelo carcter definido pela varivel global TimeSeparator, opcionalmente seguida por um indicador AM ou PM. Os nmeros representam hora, minuto e (opcionalmente) segundo, por esta ordem. Se o tempo (hora) seguida por AM ou PM, assumido ser no formato de 12 horas. Se no for includo qualquer indicador AM ou PM, assume-se que a hora est no formato de 24 horas.

Apontamentos de Delphi Pascal

38 function TimeToStr (DT : TDateTime) : String ;

Subprogramas

Converte a hora que se encontra em DT numa string.


function IntToHex (X , Dig : Integer) : String ;

Converte o inteiro X numa string com a sua representao em hexadecimal (base 16). O parmetro Dig indica o nmero mnimo de dgitos hexadecimais a devolver.

14.10. Caixas de Dilogo de Mensagens


As caixas de dilogo de mensagens servem para comunicar o utilizador, fornecendo certa informao que est a ser tratada pela aplicao.

14.10.1. ShowMessage
A sintaxe desta funo a seguinte :
procedure ShowMessage ( Mens : String ) ;

ShowMessage mostra uma simples caixa de mensagem, apenas com um boto OK. O parmetro Mens a mensagem (string) que aparece na caixa de mensagem. O nome do projecto (em Delphi) que est a criar a caixa de mensagem aparece como ttulo da caixa de mensagem. Exemplo : (o projecto tem o nome Exemplo.dpr)

14.10.2. MessageBox
A sintaxe desta funo a seguinte :
function MessageBox ( Mens, Ttulo : PChar ; Flags : Longint ) : Integer ;

Utiliza-se a funo MessageBox para apresentar uma mensagem numa caixa de dilogo genrica com um ou mais botes, em que, Ttulo o ttulo da caixa de dilogo e opcional o valor do parmetro Mens a mensagem, que pode ter mais de 255 caracteres se necessrio; as mensagens longas so automaticamente repartidas por vrias linhas na caixa de mensagem os valores do parmetro Flags determinam os botes que aparecem na caixa de mensagem e o comportamento desta caixa; estes valores podem ser combinados para obter o efeito desejado

Apontamentos de Delphi Pascal

Subprogramas

39

O valor devolvido pelo mtodo MessageBox 0, se no h memria suficiente para criar a caixa de mensagem, ou um dos seguintes valores :
Valor Ordem

IDABORT IDCANCEL IDIGNORE IDNO IDOK IDRETRY IDYES

3 2 5 7 1 4 6

Exemplo : If Application.MessageBox ('Pretende mesmo abandonar a aplicao ?', 'Confirmao', MB_YESNO + MB_DEFBUTTON1) = IDYES Then Exit;

14.10.3. MessageDlg
A sintaxe desta funo a seguinte :
function MessageDlg ( Mens : String; Tipo : TMsgDlgType; TMsgDlgButtons; Ajuda : Longint ) : Word ; Botes :

MessageDlg mostra uma caixa de dilogo com uma mensagem no centro do cran, a qual necessita de obter uma resposta do utilizador, em que, A caixa de mensagem mostra o valor do parmetro Mens. Usar o parmetro Tipo para indicar o objectivo do dilogo. Ou seja, determina o tipo de caixa mensagem que aparece. Os tipos possveis so : Valor do parmetro Tipo de caixa de mensagem

mtWarning mtError mtInformation mtConfirmation mtCustom

Aviso Erro crtico Informao Confirmao O ttulo corresponde ao nome do projecto

Usar o parmetro Botes para indicar quais os botes que aparecero na caixa de mensagem. Os valores possveis so : MbYes mbNo mbOk mbCancel mbHelp mbAbort mbRetry mbIgnore mbAll Usar o parmetro Ajuda para especificar o ID context para o tpico de Ajuda que aparecer quando o utilizador clicar no boto de Ajuda ou pressionar F1 enquanto o dilogo est a ser mostrado.

Apontamentos de Delphi Pascal

40

Subprogramas

MessageDlg devolve o valor do boto que o utilizador seleccionou. Os possveis valores devolvidos so os seguintes : mrNone mrAbort mrYes mrOk mrRetry mrNo mrCancel mrIgnore mrAll Exemplo : If MessageDlg (Quer abandonar a aplicao ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes Then begin MessageDlg (A aplicao vai ser fechada !, mtInformation, [mbOk], 0); Close; end;

14.10.4. MessageDlgPos
A sintaxe desta funo a seguinte :
function MessageDlgPos ( Mens : String; Tipo : TMsgDlgType; Botes : TMsgDlgButtons; Ajuda : Longint; X, Y : Integer ) : Word ;

MessageDlgPos mostra uma caixa de dilogo com mensagem num determinado local do cran, especificado atravs das coordenadas do canto superior esquerdo da caixa, em que os parmetros Mens, Tipo, Botes e Ajuda tm a mesma funo dos utilizados pela MessageDlg, e os parmetros X e Y so utilizados para especificar as coordenadas do cran onde o dilogo dever aparecer. MessageDlgPos devolve os mesmos valores que devolve a funo MessageDlg. Exemplo : MessageDlgPos (A aplicao vai ser fechada !, mtInformation, [mbOk], 0, 200, 300);

14.11. Caixas de Dilogo de Edio de Dados


As caixas de dilogo de edio de dados servem para comunicar o utilizador, no sentido deste fornecer a informao necessrio para que a execuo do programa continue normalmente.

14.11.1. InputBox
A sintaxe desta funo a seguinte :
function InputBox ( Ttulo, Prompt, ValorDefeito : String ) : String ; InputBox mostra uma caixa de dilogo de entrada para permitir que o utilizador introduza uma string na prpria caixa de dilogo, em que o parmetro Ttulo o ttulo da caixa de dilogo, o parmetro Prompt o texto que alerta o utilizador para introduzir a string na caixa de edio, e o parmetro ValorDefeito a string que aparece por defeito na caixa de edio (quando a caixa de dilogo aparece pela primeira vez). Se o utilizador carregar no boto Cancel, o InputBox devolve a string por defeito. Se carregar no boto OK, o InputBox devolve a string que est na caixa de edio. Apontamentos de Delphi Pascal

Ficheiros Exemplo : UserName := InputBox ('Por favor introduza o seu nome', 'Nome : ', 'Carlos');

41

14.11.2. InputQuery
A sintaxe desta funo a seguinte :
function InputQuery ( Ttulo, Prompt : String; var Valor : String ) : Boolean ; InputQuery funciona como o InputBox, mas esta funo devolve True se o utilizador carregar no boto OK e False se o utilizador carregar no boto Cancel ou pressionar a tecla Esc. O parmetro Valor a string que aparece por defeito na caixa de edio, a qual, recebe tambm a string que o utilizador introduziu naquela caixa aps se carregar no boto OK. Exemplo : Nome := Carlos; If InputQuery ('Por favor introduza o seu nome', 'Nome : ', Nome) Then ShowMessage ('Nome = ' + Nome);

15. Ficheiros
15.1. Introduo
Geralmente, existem 2 tipos de ficheiros que podem ser criados e acedidos por um programa de computador : ficheiros permanentes e ficheiros temporrios. Os ficheiros permanentes so mantidos num dispositivo auxiliar de memria (disco, disquete, CD, etc.) e preservados aps a execuo do programa. O seu contedo pode ser acedido e/ou modificado por qualquer programa, em qualquer momento. Em Pascal chamam-se ficheiros externos. Os ficheiros temporrios so armazenados na memria principal do computador (RAM), perdendo-se assim que o programa que o criou termine a sua execuo. Em Pascal, chamam-se ficheiros internos. Todos os ficheiros (permanentes e temporrios) podem ser organizados numa de 2 maneiras diferentes : sequencial ou aleatria (ficheiro de acesso directo). Num ficheiro sequencial, todos os seus componentes so armazenados sequencialmente. Para se aceder a um componente particular, necessrio comear a pesquisa no incio do ficheiro, at se encontrar aquela componente. Num ficheiro de acesso aleatrio, cada componente pode ser acedido directamente, sem se proceder leitura do ficheiro desde o seu incio.
Apontamentos de Delphi Pascal

42

Ficheiros

O Pascal ISO comporta apenas ficheiros sequenciais, embora algumas implementaes tambm comportem ficheiros de acesso aleatrio. Apenas sero referidos os ficheiros sequenciais.

15.2. Ficheiros de texto


Leitura de dados a partir de ficheiros de texto : var

f : TextFile ; f ser o nome interno de um ficheiro A : Tipo ; A de qualquer tipo simples AssignFile (f, Ficheiro) ; associar a Ficheiro o nome interno f Reset (f) ; abre o ficheiro f e prepara-o para a leitura de dados Readln (f, A) ; l A e muda de linha (em f) Read (f, A) ; l A e continua na mesma linha (em f) se A uma String utilizar apenas Readln CloseFile (f) ; fecha o ficheiro f
f ser o nome interno de um ficheiro A de qualquer tipo simples associar a Ficheiro o nome interno f abre o ficheiro f e prepara-o para escrita de dados Se Ficheiro contiver dados, estes so apagados Writeln (f, A) ; escreve A e muda de linha (em f) Write (f, A) ; escreve A e continua na mesma linha (em f) Se A uma String utilizar apenas a instruo Writeln CloseFile (f) ; fecha o ficheiro f

Escrita de dados em ficheiros de texto : var

f : TextFile ; A : Tipo ; AssignFile (f, Ficheiro) ; Rewrite (f) ;

Exemplo : type Identificacao = record Nome, Morada : String ; BIdentidade, Telefone : Integer ; end; Registo = array [1 . . 20] of Identificacao ; procedure Guardar ; var f : TextFile ; i : Integer; X : Registo ; begin AssignFile (f, Ficheiro_Saida) ; Rewrite (f) ; for i := 1 to 20 do begin O formato escolhido o seguinte : Writeln (f, X[i].Nome) ; 1 linha = Nome Writeln (f, X[i].Morada) ; 2 linha = Morada Writeln (f, X[i].BIdentidade, , X[i].Telefone) ; 3 linha = BI e Telefone, separados por { ou Write (f, X[i].BIdentidade) ; 3 linha = BI Writeln (f, X[i].Telefone) ; 4 linha = Telefone } end ; CloseFile (f) ; end;

Apontamentos de Delphi Pascal

Ficheiros procedure Abrir ; var f : TextFile ; i : Integer ; X : Registo ; begin AssignFile (f, Ficheiro_Entrada) ; Reset (f) ; for i := 1 to 20 do begin O formato de leitura o mesmo utilizado na escrita Readln (f, X[i].Nome) ; (ver Procedure Guardar) Readln (f, X[i].Morada) ; Readln (f, X[i].BIdentidade, X[i].Telefone) ; { ou Read (f, X[i].BIdentidade) ; Readln (f, X[i].Telefone) ; } end ; CloseFile (f) ; end;

43

15.3. Ficheiros de registo


Leitura de dados a partir de ficheiros de registo : var

f : File Of Registo ; A : Registo ; AssignFile (f, Ficheiro) ; Reset (f) ; Read (f, A) ; CloseFile (f) ; f : File Of Registo ; A : Registo ; AssignFile (f, Ficheiro) ; Rewrite (f) ; Write (f, A) ; CloseFile (f) ;

f ser o nome interno de um ficheiro do tipo Registo A uma varivel de registo (Record) associar a Ficheiro o nome interno f abre o ficheiro f e prepara-o para a leitura de dados l A (em f) { a instruo Readln no aplicvel } fecha o ficheiro f f ser o nome interno de um ficheiro do tipo Registo A uma varivel de registo (Record) associar a Ficheiro o nome interno f abre o ficheiro f e prepara-o para a escrita de dados escreve A (em f) { a instruo Writeln no aplicvel } fecha o ficheiro f

Escrita de dados em ficheiros de registo : var

Exemplo : type Identificacao = record Nome, Morada : String[50] ; { 50 = comprimento da String } BIdentidade, Telefone : Integer ; end; Registo = array [1 . . 20] of Identificacao; procedure Guardar ; // guarda todo o registo duma s vez var f : File Of Registo ; A : Registo ; begin AssignFile (f, Ficheiro_Saida) ; Rewrite (f) ; Write (f, A) ; CloseFile (f) ; end ; procedure Guardar ; // guarda o registo elemento a elemento var f : File Of Identificacao ; i : Integer ; A : Registo ; begin AssignFile (f, Ficheiro_Saida) ; Rewrite (f) ; for i := 1 to 20 do Write (f, A[i]) ; CloseFile (f) ; end ;

Apontamentos de Delphi Pascal

44

Ficheiros

procedure Abrir ; // l o registo de uma s vez (como o guardou) var f : File of Registo ; A : Registo ; begin AssignFile (f, Ficheiro_Entrada) ; Reset (f) ; Read (f, A) ; CloseFile (f) ; end ;

procedure Abrir ; // l o registo elemento a elemento (como o guardou) var f : File of Identificacao ; i : Integer ; A : Registo ; begin AssignFile (f, Ficheiro_Entrada) ; Reset (f) ; for i := 1 to 20 do Read ( f, A[i]) ; CloseFile (f) ; end ;

NOTA : Cada uma das formas de guardar o registo est associado a uma das formas de o ler.

15.4. As funes eoln e eof


Estas funes apenas se aplicam a ficheiros de texto e de leitura (entrada), retornando um valor lgico (Boolean). Para se poder utilizar um ficheiro de leitura este tem j que existir. A funo eoln (End Of Line = Fim de Linha) devolve o valor True, se a informao lida corresponder ao carcter indicador de fim de linha, e o valor False caso contrrio. Portanto, a funo EOLN mantm-se False, at que um carcter de fim de linha seja detectado, o que obriga a tornar-se True. A funo volta a tornar-se False logo que outro carcter examinado. A forma geral desta funo a seguinte:
eoln ( Ficheiro ) ;

A funo eof (End Of File = Fim de Ficheiro) devolve o valor True, se a informao lida corresponder ao carcter indicador de fim de ficheiro, e o valor False caso contrrio. O seu funcionamento exactamente igual ao da funo EOLN. A forma geral desta funo a seguinte :
eof ( Ficheiro ) ; Exemplo : procedure Abrir ; var f : TextFile ; N : Integer ; X : Array [1 . . 200] Of Integer ; begin AssignFile (f, Fich) ; Reset (f) ; N := 0 ; repeat repeat N := N + 1 ; Read (f, X[N]) ; until eoln (f) ; Readln (f) ; { Depois de se ler a linha toda, tem que se mudar para a seguinte } until eof (f) ; end ;

Apontamentos de Delphi Pascal

ndice

NDICE
1. Identificadores-----------------------------------------------------------1 2. Tipos de dados predefinidos standard (simples) -----------------1
2.1. Inteiros (Integer) ------------------------------------------------------------- 1 2.2. Reais (Real)-------------------------------------------------------------------- 1 2.3. Lgicos (Boolean)------------------------------------------------------------ 2 2.4. Caracteres (Char) ------------------------------------------------------------- 2 2.5. String---------------------------------------------------------------------------- 3

3. Tipos de dados predefinidos no standard ----------------------- 3


3.1. TDateTime -------------------------------------------------------------------- 3 3.2. TTimeStamp ------------------------------------------------------------------ 3

4. Operadores -------------------------------------------------------------- 4
4.1. Aritmticos--------------------------------------------------------------------- 4 4.2. Lgicos ------------------------------------------------------------------------- 4 4.3. Relacionais--------------------------------------------------------------------- 4

5. Constantes--------------------------------------------------------------- 5 6. Variveis ----------------------------------------------------------------- 5 7. Constantes tipificadas (typed constants) ----------------------- 5 8. Expresses -------------------------------------------------------------- 6
8.1. Prioridades dos operadores ------------------------------------------------- 6 8.2. Operadores com a mesma prioridade ------------------------------------ 6 8.3. Uso de parntesis------------------------------------------------------------- 6 8.4. Concluso ---------------------------------------------------------------------- 7

ii

ndice

9. Dados definidos pelo utilizador -------------------------------------7


9.1. Dados definidos por enumerao ----------------------------------------- 7 9.2. Dados definidos por subdomnio (gama de valores) ------------------ 7 9.3. Observaes ------------------------------------------------------------------- 8

10. Instrues---------------------------------------------------------------8
10.1. De atribuio ----------------------------------------------------------------- 8 10.2. Composta --------------------------------------------------------------------- 8 10.3. Condicionais ----------------------------------------------------------------- 9
10.3.1. Seleco alternativa (estrutura IF)----------------------------------------------------- 9 10.3.2. Seleco mltipla (estrutura CASE) -------------------------------------------------10

10.4. Repetitivas (ciclos) --------------------------------------------------------- 11


10.4.1. Repetio "Enquanto" (estrutura While ... Do)------------------------------------11 10.4.2. Repetio "At Que" (estrutura Repeat ... Until) ----------------------------------12 10.4.3. Repetio com controlador (estrutura For) ----------------------------------------13 10.4.4. Rotinas de controlo dos ciclos--------------------------------------------------------13

10.5. Goto --------------------------------------------------------------------------- 14

11. Tabelas (Arrays) -------------------------------------------------- 15


11.1. Tabela de uma dimenso-------------------------------------------------- 15
11.1.1. Definio---------------------------------------------------------------------------------15 11.1.2. Declarao de variveis ----------------------------------------------------------------15 11.1.3. Declarao de constantes--------------------------------------------------------------16 11.1.4. Identificao dos elementos ----------------------------------------------------------16 11.1.5. Representao grfica ------------------------------------------------------------------16 11.1.6. Generalidades ---------------------------------------------------------------------------16 11.1.7. Exemplos --------------------------------------------------------------------------------16

11.2. Tabela de duas dimenses------------------------------------------------ 17


11.2.1. Definio---------------------------------------------------------------------------------17 11.2.2. Declarao de variveis ----------------------------------------------------------------17 11.2.3. Declarao de constantes--------------------------------------------------------------17 11.2.4. Identificao dos elementos ----------------------------------------------------------17 11.2.5. Representao grfica ------------------------------------------------------------------17 11.2.6. Exemplos --------------------------------------------------------------------------------18

11.3. "Arrays" de vrias dimenses-------------------------------------------- 18

ndice

iii

12. Registos---------------------------------------------------------------- 18
12.1. Definio --------------------------------------------------------------------- 18 12.2. Declarao de variveis --------------------------------------------------- 19 12.3. Declarao de constantes------------------------------------------------- 19 12.4. Exemplos -------------------------------------------------------------------- 19 12.5. Observaes -----------------------------------------------------------------20 12.6. Acesso aos campos do registo -------------------------------------------20 12.7. A instruo WITH ---------------------------------------------------------20 12.8. Operaes com registos--------------------------------------------------- 21 12.9. Registos variantes ---------------------------------------------------------- 21 12.10. Registos de registos (exemplo)-----------------------------------------23 12.11. Variantes com variantes (exemplo) ------------------------------------23

13. Conjuntos (SET) -------------------------------------------------- 23


13.1. Definio ---------------------------------------------------------------------23 13.2. Construo de um conjunto ----------------------------------------------24 13.3. Exemplos --------------------------------------------------------------------24 13.4. Generalidades ---------------------------------------------------------------24 13.5. Operaes com conjuntos ------------------------------------------------25 13.6. Comparao de conjuntos ------------------------------------------------25 13.7. Teste de pertena-----------------------------------------------------------25 13.8. Problema---------------------------------------------------------------------26

14. Subprogramas -------------------------------------------------------- 26


14.1. Introduo -------------------------------------------------------------------26 14.2. Conceito de procedimento (procedure) --------------------------------26
14.2.1. Definio-------------------------------------------------------------------------------- 27 14.2.2. Chamada -------------------------------------------------------------------------------- 27 14.2.3. Exemplo--------------------------------------------------------------------------------- 27

iv

ndice

14.3. Conceito de funo (function) -------------------------------------------27


14.3.1. Definio---------------------------------------------------------------------------------27 14.3.2. Chamada ---------------------------------------------------------------------------------28 14.3.3. Exemplo ---------------------------------------------------------------------------------28

14.4. Generalidades ---------------------------------------------------------------28 14.5. Declarao dos subprogramas-------------------------------------------29 14.6. Domnio dos identificadores ---------------------------------------------29 14.7. Parmetros-------------------------------------------------------------------30
14.7.1. Regras ------------------------------------------------------------------------------------30 14.7.2. Parmetros passados por valor -------------------------------------------------------30 14.7.3. Parmetros passados por referncia -------------------------------------------------31 14.7.4. Exemplo ---------------------------------------------------------------------------------31

14.8. Recursividade ---------------------------------------------------------------32 14.9. Rotinas predefinidas -------------------------------------------------------33


14.9.1. Rotinas aritmticas ---------------------------------------------------------------------33 14.9.2. Rotinas de ordem-----------------------------------------------------------------------34 14.9.3. Rotinas lgicas --------------------------------------------------------------------------34 14.9.4. Rotinas com strings e caracteres -----------------------------------------------------35 14.9.5. Rotinas de data/hora-------------------------------------------------------------------36 14.9.6. Rotinas de converso ------------------------------------------------------------------36

14.10. Caixas de Dilogo de Mensagens--------------------------------------38


14.10.1. ShowMessage --------------------------------------------------------------------------38 14.10.2. MessageBox ----------------------------------------------------------------------------38 14.10.3. MessageDlg ----------------------------------------------------------------------------39 14.10.4. MessageDlgPos------------------------------------------------------------------------40

14.11. Caixas de Dilogo de Edio de Dados-------------------------------40


14.11.1. InputBox -------------------------------------------------------------------------------40 14.11.2. InputQuery-----------------------------------------------------------------------------41

15. Ficheiros -------------------------------------------------------------- 41


15.1. Introduo ------------------------------------------------------------------- 41 15.2. Ficheiros de texto ----------------------------------------------------------42 15.3. Ficheiros de registo --------------------------------------------------------43 15.4. As funes eoln e eof ------------------------------------------------44

Вам также может понравиться