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

Especica c ao do Portugol

(release 1.0, agosto de 2009)

Selan R. dos Santos David D erharbe Andr e M. C. Campos Marcelo Siqueira


c

2009, Departamento de Inform atica e Matem atica Aplicada DIMAp 13 de agosto de 2009

Sum ario
1 Introdu c ao 2 Tipos b asicos, vari aveis e constantes 2.1 Tipos b asicos . . . . . . . . . . . . . 2.2 Vari aveis . . . . . . . . . . . . . . . . 2.3 Constantes . . . . . . . . . . . . . . 2.4 Deni c ao de novos tipos b asicos . . . 2 2 2 2 3 3 5 5 5 6 7 8 8 10 10 10 10 13 13 13 15 15 17 20 20 22

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

3 Blocos, fun c oes e procedimentos 3.1 Escopo e visibilidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Passagem de par ametro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Passando arranjos por par ametro . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Operadores 5 Estruturas de controle 5.1 Estruturas condicionais 5.2 La cos . . . . . . . . . . 5.2.1 Para . . . . . . . 5.2.2 Repita-At e . . . 5.2.3 Enquanto . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

6 Tipos avan cados 6.1 Tipos refer encia . . . . . . . 6.2 Estruturas ou registros . . . 6.3 Tuplas . . . . . . . . . . . . 6.4 Tipos fun c ao ou funcionais

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

7 Tipo abstratos de dados (TAD) 8 Exemplos 8.1 Algoritmo de ordena c ao por utua c ao . . . . . . . . . . . . . . . . . . . . . . . . 8.2 Algoritmo identicar caminho raiz-para-folha de uma arvore tern aria . . . . . . .

Especica c ao do Portugol

v1.0, julho de 2009

Introdu c ao

Este documento apresenta uma especica c ao da linguagem Portugol. O objetivo da linguagem apresentada neste documento e denir um padr ao de representa c ao algor tmica a ser adotado nos tr es blocos did aticos oferecidos pelo DIMAp: Introdu c ao a T ecnicas de Programa c ao, Estruturas de Dados B asicas e Estruturas de Dados Avan cadas. Toda linguagem possui idiomas pr oprios (formas padronizadas de resolver determinados problemas). Elas possuem caracter sticas e particularidades, fazendo com que a implementa c ao de uma determinada ideia siga uma abordagem ou outra. Com o Portugol n ao ser a diferente. Por em, procuramos especicar uma linguagem mais gen erica poss vel. A seguir ser ao apresentados os componentes da linguagem atrav es de uma deni c ao gen erica, seguida de exemplos. A A gera c ao dos algoritmos foi realizada via L TEX, utilizando-se o pacote algorithm2e1 .

Tipos b asicos, vari aveis e constantes

Na descri c ao dos algoritmos, e poss vel utilizar tipos b asicos (ou primitivos), tipos compostos ou heterog eneos e tipos abstratos de dados (TADs). Nesta se c ao, ser ao apresentados apenas os tipos b asicos. Os demais, por envolver conceitos ainda n ao abordados, ser ao descritos posteriormente. Esta se c ao descreve igualmente como utilizar os tipos b asicos para declarar vari aveis e constantes.

2.1

Tipos b asicos

Os tipos b asicos s ao semelhantes ` a maioria das linguagens de alto n vel atuais. S ao eles: N umeros inteiros: inteiro N umeros reais ou ponto utuante: real Caractere: caractere Cadeia de caracteres: texto L ogico ou Booleano: booleano Sequ encias ou arranjos de um tipo: arranjo de Os arranjos correspondem a agrupamentos de vari aveis do mesmo tipo b asico, como em vetores (arranjos unidimensionais) e matrizes (arranjos bidimensionais). Esse tipo de dado suporta acesso indexado ` a posi c ao de cada elemento, atrav es do operador [ ] (por exemplo, arranjo[ ndice]). Vale, entretanto, salientar que a indexa c ao inicia com o valor 0 (zero), ou seja o primeiro elemento de um arranjo se encontra no ndice 0. O tamanho de um arranjo pode ser consultado com o operador tam. O tipo texto pode ser considerado como arranjo de caractere (cadeias de caracteres). Assim, pode-se igualmente acessar elementos do texto (caractere) atrav es de ndices, bem como consultar o tamanho de um texto atrav es do operador tam. Por em, diferentemente de um arranjo, que possui um tamanho xo denido na sua declara c ao, um texto possui tamanho variado.

2.2

Vari aveis

A declara c ao de vari aveis dos tipos b asicos e realizada atrav es da palavra reservada var. Mais de uma vari avel pode ser declarada ao mesmo tempo, contando que elas sejam do mesmo tipo. Ap os declarar uma vari avel (e seu tipo), pode-se atribuir apenas os valores pertinentes ao tipo em quest ao. A atribui c ao e realizada atrav es do operador . A atribui c ao pode ser feita a qualquer momento ap os e/ou durante a declara c ao da vari avel. Por em, para evitar confus ao
1

http://www.ctan.org/tex-archive/macros/latex/contrib/algorithm2e/

P agina 2

Especica c ao do Portugol

v1.0, julho de 2009

