Você está na página 1de 24

Apostila de COM146 Algoritmos e Estruturas de Dados I

Disciplina do 1o mdulo do Curso de Cincia da Computao da Universidade Federal de Lavras

Olinda Nogueira Paes Cardoso1

Agosto de 2002

Professora Auxiliar do Departamento de Cincia da Computao da UFLA

NDICE

1.

Introduo ......................................................................................................................................... 2 Necessidade do uso da lgica ...................................................................................................... 2 Conceitos Bsicos......................................................................................................................... 2 Conceito de Algoritmo................................................................................................................... 2 2. PORTUGOL...................................................................................................................................... 3 2.1. Definio de Variveis Tipos Bsicos........................................................................................ 3 2.2. Comandos Bsicos ....................................................................................................................... 4 2.3. Blocos e Comandos Bsicos de Controle..................................................................................... 4 2.4. Outras estruturas de repetio...................................................................................................... 7 2.5. Definio de novos tipos de dados ............................................................................................... 8 2.6. Estruturas Condicionais Encadeadas ........................................................................................... 8 3. Ordenao ........................................................................................................................................ 9 3.1. Ordenao de Vetores .................................................................................................................. 9 3.1.1. Ordenao por insero ........................................................................................................ 9 3.1.2. Ordenao por seleo........................................................................................................ 10 4. Matrizes .......................................................................................................................................... 11 4.1. Matrizes Bidimensionais ............................................................................................................. 11 5. Registros......................................................................................................................................... 12 5.1. Registro com Vetor ..................................................................................................................... 12 5.2. Conjuntos de Registros............................................................................................................... 13 6. Arquivos .......................................................................................................................................... 13 6.1. Organizao de Arquivos............................................................................................................ 14 6.1.1. Organizao Seqencial...................................................................................................... 14 6.2. Organizao Direta ..................................................................................................................... 15 7. Modularizao ................................................................................................................................ 17 7.1. Benefcios da modularizao ...................................................................................................... 18 7.2. Ferramentas para modularizao ............................................................................................... 18 7.3. Modos de transferncia de parmetros ...................................................................................... 19 8. Recursividade ................................................................................................................................. 19 8.1. Exemplo de problema recursivo ................................................................................................. 20 8.2. Recurso Iterao.................................................................................................................... 20 8.3. Exemplos mais famosos de problemas recursivos..................................................................... 20 9. Apontadores ................................................................................................................................... 21 10. Listas Lineares................................................................................................................................ 22 10.1. Operaes em listas lineares .................................................................................................. 22 10.2. Implementao de listas lineares ............................................................................................ 23 1.1. 1.2. 1.3.

1. INTRODUO
1.1. NECESSIDADE DO USO DA LGICA

A lgica a cincia que estuda as leis e os critrios de validade que regem o pensamento e a demonstrao, ou seja, cincia dos princpios formais do raciocnio. A lgica usada no dia a dia das pessoas que trabalham com computao para solucionar problemas de forma eficiente. A tcnica mais importante no projeto da lgica de programas chamada programao estruturada, a qual consiste em uma metodologia de projeto que objetiva: agilizar a codificao da escrita da programao; facilitar a depurao da leitura da mesma; permitir a verificao de possveis falhas apresentadas pelos programas; facilitar as alteraes e atualizaes dos programas. 1.2. CONCEITOS BSICOS

O conceito central da programao em cincia da computao o de algoritmo. Segundo Wirth a programao estruturada a arte ou tcnica de construir e formular algoritmos de uma forma sistemtica. Programas so formulaes concretas de algoritmos abstratos, baseados em representaes e estruturas especficas de dados. Estruturas de dados so usadas no algoritmo para representar as informaes do problema a ser resolvido. Na programao deve-se distinguir claramente dois aspectos: Aspecto esttico a formulao de um algoritmo consiste em um texto contendo comandos (instrues) que devem ser executados numa ordem prescrita. Aspecto dinmico os efeitos que so causados pela execuo do programa no tempo, dado um conjunto de valores iniciais. 1.3. CONCEITO DE ALGORITMO

Um algoritmo uma norma executvel para estabelecer um certo efeito desejado, que na prtica ser geralmente a obteno de uma soluo a um certo tipo de problema. Exemplo de algoritmo para trocar uma lmpada queimada: pegar uma lmpada nova no armrio; pegar a escada na rea de servio; subir na escada com a lmpada nova na mo; retirar a lmpada queimada; colocar a lmpada nova; descer a escada; testar se a lmpada nova est funcionando O smbolo de seqenciamento (;) tem duas funes: no texto a de separar um comando do outro; e no evento a de indicar que os comandos separados devem ser executados na mesma seqncia em que aparecem no texto. O smbolo ; representa a mais simples estrutura de controle, a seqncia simples. Exerccio: escreva um algoritmo para se trocar um pneu furado. Assuma que esto disponveis um macaco e um estepe em boas condies. Seguindo com o exemplo da troca de lmpadas, vamos supor que h a possibilidade de que a escada disponvel no seja alta suficiente para alcanar a lmpada e que, neste caso, gostaramos prever este possvel erro. Poderamos reescrever o algoritmo desta forma: pegar uma lmpada nova no armrio; pegar a escada na rea de servio; subir na escada com a lmpada nova na mo;

3 se for possvel alcanar a lmpada a ser trocada ento retirar a lmpada queimada; colocar a lmpada nova; descer da escada; guardar a escada; Outro caso: supondo que havia vrias lmpadas para serem trocadas na casa. Poderamos reescrever o algoritmo desta forma: pegar todas as lmpadas novas no armrio; pegar a escada na rea de servio; enquanto existirem lmpadas novas disponveis faa subir na escada com uma lmpada nova na mo; se for possvel alcanar a lmpada a ser trocada ento retirar a lmpada queimada; colocar a lmpada nova; descer da escada; guardar a escada;

2. PORTUGOL
A partir de agora ser introduzida uma linguagem de expresso de algoritmos, o PORTUGOL. Sero apresentadas a sintaxe e a semntica dos comandos da linguagem. PORTUGOL uma pseudolinguagem de programao utilizada para obter uma notao para algoritmos, a ser usada na definio, na criao, no desenvolvimento e na documentao de um programa. O objetivo no criar mais uma linguagem de programao, por isso as regras no precisam ser seguidas de forma muito rgida. Considerando o PORTUGOL, a sintaxe definida e a forma apresentada e aceita como padro. Para cada declarao e/ou comando a semntica deve ser explicada. O identificador o elemento bsico da linguagem, a sua sintaxe definida pelo diagrama apresentado na Figura 1: letra letra dgito Figura 1: Diagrama que representa um identificador 2.1. DEFINIO DE VARIVEIS TIPOS BSICOS

