Académique Documents
Professionnel Documents
Culture Documents
Parte 1
Faculdades Integradas Stella Maris FISMA Curso de Tecnologia em Anlise e Projeto de Sistemas Prof. Mrcio A. S. Torrente
Andradina SP
Diferentes tipos de estrutura de dados so adequadas a diferentes tipos de aplicao e algumas so altamente especializadas, destinando-se a algumas tarefas especficas. Por exemplo, as rvores Binrias (Btrees), Listas Encadeadas e Grafos so particularmente indicadas para a implementao de bancos de dados, enquanto que a implementao de compiladores de programas geralmente requer o uso de Pilhas e Filas. Estruturas de dados e algoritmos so temas fundamentais da cincia da computao, sendo utilizados nas mais diversas reas do conhecimento e com os mais diferentes propsitos de aplicao. Sabe-se que algoritmos manipulam dados. Quando estes dados esto organizados (dispostos) de forma coerente, caracterizam uma estrutura de dados. A organizao e os mtodos para manipular essa estrutura que lhe conferem singularidade. As estruturas de dados so chamadas tipos de dados compostos que dividem-se em homogneos (vetores e matrizes) e heterogneos (registros). As estruturas homogneas so conjuntos de dados formados pelo mesmo tipo de dado primitivo(Caracter, inteiro ou real). As estruturas heterogneas so conjuntos de dados formados por tipos de dados primitivos diferentes (campos de um registro). O enfoque deste estudo, daqui por diante ser voltado s estruturas homogneas de dados implentadas atravs de variveis compostas.
Variveis Indexadas
A declarao de variveis, uma a uma, suficiente para a codificao algortmica da soluo de uma ampla gama de problemas, mas insuficiente para resolver um grande nmero de problemas computacionais. Imagine, por exemplo, como faramos para construir um algoritmo, que lesse os nome de 500 pessoas e imprimisse um relatrio destes mesmos nomes, mas ordenados alfabeticamente. No seria uma tarefa simples, pois teramos que definir 500 variveis do tipo literal, como mostrado abaixo: Exemplo: Algoritmo "Invivel" var nome1, nome2, nome3, nome4, nome5,..., nome499, nome500: literal inicio leia(nome1) leia(nome2) leia(nome3) ... ... ... leia(nome500) ... fimalgoritmo Considere o tamanho do algoritmo, e o trabalho braal necessrio para constru-lo. Para resolver problemas como este, e outros, existem as variveis indexadas. A declarao de uma varivel indexada corresponde, na verdade, declarao de muitas variveis cujo identificador difere apenas por um ndice. O ndice corresponde a um valor numrico comeando por 1. Cada varivel indexada pode receber valores no decorrer do algoritmo como se fosse uma varivel simples.
var idade : Vetor[1..5] de inteiro nome : Vetor[1..5] de Caracter A declarao acima corresponde declarao de 5 variveis: nome[1], nome[2], nome[3], nome[4], nome[5], idade[1], idade[2], idade[3], idade[4] e idade[5]. Para se atribuir um valor a um elemento do vetor devemos utilizar o seguinte padro: <identificador>[<posio>] <- <valor> Exemplo: nome[1] <- Joo da Silva idade[1] <- 35 nome[3] <- Maria Aparecida idade[3] <- idades[1] i <- 5 idade[i] <- 45 Exemplo: Algoritmo que l um vetor NUMERO de 6 posies, conta quantos valores deste vetor so negativos e em seguida mostra todos os valores do vetor e a quantidade calculada. Algoritmo "ManipulaVetor" var NUMERO: Vetor[1..6] de real i, conta_neg : inteiro inicio conta_neg <- 0 para i de 1 ate 6 faca escreva(Entre com um valor para NUMERO[, i, ]:) leia (NUMERO[i]) fimpara para i de 1 ate 6 faca se NUMERO[i] < 0 entao conta_neg <- conta_neg + 1 fimse fimpara para i de 1 ate 6 faca escreval (NUMERO[, i, ]:, NUMERO[i]) fimpara escreva ("Total de nmeros negativos: ", conta_neg) fimalgoritmo
A declarao acima corresponde declarao de 6 variveis: PESSOA[1,1], PESSOA[1,2], PESSOA[1,3], PESSOA[2,1], PESSOA[2,2], e PESSOA [2,3]. Para se atribuir um valor a um elemento do vetor devemos utilizar o seguinte padro: < identificador>[<posio1>,<posio2>] <- <valor> Exemplo: PESSOA[1,3]<- Antonio i <- 3 j <- 2 PESSOA[i,j] <- Mrcio Exemplo: Algoritmo que l uma matriz denomidada Valor(3,3) e calcula as somas: a) da linha 3; b) da coluna 2; c) da diagonal principal; d) da diagonal secundria; e e) de todos os elementos da matriz.
Algoritmo "ManipulaMatriz" var VALOR : VETOR [1..3,1..3] DE REAL somaLinha3, somaColuna2, somaDiagPrinc, somaDiagsecu, somaTudo: REAL i, j: INTEIRO //os ndice sempre inteiro inicio somaLinha3 <- 0 somaColuna2 <- 0 somaDiagPrinc <- 0 somaDiagsecu <- 0 somaTudo <- 0 Para i de 1 ate 3 faca Para j de 1 ate 3 faca Escreva("Digite um valor para a matriz: ") Leia (VALOR[i,j]) fimpara fimpara Para i de 1 ate 3 faca Para j de 1 ate 3 faca somaTudo <- somaTudo + VALOR[i,j] se i=3 entao somaLinha3 <- simaLinha3 + VALOR[i,j] fimse se j=2 entao somaColuna2 <- somaColuna2 + VALOR[i,j] fimse se i=j entao somaDiagPrinc <- somaDiagPrinc + VALOR[i,j] fimse se j=4-i entao somaDiagsecu <- somaDiagSecu + VALOR[i,j] fimse fimpara fimpara Para i de 1 ate 3 faca para j de 1 ate 3 faca escreval (VALOR[, i, ,, j, ]=, VALOR[I,J]) fimpara fimpara escreval ("Soma de todos os elementos ", somaTudo) escreval ("Soma dos elementos da linha 3 ", somaLinha3) escreval ("Soma dos elementos da coluna 2 ", somaColuna2) escreval ("Soma dos elementos da diagonal principal ",somaDiagPrinc) escreval ("Soma dos elementos da diagonal secundria ",somaDiagsecu) fimalgoritmo
Prof. Mrcio A. S. Torrente 4
Subalgoritmos ou Sub-rotinas
So trechos de algoritmos que efetuam um ou mais clculos determinados ou quaisquer outras instrues de programa. Ao invs de escrever-se um algoritmo grande, escrevem-se vrios algoritmos menores, os quais, no isoladamente, mas em conjunto, resolvem o problema proposto. conveniente utiliz-los quando uma determinada tarefa efetuada em diversos lugares no mesmo algoritmo. Ao invs de escrever-se um trecho diversas vezes, escreve-se um sub-algoritmo (ou sub-rotina) e chama-o diversas vezes. Eles reduzem o tamanho do algoritmo. Facilitam a compreenso e visualizao do algoritmo. So declarados no incio do algoritmo e podem ser chamados em qualquer ponto aps sua declarao. Eles podem ser Funes que retorna algum valor ou Procedimento (Subrotina) que no retorna nada.
Criando Funes
A criao de uma Funo deve ser declarada, com os demais objetos, no incio do programa. Este tipo de subalgoritmo sempre retornam um e apenas um valor ao algoritmo que lhe chamou. Cada funo tem associada ao seu valor de retorno um tipo explcito. Da mesma maneira com que os parmetros so fixos para todas as chamada o retorno tambm fixo. Algoritmo "<nome do algoritmo>" var <declarao de variveis globais> <definio da funo> inicio < lista de comandos> fimalgoritmo Sintaxe para definio da Funo: Funcao <identificador> ([var]<parmetros>) : <tipo de retorno> var <declarao de variveis locais> inicio <lista de comandos> retorne <valor de retorno> fimfuncao Onde: Identificador = Nome da funo. Passagem de parmetros por referncia = utiliza-se a construo VAR antes dos identificadores para indicar a passagem por referncia. Os identificadores so separados por vrgula. Parmetros = Entre um mesmo tipo de dados so separados por vrgula. Entre tipos de dados a separao feita com ponto-e-vrgulas ';'. Tipo de retorno da funo = Real, Inteiro, Lgico ou Caracter. Declarao de variveis locais = idntica a declarao de variveis globais. As variveis declaradas localmente tem validade dentro do escopo da funo. Retorne = local onde colocado a varivel de retorno. Exemplo:
var Valor_1,Valor_2, soma: real Funcao FSoma(parametro1, parametro2: Real):Real var total : real Inicio total <- parametro1 + parametro2 retorne total fimfuncao inicio Escreva("Valor 1: ") leia(Valor_1) Escreva("Valor 2: ") leia(Valor_2) soma <- FSoma(Valor_1,Valor_2) escreval("Soma das vaiveis ", soma) Fimalgoritmo
As variveis max e topo devem ser declaradas como globais e determinam as seguintes condies especiais:
Quando topo = 0, a pilha est vazia. Quando topo = max, a pilha est cheia.
Algoritmos para empilhar e desempilhar dados respectivamente: Procedimento PUSH(dado : caracter) inicio se topo = max entao escreval(Pilha cheia!) senao topo <- topo + 1 pilha[topo] <- dado fimse fimprocedimento Funcao POP : caracter inicio se topo = 0 entao escreval(Pilha vazia!) retorne senao retorne pilha[topo] topo <- topo - 1 fimse fimfuncao Para mostrar todos os elementos da pilha: Procedimento MOSTRA_PILHA var i : inteiro inicio para i de 1 ate topo faca escreval(pilha[i]) fimpara fimprocedimento
que adiciona um elemento ao final da fila, e DEQUEUE, que remove o elemento no incio da fila. A operao DEQUEUE s pode ser aplicado se a fila no estiver vazia, causando um erro de underflow ou fila vazia se esta operao for realizada nesta situao. Esquema de uma fila de dados implementada num vetor: Fila = 1 A ^ primeiro 2 B 3 C ^ ultimo 4 5 ^ max tam = 3
As variveis max, primeiro, ultimo e tam devem ser declaradas como globais e determinam as seguintes condies especiais:
Quando tam = 0, a fila est vazia. Quando tam = max, a fila est cheia.
Algoritmos para inserir e retirar dados da fila respectivamente: Procedimento INQUEUE(dado : caracter) inicio se tam = max entao escreval(Fila cheia!) senao ultimo <- ultimo + 1 fila[ultimo] <- dado tam <- tam + 1 fimse fimprocedimento Funcao OUTQUEUE : caracter inicio se tam = 0 entao escreval(Fila vazia!) senao retorne fila[primeiro] primeiro <- primeiro + 1 tam <- tam - 1 fimse fimfuncao Para mostrar todos os elementos da fila: Procedimento MOSTRA_FILA var i : inteiro inicio para i de primeiro ate ultimo faca escreval(fila[i]) fimpara fimprocedimento
A Fila Circular
O conceito de fila circular usado quando usamos estas estruturas estticas, como um vetor, para representarmos a fila de dados, ou seja, definimos um vetor de 100 posies, logo poderemos ter no mximo cem elementos na fila, definimos duas variveis que tero a posio do incio e do final da fila, conforme
Prof. Mrcio A. S. Torrente 8
inserimos um elemento na fila, incrementamos a varivel final, e ao excluirmos incrementamos a varivel incio, assim quando a varivel final obter o valor cem o processo terminaria, porm o conceito de fila circular nos apresentado para suprir isto, e neste momento a varivel final recebe o valor do incio novamente da fila. Dessa forma, qualquer nmero de itens poderia ser colocado na fila, contanto que itens tambm estivessem sendo retirados. Essa implementao chamada de fila circular, porque usa seu vetor de armazenamento como se fosse um crculo em vez de uma lista linear. Em essncia, a fila s est cheia quando os ndices de armazenamento e recuperao, variveis de incio e final da fila, so iguais; caso contrrio, h espao na fila para outro elemento. Talvez o uso mais comum de fila circular seja em sistemas operacionais, onde a fila circular contm as informaes lidas dos arquivos em disco ou do console. Filas circulares tambm so usadas em programas aplicativos de tempo real, que devem continuar a processar informaes enquanto pem as requisies de E/S em um buffer. Muitos editores de texto fazem isso enquanto re-formatam um pargrafo ou justificam uma linha. O que est sendo digitado no mostrado at que o outro processo termine. Para conseguir isso, o programa aplicativo deve verificar a entrada do teclado durante a execuo do outro processo. Se uma tecla foi pressionada, ela rapidamente colocada em uma fila e o processo continua. Uma vez que o processo tenha terminado, os Caracteres so recuperados da fila. Esquema de uma fila circular de dados implementada num vetor: 1 F 2 G ^ ultimo 3 C 4 D ^ primeiro 5 E max = 5 tam = 4
Fila =
Neste caso, os valores contidos na fila do primeiro ao ultimo so: D, E, F e G. Considere ento o valor C, na posio 3 como lixo da fila, pois j foi logicamente retirado da fila mas permanece fisicamente ocupando sua posio no vetor. Agora surgem outras condies especiais:
Ao incluir um dado, quando ultimo = max e tam < max, circular a fila tornando ultimo = 1. Ao retirar um dado, quando primeiro = Max e tam > 0, circular a fila tornando primeiro = 1.
Algoritmos para inserir e retirar dados da fila circular respectivamente: Procedimento INQUEUE(dado : Caracter) inicio se tam = max entao escreval(Fila cheia!) senao Se ultimo = Max entao ultimo <- 1 seno ultimo <- ultimo + 1 fimse fila[ultimo] <- dado tam <- tam + 1 fimse fimprocedimento
Funcao OUTQUEUE : Caracter inicio se tam = 0 entao escreval(Fila vazia!) senao retorne fila[primeiro]
Prof. Mrcio A. S. Torrente 9
se primeiro = Max ento primeiro <- 1 senao primeiro <- primeiro + 1 fimse tam <- tam - 1 fimse fimfuncao
10