de valores, n ao ser a permitida a atribui c ao conjugada com inicializa c ao para situa c oes onde s ao declaradas duas ou mais vari aveis simultaneamente. Os exemplos apresentados no Quadro 1 ilustram a declara c ao de vari aveis utilizando os tipos b asicos apresentados anteriormente. var i : inteiro # 1o : declarando uma unica vari avel inteira i (sem inicializa c~ ao) o i0 # 2 : inicializando a vari avel inteira i com zero # alternativamente podemos combinar as duas opera c~ oes acima. Veja: var i : inteiro 0 var var var var x, y : real # declarando duas vari aveis reais x e y achou : booleano falso # declarando e inicializando uma vari avel l ogica achou nome : texto Portugol # declarando e inicializando uma cadeia de caracteres c : caractere nome[1] # declarando e inicializando uma vari avel caractere com o

var vet : arranjo de 10 real # declarando e fazendo uso de arranjos var j : inteiro tam vet 1 # j e inicializado com o ndice da ultima posi c~ ao de vet var z : real vet[i] # z e inicializado com o valor do ultimo elemento de vet # Arranjo unidimensional de 10 inteiros var V et : arranjo de 10 inteiro # Arranjo bidimensional de caracteres com 25 linhas e 10 colunas (ordem linha-coluna ) var M at : arranjo de 25 10 caractere # arranjo unidimensional de cadeia de caracteres com 2 posi c~ oes, j a inicializadas var MOpcoes : arranjo de 2 texto [Inserir, Sair ]
Quadro 1: Declara c ao de vari aveis do tipo primitivo ou b asico do Portugol.

2.3

Constantes