No PORTUGOL existem quatro tipos bsicos, isto , tipos bsicos de dados que podem ser utilizados: INTEIRO, REAL, CARACTER e LGICO. Uma varivel pode ser entendida como um local onde se pode colocar qualquer valor do conjunto de valores possveis do tipo bsico associado. O nome da varivel o identificador tal como definido anteriormente. Por exemplo: SOMA Varivel SOMA Toda varivel deve ser declarada conforme a sintaxe apresentada na Figura 2. A semntica de uma declarao de variveis corresponde criao de locais na memria, rotulada com o nome do identificador (varivel) e marcada com o tipo de valores que ela pode conter.

, inteiro real caracter lgico Figura 2: Diagrama que representa a definio de uma varivel. 2.2. COMANDOS BSICOS : identificador

O comando de ATRIBUIO utilizado para atribuir um valor a uma varivel. Para isso usase o smbolo , conforme a seguinte sintaxe: identificador expresso

A notao usada para expresses basicamente uma forma linear comumente usada na matemtica, que pode conter operadores: ARITMTICOS: +, -, /, *, raiz( ), **, sen( ), cos( ), mod, div,... LGICOS: e, ou, no ( , V, ) RELACIONAIS: =, , >, (ou >=), <, (ou <=) importante observar que o resultado da expresso (do lado direito do comando de atribuio) deve ser coerente com o tipo declarado para a varivel (do lado esquerdo). 2.3. BLOCOS E COMANDOS BSICOS DE CONTROLE

Um bloco pode ser definido como um conjunto de comandos com uma funo bem definida. Serve tambm para definir os limites onde as variveis declaradas em seu interior so conhecidas. Exemplo: incio < declarao de variveis > < comandos > fim Uma seqncia simples um conjunto de comandos separados por ponto e vrgula (;), que sero executadas numa seqncia linear de cima para baixo. Exemplo: comando1; comando2; comando3; ... comandoN; Quando a ao a ser executada depender de uma inspeo (teste), teremos uma alternativa, ou estrutura condicional, simples ou composta.

5 Exemplo de uma estrutura condicional simples: se < condio > ento comando1; comando2; ... comandoN; fim se; Exemplo de uma estrutura condicional composta: se < condio > ento comando1; comando2; ... comandoN; seno comando1; comando2; ... comandoN; fim se; Nos comandos apresentados, < condio > qualquer expresso cujo resultado seja falso ou verdadeiro. Exerccio: Qual ser o valor final das variveis A e B depois da execuo do seguinte algoritmo? incio inteiro: A, B; A 1; B 2; se A > B ento A 5; seno A 10; fim se; fim; Uma estrutura de repetio quando um conjunto de aes executado repetidamente enquanto uma determinada condio permanece vlida (ou seja, quando o resultado de da expresso um valor lgico verdadeiro). Exemplo de uma estrutura de repetio: enquanto < condio > faa comando1; comando2; ... comandoN; fim enquanto; Enquanto o valor da < condio > for verdadeiro, as aes dos comandos so executadas e quando se tornar falso, o comando abandonado. Se j da primeira vez o resultado falso, os comandos no so executados.

6 Exerccio: Qual ser o valor final das variveis declaradas no seguinte algoritmo, depois de sua execuo? incio inteiro: A, B, C, I; A 1; B 1; I 1; enquanto I < 10 faa C A + B; A B; B C; I I + 1; fim enquanto; fim; At agora todos os valores calculados pelos algoritmos foram gerados e permaneceram na memria. Para obter ou para fornecer dados ao ambiente exterior ao algoritmo, por exemplo do teclado e para o vdeo, preciso utilizar comandos de entrada e sada. O comando de entrada leia e o comando de sada imprima, e suas sintaxes so apresentadas a seguir.

,
leia ( identificador )

,
imprima ( identificador expresso caracter )

Exemplo de um algoritmo que usa comandos de entrada e sada: incio inteiro: A, B, SOMA; leia (A, B); SOMA A + B; imprima (A soma entre , A, e , B, , SOMA); fim; Exerccio: Escreva o algoritmo que realize a multiplicao de dois nmeros inteiros, utilizando apenas o operador da soma (+). Regras prticas para a construo de algoritmos legveis: Procure incorporar comentrios no algoritmo para descrever o significado das variveis e aes utilizadas. Para isso use chaves {}. Escolha nomes de variveis que sejam significativos, isto , que traduzam o tipo de informao a ser armazenada na varivel. Por exemplo: NOTA, SOMA, MDIA, etc. Grife as palavras-chave (escritas com letras minsculas) do algoritmo, destacando as estruturas de controle. Procure alinhar os comandos de acordo com o nvel a que pertencem, isto , destaque a estrutura na qual esto contidos.

Exerccios de Fixao: Construa algoritmos para solucionar os seguintes problemas. 1. Como saber se um nmero divisvel por outro. 2. Calcular a mdia final de um aluno que realizou 4 avaliaes, sabendo que todas tm o mesmo peso. 3. Dados 3 nmeros, verificar qual deles o menor. 2.4. OUTRAS ESTRUTURAS DE REPETIO

