a descrio, de forma lgica, dos passos a serem executados para o cumprimento de determinada tarefa.
a forma pela qual descrevemos solues para problemas do nosso mundo, afim de serem implementadas utilizando os recursos do mundo computacional. Como este possu severas limitaes em relao ao nosso mundo, exige que sejam impostas algumas regras bsicas na forma de solucionar os problemas para que possamos utilizar os recursos de hardware e software disponveis.
A DIFERENA DE ALGORITMO PARA PROGRAMA
Um algoritmo na realidade uma seqncia lgica de aes que dever ser executadas para se realizar uma determinada tarefa, j uma Programa por sua vez a formalizao de um algoritmo em uma determinada linguagem de programao, segundo suas regras de sintaxe e semntica, de forma a permitir que o computador possa entender a seqncia de aes.
DEFINIO DE LINGUAGEM DE PROGRAMAO
Uma linguagem de programao um conjunto de smbolos (comandos, identificadores, caracteres ASCII, etc. ... ) e regras de sintaxe que permitem a construo de sentenas que descrevem de forma precisa aes compreensveis e executveis para o computador.
Logo :
LINGUAGEM DE PROGRAMAO = SMBOLOS + REGRAS DE SINTAXE
Uma linguagem de programao uma notao formal para descrio de algoritmos que sero executados por um computador. Como todas as notaes formais, uma linguagem de programao tem dois componentes : Sintaxe e Semntica. A sintaxe consiste em um conjunto de regras formais, que especificam a composio de programas a partir de letras, dgitos, e outros smbolos. Por exemplo, regras de sintaxe podem especificar que cada parnteses aberto em uma expresso aritmtica deve corresponder a um parnteses fechado, e que dois comandos quaisquer devem ser separados por um ponto-e-vrgula. As regras de semntica especificam o significado de qualquer programa, sintaticamente vlido, escrito na linguagem.
TIPOS DE LINGUAGENS DE PROGRAMAO
Existem diversas linguagens de programao, cada uma com suas caractersticas especficas e com nveis de complexidade e objetivos diferentes, sendo que os principais tipo de linguagem de programao so:
Linguagem de Mquina nica compreendida pelo computador e especfica para cada tipo de computador.
Linguagens de Baixo Nvel Utiliza mnemnicos para representar instrues elementares Exmplo: Assembly
Linguagens de Alto Nvel Utiliza instrues prximas da linguagem humana de forma a facilitar o desenvolvimento de sistemas. Ex.: Uso Cientfico : Fortran Propsito Geral : Delphi, Visual Basic, Visual C ++, Java Uso Comercial : Cobol, Clipper Uso especfico : Lisp, Prolog
PROCESSO DE CRIAO E EXECUO DE UM PROGRAMA
Embora seja teoricamente possvel a construo de computadores especiais, capazes de executar programas escritos em uma linguagem de programao qualquer, os computadores, existentes hoje em dia so capazes de executar somente programas em linguagem de baixo nvel, a Linguagem de Mquina, mesmo porque mquinas com este caractersticas necessitariam de um micro programa muito complexo o que tornaria tais equipamentos caros. Neste contexto ento nosso programas desenvolvidos em qualquer linguagem de programao deve ser de alguma forma traduzidos para a linguagem de mquina mas para realizar esta tarefa existem pelo menos trs ferramentas, as quais vamos conhecer agora:
MONTADOR Efetua a traduo de linguagem de montagem ( Assembly ) para a linguagem de mquina. 1. Obtm prxima instruo do Assembly; 2. Traduz para as instrues correspondentes em linguagem de mquina; 3. Executa as instrues em linguagem de mquina; 4. Repete o passo 1 at o fim do programa.
INTERPRETADOR Efetua a traduo a de uma linguagem de alto nvel para linguagem de mquina da seguinte forma: 1. Obtm prxima instruo do cdigo-fonte em linguagem de alto nvel; 2. Traduz para as instrues correspondentes em linguagem de mquina; 3. Executa as instrues em linguagem de mquina; 4. Repete o passo 1 at o fim do programa.
COMPILADOR Efetua a traduo de todo o cdigo-fonte em linguagem de alto nvel para as instrues correspondentes em linguagem de mquina, gerando o cdigo-objeto do programa. Em seguida necessrio o uso de um outro programa ( Link-Editor ) que responsvel pela juno de diversos cdigos-objeto em um nico programa executvel.
POSSIBILIDADES DE ERROS NO PROGRAMA
Erros de Compilao : Erros de digitao e de uso da sintaxe da linguagem Erros de Link-Edio : Erro no uso de bibliotecas de sub-programas necessrias ao programa principal. Erros de Execuo : Erro na lgica do programa (algoritmo).
CRITRIOS DE QUALIDADE DE UM PROGRAMA
Clareza : Refere-se facilidade de leitura do programa. Se um programa for escrito com clareza, dever ser possvel a outro programador seguir a lgica do programa sem muito esforo, assim como o prprio autor do programa entend-lo aps ter estado um longo perodo afastado dele. O Pascal favorece a escrita de programas com clareza e legibilidade.
Simplicidade : A clareza e preciso de um programa so normalmente melhoradas tornando as coisa o mais simples possvel, consistentes com os objetivos do programa. Muitas vezes torna-se necessrio sacrificar alguma eficincia de processamento, de forma a manter a estrutura do programa mais simples.
Eficincia : Refere-se velocidade de processamento e a correta utilizao da memria. Um programa deve ter performance SUFICIENTE para atender s necessidade do problema e do usurio, bem como deve utilizar os recursos de memria de forma moderada, dentro das limitaes do problema.
Modularidade : Consiste no particionamento do programa em mdulos menores bem identificveis e com funes especficas, de forma que o conjunto desses mdulos e a interao entre eles permite a resoluo do problema de forma mais simples e clara.
Generalidade : interessante que um programa seja to genrico quanto possvel de forma a permitir a reutilizao de seus componentes em outros projetos.
A LINGUAGEM DE PROGRAMAO PASCAL
NOTAO SINTTICA
A notao Sinttica utilizada para formalizao a representao sinttica de uma linguagem. Notao Usada negrito Para indicar palavras chaves que devem ser escritas como aparecem
normais Para indicar palavras que devem ser substitudas por valores definidos por voc
[ ] Colchetes usados para indicar itens opcionais
... Reticncias para indicar que o item precedente pode ser repetido
ESTRUTURA DE UM PROGRAMA PASCAL
Um programa em Pascal composto basicamente por um cabealho contendo o nome do programa que o que chamamos de Program Header, de uma seo de declarao e finalmente do corpo do programa, como podemos ver no exemplo abaixo:
PROGRAM Nome_Do_Programa; { Cabealho } [ declarao de units ] [ declarao de rtulos ] [ declarao de constantes ] { Seo de Declaraes } [ declarao de tipos ] [ declarao de variveis ] [ declarao de subprogramas ] begin comando [ ; comando] ... { Corpo do Programa } end.
A.) CABEALHO DO PROGRAMA.
O cabealho consiste da palavra reservada Program seguida de um identificador que corresponde ao nome do programa, terminando com um ponto e vrgula. Este cabealho tem por finalidade identificar o seu programa dando-lhe um nome Exemplos: program Circulo; program Relatrio;
B.) SEO DE DECLARAES
Pela sua sintaxe o pascal requer que todos os identificadores usados no programa sejam sejam declarados antes que voc possa usa-los. E nesta seo que iremos declarar nossas variveis, constante, procedimentos e funes.
C.) CORPO DO PROGRAMA
o programa propriamente dito, onde so especificados, atravs dos comandos da linguagem as aes do programa. program Oi_Mundo; var I : integer; begin for I := 1 to 1500 do Write Oi mundo; end.
PALAVRAS RESERVADAS
Pascal reconhece certo grupo de palavras como sendo reservadas. Essas palavras tem significado especial e no podem ser usadas como identificadores em um programa. A seguir listamos algumas das palavras reservadas do Pascal
And end mod Repeat Array file nil Set asm implementation shl Until Begin for not Then Case foward of To Const function or Type constructor inline unit Uses destructor xor Div goto packed Until Do if procedure Var Downto in program While else label record With interface shr object String
COMENTRIOS
Comentrios so textos escritos dentro do cdigo-fonte que tem por finalidade esclarecer o porque de algumas funes estarem sendo utilizadas dentro do nosso programa.Voc pode colocar comentrios de duas formas: ou envolvendo o texto entre chaves {..} ou entre (* .. *).
Quando o compilador encontra o smbolo { ele salta todos os caracteres at encontrar um }. Da mesma forma, todos os caracteres que seguem (* so pulados at ser detectado o smbolo *). Como resultado disso, qualquer uma das formas pode ficar dentro da outra; por exemplo {...(*...*)...} um comentrio.
Uma utilidade de se usar comentrios dentro de comentrios quando queremos escrever alguns comandos temporrios dentro do programa ( talvez para depurao ), como ilustramos abaixo:
(* if A = 10 then { este comando somente para depurao } write( A e igual a 10 ); *)
TIPOS DE DADOS
Um tipo de dados especifica as caractersticas, ou seja os valores e operaes possveis de serem utilizados com um dado desse tipo. Toda varivel e constante usada em um programa tem um tipo associado a ela.
TIPOS DE DADOS ESCALARES
INTEGER
O tipo INTEGER representa os nmeros inteiros ma o pascal permite at cinco tipo de nmeros inteiros, sendo que cada um abrange um subconjunto dos nmeros inteiros e todos os tipos inteiros so ordinais (ordenados). So eles:
TIPO FAIXA DE VALORES No. De BYTES Shortint -128..127 Com sinal 8-bits Integer -32768..32767 Com sinal 16-bits Longint -2147483648..2147483647 Com sinal 32-bits Byte 0..255 Sem sinal 8-bits Word 0..65535 Sem sinal 16-bits
var NumAlunos : integer; Cont : integer;
REAL
O tipo REAL representa os nmeros reais sendo que pascal permite seis tipos de nmeros reais, cada um com um faixa de valores e preciso especficas sendo que nenhum dos tipos reais ordinais.
So eles:
Tipo Faixa Dgitos Significativos Bytes real 2.9e-39..1.7e38 11-12 6 single 1.5e-45..3.4e38 7-8 4 double 5.0e-324..1.7e308 15-16 8 extended 3.4e-4932..1.1e4932 19-20 10 comp -9.2e18..9.2e18 19-20 8
var Nota : real; Salario : real;
BOOLEAN
O tipo BOOLEAN representa os valores lgicos TRUE e FALSE sendo que este tipo tambm um ordinal, onde : FALSE < TRUE.
var Aprovado : boolean; Confirma : boolean;
CHAR
O tipo CHAR representa um nico caracter pertencente tabela ASCII.
var Sexo : char;
TIPO ENUMERADO ( ENUMERATED )
O tipo enumerado um tipoo onde os valores que as variveis deste tipo podem assumir so descritos atravs de uma lista de valores e permitido que nomes significativos sejam associados a cada valor usado para as variveis. A definio de um tipo enumerado feita colocando-se entre parnteses os valores que as variveis podem assumir, separados por vrgulas, como mostrado a seguir:
var Dias : ( Domingo, Segunda, Terca, Quarta, Quinta, Sexta, Sabado );
program Totaliza_Horas_De_Trabalho; var Dias :(Domingo,Segunda,Terca,Quarta,Quinta,Sexta,Sabado); Meses :(Jan,Fev,Mar,Abr,Mai,Jun,Jul,Ago,Set,Out,Nov,Dez); TotalHoras, HorasDeTrabalho : integer; begin . . . TotalHoras := 0; for Dias := Segunda to Sabado do begin readln( HorasDeTrabalho );
O Pascal admite tambm um tipo denominado subintervalo ( subrange ) que representa um subconjunto de valores de tipos escalares ordenados.
Uma varivel do tipo subintervalo declarada da seguinte forma : var NumDiadoMes : 1..31; LetrasMaiusculas : A..Z; DiaDoAno : 1..365;
TIPOS DE DADOS ESTRUTURADOS
STRING Armazena uma cadeia de caracteres com o tamanho mximo de at 255 caracteres, mas podemos especificar um tamanho menor que 255 para uma varivel deste tipo. Esse tipo permite a concatenao de duas variveis utilizando-se o operador +.
var Frase : string; Nome : string[45];
VARIVEIS
Toda varivel uma posio de memria a qual nos atribumos um nome e que podemos alterar o seu valor durante a execuo do programa, no Pascal todas as variveis usadas devem ser declaradas usando a clusula VAR, dentro da seo de declaraes. Na linha de declarao, alm de indicar o nome que deseja para as variveis, indica-se tambm qual o tipo que as mesmas esto associadas.
Sintaxe:
var NomeVar [ , identif ]... : tipo-do-dado; [NomeVar [ , identif ]... : tipo-do-dado; ] ... O tipo-do-dado um dos tipos predefinidos ou um tipo definido pelo usurio: Ex.: var Soma, Total, Salario : real; Idade, Contador : integer; Ms : 1..12; Dias : (SEG, TER, QUA, QUI, SEX, SAB, DOM );
CONSTANTES
Uma constante um valor que no pode ser alterado durante a execuo do programa, as constantes podem ser divididas em vrias categorias de acordo com o tipo predefinido a que elas pertencem, como veremos logo a seguir:
LITERAIS Representadas pelos caracteres colocados entre apstrofos. Ex.: Isto um exemplo Bem vindo a Sergipe Voce o 1 colocado - Literal Vazia
ARRAY Representadas por um array.
RECORD Representadas por um record
CONSTANTES NOMEADAS
Em um programa possvel se associar um Nome a uma constante, de forma que sempre que nos referirmos a esse identificador, estaremos nos referindo ao valor da constante, evitando que tenhamos que ficar digitando um valor constante em vrios lugares, outra vantagem est no fato de que no momento que este valor se tornar obsoleto necessitando ento de uma alterao no necessrio alterar todo o programa, mas somente a declarao de constante;
Sintaxe:
const NumDias = 7; { tipo integer } NumAulas = 14; { tipo integer } PI = 3.141519265; { tipo real } Esporte = Futebol de Campo; { tipo literal } FatorCalculo = ( PI * 13.5 ) + 9; { tipo real } AulasDia = NumAulas / NumDias; { tipo real }
Exemplo :
program Area_Circulo; { Programa para calcular a rea de um crculo. } const PI = 3.141519265; var Area, Comprimento, Raio : real; BEGIN writeln( Digite o Raio : ); readln( Raio ); Area := PI * Raio * Raio; Comprimento := 2 * PI * Raio; writeln( rea = , Area ); writeln( Comprimento da Circunferencia = , Comprimento ); END.
CONSTANTES TIPADAS
Constantes tipadas so constantes que tm tipo definido, mas que podem ter seu contedo alterado da mesma forma que uma varivel. Na declarao de uma constante tipada especificado tanto o tipo quanto o valor inicial da constante. const NumDias : integer = 7; { tipo integer } NumAulas : integer = 14; { tipo integer } PI : real = 3.141519265; { tipo real } Esporte : string[20] = Futebol de Campo; { tipo literal } Fator : real = ( PI * 13.5 ) + 9; { tipo real } AulasDia : real = NumAulas / NumDias; { tipo real }
program Area_Circulo; { Programa para calcular a rea de um crculo. } const PI : real = 3.141519265; Raio : real = 1; var Area, Comprimento : real; BEGIN writeln( Digite o Raio : ); readln( Raio ); Area := PI * Raio * Raio; Comprimento := 2 * PI * Raio; writeln( rea = , Area ); writeln( Comprimento da Circunferencia = , Comprimento ); END. DECLARAO DE TIPOS ( TYPE )
Uma declarao de tipo, permite que se crie novos tipo de dados. Uma vez declarado, tal tipo pode ser usado da mesma forma que o nome de um tipo predefinido do pascal, observe as linhas abaixo:
Sintaxe:
type ident = descrio-do-tipo; [ident = descrio-do-tipo;] ...
Onde:
ident = o nome que passar a identificar o tipo definido. Descrio-do-tipo = a descrio de um tipo vlido em Pascal.
Exemplo:
program Uso_Do_Type; type TDias = (Dom,Seg,Ter,Qua,Qui,Sex,Sab ); TMeses= (Janeiro, Fevereiro, Marco, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro ); TMaiusculas = A..Z; TContador = 1..MAXINT; Boolean = ( FALSE, TRUE ); var Dias : TDias; Meses : TMeses; DiasUteis : Seg..Sex; I, J : TContador; BEGIN ... END.
EXPRESSES
Uma expresso um conjunto de operandos (dados) unidos por operadores, de forma a computar (Calcular) um valor ou resultado. Os operandos podem ser variveis, constantes ou valores gerados por funes, j os operadores identificam as operaes a serem efetuadas sobre os operandos. Cada tipo de dados possui um conjunto de operadores relacionados. Os operadores classificam-se em Unrios e Binrios, conforme tenham um ou dois operandos, respectivamente.
Prioridade das Operaes
Se vrios operadores aparecerem em uma expresso, a ordem de execuo das operaes ser dada segundo os critrios abaixo : pelo emprego explcito de parnteses pela ordem de precedncia existente entre os operadores se existirem operadores de mesma ordem de precedncia, a avaliao ser feita da esquerda para a direita.
Ordem de Precedncia dos Operadores da maior para a menor :
Operadores Categoria ( ) Parntesis @ not Operadores Unrios * / div mod Operadores Multiplicativos and shl shr + - or xor Operadores Aditivos = <> < > <= >= in Operadores Relacionais
Tipos de Expresses
Existem trs tipos bsicos de expresses:
Numricas: Uma expresso numrica quando os seus operandos so numricos ( inteiros ou reais ) e o resultado tambm um valor numrico. Nas expresses relacionais so usados os operadores Aritmticos e os de Manipulao de Bits. Literais: Uma expresso literal quando os seus operandos so literais do tipo string (no pode ser char) e o resultado tambm um valor literal. S existe um nico operador para se usar em expresses literais, o operador Concatenao( + ). Boolenas: Uma expresso booleana quando seu resultado do tipo boolean (TRUE ou FALSE), podendo seu operando serem de qualquer tipo de dados. Nas expresses relacionais so usados os operadores Lgicos e os Relacionais.
Tipos de OperadoresAritmticos
Manipulao de Bits Concatenao Relacionais Lgicos Atribuio Operadores de Ponteiros Operadores de Conjuntos Operador Type-Cast
OPERADORES ARITMTICOS
Este operadores so usados para efetuar operaes aritmticas com nmero inteiros e reais.
Subtrao - Adio + Multiplicao * Diviso Real / Diviso Inteira ( truncada ) div Resto da Diviso Inteira mod Inverte Sinal - Mantm Sinal +
Exemplo:
var A, B : integer; C, D : real; BEGIN A := 1; B := 3; C := 5; D := 10; A := 1 + B; A := B + D; { errado, D real } B := 10 div 3; A := 10 mod 3; C := D / C; D := 10 div C; { errado, o operado div s para inteiros } A := -1; B := 5 + A; B := -A; C := D * A; B := C * B; { errado, C real } END.
OPERADORES DE MANIPULAO DE BITS
Usados para efetuar a manipulao dos bits de uma varivel.
E binrio and OU binrio or XOR binrio xor NOT binrio not
OPERADOR CONCATENAO ( + )
Efetua a juno de duas variveis ou constantes do tipo string.
Exemplo: var PreNome, SobreNome, NomeCompleto : string[ 30 ];
BEGIN { Suponhamos o nome Josias Lima Santos } PreNome := Josias; SobreNome := Santos;
NomeCompleto := Jose + Maria; writeln( NomeCompleto ); ... END.
OPERADORES RELACIONAIS
Usados para efetuar a comparao entre dados de mesmo tipo.
Maior que > Menor que < Maior ou igual >= Menor ou igual <= Igual = Diferente <>
Exemplo:
var Nota1, Nota2 : real; NomeAluno1, NomeAluno2 : string[ 30 ]; A, B, C : integer; BEGIN A := 2; B := 3; C := 1; if B = A + C then writeln( B ); Nota1 := 5.0; Nota2 := 10.0; if Nota1 < Nota2 then writeln( Nota1 ); NomeAluno1 := Maria Jose; NomeAluno2 := MariaJose; if NomeAluno1 < NomeAluno2 then writeln( NomeAluno1 ); END.
OPERADORES LGICOS
Usado para se analisar duas ou mais expresses interrelacionadas. E and OU or NO not
Exemplo: var Nota1, Nota2 : real; NomeAluno1, NomeAluno2 : string[ 30 ]; A, B, C : integer;
BEGIN A := 2; B := 3; C := 1; NomeAluno1 := Maria Jose; NomeAluno2 := MariaJose;
if ( B = A + C ) and ( NomeAluno1 <> NomeAluno2 ) then writeln( NomeAluno1, B ); if ( A = C ) or ( NomeAluno1 = NomeAluno2 ) then writeln( NomeAluno1 );
if not( A = C ) then writeln( NomeAluno1 ); END.
OPERADOR ATRIBUIO ( := )
Usado para atribuir o valor de uma expresso a uma varivel.
Exemplo: A := 10; Nome := Josias;
FUNES PRE-DEFINIDAS
O Pascal oferece um conjunto de funes, que so usadas com vrios tipos de dados simples sendo que estas funes geralmente necessitam de algum dados de entrada e a estes dados damos o nome de Parmetro, como existe uma grande variedade de funes elas sero divididas em classes para um melhor entedimento:
Funes Matemticas
Funo Finalidade Parmetro Sada abs( x ) Calcula o valor absoluto de x. inteiro ou real o mesmo que x arctan( x ) Calcula o arco-tangente de x em radianos inteiro ou real real cos( x ) Calcula o coseno de x em radianos inteiro ou real real
exp( x ) Calcula e x , em que e=2.7182818 sistema natural de logaritmos neperianos. inteiro ou real real ln( x ) Calcula o logaritmo natural de x (x>0) inteiro ou real real sin( x ) Calcula o seno de x em radianos inteiro ou real real sqr( x ) Calcula o quadrado de x inteiro ou real o mesmo que x sqrt( x ) Calcula a raiz quadrada de x (x>=0) inteiro ou real real odd( x ) Determina se x par ou impar TRUE, X par / FALSE, X impar inteiro boolean randomize Inicia o gerador de nmeros aleatrios coma hora do Sistema Operacional nenhum nenhum random( x ) Retorna um nmero pseudo-aleatrio entre 0 e x. Se x no for especificado retorna um valor entre 0.0 e 1.0 inteiro real pi Retorna o valor de PI (3.1415...) nenhum real
Funes Literais
Nome Funo Objetivo Parmetro Sada Length( x ) Determina o nmero de caracteres de x string inteiro Concat( x1, x2, x3,...) Concatena duas ou mais strings (mx 255 caracteres) string string Copy( x, y, z ) Retorna uma subcadeia da cadeia x, com z caracteres, comeando no caracter y. string, inteiro, inteiro string pos( x, y ) Retorna a posio da cadeia x dentro da cadeia y, se no for encontrada retorna 0. String, string inteiro delete( x, y, z ) Remove z caracteres da cadeia x a partir da posio y string, inteiro, inteiro nenhum Insert( x, y, z ) Insere a cadeia de caracteres x na cadeia y a partir da posio z (max 255 ) string, string, inteiro nenhum UpCase( x ) Retorna x convertido para maiscula char char
Funes para Converso
Nome Funo Objetivo Parmetro Sada trunc( x ) Trunca x para um nmero inteiro real inteiro int( x ) Retorna a parte inteira de x real real frac( x ) Retorna a parte fracionria de x real real round( x ) Arredonda x para um inteiro real inteiro chr( x ) Determina o caracter ASCII representado por x inteiro char ord( x ) Determina o inteiro que usado para codificar x char inteiro tipo( x ) Muda o tipo de x para tipo qualquer tipo
Funes de Uso Geral
Nome Funo Objetivo Parmetro Sada inc (x,[y]) Incrementa x de y unidade tipo ordenado o mesmo de x pred( x ) Determina o predecessor de x tipo ordenado o mesmo de x succ( x ) Determina o sucessor de x tipo ordenado o mesmo de x sizeof( x ) Retorna o nmero de byte de x qualquer tipo inteiro
COMANDOS
BLOCO DE COMANDOS
Consiste do encadeamento de uma srie de comandos para a realizao de alguma ao, sendo que os comandos que formam este bloco devem estar separados um dos outros por um ponto e virgula e todo bloco de comando deve ser iniciado e finalizado pelas seguintes palavras chave begin e end, respectivamente, de acordo com a sintaxe :
begin comando [ ; comando ]... end;
Exemplo:
if A > B then begin Temp := A; A := B; B := Temp; end;
DESVIOS CONDICIONAIS
1.)IF-THEN-ELSE
O comando IF-THEN-ELSE permite efetuarmos um desvio condicional, segundo uma determinada condio booleana, ele funciona de forma anloga ao nosso SE-ENTAO-SENAO do algoritmo.
Sintaxe:
if exp-booleana then Begin Bloco1; End Else begin Bloco2; end;
2.) Estrutura CASE
O comando CASE permite efetuarmos um desvio condicional, permitindo se o desvio seja feito baseado em n possveis valores para a varivel de controle. Este comando trabalha sempre associado com uma lista de valores constantes que correspondem as hipteses para o valor de uma determinada varivel, ou expresso ( chamada seletor ) e uma lista de comandos, sendo que este seletor pode ser de um dos seguintes tipos integer, char, boolean.
program TestaTecla; { Programa para testar a tecla pressionada } var Tecla : char; BEGIN writeln( Pressione uma Tecla : ); readln( Tecla );
case Tecla of A..Z, a..z: writeln(Voc pressionou uma Letra); 0..9: writeln(Voc pressionou um Numero); +, -, *, /: writeln(Voc pressionou um Sinal Aritmetico); else writeln( Voc pressionou uma outra tecla qualquer ); end; END.
OBS.: O Comando CASE pode ser substitudo por um conjunto de IF-THEN-ELSE aninhados, no entanto, nesses casos, onde h muitas condies, o comando CASE, torna o programa mais legvel.
BLOCOS DE REPETIO
Utilizamos os blocos de repetio quando temos necessidade que um determinado bloco de comando seja repetido inmera vezes, e os principais laos de repetio so:
1.) Comando WHILE
Este comando anlogo ao comando Enquanto do algoritmo, ou seja, o bloco executando enquanto a condio de execuo for verdadeira.
Sendo que no podemos esquecer que a expresso que controla a repetio dever ser do tipo boolean, sendo a mesma avaliada antes que o comando do lao seja executado. Isto quer dizer que, se logo no incio o resultado da expresso for FALSE, o lao no ser executado nenhuma vez.
Sintaxe :
while expressao do begin comando; end;
Exemplo:
program TesteWhile; var I, J : integer;
BEGIN I := 0; while I < 5 do I := I + 1; writeln( I ); J := 0; while J < 5 do begin J := J + 1; writeln( J ); end; END.
2.) Comando REPEAT
O comando REPEAT faz com que um comando seja executado enquanto a expresso de controle permanecer falsa (FALSE), da mesma forma como nos vimos quando estudamos o lao de repetio REPITA-AT QUE. O teste da condio feito ao final do lao, dessa forma o lao sempre executado pelo menos uma vez.
Sintaxe :
repeat comando [;comando]... until expressao;
Exemplo:
program TesteRepeat; var I, J : integer;
BEGIN I := 0; repeat I := I + 1; until I >= 5; writeln( I );
J := 0; repeat { No necessrio o BEGIN e END } J := J + 1; writeln( J ); until J >= 5; END.
3.) Comando FOR
O comando FOR executa repetitivamente um bloco de comandos enquanto uma varivel de controle incrementada ou decrementada at atingir o valor de finalizao (contador do FOR). A varivel de controle poder ser de qualquer tipo escalar ordenado e as expresses de um tipo compatvel com ela.
O comando FOR funciona da seguinte maneira :
Inicialmente, a varivel de controle recebe o valor da primeira expresso ( expresso1 ) Antes de comear a execuo do lao, a varivel de controle testada para verificar se ela menor ou igual ( se for usado o TO ) ou se maior ou igual ( se for usado o DOWNTO ) segunda expresso. Se o resultado do teste for verdadeiro, o comando do lao executado Ao terminar a execuo do bloco de comando do lao, a varivel de controle testada para verificar se ela igual ao valor final Se a varivel de controle for igual ao valor final, a repetio termina Se no for igual, ela incrementada ou decrementada de uma unidade
Aps o trmino do comando FOR, a varivel de controle, ter o valor da Expressao2, a no ser que o lao tenha sido interrompido por um comando goto ou break.
Sintaxe : for contador := expressao1 to/downto expressao2 do begin comando; end;
Onde :
contador = uma varivel de controle cujo valor ser incrementado (se usado o to) ou decrementado (se usado o downto) de uma unidade. Expressao1 = o valor inicial da varivel de controle Expressao2 = o valor final da varivel de controle
Exemplo :
for I := 1 to 100 do Soma := Soma + I; for I := 1 to 100 do begin readln( x ); Soma := Soma + x; end;
for I := 100 downto 1 do writeln( I );
type TDias = ( Dom, Seg, Ter, Qua, Qui, Sex, Sab ); var Dia : Tdias Vendas, VendasToal : real; ... for Dia := Seg to Sex do begin readln( Vendas ); VendasTotal := VendasTotal + Vendas; end;
4.) Comando CONTINUE
O comando CONTINUE causa o desvio para o final do lao, mas um desvio mais interno do lao de repetio, ou seja ele no finaliza o bloco ele apenas pula a execuo dos comandos restantes deste lao.
Exemplo:
while expressao do begin ... continue; ... { o comando continue desvia para aqui } end;
for I := expressao1 to expressao2 do begin ... continue; ... { o comando continue desvia para aqui } end;
repeat ... continue; ... { o comando continue desvia para aqui } until expressao;
OBS.: O comando CONTINUE no faz parte do Pascal Padro.
5.) Comando BREAK
O comando BREAK causa a sada incodicional do lao, mais interno caso existam mais de um lao alinhados, de um bloco de comando de repetio.
Exemplo:
while expressao do begin ... break; ... end; { o comando break desvia para aqui } ...
for I := expressao1 to expressao2 do begin ... break; ... end; { o comando break desvia para aqui } ...
repeat ... break; ...
until expressao; { o comando break desvia para aqui } ...
OBS.: O comando BREAK no faz parte do Pascal Padro.
6.) Comando HALT
O comando HALT causa o trmino imediato do programa.
Exemplo: Program teste; BEGIN ...
if Opcao = F then halt; {O programa terminar, aqui se a condicao do IF for satisfeita } ... END. {O programa terminar, aqui se a condicao do IF no for satisfeita}
COMANDOS DE ENTRADA E SADA
1.) COMANDOS WRITE E WRITELN
O comando write anlogo ao comando escreva do algoritmo ele serve para realizar a escrita do valor de uma varivel, ou de uma mensagem na tela, a nica diferena se em contra no sufixo LN que permite que aps a escrita seja pulado uma linha.
Explo:
Write (Oi ,nome); {Escreve mas no pula uma linha} Writelm (Oi ,nome); {Escreve mas pula uma linha}
2.) COMANDOS READ E READLN
O comando Read anlogo ao comando Leia utilizado em algoritmo, e serve para realizar a leitura de um contedo a partir do teclado e armazenar este valor dentro de uma varivel, e a diferena dos dois comandos est no uso do LN, que serve para pular uma linha aps a leitura.
Exemplo:
Read (Nome); {L o contedo de uma varivel } Readln (nome) {L o contedo de uma varivel e salta uma linha}
ESTRUTURA DE DADOS TIPO ARRAY
Definio
Um array um tipo de dado estruturado consistindo de um nmero fixo de componentes, todos do mesmo tipo. Cada componente de um array pode ser explicitamente acessado atravs de um ndice. As variveis desse tipo se subdividem em duas categorias, as uni-dimentsionais (tambm chamados de vetores ), e as multi-dimensionais, a depender do nmero de ndices usados para individualizar cada elemento do conjunto. Os arrays bi-dimensionais so comumente chamados de matrizes, onde no primeiro ndice visualizamos como sendo as linhas de um tabela, e o segundo ndice, as colunas.
Declarao do Tipo Array
A definio de um tipo array feita de acordo com a seguinte sintaxe: [packed] array [ x1..y1 [ , x2..y2] ... ] of tipo-do-dado
Onde :
Xn .. Yn correspondem respectivamente ao valor do 1 ndice e o valor do ultimo ndice
OBSERVAES 1. Os smbolos (. e .) so substitutos que podem ser utilizados no lugar de [ e ]. 2. O uso da palavra reservada packed faz com que o array seja melhor alocado na memria de forma a economizar espao, em detrimento de um pequena perda de performance. No Turbo Pascal, isso feito automaticamente, de forma que a palavra packed sempre ser desprezada.
EXEMPLOS
tope TMatriz = array[ 1..10, 1..10 ] of real; TSituacao = array[ boolean ] of integer; TCores = ( Vermelho, Amarelo, Azul ); TIntensidade = array[ TCores ] of real;
Referncia aos Elementos de um Array
Um elemento de um array selecionado colocando-se o valor do seu ndice entre colchetes, logo depois do seu nome. Neste caso, o elemento com o ndice denominado de varivel subscrita. No caso de um array multi-dimensional, ao valores usados para indexao devem ser separados uns dos outros atravs de vrgulas.
1. Se nos referenciar-mos a um array utilizando um ndice fora dos limites do array, isso provocar um erro em tempo de execuo. Ex. : A[ 11, 5 ] := 10; { O limite de linhas da matriz A 10 e no 11 }
Todos os elementos de um array podem ser copiados em outro com um nico comando de atribuio desde que as duas variveis sejam do mesmo tipo. Se os arrays forem multi-dimensionais, pode-se tambm copiar parte deles, como mostrado abaixo:
type
TMatriz = array[ 1..10, 1..10 ] of integer; TVetor = array[ -50..50 ] of real;
var
A, B : TMatriz; X, Y : TVetor;
BEGIN
X := Y; { Atribui a X todos os elementos de Y } A[ 1 ] := B[ 2 ]; { Atribui a linha 2 de B linha 1 de A }
END. Arrays de Caracteres
Os arrays de caracteres podem ser manipulados como strings, vejamos um exemplo:
EXEMPLO
program TesteArrayChar;
var
Digitos : array[ 1..10 ] of Char; I : integer;
BEGIN
Digitos := 0123456789; for I := 1 to 10 do write( Digitos[ I ] ); writeln; writeln( Digitos );
END.
Leitura e Impresso de Arrays
A leitura e impresso de arrays so feitas indicando individualmente quais elementos se deseja ler ou imprimir.
EXEMPLOS
var
Vetor : array[ 1..10 ] of integer; Matriz : array[ 1..10, 1..20 ] of real; I, J : integer;
BEGIN
{ Leitura de um vetor } for I := 1 to 10 do readln( Vetor[ I ] ); { Impresso de um vetor } for I := 1 to 10 do writeln( Vetor[ I ] ); { Leitura de uma matriz - Linha por Linha } for I := 1 to 10 do for J := 1 to 20 do readln( Matriz[ I, J ] ); { Impresso de uma matriz - Linha por Linha } for I := 1 to 10 do for J := 1 to 20 do writeln( Matriz[ I, J ] ); { Leitura de uma matriz - Coluna por Coluna } for I := 1 to 20 do for J := 1 to 10 do readln( Matriz[ I, J ] );
END.
Arrays Multi-Dimensionais
Para ilustrar o uso de arrays Multi-Dimensionais, considere o seguinte problema:
Um professor atribui a cada aluno de uma turma de 50 alunos, trs notas resultantes de trs avaliaes; o professor deseja saber a mdia de cada aluno e a mdia da turma em cada avaliao.
Uma maneira natural de tratar esse problema com o uso de um array bidimensional ( MATRIZ ), tal como ilustrado abaixo na matriz NOTAS. Onde cada linha representa um aluno e cada coluna representa uma avaliao (dessa forma teramos uma matriz 50 X 3), assim para sabermos a nota do aluno N o 10 na 2 a Avaliao, teramos NOTAS[ 10, 2 ] .
Usaremos dois arrays unidimensionais ( VETORES ) para conter as mdias. O array Media_Alunos conter a mdia de cada aluno e Media_Avaliacao conter a mdia de cada avaliao.
Program Analise_de_Notas;
{ Programa que ir ler as notas obtidas pelos alunos de uma turma colocando-as em um array bi-dimensional. A seguir ser calculada a mdia obtida por cada aluno e a mdia de cada avaliao, imprimindo os resultados.}
Notas : array[ IndiceAluno, IndiceAvaliacao ] of real; MediaAlunos : array[ IndiceAluno ] of real; MediaAvaliacao : array[ IndiceAvaliacao ] of real; I, J : integer; Soma : real;
BEGIN
{ Leitura da Matriz de Notas } for I := 1 to NumAlunos do { Leitura das Noras do I-esimo aluno } for J := 1 to NumAvaliacoes do read( Notas[ I, J ] );
{ Calculo da mdia de cada avaliao guardando-as no array MediaAvaliacao } for J := 1 to NumAvaliacoes do
begin Soma := 0; for I := 1 to NumAlunos do Soma := Soma + Notas[ I, J ]; MediaAvaliacao[ J ] := Soma / NumAlunos; end;
{ Calculo da mdia de cada aluno guardando-as no array MediaAlunos } for I := 1 to NumAlunos do begin Soma := 0; for J := 1 to NumAvaliacoes do Soma := Soma + Notas[ I, J ]; MediaAlunos[ I ] := Soma / NumAvaliacoes; end;
{ Impressao das Mdias dos Alunos e suas notas } writeln( Aluno, Media:7, :10, Notas, ); for I := 1 to NumAlunos do begin write( I:4, MediaAlunos[ I ]:8:1, :4 ); for J := 1 to NumAvaliacoes do write( Notas[ I, J ]:5:1 ); writeln; end;
{ Impressao das medias das avaliaoes } write( Media das Avaliaes : ); for J := 1 to NumAvaliacoes do write( MediaAvaliacoes[ J ]:5:1 ); END.
Arrays Constantes
As constantes j vistas se enquadram entre as constantes denominadas escalares. No Pascal existem outros tipos de constantes, denominadas estruturadas, para as quais esto associadas no um valor, como nas escalares, mas um coleo de valores. Um dos tipos de constantes estruturadas do Pascal so os Arrays Constantes, os quais so definidos da seguinte forma:
A declarao de um array constante contm a especificao de cada um dos valores dos elementos do array. O tipo dos elementos de uma constante de array pode ser qualquer um dos tipos de dados da linguagem Pascal, com exceo do tipo file.
EXEMPLOS
Type
TStatus = ( Ativo, Passivo, Esperando ); TStatusString = array[ Status ] of string[ 7 ];
Suponhamos que se deseja armazenar o nome e a nota obtida pelos alunos de um turma. Embora em Pascal se possa fazer isso de vrias maneiras, iremos apresentar uma forma simples e direta para resolver esse problema: utilizando arrays paralelos, isto , arrays com o mesmo ndice para representar informaes relacionadas mas de tipos diferentes. Vejamos:
ESTRUTURADA DE DADOS TIPO REGISTRO
Conceito
Um tipo de dado estruturado cujos elementos constituintes no precisam ser de mesmo tipo. Assim, podemos tanto nos referir coletivamente a um conjunto de elementos que diferem entre si no tipo, quanto a um elemento especfico do conjunto, denominado campo do registro.
Declarao do Tipo Registro
A declarao do tipo registro, consiste da palavra reservada record, seguida de uma lista de campos, e terminando com a palavra reservada end, de acordo com a sintaxe abaixo:
Onde, ident-campo consiste no nome que identifica o campo e tipo o tipo de dados do campo, podendo ser qualquer um dos tipos escalares, estruturados ou apontador.
A clusula packed faz parte da especificao do pascal ANSI, mas no aceita em compiladores como o Turbo Pascal.
Declarao de Variveis Registro
A forma de definir um registro definir um tipo de registro, utilizando-se da declarao TYPE. Assim as variveis podem ser definidas como sendo desse tipo.
Sintaxe
type Nome-Do-Tipo = record campo1 : tipo; campo2 : tipo; . . . campoN : tipo; end;
VAR
variavel : Nome-Do-Tipo;
Exemplo
type Reg_Aluno = record Nome : string(40); Matricula : integer; Notas : array[1..3] of real; end;
VAR MelhorAluno : Reg_Aluno; PiorAluno : Reg_Aluno;
Manipulao de Registros
Referncia aos Campos
Os nomes dos campos de um registro so semelhantes aos ndices de uma array. Eles permitem acessar individualmente cada informao. Para tal, colocamos o nome da varivel do tipo record ao qual o campo pertence, seguida de um ponto e finalmente do nome do campo.
Sintaxe
Nome-Do-Registro.Nome-Do-Campo
Exemplo type Reg_Aluno = record Nome : string(40); Matricula : integer; Notas : array[1..3] of real; end;
VAR Aluno1 : Reg_Aluno; Aluno2 : Reg_Aluno; I : integer; ...
{ Leitura dos campos de Aluno1 } read( Aluno1.Nome, Aluno1.Matricula );
for I := 1 to 3 do read( Aluno1.Notas[ I ] );
{ Exibio dos campos de Aluno2 } writeln( Aluno2.Nome ); writeln( Aluno2.Matricula );
for I := 1 to 3 do write( Aluno2.Notas[ I ] ); ...
Comando WITH
O comando with utilizado para simplificar a referncia aos campos de uma varivel tipo record, eliminando a necessidade de se colocar seu nome antes dos nomes dos campos.
Sintaxe
with Varivel-Registro [,Varivel-Registro]... do comando
with Varivel-Registro [,Varivel-Registro]... do begin comando; comando; ... end;
Exemplo
type Reg_Aluno = record Nome : string(40); Matricula : integer; Notas : array[1..3] of real; end;
VAR Aluno1, Aluno2 : Reg_Aluno; I : integer;
...
{ Leitura dos campos de Aluno1 } with Aluno1 do begin read( Nome, Matricula ); for I := 1 to 3 do read( Notas[ I ] ); end;
...
Atribuio de Campos e Registros
{ Atribuio campo a campo } Aluno1.Nome := Aluno2.Nome; Aluno1.Matricula := Aluno2.Matricula;
for I := 1 to 3 do Aluno1.Notas[ I ] := Aluno2.Notas[ I ];
{ Atribuio do registro inteiro } Aluno1 := Aluno2;
Registros Aninhados
Algumas vezes temos necessidade de estruturar um registro de forma hierrquica, onde algum campo seja tambm um registro.
Declarao type Reg_Data = record Dia : 1..31; Mes : 1..12; Ano : integer; end;
Reg_Aluno = record Nome : string(40); Matricula : integer; Notas : array[1..3] of real; Data_Nascimento : Reg_Data; end;
var Aluno1, Aluno2 : Reg_Aluno;
Referncia aos Campos
Para referenciar os campos do registro procedemos da mesma forma j descrita:
Muitas vezes encontramos um problema no qual temos que trabalhar com um conjunto de registros de mesmo tipo. para tais problemas, podemos utilizar uma estrutura de dados que combina arrays e records. Por exemplo, suponhamos que temos uma classe com 50 alunos onde cada aluno representado pelo registro Reg_Aluno, assim, podemos criar um array de 50 elementos, onde cada elemento do tipo Reg_Aluno.
Exemplo
type Reg_Aluno = record Nome : string(40); Matricula : integer; Notas : array[1..3] of real; end;
VetClasse = array[ 1..50 ] of Reg_Aluno;
var
Classe : VetClasse; I, J : integer;
Os registros dos 50 alunos poderiam ser lidos da seguinte forma:
for I := 1 to 50 do begin read( Classe[ I ].Nome, Classe[ I ].Matricula ); for J := 1 to 3 do
read( Classe[ I ].Notas[ J ] ); end;
Os registros dos 50 alunos poderiam ser exibidos da seguinte forma:
for I := 1 to 50 do begin with Classe[ I ] do begin write( Nome, Matricula ); for J := 1 to 3 do read( Notas[ J ] ); end; end;
EXEMPLO DO USO DE REGISTROS
Estudo de Caso
Problema: Uma empresa deseja avaliar o desempenho de sua equipe de vendedores para otimizar a produo. Para isto, deseja que seja elaborado um programa com as seguintes especificaes.
Entrada: Para cada vendedor ser fornecido seu nome, a quantidade de itens vendidos no ms e a quantidade de itens devolvidos pelos clientes.
Sada: Como resultado dever ser impresso para cada vendedor alm dos dados lidos, a venda lquida (vendas menos devolues) e a diferena entre a venda lquida e a mdia das vendas lquidas.
Soluo : As informaes sobre cada vendedor sero definidas com um registro do seguinte tipo:
type Reg_Vendedor = record Nome : string(30); Vendas, Devolucoes, Liquido, Comparacao : integer; end;
Os dados como consistem de uma lista de vendedores, sero definidos como um array de registros Reg_Vendedor.
Var
Vendedores : array[ 1.. NumVendedores ] of Reg_Vendedor;
O programa consiste basicamente das seguintes partes:
1. Ler os dados 2. Calcular a venda lquida de cada vendedor 3. Calcular a mdia das vendas lquidas 4. Calcular a diferena da venda lquida de cada vendedor com a mdia 5. Imprimir os resultados
program Relatorio_de_Vendas;
{Programa que l as vendas e as devolues de um grupo de vendedores e imprime uma tabela mostrando para cada vendedor os dados lidos, a venda lquida e a comparao de sua venda lquida com a mdia das vendas.}
const NumVendedores = 20;
Type Reg_Vendedor = record Nome : string(30); Vendas,
Devolucoes, Liquido, Comparacao : integer; end;
Var
Vendedor : array[ 1..NumVendedores ] of Reg_Vendedor; Media, Soma, I : integer;
BEGIN { Leitura dos Dados } for I := 1 to NumVendedores do with Vendedores[ I ] do readln( Nome, Vendas, Devolucoes );
{ Calculo das Vendas Liquidas e da Media das Vendas } Soma := 0; for I := 1 to NumVendedores do with Vendedores[ I ] do begin Liquido := Vendas - Devolucoes; Soma := Soma + Liquido; end;
Media := Soma / NumVendedores; { Comparacao das vendas de cada vendedor com a media } for I := 1 to NumVendedores do Vendedores[ I ].Comparacao := Vendedores[ I ].Liquido - Media;
{ Impresso dos Resultados } clsrscr(); writeln( :25, Resumo das Vendas); writeln; writeln( :10, Nome, :12, Vendas, :6, Devol, :4, Liquido, :5, DifMedia ); writeln; for I := 1 to NumVendedores do with Vendedores[ I ] do writeln( Nome, Vendas:11, Devolucoes:11, Liquido:11, comparacao:11 );
END.
SUBPROGRAMAS
At agora temos desenvolvido programas que englobam a lgica completa do algoritmo para a soluo de um determinado problema. comum, em programao, decompor a lgica de programas complexos em programas menores e, depois, junt-los para compor o programa final. Essa tcnica de programao denominada programao modular. A programao modular consiste num mtodo para facilitar a construo de grandes programas, atravs de sua diviso em pequenas etapas, que so os mdulos ou subprogramas e para possibilitar o reaproveitamento de cdigo, j que podemos utilizar um mdulo quantas vezes for necessrio, eliminando assim a necessidade de escrever o mesmo cdigo do programa em situaes repetitivas. Outra importncia da modularizao que ela permite que diferentes programadores trabalhem simultaneamente na soluo de um mesmo problema, atravs da codificao separada dos diferentes mdulos.
A modularizao, em Pascal, pode ser feita atravs de procedimentos (procedures) e funes (functions). Isso feito associando-se um nome a uma seqncia de comandos atravs do que chamamos Declarao do Procedimento ou da Funo. Pode-se, ento, usar o nome do procedimento ou da funo dentro do corpo do programa, sempre que desejarmos que o seu bloco de comandos seja executado, isso o que chamamos de Chamada do Procedimento ou da Funo.
Procedimentos
Um procedimento uma estrutura de programa autnoma que est includa num programa em Pascal. Nele podem ser colocados todos os elementos da linguagem Pascal, como se fosse um programa completo, isso feito atravs de sua declarao.
Um procedimento pode ser referido escrevendo simplesmente o seu nome seguido de um lista opcional de parmetros. Quando um procedimento referenciado, o controle de execuo do programa automaticamente transferido para o incio do procedimento. As instrues de execuo dentro do procedimento so ento executadas, tendo em conta quaisquer declaraes especiais que sejam nicas para o procedimento. Quando todas as instrues de execuo tiverem sido executadas, o controle passa automaticamente para a instruo imediatamente a seguir da chamada do procedimento.
Declarao
procedure Nome_Do_Procedimento( Lista-parametros ); [ declarao de rtulos ] [ declarao de constantes ] { Declaraes Locais } [ declarao de tipos ] [ declarao de variveis ] [ declarao de subprogramas ]
begin comando [ ; comando] ... { Corpo do Procedimento } end;
Exemplo
program Encontro; var Nome : string[ 15 ];
procedure Elogio; begin writeln( Bonito Nome ); writeln( Um dos meus favoritos ); end;
BEGIN writeln( Qual o seu nome ? ); readln( Nome ); Elogio; writeln( Prazer em conhece-la, , Nome ); END.
Ao executar o programa acima, seria exibido o seguinte dilogo na tela :
Qual o seu Nome ? Florentina Bonito Nome Um dos Meus Favoritos Prazer em conhece-la Florentina
Para um procedimento simples como o que foi declarado acima, a sintaxe a seguinte :
procedure Nome-do-Procedimento; begin comando [ ; comando ] ...
end;
A primeira linha da declarao chama-se cabealho do procedimento que, de acordo com a sintaxe, consiste da palavra reservada procedure seguida por um identificador que ir servir como nome do procedimento. Aps o cabealho, temos o corpo do procedimento que consiste de um comando composto.
A declarao de um procedimento feita na parte de declaraes do programa principal. O nome do procedimento colocado dentro do corpo do programa principal considerado como uma chamada do procedimento. As chamadas de um procedimento podem ocorrer onde pode ser usado qualquer outro comando do Pascal.
Parmetros
Os parmetros so uma forma dos procedimentos trocarem informaes com os programas. Para ilustrar melhor o uso de parmetros, considere um programa para solicitar as notas obtidas por um aluno com o respectivo peso, para depois calcular a mdia aritmtica ponderada. O programa deveria comear por :
writeln( Primeira Nota); writeln( Digite a Nota : ); readln( Nota1 ); writeln( Digite o Peso da Nota : ); readln( Peso1 );
A seguir o programa dever solicitar a segunda nota como indicado abaixo :
writeln( Segunda Nota); writeln( Digite a Nota : ); readln( Nota2 ); writeln( Digite o Peso da Nota : ); readln( Peso2 );
Note que as quatro ltimas linhas dos dois trechos do programa executam a mesma tarefa: eles apresentam uma mensagem, depois lem um nmero, a seguir apresentam um segunda mensagem e finalmente lem um segundo nmero. Visto que so tarefas repetitivas, faz sentido pensarmos em declararmos essas linhas como um procedimento. Existe, no entanto, um problema : na primeira parte ns usamos as variveis Nota1 e Peso1 e na segunda parte ns usamos as variveis Nota2 e Peso2.
O problema resolvido em Pascal com o uso de variveis especiais chamadas de parmetros formais. Esses parmetros so, na realidade, posies que sero preenchidas com os endereos das variveis quando o procedimento for chamado pelo programa.
O procedimento LerDadosNota usado no programa a seguir, usa os parmetros formais Nota e Peso para fazer aquilo que desejamos:
program MediaGlobal; var Nota1, Nota2, Nota3, Peso1, Peso2, Peso3, Media : real;
{ Procedimento para solicitar os dados da Nota do aluno ao usurio } procedure LerDadosNota( var Nota : real; var Peso : real ); begin writeln( Digite a Nota : ); readln( Nota ); writeln( Digite o Peso da Nota : ); readln( Peso ); end;
{ PROGRAMA PRINCIPAL } BEGIN writeln( Primeira Nota); LerDadosNota( Nota1, Peso1 );
writeln( Segunda Nota); LerDadosNota( Nota2, Peso2 );
Como vemos, na hora de usar o procedimento com as variveis Nota1 e Peso1 substituindo os parmetros formais Nota e Peso, devemos chamar o procedimento LerDadosNota da seguinte forma :
LerDadosNota( Nota1, Peso1 );
As variveis usadas na chamada do procedimento, no caso Nota1 e Peso1, so denominadas parmetros atuais, que iro substituir todas as ocorrncias dos parmetros formais no corpo do procedimento. Esse processo chamado Passagem de Parmetros.
Como mostrado no programa anterior, um procedimento pode ser chamado vrias vezes usando parmetros atuais diferentes em cada vez.
Note que o tipo do parmetro formal definido no cabealho do procedimento e que os parmetros formais e atuais devem ser de mesmo tipo.
Um procedimento pode ter qualquer nmero de parmetros, os quais so listados entre parnteses depois do nome do procedimento, separados por ponto-e-vrgulas. Quando dois ou mais parmetros formais tiverem o mesmo tipo, eles podem ser combinados e seus tipos s precisam ser escritos uma nica vez. Nesse caso, os parmetros combinados so separados por vrgulas. Assim, no exemplo anterior, o cabealho de LerDadosNota poderia ser escrito da seguinte forma :
procedure LerDadosNota( var Nota, Peso : real );
A sintaxe de um procedimento que possua parmetros a seguinte :
procedure Nome-Do-Procedimento( var parametro [ ,parametro ] ... : tipo [;var parametro [ ,parametro ] ... : tipo ]...); begin comando [ ;comando ]... end;
Onde o tipo o nome do identificador de um tipo de dado predefinido ou de um tipo criado pelo programador.