Constantes s ao vari aveis que s ao declaradas e inicializadas simultaneamente, cujo valor n ao pode mais ser modicado. Veja exemplos deste tipo de declara c ao a seguir, no Quadro 2. E importante ressaltar que, na deni c ao de valores constantes, n ao e usado o operador de atribui c ao (como ocorre na atribui c ao de vari aveis), e sim o operador de deni c ao . Note, em vermelho na linha 5, uma deni c ao incorreta para uma constante, devido ` a falta da inicializa c ao. # Exemplos de defini c~ oes corretas de constantes. cte PI : real 4 arctan(1) # uma constante real P I cte E : real 2.718281828 # uma constante real E cte MSG : texto N ao encontrado # uma cadeia de caracteres constante M SG cte SIM : caractere Y # uma constante caractere SIM # Exemplo de defini c~ ao INCORRETA de constante. cte NAO : caractere # INCORRETO! faltou a inicializa c~ ao para a constante N AO
Quadro 2: Declara c ao de constantes do tipo primitivo ou b asico do Portugol.

1 2 3 4

2.4

Deni c ao de novos tipos b asicos

O tipo de uma vari avel especica que poss veis valores ela pode receber. Podemos, ent ao, denir novos tipos se especicarmos o conjunto de valores que uma vari avel pode receber. A deni c ao
P agina 3

Especica c ao do Portugol

v1.0, julho de 2009

de um tipo e realizada atrav es da palavra reservada tipo, seguida do nome do tipo a ser denido, do separador seguido de uma express ao de tipo. Ap os denido, um novo tipo pode ser usado de maneira similar aos tipos primitivos de Portugol. A express ao de tipo pode ser um conjunto de valores predenidos ou construtores de tipos. O Quadro 3 ilustra a constru c ao, declara c ao e uso de um novo tipo, bem como a deni c ao de novos tipos baseados em outros j a existentes. # Um exemplo de declara c~ ao de tipo. tipo naipe { ouro, paus, espada, copas } var carta: naipe # declarando a vari avel carta do tipo rec em definido naipe . . . carta ouro carta copas # inicializa c~ ao com um dos poss veis valores do tipo rec em definido # outra inicializa c~ ao similar

# Tipo arranjo unidimensional de booleanos com 8 posi c~ oes tipo Byte arranjo de 8 booleano # Tipo arranjo unidimensional de booleanos com um n umero indeterminado de posi c~ oes tipo VetorBit arranjo de booleano # Tipo arranjo unidimensional de inteiros com um n umero program avel de posi c~ oes tipo VetorR arranjo de N real
Quadro 3: Exemplo de uma deni c ao de tipo naipe e outros tipos baseados em arranjos.

P agina 4

Especica c ao do Portugol

v1.0, julho de 2009

Blocos, fun c oes e procedimentos

As unidades b asicas de organiza c ao do Portugol s ao o bloco principal (ponto inicial do programa, identicado pela palavra programa), fun c oes e procedimentos. O programa principal e o ponto de entrada de um programa, enquanto as fun c oes e procedimentos s ao unidades de modulariza c ao. A principal diferen ca entre m odulos denidos como procedimentos ou fun c oes e que na primeira categoria n ao h a retorno de valor, enquanto na segunda h a. O Quadro 4 apresenta exemplos dos tr es tipos de blocos. programa # declara c~ ao de vari aveis locais ao programa principal var nota1: real 1.5 var nota2: real 6.7 var nota3: real 8.9 var media: real # calcula a m edia ponderada do aluno e imprime media calculaMedia(nota1, nota2, nota3 ) imprime(Fulano Filho, media ) m # calcula a m edia ponderada de 3 valores reais, retornando o resultado, um real fun c ao calculaMedia(nota1: real; nota2: real; nota3: real): real var mediaP onderada: real mediaP onderada (4 nota1 + 5 nota2 + 6 nota3)/15 retorna mediaP onderada m # imprime o nome do aluno e sua m edia. Repare que n~ ao h a valor de retorno procedimento imprime(nome: texto; media: real) escreva ( A m edia de , nome, e , media) m
Quadro 4: Declara c ao de programa, fun co es e procedimentos.

1 2 3 4

5 6

7 8 9 10 11

12 13 14

3.1

Escopo e visibilidade

As vari aveis que s ao declaradas dentro de um bloco ou que s ao par ametros de uma fun c ao ou procedimento possuem escopo e visibilidade locais ao bloco onde tais vari aveis foram declaradas. Vari aveis globais devem ser declaradas fora de qualquer bloco, inclusive fora do programa principal, preferencialmente logo antes do programa principal.

3.2

Passagem de par ametro

Cada par ametro de fun c ao ou procedimento deve ter seu tipo identicado individualmente. Assim, n ao ser a aceit avel declara c ao conjunta de vari aveis, como por exemplo:

P agina 5

Especica c ao do Portugol

v1.0, julho de 2009

# declarando par^ ametros de maneira errada, ao declarar simult^ aneamente 3 vari aveis fun c ao calculaMedia(nota1, nota2, nota3: real): real . . . retorna mediaP onderada m

3.3

Passando arranjos por par ametro

A declara c ao de par ametro correspondente a um arranjo e feita sem indicar explicitamente seu tamanho. Para recuperar esta informa c ao, basta invocar o comando tam que retorna um valor inteiro correspondente ao tamanho do arranjo. O mesmo vale para arranjos de duas (matriz) ou mais dimens oes. No Quadro 6 s ao apresentados alguns exemplos de passagem de arranjos por par ametro para fun c oes. # imprime o tamanho, o primeiro e o ultimo elemento de um arranjo procedimento consultaVetor(V et: arranjo de inteiro) escreva ( O tamanho do arranjo e , tam V et) escreva ( A primeiro elemento do arranjo e , V et[0]) escreva ( A u ltimo elemento do arranjo e , V et[tam V et 1]) m # Exemplo de como passar uma matriz por par^ ametro # A fun c~ ao abaixo realiza a transposi c~ ao de uma matriz procedimento transpor(M arranjo de ref inteiro) var aux: inteiro # ajudar a troca de elementos var i, j : inteiro # controladores de la co para linha e coluna var nLin, nCol: inteiro # armazena, respectivamente, o n umero de linhas e colunas da matriz nLin tam M # recupera a primeira dimens~ ao do arranjo nCol tam M [0] # recupera a segunda dimens~ ao do arranjo para i 0 at e nLin 2 fa ca # la co para percorrer as linhas para j i + 1 at e nCol 1 fa ca # la co para percorrer as colunas aux M [i, j ] M [i, j ] M [j, 1] M [j, i] aux m m m
Quadro 5: Passando arranjos por par ametro para fun co es e procedimentos.

P agina 6

Especica c ao do Portugol

v1.0, julho de 2009

Operadores

Os operadores do Portugol, devido ` a sua exibilidade, podem ser denidos ` a medida que forem sendo necess arios. Os operadores matem aticos t em preced encia sobre os relacionais, que por sua vez t em maior preced encia sobre os operadores l ogicos. A seguir s ao apresentados os operadores mais b asicos do Portugol. As tabelas 1, 2 e 3 apresentam os operadores matem aticos, relacionais e l ogicos b asicos, respectivamente. Eles s ao listados em ordem de preced encia, do maior para o menor.
Tabela 1: Tabela de operadores matem aticos.

Operador menos un ario potencia c ao multiplica c ao divis ao m odulo adi c ao subtra c ao

o Representa ca ou representa c ao direta ou / % +

Exemplo a a; a a5 ou a a a/2; a a%2 aa+b aab a5 a a 5 ou a a 5

o Associa ca

Tabela 2: Tabela de operadores relacionais.

Operador compara c ao menor compara c ao menor-igual compara c ao maior compara c ao maior-igual compara c ao igual compara c ao diferente

o Representa ca < > = =

Exemplo a < 10 . . . a 10 . . . a > 10 . . . a 10 . . . a = 10 . . . a = 10 . . .

o Associa ca

Tabela 3: Tabela de operadores l ogicos.

Operador nega c ao E l ogico OU l ogico

o Representa ca n ao e ou

Exemplo n ao achou . . . a 10 e b 20 . . . a 10 ou b 20 . . .

o Associa ca

P agina 7

Especica c ao do Portugol

v1.0, julho de 2009

5
5.1

Estruturas de controle
Estruturas condicionais

As estruturas condicionais controlam o uxo de execu c ao de acordo com a avalia c ao de uma express ao. Existem v arios tipos de estruturas condicionais, que devem ser selecionados de acordo com o algoritmo. O Quadro 7 ilustra exemplos de uma estrutura condicional simples, uma composta e uma encadeada. se a > 10 ent ao # Exemplo de condicional simples x x + 20 m se a > 10 ent ao # Exemplo de condicional composta x x + 20 sen ao y yx m se a > 10 ent ao # Exemplo de condicional encadeada x x + 10 ... sen ao se a < 20 ent ao y y + 20 ... sen ao se a < 30 ent ao z z + 30 ... sen ao xy+z ... m
Quadro 6: Estruturas condicionais usando se.

A estrutura condicional se encadeada permite denir v arios blocos, onde apenas um ser a executado. Os testes s ao efetuados do primeiro ao u ltimo bloco. O bloco cujo teste se averiguar verdadeiro primeiro ser a executado, e os demais desprezados. Uma outra forma de realizar essa escolha de blocos e atrav es da estrutura de sele c ao m ultipla, ou caso. A diferen ca e que esta prev e uma compara c ao de igualdade entre uma vari avel e cada um dos casos denidos. Ela e, portanto, mais f acil de se ler nesses casos espec cos. Opcionalmente, pode-se denir uma u ltima op c ao que ser a executada, caso nenhuma igualdade seja validada. O Quadro 8 apresenta um exemplo desta estrutura de controle.

P agina 8

Especica c ao do Portugol

v1.0, julho de 2009

1 2 3 4 5 6 7

8 9 10 11

# Exemplo de sele c~ ao de m ultipla escolha caso tempo seja igual a nublado: # se tempo tem o valor nublado amanha chovendo ... igual a chovendo: # se tempo tem o valor chovendo amanha ensolarado sen ao # se nenhuma das op c~ oes forem satisfeitas... # ... entramos neste ultimo bloco, que e *opcional*! amanha chovendo ... m m
Quadro 7: Controlador de m ultiplas escolhas com a estrutura caso.

P agina 9

Especica c ao do Portugol

v1.0, julho de 2009

5.2

La cos

Os la cos s ao estruturas de controle que executam um bloco de comandos um certo n umero de vezes. O controle sobre a quantidade de vezes que o bloco e executado pode ser: de acordo com uma certa condi c ao testada no in cio do bloco (executa o bloco de 0 a `N vezes); de acordo com uma certa condi c ao testada no m do bloco (executa o bloco de 1 ` a N vezes); por um n umero pr e-determinado de vezes (executa o bloco de 0 ` a N vezes); ou para cada ocorr encia em um conjunto de entradas. 5.2.1 Para