Sero apresentadas a seguir outras duas estruturas de repetio que tambm podem ser utilizadas na construo de algoritmos usando o PORTUGOL, so elas: repita e para. A estrutura de repetio repita difere da enquanto no que diz respeito ao momento em que o teste da condio submetido. repita comando1; comando2; ... comandoN; at < condio >; Na estrutura enquanto o teste realizado antes da execuo do primeiro loop, ou seja, pode ser que os comandos no sejam realizados sequer uma vez, caso a condio seja falsa j na primeira vez em que foi testada. J na repita os comandos sempre sero executados pelo menos uma vez, at que a condio seja testada, no final da estrutura. A estrutura de repetio para difere das estruturas enquanto e repita, pois utiliza uma varivel de controle, que atua como um contador de repeties. para I de 1 at 10 passo 1 faa comando1; comando2; ... comandoN; fim para; Observando o exemplo, percebe-se que foi utilizada uma varivel do tipo inteiro (I), que deve ter sido declarada anteriormente. Esta estrutura ir executar os comandos 10 vezes, pois possui I variando automaticamente de 1 em 1 (passo 1) at 10, ou seja, no necessrio fazer o incremento deste dentro da estrutura de repetio. Exerccio: Avalie os algoritmos construdos at o presente momento e, quando achar vivel, substitua a estrutura de repetio enquanto pela estrutura repita ou para, a fim de melhorar o seu desempenho. O comando abandone s tem sentido dentro de um comando de repetio (enquanto, repita e para). Alm disso, estar sempre associado ao teste de uma condio com comando se. Sintaxe: abandone; A semntica do comando a seguinte: quando o abandone encontrado, o prximo comando a ser executado o primeiro logo aps o fim do comando de repetio mais interno onde este aparece. Exemplo: ... enquanto I > 0 faa I I + 1; imprima (I); 2 se I + 1 <= 150 ento I I + 25; seno abandone;

8 fim se; fim enquanto; 2.5. DEFINIO DE NOVOS TIPOS DE DADOS

Nem sempre os tipos bsicos (inteiro, real, caracter e lgico) so suficientes para exprimir estruturas de dados em algoritmos. Da a necessidade de novos tipos de dados serem criados. Um destes tipos o vetor. No PORTUGOL a criao de um vetor segue as especificaes: tipo nome_do_tipo = vetor [li:ls] <tipo_bsico>; dado um nome_do_tipo ao novo tipo de vetor criado, onde li o limite inferior e ls o limite superior de um intervalo que define o tamanho do vetor (valores inteiros), e tipo_bsico um dos tipos bsicos j conhecidos. Esta especificao apenas indica um modelo para a criao de variveis deste novo tipo. Para efetivar esta estrutura dentro do algoritmo, necessrio declar-la dando um nome a varivel que ser criada segundo o modelo especificado. Exemplo: um vetor que armazena as notas de todos os alunos de uma turma com 25 alunos. tipo v = vetor [1:25] real; v: NOTAS; O nmero de elementos de um vetor dado por ls-li+1. Isto significa que as posies do vetor so identificadas a partir de li, com incrementos unitrios at ls. li li+1 li+2 ls Cada elemento de um vetor tratado como se fosse uma varivel simples. Para referncia a um elemento do vetor utiliza-se o nome do vetor e a identificao do elemento (ndice) entre colchetes ([ ]). o Por exemplo, se quisermos atribuir o valor de uma 45 a nota do 6 aluno (que identificado pelo ndice 6 do vetor de notas): NOTAS [6] 45; Exemplo: O que ser impresso no algoritmo abaixo? incio inteiro: I; tipo vc = vetor [1:7] caracter; vc: DIAS; DIAS [1] domingo; DIAS [2] segunda-feira; DIAS [3] tera-feira; DIAS [4] quarta-feira; DIAS [5] quinta-feira; DIAS [6] sexta-feira; DIAS [7] sbado; para I de 1 at 7 passo 2 faa imprima (DIAS [I]); fim para; fim. Exerccio: Um professor de uma turma com 30 alunos quer armazenar as notas de seus alunos em um vetor e depois calcular a mdia geral da turma. Escreva um algoritmo que solucione este problema usando uma estrutura de vetor. 2.6. ESTRUTURAS CONDICIONAIS ENCADEADAS

Existem casos em que necessrio se estabelecerem verificaes de condies sucessivas, onde uma determinada ao poder ser executada se um conjunto anterior de condies for satisfeito. Isto significa usar uma condio dentro de outra. Este tipo de estrutura pode possuir diversos nveis de condio, sendo chamada de aninhamento ou encadeamento de estruturas condicionais. Exemplo: se <condio 1> ento <comandos para condio 1 verdadeira> seno se <condio 2> ento <comandos para a condio 1 falsa e 2 verdadeira> seno <comandos para a condio 1 e 2 falsas >

9 fim se; {final do se mais interno} fim se; {final do primeiro se (mais externo)} Exerccio: Escreva um algoritmo que efetue o clculo de reajuste de salrio de um funcionrio. Considere que o aumento ser de 15% se o salrio for at R$500,00, de 10% se for entre R$501,00 e R$1.000,00 e de 5% se for maior que R$1.000,00.

3. ORDENAO
A atividade de ordenao o processo de rearranjo de um certo conjunto de objetos de acordo com um critrio (ordem) especfico. O objetivo da ordenao facilitar a localizao dos membros de um conjunto de dados. 3.1. ORDENAO DE VETORES

A preocupao mais importante a ser estabelecida em relao aos mtodos de ordenao de vetores corresponde ao uso econmico da memria disponvel. Isto implica que a permutao de elementos, responsvel por levar o elemento ordem desejada, deve ser efetuada in situ, e que, portanto, so de menor interesse os mtodos que efetuam o transporte fsico dos elementos de um vetor A para um vetor resultante B. Restringindo-se a escolha dos mtodos, dentre as inmeras solues possveis, de acordo com o critrio de economia de memria, pode-se promover uma primeira classificao de acordo com a eficincia do mesmo em relao economia de tempo. Uma boa medida de eficincia obtida contando-se o nmero C de comparaes necessrias e o nmero M de movimentos (transposies) dos elementos. Estes nmeros so funes do nmero n de elementos a serem ordenados. Os mtodos de ordenao que ordenam os elementos in situ podem ser classificados em trs principais categorias: Ordenao por insero Ordenao por seleo Ordenao por troca Estes trs princpios sero examinados e comparados. Os exemplos operam sobre a varivel A, cujos componentes sero ordenados e se referem a um vetor de inteiros de tamanho varivel (N), definido como se segue: inteiro: N; tipo vet = vetor [1:N] inteiro; vet: A; 3.1.1. ORDENAO POR INSERO

Em cada passo, iniciando-se com i=2 e incrementando-se i de uma em uma unidade, o i-simo elemento da seqncia vai sendo comparado com os elementos anteriores e, se for o caso, retirado e inserido na posio apropriada. O processo de ordenao por insero ser mostrado em um exemplo, em que so ordenados oito nmeros (N=8) escolhidos aleatoriamente. O algoritmo deve fazer o seguinte: para I de 2 at N faa X A[I]; inserir X no local adequado em A[1]...A[I] fim para Valores iniciais i=2 i=3 i=4 i=5 i=6 44 44 12 12 12 12 55 55 44 42 42 18 12 12 55 44 44 42 42 42 42 55 55 44 94 94 94 94 94 55 18 18 18 18 18 94 06 06 06 06 06 06 67 67 67 67 67 67

