Академический Документы
Профессиональный Документы
Культура Документы
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.
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.
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
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).
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.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
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) ;
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.
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) ;
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.
1. 3 + 6 * 2 = 3 + 12 = 15 2. true and false or not true = true and false or false = false or false = false
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.
var
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 ; ...
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 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.
11
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 ;
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 ;
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
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.
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.
16
Tabelas (Arrays)
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
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 ;
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.
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.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
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.
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 ;
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
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.
Conjuntos (SET)
23
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
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.
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 ]
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.
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.1. Definio
A estrutura geral de um procedimento a seguinte forma : function Nome ( ListaParmetrosFormais ) : Tipo ; declaraes begin instrues end; { cabealho }
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.
Subprogramas
29
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.
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.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.
Subprogramas
33
Inicia o gerador de nmeros aleatrios automaticamente com um valor aleatrio (obtido a partir do relgio do sistema)
function Round (X : Extend) : LongInt ;
Subprogramas
Devolve o quadrado X
function Sqrt (X : Extend) : Extend ;
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 True se Ident for um identificador vlido em Delphi Pascal (ver Identificadores).
Subprogramas
35
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 ) ;
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 ;
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).
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 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 dia da semana da data DT, atravs de um inteiro entre 1 e 7 : Domingo o primeiro dia da semana e Sbado o stimo.
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 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 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.
Subprogramas
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.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
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
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
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.
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.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.
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
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;
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
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
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 ;
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.
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 ;
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
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
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
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
iv
ndice
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