Upload
hostmail1
View
3
Download
1
Embed Size (px)
Citation preview
Página anterior Próxima página
Pascal - Guia RápidoAnúncios
Pascal - Visão geralPascal é uma linguagem de alto nível de uso geral que foi originalmente desenvolvidapor Niklaus Wirth no início dos anos 70. Foi desenvolvido para ensinar programaçãocomo disciplina sistemática e desenvolver programas confiáveis e eficientes.
Pascal é uma linguagem baseada em Algol e inclui muitas construções de Algol. O Algol60 é um subconjunto do Pascal. Pascal oferece vários tipos de dados e estruturas deprogramação. É fácil entender e manter os programas Pascal.
Pascal cresceu em popularidade na arena de ensino e acadêmica por várias razões:
Fácil de aprender.
Linguagem estruturada.
Produz programas transparentes, eficientes e confiáveis.
Pode ser compilado em uma variedade de plataformas de computador.
Pascal tem os seguintes recursos -
Pascal é uma linguagem fortemente tipada.
Oferece ampla verificação de erros.
Ele oferece vários tipos de dados, como matrizes, registros, arquivos e conjuntos.
Oferece uma variedade de estruturas de programação.
Suporta programação estruturada através de funções e procedimentos.
Suporta programação orientada a objetos.
A linguagem Pascal foi nomeada por Blaise Pascal, matemático francês epioneiro no desenvolvimento de computadores.
Niklaus Wirth concluiu o desenvolvimento da linguagem de programação Pascaloriginal em 1970.
Recursos do idioma Pascal
Fatos sobre Pascal
Pascal baseia-se no estilo estruturado em bloco da linguagem de programaçãoAlgol.
Pascal foi desenvolvido como uma linguagem adequada para o ensino deprogramação como uma disciplina sistemática, cujas implementações poderiamser confiáveis e eficientes.
O padrão ISO 7185 Pascal foi originalmente publicado em 1983.
Pascal foi a principal linguagem de alto nível usada para desenvolvimento naApple Lisa e nos primeiros anos do Mac.
Em 1986, a Apple Computer lançou a primeira implementação do Object Pascal,e em 1993, o Comitê de Padrões Pascal publicou uma Extensão Orientada aObjetos para Pascal.
O Pascal permite que os programadores definam tipos de dados estruturados complexose construam estruturas de dados dinâmicas e recursivas, como listas, árvores egráficos. O Pascal oferece recursos como registros, enumerações, sub-intervalos,variáveis alocadas dinamicamente com ponteiros e conjuntos associados.
Pascal permite definições de procedimentos aninhados para qualquer nível deprofundidade. Isso realmente fornece um ótimo ambiente de programação paraaprender programação como uma disciplina sistemática baseada nos conceitosfundamentais.
Entre as implementações mais surpreendentes de Pascal estão -
Skype
Comando total
TeX
Macromedia Captivate
Apple Lisa
Vários jogos para PC
Sistemas Embarcados
Pascal - Ambiente ConfiguradoExistem vários compiladores e intérpretes Pascal disponíveis para uso geral. Entre estessão -
Turbo Pascal - fornece um IDE e um compilador para executar programasPascal em CP / M, CP / M-86, DOS, Windows e Macintosh.
Delphi - fornece compiladores para executar o Object Pascal e gera códigonativo para sistemas operacionais Windows de 32 e 64 bits, além de Mac OS X e
Por que usar o Pascal?
iOS de 32 bits. A Embarcadero está planejando criar suporte para o sistemaoperacional Linux e Android.
Free Pascal - é um compilador gratuito para executar programas Pascal eObject Pascal. O compilador Free Pascal é um compilador Pascal Turbo Pascal eDelphi compatível com 32 e 64 bits para Linux, Windows, OS / 2, FreeBSD, MacOS X, DOS e várias outras plataformas.
Turbo51 - É um compilador gratuito do Pascal para a família demicrocontroladores 8051, com a sintaxe do Turbo Pascal 7.
Oxygene - É um compilador Object Pascal para as plataformas .NET e Mono.
GNU Pascal (GPC) - É um compilador Pascal composto por um front-end parao GNU Compiler Collection.
Nós estaremos usando o Free Pascal nesses tutoriais. Você pode baixar Free Pascal parao seu sistema operacional a partir do link: Download Free Pascal
A distribuição Linux do Free Pascal vem em três formas -
uma versão tar.gz , também disponível como arquivos separados.
uma versão .rpm (Red Hat Package Manager).
uma versão .deb (Debian).
Código de instalação para a versão .rpm ::
rpm -i fpc-X.Y.Z-N.ARCH.rpm
Onde XYZ é o número da versão do arquivo .rpm e ARCH é uma das arquiteturassuportadas (i386, x86_64, etc.).
Código de instalação para a versão Debian (como o Ubuntu) -
dpkg -i fpc-XXX.deb
Onde XXX é o número da versão do arquivo .deb.
Para detalhes, leia: Free Pascal Installation Guide
Se você usa o Mac OS X, a maneira mais fácil de usar o Free Pascal é baixar o ambientede desenvolvimento Xcode do site da Apple e seguir as instruções de instalaçãosimples. Uma vez que você tenha a configuração do Xcode, você poderá usar ocompilador Free Pascal.
Instalando o Free Pascal no Linux
Instalando o Free Pascal no Mac
Instalando o Free Pascal no Windows
No Windows, você fará o download do instalador do Windows, setup.exe. Este é umprograma de instalação normal. Você precisa seguir os seguintes passos para instalação-
Selecione um diretório.
Selecione partes do pacote que você deseja instalar.
Opcionalmente, escolha associar as extensões .pp ou .pas ao IDE Free Pascal.
Para detalhes, leia: Free Pascal Installation Guide
Isso será usado para digitar seu programa. Exemplos de alguns editores incluem oWindows Notepad, o comando OS Edit, Brief, Epsilon, EMACS e vim ou vi.
O nome e a versão do editor de texto podem variar em diferentes sistemasoperacionais. Por exemplo, o Bloco de Notas será usado no Windows e o vim ou o vipoderão ser usados tanto no Windows quanto no Linux ou UNIX.
Os arquivos criados com o editor são chamados de arquivos de origem e contêm ocódigo-fonte do programa. Os arquivos de origem para programas Pascal geralmentesão nomeados com a extensão .pas .
Antes de iniciar sua programação, certifique-se de ter um editor de texto no lugar evocê tem experiência suficiente para escrever um programa de computador, salvá-lo emum arquivo, compilá-lo e, finalmente, executá-lo.
Pascal - Estruturas de ProgramaAntes de estudar blocos básicos de construção da linguagem de programação Pascal,vamos dar uma olhada na estrutura mínima do programa Pascal, para que possamostomá-la como referência nos próximos capítulos.
Um programa Pascal consiste basicamente das seguintes partes -
Nome do programa
Usa o comando
Declarações de tipo
Declarações constantes
Declarações de Variáveis
Declarações de funções
Declarações de procedimentos
Bloco de programa principal
Editor de texto
Estrutura do Programa Pascal
Declarações e Expressões dentro de cada bloco
Comentários
Todo programa pascal geralmente tem uma declaração de cabeçalho, uma declaração euma parte de execução estritamente nessa ordem. O seguinte formato mostra a sintaxebásica de um programa Pascal -
program {name of the program} uses {comma delimited names of libraries you use} const {global constant declaration block} var {global variable declaration block} function {function declarations, if any} { local variables } begin ... end; procedure { procedure declarations, if any} { local variables } begin ... end; begin { main program block starts} ... end. { the end of main program block }
A seguir, um simples código pascal que imprime as palavras "Hello, World!" -
program HelloWorld; uses crt; (* Here the main program block starts *) begin writeln('Hello, World!'); readkey; end.
Isto irá produzir resultado seguinte -
Hello, World!
Vamos olhar várias partes do programa acima -
A primeira linha do programa HelloWorld; indica o nome do programa.
A segunda linha do programa usa crt; é um comando pré-processador, que dizao compilador para incluir a unidade crt antes de ir para a compilação real.
As próximas linhas incluídas nas instruções begin e end são o bloco principal doprograma. Cada bloco em Pascal é fechado dentro de um começar a declaraçãoe um final comunicado. No entanto, a instrução final indicando o final do
Exemplo de Pascal Hello World
Demonstração ao vivo
programa principal é seguida por um ponto final (.) Em vez de ponto-e-vírgula(;).
A começar declaração do bloco principal do programa é o lugar onde aexecução do programa começa.
As linhas dentro de (* ... *) serão ignoradas pelo compilador e colocadas paraadicionar um comentário no programa.
A instrução writeln ('Hello, World!'); usa a função writeln disponível emPascal, que faz com que a mensagem "Hello, World!" para ser exibido na tela.
A instrução readkey; permite que a exibição pause até que o usuário pressioneuma tecla. Faz parte da unidade crt. Uma unidade é como uma biblioteca emPascal.
O último final da declaração . termina seu programa.
Abra um editor de texto e adicione o código acima mencionado.
Salve o arquivo como hello.pas
Abra um prompt de comando e vá para o diretório em que você salvou oarquivo.
Digite fpc hello.pas no prompt de comando e pressione enter para compilar seucódigo.
Se não houver erros no seu código, o prompt de comando o levará para apróxima linha e gerará o arquivo executável hello e o arquivo objeto hello.o .
Agora, digite hello no prompt de comando para executar seu programa.
Você poderá ver "Hello World" impresso na tela e o programa aguardará atévocê pressionar qualquer tecla.
$ fpc hello.pas Free Pascal Compiler version 2.6.0 [2011/12/23] for x86_64 Copyright (c) 1993-2011 by Florian Klaempfl and others Target OS: Linux for x86-64 Compiling hello.pas Linking hello 8 lines compiled, 0.1 sec $ ./hello Hello, World!
Certifique-se de que o compilador pascal gratuito fpc esteja em seu caminho e quevocê o esteja executando no diretório que contém o arquivo de origem hello.pas.
Pascal - sintaxe básica
Compile e execute o programa Pascal
Você viu uma estrutura básica do programa pascal, então será fácil entender outrosblocos básicos da linguagem de programação pascal.
Uma definição de variável é colocada em um bloco que começa com uma palavra-chavevar , seguida pelas definições das variáveis, como segue:
var A_Variable, B_Variable ... : Variable_Type;
As variáveis Pascal são declaradas fora do corpo do código da função, o que significaque elas não são declaradas nos pares inicial e final , mas são declaradas após adefinição do procedimento / função e antes da palavra-chave begin . Para variáveis globais, elas são definidas após o cabeçalho do programa.
Em Pascal, um procedimento é um conjunto de instruções a serem executadas, semvalor de retorno e uma função é um procedimento com um valor de retorno. Adefinição de função / procedimentos será a seguinte -
Function Func_Name(params...) : Return_Value; Procedure Proc_Name(params...);
Os comentários de múltiplas linhas são colocados entre chaves e asteriscos como {* ...*}. Pascal permite comentário de linha única entre colchetes {...}.
{* This is a multi-line comments and it will span multiple lines. *} { This is a single line comment in pascal }
Pascal é um caso de linguagem não sensível, o que significa que você pode escreversuas variáveis, funções e procedimentos em ambos os casos. Como as variáveis A_Variable, a_variable e A_VARIABLE têm o mesmo significado em Pascal.
Programas Pascal são feitos de declarações. Cada declaração especifica um trabalhodefinido do programa. Esses trabalhos podem ser declaração, atribuição, leitura dedados, gravação de dados, tomada de decisões lógicas, transferência de controle defluxo de programa, etc.
Por exemplo -
Variáveis
Funções / Procedimentos
Comentários
Caso de sensibilidade
Declarações Pascal
readln (a, b, c); s := (a + b + c)/2.0; area := sqrt(s * (s - a)*(s-b)*(s-c)); writeln(area);
As instruções em Pascal são projetadas com algumas palavras Pascal específicas,chamadas de palavras reservadas. Por exemplo, as palavras, programa, entrada, saída,var, real, begin, readline, writeline e end são todas palavras reservadas.
A seguir, uma lista de palavras reservadas disponíveis em Pascal.
e array início caso const
div Faz até outro fim
Arquivo para função vamos para E se
em rótulo mod nada não
do ou embalado procedimento programa
registro repetir conjunto então para
tipo até var enquanto com
O conjunto de caracteres Pascal consiste em -
Todas as letras maiúsculas (AZ)
Todas as letras minúsculas (az)
Todos os dígitos (0-9)
Símbolos especiais - + * /: =,. . () [] = {} `espaço em branco
As entidades em um programa Pascal como variáveis e constantes, tipos, funções,procedimentos e registros, etc., possuem um nome ou identificador. Um identificador éuma seqüência de letras e dígitos, começando com uma letra. Símbolos especiais eespaços em branco não devem ser usados em um identificador.
Pascal - tipos de dadosTipos de dados de uma entidade indicam o significado, restrições, valores possíveis,operações, funções e modo de armazenamento associado a ela.
Tipos inteiros, reais, booleanos e de caracteres são referidos como tipos de dadospadrão. Os tipos de dados podem ser categorizados como escalar, ponteiro e tipos dedados estruturados. Exemplos de tipos de dados escalares são integer, real, Boolean,
Palavras Reservadas em Pascal
Conjunto de caracteres e identificadores em Pascal
character, subrange e enumerados. Tipos de dados estruturados são feitos dos tiposescalares; por exemplo, matrizes, registros, arquivos e conjuntos. Discutiremos os tiposde dados do ponteiro posteriormente.
Os tipos de dados Pascal podem ser resumidos como abaixo no diagrama a seguir -
A declaração de tipo é usada para declarar o tipo de dados de um identificador. Sintaxeda declaração de tipo é -
type-identifier-1, type-identfier-2 = type-specifier;
Por exemplo, a seguinte declaração define as variáveis dia e idade como tipo inteiro,sim e verdadeiro como tipo booleano, nome e cidade como tipo de string, taxas edespesas como tipo real.
type days, age = integer; yes, true = boolean; name, city = string; fees, expenses = real;
A tabela a seguir fornece detalhes sobre tipos inteiros padrão com seus tamanhos dearmazenamento e intervalos de valores usados no Object Pascal -
Tipos de dados pascal
Declarações de tipo
Tipos inteiros
Tipo Mínimo Máximo Formato
Inteiro -2147483648 2147483647 assinado de 32 bits
Cardeal 0 4294967295 sem assinatura de 32 bits
Shortint -128 127 assinado de 8 bits
Smallint -32768 32767 assinado de 16 bits
Longint -2147483648 2147483647 assinado de 32 bits
Int64 -2 ^ 63 2 ^ 63 - 1 assinado de 64 bits
Byte 0 255 sem assinatura de 8 bits
Palavra 0 65535 16 bits não assinados
Longword 0 4294967295 sem assinatura de 32 bits
O uso de constantes torna um programa mais legível e ajuda a manter quantidadesespeciais em um local no início do programa. Pascal permite constantes numéricas,lógicas, de string e caracteres . Constantes podem ser declaradas na parte dedeclaração do programa, especificando a declaração const .
A sintaxe da declaração de tipo constante é a seguinte -
const Identifier = contant_value;
A seguir, alguns exemplos de declarações constantes -
VELOCITY_LIGHT = 3.0E=10; PIE = 3.141592; NAME = 'Stuart Little'; CHOICE = yes; OPERATOR = '+';
Todas as declarações constantes devem ser dadas antes da declaração da variável.
Tipos de dados enumerados são tipos de dados definidos pelo usuário. Eles permitemque os valores sejam especificados em uma lista. Somente operadores de atribuição eoperadores relacionais são permitidos no tipo de dados enumerados. Tipos de dadosenumerados podem ser declarados da seguinte maneira -
type enum-identifier = (item1, item2, item3, ... )
Constantes
Tipos enumerados
A seguir estão alguns exemplos de declarações de tipo enumeradas -
type SUMMER = (April, May, June, July, September); COLORS = (Red, Green, Blue, Yellow, Magenta, Cyan, Black, White); TRANSPORT = (Bus, Train, Airplane, Ship);
A ordem em que os itens são listados no domínio de um tipo enumerado define a ordemdos itens. Por exemplo, no tipo enumerado SUMMER, abril vem antes de maio, maiovem antes de junho e assim por diante. O domínio de identificadores de tipoenumerados não pode consistir em constantes numéricas ou de caractere.
Os tipos de subintervalo permitem que uma variável assuma valores que estão dentrode um determinado intervalo. Por exemplo, se a idade dos eleitores deve ficar entre 18e 100 anos, uma variável chamada idade pode ser declarada como -
var age: 18 ... 100;
Vamos ver a declaração de variáveis em detalhes na próxima seção. Você também podedefinir um tipo de subrange usando a declaração de tipo. A sintaxe para declarar umtipo de subintervalo é a seguinte -
type subrange-identifier = lower-limit ... upper-limit;
A seguir, alguns exemplos de declarações de tipo de subfreio -
const P = 18; Q = 90; type Number = 1 ... 100; Value = P ... Q;
Os tipos de subintervalo podem ser criados a partir de um subconjunto de um tipoenumerado já definido. Por exemplo -
type months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); Summer = Apr ... Aug; Winter = Oct ... Dec;
Pascal - tipos de variáveisUma variável nada mais é do que um nome dado a uma área de armazenamento quenossos programas podem manipular. Cada variável em Pascal possui um tipo específico,que determina o tamanho e o layout da memória da variável; o intervalo de valores quepodem ser armazenados nessa memória; e o conjunto de operações que podem seraplicadas à variável.
Tipos Subrange
O nome de uma variável pode ser composto de letras, dígitos e o caractere desublinhado. Deve começar com uma letra ou um sublinhado. Pascal não faz distinçãoentre maiúsculas e minúsculas, portanto letras maiúsculas e minúsculas significam omesmo aqui. Com base nos tipos básicos explicados no capítulo anterior, haverá osseguintes tipos básicos de variáveis -
Sr.Não
Tipo e Descrição
1Personagem
Normalmente, um único octeto (um byte). Este é um tipo inteiro.
2Inteiro
O tamanho mais natural do inteiro para a máquina.
3Real
Um valor de ponto flutuante de precisão única.
4
boleano
Especifica valores lógicos verdadeiros ou falsos. Este também é um tipointeiro.
5Enumerado
Especifica uma lista definida pelo usuário.
6Sub-escala
Representa variáveis, cujos valores estão dentro de um intervalo.
7Corda
Armazena uma matriz de caracteres.
A linguagem de programação Pascal também permite definir vários outros tipos devariáveis, as quais abordaremos em capítulos subseqüentes como Ponteiro, Matriz,Registros, Conjuntos e Arquivos, etc. Para este capítulo, vamos estudar apenas os tiposbásicos de variáveis.
Variáveis Básicas em Pascal
Declaração de Variáveis em Pascal
Todas as variáveis devem ser declaradas antes de usá-las no programa Pascal. Todas asdeclarações de variáveis são seguidas pela palavra-chave var . Uma declaraçãoespecifica uma lista de variáveis, seguida por dois pontos (:) e o tipo. Sintaxe dadeclaração de variável é -
var variable_list : type;
Aqui, tipo deve ser um tipo de dado Pascal válido, incluindo caractere, inteiro, real,booleano, ou qualquer tipo de dado definido pelo usuário, etc., e variable_list podeconsistir em um ou mais nomes de identificadores separados por vírgulas. Algumasdeclarações de variáveis válidas são mostradas aqui -
var age, weekdays : integer; taxrate, net_income: real; choice, isready: boolean; initials, grade: char; name, surname : string;
No tutorial anterior, discutimos que o Pascal permite declarar um tipo. Um tipo pode seridentificado por um nome ou identificador. Esse tipo pode ser usado para definirvariáveis desse tipo. Por exemplo,
type days, age = integer; yes, true = boolean; name, city = string; fees, expenses = real;
Agora, os tipos assim definidos podem ser usados em declarações de variáveis -
var weekdays, holidays : days; choice: yes; student_name, emp_name : name; capital: city; cost: expenses;
Por favor, note a diferença entre declaração de tipo e declaração var . A declaração detipo indica a categoria ou classe dos tipos, como integer, real, etc., enquanto aespecificação da variável indica o tipo de valores que uma variável pode assumir. Vocêpode comparar a declaração de tipo em Pascal com typedef em C. O mais importante éque o nome da variável se refere à localização da memória onde o valor da variávelserá armazenado. Isso não é assim com a declaração de tipo.
As variáveis recebem um valor com dois pontos e o sinal de igual, seguido por umaexpressão constante. A forma geral de atribuir um valor é -
variable_name := value;
Inicialização Variável em Pascal
Por padrão, variáveis em Pascal não são inicializadas com zero. Eles podem contervalores de lixo. Portanto, é uma prática melhor inicializar variáveis em um programa.Variáveis podem ser inicializadas (atribuídas a um valor inicial) em sua declaração. Ainicialização é seguida pela palavra-chave var e a sintaxe da inicialização é a seguinte -
var variable_name : type = value;
Alguns exemplos são -
age: integer = 15; taxrate: real = 0.5; grade: char = 'A'; name: string = 'John Smith';
Vejamos um exemplo, que faz uso de vários tipos de variáveis discutidas até agora -
program Greetings; const message = ' Welcome to the world of Pascal '; type name = string; var firstname, surname: name; begin writeln('Please enter your first name: '); readln(firstname); writeln('Please enter your surname: '); readln(surname); writeln; writeln(message, ' ', firstname, ' ', surname); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Please enter your first name:
John
Please enter your surname:
Smith
Welcome to the world of Pascal John Smith
Você viu como usar tipos de variáveis simples, como inteiro, real e booleano. Agora,vamos ver variáveis do tipo enumerado, que podem ser definidas como -
var var1, var2, ... : enum-identifier;
Quando você declarar um tipo enumerado, você pode declarar variáveis desse tipo. Porexemplo,
Demonstração ao vivo
Variáveis enumeradas
O exemplo a seguir ilustra o conceito -
program exEnumeration; type beverage = (coffee, tea, milk, water, coke, limejuice); var drink:beverage; begin writeln('Which drink do you want?'); drink := limejuice; writeln('You can drink ', drink); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Which drink do you want?
You can drink limejuice
As variáveis de subintervalo são declaradas como -
var subrange-name : lowerlim ... uperlim;
Exemplos de variáveis subrange são -
var marks: 1 ... 100; grade: 'A' ... 'E'; age: 1 ... 25;
O programa a seguir ilustra o conceito -
program exSubrange; var marks: 1 .. 100; grade: 'A' .. 'E'; begin writeln( 'Enter your marks(1 - 100): '); readln(marks); writeln( 'Enter your grade(A - E): '); readln(grade); writeln('Marks: ' , marks, ' Grade: ', grade); end.
type months = (January, February, March, April, May, June, July, August, September, October, NovembVar m: months; ... M := January;
Demonstração ao vivo
Variáveis Subrange
Demonstração ao vivo
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Enter your marks(1 - 100):
100
Enter your grade(A - E):
A
Marks: 100 Grade: A
Pascal - ConstantesUma constante é uma entidade que permanece inalterada durante a execução doprograma. Pascal permite que apenas constantes dos seguintes tipos sejam declaradas-
Tipos ordinais
Definir tipos
Tipos de ponteiro (mas o único valor permitido é Nil).
Tipos reais
Caracteres
Corda
A sintaxe para declarar constantes é a seguinte -
const identifier = constant_value;
A tabela a seguir fornece exemplos de algumas declarações de constante válidas -
Constante do tipo real
Sr.Não
Tipo Constante e Exemplos
1Constante do tipo Ordinal (Integer)
valid_age = 21;
2Definir constante de tipo
Vogais = conjunto de (A, E, I, O, U);
3Constante do tipo ponteiro
P = NIL;
4 e = 2,7182818;
Constantes declarantes
velocity_light = 3,0E + 10;
5Constante de tipo de caractere
Operador = '+';
6Constante do tipo de cadeia
presidente = 'Johnny Depp';
O exemplo a seguir ilustra o conceito -
program const_circle (input,output); const PI = 3.141592654; var r, d, c : real; {variable declaration: radius, dia, circumference} begin writeln('Enter the radius of the circle'); readln(r); d := 2 * r; c := PI * d; writeln('The circumference of the circle is ',c:7:2); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Enter the radius of the circle
23
The circumference of the circle is 144.51
Observe a formatação na declaração de saída do programa. A variável c deve serformatada com o número total de dígitos 7 e 2 dígitos após o sinal decimal. Pascalpermite tal formatação de saída com as variáveis numéricas.
Pascal - OperadoresUm operador é um símbolo que informa ao compilador para executar manipulaçõesmatemáticas ou lógicas específicas. Pascal permite os seguintes tipos de operadores -
Operadores aritméticos
Operadores relacionais
Operadores booleanos
Operadores de bits
Definir operadores
Operadores de cordas
Vamos discutir os operadores aritméticos, relacionais, booleanos e bit um por um.Vamos discutir os operadores de set e as operações de string mais tarde.
A tabela a seguir mostra todos os operadores aritméticos suportados pelo Pascal.Suponha que a variável A detenha 10 e a variável B detenha 20, então -
Mostrar exemplos
Operador Descrição Exemplo
+ Adiciona dois operandos A + B dará 30
- Subtrai o segundo operando do primeiro A - B vai dar -10
* Multiplica os dois operandos A * B dará 200
/ Divide o numerador pelo denominador B / A vai dar 2
%Operador de módulo e resto depois de uma
divisão inteira B% A dará 0
A tabela a seguir mostra todos os operadores relacionais suportados pelo Pascal.Suponha que a variável A detenha 10 e a variável B detenha 20, então -
Mostrar exemplos
Operador Descrição Exemplo
=Verifica se os valores de dois operandos são iguaisou não, se sim, a condição se torna verdadeira. (A = B) não é verdade.
<>Verifica se os valores dos dois operandos são iguaisou não, se os valores não são iguais, então acondição se torna verdadeira.
(A <> B) é verdade.
>Verifica se o valor do operando esquerdo é maiorque o valor do operando direito, se sim, a condiçãose torna verdadeira.
(A> B) não é verdade.
<Verifica se o valor do operando à esquerda é menorque o valor do operando à direita, se sim, acondição se torna verdadeira.
(A <B) é verdade.
> =Verifica se o valor do operando esquerdo é maiorou igual ao valor do operando direito, se sim, acondição se torna verdadeira.
(A> = B) não éverdade.
<= Verifica se o valor do operando esquerdo é menor (A <= B) é verdade.
Operadores aritméticos
Operadores Relacionais
ou igual ao valor do operando direito, se sim, acondição se torna verdadeira.
A tabela a seguir mostra todos os operadores booleanos suportados pela linguagemPascal. Todos esses operadores trabalham com operandos booleanos e produzemresultados booleanos. Assuma que a variável A é verdadeira e a variável B é falsa,então -
Mostrar exemplos
Operador Descrição Exemplo
eChamado booleano AND operator. Se ambos osoperandos forem verdadeiros, a condição setornará verdadeira.
(A e B) é falso.
e depois
É semelhante ao operador AND, no entanto,garante a ordem na qual o compilador avalia aexpressão lógica. Da esquerda para a direita e osoperandos da direita são avaliados apenas quandonecessário.
(A e depois B) é falso.
ouChamado Booleano OU Operador. Se algum dosdois operandos for verdadeiro, a condição setornará verdadeira.
(A ou B) é verdade.
se não
É semelhante ao OR booleano, no entanto, garantea ordem na qual o compilador avalia a expressãológica. Da esquerda para a direita e os operandosda direita são avaliados apenas quando necessário.
(A ou mais B) éverdade.
não
Chamado Boolean NOT Operator. Usado parainverter o estado lógico de seu operando. Se umacondição for verdadeira, o operador Lógico NOTtornará falsa.
não (A e B) é verdade.
Operadores bit a bit trabalham em bits e executam a operação bit a bit. Todos essesoperadores trabalham em operandos inteiros e produzem resultados inteiros. A tabelade verdade para bit a bit e (&), bit a bit ou (|) e bit a bit não (~) são as seguintes -
p q p & q p | q ~ p ~ q
0 0 0 0 1 1
0 1 0 1 1 0
Operadores booleanos
Operadores de Bit
1 1 1 1 0 0
1 0 0 1 0 1
Assuma se A = 60; e B = 13; agora em formato binário eles serão os seguintes -
A = 0011 1100
B = 0000 1101
-----------------
A & B = 0000 1100
A ^ B = 0011 0001
~ A = 1100 0011
Os operadores Bitwise suportados pelo Pascal estão listados na tabela a seguir.Suponha que a variável A detenha 60 e a variável B detenha 13, então:
Mostrar exemplos
Operador Descrição Exemplo
EBinary AND Operator copia um pouco para oresultado, se existir em ambos os operandos.
(A & B) vai dar 12, que é0000 1100
|Operador binário OR copia um bit se existir em umdos operandos.
(A | B) vai dar 61, que é0011 1101
!Operador binário OR copia um bit se existir em umdos operandos. É o mesmo que | operador.
(A! B) vai dar 61, que é0011 1101
~Binary Ones Complement Operator é unário e tem oefeito de 'flipping' bits.
(~ A) dará -61, que é1100 0011 no formulário
de complemento de 2devido a um número
binário assinado.
<< <<Operador Shift Esquerdo. O valor dos operandosesquerdos é movido para a esquerda pelo númerode bits especificado pelo operando direito.
Um << 2 dará 240, queé 1111 0000
>>
Operador de deslocamento à direita binário. O valordos operandos esquerdos é movido para a direitapelo número de bits especificado pelo operandodireito.
A >> 2 dará 15, que é0000 1111
Por favor, note que diferentes implementações de Pascal diferem em operadores bit abit. Free Pascal, o compilador que usamos aqui, no entanto, suporta os seguintesoperadores bitwise -
Operadores Operações
não Bit a bit NÃO
e Bit a bit E
ou Bit a bit OU
xor Exclusivo bit a bit OU
shl Troca de bit a bit à esquerda
shr Bitwise desloque para a direita
<< << Troca de bit a bit à esquerda
>> Bitwise desloque para a direita
A precedência do operador determina o agrupamento de termos em uma expressão.Isso afeta como uma expressão é avaliada. Certos operadores têm precedência maisalta que outros; por exemplo, o operador de multiplicação tem precedência mais altaque o operador de adição.
Por exemplo, x = 7 + 3 * 2; aqui, x é atribuído 13, não 20 porque o operador * temprecedência mais alta que +, então ele primeiro é multiplicado com 3 * 2 e, emseguida, adiciona 7.
Aqui, os operadores com a maior precedência aparecem na parte superior da tabela, eaqueles com os mais baixos aparecem na parte inferior. Dentro de uma expressão, osoperadores de precedência mais alta serão avaliados primeiro.
Mostrar exemplos
Operador Precedência
~ não, Maior
*, /, div, mod e &
|,!, +, - ou
=, <>, <, <=,>,> =, em
ou então, e então Menor
Pascal - Tomada de DecisãoAs estruturas de tomada de decisão exigem que o programador especifique uma oumais condições a serem avaliadas ou testadas pelo programa, juntamente com uma
Precedência dos operadores em Pascal
declaração ou instruções a serem executadas se a condição for determinada comoverdadeira e, opcionalmente, outras instruções a serem executadas se a condição estádeterminado a ser falso.
A seguir está a forma geral de uma estrutura de tomada de decisão típica encontradana maioria das linguagens de programação -
A linguagem de programação Pascal fornece os seguintes tipos de declarações detomada de decisão. Clique nos links a seguir para verificar seus detalhes.
Sr.Não
Declaração & Descrição
1
se - então declaraçãoUma declaração if - then consiste em uma expressão booleana seguida deuma ou mais instruções.
2
Declaração if-then-elseUma declaração if - then pode ser seguida por uma instrução else opcional, que é executada quando a expressão booleana é falsa.
3
aninhado se instruçõesVocê pode usar um caso ou else if declaração dentro de outro se ou else ifdeclaração (s).
4
declaração de casoUma declaração de caso permite que uma variável seja testada quanto àigualdade em relação a uma lista de valores.
5 declaração case-else
É semelhante à declaração if-then-else . Aqui, um outro termo segue adeclaração do caso .
6declarações de caso aninhadoVocê pode usar uma instrução de caso dentro de outra instrução de caso .
Pascal - LoopsPode haver uma situação, quando você precisa executar um bloco de código váriasvezes. Em geral, as instruções são executadas seqüencialmente: a primeira instruçãoem uma função é executada primeiro, seguida pela segunda e assim por diante.
As linguagens de programação fornecem várias estruturas de controle que permitemcaminhos de execução mais complicados.
Uma instrução de loop nos permite executar uma instrução ou grupo de instruçõesvárias vezes e seguir é a forma geral de uma instrução de loop na maioria daslinguagens de programação -
A linguagem de programação Pascal fornece os seguintes tipos de construções de looppara lidar com os requisitos de loop. Clique nos links a seguir para verificar seusdetalhes.
Sr.Não
Tipo de loop e descrição
1
loop while-doRepete uma instrução ou grupo de instruções enquanto uma determinadacondição é verdadeira. Ele testa a condição antes de executar o corpo do loop.
2 loop for-do
Executa uma seqüência de instruções várias vezes e abrevia o código quegerencia a variável de loop.
3
loop repetir-atéComo uma declaração while, exceto que testa a condição no final do corpo doloop.
4
loops aninhadosVocê pode usar um ou mais loop dentro de qualquer outro enquanto, por ourepetir até loop.
As instruções de controle de loop alteram a execução de sua sequência normal. Quandoa execução deixa um escopo, todos os objetos automáticos que foram criados nesseescopo são destruídos.
Pascal suporta as seguintes declarações de controle. Clique nos links a seguir paraverificar seus detalhes.
Sr.Não
Declaração de controle e descrição
1
declaração de quebraEncerra o loop ou a instrução case e transfere a execução para a instruçãoimediatamente após o loop ou a instrução case.
2
continuar instruçãoFaz com que o loop pule o restante de seu corpo e repita imediatamente suacondição antes de reiterar.
3
declaração gotoTransfere o controle para a instrução rotulada. Embora não seja aconselhávelusar a instrução goto no seu programa.
Pascal - Funções
Um subprograma é uma unidade / módulo de programa que executa uma tarefaespecífica. Esses subprogramas são combinados para formar programas maiores. Isso ébasicamente chamado de "design modular". Um subprograma pode ser invocado porum subprograma / programa, que é chamado de programa de chamada.
Declarações de controle de loop
Subprogramas
Pascal fornece dois tipos de subprogramas -
Funções - esses subprogramas retornam um único valor.
Procedimentos - esses subprogramas não retornam um valor diretamente.
Uma função é um grupo de instruções que juntas executam uma tarefa. Todoprograma Pascal tem pelo menos uma função, que é o próprio programa, e todos osprogramas mais triviais podem definir funções adicionais.
Uma declaração de função informa ao compilador sobre o nome de uma função, tipode retorno e parâmetros. Uma definição de função fornece o corpo real da função.
A biblioteca padrão do Pascal fornece inúmeras funções internas que seu programapode chamar. Por exemplo, a função AppendStr () acrescenta duas strings, a funçãoNew () aloca dinamicamente memória para variáveis e muitas outras funções.
Em Pascal, uma função é definida usando a palavra-chave function. A forma geral deuma definição de função é a seguinte -
function name(argument(s): type1; argument(s): type2; ...): function_type; local declarations; begin ... < statements > ... name:= expression; end;
Uma definição de função em Pascal consiste em um cabeçalho de função ,declarações locais e um corpo de função . O cabeçalho da função consiste na funçãode palavra-chave e um nome dado à função. Aqui estão todas as partes de uma função-
Argumentos - O (s) argumento (s) estabelecem a ligação entre o programa dechamada e os identificadores de função e também chamados de parâmetrosformais. Um parâmetro é como um marcador de posição. Quando uma função échamada, você passa um valor para o parâmetro. Este valor é referido comoparâmetro ou argumento real. A lista de parâmetros refere-se ao tipo, ordem enúmero de parâmetros de uma função. O uso de tais parâmetros formais éopcional. Esses parâmetros podem ter tipo de dados padrão, tipo de dadosdefinidos pelo usuário ou tipo de dados de subintervalo.
A lista de parâmetros formais que aparece na declaração da função pode servariáveis simples ou subscritas, matrizes ou variáveis estruturadas ousubprogramas.
Funções
Definindo uma Função
Tipo de retorno - Todas as funções devem retornar um valor, portanto, todasas funções devem receber um tipo. O tipo de função é o tipo de dados dovalor que a função retorna. Pode ser um escalar padrão ou um tipo de sub-escala definido pelo usuário, mas não pode ser do tipo estruturado.
Declarações locais - As declarações locais referem-se às declarações derótulos, constantes, variáveis, funções e procedimentos, que são aplicáveis apenas ao corpo da função.
Corpo da Função - O corpo da função contém uma coleção de instruções quedefinem o que a função faz. Deve sempre estar entre as palavras reservadascomeçar e terminar. É a parte de uma função onde todos os cálculos são feitos.Deve haver uma declaração de atribuição do tipo - nome: = expressão; nocorpo da função que atribui um valor ao nome da função. Este valor é retornadocomo e quando a função é executada. A última declaração no corpo deve seruma declaração final.
A seguir, um exemplo mostrando como definir uma função no pascal -
(* function returning the max between two numbers *) function max(num1, num2: integer): integer; var (* local variable declaration *) result: integer; begin if (num1 > num2) then result := num1 else result := num2; max := result; end;
Uma declaração de função informa ao compilador sobre um nome de função e comochamar a função. O corpo real da função pode ser definido separadamente.
Uma declaração de função tem as seguintes partes -
function name(argument(s): type1; argument(s): type2; ...): function_type;
Para a função acima definida max (), segue a declaração da função -
function max(num1, num2: integer): integer;
A declaração de função é necessária quando você define uma função em um arquivo deorigem e chama essa função em outro arquivo. Nesse caso, você deve declarar a funçãona parte superior do arquivo que está chamando a função.
Declarações de Função
Ao criar uma função, você define o que a função precisa fazer. Para usar uma função,você terá que chamar essa função para executar a tarefa definida. Quando umprograma chama uma função, o controle de programa é transferido para a funçãochamada. Uma função chamada realiza uma tarefa definida, e quando sua declaraçãode retorno é executada ou quando a última instrução final é alcançada, ela retorna ocontrole de programa de volta ao programa principal.
Para chamar uma função, basta passar os parâmetros necessários junto com o nome dafunção e, se a função retornar um valor, você poderá armazenar o valor retornado. Aseguir, um exemplo simples para mostrar o uso -
program exFunction; var a, b, ret : integer; (*function definition *) function max(num1, num2: integer): integer; var (* local variable declaration *) result: integer; begin if (num1 > num2) then result := num1 else result := num2; max := result; end; begin a := 100; b := 200; (* calling a function to get max value *) ret := max(a, b); writeln( 'Max value is : ', ret ); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Max value is : 200
Pascal - ProcedimentosProcedimentos são subprogramas que, em vez de retornar um único valor, permitemobter um grupo de resultados.
Em Pascal, um procedimento é definido usando a palavra-chave do procedimento . Aforma geral de uma definição de procedimento é a seguinte -
Chamando uma Função
Demonstração ao vivo
Definindo um Procedimento
procedure name(argument(s): type1, argument(s): type 2, ... ); < local declarations > begin < procedure body > end;
Uma definição de procedimento em Pascal consiste em um cabeçalho , declaraçõeslocais e um corpo do procedimento. O cabeçalho do procedimento consiste noprocedimento de palavra-chave e no nome dado ao procedimento. Aqui estão todasas partes de um procedimento -
Argumentos - O (s) argumento (s) estabelecem a ligação entre o programa dechamada e os identificadores de procedimento e também chamados deparâmetros formais. Regras para argumentos em procedimentos são asmesmas que para as funções.
Declarações locais - As declarações locais referem-se às declarações derótulos, constantes, variáveis, funções e procedimentos, que são aplicáveis apenas ao corpo do procedimento.
Corpo do Procedimento - O corpo do procedimento contém uma coleção deinstruções que definem o que o procedimento faz. Deve sempre estar entre aspalavras reservadas começar e terminar. É a parte de um procedimento em quetodos os cálculos são feitos.
A seguir está o código-fonte de um procedimento chamado findMin () . Esteprocedimento usa 4 parâmetros x, y, z e m e armazena o mínimo entre as trêsprimeiras variáveis na variável denominada m. A variável m é passada por referência(discutiremos a passagem de argumentos por referência um pouco mais tarde) -
procedure findMin(x, y, z: integer; var m: integer); (* Finds the minimum of the 3 values *) begin if x < y then m := x else m := y; if z <m then m := z; end; { end of procedure findMin }
Uma declaração de procedimento informa ao compilador sobre um nome deprocedimento e como chamar o procedimento. O corpo real do procedimento pode serdefinido separadamente.
Uma declaração de procedimento tem a seguinte sintaxe -
procedure name(argument(s): type1, argument(s): type 2, ... );
Declarações de Procedimentos
Por favor, note que o nome do procedimento não está associado a nenhum tipo .Para o procedimento acima definido findMin () , segue a declaração -
procedure findMin(x, y, z: integer; var m: integer);
Ao criar um procedimento, você fornece uma definição do que o procedimento devefazer. Para usar o procedimento, você precisará chamar esse procedimento paraexecutar a tarefa definida. Quando um programa chama um procedimento, o controlede programa é transferido para o procedimento chamado. Um procedimento chamadoexecuta a tarefa definida e, quando sua última instrução final é atingida, retorna ocontrole de volta ao programa de chamada.
Para chamar um procedimento, basta passar os parâmetros necessários junto com onome do procedimento, conforme mostrado abaixo -
program exProcedure; var a, b, c, min: integer; procedure findMin(x, y, z: integer; var m: integer); (* Finds the minimum of the 3 values *) begin if x < y then m:= x else m:= y; if z < m then m:= z; end; { end of procedure findMin } begin writeln(' Enter three numbers: '); readln( a, b, c); findMin(a, b, c, min); (* Procedure call *) writeln(' Minimum: ', min); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Enter three numbers:
89 45 67
Minimum: 45
Vimos que um programa ou subprograma pode chamar outro subprograma. Quando umsubprograma chama a si mesmo, ele é chamado de chamada recursiva e o processo éconhecido como recursão.
Chamando um Procedimento
Subprogramas Recursivos
Para ilustrar o conceito, vamos calcular o fatorial de um número. Fatorial de um númeron é definido como -
n! = n*(n-1)! = n*(n-1)*(n-2)! ... = n*(n-1)*(n-2)*(n-3)... 1
O programa a seguir calcula o fatorial de um determinado número, chamando-serecursivamente.
program exRecursion; var num, f: integer; function fact(x: integer): integer; (* calculates factorial of x - x! *) begin if x=0 then fact := 1 else fact := x * fact(x-1); (* recursive call *) end; { end of function fact} begin writeln(' Enter a number: '); readln(num); f := fact(num); writeln(' Factorial ', num, ' is: ' , f); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Enter a number:
5
Factorial 5 is: 120
A seguir, outro exemplo, que gera a Série Fibonacci para um determinado númerousando uma função recursiva -
program recursiveFibonacci; var i: integer; function fibonacci(n: integer): integer; begin if n=1 then fibonacci := 0 else if n=2 then fibonacci := 1 else fibonacci := fibonacci(n-1) + fibonacci(n-2); end; begin for i:= 1 to 10 do
Demonstração ao vivo
write(fibonacci (i), ' '); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
0 1 1 2 3 5 8 13 21 34
Se um subprograma ( função ou procedimento ) for usar argumentos, ele devedeclarar variáveis que aceitam os valores dos argumentos. Essas variáveis sãochamadas de parâmetros formais do subprograma.
Os parâmetros formais se comportam como outras variáveis locais dentro dosubprograma e são criados após a entrada no subprograma e destruídos na saída.
Ao chamar um subprograma, existem duas maneiras pelas quais os argumentos podemser passados para o subprograma -
Sr.Não
Tipo de chamada e descrição
1
Ligue por valorEste método copia o valor real de um argumento no parâmetro formal dosubprograma. Nesse caso, as alterações feitas no parâmetro dentro dosubprograma não afetam o argumento.
2
Ligue por referênciaEste método copia o endereço de um argumento no parâmetro formal. Dentrodo subprograma, o endereço é usado para acessar o argumento real usado nachamada. Isso significa que as alterações feitas no parâmetro afetam oargumento.
Por padrão, o Pascal usa a chamada por valor para passar argumentos. Em geral, issosignifica que o código dentro de um subprograma não pode alterar os argumentosusados para chamar o subprograma. O programa de exemplo que usamos no capítulo'Pascal - Funções' chamou a função chamada max () usando chamada por valor .
Considerando que, o programa de exemplo fornecido aqui ( exProcedure ) chama oprocedimento findMin () usando chamada por referência .
Pascal - Escopo VariávelUm escopo em qualquer programação é uma região do programa em que uma variáveldefinida pode ter sua existência e além dessa variável não pode ser acessada. Existemtrês lugares, onde as variáveis podem ser declaradas na linguagem de programaçãoPascal -
Argumentos de um subprograma
Dentro de um subprograma ou um bloco que é chamado de variáveis locais
Fora de todos os subprogramas que são chamados de variáveis globais
Na definição dos parâmetros do subprograma que é chamado de parâmetrosformais
Vamos explicar quais são variáveis locais e globais e parâmetros formais.
Variáveis que são declaradas dentro de um subprograma ou bloco são chamadas devariáveis locais. Eles podem ser usados apenas por instruções que estão dentro dessesubprograma ou bloco de código. Variáveis locais não são conhecidas por subprogramasfora do seu próprio. A seguir está o exemplo usando variáveis locais. Aqui, todas asvariáveis a , b e c são locais para o programa chamado exLocal .
program exLocal; var a, b, c: integer; begin (* actual initialization *) a := 10; b := 20; c := a + b; writeln('value of a = ', a , ' b = ', b, ' and c = ', c); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
value of a = 10 b = 20 c = 30
Agora, vamos estender pouco mais o programa, vamos criar um procedimento chamadode exibição, que terá o seu próprio conjunto de variáveis a , b e c e exibir seus valores,desde o programa exLocal .
program exLocal; var a, b, c: integer; procedure display; var a, b, c: integer; begin (* local variables *) a := 10; b := 20; c := a + b; writeln('Winthin the procedure display'); writeln('value of a = ', a , ' b = ', b, ' and c = ', c); end; begin a:= 100; b:= 200;
Variáveis Locais
Demonstração ao vivo
Demonstração ao vivo
c:= a + b; writeln('Winthin the program exlocal'); writeln('value of a = ', a , ' b = ', b, ' and c = ', c); display(); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
value of a = 10 b = 20 c = 30
Variáveis globais são definidas fora de uma função, geralmente no topo do programa.As variáveis globais manterão seu valor durante toda a vida útil do programa e poderãoser acessadas dentro de qualquer uma das funções definidas para o programa.
Uma variável global pode ser acessada por qualquer função. Ou seja, uma variávelglobal está disponível para uso em todo o seu programa após sua declaração. A seguir,um exemplo usando variáveis globais e locais -
program exGlobal; var a, b, c: integer; procedure display; var x, y, z: integer; begin (* local variables *) x := 10; y := 20; z := x + y; (*global variables *) a := 30; b:= 40; c:= a + b; writeln('Winthin the procedure display'); writeln(' Displaying the global variables a, b, and c'); writeln('value of a = ', a , ' b = ', b, ' and c = ', c); writeln('Displaying the local variables x, y, and z'); writeln('value of x = ', x , ' y = ', y, ' and z = ', z); end; begin a:= 100; b:= 200; c:= 300; writeln('Winthin the program exlocal'); writeln('value of a = ', a , ' b = ', b, ' and c = ', c);
Variáveis globais
Demonstração ao vivo
display(); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
Displaying the global variables a, b, and c
value of a = 30 b = 40 c = 70
Displaying the local variables x, y, and z
value of x = 10 y = 20 z = 30
Observe que a exibição do procedimento tem acesso às variáveis a, b e c, que sãovariáveis globais em relação à exibição, bem como suas próprias variáveis locais. Umprograma pode ter o mesmo nome para variáveis locais e globais, mas o valor davariável local dentro de uma função terá preferência.
Vamos alterar um pouco o exemplo anterior, agora as variáveis locais para a exibição doprocedimento tem os mesmos nomes que a , b , c -
program exGlobal; var a, b, c: integer; procedure display; var a, b, c: integer; begin (* local variables *) a := 10; b := 20; c := a + b; writeln('Winthin the procedure display'); writeln(' Displaying the global variables a, b, and c'); writeln('value of a = ', a , ' b = ', b, ' and c = ', c); writeln('Displaying the local variables a, b, and c'); writeln('value of a = ', a , ' b = ', b, ' and c = ', c); end; begin a:= 100; b:= 200; c:= 300; writeln('Winthin the program exlocal'); writeln('value of a = ', a , ' b = ', b, ' and c = ', c); display(); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Demonstração ao vivo
Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
Displaying the global variables a, b, and c
value of a = 10 b = 20 c = 30
Displaying the local variables a, b, and c
value of a = 10 b = 20 c = 30
Pascal - CordasA string em Pascal é na verdade uma sequência de caracteres com uma especificaçãode tamanho opcional. Os caracteres podem ser numéricos, letras, espaços em branco,caracteres especiais ou uma combinação de todos. O Extended Pascal fornece váriostipos de objetos string, dependendo do sistema e da implementação. Discutiremos tiposmais comuns de strings usadas em programas.
Você pode definir uma string de várias maneiras -
Matrizes de Caracteres - Esta é uma cadeia de caracteres que é umasequência de zero ou mais caracteres de tamanho de bytes entre aspas simples.
Variáveis de string - A variável do tipo String, conforme definido no TurboPascal.
Strings curtas - A variável do tipo String com especificação de tamanho.
Strings terminadas nulas - A variável do tipo pchar .
AnsiStrings - Ansistrings são strings que não possuem limite de comprimento.
Pascal fornece apenas um operador de string, operador de concatenação de strings (+).
O programa a seguir imprime os primeiros quatro tipos de seqüências de caracteres.Nós usaremos AnsiStrings no próximo exemplo.
program exString; var greetings: string; name: packed array [1..10] of char; organisation: string[10]; message: pchar; begin greetings := 'Hello '; message := 'Good Day!'; writeln('Please Enter your Name'); readln(name); writeln('Please Enter the name of your Organisation'); readln(organisation); writeln(greetings, name, ' from ', organisation);
Exemplos
writeln(message); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Please Enter your Name
John Smith
Please Enter the name of your Organisation
Infotech
Hello John Smith from Infotech
O exemplo a seguir faz uso de poucas outras funções, vamos ver -
program exString; uses sysutils; var str1, str2, str3 : ansistring; str4: string; len: integer; begin str1 := 'Hello '; str2 := 'There!'; (* copy str1 into str3 *) str3 := str1; writeln('appendstr( str3, str1) : ', str3 ); (* concatenates str1 and str2 *) appendstr( str1, str2); writeln( 'appendstr( str1, str2) ' , str1 ); str4 := str1 + str2; writeln('Now str4 is: ', str4); (* total lenghth of str4 after concatenation *) len := byte(str4[0]); writeln('Length of the final string str4: ', len); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
appendstr( str3, str1) : Hello
appendstr( str1, str2) : Hello There!
Now str4 is: Hello There! There!
Length of the final string str4: 18
Pascal suporta uma ampla gama de funções e procedimentos que manipulam strings.Esses subprogramas variam em termos de implementação. Aqui, estamos listandovários subprogramas de manipulação de strings fornecidos pelo Free Pascal -
Sr.Não.
Função e Propósito
1 função AnsiCompareStr (const S1:; const S2 :): Integer;
Demonstração ao vivo
Funções e Procedimentos Pascal String
Compara duas cordas
2função AnsiCompareText (const S1:; const S2 :): Integer;
Compara duas strings, insensível a maiúsculas e minúsculas
3função AnsiExtractQuotedStr (var Src: PChar; Quote: Char) :;
Remove aspas da string
4função AnsiLastChar (const S :): PChar;
Obtém o último caractere de string
5função AnsiLowerCase (const s :):
Converte string para todas as minúsculas
6função AnsiQuotedStr (const S:; Quote: Char) :;
Cita uma string
7função AnsiStrComp (S1: PChar; S2: PChar): Integer;
Compara strings diferencia maiúsculas de minúsculas
8função AnsiStrIComp (S1: PChar; S2: PChar): Integer;
Compara strings sem distinção entre maiúsculas e minúsculas
9
função AnsiStrLComp (S1: PChar; S2: PChar; MaxLen: Cardinal):Integer;
Compara L caracteres de cadeias de caracteres sensíveis a maiúsculas eminúsculas
10
função AnsiStrLIComp (S1: PChar; S2: PChar; MaxLen: Cardinal):Integer;
Compara L caracteres de cadeias de caracteres insensíveis
11função AnsiStrLastChar (Str: PChar): PChar;
Obtém o último caractere de string
12função AnsiStrLower (Str: PChar): PChar;
Converte string para todas as minúsculas
13 função AnsiStrUpper (Str: PChar): PChar;
Converte string em maiúsculas
14função AnsiUpperCase (const s :) :;
Converte string em maiúsculas
15procedure AppendStr (var Dest:; const S :);
Acrescenta 2 cordas
16procedure AssignStr (var P: PString; const S :);
Atribui valor de cadeias na pilha
17function CompareStr (const S1:; const S2 :): Integer; sobrecarga;
Compara duas cadeias de maiúsculas e minúsculas
18função CompareText (const S1:; const S2 :): Integer;
Compara duas cadeias insensíveis
19procedimento DisposeStr (S: PString); sobrecarga;Remove a string da pilha
20procedimento DisposeStr (S: PShortString); sobrecarga;
Remove a string da pilha
21função IsValidIdent (const Ident :): Boolean;
É string um identificador de pascal válido
22função LastDelimiter (const Delimiters:; const S :): Integer;
Última ocorrência de caractere em uma string
23função LeftStr (const S:; Count: Integer) :;
Obtém os primeiros N caracteres de uma string
24function LoadStr (Ident: Integer) :;
Carrega string de recursos
25 função LowerCase (const s:) :; sobrecarga;
Converte string para todas as minúsculas
26função LowerCase (const V: variant) :; sobrecarga;
Converte string para todas as minúsculas
27função NewStr (const S :): PString; sobrecarga;
Aloca nova cadeia na pilha
28função RightStr (const S:; Contagem: Integer) :;
Obtém os últimos N caracteres de uma string
29função StrAlloc (Tamanho: Cardinal): PChar;
Aloca memória para string
30função StrBufSize (Str: PChar): SizeUInt;
Reservas de memória para uma string
31procedimento StrDispose (Str: PChar);
Remove a string da pilha
32função StrPas (Str: PChar) :;
Converte PChar em string de pascal
33função StrPCopy (Dest: PChar; Source :): PChar;
Copia string de pascal
34função StrPLCopy (Dest: PChar; Fonte:; MaxLen: SizeUInt): PChar;
Copia N bytes de string de pascal
35função UpperCase (const s :) :;
Converte string em maiúsculas
Pascal - booleanosO Pascal fornece um tipo de dados booleano que permite aos programadores definir,armazenar e manipular entidades lógicas, como constantes, variáveis, funções eexpressões, etc.
Valores booleanos são basicamente tipo inteiro. Variáveis do tipo booleano possuemdois valores possíveis predefinidos, True e False . As expressões que resolvem um
valor booleano também podem ser atribuídas a um tipo booleano.
Free Pascal também suporta os tipos ByteBool , WordBool e LongBool . Estes sãodo tipo Byte, Word ou Longint, respectivamente.
O valor False é equivalente a 0 (zero) e qualquer valor diferente de zero é consideradoTrue ao converter para um valor booleano. Um valor booleano de True é convertido em-1 caso seja atribuído a uma variável do tipo LongBool.
Note-se que os operadores lógicos e , ou e não são definidos para tipos de dadosbooleanos.
Uma variável do tipo booleano é declarada usando a palavra-chave var.
var boolean-identifier: boolean;
por exemplo,
var choice: boolean;
program exBoolean; var exit: boolean; choice: char; begin writeln('Do you want to continue? '); writeln('Enter Y/y for yes, and N/n for no'); readln(choice); if(choice = 'n') then exit := true else exit := false; if (exit) then writeln(' Good Bye!') else writeln('Please Continue'); readln; end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Do you want to continue?
Enter Y/y for yes, and N/n for no
N
Good Bye!
Declaração de tipos de dados booleanos
Exemplo Demonstração ao vivo
Y
Please Continue
Pascal - MatrizesA linguagem de programação Pascal fornece uma estrutura de dados chamada matriz,que pode armazenar uma coleção sequencial de tamanho fixo de elementos do mesmotipo. Uma matriz é usada para armazenar uma coleção de dados, mas geralmente émais útil pensar em uma matriz como uma coleção de variáveis do mesmo tipo.
Em vez de declarar variáveis individuais, como número1, número2, ... e número100,você declara uma variável de matriz, como números e números de uso [1], números[2] e ..., números [100] para representar variáveis individuais. Um elemento específicoem uma matriz é acessado por um índice.
Todas as matrizes consistem em locais de memória contíguos. O endereço mais baixocorresponde ao primeiro elemento e o endereço mais alto ao último elemento.
Por favor, note que se você quiser uma matriz de estilo C a partir do índice 0, você sóprecisa iniciar o índice de 0, em vez de 1.
Para declarar uma matriz em Pascal, um programador pode declarar o tipo e, emseguida, criar variáveis dessa matriz ou declarar diretamente a variável da matriz.
A forma geral de declaração de tipo de array unidimensional é -
type array-identifier = array[index-type] of element-type;
Onde,
array-identifier - indica o nome do tipo de matriz.
tipo de índice - especifica o subscrito da matriz; pode ser qualquer tipo dedado escalar, exceto o real
tipo de elemento - especifica os tipos de valores que serão armazenados
Por exemplo,
type vector = array [ 1..25] of real; var velocity: vector;
Declarando Matrizes
Agora, velocidade é uma matriz variável de tipo de vetor, que é suficiente para suportaraté 25 números reais.
Para iniciar a matriz do índice 0, a declaração seria -
type vector = array [ 0..24] of real; var velocity: vector;
Em Pascal, um subscrito de array poderia ser de qualquer tipo escalar como, inteiro,booleano, enumerado ou sub-intervalo, exceto real. Os subscritos de array tambémpodem ter valores negativos.
Por exemplo,
type temperature = array [-10 .. 50] of real; var day_temp, night_temp: temperature;
Vamos pegar outro exemplo em que o subscrito é do tipo de caractere -
type ch_array = array[char] of 1..26; var alphabet: ch_array;
Subscrito poderia ser do tipo enumerado -
type color = ( red, black, blue, silver, beige); car_color = array of [color] of boolean; var car_body: car_color;
Em Pascal, os arrays são inicializados por meio de atribuição, seja especificando umsubscrito específico ou usando um loop de tarefas.
Por exemplo -
type ch_array = array[char] of 1..26; var alphabet: ch_array; c: char; begin ... for c:= 'A' to 'Z' do alphabet[c] := ord[m]; (* the ord() function returns the ordinal values *)
Tipos de Subscrito de Matriz
Inicializando matrizes
Um elemento é acessado pela indexação do nome da matriz. Isso é feito colocando oíndice do elemento dentro de colchetes após o nome da matriz. Por exemplo -
a: integer; a: = alphabet['A'];
A declaração acima pegará o primeiro elemento da matriz chamada alphabet e atribuiráo valor à variável a.
A seguir, um exemplo, que usará todos os três conceitos acima mencionados, viz.declaração, atribuição e acesso a matrizes -
program exArrays; var n: array [1..10] of integer; (* n is an array of 10 integers *) i, j: integer; begin (* initialize elements of array n to 0 *) for i := 1 to 10 do n[ i ] := i + 100; (* set element at location i to i + 100 *) (* output each array element's value *) for j:= 1 to 10 do writeln('Element[', j, '] = ', n[j] ); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109
Element[10] = 110
Matrizes são importantes para Pascal e devem precisar de mais detalhes. Existemalguns conceitos importantes relacionados a matriz que devem ser claros para umprogramador Pascal -
Sr.Não
Conceito e Descrição
1 Matrizes multidimensionais
Acessando Elementos da Matriz
Demonstração ao vivo
Matrizes de Pascal em detalhe
Pascal suporta matrizes multidimensionais. A forma mais simples do arraymultidimensional é o array bidimensional.
2
Matriz dinâmicaNeste tipo de matrizes, o comprimento inicial é zero. O comprimento real damatriz deve ser definido com a função padrão SetLength .
3
Matriz empacotadaEsses arrays são bit-packed, ou seja, cada caractere ou valores de verdade sãoarmazenados em bytes consecutivos ao invés de usar uma unidade dearmazenamento, geralmente uma palavra (4 bytes ou mais).
4
Passando matrizes para subprogramasVocê pode passar para um subprograma um ponteiro para uma matrizespecificando o nome da matriz sem um índice.
Pascal - ponteirosPonteiros em Pascal são fáceis e divertidos de aprender. Algumas tarefas deprogramação Pascal são executadas mais facilmente com ponteiros, e outras tarefas,como alocação de memória dinâmica, não podem ser executadas sem o uso deponteiros. Por isso, torna-se necessário aprender os ponteiros para se tornar umperfeito programador Pascal. Vamos começar a aprendê-las em etapas simples e fáceis.
Como você sabe, cada variável é um local de memória e cada localização de memóriatem seu endereço definido, que pode ser acessado usando o nome da variável deponteiro, que indica um endereço na memória.
Um ponteiro é uma variável dinâmica, cujo valor é o endereço de outra variável, isto é,endereço direto da localização da memória. Como qualquer variável ou constante, vocêdeve declarar um ponteiro antes de poder usá-lo para armazenar qualquer endereçovariável. A forma geral de uma declaração de variável de ponteiro é -
type ptr-identifier = ^base-variable-type;
O tipo de ponteiro é definido prefixando a seta para cima do símbolo de interpolação(^) com o tipo base. O tipo base define os tipos de itens de dados. Quando umavariável de ponteiro é definida para ser de determinado tipo, ela pode apontar itens dedados apenas desse tipo. Uma vez definido um tipo de ponteiro, podemos usar adeclaração var para declarar variáveis de ponteiro.
var p1, p2, ... : ptr-identifier;
Quais são os ponteiros?
A seguir estão algumas declarações de ponteiro válidas -
type Rptr = ^real; Cptr = ^char; Bptr = ^ Boolean; Aptr = ^array[1..5] of real; date-ptr = ^ date; Date = record Day: 1..31; Month: 1..12; Year: 1900..3000; End; var a, b : Rptr; d: date-ptr;
As variáveis de ponteiro são desreferenciadas usando o mesmo sinal de circunflexo (^).Por exemplo, a variável associada referida por um ponteiro rptr é rptr ^ . Pode seracessado como -
rptr^ := 234.56;
O exemplo a seguir ilustrará esse conceito -
program exPointers; var number: integer; iptr: ^integer; begin number := 100; writeln('Number is: ', number); iptr := @number; writeln('iptr points to a value: ', iptr^); iptr^ := 200; writeln('Number is: ', number); writeln('iptr points to a value: ', iptr^); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200
Em Pascal, podemos atribuir o endereço de uma variável a uma variável de ponteirousando o operador de endereço (@). Usamos esse ponteiro para manipular e acessar oitem de dados. No entanto, se por algum motivo, precisarmos trabalhar com o próprioendereço de memória, precisamos armazená-lo em uma variável de tipo de palavra.
Demonstração ao vivo
Imprimir um endereço de memória em Pascal
Vamos estender o exemplo acima para imprimir o endereço de memória armazenado noponteiro iptr -
program exPointers; var number: integer; iptr: ^integer; y: ^word; begin number := 100; writeln('Number is: ', number); iptr := @number; writeln('iptr points to a value: ', iptr^); iptr^ := 200; writeln('Number is: ', number); writeln('iptr points to a value: ', iptr^); y := addr(iptr); writeln(y^); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200
45504
É sempre uma boa prática atribuir um valor NIL a uma variável de ponteiro, caso vocênão tenha o endereço exato a ser atribuído. Isso é feito no momento da declaração davariável. Um ponteiro atribuído a NIL aponta para lugar nenhum. Considere o seguinteprograma -
program exPointers; var number: integer; iptr: ^integer; y: ^word; begin iptr := nil; y := addr(iptr); writeln('the vaule of iptr is ', y^); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
The value of ptr is 0
Para verificar um ponteiro nulo, você pode usar uma instrução if da seguinte forma -
Demonstração ao vivo
Ponteiros NIL
Demonstração ao vivo
if(ptr <> nill )then (* succeeds if p is not null *) if(ptr = nill)then (* succeeds if p is null *)
Os ponteiros têm muitos conceitos, mas são muito importantes para a programação emPascal. Existem alguns conceitos importantes de ponteiro, que devem ser claros paraum programador Pascal -
Sr.Não
Conceito e Descrição
1
Pascal - aritmética de ponteiroExistem quatro operadores aritméticos que podem ser usados em ponteiros:incremento, decremento, +, -
2Pascal - matriz de ponteirosVocê pode definir matrizes para manter um número de ponteiros.
3
Pascal - ponteiro para ponteiroPascal permite que você tenha um ponteiro em um ponteiro e assim pordiante.
4
Passando ponteiros para subprogramas em PascalPassar um argumento por referência ou por endereço permite que oargumento transmitido seja alterado no subprograma de chamada pelosubprograma chamado.
5Retornar ponteiro de subprogramas em PascalPascal permite que um subprograma retorne um ponteiro.
Pascal - RecordsOs arrays Pascal permitem que você defina o tipo de variáveis que podem conter váriositens de dados do mesmo tipo, mas um registro é outro tipo de dados definidos pelousuário disponível em Pascal que permite combinar itens de dados de diferentes tipos.
Registros consistem em campos diferentes. Suponha que você queira acompanhar seuslivros em uma biblioteca. Você pode acompanhar os seguintes atributos sobre cadalivro:
Título
Autor
Sujeito
ID do livro
Ponteiros Pascal em Detalhe
Para definir um tipo de registro, você pode usar a declaração de declaração de tipo. Otipo de registro é definido como -
type record-name = record field-1: field-type1; field-2: field-type2; ... field-n: field-typen; end;
Aqui está a maneira que você declararia o registro do Livro -
type Books = record title: packed array [1..50] of char; author: packed array [1..50] of char; subject: packed array [1..100] of char; book_id: integer; end;
As variáveis de registro são definidas da maneira usual
var r1, r2, ... : record-name;
Alternativamente, você pode definir diretamente uma variável de tipo de registro como-
var Books : record title: packed array [1..50] of char; author: packed array [1..50] of char; subject: packed array [1..100] of char; book_id: integer; end;
Para acessar qualquer campo de um registro, usamos o operador de acesso de membro(.). O operador de acesso de membro é codificado como um período entre o nome davariável de registro e o campo que desejamos acessar. A seguir, o exemplo paraexplicar o uso da estrutura -
program exRecords; type Books = record title: packed array [1..50] of char; author: packed array [1..50] of char; subject: packed array [1..100] of char; book_id: longint; end; var
Definindo um registro
Acessando campos de um registro
Demonstração ao vivo
Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *) begin (* book 1 specification *) Book1.title := 'C Programming'; Book1.author := 'Nuha Ali '; Book1.subject := 'C Programming Tutorial'; Book1.book_id := 6495407; (* book 2 specification *) Book2.title := 'Telecom Billing'; Book2.author := 'Zara Ali'; Book2.subject := 'Telecom Billing Tutorial'; Book2.book_id := 6495700; (* print Book1 info *) writeln ('Book 1 title : ', Book1.title); writeln('Book 1 author : ', Book1.author); writeln( 'Book 1 subject : ', Book1.subject); writeln( 'Book 1 book_id : ', Book1.book_id); writeln; (* print Book2 info *) writeln ('Book 2 title : ', Book2.title); writeln('Book 2 author : ', Book2.author); writeln( 'Book 2 subject : ', Book2.subject); writeln( 'Book 2 book_id : ', Book2.book_id); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700
Você pode passar um registro como um argumento de subprograma de maneira muitosemelhante à passagem de qualquer outra variável ou ponteiro. Você acessaria oscampos de registro da mesma forma que acessou no exemplo acima -
program exRecords; type Books = record title: packed array [1..50] of char; author: packed array [1..50] of char; subject: packed array [1..100] of char; book_id: longint; end; var Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *)
Registros como Argumentos do Subprograma
Demonstração ao vivo
(* procedure declaration *) procedure printBook( var book: Books ); begin (* print Book info *) writeln ('Book title : ', book.title); writeln('Book author : ', book.author); writeln( 'Book subject : ', book.subject); writeln( 'Book book_id : ', book.book_id); end; begin (* book 1 specification *) Book1.title := 'C Programming'; Book1.author := 'Nuha Ali '; Book1.subject := 'C Programming Tutorial'; Book1.book_id := 6495407; (* book 2 specification *) Book2.title := 'Telecom Billing'; Book2.author := 'Zara Ali'; Book2.subject := 'Telecom Billing Tutorial'; Book2.book_id := 6495700; (* print Book1 info *) printbook(Book1); writeln; (* print Book2 info *) printbook(Book2); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700
Você pode definir ponteiros para registros de maneira muito semelhante ao definir oponteiro para qualquer outra variável da seguinte maneira -
type record-ptr = ^ record-name; record-name = record field-1: field-type1; field-2: field-type2; ... field-n: field-typen; end;
Ponteiros para Registros
Agora, você pode armazenar o endereço de uma variável de tipo de registro na variávelde ponteiro acima definida. Para declarar uma variável do tipo de ponteiro criado, use apalavra-chave var -
var r1, r2, ... : record-ptr;
Antes de usar esses ponteiros, você deve criar armazenamento para uma variável detipo de nome de registro, que será manipulada por esses ponteiros.
new(r1); new(r2);
Para acessar os membros de um registro usando um ponteiro para esse registro, vocêdeve usar o ^. operador da seguinte forma -
r1^.feild1 := value1; r1^.feild2 := value2; ... r1^fieldn := valuen;
Finalmente, não esqueça de descartar o armazenamento usado, quando ele não estivermais em uso -
dispose(r1); dispose(r2);
Vamos reescrever o primeiro exemplo usando um ponteiro para o registro Books.Espero que isso seja fácil para você entender o conceito -
program exRecords; type BooksPtr = ^ Books; Books = record title: packed array [1..50] of char; author: packed array [1..50] of char; subject: packed array [1..100] of char; book_id: longint; end; var (* Declare Book1 and Book2 of pointer type that refers to Book type *) Book1, Book2: BooksPtr; begin new(Book1); new(book2); (* book 1 specification *) Book1^.title := 'C Programming'; Book1^.author := 'Nuha Ali '; Book1^.subject := 'C Programming Tutorial'; Book1^.book_id := 6495407; (* book 2 specification *) Book2^.title := 'Telecom Billing'; Book2^.author := 'Zara Ali'; Book2^.subject := 'Telecom Billing Tutorial';
Demonstração ao vivo
Book2^.book_id := 6495700; (* print Book1 info *) writeln ('Book 1 title : ', Book1^.title); writeln('Book 1 author : ', Book1^.author); writeln( 'Book 1 subject : ', Book1^.subject); writeln( 'Book 1 book_id : ', Book1^.book_id); (* print Book2 info *) writeln ('Book 2 title : ', Book2^.title); writeln('Book 2 author : ', Book2^.author); writeln( 'Book 2 subject : ', Book2^.subject); writeln( 'Book 2 book_id : ', Book2^.book_id); dispose(Book1); dispose(Book2); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700
Discutimos que os membros de um registro podem ser acessados usando o operador deacesso de membro (.). Desta forma, o nome da variável de registro deve ser escritotoda vez. A instrução With fornece uma maneira alternativa de fazer isso.
Veja o seguinte trecho de código retirado do nosso primeiro exemplo -
(* book 1 specification *) Book1.title := 'C Programming'; Book1.author := 'Nuha Ali '; Book1.subject := 'C Programming Tutorial'; Book1.book_id := 6495407;
A mesma atribuição pode ser escrita usando a instrução With como -
(* book 1 specification *) With Book1 do begin title := 'C Programming'; author := 'Nuha Ali '; subject := 'C Programming Tutorial'; book_id := 6495407; end;
Pascal - Variantes
A declaração com
Pascal suporta um tipo exclusivo de armazenamento denominado variantes. Você podeatribuir qualquer tipo simples de valores em uma variável variante. O tipo de valorarmazenado em uma variante é determinado apenas no tempo de execução. Quasequalquer tipo simples pode ser atribuído a variantes: tipos ordinais, tipos de string,tipos int64.
Tipos estruturados, como conjuntos, registros, matrizes, arquivos, objetos e classes,não são compatíveis com atribuição com uma variante. Você também pode atribuir umponteiro a uma variante.
Free Pascal suporta variantes.
Você pode declarar o tipo de variante como qualquer outro tipo usando a palavra-chavevar . A sintaxe para declarar um tipo de variante é -
var v: variant;
Agora, essa variável variante v pode ser atribuída a quase todos os tipos simples,incluindo os tipos enumerados e vice-versa.
type color = (red, black, white); var v : variant; i : integer; b : byte; w : word; q : int64; e : extended; d : double; en : color; as : ansistring; ws : widestring; begin v := i; v := b; v := w; v := q; v := e; v := en; v := d: v := as; v := ws; end;
O exemplo a seguir ilustraria o conceito -
Program exVariant; uses variants;
Declarando uma variante
Exemplo
Demonstração ao vivo
type color = (red, black, white); var v : variant; i : integer; r: real; c : color; as : ansistring; begin i := 100; v:= i; writeln('Variant as Integer: ', v); r:= 234.345; v:= r; writeln('Variant as real: ', v); c := red; v := c; writeln('Variant as Enumerated data: ', v); as:= ' I am an AnsiString'; v:= as; writeln('Variant as AnsiString: ', v); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Variant as Integer: 100
Variant as real: 234.345
Variant as Enumerated data: 0
Variant as AnsiString: I am an AnsiString
Pascal - ConjuntosUm conjunto é uma coleção de elementos do mesmo tipo. Pascal permite definir o tipode dados definido. Os elementos em um conjunto são chamados de seus membros. Namatemática, os conjuntos são representados colocando os membros entre chaves {} .No entanto, em Pascal, os elementos de conjunto são colocados entre colchetes [], quesão referidos como construtor de conjunto.
Os tipos de conjunto Pascal são definidos como
type set-identifier = set of base type;
Variáveis do tipo de conjunto são definidas como
var s1, s2, ...: set-identifier;
ou,
Definindo tipos e variáveis de conjunto
s1, s2...: set of base type;
Exemplos de alguma declaração de tipo de conjunto válida são -
type Days = (mon, tue, wed, thu, fri, sat, sun); Letters = set of char; DaySet = set of days; Alphabets = set of 'A' .. 'Z'; studentAge = set of 13..20;
Você pode executar as seguintes operações de conjunto em conjuntos Pascal.
Sr.Não
Operações e descrições
1
União
Isso une dois conjuntos e fornece um novo conjunto com membros de ambosos conjuntos.
2
Diferença
Obtém a diferença de dois conjuntos e fornece um novo conjunto comelementos não comuns a nenhum conjunto.
3
Interseção
Obtém a interseção de dois conjuntos e fornece um novo conjunto comelementos comuns aos dois conjuntos.
4
Inclusão
Um conjunto P é incluído no conjunto Q, se todos os itens em P tambémestiverem em Q, mas não vice-versa.
5
Diferença simétrica
Obtém a diferença simétrica de dois conjuntos e fornece um conjunto deelementos, que estão em um dos conjuntos e não em sua interseção.
6Em
Ele verifica a associação.
A tabela a seguir mostra todos os operadores definidos suportados pelo Free Pascal.Suponha que S1 e S2 sejam dois conjuntos de caracteres, tais que -
Definir operadores
S1: = ['a', 'b', 'c'];
S2: = ['c', 'd', 'e'];
Operador Descrição Exemplo
+ União de dois conjuntosS1 + S2 vai dar um set
['a', 'b', 'c', 'd', 'e']
- Diferença de dois conjuntosS1 - S2 vai dar um set
['a', 'b']
* Intersecção de dois conjuntosS1 * S2 dará um set
['c']
> < Diferença simétrica de dois conjuntosS1> <S2 dará um set ['a', 'b', 'd',
'e']
= Verifica a igualdade de dois conjuntosS1 = S2 dará o valor booleano
False
<> Verifica a não igualdade de dois conjuntosS1 <> S2 dará o valor booleano
True
<=Contém (Verifica se um conjunto é um
subconjunto do outro)
S1 <= S2 dará o valor booleanoFalse
IncluirInclui um elemento no conjunto;
basicamente é a união de um conjunto eum elemento do mesmo tipo de base
Incluir (S1, ['d']) dará umconjunto
['a', 'b', 'c', 'd']
Excluir
Exclui um elemento de um conjunto;basicamente é a diferença de um conjunto
e um elemento do mesmo tipo de base
Excluir (S2, ['d']) dará umconjunto
['c', 'e']
EmVerifica a associação definida de um
elemento em um conjunto
['e'] em S2 fornece o valorbooleano True
O exemplo a seguir ilustra o uso de alguns desses operadores -
program setColors; type color = (red, blue, yellow, green, white, black, orange); colors = set of color;
Exemplo
Demonstração ao vivo
procedure displayColors(c : colors); const names : array [color] of String[7] = ('red', 'blue', 'yellow', 'green', 'white', 'black', 'orange'); var cl : color; s : String; begin s:= ' '; for cl:=red to orange do if cl in c then begin if (s<>' ') then s :=s +' , '; s:=s+names[cl]; end; writeln('[',s,']'); end; var c : colors; begin c:= [red, blue, yellow, green, white, black, orange]; displayColors(c); c:=[red, blue]+[yellow, green]; displayColors(c); c:=[red, blue, yellow, green, white, black, orange] - [green, white]; displayColors(c); c:= [red, blue, yellow, green, white, black, orange]*[green, white]; displayColors(c); c:= [red, blue, yellow, green]><[yellow, green, white, black]; displayColors(c); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
[ red , blue , yellow , green , white , black , orange]
[ red , blue , yellow , green]
[ red , blue , yellow , black , orange]
[ green , white]
[ red , blue , white , black]
Pascal - Manuseamento de FicheirosPascal trata um arquivo como uma seqüência de componentes, que deve ser do tipouniforme. O tipo de um arquivo é determinado pelo tipo dos componentes. O tipo dedados do arquivo é definido como -
type file-name = file of base-type;
Onde, o tipo base indica o tipo dos componentes do arquivo. O tipo base poderia serqualquer coisa como integer, real, Boolean, enumerated, subrange, record, arrays e
sets, exceto outro tipo de arquivo. Variáveis de um tipo de arquivo são criadas usando adeclaração var -
var f1, f2,...: file-name;
A seguir estão alguns exemplos de definição de alguns tipos de arquivo e variáveis dearquivo -
type rfile = file of real; ifile = file of integer; bfile = file of boolean; datafile = file of record arrfile = file of array[1..4] of integer; var marks: arrfile; studentdata: datafile; rainfalldata: rfile; tempdata: ifile; choices: bfile;
Vamos escrever um programa que crie um arquivo de dados para os registros dosalunos. Criaria um arquivo chamado students.dat e gravaria os dados de um aluno nele-
program DataFiles; type StudentRecord = Record s_name: String; s_addr: String; s_batchcode: String; end; var Student: StudentRecord; f: file of StudentRecord; begin Assign(f,'students.dat'); Rewrite(f); Student.s_name := 'John Smith'; Student.s_addr := 'United States of America'; Student.s_batchcode := 'Computer Science'; Write(f,Student); Close(f); end.
Quando compilado e executado, o programa criaria um arquivo chamado students.datno diretório de trabalho. Você pode abrir o arquivo usando um editor de texto, como obloco de notas, para examinar os dados de John Smith.
Criando e escrevendo em um arquivo
Lendo de um arquivo
Acabamos de criar e escrever em um arquivo chamado students.dat. Agora, vamosescrever um programa que leia os dados do aluno do arquivo -
program DataFiles; type StudentRecord = Record s_name: String; s_addr: String; s_batchcode: String; end; var Student: StudentRecord; f: file of StudentRecord; begin assign(f, 'students.dat'); reset(f); while not eof(f) do begin read(f,Student); writeln('Name: ',Student.s_name); writeln('Address: ',Student.s_addr); writeln('Batch Code: ', Student.s_batchcode); end; close(f); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Name: John Smith
Address: United States of America
Batch Code: Computer Science
Pascal permite que variáveis de arquivo sejam usadas como parâmetros emsubprogramas padrão e definidos pelo usuário. O exemplo a seguir ilustra esseconceito. O programa cria um arquivo chamado rainfall.txt e armazena alguns dados deprecipitação. Em seguida, ele abre o arquivo, lê os dados e calcula a precipitaçãomédia.
Por favor, note que, se você usar um parâmetro de arquivo com subprogramas,ele deve ser declarado como um parâmetro var.
program addFiledata; const MAX = 4; type raindata = file of real; var rainfile: raindata; filename: string; procedure writedata(var f: raindata);
Arquivos como Parâmetro do Subprograma
var data: real; i: integer; begin rewrite(f, sizeof(data)); for i:=1 to MAX do begin writeln('Enter rainfall data: '); readln(data); write(f, data); end; close(f); end; procedure computeAverage(var x: raindata); var d, sum: real; average: real; begin reset(x); sum:= 0.0; while not eof(x) do begin read(x, d); sum := sum + d; end; average := sum/MAX; close(x); writeln('Average Rainfall: ', average:7:2); end; begin writeln('Enter the File Name: '); readln(filename); assign(rainfile, filename); writedata(rainfile); computeAverage(rainfile); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Enter the File Name:
rainfall.txt
Enter rainfall data:
34
Enter rainfall data:
45
Enter rainfall data:
56
Enter rainfall data:
78
Average Rainfall: 53.25
Um arquivo de texto, em Pascal, consiste em linhas de caracteres em que cada linha éterminada com um marcador de fim de linha. Você pode declarar e definir essesarquivos como -
type file-name = text;
A diferença entre um arquivo normal de caracteres e um arquivo de texto é que umarquivo de texto é dividido em linhas, cada uma finalizada por um marcador especial defim de linha, inserido automaticamente pelo sistema. O exemplo a seguir cria e gravaem um arquivo de texto chamado contact.txt -
program exText; var filename, data: string; myfile: text; begin writeln('Enter the file name: '); readln(filename); assign(myfile, filename); rewrite(myfile); writeln(myfile, 'Note to Students: '); writeln(myfile, 'For details information on Pascal Programming'); writeln(myfile, 'Contact: Tutorials Point'); writeln('Completed writing'); close(myfile); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Enter the file name:
contact.txt
Completed writing
Anexar a um arquivo significa gravar em um arquivo existente que já tenha algunsdados sem sobrescrever o arquivo. O programa a seguir ilustra isso -
program exAppendfile; var myfile: text; info: string; begin assign(myfile, 'contact.txt'); append(myfile); writeln('Contact Details'); writeln('[email protected]');
Arquivos de texto
Anexando a um arquivo
close(myfile); (* let us read from this file *) assign(myfile, 'contact.txt'); reset(myfile); while not eof(myfile) do begin readln(myfile, info); writeln(info); end; close(myfile); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Contact Details
Note to Students:
For details information on Pascal Programming
Contact: Tutorials Point
Free Pascal fornece as seguintes funções / procedimentos para manipulação de arquivos-
Sr.Não.
Nome e descrição da função
1procedimento Append (var t: Text);
Abre um arquivo no modo de anexação
2procedure Atribuir (out f: file; const Name :);
Atribui um nome a um arquivo
3procedure Atribuir (out f: file; p: PChar);
Atribui um nome a um arquivo
4procedure Atribuir (out f: file; c: Char);
Atribui um nome a um arquivo
5procedure Atribuir (fora f: TypedFile; const Name :);
Atribui um nome a um arquivo
6 procedure Atribuir (fora f: TypedFile; p: PChar);
Atribui um nome a um arquivo
Funções de manipulação de arquivos
7procedure Atribuir (out f: TypedFile; c: Char);
Atribui um nome a um arquivo
8Atribuir procedimento (out t: Text; const s :);
Atribui um nome a um arquivo
9procedure Assign (out t: Texto; p: PChar);
Atribui um nome a um arquivo
10Atribuir procedimento (out t: Text; c: Char);
Atribui um nome a um arquivo
11
procedimento BlockRead (var f: arquivo; var Buf; contagem: Int64;var Resultado: Int64);
Lê dados de um arquivo na memória
12
procedimento BlockRead (var f: arquivo; var Buf; count: LongInt; varResultado: LongInt);
Lê dados de um arquivo na memória
13
procedimento BlockRead (var f: arquivo; var Buf; contagem: Cardinal;var Resultado: Cardinal);
Lê dados de um arquivo na memória
14
procedimento BlockRead (var f: arquivo; var Buf; count: Word; varResultado: Word);
Lê dados de um arquivo na memória
15
procedimento BlockRead (var f: arquivo; var Buf; count: Word; varResultado: Integer);
Lê dados de um arquivo na memória
16procedimento BlockRead (var f: arquivo; var Buf; contagem: Int64);
Lê dados de um arquivo na memória
17 procedimento BlockWrite (var f: arquivo; const Buf; Contagem: Int64;var Resultado: Int64);
Grava dados da memória em um arquivo
18
procedimento BlockWrite (var f: arquivo; const Buf; Contagem:LongInt; var Resultado: LongInt);
Grava dados da memória em um arquivo
19
procedimento BlockWrite (var f: arquivo; const Buf; Contagem:Cardinal; var Resultado: Cardinal);
Grava dados da memória em um arquivo
20
procedimento BlockWrite (var f: arquivo; const Buf; Contagem: Word;var Resultado: Word);
Grava dados da memória em um arquivo
21
procedimento BlockWrite (var f: arquivo; const Buf; Contagem: Word;var Resultado: Integer);
Grava dados da memória em um arquivo
22
procedimento BlockWrite (var f: arquivo; const Buf; Contagem:LongInt);
Grava dados da memória em um arquivo
23procedure Close (var f: arquivo);
Fecha um arquivo
24procedure Close (var t: texto);
Fecha um arquivo
25função EOF (var f: file): Boolean;
Verifica o final do arquivo
26função EOF (var t: Text): Boolean;
Verifica o final do arquivo
27função EOF: Boolean;
Verifica o final do arquivo
28 função EOLn (var t: Text): Boolean;
Cheques para o final da linha
29função EOLn: Boolean;
Cheques para o final da linha
30procedimento Erase (var f: file);
Exclui o arquivo do disco
31procedimento Apagar (var t: Texto);
Exclui o arquivo do disco
32função FilePos (var f: file): Int64;
Posição no arquivo
33função FileSize (var f: file): Int64;
Tamanho do arquivo
34procedimento Flush (var t: Text);
Grava buffers de arquivos no disco
35função IOResult: Word;
Retorna o resultado da última operação do IO do arquivo
36leitura do procedimento (var F: Text; Args: Arguments);
Lê do arquivo em variável
37leitura do procedimento (Args: Argumentos);
Lê do arquivo em variável
38procedimento ReadLn (var F: Text; Args: Arguments);
Lê do arquivo para a variável e vai para a próxima linha
39procedimento ReadLn (Args: Arguments);
Lê do arquivo para a variável e vai para a próxima linha
40procedimento Renomear (var f: arquivo; const s :);
Renomeia o arquivo no disco
41 procedimento Renomear (var f: file; p: PChar);
Renomeia o arquivo no disco
42procedimento Renomear (var f: file; c: Char);
Renomeia o arquivo no disco
43procedimento Renomear (var t: Text; const s);
Renomear arquivo no disco
44procedimento Renomear (var t: Text; p: PChar);
Renomeia o arquivo no disco
45procedimento Renomear (var t: Text; c: Char);
Renomeia o arquivo no disco
46procedimento Reset (var f: file; l: LongInt);
Abre o arquivo para leitura
47procedimento Reset (var f: file);
Abre o arquivo para leitura
48procedimento Reset (var f: TypedFile);
Abre o arquivo para leitura
49procedimento Reset (var t: Text);
Abre o arquivo para leitura
50Procedimento Reescreva (var f: file; l: LongInt);
Abre o arquivo para escrever
51procedimento Reescreva (var f: file);
Abre o arquivo para escrever
52procedimento Reescreva (var f: TypedFile);
Abre o arquivo para escrever
53 procedimento Reescreva (var t: Text);
Abre o arquivo para escrever
54procedimento Seek (var f: file; Pos: Int64);
Define a posição do arquivo
55função SeekEOF (var t: Text): Boolean;
Define a posição do arquivo para o final do arquivo
56function SeekEOF: Boolean;
Define a posição do arquivo para o final do arquivo
57function SeekEOLn (var t: Text): Boolean;
Define a posição do arquivo para o final da linha
58function SeekEOLn: Boolean;
Define a posição do arquivo para o final da linha
59procedimento SetTextBuf (var f: Text; var Buf);
Define o tamanho do buffer de arquivo
60procedimento SetTextBuf (var f: Texto; var Buf; Tamanho: SizeInt);
Define o tamanho do buffer de arquivo
61truncar procedimento (var F: arquivo);
Truncar o arquivo na posição
62procedimento Write (Args: Arguments);
Escreve variável para arquivo
63procedimento Write (var F: Text; Args: Argumentos);
Escrever variável para arquivo
64procedimento Writeln (Args: Argumentos);
Escreve variável para arquivar e anexar nova linha
65procedimento WriteLn (var F: Text; Args: Arguments);
Escreve variável para arquivar e anexar nova linha
Pascal - Gerenciamento De MemóriaEste capítulo explica o gerenciamento de memória dinâmica em Pascal. A linguagem deprogramação Pascal fornece várias funções para alocação e gerenciamento de memória.
Ao fazer programação, se você está ciente sobre o tamanho de um array, então é fácil evocê pode defini-lo como um array. Por exemplo, para armazenar um nome de qualquerpessoa, ele pode ir no máximo 100 caracteres para que você possa definir algo daseguinte forma:
var name: array[1..100] of char;
Mas agora, vamos considerar uma situação em que você não tem idéia sobre otamanho do texto que precisa armazenar, por exemplo, você deseja armazenar umadescrição detalhada sobre um tópico. Aqui, precisamos definir um ponteiro para stringsem definir quanta memória é necessária.
Pascal fornece um novo procedimento para criar variáveis de ponteiro.
program exMemory; var name: array[1..100] of char; description: ^string; begin name:= 'Zara Ali'; new(description); if not assigned(description) then writeln(' Error - unable to allocate required memory') else description^ := 'Zara ali a DPS student in class 10th'; writeln('Name = ', name ); writeln('Description: ', description^ ); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Name = Zara Ali
Description: Zara ali a DPS student in class 10th
Agora, se você precisar definir um ponteiro com um número específico de bytes a serreferido posteriormente, você deve usar a função getmem ou o procedimento getmem, que possui a seguinte sintaxe -
procedure Getmem( out p: pointer; Size: PtrUInt ); function GetMem(
Alocando Memória Dinamicamente
size: PtrUInt ):pointer;
No exemplo anterior, declaramos um ponteiro para uma string. Uma string tem umvalor máximo de 255 bytes. Se você realmente não precisa de tanto espaço, ou umespaço maior, em termos de bytes, o subprograma getmem permite especificar isso.Vamos reescrever o exemplo anterior, usando o getmem -
program exMemory; var name: array[1..100] of char; description: ^string; begin name:= 'Zara Ali'; description := getmem(200); if not assigned(description) then writeln(' Error - unable to allocate required memory') else description^ := 'Zara ali a DPS student in class 10th'; writeln('Name = ', name ); writeln('Description: ', description^ ); freemem(description); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Name = Zara Ali
Description: Zara ali a DPS student in class 10th
Assim, você tem controle total e pode passar qualquer valor de tamanho ao alocarmemória ao contrário de arrays, onde uma vez que você definiu o tamanho não podeser alterado.
Quando o programa é lançado, o sistema operacional libera automaticamente toda amemória alocada pelo seu programa, mas como uma boa prática quando você nãoprecisa mais de memória, você deve liberar essa memória.
Pascal fornece o procedimento dispor para libertar uma variável criada dinamicamenteusando o procedimento de novo. Se você alocou memória usando o subprogramagetmem , então você precisa usar o subemprograma freemem para liberar essamemória. Os subprogramas freemem possuem a seguinte sintaxe -
procedure Freemem( p: pointer; Size: PtrUInt ); function Freemem( p: pointer ):PtrUInt;
Demonstração ao vivo
Redimensionando e liberando memória
Como alternativa, você pode aumentar ou diminuir o tamanho de um bloco de memóriaalocado chamando a função ReAllocMem . Vamos verificar o programa acima, mais umavez e fazer uso de ReAllocMem e FreeMem subprogramas. A seguir, a sintaxe deReAllocMem -
function ReAllocMem( var p: pointer; Size: PtrUInt ):pointer;
A seguir é um exemplo que faz uso de ReAllocMem e FreeMem subprogramas -
program exMemory; var name: array[1..100] of char; description: ^string; desp: string; begin name:= 'Zara Ali'; desp := 'Zara ali a DPS student.'; description := getmem(30); if not assigned(description) then writeln('Error - unable to allocate required memory') else description^ := desp; (* Suppose you want to store bigger description *) description := reallocmem(description, 100); desp := desp + ' She is in class 10th.'; description^:= desp; writeln('Name = ', name ); writeln('Description: ', description^ ); freemem(description); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Name = Zara Ali
Description: Zara ali a DPS student. She is in class 10th
O Pascal fornece uma grande quantidade de funções de gerenciamento de memória quesão usadas na implementação de várias estruturas de dados e na implementação deprogramação de baixo nível em Pascal. Muitas dessas funções dependem daimplementação. Free Pascal fornece as seguintes funções e procedimentos paragerenciamento de memória -
SN Nome e descrição da função
1 função Addr (X: TAnytype): Ponteiro;
Demonstração ao vivo
Funções de gerenciamento de memória
Retorna o endereço da variável
2função atribuída (P: Pointer): Boolean;
Verifica se um ponteiro é válido
3função CompareByte (const buf1; const buf2; len: SizeInt): SizeInt;
Compara 2 buffers de memória byte por byte
4função CompareChar (const buf1; const buf2; len: SizeInt): SizeInt;
Compara 2 buffers de memória byte por byte
5função CompareDWord (const buf1; const buf2; len: SizeInt): SizeInt;
Compara 2 buffers de memória byte por byte
6função CompareWord (const buf1; const buf2; len: SizeInt): SizeInt;
Compara 2 buffers de memória byte por byte
7função Cseg: Word;
Retorna o segmento do código
8procedimento Dispose (P: Pointer);
Libera a memória alocada dinamicamente
9procedimento Dispose (P: TypedPointer; Des: TProcedure);
Libera a memória alocada dinamicamente
10função Dseg: Word;
Retorna o segmento de dados
11procedimento FillByte (var x; count: SizeInt; valor: Byte);
Preenche a região de memória com padrão de 8 bits
12
procedure FillChar (var x; count: SizeInt; Valor: Byte | Booleano |Char);
Preenche a região de memória com determinado caractere
13 procedimento FillDWord (var x; count: SizeInt; valor: DWord);
Preenche a região de memória com padrão de 32 bits
14procedure FillQWord (var x; contagem: SizeInt; valor: QWord);
Preenche a região de memória com padrão de 64 bits
15procedimento FillWord (var x; count: SizeInt; Valor: Word);Preenche a região de memória com padrão de 16 bits
16procedimento Freemem (p: ponteiro; Tamanho: PtrUInt);
Libera memória alocada
17procedimento Freemem (p: ponteiro);
Libera memória alocada
18procedimento Getmem (out p: pointer; Tamanho: PtrUInt);
Aloca nova memória
19procedimento Getmem (out p: pointer);
Aloca nova memória
20procedimento GetMemoryManager (var MemMgr: TMemoryManager);
Retorna o gerenciador de memória atual
21função alta (Arg: TypeOrVariable): TOrdinal;
Retorna o maior índice de array aberto ou enumerado
22função IndexByte (const buf; len: TamanhoInt; b: Byte): SizeInt;
Localiza o valor do tamanho de byte em um intervalo de memória
23função IndexChar (const buf; len: TamanhoInt; b: Char): SizeInt;
Localiza o valor do tamanho de um caractere em um intervalo de memória
24função IndexDWord (const buf; len: TamanhoInt; b: DWord): SizeInt;
Encontra o valor do tamanho DWord (32 bits) em um intervalo de memória
25função IndexQWord (const buf; len: TamanhoInt; b: QWord): SizeInt;
Encontra o valor do tamanho QWord em um intervalo de memória
26 função Indexword (const buf; len: TamanhoInt; b: Word): SizeInt;
Encontra valor do tamanho de uma palavra em um intervalo de memória
27function IsMemoryManagerSet: Boolean;
O gerenciador de memória está definido
28função Low (Arg: TypeOrVariable): TOrdinal;
Retorna o menor índice de array aberto ou enumerado
29procedure Mover (fonte const; var dest; contagem: SizeInt);
Move dados de um local na memória para outro
30procedimento MoveChar0 (const buf1; var buf2; len: SizeInt);
Move dados até o primeiro caractere zero
31procedimento New (var P: Pointer);
Alocar dinamicamente memória para variável
32procedure New (var P: Pointer; Contras: TProcedure);
Aloca dinamicamente memória para variável
33função Ofs (var X): LongInt;
Retorna o deslocamento da variável
34função ptr (sel: LongInt; off: LongInt): farpointer;
Combina segmento e deslocamento para ponteiro
35função ReAllocMem (var p: ponteiro; Tamanho: PtrUInt): ponteiro;
Redimensiona um bloco de memória na pilha
36função Seg (var X): LongInt;
Retorna o segmento
37procedimento SetMemoryManager (const MemMgr: TMemoryManager);
Define um gerenciador de memória
38função Sptr: Ponteiro;
Retorna o ponteiro da pilha atual
39 função Sseg: Word;
Retorna o valor do registro do segmento da pilha
Pascal - UnidadesUm programa Pascal pode consistir em módulos chamados unidades. Uma unidadepode consistir em alguns blocos de código, que por sua vez são compostos de variáveis e declarações de tipo, instruções, procedimentos, etc. Existem muitas unidadesembutidas em Pascal e Pascal permite que programadores definam e escrevam suaspróprias unidades a serem usadas mais tarde em vários programas.
Ambas as unidades internas e as unidades definidas pelo usuário são incluídas em umprograma pela cláusula uses. Já usamos a unidade de variantes no tutorial Pascal -Variantes . Este tutorial explica como criar e incluir unidades definidas pelo usuário. Noentanto, vamos primeiro ver como incluir uma unidade interna crt em seu programa -
program myprog;
uses crt;
O exemplo a seguir ilustra o uso da unidade crt -
Program Calculate_Area (input, output); uses crt; var a, b, c, s, area: real; begin textbackground(white); (* gives a white background *) clrscr; (*clears the screen *) textcolor(green); (* text color is green *) gotoxy(30, 4); (* takes the pointer to the 4th line and 30th column) writeln('This program calculates area of a triangle:'); writeln('Area = area = sqrt(s(s-a)(s-b)(s-c))'); writeln('S stands for semi-perimeter'); writeln('a, b, c are sides of the triangle'); writeln('Press any key when you are ready'); readkey; clrscr; gotoxy(20,3); write('Enter a: '); readln(a); gotoxy(20,5); write('Enter b:'); readln(b); gotoxy(20, 7); write('Enter c: '); readln(c);
Usando unidades internas
s := (a + b + c)/2.0; area := sqrt(s * (s - a)*(s-b)*(s-c)); gotoxy(20, 9); writeln('Area: ',area:10:3); readkey; end.
É o mesmo programa que usamos logo no início do tutorial do Pascal, compilar e rodarpara encontrar os efeitos da mudança.
Para criar uma unidade, você precisa escrever os módulos ou subprogramas que desejaarmazenar nela e salvá-la em um arquivo com a extensão .pas . A primeira linha destearquivo deve começar com a unidade de palavra-chave seguida pelo nome da unidade.Por exemplo -
unit calculateArea;
A seguir estão três etapas importantes na criação de uma unidade Pascal -
O nome do arquivo e o nome da unidade devem ser exatamente os mesmos.Assim, nossa unidade calculateArea será salva em um arquivo chamadocalculateArea.pas.
A próxima linha deve consistir em uma única interface de palavra-chave . Apósesta linha, você irá escrever as declarações para todas as funções eprocedimentos que virão nesta unidade.
Logo após as declarações de função, escreva a implementação da palavra ,que é novamente uma palavra-chave. Após a linha que contém aimplementação da palavra-chave, forneça a definição de todos ossubprogramas.
O programa a seguir cria a unidade denominada calculateArea -
unit CalculateArea; interface function RectangleArea( length, width: real): real; function CircleArea(radius: real) : real; function TriangleArea( side1, side2, side3: real): real; implementation function RectangleArea( length, width: real): real; begin RectangleArea := length * width; end; function CircleArea(radius: real) : real; const PI = 3.14159; begin
Criando e usando uma unidade Pascal
CircleArea := PI * radius * radius; end; function TriangleArea( side1, side2, side3: real): real; var s, area: real; begin s := (side1 + side2 + side3)/2.0; area := sqrt(s * (s - side1)*(s-side2)*(s-side3)); TriangleArea := area; end; end.
Em seguida, vamos escrever um programa simples que usaria a unidade que definimosacima -
program AreaCalculation; uses CalculateArea,crt; var l, w, r, a, b, c, area: real; begin clrscr; l := 5.4; w := 4.7; area := RectangleArea(l, w); writeln('Area of Rectangle 5.4 x 4.7 is: ', area:7:3); r:= 7.0; area:= CircleArea(r); writeln('Area of Circle with radius 7.0 is: ', area:7:3); a := 3.0; b:= 4.0; c:= 5.0; area:= TriangleArea(a, b, c); writeln('Area of Triangle 3.0 by 4.0 by 5.0 is: ', area:7:3); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Area of Rectangle 5.4 x 4.7 is: 25.380
Area of Circle with radius 7.0 is: 153.938
Area of Triangle 3.0 by 4.0 by 5.0 is: 6.000
Pascal - data e horaA maioria dos softwares que você escreve precisa implementar alguma forma de funçãode data, retornando a data e hora atuais. As datas são tão importantes na vidacotidiana que se torna fácil trabalhar com elas sem pensar. O Pascal também forneceferramentas poderosas para aritmética de datas que facilitam a manipulação de datas.No entanto, o nome real e o funcionamento dessas funções são diferentes paradiferentes compiladores.
A função TimeToString de Pascal fornece a hora atual em um formulário delimitado pordois-pontos (:). O exemplo a seguir mostra como obter o horário atual -
program TimeDemo; uses sysutils; begin writeln ('Current time : ',TimeToStr(Time)); end.
Quando o código acima foi compilado e executado, ele produz o seguinte resultado -
Current time : 18:33:08
A função Date retorna a data atual no formato TDateTime . O TDateTime é um valorduplo, que precisa de alguma decodificação e formatação. O programa a seguirdemonstra como usá-lo em seu programa para exibir a data atual -
Program DateDemo; uses sysutils; var YY,MM,DD : Word; begin writeln ('Date : ',Date); DeCodeDate (Date,YY,MM,DD); writeln (format ('Today is (DD/MM/YY): %d/%d/%d ',[dd,mm,yy])); end.
Quando o código acima foi compilado e executado, ele produz o seguinte resultado -
Date: 4.111300000000000E+004
Today is (DD/MM/YY):23/7/2012
A função Now retorna a data e hora atuais -
Program DatenTimeDemo; uses sysutils; begin writeln ('Date and Time at the time of writing : ',DateTimeToStr(Now)); end.
Quando o código acima foi compilado e executado, ele produz o seguinte resultado -
Date and Time at the time of writing : 23/7/2012 18:51:
O Free Pascal fornece uma estrutura simples de registro de data e hora chamadaTTimeStamp , que possui o seguinte formato -
type TTimeStamp = record Time: Integer; Date: Integer; end;
Obtendo a data e hora atuais
Demonstração ao vivo
Demonstração ao vivo
Free Pascal fornece as seguintes funções de data e hora -
Sr.Não.
Nome e descrição da função
1function DateTimeToFileDate (DateTime: TDateTime): LongInt;
Converte o tipo DateTime na data do arquivo.
2function DateTimeToStr (DateTime: TDateTime) :;
Constrói uma representação de string de DateTime
3
função DateTimeToStr (DateTime: TDateTime; const FormatSettings:TFormatSettings) :;
Constrói uma representação de string de DateTime
4
procedure DateTimeToString (out Resultado:; const FormatStr:; constDateTime: TDateTime);
Constrói uma representação de string de DateTime
5
procedure DateTimeToString (out Resultado:; const FormatString:;const DateTime: TDateTime; const FormatSettings: TFormatSettings);
Constrói uma representação de string de DateTime
6
procedimento DateTimeToSystemTime (DateTime: TDateTime; foraSystemTime: TSystemTime);
Converte DateTime na hora do sistema
7function DateTimeToTimeStamp (DateTime: TDateTime): TTimeStamp;Converte DateTime em timestamp
8function DateToStr (Date: TDateTime) :;
Constrói uma representação de string de data
9
function DateToStr (Data: TDateTime; const FormatSettings:TFormatSettings) :;
Constrói uma representação de string de data
10 data da função: TDateTime;
Várias funções de data e hora
Obtém a data atual
11função DayOfWeek (DateTime: TDateTime): Integer;
Obtém o dia da semana
12
procedimento DecodeDate (Date: TDateTime; out Ano: Word; out Mês:Word; out Dia: Word);
Decodifica DateTime para ano mês e dia
13
procedimento DecodeTime (Time: TDateTime; out Hora: Word; outMinuto: Word; out Segundo: Word; out MilliSecond: Word);
Decodifica DateTime para horas, minutos e segundos
14function EncodeDate (Ano: Word; Mês: Word; Dia: Word): TDateTime;
Codifica ano, dia e mês para DateTime
15
função EncodeTime (Hora: Word; Minuto: Word; Segundo: Word;MilliSecond: Word): TDateTime;
Codifica horas, minutos e segundos para o DateTime
16função FormatDateTime (const FormatStr: DateTime: TDateTime) :;
Retorna a representação de string de DateTime
17
função FormatDateTime (const FormatStr: DateTime: TDateTime;const FormatSettings: TFormatSettings) :;
Retorna a representação de string de DateTime
18
função IncMonth (const DateTime: TDateTime; NumberOfMonths:Integer = 1): TDateTime;
Adiciona 1 ao mês
19função IsLeapYear (Year: Word): Boolean;
Determina se ano é ano bissexto
20função MSecsToTimeStamp (MSecs: Comp): TTimeStamp;
Converte o número de milissegundos em timestamp
21 function Agora: TDateTime;
Obtém a data e hora atuais
22função StrToDateTime (const S :): TDateTime;
Converte string em DateTime
23
função StrToDateTime (const s: ShortString; const FormatSettings:TFormatSettings): TDateTime;
Converte string em DateTime
24
função StrToDateTime (const s: AnsiString; const FormatSettings:TFormatSettings): TDateTime;
Converte string em DateTime
25function StrToDate (const S: ShortString): TDateTime;
Converte string para data
26função StrToDate (const S: Ansistring): TDateTime;
Converte string para data
27função StrToDate (const S: ShortString; separador: Char): TDateTime;
Converte string para data
28função StrToDate (const S: AnsiString; separador: Char): TDateTime;
Converte string para data
29
função StrToDate (const S: ShortString; constante useformat:;separador: Char): TDateTime;
Converte string para data
30
função StrToDate (const S: AnsiString; constante useformat:;separador: Char): TDateTime;
Converte string para data
31
função StrToDate (const S: PChar; Len: inteiro; const useformat:;separador: Char = # 0): TDateTime;
Converte string para data
32 function StrToTime (const S: Shortstring): TDateTime;
Converte string em time
33função StrToTime (const S: Ansistring): TDateTime;
Converte string em time
34função StrToTime (const S: ShortString; separador: Char): TDateTime;
Converte string em time
35função StrToTime (const S: AnsiString; separador: Char): TDateTime;
Converte string em time
36
function StrToTime (const S:; FormatSettings: TFormatSettings):TDateTime;
Converte string em time
37
função StrToTime (const S: PChar; Len: inteiro; separador: Char = #0): TDateTime;
Converte string em time
38
function SystemTimeToDateTime (const SystemTime: TSystemTime):TDateTime;
Converte a hora do sistema em datetime
39
função TimeStampToDateTime (const TimeStamp: TTimeStamp):TDateTime;
Converte o registro de data e hora em DateTime
40função TimeStampToMSecs (const TimeStamp: TTimeStamp): comp;
Converte o registro de data e hora em número de milissegundos
41function TimeToStr (Time: TDateTime) :;
Retorna a representação de string do Time
42
função TimeToStr (Time: TDateTime; const FormatSettings:TFormatSettings) :;
Retorna a representação de string do Time
43 função Time: TDateTime;
Chegar a hora atual
O exemplo a seguir ilustra o uso de algumas das funções acima -
Program DatenTimeDemo; uses sysutils; var year, month, day, hr, min, sec, ms: Word; begin writeln ('Date and Time at the time of writing : ',DateTimeToStr(Now)); writeln('Today is ',LongDayNames[DayOfWeek(Date)]); writeln; writeln('Details of Date: '); DecodeDate(Date,year,month,day); writeln (Format ('Day: %d',[day])); writeln (Format ('Month: %d',[month])); writeln (Format ('Year: %d',[year])); writeln; writeln('Details of Time: '); DecodeTime(Time,hr, min, sec, ms); writeln (format('Hour: %d:',[hr])); writeln (format('Minutes: %d:',[min])); writeln (format('Seconds: %d:',[sec])); writeln (format('Milliseconds: %d:',[hr])); end.
Quando o código acima foi compilado e executado, produziu o seguinte resultado:
Date and Time at the time of writing : 7/24/2012 8:26:
Today is Tuesday
Details of Date:
Day:24
Month:7
Year: 2012
Details of Time:
Hour: 8
Minutes: 26
Seconds: 21
Milliseconds: 8
Pascal - Orientado a ObjetosPodemos imaginar nosso universo feito de diferentes objetos como sol, terra, lua, etc.Da mesma forma, podemos imaginar nosso carro feito de objetos diferentes como roda,direção, engrenagem etc. Do mesmo jeito, existem conceitos de programaçãoorientados a objetos, que assumir tudo como um objeto e implementar um softwareusando objetos diferentes. Em Pascal, existem dois tipos de dados estruturais usados para implementar um objeto do mundo real -
Tipos de objeto
Demonstração ao vivo
Tipos de classe
Antes de entrarmos em detalhes, vamos definir termos Pascal importantes relacionadosao Pascal Orientado a Objetos.
Object - An Object é um tipo especial de registro que contém campos como umregistro; no entanto, ao contrário dos registros, os objetos contêmprocedimentos e funções como parte do objeto. Esses procedimentos e funçõessão mantidos como ponteiros para os métodos associados ao tipo do objeto.
Classe - Uma Classe é definida quase da mesma maneira que um Objeto, mashá uma diferença na forma como eles são criados. A classe é alocada no heapde um programa, enquanto o objeto é alocado na pilha. É um ponteiro para oobjeto, não para o objeto em si.
Instanciação de uma classe - Instanciação significa criar uma variável dessetipo de classe. Como uma classe é apenas um ponteiro, quando uma variável deum tipo de classe é declarada, há memória alocada somente para o ponteiro,não para o objeto inteiro. Somente quando é instanciado usando um de seusconstrutores, a memória é alocada para o objeto. Instâncias de uma classe sãotambém chamadas de 'objetos', mas não as confundem com Object PascalObjects. Neste tutorial, vamos escrever 'Objeto' para objetos Pascal e 'objeto'para o objeto conceitual ou instância da classe.
Variáveis de membro - estas são as variáveis definidas dentro de uma classeou um objeto.
Funções de Membro - Estas são as funções ou procedimentos definidos dentrode uma Classe ou um Objeto e são usados para acessar os dados do objeto.
Visibilidade dos Membros - Os membros de um Objeto ou Classe tambémsão chamados de campos. Esses campos têm visibilidades diferentes.Visibilidade refere-se à acessibilidade dos membros, ou seja, exatamente ondeesses membros estarão acessíveis. Objetos têm três níveis de visibilidade:público, privado e protegido. As turmas têm cinco tipos de visibilidade: pública,privada, estritamente privada, protegida e publicada. Vamos discutir avisibilidade em detalhes.
Herança - Quando uma classe é definida herdando funcionalidades existentesde uma classe pai, então é dito que ela é herdada. Aqui, a classe filha herdarátodas ou algumas funções de membro e variáveis de uma classe pai. Objetostambém podem ser herdados.
Classe pai - uma classe que é herdada por outra classe. Isso também échamado de classe base ou superclasse.
Conceitos orientados a objeto
Classe filha - Uma classe que herda de outra classe. Isso também é chamadode subclasse ou classe derivada.
Polimorfismo - Este é um conceito orientado a objetos onde a mesma funçãopode ser usada para diferentes propósitos. Por exemplo, o nome da funçãopermanecerá igual, mas pode levar um número diferente de argumentos e podeexecutar tarefas diferentes. As classes de Pascal implementam o polimorfismo.Objetos não implementam polimorfismo.
Sobrecarga - É um tipo de polimorfismo no qual alguns ou todos os operadorestêm diferentes implementações, dependendo dos tipos de seus argumentos.Similarmente, as funções também podem ser sobrecarregadas comimplementação diferente. Classes Pascal implementam sobrecarga, mas osObjetos não.
Abstração de Dados - Qualquer representação de dados nos quais os detalhesda implementação estão ocultos (abstraídos).
Encapsulamento - Refere-se a um conceito em que encapsulamos todos osdados e funções de membro juntos para formar um objeto.
Construtor - Refere-se a um tipo especial de função que será chamadoautomaticamente sempre que houver uma formação de objeto de uma classeou um objeto.
Destructor - Refere-se a um tipo especial de função que será chamadoautomaticamente sempre que um objeto ou classe for excluído ou sair doescopo.
Um objeto é declarado usando a declaração de tipo. A forma geral de uma declaraçãode objeto é a seguinte -
type object-identifier = object private field1 : field-type; field2 : field-type; ... public procedure proc1; function f1(): function-type; end; var objectvar : object-identifier;
Vamos definir um Rectangle Object que tenha dois membros de dados do tipo inteiro -length e width e algumas funções membro para manipular esses membros de dados eum procedimento para desenhar o retângulo.
type Rectangle = object private
Definindo Objetos Pascal
length, width: integer; public constructor init; destructor done; procedure setlength(l: inteter); function getlength(): integer; procedure setwidth(w: integer); function getwidth(): integer; procedure draw; end; var r1: Rectangle; pr1: ^Rectangle;
Depois de criar seus objetos, você poderá chamar funções de membro relacionadas aesse objeto. Uma função de membro poderá processar variável de membro de objetorelacionado somente.
O exemplo a seguir mostra como definir comprimentos e larguras para dois objetos deretângulo e desenhá-los chamando as funções de membro.
r1.setlength(3); r1.setwidth(7); writeln(' Draw a rectangle: ', r1.getlength(), ' by ' , r1.getwidth()); r1.draw; new(pr1); pr1^.setlength(5); pr1^.setwidth(4); writeln(' Draw a rectangle: ', pr1^.getlength(), ' by ' ,pr1^.getwidth()); pr1^.draw; dispose(pr1);
A seguir, um exemplo completo para mostrar como usar objetos em Pascal -
program exObjects; type Rectangle = object private length, width: integer; public procedure setlength(l: integer); function getlength(): integer; procedure setwidth(w: integer); function getwidth(): integer; procedure draw; end; var r1: Rectangle; pr1: ^Rectangle; procedure Rectangle.setlength(l: integer); begin length := l;
Demonstração ao vivo
end; procedure Rectangle.setwidth(w: integer); begin width :=w; end; function Rectangle.getlength(): integer; begin getlength := length; end; function Rectangle.getwidth(): integer; begin getwidth := width; end; procedure Rectangle.draw; var i, j: integer; begin for i:= 1 to length do begin for j:= 1 to width do write(' * '); writeln; end; end; begin r1.setlength(3); r1.setwidth(7); writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth()); r1.draw; new(pr1); pr1^.setlength(5); pr1^.setwidth(4); writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth()); pr1^.draw; dispose(pr1); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *
Visibilidade dos membros do objeto
Visibilidade indica a acessibilidade dos membros do objeto. Os membros do objetoPascal possuem três tipos de visibilidade -
Sr.Não
Visibilidade e Acessibilidade
1
Público
Os membros podem ser usados por outras unidades fora da unidade doprograma
2Privado
Os membros são acessíveis apenas na unidade atual.
3
Protegido
Os membros estão disponíveis apenas para objetos descendentes do objetopai.
Por padrão, os campos e métodos de um objeto são públicos e são exportados para forada unidade atual.
Construtores são tipos especiais de métodos, que são chamados automaticamentesempre que um objeto é criado. Você cria um construtor em Pascal apenas declarandoum método com um construtor de palavra-chave. Convencionalmente, o nome dométodo é Init, no entanto, você pode fornecer qualquer identificador válido. Você podepassar quantos argumentos quiser para a função de construtor.
Destrutores são métodos que são chamados durante a destruição do objeto. Osmétodos de destruição destroem qualquer alocação de memória criada porconstrutores.
O exemplo a seguir fornecerá um construtor e um destruidor para a classe Rectangleque inicializará o comprimento e a largura do retângulo no momento da criação doobjeto e o destruirá quando sair do escopo.
program exObjects; type Rectangle = object private length, width: integer; public constructor init(l, w: integer); destructor done; procedure setlength(l: integer); function getlength(): integer;
Construtores e Destrutores para Objetos Pascal -
Demonstração ao vivo
procedure setwidth(w: integer); function getwidth(): integer; procedure draw; end; var r1: Rectangle; pr1: ^Rectangle; constructor Rectangle.init(l, w: integer); begin length := l; width := w; end; destructor Rectangle.done; begin writeln(' Desctructor Called'); end; procedure Rectangle.setlength(l: integer); begin length := l; end; procedure Rectangle.setwidth(w: integer); begin width :=w; end; function Rectangle.getlength(): integer; begin getlength := length; end; function Rectangle.getwidth(): integer; begin getwidth := width; end; procedure Rectangle.draw; var i, j: integer; begin for i:= 1 to length do begin for j:= 1 to width do write(' * '); writeln; end; end; begin r1.init(3, 7); writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth()); r1.draw; new(pr1, init(5, 4)); writeln('Draw a rectangle:', pr1^.getlength(), ' by ',pr1^.getwidth()); pr1^.draw; pr1^.init(7, 9); writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth()); pr1^.draw;
dispose(pr1); r1.done; end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *
Draw a rectangle: 7 by 9
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
Destructor Called
Objetos Pascal podem, opcionalmente, herdar de um objeto pai. O programa a seguirilustra a herança em objetos Pascal. Vamos criar outro objeto chamado TableTop , queé herdado do objeto Rectangle.
program exObjects; type Rectangle = object private length, width: integer; public procedure setlength(l: integer); function getlength(): integer; procedure setwidth(w: integer); function getwidth(): integer; procedure draw; end; TableTop = object (Rectangle) private material: string; public function getmaterial(): string; procedure setmaterial( m: string); procedure displaydetails; procedure draw; end;
Herança para objetos Pascal
Demonstração ao vivo
var tt1: TableTop; procedure Rectangle.setlength(l: integer); begin length := l; end; procedure Rectangle.setwidth(w: integer); begin width :=w; end; function Rectangle.getlength(): integer; begin getlength := length; end; function Rectangle.getwidth():integer; begin getwidth := width; end; procedure Rectangle.draw; var i, j: integer; begin for i:= 1 to length do begin for j:= 1 to width do write(' * '); writeln; end; end; function TableTop.getmaterial(): string; begin getmaterial := material; end; procedure TableTop.setmaterial( m: string); begin material := m; end; procedure TableTop.displaydetails; begin writeln('Table Top: ', self.getlength(), ' by ' , self.getwidth()); writeln('Material: ', self.getmaterial()); end; procedure TableTop.draw(); var i, j: integer; begin for i:= 1 to length do begin for j:= 1 to width do write(' * '); writeln; end; writeln('Material: ', material); end; begin
tt1.setlength(3); tt1.setwidth(7); tt1.setmaterial('Wood'); tt1.displaydetails(); writeln; writeln('Calling the Draw method'); tt1.draw(); end.
A seguir estão os pontos importantes que devem ser anotados
O objeto Tabletop herdou todos os membros do objeto Rectangle.
Há um método de desenho no TableTop também. Quando o empate método échamado usando um TableTop objeto, sorteio de TableTop é invocado.
Existe uma instância implícita denominada self que se refere à instância atualdo objeto.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Table Top: 3 by 7
Material: Wood
Calling the Draw Method
* * * * * * *
* * * * * * *
* * * * * * *
Material: Wood
Pascal - ClassesVocê viu que os objetos Pascal exibem algumas características do paradigma orientadoa objetos. Eles implementam encapsulamento, ocultação de dados e herança, mastambém possuem limitações. Por exemplo, objetos Pascal não fazem parte dopolimorfismo. Portanto, as classes são amplamente usadas para implementar umcomportamento adequado orientado a objetos em um programa, especialmente osoftware baseado em GUI.
Uma classe é definida quase da mesma maneira que um objeto, mas é um ponteiropara um objeto em vez do próprio objeto. Tecnicamente, isso significa que a classe éalocada no heap de um programa, enquanto o objeto é alocado na pilha. Em outraspalavras, quando você declara uma variável como o tipo de objeto, ela ocupará tantoespaço na pilha quanto o tamanho do objeto, mas quando você declara uma variável dotipo de classe, ela sempre terá o tamanho de um ponteiro na pilha. Os dados reais daclasse estarão no heap.
Uma classe é declarada da mesma maneira que um objeto, usando a declaração detipo. A forma geral de uma declaração de classe é a seguinte -
Definindo Classes Pascal
type class-identifier = class private field1 : field-type; field2 : field-type; ... public constructor create(); procedure proc1; function f1(): function-type; end; var classvar : class-identifier;
Vale a pena observar os seguintes pontos importantes -
As definições de classe devem estar apenas na parte de declaração de tipo doprograma.
Uma classe é definida usando a palavra-chave class .
Campos são itens de dados que existem em cada instância da classe.
Os métodos são declarados dentro da definição de uma classe.
Existe um construtor predefinido chamado Criar na classe raiz. Todas as classesabstratas e todas as classes concretas são descendentes de Root, portanto,todas as classes possuem pelo menos um construtor.
Existe um destruidor predefinido chamado Destroy na classe Root. Todas asclasses abstratas e todas as classes concretas são descendentes de Root,portanto, todas as classes possuem pelo menos um destruidor.
Vamos definir uma classe Rectangle que tenha dois membros de dados do tipo inteiro -length e width e algumas funções membro para manipular esses membros de dados eum procedimento para desenhar o retângulo.
type Rectangle = class private length, width: integer; public constructor create(l, w: integer); procedure setlength(l: integer); function getlength(): integer; procedure setwidth(w: integer); function getwidth(): integer; procedure draw; end;
Vamos escrever um programa completo que crie uma instância de uma classe deretângulo e desenhe o retângulo. Este é o mesmo exemplo que usamos ao discutirobjetos Pascal. Você encontrará ambos os programas são quase iguais, com asseguintes exceções -
Você precisará incluir a diretiva {$ mode objfpc} para usar as classes.
Você precisará incluir a diretiva {$ m +} para usar construtores.
A instanciação de classes é diferente da instanciação de objetos. Apenasdeclarar a variável não cria espaço para a instância, você usará o construtorcreate para alocar memória.
Aqui está o exemplo completo -
{$mode objfpc} // directive to be used for defining classes {$m+} // directive to be used for using constructor program exClass; type Rectangle = class private length, width: integer; public constructor create(l, w: integer); procedure setlength(l: integer); function getlength(): integer; procedure setwidth(w: integer); function getwidth(): integer; procedure draw; end; var r1: Rectangle; constructor Rectangle.create(l, w: integer); begin length := l; width := w; end; procedure Rectangle.setlength(l: integer); begin length := l; end; procedure Rectangle.setwidth(w: integer); begin width :=w; end; function Rectangle.getlength(): integer; begin getlength := length; end; function Rectangle.getwidth(): integer; begin getwidth := width; end; procedure Rectangle.draw; var i, j: integer; begin for i:= 1 to length do begin for j:= 1 to width do
Demonstração ao vivo
write(' * '); writeln; end; end; begin r1:= Rectangle.create(3, 7); writeln(' Draw Rectangle: ', r1.getlength(), ' by ' , r1.getwidth()); r1.draw; r1.setlength(4); r1.setwidth(6); writeln(' Draw Rectangle: ', r1.getlength(), ' by ' , r1.getwidth()); r1.draw; end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Draw Rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw Rectangle: 4 by 6
* * * * * *
* * * * * *
* * * * * *
* * * * * *
Visibilidade indica a acessibilidade dos membros da classe. Os alunos de Pascal têmcinco tipos de visibilidade -
Sr.Não
Visibilidade e Acessibilidade
1Público
Esses membros estão sempre acessíveis.
2
Privado
Esses membros só podem ser acessados no módulo ou unidade que contém adefinição de classe. Eles podem ser acessados de dentro dos métodos declasse ou de fora deles.
3
Estrito privado
Esses membros só podem ser acessados a partir de métodos da própria classe.Outras classes ou classes descendentes na mesma unidade não podem acessá-las.
Visibilidade dos membros da classe
4 Protegido
Isso é o mesmo que private, exceto que esses membros são acessíveis para ostipos descendentes, mesmo que sejam implementados em outros módulos.
5
Publicados
Isso é o mesmo que um Public, mas o compilador gera informações de tipo quesão necessárias para o fluxo automático dessas classes se o compilador estiverno estado {$ M +}. Os campos definidos em uma seção publicada devem serdo tipo de classe.
Construtores são métodos especiais, que são chamados automaticamente sempre queum objeto é criado. Portanto, aproveitamos totalmente esse comportamentoinicializando muitas coisas através de funções de construtor.
Pascal fornece uma função especial chamada create () para definir um construtor. Vocêpode passar quantos argumentos quiser para a função de construtor.
O exemplo a seguir criará um construtor para uma classe chamada Books e inicializaráo preço e o título do livro no momento da criação do objeto.
program classExample; {$MODE OBJFPC} //directive to be used for creating classes {$M+} //directive that allows class constructors and destructors type Books = Class private title : String; price: real; public constructor Create(t : String; p: real); //default constructor procedure setTitle(t : String); //sets title for a book function getTitle() : String; //retrieves title procedure setPrice(p : real); //sets price for a book function getPrice() : real; //retrieves price procedure Display(); // display details of a book end; var physics, chemistry, maths: Books; //default constructor constructor Books.Create(t : String; p: real); begin title := t; price := p; end; procedure Books.setTitle(t : String); //sets title for a book
Construtores e Destrutores para as Classes Pascal
Demonstração ao vivo
begin title := t; end; function Books.getTitle() : String; //retrieves title begin getTitle := title; end; procedure Books.setPrice(p : real); //sets price for a book begin price := p; end; function Books.getPrice() : real; //retrieves price begin getPrice:= price; end; procedure Books.Display(); begin writeln('Title: ', title); writeln('Price: ', price:5:2); end; begin physics := Books.Create('Physics for High School', 10); chemistry := Books.Create('Advanced Chemistry', 15); maths := Books.Create('Algebra', 7); physics.Display; chemistry.Display; maths.Display; end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Title: Physics for High School
Price: 10
Title: Advanced Chemistry
Price: 15
Title: Algebra
Price: 7
Como o construtor implícito chamado create, há também um método destrutivoimplícito destroy, que permite liberar todos os recursos usados na classe.
As definições de classe Pascal podem, opcionalmente, herdar de uma definição declasse pai. A sintaxe é a seguinte -
type childClas-identifier = class(baseClass-identifier) < members > end;
O exemplo a seguir fornece uma classe de romances, que herda a classe Books eadiciona mais funcionalidade com base no requisito.
Herança
program inheritanceExample; {$MODE OBJFPC} //directive to be used for creating classes {$M+} //directive that allows class constructors and destructors type Books = Class protected title : String; price: real; public constructor Create(t : String; p: real); //default constructor procedure setTitle(t : String); //sets title for a book function getTitle() : String; //retrieves title procedure setPrice(p : real); //sets price for a book function getPrice() : real; //retrieves price procedure Display(); virtual; // display details of a book end; (* Creating a derived class *) type Novels = Class(Books) private author: String; public constructor Create(t: String); overload; constructor Create(a: String; t: String; p: real); overload; procedure setAuthor(a: String); // sets author for a book function getAuthor(): String; // retrieves author name procedure Display(); override; end; var n1, n2: Novels; //default constructor constructor Books.Create(t : String; p: real); begin title := t; price := p; end; procedure Books.setTitle(t : String); //sets title for a book begin title := t; end; function Books.getTitle() : String; //retrieves title begin getTitle := title; end; procedure Books.setPrice(p : real); //sets price for a book begin price := p; end; function Books.getPrice() : real; //retrieves price begin
Demonstração ao vivo
getPrice:= price; end; procedure Books.Display(); begin writeln('Title: ', title); writeln('Price: ', price); end; (* Now the derived class methods *) constructor Novels.Create(t: String); begin inherited Create(t, 0.0); author:= ' '; end; constructor Novels.Create(a: String; t: String; p: real); begin inherited Create(t, p); author:= a; end; procedure Novels.setAuthor(a : String); //sets author for a book begin author := a; end; function Novels.getAuthor() : String; //retrieves author begin getAuthor := author; end; procedure Novels.Display(); begin writeln('Title: ', title); writeln('Price: ', price:5:2); writeln('Author: ', author); end; begin n1 := Novels.Create('Gone with the Wind'); n2 := Novels.Create('Ayn Rand','Atlas Shrugged', 467.75); n1.setAuthor('Margaret Mitchell'); n1.setPrice(375.99); n1.Display; n2.Display; end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Title: Gone with the Wind
Price: 375.99
Author: Margaret Mitchell
Title: Atlas Shrugged
Price: 467.75
Author: Ayn Rand
Vale a pena observar os seguintes pontos importantes -
Os membros da classe Books têm visibilidade protegida .
A classe Novels possui dois construtores, portanto, o operador de sobrecarga éusado para sobrecarga de função.
O procedimento Books.Display foi declarado virtual , para que o mesmométodo da classe Novels possa substituí- lo.
O construtor Novels.Create chama o construtor da classe base usando apalavra-chave herdada .
Interfaces são definidas para fornecer um nome de função comum aosimplementadores. Diferentes implementadores podem implementar essas interfaces deacordo com seus requisitos. Você pode dizer, interfaces são esqueletos, que sãoimplementados pelos desenvolvedores. A seguir, um exemplo de interface -
type Mail = Interface Procedure SendMail; Procedure GetMail; end; Report = Class(TInterfacedObject, Mail) Procedure SendMail; Procedure GetMail; end;
Observe que, quando uma classe implementa uma interface, ela deve implementartodos os métodos da interface. Se um método de uma interface não for implementado,o compilador dará um erro.
Uma classe abstrata é aquela que não pode ser instanciada, apenas herdada. Umaclasse abstrata é especificada incluindo a palavra símbolo abstrato na definição daclasse, como esta -
type Shape = ABSTRACT CLASS (Root) Procedure draw; ABSTRACT; ... end;
Ao herdar de uma classe abstrata, todos os métodos marcados como abstract nadeclaração de classe pai devem ser definidos pelo filho; Além disso, esses métodosdevem ser definidos com a mesma visibilidade.
Declarar membros ou métodos da classe como estáticos os torna acessíveis semprecisar de uma instanciação da classe. Um membro declarado como estático não pode
Interfaces
Classes Abstratas
Palavra-chave estática
Página anterior Próxima página
ser acessado com um objeto de classe instanciado (embora um método estático possa).O exemplo a seguir ilustra o conceito -
program StaticExample; {$mode objfpc} {$static on} type myclass=class num : integer;static; end; var n1, n2 : myclass; begin n1:= myclass.create; n2:= myclass.create; n1.num := 12; writeln(n2.num); n2.num := 31; writeln(n1.num); writeln(myclass.num); myclass.num := myclass.num + 20; writeln(n1.num); writeln(n2.num); end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
12
31
31
51
51
Você deve usar a diretiva {$ static on} para usar os membros estáticos.
Demonstração ao vivo
FAQ's Política de Cookies Contato© Copyright 2018. Todos os direitos reservados.
Enter email for newsletter vai