10 i=7 i=8

06 12 18 42 44 55 94 67 06 12 18 42 44 55 67 94 Para encontrar o local apropriado do elemento observado conveniente utilizar, de modo alternado, operaes de comparao e de movimentao, examinando X, e comparando-o com o elemento A[J], e ento efetuando ou a insero de X ou a movimentao do elemento A[J], e prosseguindo-se para a esquerda no tratamento dos outros elementos. Para isso ser necessrio testar duas condies distintas que causam o trmino deste processo de anlise: Um elemento A[J] encontrado com um elemento de valor menor do que o seu A extremidade esquerda atingida um caso tpico de uma repetio com duas condies de trmino, que conduz a utilizao de um elemento sentinela (para armazenar temporariamente o valor de algum elemento que est sendo analisado). Para isso, ser utilizada uma posio do vetor A como sentinela, o A[0] que receber o valor de X. incio inteiro: I, J, N, X; tipo vet = vetor [0:N] inteiro; vet: A; {supondo que o vetor A tenha sido preenchido}... para I de 2 at N faa X A[I]; A[0] X; J I; enquanto X < A[J-1] faa A[J] A[J-1]; J J-1; fim enquanto; A[J] X; fim para; fim; 3.1.2. ORDENAO POR SELEO Este mtodo baseado no seguinte princpio: Selecionar o elemento que apresenta o menor valor Troc-lo com o primeiro elemento da seqncia A[1] Repetir estas operaes, envolvendo agora os N1 elementos restantes, depois os N2 elementos, ..., at restar um s elemento, o maior deles. Valores iniciais 44 06 06 06 06 06 06 06 55 55 12 12 12 12 12 12 12 12 55 18 18 18 18 18 42 42 42 42 42 42 42 42 94 94 94 94 94 44 44 44 18 18 18 55 55 55 55 55 06 44 44 44 44 94 94 67 67 67 67 67 67 67 67 94

incio inteiro: I, J, N, K; tipo vet = vetor [1:N] inteiro; vet: A; {supondo que o vetor A tenha sido preenchido}... para I de 1 at N1 faa K I; X A[I]; para J de I+1 at N faa se A[J] < X ento K J;

11 X A[K]; fim se; fim para; A[K] A[I]; A[I] X; fim para; fim;

4. MATRIZES
Uma matriz uma estrutura de dados homognea, ou seja, todos os elementos de uma matriz so do mesmo tipo. Um vetor uma matriz unidimensional, a partir de agora sero apresentadas matrizes com mais de uma dimenso. 4.1. MATRIZES BIDIMENSIONAIS

A forma mais comum de trabalhar com matrizes utilizando duas dimenses, apesar de que em alguns casos possa ser necessrio trabalhar com mais de duas. Uma matriz bidimensional composta por linhas e colunas. As linhas podem ser consideradas como a primeira dimenso e as colunas a segunda dimenso. preciso definir o tamanho de cada uma dessas dimenses, ou seja, o nmero de linhas e o nmero de colunas que esta matriz dever possuir. Exemplo: Definio de uma matriz com 8 linhas e 5 colunas. tipo mat = matriz [1..8, 1..5] inteiro; mat: TABELA; TABELA 1 2 3 4 5 6 7 8 1 2 3 4 5

Exemplo de algoritmo utilizando matriz com duas dimenses: Seja uma matriz a representao das notas obtidas pelos alunos em uma determinada disciplina. A quantidade de linhas dever ser equivalente ao nmero de alunos, neste caso 25. Cada coluna dever conter o valor de uma das avaliaes de cada aluno, neste caso so 3 avaliaes. O algoritmo deve preencher a matriz com as notas. incio inteiro: I, J; tipo m = matriz [1..25, 1..3] real; m: NOTAS; para J de 1 at 3 faa imprima (Digite as notas referentes a prova, J); para I de 1 at 25 faa leia (NOTAS [I, J]); fim para; fim para; fim.

12 Exerccio: Escreva um algoritmo que receba as notas referentes a trs avaliaes realizadas por 25 alunos, e as armazene numa matriz, juntamente com a mdia total obtida pelo aluno. Sabendo que: as duas primeiras avaliaes tm peso de 35 cada uma e a terceira tem peso de 30 pontos. Alm disso, para cada mdia total deve ser enviada uma mensagem informando se o aluno foi aprovado (>=50) ou reprovado (<50) e qual foi a porcentagem da turma aprovada.

5. REGISTROS
O registro um conjunto de dados logicamente relacionados e uma das principais estruturas de dados. Um registro consiste em trabalhar vrios dados de tipos diferentes em uma mesma estrutura e por isso considerado heterogneo. Para se declarar um registro segue-se a sintaxe: tipo <identificador> = registro <lista de campos e seus tipos> fim registro; Por exemplo, seja um registro constitudo dos campos referentes aos dados de um aluno da universidade, tais como, nmero de matrcula, nome completo, idade, turma, perodo em que se encontra e mdia geral. O algoritmo para criar o registro e ler os dados referentes a um aluno poderia ser o seguinte: incio tipo reg_aluno = registro caracter: MAT caracter: NOME inteiro: IDADE caracter: TURMA inteiro: PERIODO real: MEDIA fim registro; reg_aluno: ALUNO; leia (ALUNO.MAT); leia (ALUNO.NOME); leia (ALUNO.IDADE); leia (ALUNO.TURMA); leia (ALUNO.PERIODO); leia (ALUNO.MEDIA); fim 5.1. REGISTRO COM VETOR

Um ou mais campos de um registro pode ser do tipo vetor. A construo do registro feita da mesma forma, porm o vetor a ser utilizado em sua estrutura deve ser declarado anteriormente. Exemplo: incio tipo vet = vetor [1..6] real; tipo reg_aluno = registro caracter: MAT caracter: NOME inteiro: IDADE caracter: TURMA inteiro: PERIODO vet: NOTAS fim registro; reg_aluno: ALUNO; inteiro: I; imprima (Digite a matrcula do aluno); leia (ALUNO.MAT); imprima (Digite o nome do aluno); leia (ALUNO.NOME);