Existem v arias formas de se denir um la co atrav es da estrutura para. O mais comum possui um n umero de execu c oes pr e-determinado, denido numericamente. Este tipo de controle de la co e ideal, por exemplo, quando se deseja acessar vari aveis indexadas, como arranjos e textos. Neste caso, o ndice utilizado para controlar a itera c ao do la co pode ser usado como indexador do arranjo (usado, por exemplo, para implementar um vetor ou matriz). Outra forma de utilizar a estrutura para e percorrer os elementos de um conjunto (arranjos ou tipos abstratos de dados, a serem explicados mais a frente; por hora, considere um conjunto como um elemento matem atico abstrato). De fato, quando se deseja percorrer elementos em um conjunto, o la co para e a melhor op ca o por manter um bom n vel de abstra c ao (n ao interessa saber, no momento, como cada um dos elementos do conjunto e acessado). Neste caso, a forma de utiliz a-lo e, entretanto, ligeiramente diferente. Utiliza-se a express ao para todo seguida de uma vari avel que assumir a o valor de um elemento do conjunto a cada itera c ao do la co e a express ao de pertin encia a um conjunto. O Quadro 9 apresenta v arios exemplos de uso desse tipo de la co. 5.2.2 Repita-At e

Outro tipo comum de la co realiza o teste de parada ao nal de cada itera c ao do bloco. O comando repita-at e e a estrutura de controle com esta caracter stica. Nessa estrutura, o la co termina quando a express ao no nal do bloco se torna verdadeira. O uso dessa estrutura e recomendado quando se deseja que o bloco seja executado pelo menos uma vez. O Quadro 10 prov e um exemplo desta estrutura de controle. 5.2.3 Enquanto

Outra estrutura de controle de la co bastante comum e o enquanto, que realiza o teste de continuidade do la co antes de cada itera c ao do bloco. Nessa estrutura, o la co termina quando a condi c ao especicada no in cio do bloco passa a ser falsa. Diferentemente da estrutura repitaat e, o uso dessa estrutura e recomendado quando o bloco pode n ao ser executado. Ou seja, se a express ao condicional no in cio do bloco for falsa, n ao haver a itera c ao alguma e a sequ encia de instru c oes passa para o comando ap os o bloco. O Quadro 11 fornece alguns exemplos de la co enquanto.

P agina 10

Especica c ao do Portugol

v1.0, julho de 2009

s0 para i de 1 at e 100 fa ca se i%2 = 0 ent ao s 1/i sen ao s (1/i) m m escreva ( O resultado da s erie e:, s )

# a cada itera c~ ao, i assume o valor de 1 a 100