13 imprima (Digite a idade do aluno); leia (ALUNO.IDADE); imprima (Digite a turma do aluno); leia (ALUNO.TURMA); imprima (Digite o perodo do aluno); leia (ALUNO.PERIODO); imprima (Digite as notas do aluno); para I de 1 at 6 faa leia (ALUNO.NOTAS[I]); fim para; fim 5.2. CONJUNTOS DE REGISTROS

No conjunto de registros so armazenados dados de vrias ocorrncias de um determinado tipo de registro. Por exemplo, para armazenar os dados de diversos alunos: incio inteiro: I, J, N; tipo vet = vetor [1..6] real; tipo reg = registro caracter: MAT caracter: NOME inteiro: IDADE caracter: TURMA inteiro: PERIODO vet: NOTAS fim registro; tipo aluno = conjunto [1..N] reg; aluno: ALUNOS; imprima (Digite o nmero de alunos); leia (N); para I de 1 at N faa imprima (Digite a matrcula do aluno); leia (ALUNOS[I].MAT); imprima (Digite o nome do aluno); leia (ALUNOS[I].NOME); imprima (Digite a idade do aluno); leia (ALUNOS[I].IDADE); imprima (Digite a turma do aluno); leia (ALUNOS[I].TURMA); imprima (Digite o perodo do aluno); leia (ALUNOS[I].PERIODO); imprima (Digite as notas do aluno); para J de 1 at 6 faa leia (ALUNOS[I].NOTAS[J]); fim para; fim para; fim

6. ARQUIVOS
At o momento, todas as estruturas de dados estudadas ficaram armazenadas no ambiente do algoritmo, ou seja, tinham durao apenas enquanto o algoritmo estava sendo executado. O arquivo uma alternativa para estrutura de dados que pode ser fisicamente alocado em outro meio de armazenamento, em disco, por exemplo.

14 Um registro a parte lgica de uma estrutura de dados, enquanto que um arquivo, constitudo por um conjunto de um ou mais registros, a parte fsica, e pode ser chamado de registro fsico. 6.1. ORGANIZAO DE ARQUIVOS

As operaes bsicas que podem ser feitas em um arquivo atravs de um algoritmo so: obteno de um registro do arquivo, insero de um novo registro, modificao ou excluso de um registro. A disposio (organizao) de registros no arquivo pode favorecer determinadas operaes em detrimento de outras. Conhecendo a organizao, o projetista de algoritmos pode escolher aquela que seja mais adequada soluo do seu problema em termos de eficcia e eficincia. Basicamente, existem duas possibilidades de organizao de arquivos: Seqencial na qual os registros so obtidos ou inseridos no arquivo em ordem seqencial; Direta em que o acesso do registro feito de forma direta atravs do uso de um identificador para o registro. O fato de o arquivo ser armazenado em uma memria secundria o torna independente de qualquer algoritmo, ou seja, ele pode ser criado, consultado, processado e at mesmo removido por algoritmos distintos. Sendo o arquivo uma estrutura fora do ambiente do algoritmo, para que este tenha acesso aos dados do arquivo so necessrias as operaes de leitura e escrita de registros no arquivo. No algoritmo, o arquivo deve ser declarado e aberto antes que o acesso possa ser feito. No final do algoritmo, ou quando houver necessidade, o arquivo deve ser fechado. A declarao de um arquivo feita atravs da especificao: arquivo <organizao> de NOME-DO-REGISTRO: NOME; Exemplo: tipo reg_aluno = registro ... fim registro; reg_aluno: ALUNO; arquivo seqencial de ALUNO: ALUNOS; A declarao do arquivo a definio, para o algoritmo, do modelo e dos nomes que estaro associados estrutura de dados. A associao deste modelo ao arquivo fsico feita no algoritmo com um comando de abertura: abra NOME-DO-ARQUIVO <tipo de utilizao>; onde o tipo de utilizao pode ser para leitura, escrita ou ambos. Exemplos: abra ALUNOS leitura; abra ALUNOS escrita; abra ALUNOS; Para se desfazer a associao entre o modelo e o arquivo fsico, usa-se o comando de fechamento: feche NOME-DO-ARQUIVO; Os formatos para leitura e escrita de um arquivo so dependentes do seu tipo de organizao. 6.1.1. ORGANIZAO SEQENCIAL

A principal caracterstica da organizao seqencial a de que os registros so armazenados contiguamente, isto , um aps o outro na ordem em que foram inseridos. A acesso aos registros do arquivo, tanto na leitura quanto na escrita, so feitos seqencialmente, ou seja, a leitura de um registro s possvel aps a leitura de todos os registros anteriores e a escrita de um registro s feita aps o ltimo registro.

15 O comando de leitura de um registro em um arquivo seqencial : leia NOME-DO-ARQUIVO . NOME-DO-REGISTRO; E o comando de escrita similar : escreva NOME-DO-ARQUIVO . NOME-DO-REGISTRO; Observao: Para escrever dados numa prxima posio do arquivo, deve-se incluir prximo ao comando de escrita. Por exemplo, escreva prximo ARQUIVO.REGISTRO; Observao: Existe uma varivel lgica pr-definida para cada arquivo chamada FDA (Fim De Arquivo), que indica se um arquivo chegou ou no ao seu ltimo arquivo. Exerccio 1: Supondo-se a existncia de um arquivo A composto por nomes, salrios e nmero de horas trabalhadas por ms dos funcionrios de uma empresa, faa um algoritmo que crie um novo arquivo B, com a mesma estrutura, porm contendo apenas os dados referentes aos funcionrios que trabalharam mais de 400 horas / ms. Exerccio 2: Crie um algoritmo para entrar com dados, a partir do teclado, de um novo funcionrio no arquivo A. 6.2. ORGANIZAO DIRETA

A principal caracterstica da organizao direta a facilidade de acesso a um registro desejado, pois, ao contrrio da organizao seqencial, para acessar um determinado registro no preciso percorrer todos os anteriores a ele, o acesso feito diretamente. Este acesso direto possvel porque a posio do registro no espao fsico do arquivo univocamente determinada a partir de um dos campos do registro, escolhido no momento de criao do arquivo direto como sua chave. Exemplo: Suponha-se um arquivo seqencial contendo dados dos alunos, como na tabela abaixo: MATRICULA NOME TURMA PERIODO 9800012 Maria Arajo A 3 9900001 Joaquim Silva A 2 9800002 Carlos Menezes B 3 9900010 Ftima Andrade C 1 9900025 Ana Lcia Dias B 1 9800005 Marcelo Costa C 3 9900003 Flvio Martins C 2 9800040 Luiz Carvalho A 2 Um algoritmo para encontrar os dados do aluno e imprimir seu nome, cuja matrcula seja 9900003, seria o seguinte: incio tipo regaluno = registro caracter: MATRICULA caracter: NOME caracter: TURMA inteiro: PERIODO fim registro; regaluno: DADOS; arquivo seqencial de DADOS: ALUNOS; abra ALUNOS leitura; repita leia ALUNOS.DADOS; se DADOS.MATRICULA = 9900003 ento imprima (DADOS.NOME); abandone; fim se; at ALUNOS.FDA; feche ALUNOS; fim.

16 Se a organizao for direta, a disposio dos registros no arquivo no ser necessariamente a apresentada no arquivo seqencial. Atravs de funes internas ao computador, cada registro ser alocado em uma posio univocamente determinada pela chave escolhida, como mostra a tabela abaixo: {funo que associa chave ao registro} MATRICULA 9800002 9800005 9800012 9800040 9900001 9900003 9900010 9900025

NOME Maria Arajo Joaquim Silva Carlos Menezes Ftima Andrade Ana Lcia Dias Marcelo Costa Flvio Martins Luiz Carvalho

TURMA A A B C B C C A

PERIODO 3 2 3 1 1 3 2 2

Para se ter acesso a um registro, basta efetuar-se a leitura no arquivo usando a chave, no caso o nmero da matrcula, desejada. No h necessidade do algoritmo fazer nenhum tipo de pesquisa. O mecanismo de gerncia do arquivo direto no computador capaz de associar a chave ao registro procurado. Caso a chave no exista, uma condio de chave invlida (INV) poder ser testada. A escolha da chave feita pelo usurio no momento da criao do arquivo de organizao direta e, em geral, um dos campos do registro. Observaes importantes: Cada registro dever ser gravado usando sua chave. No pode haver registros usando a mesma chave ( nica). As operaes de leitura e escrita num arquivo de organizao direta so indicadas nos algoritmos pelos seguintes comandos: leia item [chave] NOME-ARQUIVO.NOME-REGISTRO; e escreva item [chave] NOME-ARQUIVO.NOME-REGISTRO; O algoritmo desenvolvido anteriormente para encontrar os dados do aluno e imprimir seu nome, cuja matrcula seja 9900003, seria: incio tipo regaluno = registro caracter: MATRICULA caracter: NOME caracter: TURMA inteiro: PERIODO fim registro; regaluno: DADOS; arquivo direto de DADOS chave MATRICULA: ALUNOS; abra ALUNOS leitura; leia item [9900003]ALUNOS.DADOS; se ALUNOS.INV {erro se a chave no for encontrada} ento imprima (Aluno no existe); seno imprima (DADOS.NOME); fim se; feche ALUNOS; fim.

17 Exerccios: 1. Escreva um algoritmo que abra um arquivo VENDAS contendo os seguintes campos: cdigo da pea, quantidade vendida, valor unitrio, cliente e data. E crie dois outros arquivos da seguinte forma: Contendo os nomes dos clientes que compraram mais de R$500,00 (valor total da compra). Contendo os cdigos das peas que venderam mais de 100 unidades para um cliente, no ms de junho de 2002. 2. No mesmo arquivo da questo anterior, faa a busca de uma determinada pea por seu cdigo. Implemente com os dois tipos de organizao de arquivos e discuta os problemas relacionados a estas diferentes solues.

7. MODULARIZAO
No fim da dcada de 60, alguns problemas no desenvolvimento de sistemas de programao levaram os pases desenvolvidos a um evento chamado crise de software. Os custos das atividades de programao mostravam a cada ano uma clara tendncia a se elevarem muito em relao aos custos dos equipamentos, e isto era devido ao avano tecnolgico na fabricao dos equipamentos de computao e a lenta evoluo de tcnicas aplicadas ao desenvolvimento de software. A ausncia de uma metodologia para a construo de programas conduzia a programas geralmente cheios de erros e com altos custos de desenvolvimento que, conseqentemente, exigiam custos elevados para a sua correo e manuteno futuras. A programao estruturada foi o resultado de uma srie de estudos e propostas de metodologias para desenvolvimento de software. Uma das tcnicas aplicadas na programao estruturada, a modularizao de programas uma ferramenta para a elaborao de programas visando, os aspectos de confiabilidade, legibilidade, manutenibilidade e flexibilidade, dentre outros. A modularizao um processo que aborda os aspectos da decomposio de algoritmos em mdulos. Mdulo um grupo de comandos, constituindo um trecho do algoritmo, com uma funo bem definida e o mais independente possvel em relao ao resto do algoritmo. Exemplo Seja um algoritmo para calcular o salrio lquido de um empregado, com as seguintes etapas: incio Leia os dados do empregado Determine o salrio Escreva o salrio fim. Onde Determine o salrio pode ser refinado como: Calcule as vantagens Calcule as dedues SALARIOLIQ VANTAGENS DEDUES No refinamento anterior no houve preocupao de como o processo de clculo das vantagens e dedues seria efetuado. Essas aes constituem funes bem definidas e que sero executadas por mdulos especficos, neste caso, o algoritmo anterior ficaria: incio Leia os dados do empregado Ative o mdulo Clculo das vantagens Ative o mdulo Clculo das dedues SALARIOLIQ VANTAGENS DEDUES Escreva o salrio fim. Exemplo da descrio estrutural da modularizao: Mdulo Principal

Mdulo Vantagens

Mdulo Dedues