# ainda pode ir de tr as pra frente, alterando-se o passo. para j de 10 at e 1 com passo 1 fa ca # j vai decrementando de 10 a 1 escreva (Mensagem #, j , impressa!) m # acessando elementos de um vetor produtoInterno 0 para k 0 at e 2 fa ca produtoInterno produtoInterno + (V et1[k ] V et2[k ]) m para todo i S1 fa ca remova i de S1 insira i no conjunto S2 m # a cada itera c~ ao, i assume um elemento do conjunto S

Quadro 8: Exemplos diversos de la co para.

# exemplo de uso do la co repita-at e var xmin : real 100 var xmax : real 100 var xmed : real var raiz : real repita # o la co s o termina quando a raiz de f () for encontrada xmed (xmin + xmax )/2 raiz f (xmed ) se raiz < 0 ent ao xmin xmed sen ao xmax xmed m at e raiz = 0
Quadro 9: Exemplo de la co repita-at e.

P agina 11

Especica c ao do Portugol

v1.0, julho de 2009

var achou: booleano falso var tentativas: inteiro 0 enquanto n ao achou fa ca varrerEmBusca(valor) se valor = P ROCU RADO ent ao x x2 achou verdadeiro sen ao tentativas tentativas + 1 m m
Quadro 10: Exemplo do la co enquanto.

P agina 12

Especica c ao do Portugol

v1.0, julho de 2009

6
6.1

Tipos avan cados


Tipos refer encia