18 A maneira mais intuitiva de proceder a modularizao de problemas feita definindo um mdulo principal de controle e mdulos especficos para as funes do algoritmo. Recomenda-se que os mdulos de um programa tenham um tamanho limitado, pois mdulos muito grandes so difceis de ser compreendidos e, em geral, so multifuncionais. As linguagens de programao dispem de recursos que facilitam a construo e manipulao de mdulos, permitindo no s a modularizao dos comandos do programa, como tambm dos dados utilizados. Cada mdulo pode definir as prprias estruturas de dados, suficientes e necessrias apenas para atingir o objetivo final do mdulo. Todo mdulo constitudo por uma seqncia de comandos que operam sobre um conjunto de objetos, que podem ser globais ou locais. Objetos globais so entidades que podem ser usadas em mdulos internos a outro mdulo do algoritmo onde foram declaradas. Objetos locais so entidades que s podem ser usadas no mdulo do algoritmo onde foram declaradas. Estes objetos no possuem nenhum significado fora deste mdulo. So exemplos de objetos globais ou locais: variveis, arquivos, outros mdulos, etc. A comunicao entre mdulos dever ser feita atravs de vnculos, utilizando-se objetos globais ou transferncia de parmetros. 7.1. BENEFCIOS DA MODULARIZAO

A independncia do mdulo permite uma manuteno mais simples e evita efeitos colaterais no restante do algoritmo; A elaborao do mdulo pode ser feita independentemente e em poca diferente do restante do algoritmo; Testes e correes dos mdulos podem ser feitos separados; Um mdulo pode ser utilizado em outros algoritmos que requeiram o mesmo processamento por ele executado. 7.2. FERRAMENTAS PARA MODULARIZAO Sub-rotinas e funes so mdulos que servem aos objetivos: Evitar que em certa seqncia de comandos necessria em vrios locais de um algoritmo tenha que ser escrita repetidamente nesses locais; Dividir e estruturar um algoritmo em partes fechadas e logicamente coerentes; Aumentar a legibilidade de um algoritmo. Sub-rotinas e funes so mdulos hierarquicamente subordinados a um algoritmo, comumente chamado de mdulo principal. Da mesma forma uma sub-rotina ou uma funo pode conter outras sub-rotinas e funes aninhadas. A sub-rotina e a funo so criadas atravs das suas declaraes em um algoritmo e para serem executadas, necessitam de ativao por um comando de chamada. A declarao de uma subrotina ou funo constituda de um cabealho, que a identifica e contm seu nome e uma lista de parmetros formais, e de um corpo que contm declaraes locais e os comandos. Criao de sub-rotina subrotina NOME (lista-de-parmetros-formais) declaraes dos objetos locais a sub-rotina comandos da sub-rotina fim subrotina; Chamada da sub-rotina NOME (lista-de-parmetros-atuais);

As funes tm a caracterstica de retornar ao algoritmo que as chamou um valor associado ao nome da funo.

19 Criao de funo funo tipo NOME (lista-de-parmetros-formais) declaraes dos objetos locais a funo comandos da funo fim funo; Chamada da funo NOME (lista-de-parmetros-atuais); Como esta funo ir retornar um valor, este pode ser atribudo a alguma varivel, contanto que esta seja de tipo compatvel. A NOME (lista-de-parmetros-atuais); Ao terminar a execuo dos comandos de uma sub-rotina ou funo, o fluxo de controle retorna ao comando seguinte quele que provocou a chamada. 7.3. MODOS DE TRANSFERNCIA DE PARMETROS

Os parmetros de uma sub-rotina ou funo classificam-se em: de entrada so aqueles que tm seus valores estabelecidos fora da sub-rotina ou funo e no podem ser modificados dentro dela. de sada so aqueles que tm seus valores estabelecidos dentro da sub-rotina ou funo. de entrada-sada so aqueles que tm seus valores estabelecidos fora da sub-rotina ou funo, mas podem ter seus valores alterados dentro dela. A vinculao entre mdulos pode ser feita atravs da transferncia ou passagem de parmetros, que associam parmetros atuais com parmetros formais. Dentre os modos de transferncia de parmetros, pode-se destacar: a passagem por valor, a passagem por resultado e a passagem por referncia. Na passagem de parmetros por valor, as alteraes feitas nos parmetros formais, dentro da sub-rotina ou funo, no se refletem nos parmetros atuais. O valor do parmetro atual copiado no parmetro formal, na chamada da sub-rotina ou funo. Assim, quando a passagem por valor significa que o parmetro de entrada. Na passagem de parmetros por resultado, as alteraes feitas nos parmetros formais, na sub-rotina ou funo, refletem-se nos parmetros atuais. O valor do parmetro formal copiado no parmetro atual, ao retornar da sub-rotina ou funo. Assim, quando a passagem por resultado significa que o parmetro de sada. Na passagem de parmetros por referncia, a toda alterao feita num parmetro formal corresponde a mesma alterao feita no seu parmetro atual associado. Neste caso, quando a passagem por valor significa que o parmetro de entrada-sada.

8. RECURSIVIDADE
Um objeto dito recursivo se ele consistir parcialmente ou for definido em termos de si prprio.

20 Uma funo recursiva quando no corpo dessa funo existe uma chamada a si prpria, podendo utilizar os mesmos parmetros de entrada (correndo riscos de provocar um ciclo infinito) ou outros. 8.1. EXEMPLO DE PROBLEMA RECURSIVO

Imagine que temos um monte de pregos e queremos saber quantos so. Se pegarmos num prego, sabemos que temos um prego, mas no sabemos quantos ainda existem no monte restante... efetuamos a mesma operao (recursividade) e somamos o prego ao que j temos. Fazemos o mesmo at no existir mais pregos para contar, isto , pegamos num e somamos aos que temos, repetimos a mesma operao perguntando sempre entre as operaes, "ainda h mais pregos para contar?", caso haja, repetimos, caso contrrio paramos. A recursividade uma ferramenta muita poderosa quando bem implementada, seno pode ser muita perigosa. preciso ter cuidado com as condies de parada, se faltar alguma condio de parada ou alguma condio de parada est errada pode acontecer um ciclo infinito. 8.2. RECURSO ITERAO

Paradigma iterativo: uma seqncia de instrues executada de uma forma repetitiva, controlada por uma dada condio (ciclo iterativo). Paradigma recursivo: existncia de casos simples, em que a resposta determinada diretamente; ser possvel uma decomposio recursiva de uma instncia do problema, em instncias mais simples da mesma forma. Numa funo recursiva, so criadas vrias ativaes dela prpria que desaparecem medida que a execuo avana. Em cada momento apenas uma das ativaes est ativa, estando as restantes espera que essa termine para continuarem. Os dois paradigmas so equivalentes: dada uma funo recursiva existe sempre uma iterativa e vice-versa. 8.3. EXEMPLOS MAIS FAMOSOS DE PROBLEMAS RECURSIVOS

Fatorial: Clculo de n! = n x (n - 1) x...x 1

Seqncia de Fibonacci: 0 1 1 2 3 5 8 13 21 34 55 89 144 Exemplo de problema: Considerar uma populao de coelhos que se reproduz segundo as seguintes regras: Cada par de coelhos produz um novo par por ms Os coelhos so frteis a partir do segundo ms Os coelhos no morrem Supondo que nasce um par de coelhos em Janeiro, quantos pares de coelhos existem no fim do ano? Algoritmo Determinar o nmero de pares em cada ms: 0 1 2 3 4 5 6 7 8 9 10 11 12 0 1 1 2 3 5 8 13 21 34 55 89 144 Generalizando, ao fim de n > 1 etapas temos: fn = fn - 1+fn - 2 e f0=0 e f1=1.

21

O Puzzle das Torres de Hani: (inventado por Eduard Lucas (1880)) So dados trs suportes (a, b e c) e n discos de tamanhos diferentes. Os discos esto empilhados num dos suportes por ordem crescente de tamanhos. Pretende-se mover os discos para outro suporte de modo que: em cada passo exatamente um disco seja movido de um suporte para o outro um disco no pode nunca estar por cima de um menor o terceiro suporte pode ser usado como auxiliar

9. APONTADORES
na memria RAM que so carregados os nossos programas e tambm onde so armazenadas as variveis que fazem parte dos programas. A memria RAM pode ser vista como um enorme vetor de Bytes consecutivos, cada um ocupando uma posio bem determinada, que identificada por um nmero nico que varia entre 0 e a totalidade de Bytes. Para os programadores, muito mais simples referenciar uma varivel pelo seu nome do que referenci-la pela posio que essa varivel ocupa em memria. O compilador associa a cada nome de varivel uma posio nica em memria, capaz de suportar os dados do tipo dessa varivel. Sempre que num programa se faz referncia a uma varivel, na realidade o endereo ou conjunto de endereos que essa varivel ocupa, que est sendo referenciado. O apontador um mecanismo particularmente flexvel de manipulao de dados, pois permite manipular diretamente dados contidos em endereos especficos de memria. Supondo que exista um apontador denominado ptr, que como qualquer varivel ocupa uma posio em memria. Como ptr um apontador, dever conter o endereo de memria de outra varivel (notar que o endereo de uma varivel no mais do que o nmero da casa que ocupa em memria). A Figura 3 mostra este exemplo.

Figura 3: Exemplo de apontador.

22

10. LISTAS LINEARES


Uma lista linear uma estrutura dinmica caracterizada por uma seqncia ordenada de elementos, no sentido da sua posio relativa: E1, E2, ..., En, onde: Existem n elementos na seqncia; E1 o primeiro elemento da seqncia; En o ltimo elemento da seqncia; Para todo i, j entre 1 e n, se i < j, ento o elemento Ei antecede o elemento Ej; Caso i = j 1, Ei o antecessor de Ej e Ej o sucessor de Ei. Exemplos de listas lineares: 1) Fila de clientes de um banco, onde existem o primeiro e o ltimo da fila, e uma ordem de atendimento. 2) Pilha de processos de uma repartio a serem atendidos. 10.1. OPERAES EM LISTAS LINEARES Criar uma estrutura dinmica ser criada durante a execuo do programa; Destruir depois de ser utilizada, a estrutura deve ser destruda; Percorrer todos os elementos da lista podem ser utilizados, sendo que para isso a lista tem que ser percorrida; Buscar um determinado elemento da lista pode ser identificado ou por sua posio, ou por seu contedo; Inserir um novo elemento colocado na lista numa determinada posio e n aumenta em 1; Remover um elemento retirado da lista numa determinada posio e n diminui em 1. Os diferentes tipos de listas lineares, possuem caractersticas especiais com relao a forma como so manipuladas. Filas - Uma fila (queue) uma lista linear onde as operaes de insero so efetuadas apenas no final e as operaes de retirada apenas no incio, ou seja: A insero de um novo elemento X o torna o ltimo da fila; A retirada sempre efetuada sobre o elemento E1.

Devido s caractersticas das operaes da fila, o primeiro elemento a ser inserido ser o primeiro a ser retirado. Estruturas deste tipo so chamadas de FIFO (First In, First Out). Pilhas - Uma pilha (stack) uma lista linear onde tanto a operao de insero, quanto a de retirada so efetuadas no final, ou seja: A insero de um novo elemento X o torna o ltimo da pilha; A retirada sempre efetuada sobre o elemento En.

P T O R

23

Devido s caractersticas das operaes da pilha, o primeiro elemento a ser inserido ser o ltimo a ser retirado e o ltimo a ser inserido ser o primeiro a ser retirado. Estruturas deste tipo so chamadas de LIFO (Last In, First Out). 10.2. IMPLEMENTAO DE LISTAS LINEARES Alternativas: Contigidade fsica (com o uso de vetores) Encadeada (com o uso de apontadores) Contigidade Fila: 1

4 R

5 O

6 T

7 P

8 X

10

incio Pilha: topo 6 5 4 3 2 1 X P T O R

fim

Encadeamento Simples R O T P X

Exerccios: 1) Considere um conjunto de informaes relativas a alunos, constitudo de nome, nmero de matrcula e data de nascimento. Organize estas informaes em uma lista encadeada, ordenada pelo nome do aluno. Escreva funes que efetuem as seguintes aes: imprimir os nomes e nmeros de matrcula dos alunos que nasceram aps uma determinada data (passada como parmetro); procurar as informaes relativas a um determinado aluno, cujo nmero de matrcula passado como parmetro; incluir um novo aluno na lista, respeitando a ordenao. 2) Construa um procedimento que recebe uma lista encadeada (endereo inicial no apontador Lista) e monta uma nova lista a partir dos dados desta, com os elementos em ordem inversa. Somente a lista final deve estar alocada ao final da execuo do procedimento. 3) Escreva um procedimento que recebe duas filas, que contm valores numricos ordenados. O procedimento dever formar uma terceira fila, tambm ordenada, na qual estaro os valores armazenados nas filas originais. Considere duas possibilidades: as filas implementadas sobre arranjos, e as filas implementadas atravs de apontadores.

Você também pode gostar