Uma referencia2 e um tipo que cont em o endere co (da o nome, refer encia) de uma vari avel de um tipo qualquer. A declara c ao de vari aveis do tipo referencia e realizada atrav es do operador ref seguido do tipo da vari avel que ser a referenciada. Al em do operador ref, usado na declara c ao da vari avel, h a dois outros operadores associados as refer ` encias. O primeiro e o operador de endere co (end) que, quando aplicado a uma vari avel, retorna o endere co (refer encia) onde o valor desta vari avel est a sendo armazenado na mem oria. O segundo operador e chamado o operador de desrefer encia, que age no sentido inverso ao primeiro operador. Ou seja, ele tem o papel de consultar o conte udo de uma vari avel atrav es de sua refer encia. Para acessar o conte udo, usamos o operador de acesso [ ]. Por m, existe tamb em uma palavra reservada para representar o valor de uma refer encia vazia (que n ao est a endere cando vari avel alguma), tamb em chamada de refer encia (ou ponteiro) nulo ou representado pelo s mbolo . O Quadro 12 ilustra o uso desses operadores. # Exemplo de uso do operador de endere co e de desrefer^ encia (acesso ao conte udo) var cnt : inteiro 10 # Declara c~ ao de uma vari avel regular var ref Int : ref inteiro # ref Int e uma refer^ encia para uma vari avel do tipo inteiro ref Int end x # ref Int aponta para o endere co de x escreva (@{ref Int}) # imprime o conte udo de ref Int, que e 10 # Exemplo de uso da refer^ encia nula var ref V al : ref inteiro nulo # declara c~ ao de refer^ encia com inicializa c~ ao var ptHead : ref inteiro # declara c~ ao de refer^ encia com inicializa c~ ao alternativa
Quadro 11: Exemplo de uso do tipo refer encia.

Uso de refer encia na passagem de par ametros de uma fun c ao A passagem de par ametro em uma fun c ao ou procedimento apresentada na Se c ao 3.2 e realizada, por default, por valor. Isso signica que, quando uma vari avel e passada, seu valor e copiado a uma vari avel local da fun c ao e, se modicada, o valor da vari avel original n ao e alterado. Esse comportamento pode ser mudado se o par ametro da fun c ao for uma refer encia para a vari avel. Passagem de par ametros por refer encia deve ser indicada com a palavra reservada ref, precedendo o identicador da vari avel, conforme exemplicado no Quadro 13.

6.2

Estruturas ou registros

Estruturas os registros s ao tipos heterog eneos de dados. Eles denem um tipo de dado como sendo a composi c ao de v arios tipos, sejam eles b asicos, composi c oes homog eneas (arranjos e textos) ou mesmo outros tipos heterog eneos. Usamos a palavra reservada estrutura para especicar a composi c ao do tipo. O Quadro 14 oferece alguns exemplos de declara c ao de estruturas e sua posterior instancia c ao. Nesse exemplo, declaramos a estrutura como um novo tipo, chamado de Aluno.
2

Tamb em conhecido como ponteiro ou apontador, pois aponta para um endere co de mem oria.

P agina 13

Especica c ao do Portugol

v1.0, julho de 2009

# calcula a m edia ponderada de 3 valores reais, retornando o resultado, um real procedimento troca(val1: ref inteiro; val2: ref inteiro) var aux: inteiro aux @{val1} @{val1} @{val2} @{val2} aux m programa # programa principal var a: inteiro 3 # inicializa a com 3 var b: inteiro 5 # inicializa b com 5 troca(a, b) # troca os valores de a e b, passando-os por referencia a troca escreva (a) # imprime 5 escreva (b) # imprime 3 m
Quadro 12: Exemplo de passagem de par ametros por refer encia para fun co es.

# declara c~ ao de estrutura Aluno, utilizada em lista encadeada tipo Aluno estrutura mat: inteiro # matr cula do estudante nome: texto # cadeia de caracteres para o nome do estudante IRA: real # ndice de rendimento acad^ emico notas : arranjo de 4 real # quatro notas da disciplina prox: ref Aluno # refer^ encia para pr oximo n o da lista m # uma vari avel de tipo Aluno var estudante : Aluno # inicializa c~ ao dos campos da estrutura estudante.mat 2008123456 estudante.nome Z e Ningu em estudante.IRA 9.2 estudante.notas [ 8.7; 7.7; 9.1; 8.2 ] estudante.prox nulo
Quadro 13: Declara c ao de tipo heterog eneo (estrutura), sua instancia c ao e utiliza c ao.

P agina 14

Especica c ao do Portugol

v1.0, julho de 2009

# Um exemplo de declara c~ ao de tipo. tipo Racional estrutura num : inteiro den : inteiro m cte RacZero : Racional [0, 1]

# numerador # denominador # uma constante do tipo Racional

# Uso de uma express~ ao de tipo direta ou an^ onima na defini c~ ao de constante. cte RacZero : estrutura num : inteiro # numerador den : inteiro # denominador m [0, 1]
Quadro 14: Exemplos de inicializa c ao de um tipo estrutura.

6.3

Tuplas

Tipos tuplas s ao tipos compostos heterog eneos (como os tipos registros). Por em, ao inv es de selecionar os componentes pelo nome, a sele c ao e realizada por posi c ao, como em um arranjo. Tipos tuplas tamb em podem ser interpretados como o equivalente computacional do produto cartesiano da matem atica. Cada componente de uma tupla pode ser acessado em leitura ou em escrita individualmente. O Quadro 16 ilustra seu uso. # declara c~ ao do tipo tupla NotasParc tipo NotasParc tupla real, real, real # uma vari avel de tipo NotasParc, com inicializa c~ ao var notasEst : NotasParc 0.0, 0.0, 0.0 notasEst.1 8.4 # Escrita da 1a componente da tupla notasEst

# Eis uma instru c~ ao com leitura e escrita dos componentes de uma tupla notasEst.3 (notasEst.1 + notasEst.2)/2
Quadro 15: Declara c ao de tipo heterog eneo (tupla), e de uma vari avel desse tipo com inicializa c ao.

6.4

Tipos fun c ao ou funcionais

Mesmo linguagens imperativas permitem ter vari aveis e par ametros com tipos funcionais3 . Em Portugol, podemos tamb em lan car m ao desse recurso para denir, por exemplo, um algoritmo de ordena c ao que tem como par ametro uma fun c ao de compara c ao dos valores a serem ordenados. Vale salientar que as fun c oes atribu das ` as vari aveis do tipo fun c ao devem corresponder ` as assinaturas do tipo. Ou seja, o n umero de par ametros e seus tipos, bem como o tipo de retorno devem ser iguais. Caso contr ario, a atribui c ao e inv alida. Observe o Quadro 17 que cont em exemplos de declara c ao e uso de tipos funcionais.

Um exemplo cl assico e a fun ca o qsort fornecida pela biblioteca padr ao de C.


P agina 15

Especica c ao do Portugol

v1.0, julho de 2009

# Defini c~ ao de fun c~ oes regulares, todas com a mesma assinatura. fun c ao compara1aAval(alunoA: NotasParc; alunoB : NotasParc): booleano retorna alunoB .1 > alunoA.1 m fun c ao compara2aAval(alunoA: NotasParc; alunoB : NotasParc): booleano retorna alunoB .2 > alunoA.2 m fun c ao compara3aAval(alunoA: NotasParc; alunoB : NotasParc): booleano retorna alunoB .3 > alunoA.3 m # declara c~ ao e uso do tipo fun c~ ao CompareNotas tipo ComparadorDeNotas fun c ao (NotasParc, NotasParc) booleano; var comparador : ComparadorDeNotas compara1aAval
Quadro 16: Declara c ao de 3 fun co es com a mesma assinatura (par ametros e retorno), seguida da declara c ao de um tipo fun c ao com a mesma assinatura. Assim vari aveis do tipo fun c ao podem assumir o valor de qualquer uma das 3 fun co es denidas anteriormente.

P agina 16

Especica c ao do Portugol

v1.0, julho de 2009

Tipo abstratos de dados (TAD)

Tipo abstrato de dados (TAD) e a representa c ao do modelo matem atico que envolve a deni c ao de uma estrutura heterog enea juntamente com suas opera c oes de manipula c ao. Os campos da estrutura s ao encapsulados, ou seja, somente ser ao acess veis via opera c oes de manipula c ao denidas pelas opera c oes da TAD. O Quadro 18 apresenta a deni c ao de uma TAD correspondente a uma pilha de inteiros. Alternativamente, e poss vel denir uma TAD separando-se a interface de sua implementa c ao. Esta e uma pr atica comum em linguagens de programa c ao por permitir uma melhor organiza c ao do c odigo. Assim, passamos a ter tr es elementos separados4 : a interface da TAD, a implementa c ao da TAD e o uso da TAD pelo c odigo cliente. O Quadro 19 apresenta a mesma TAD PilhaInt denida anteriormente, por em com a separa c ao entre interface e implementa c ao, acrescida do c odigo cliente. Vale a pena ressaltar que a forma de uso pelo cliente de uma TAD declarada desta forma permanece a mesma, ou seja, o mesmo c odigo cliente do Quadro 18 poderia ser utilizado.

4 Normalmente estes elementos, quando traduzidos para uma linguagem de programa ca o, s ao armazenados em arquivos separados.

P agina 17

Especica c ao do Portugol

v1.0, julho de 2009

# declara c~ ao de uma TAD correspondente a uma pilha de inteiros tad PilhaInt cte SIZE : inteiro 50 # tamanho m aximo da pilha var top: inteiro # controlador do topo da pilha var storage: arranjo de SIZE inteiro # area de armazenamento # construtor e chamado automaticamente quando uma inst^ ancia e criada. construtor () top 0 m fun c ao push(val: inteiro): booleano se top < SIZE ent ao storage[top] val top top + 1 retorna verdadeiro sen ao retorna falso m m fun c ao pop(val: ref inteiro): booleano se top > 0 ent ao top top 1 [val] storage[top] retorna verdadeiro m retorna falso m m # aqui come ca o c odigo cliente (em azul) que usa o TAD rec em criado. programa var c : inteiro var pilha: PilhaInt # insere elementos da pilha, nestas ordem: 5,8,2,1 pilha.pop(5) pilha.pop(8) pilha.pop(2) pilha.pop(1) # escreve os elementos da pilha, na ordem inversa que foram inseridos: 1,2,8,5 para i de 0 at e pilha.SIZE 1 fa ca pilha.pop(c) escreva (c) m m
Quadro 17: Declara c ao de tipo TAD, sua instancia c ao e utiliza c ao.

P agina 18

Especica c ao do Portugol

v1.0, julho de 2009

# 1o parte: declara c~ ao da interface da TAD correspondente a uma pilha de inteiros tad PilhaInt cte SIZE : inteiro 50 # tamanho m aximo da pilha var top: inteiro # controlador do topo da pilha var storage: arranjo de SIZE inteiro # area de armazenamento # apenas declarando o construtor. construtor fun c ao ( ) # similarmente, declaramos apena a assinatura dos m etodos push e pop. push fun c ao (inteiro) booleano pop fun c ao (ref inteiro) booleano # e poss vel misturar os dois estilos de declara c~ ao, sem problemas. fun c ao isEmpty( ): booleano retorna top = 0 m m # 2o parte: implementa c~ ao da TAD pilha de inteiros. # Note o uso do operador . associado ao nome da TAD para indicar que a fun c~ ao # push faz parte da TAD PilhaInt e, portanto, tem acesso aos seus campos internos. fun c ao PilhaInt.push(val: inteiro): booleano se top < SIZE ent ao storage[top] val top top + 1 retorna verdadeiro sen ao retorna falso m m # a ordem de implementa c~ ao n~ ao precisa seguir a de declara c~ ao. PilhaInt. construtor () top 0 m fun c ao PilhaInt.pop(val: ref inteiro): booleano se top > 0 ent ao top top 1 [val] storage[top] retorna verdadeiro m retorna falso m # 3o parte: uso da TAD pilha de inteiros. programa # assumindo que uma pilha foi criada e preenchida e a vari avel c declarada. . . . enquanto n ao pilha.isEmpty() fa ca # escreve os elementos da pilha. pilha.pop(c) escreva (c) m m
Quadro 18: Declara c ao de tipo TAD, com interface separada da implementa c ao e do c odigo cliente.
P agina 19

Especica c ao do Portugol

v1.0, julho de 2009

Exemplos

Nesta se c ao apresentaremos alguns exemplos de algoritmos completos, ilustrando o m aximo poss vel de estruturas de controle atrav es de exemplos apresentados na disciplina de Algoritmos e Estruturas de Dados I. Os exemplos aqui exibidos possuem uma diferen ca sutil para os exemplos apresentados em se c oes anteriores. Utilizando-se de uma caracter stica de congura c ao do pacote algorithm2e, e poss vel substituir a palavra m que marca o m de um bloco de comandos por uma linha simples. Com isso, obt em-se um c odigo mais compacto, ideal, por exemplo, para slides de aula.

8.1

Algoritmo de ordena c ao por utua c ao

O exemplo apresentado no Quadro 20 consiste na implementa c ao do algoritmo de ordena c ao por utua c ao, conhecido tamb em como bubble sort. Os valores a serem dispostos e ordem n ao decrescente s ao n umeros inteiros, armazenados em uma lista encadeada simples.

P agina 20

Especica c ao do Portugol

v1.0, julho de 2009

1 2 3 4

# Estrutura de n o de uma lista encadeada simples. tipo NoSLista estrutura data: inteiro # campo para armazenamento do n umero inteiro link : ref NoSLista # apontador para o pr oximo elemento da lista m Entrada: Lista L com elementos em uma ordem qualquer Sa da: Lista L com elementos em ordem n ao decrescente fun c ao bubbleSort(L: ref NoSLista): ref NoSLista var p0, p1, p2: ref NoSLista # Ponteiros usado para realizar as trocas var swapped : booleano falso # flag p/ indicar ocorr^ encia de troca se L = ent ao retorna L sen ao se @{L}.prox = ent ao retorna L sen ao # 1: lista vazia, nada a fazer # retornar lista original # 2: lista com 1 elemento, nada a fazer # retornar lista original

5 6 7 8 9 10 11 12

13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

# 3: demais casos - lista com 2 ou mais elementos repita # percorrer novamente se houve alguma troca p2 L # ponteiro de trabalho: inicia no 1o da lista p0 p1 # apontadores auxiliares: iniciam fora da lista swapped falso # desligar flag indicativo de troca repita # repetir at e final da lista p0 p1 # avan car o anterior do anterior do ponteiro de trabalho p1 p2 # avan car o anterior do ponteiro de trabalho p2 @{p2}.prox # avan car o ponteiro de trabalho se @{p1}.data > @{p2}.data ent ao # testar se e preciso trocar se p0 = ent ao L p2 # caso especial: trocando 1o com 2o sen ao @{p0}.pro p2 # caso normal: bypass o maior do par

@{p1}.prox @{p2}.prox # bypass o menor, 2a fase da troca @{p2}.prox p1 # fim: menor aponta p/ maior, concluindo troca swapped verdadeiro # indicar que houve uma troca p1 p2 # consertar ponteiros trabalho ap os troca: p0,p2,p1 p2 @{p2}.prox # ordem restabelecida: p0,p1,p2 at e @{p2}.prox = at e n ao swapped retorna L m # retornar a lista em ordem n~ ao decrescente

Quadro 19: Exemplo de algoritmo que realiza a ordena c ao por utua c ao (bubble sort ) sobre uma lista encadeada simples. Os elementos a serem ordenados s ao inteiros e ser ao dispostos em ordem n ao decrescente pelo algoritmo.

P agina 21

Especica c ao do Portugol

v1.0, julho de 2009

8.2

Algoritmo identicar caminho raiz-para-folha de uma arvore tern aria

Denimos um caminho raiz-para-folha como sendo a seq u encia de n os de uma arvore considerados a partir do n o raiz at e uma das folhas da arvore. Assume-se que uma arvore vazia n ao cont em nenhum caminho raiz-para-folha. Portanto, para a arvore tern aria abaixo, existem exatamente seis caminhos raiz-para-folha:
5 / | \ 4 7 8 / | / | \ 11 13 4 6 21 / \ \ / 7 2 1 3

Os caminhos raiz-para-folha s ao:


caminho caminho caminho caminho caminho caminho 1: 2: 3: 4: 5: 6: 5 5 5 5 5 5 4 4 7 8 8 8 11 7 11 2 13 4 1 6 21 3

Forne ca a estrutura correspondente ao n o de uma arvore tern aria e escreva a fun c ao imprimeCaminhos() que, dado uma arvore tern aria, imprime todos seus caminhos raiz-para-folha, um por linha. O Quadro 21 apresenta uma solu c ao para este problema.

P agina 22

Especica c ao do Portugol

v1.0, julho de 2009

1 2 3 4 5 6 7

# Estrutura de n o de uma arvore tern aria. tipo NoAT estrutura dado : inteiro # tipo de dado armazenado no n o de arvore lef t : ref NoAT # apontador para sub arvore esquerda middle : ref NoAT # apontador para sub arvore do meio right : ref NoAT # apontador para sub arvore direita m # novo tipo arranjo tipo VetPath arranjo de M AX IN T inteiro Entrada: Arvore tern aria de inteiros Sa da: Impress ao de todos os caminhos internos da arvore tern aria procedimento imprimeCaminhos(root: ref NoAT) var path : VetPath ; # armazena o caminho # par^ ametros: raiz, o caminho, seu tamanho atual e o ident. de caminhos gerados imprimeCaminhosRec( root, path, 1, 1 ) m # importante: path e passado por valor procedimento imprimeCaminhosRec( root: ref NoAT; path: VetPath; pathLen: inteiro; pathId: inteiro) se root = ent ao # caso base, nada a fazer retorna path[ pathLen ] @{root}.data; # adicionar este n o ao caminho pathLen pathLen + 1; # aumentar o tamanho do caminho se @{root}.lef t = e @{root}.right = ent ao # e folha... exibeCaminho(path, pathLen, pathId); # ... imprimimos caminho at e aqui pathId pathId + 1; # incrementamos o contador de caminhos gerados sen ao # caso contr ario, descer recursivamente pelas sub arvores imprimeCaminhosRec(@{root}.lef t, path, pathLen); # esquerda, ... imprimeCaminhosRec(@{root}.middle, path, pathLen); # do meio e ... imprimeCaminhosRec(@{root}.right, path, pathLen); # direita. m procedimento exibeCaminho(path: VetPath; pathLen: inteiro; pathId: inteiro) var i: inteiro escreva ( Caminho , pathId , : ) para i 1 at e pathLen fa ca # percorrer o vetor e imprimir escreva ( path[ i ], ); # imprime caminho separado por espa co escreva ( \n ); m # salta uma linha

8 9

10 11

12

13 14 15 16 17 18 19 20

21 22 23 24 25 26 27 28 29 30 31

Quadro 20: Algoritmo que identica os caminhos para raiz de uma arvore tern aria.

P agina 23

Оценить