Você está na página 1de 104
SUMARIO. 1. Conceitos Basicos 1.1 - Introdugao ao Coneeito de Algoritmo 1.1.1 - 0 Papel da Abstragao 1.1.2 - Abstragao de Dados 4.1.3 - Sintaxe e Semantica 1.1.4 - Processamento de Linguagens 4.2 - Programagao Convencional 1.3 - Programagao Estruturada 1.3.1 - Refinamento Suoessivo "top-down" -.01 04 02 08 03 03 05 08 06 1.3.2 - 0 Conceito de Algoritmos e Estruturas de Dados..08 1.3.3 - Vantagens da Programacéo Estruturada 2. Desenvolvimento de Algoritmos 2.1 - Meméria e 0 Conceito de Variéveis 2.1.1 -Tipos Primitivos de Dados . 2.1.2 - Declaragao de Variveis e seus Operacores 2.1.3 - Fung6es Primitivas 2.1.4 Prioridade dos Operadores 2.1.5 - Declaragéo de Constantes "1 13 13 14 15 16 16 7 2.2- Ag6es Primitivas 2.2.1 - Comando de Atribuigo 2.2.2 - Comandos de Entrada e Saida 2.3 - Estruturas de Controle de Fiuxo 2.8.1 - 0 Conceito de Bloco 2.8.2 - Seqiiéncia Simples 2.3.3 - Estruturas Alternativas 2.3.3.1 - Alternativas Simples 2.3.3.2 - Alternativas Compostas 2.3.3.3 - Alternativas Aninhadas 2.3.3.4 - Estudo de Casos 2.8.4 - Estruturas de Repetigao 2.3.4.1 - Estrutura ENQUANTO 2.3.4.2 Estrutura REPITA 2.3.4.3 - Estrutura PARA 2.4- Exercicios 3. Estruturas de Dados 3.1 - Declaragao de Novos Tipos 3.1.1 - Tipo Escalar 3.1.2- Tipo Subfaixa 3.2 Estruturas de Dados Homogénea 3.2.4 - Vetores (Array Unidimensional 3.2.2 - Manipulagao de Cadeias de Caracteres 18 18 18 21 221 22 24 BSRBBS 44 44 45 46 47 47 53 8.2.3 - Matrizes (Array Multidimensional) . 3.2.3.1 - Matrizes Esparsas 3.3 - Estruturas de Dados Heterogénea 3.3.1 - Registros 3.3.1.1 - Referenciago 3.3.1.2 - Conceito de Campo Multislo. 3.4- Arquivos 3.4.1 - Organizagao Seqtiéncial 3.4.2 - Organizagao Direta 3.4.3 - Organizacéo Indexada 3.5 - Exercicios 4, Modularizagao 4.1 - Modularizagao 4.1.1 -O conceito de Bloco 4.1.2 - Escopo de Varidveis 4.2 - Procedimentos 4.2.1 - Referenciagao 3 4.2.2 - Procedimento com Passagem de Parametro 4.3 - Funcdes : : 4.4 - Relagdo de Recorréncia (Recursividade) 56 67 -. 68 m 74 7 78 80 82 gu 90 31 92 94 98 99 401 18 Estruturas de Dados com Alocagao Dinaémica 5.1 - Ponteiros 5.2 - Listas Lineares 5.2.1 - Lista Simplesmente Encadeada 5.2.1.1 - Operagdes Basicas sobre uma lista . 5.2.2 -Lista Duplamente Encadeada 5.22.1 - Lista Circular 5.3 - Listas com Disciplina de Acesso . 53.1- 53.2- 5.3.3 -Deque 5.4 - Arvores E 5.4.1 -Construgao de Arvore Bindria las ihas 5.4.2 -Caminhamento em Arvore Binaria 5.5 - Exercicios 6. Pesquisa de Dados 6.1 - Andise da Complexidade de Algoritmos 6.2- Busca Seqiiéncial 6.3 - Busca por Bissegao 6.4 - Busca Bindria 125 125 128 128 138 143, 143, 144 144 144 145 145 145 181 = 153 156 156 160 160 161 6.5 - Busca Indexada 6.6 - Exercicios . . 7. Classificagao de Dados . 7.1 - Classificagao Simpies .. 7.2 - Classificacao por Intercalacao (merge) 7.3 - Classificagao Rapida (quick) 7.4 - Classificagao com Arvore Balanceada (AVL) 7.5 - Exercicios ... Apéndice A-Algoritmos x Fluxogramas 192 CONCEITOS BASICOS 1.1 Introdugao ao Conceito de Algoritmo ““Atualmente acho que estamos atingindo o estdgio de descobrir, finalmente, como as linguagens de programacao devem ser. Espero ver valiosos experimentos sérios em projeto de linguagem de programacio durante os préxmos anos, sendo meu sonho ver, por volta de 1984, 0 desenvolvimento de um consenso sobre uma linguagem de programacio realmente boa (ou, mais provavelmente, uma familia mu capaz de apostar que as ficar tdo desiludidas com as linguagens que esto usando forma lentamente ... Bastando pesquisa ser feita, se € que vamos ter a linguagem desejada por volta de 1984.” (Knuth 1974) Conceltos Bésicos 1 fecisamos reconhecer a influéncia poderosa inegdvel que nossa linguagem exerce sobre nossa maneira de pensar, ede fato define delimita o espaco abstrato no qual podemos formular - dar forma - ‘nossos pensamentos.” (Wirth 1974) "A linguagem é 0 vefculo pelo qual expressamos nossos pensamen- tos ¢ a relagio entre esses pensamentos € nossa linguagem € sutil e complexa. A natureza da maneira como pensamos ... Se, fornecendo construgdes _lingilisticas apropriadas, pudermos melhorar os programas escritos, usando estas cestruturas, toda a drea seria beneficiada ... Um projeto de linguagem deve, pelo menos, fornecer meios que permitam a expresséo ‘compreensfvel de algoritmos; idealmente uma linguagem sugere formas de expressfio. Mas a linguagem no € uma panacéia. Uma linguagem nao pode, por exemplo, evitar a criagio de programas obscuros: 0 programador engenhoso sempre encontra um ntimero infinito de caminhos para a confusdo," (Walt 1977) 111-0 Papel da Abstracio Para automatizarmos um procedimento manual, precisamos reproduzir seu comportamento através da execucdo de um programa de computador. Isto €, os programas podem ser pensados como modelos (receitas) destes procedimentos manuais. Como qualquer modelo, um programa de computador ¢ uma abstragdo da realidade. A abstracio € 0 processo de identificar as propriedades relevantes do fendmeno que est sendo modelado. Usando 0 modelo abstrato, podemos nos con- ‘entrar unicamente nas propriedades es para nés, dependendo a finalidade da abstracdo, e ignorar as irrelevantes. 2 Inodugdo 20 Desenvolvimento de Algorimos 1.1.2- Abstragao de Dados Linguagens a nivel de maquina encaram os dados armazenados como seqiiéncias de bits, que podem ser manipuladas pelas instrugdes da maquina, O repertério de instrugées inclui deslocamentos, ‘operagoes l6gicas, aritmética de ponto fixo e varias outras operagdes. ‘Um primeiro passo na diregdo de introduzir abstragdes de dados foi dada por FORTRAN, COBOL e ALGOL 60. Netas linguagens, a informagio armazenada em determinadas posigGes da meméria é vista como valor inteiro, um real, um valor légico, ou alguma outra coisa. A decisio sobre q de dados incluir em uma linguagem de programagao foi ditada principalmente pelas méquinas para as quais a linguagem era destinada, 1,13 - Sintaxe e Semantica Uma linguagem de programagio & uma notagio formal para descrigdo de algoritmos que sero executados por um computador. Como todas as notagbes formais, uma linguagem de programagio tem dois componentes : Sintaxe e Semantica. A sintaxe consiste em um conjunto de regras form: especificam a composicao de programas a partir de ‘outros simbolos. Por exemplo, regras de sintaxe podem especificar que cada parénteses aberto em uma expressdo aritmética deve cor- responder a um parénteses fechado, e que dois comandos quaisquer devem ser separados por um ponto ¢ virgola, As regras de semantica especificam 0 "siginificado" de qualquer programa, sintaticamente valido, escrito na linguagem. 1.1.4- Processamento de Linguagens Embora seja teoricamente possivel a construcdo de computadores especiais, capazes de executar programas escritos em uma linguagem de ~Conceitos Hésicos 3 programacéo qualquer, os computadores, existentes hoje em dia sao capazes de executar somente programas em linguagem de nivel baixo, a linguagem de maquina. Linguagens de méquina sdo projetadas em funcao da rapidez de execugio de programas, do custo de sua impiementagao ¢ da fle ide com que permite a construcio de programas de nivel mais alto. Por outro lado, linguagens de rogramacdo de alto nivel so freqiientemente projetadas em funcio da facilidade na construcio e da confiabilidade de programas. © problema basico, entéo, é como uma linguagem de nivel mais alto pode ser implementada em um computador, cuja linguagem de maquina é bastante diferente, e de nivel bem mais baixo. A solucdo € fazer com que um computador, que s6 iguagem de maquina se comporte como se entendesse uma linguagem de programacio de alto nivel, utilizando programas "tradutores’, escritos em linguagem de maquina, capazes de traduzir um programa escrito em linguagem de alto nivel para linguagem de méquina. Os principais tipos de tradutores estdo citados abaixo: + Interpretador Nesta solugéo, as ages indicadas pelos comandos da linguagem sao diretamente executadas. Em geral, existe para executar cada ago possivel um subprograma (escrito na linguagem de méquina do com- putador hospedeiro). Assim, a interpretagdo de um programa é feita pela chamada daqueles subprogramas, em uma seqiiéncia apropriada. Mais precisamente, um interpretador € um programa que executa repetidamente a seguinte seqiiéncia: 1- Obter o préximo comando do programa. 2 Determinar que acdes devem ser executadas. 3- Executar estas agées. 4 Introdugéo ao Desenvolvimento de Algoritmos Esta seqiéncia é bastante semelhante aquela executada por com- putadores tradicionais, a saber : 1 Obter a préxima instruedo (aquela cujo endereco é especificado no indicader de Insinugbes da maquina). 2+ Deslocar 9 indicador de instrugdes (obtendo 0 endereco da préxima instrugde a ser executada). 3+ Decodificar a instrugao. 4- Executar a instrugao. Esta semelhanga mostra que a interpretacdo pode ser encarada como a simulagdo, em um computador hospedeiro, de uma maquina especial cuja Inguagem de maquina é a linguagem de nivel mais alto, - Tradutor Nesta so'uco, programas escritos em linguagem de alto nivel sto traduzidos paca versoes em linguagem de maquina, antes de serem executados. Essa tradugdo é feita em varios passos. Por exemplo, sub- programas podem ser inicialmente traduzidos para cédigo de ‘montagem (assembly code), este pode depois ser traduzido para codigo relocdvel em inguagem de maquina, em seguida, unidades em cédigo relocével podem ser ligadas em uma tinica unidade relocé ‘mente, 0 programa inteiro & carregado na meméria pri c6digo executivel de maquina, Os tradutores usados em cada um destes passos tém nomes especiais : compilador, montador, ligador (ou editor de ligagdes) € carregador, respectivamente. 12- macao Convencional izer que os passos seguidos na programagao conven- ional so os seguintes: Conceitos Bésicos 5 ROGRANADOR TAROUTOR (8. PAss0) (22. Passoy Attarefa do programador (ser humano) consiste em "empilhar” um ‘grupo de instrugoes, em linguagem de alto nivel, numa tal seqiiéncia que quando o programa for executado, gere a solugao do problema, que fica totalmente dependente da linguagem utilizada. A fungio do tradutor (programa em linguagem de méquina, denominado de interpretador ou compilador) é a de converter 0 Programa escrito em linguagem de alto nfvel em um programa executével, isto é, em linguagem de maquina. _13 -Programagio Estruturada 13.1 - Refinamento Sucessivo "Top-Down" ay Definiremos, em linhas gerais 0 proceso criativo que leva a ‘concepgio de um programa. A solugdo de um problema através de um Programa é usualmente, caracterizada por um conjunto incompleto ¢ do organizado de propriedades, que imaginamos que o programa deva vir ter. Mais ainda, a concepgao do programa tende ainda a depender da pessoa que o concebeu. Esta concepcdo (descrico da solugio) deve ser documentada de uma forma organizada, para que possamos ter uma definigdo precisa do problema a ser resolvido. Este documento deve luzir em seus leitores, o mesmo entendimento do problema a ser resolvido. E neste ponto que entra o conceito de programacio estruturada, como ferramenta essencial para tratamento da complexidade de problemas, Nossa ferramenta mental para tratar da complexidade é a abstragdo. Um ploblema complexo nao deve ser imediatamente tratado 6 Introdugao 4 Desenvolvimento de Algoritmos a nivel méximo de detalhes, ou seja, em termos de instrugoes de com- Putadores, e sim por uma linguagem que represente a solucao com mais, clareza, reduzindo o nivel de detalhes a um grau tolerdvel. O método Top-Down consiste em decompor o problema em uma ‘de subproblemas menores e mais "féeeis" de serem resolvidos Ou seja, dado um problema P podemos decomp6-lo nos P.2,P_3, . PN de tal forma que,resolvendo estes ‘er-se-d Tesolvido o problema P. Esta técnica pode ser aplicada a cada um dos subproblemas P_K,K = 1...N. A decomposicao dos subproblemas deve ser feita até que as "subsolugoes" estejam expressas através de um conjunto de agdes elementares, passiveis de execugdo por um humano ou por uma maquina, ‘© problema deverd ser especificado. A necessidade de al invalida 0 processo de construgéo por refi torna possivel a preocupacdo com detalhes no nivel adequado ao ponto fem que se esta no processo de refinamento sucessivo. Procedendo para se poder formular, completa e corretamente, a solugio do problema a ser resolvido, Conceitos Bésicos ie 1.3.2 0 Coneeito de Aigoritmo e Estruturas de Dados (Wirth) iimo é um texto (do tipo ree 2 bolo) onde cada linha Sea aioe 8 legs a executado, & a de agir (operar) sobre os dados, informagoe operacionai Figura 2 Note que 8 Inroduedo ao Desenvolvimento de Algoriimos mo & composto por um grupo de agdes primitivas isde execucdo por um humano ou por uma maquina). As ue utilizaremos na construgio de algoritmos serdo tamos assumindo que exista um computador hipotético capaz de executé-las, ‘Uma agio $ um evento que ocorre emum perfodo de tempo finito, € com um efeito bem definido. Quando colocamos uma determinada agdo em um algoritmo, é porque estamos interessados no efeito que ela iré produzir quando o algoritmo for executado. Oefeito de uma acdo pode ser descrito, comparando o estado do conjunto de objetos (sobre o qual a acdo iré agir) antes da acdo ser executada, com oestado do conjunto de objetosap6s a execugao da agao. Exemplo: Dado 0 conjunto de objetos K Se tivermos: K = {A,B,C} ; estado antes da execugdo da ago K = {C,B,A}; estado depois da execugio da agao entio a agdo serd descrita por : "eolocar os elementos de K em ordem inversa” ‘Oestado de um conjunto de objetos pode ser descrito como sendo o conjunto de propriedades desses objetos, que sdo relevantes para nés, na situacdo considerada. jideramos um evenio como uma seqiiéncia temporal cujo efeito acumulado (devido a execugio de cada uma das agbes) é igual ao efeito total do evento, temos um processo, Jogo um evento pode ser considerado como uma agdo primitiva ou um processo, deperdendo se estamos interessados no efeito total ou em efeitos intermediérios. Dizemos que dois eventos tém o mesmo padrao de comportamen- to, se eles puderem ser descritos por um mesmo relato. Se este relato for detalhado, ro sentido de descrever todas as acdes que devem ser Conceitos Bésicos 9 executadas para que um outro evento semelhante aos eventos obser~ vados ocorra, podemos chamé-lo de algoritmo. Logo, construir um algoritmo € descrever um padrao de comportamento, a partir de agbes rimitivas, possibilitando a reproducdo de um evento (mesmo padrio de comportamento) a cada execucao do algoritmo. 4... A forma na qual os dados esto organizados € denominada de ‘estrutura de dados’. As estruturas de dados utilizadas no algoritmo para Tepresentar a organizagdo dos dados que serao tranformados, durante "execugao" do algoritmo, em informagdes, exprime uma ligacdo fntima entre a formulacdo de algoritmos e estruturas de dados, segundo Wirth, "programa = algoritmo + estrutura de dados". __. Podemos dizer que os passos seguidos na programagio estrurada, utilizando a técnica de construgao de algoritmos, so os seguintes: [oescnioke oe ete mr [peGRaMADR (paso) [(ALeontTWoIJear paseo} TaabuTon fo Passo ‘A funcdo do programador no 1° passo é de conceber a solugao do Problema e deserevé-la em uma linguagem algoritmica ("portugués estruturado’). No2® passo, o programador iré apenas traduzir as agGes primiti que compéem o algoritmo, para instrugdes disponiveis em uma lin. guagem de alto nivel, adequada para o problema (linguagem redigivel), sem ter que se preocupar com a solugdo do mesmo, uma vez que a execugdo do algoritmo, a priori, valida a solucéo do problema Introdugao ao Desenvolvimento de Algoriimos Algum leitor eriticojé deve estar questionando o aumento expres- sivode trabalho parao programador, e deve estardizendo que 0 12passo pode ser "queimado", bastando descrever a solucao do problema direta- ‘mente em uma linguagem de programacao de alto nfvel (programagdo ional). Mostraremos alguns aspectos da programagao estruturada, impraticdveis na programacdo convencional e que séo de fundamental importdncia durante o ciclo de vida de sistemas (conjunto de programas). ~ Inteligibilidade Umalgoritmo possui este atributo a medida em que seu pro € sua organizagao sao compreensiveis ao observador. Caracteristica dificil de ser encontrada em programas por mais simples que possam parecer, isto é, um programinha de dez ou quinze linhas, geralmente, ele foi escrito, imagine para quem nao conhece esta linguager acontece com os algoritmos, pois esto escritos em um: ‘Um algoritmo possui este atributo a medida inversa do esforco para implementé-lo em outro ambiente de programacio (outra lin- guagem). A conversao de um programa para outra linguagem é essen- cialmente complicada, pelo fato da solugdo do problema em si, estar ligada 4s caracterfsticas da linguagem na qual ela foi concebiba. Isto nd0 acontece com 0s algoritmos, pois a solucdo foi "pensada em portugués” € pode ser implementada em qualquer linguagem de programaclo que seja natural para o problema . - Confiabilidade Um algoritmo possui este atributo a medida em que possibilita a ico da solugéo do problema (teste a priori). Em programas, a ide da solucdo 86 pode ser verificada apés sua execugio, provoci do um aumento expressivo no custo do sistema, devido ao ciclo (er70,..,tentativa,...acerto) que consome um tempo consideravel de (nora maquina). - Manutenibilidade Um algoritimo possui este atributo & medida em que facilita @ incorporagio de alteracdes. As alteragées so responséveis por 40% do ‘custo total de sistema, devido a dificuldade em alterar programas. Isto acontece porque a solugio pensada como um todo, diferentemente dos algoritmos onde cada bloco desenpenha uma funcao bem definida, fazendo com que a alteracao se transforme em substituigéo de blocos funcionais, geralmente muito mais simples que o problema como um todo. Um programador "engenhoso" jé deve estar pensando em um programa capaz de substituir 0 programador na execugio do 2° passo. ‘ativa de otimizagio nao é viével devido ao aumento da in- , conseqtiéncia do formalismo que devers ser imposto a0 nosso "portugués estruturado’, para que o programa "tradutor’, seja capaz de transformar 0 "texto algoritmico" em um “texto programa’, Entretanto, se oleitor gostar de problemassuculentos, aimplementagao deste "tradutor" é uma sugestao! 12 Inrodugao a0 Desenvolvimento de Algoritmos = _ CAP2 ol eee DESENVOLVIMENTO DE ALGORITMOS 2.1 -Meméria e 0 Conceito de Varidveis Nos computadores, dispositivos chamados de "mem6ria" (Ar- quitetura Von Neumann) permitem que as instrugdes a serem executadas e 0s dados a serem manipulados sejam armazenados tem- porariamente. Esta mem6ria pode ser vista como um "armario compos- to por muitas "gavetas" que sdo chamadas de varidveis. A designacio "varidveis" € devido ao fato de podermos substituir seu contetido quando necessério, Todas as variaveis (gavetas) devem receber um nome para sua identificagéo, estes nomes so denominados de identificadores. — mae (om “wendnia’ "VARIAVEL" NOME OA VARIAVEL.“ icoineeeh Figura Desenvolvimento de Algoritmos 13 = Tipos Primitives de Dados ‘Toda varidvel pertence a um tipo de dado que define o conjunto devvalores que ela pode receber (armazenar), assim como 0 conjunto de operadores que podem agir sobre a mesma, “Tipos primitivos" so tipos de dados. predefinidos pela linguagem de programacio que se esté utilizando. Iremos assumir que 0 nosso computador hipotético reconhega quatro tipos primitivos de dados : REAL Pode armazenar qualquer valor pertencente ao con- junto dos nimeros reais. INTEIRO Pode armazenar qualquer valor pertencente ao con- junto dos nimeros inteiros, CARACTERE lemento pertencente a LOGICO Pode armazenar apenas as constantes FALSO ou VERDADEIRO. ~ Identificadores (Os nomes devem obedece' thidos para rotular as varidveis, -guintes regras : 1-O primeire caractere deve ser uma e ra e8 pertencentes a0 .} 3- Os nomes escolhidos devem explicitar seu contetido Ex: total_do_alunos.num_parcelas slario famfliasAlario_13., desc_inps, horas-earas 2 Os nomes devem ser formados por cara seguinte conjunto : { A.B. 14 Introdugto a0 Desenvolvimento de Algorimos 2.1.2 - Declaragao de Varidvels e seus Operadores Declarar uma varidvel significa reservar uma "gaveta’ na meméria, 1e um rotulo, (nome que serve para identificd- la "identificador'). ‘de dados com o qual a varidvel € declarada serve para especificar © conjunto de valores que ela pode armazenar. Exemplo: __DECLARAGAO DE VARIAVEIS. INTEIRO : total ; Alinha acima, declara a varidvel "total" como sendo do tipo inteiro, logo a gaveta que acabou de ser rotulada como "total" s6 poderd ar- ‘mazenar valores pertencentes ao conjunto dos niimeros inteiros. q Além de limitar o conjunto de dados, a declaragao de tipos define © conjunto de operadores que podem agir sobre a varidvel. + Operadores Aritméticos Simbolo Fungéo Disponivels + Adligdo - al 7 ‘Subtragdo inteiro , real * Mutipicacéo inter, eat ! Dhisdo Real Inter, reat, f Exponenciagio Intro, rea Moo Resto da dvisto intra Inte ov Quociente da divisso itera intro - Operadores Relacionais Simbolo Fungso Tipos Disponiveis 5 igual todos <> Diferente todos BS Maior ou igual que todos <= ‘Menor ou igual que todos Desenvolvimento de Algorlmos 15 - Operadores Légicos Simbolo Fungéo Tipos Disponiveis E Conjungao '6aleo ou Dislungo (ndo exclusiva) \6alco xou Disjungdo (exclusiva) Wealeo NAO Negagao lgico 2.1.3 Fungoes Primitives Assumiremos a fungbes abaixo, estdo dispontveis no nosso computador hipotético : SENG) Retoma 0 seno dex Coste) Retoma 0 cosseno de x TE09 Fatoma a tangente de x ABS(H) Retorna o valor absoluto de x INTO) Retorna a parte inteira de x EXPO) Retorna 0 nimaro (e) elevado ax LNG) Retorna o logaritmo de x na base (e) Loge) Fetoma o logartmo de x na base (2) 'SOR(x) Retoma a raiz quadrada de x Obs : O leitor pode introduzir novas fungbes e novos operadores de acordo com suas necessidades, tornando a linguagem mais proxima da sua area de atuagio. 2.14 - Prioridade de Execugio dos Operadores nas Expressbes Mistas Durande a execucdo de uma expresso que envolve varios operadores, € necesséria a existéncia de prioridades, caso contrério poderemos obter valores que nao representam o resultado esperado. 16 Inroducdo a0 Desenvolvimento de Algorimes Exemplo: 5 +873 © resultado sera 29 0439? expressio acima, a primeira operagdo a ser efetuada serd do e depois a adigdo, neste caso 0 resultado € 29. Se esti fessados no resultado 39, devemos usar 2 seguinte notagio: m mos G+ Isto nos mostra que devemos definir uma ordem de prioridades que deve ser seguida : 18 - Efetuar operagdes embutidas em Parénteses "mais internos” 2°. efetuar Fungoes 4° efetuar adigdo e/ou subtragio 58 operadores relacionais 69 operadores légicos NAO , E, OU, XOU “2.1.5 -Declaracio de Constantes que nao se moditica emo (programa). Por rer do curso, a média série de fatores, mas 0 declard-lo como sendo ices modelo DECLARACAO DE CONSTANTES ‘num_avallagies,= 4; numcatanes = 40 Rumovagie = 430 Desenvolvimento se Algoriimos 17 ivas todas as agdes que 0 nosso com- putador hipotético € capaz executar (estas agdes serao introduzidas no decorrer deste e do proximo AS tarefas executadas por um ‘computador, ne maioria das vezes sao compostas por dezenas de acoes, ido da execugdo de dezenas ou talvez milhares (dependendo da "tarefa") de acoes execu computador re: 22:1 - Comando de Atribuigdo ‘ser executada em um dado seguini TOTAL «78 ; Figura 5 (© valor 78foi armazenado na "gaveta" rotulada com "t "BBE Comandos de Enitada e Sada stamps interessados nas formas de entrada e saida de dados, 18 Introdugdo ao Desenvolvimento de Algoritmos ENTRADA 0= ADS stibh DE INFORMED Te ESCREVA Figura 6 intaxe dos comandos de Entrada e Safda LEIA (di,d2,d3,...,dn) onde dl,d2,...dn sao dados lidos de um dis- positive qualquer. escritas em um dispositive qualquer. EXEMPLO 2.2.2. Construir um algoritmo que: aritmética e escreva o resultado. ia duas notas, calcule a média 0 das INICIO { agoritmo para caloular a med DECLARAGAO DE CONSTANTES num_nolas = 2 DECLARAGAO DE VARIAVEIS REAL: nota pt, nota p2, médias entrada de dads} 1 FIM. {algoritmo} Observagio: = Os comentarios podem ser introduzidos em quer ponto do algoritmo, bastando que estejam entre chaves{}. de informagdes ESCREVA, 0 que esta entre aspas € um comentario e ndo afeta o resultado. Por exemple, se as notas lidas fossem 4 ¢ 6, 0 resul tado seria média = 5. Desevolvimento de Algoritmos 19 (23 - Estruturas de Controle de Fluxo_ Durante a execucéo de um programa as agoes pri (instrugées) nem sempre sio exe escritas. Isto ocorre porque mi que 0 computador execute uma seqléncia de a ne Um bloco pode ser definido como uma seqiiéneia de agdes primitivas, que como um todo, po o bem definida, neste caso, um algoritmo pode ser visto como um Exemplo: | dectaragé seqincia de agées primitivas FIM. {bloc 2.3.2 - Seqiiéncia Simples Seqliéncia Simples é um conjunto de agdes primitivas que sero executadas numa seqiiéncia linear de cima para baixo, executadas na mesma ordem em que for devem ser sempre seguidas po: 20 Inirodugdo ao Desenvolvimento de Algoriimos modelo INICIO {algritmo} DECLARACAO DE VARIAVEIS ta de varios. {bloso} pl; api Inc Seqhéncia Simples | Lap: |_FIM; fbloco} FIM, falgoritmo} Observagio: 23.3 - Estruura Podemos fuzer com que um bloco seja ou ndo executado, depen- dendo do resultado obtido na inspegdo de uma condigao, que pode ser falso ou verdade'to. 243.1 Alteraativas Spies modelo -B apn 21 ‘modelo -A Se (condi¢ao_A) for satisfeita, entao 0 "bloc verdade” (seqiiéncia de acées_p_1, ap2,.., ap N)serdexeeutado. ‘modelo - B Se (condicio_B) for satisfeita, entdo a acto primitiva “a_p" sera executada, Observacio: (condi¢do) é uma expressao logica que, quando ins- pecionada, pode gerar um resultado falso ou ver- dadeiro. EXEMPLO 2.33.14, Construir um algoritmo que ; dado um ntimero, verifique se ele € ar. PAF MIC10 falgramo aero pet) DECLARACAO DE VARIAVEIS INTEIRO =n LEIA (n); SE (a MOD 2) = 0 (resto igual a zero} ENTAO ESCREVA ("este ntimero ¢ par); FIM, 2333 Aliemativa Composia modelo modelo -B SSE (condigio.A) SE (condigio_B) ENTAO ENTAO op INICIO {bloco verdade} SENAO apd: INICIO, (boco also} jad apn; M | apni SENAO FIM aps 22 Introdugao ao Desenvolvimento de Algormi0s modelo - A Se (condigio_A) for satisfeita, entdo apenas a acdo primitiva"a_p’, serd executada, caso contrario, (sendo) o bloco falso serd executado. modelo -B Se (condigio_B) for satisfeita, entéio 0 "bloco verdade" seré executado, caso conirdrio, (Sendo) apenas a ago primitiva "a_p" seré executada. observagio: nao existe";" no fim de bloco verdade, pois a proxima nha ndo deve ser executada. EXEMPLO 2.33.2.A Construir um algoritmo para caleular as rafzes de uma equagio do 2 grau. INICIO {algorimo} | DECLARAGAO DE VARIAVEIS | REAL: a,b,, dela, x1, 25 LEIAG,b,0); delta = b* b= (4%ate); SE delta < 0 ENTAO. ESCREVA( Notion tre) SENAO_ k aie (-b + SOR(delta)) / (2* a) 5 Zo (a.sontambiees | ESCREVA(‘raizl =", x1, “raiz2 = | eats FM. ine} Desenvolvimento de Algoritmos 23 23533 Alterna Ania Podemos egrupar varias alternativas a fim de inspecionar uma ou mais condigoes. ‘modelo SE (cond_1) ENTAO agiot SENAO SE (cond 2) ENTAO acdo_2 SENAO SE (cond 3) ENTAO, asio3 ¥io_I" serd execu- serd Inspecionada e 1, eNtdo a "agdo_2” ser executada, caso contréio (Sendo) (coad_3) sera inspecionada e se for “aco_3” serd executada. observagéo: —“acio_n” pode ser uma seqiiéncia de acdes primitivas (bloco). EXEMPLO 2.333. Construir um algoritmo que: podem ser {qual € 0 tipo de iriangulo? (esca 24 inrodugéo ao Desenvolvimento de Algonimos INICIO {slgoritmo} DECLARACAO DE VARIAVEIS INTEIRO :2,b,¢} LEIAG,b,0)5 SE(a0) FACA, INI {bloco enquanto} SE mencr_yabr < wr ENTAO menor valor valor; J EELAGalon ; FIM; fenguanto} | ESCREVA(menor valor); FIM. {algorimo} EXEMPLO 23.4.1.D Construir um algoritmo que : dado um conjunto de valores, deter- minar 0 maior eo menor valor do conjunto. Observagio: _ O valor 0 ndo deve ser considerado (finalizador) 32 Introdugio ao Desenvolvimento de Algoritmos DECLARACAO DE VARIAVEIS INTEIRO :valor, menor valor, maior valor LEIA(alor) ; | menorvlor = valor; maior salor + valor ENQUANTO (valor < > 0) FACA INICIO {bloco enquanto} ‘SE menor_valor’ > valor |" ENréo) SENAO SE maior valor < valor ENTAO \ major_valor = valor; | _ FIM; fenguanto} | ESCREVA(menor valor, mior_val FIM. {algoitmo) EXEMPLO 2.3.4.1.E lor « valor Construir um algoritmo para calcular a média aritmética de um conjunto de valores inteiros positivos. observagdo: — Ovalor (-1) nao deve ser considerado (finalizador) INICIO {algorto} | DECLARACAO DE VARIAVEIS INTEIRO : valor soma_salor et LELA(Galor); soma_valor <0; ano; ENQUANTO (valor <> -I) FACA INICIO {bloco enguanto} soma, yalor « soma_valor + aea+l; LBIA(alor) FIM ; {enquanto} | ESCREVA(Média =" , soma_valor/ 1. Resoluciio: Observe que cada termo do produt6rio é igual ao termo anterior menos 1, neste caso, iremos construir um lago de repetigoes, de forma que a varidvel de controle (que chamaremos de "termo") sofra uma variagdo de N até 1, sendo decrementada de 1 a cada passagem no interior do lago de repeticao. INICIO {algoritmo} | DECLARACAO DE VARIAVEIS INTEIRO =n, produto, termo ; LELA(a); produto 1; PARA termo DE n ATE 1 PASSO -1 FACA produto + produto * termo ; ESCREVA (produto) ; FIM. {algoritmo} -comando ABANDONE ma devem ser isfeita, entao is Vezes ocorrem situagdes em que as repet as, isto &, se uma determinada condicao for s abandone o lago. EXEMPLO23.43.D ‘Suponhamos que 0 maior valor que uma varivel do tipo inteiro possa armazenar saja 32000. Se ndo soubermos qual 6 0 maior valor de N, tal que NI (fatorial de N) seja menor que 32000, entao podemos utilizar 0 comendo ABANDONE para evitarmos um "estouro de meméria’, isto é, evitar a tentativa de armazenamento de um valor que nao cabe na variével (gaveta). Desenvolvimento de Algoritmos 39 INICIO fagoritmo} DECIARAGAO DE CONSTANTES limite nteiro = 32000; DECLARACAO DE VARIAVEIS INTEIRO 2, produto termo; LCGICO::aealon; | uetae); | rockin 1; | calcula ~ VERDADETRO; | PARAtermo DE n ATE 1 PASSO -1 FACA | INcIO SE (produto *termo > lite intro) ENTAO iwicio ‘aleulou ~ FALSO; | | Seawooe IM | SENAO produto ~ produto * termo: FU; SE calulou ENTAO 2.4- Exercicios 1 - Construi: a estruturas REPITA e ENQUANTO. 2 - Ovalor ée sen x pode ser obtido com boa aproximagio através dos 30 primeiros termos da série a seguir: Introdugéo ao Desenvolvimento de Algoritmos rritmos para calcular o fatorial de N, utilizando as senx = construirim algoritmo que dado o valor de x, eserever quanto vale senx. mo para obter o (sen x), de tal forma que niimero de repeticoes seja controtado pela'seguinte expresso: Construirnovo termo, enquanto seu valor absoluto for maior que .00001 4-O valor dee* pode ser obtido com boa aproximagao através dos 30 primeiros termos da série abaixo: construir um algoritmo para obter 0 valor de e%, sendo x um niimero ¢ado. eros inteiros A e Btal que A > Oe B > Aconstruir :mo que encontre todos os niimeros primos existentes entre AcB. 7-Dado um niimero inteiro positivo (hase 10), construa um algoritmo para tran‘ormé-lo em bindrio, Desenvolvimento de Algoriimos at dobro do quadro anterior. O rei achou o trabalho barato, pedi gue 0 servigo fosse executado, sem se dar conta de que seria impossivel efetuar o pagamento. Faca um algoritmo para caleular oniimerode gros que o sabio esperava receber. 9 - Dado um pais A, com 5.000.000 de habitantes e uma taxa de natalidade de 3% ao ano, e um pais B com 7.000.000 habitantes e uma taxa de natalidade dé 2% ao ano, Construa um algoritmo que caleule quanto tempo € necessério para que a populacao do pats A.ultrapaise a populagao de pais B. 10 - Uma empresa de fornecimento de energia elétrica faz leitura mensal des medidores de consumo. Os dados estao dispostos em fichas da seguinte forma: - ntimero (c6digo) do consumidor ~ quartidade de kWh consumidos durante o més = tipo ic6digo) do consumidor 1 -resideneial prego por kWh = 50,00 2- comercial prego por kWh = 61,00 3 industrial prego por kWh = 107,00 Obs: A iiltima ficha contém 0 cédigo do consumidor igual a zero € ndo deve ser considerado (finalizador) Construirum algoritmo a ule =o custo para cada consumid le consumo para os 3 tipos de consumidor Ge consumo dos tipos 12 Escreva = para cad: consumidor: e6digo do consumidor , custo a media ée consumo dos tipos 2e 3 0 total de consumo dos 3 pos 11 - Construit um algoritmo para uma empresa de telefonia que esta interessaca em um relatério, contendo, 0 cédigo do @ classe tarfaria (1,23) e 0 nimero de pulsos. Este relat6rio $6 deverd canter os assinantes, cujo nimero de pulsos € 0 maior entre os nimeros de pulsos de sua classe tarifaria, Os dados estio 42 Introdugao ao Desenvolvimento de Algoritmos dispostos em fichas, sendo que a tiltima ficha contém cédigo do assinante igual a zeto (finalizador). 12 - em uma eleigdo presidencal existem 5 candidatos, Os votos foram registrados em fichas. Cada ficha contém um dos eédigos relacionados abaixo: 1, 2,3, 4, 5- voto paras os respectivos candidatos 6 voto mulo 7-voto branco Construa um algoritmo que ~ Leia as fichas = Calcule total de votos para cada candidato total de votos nulos total de votos em branco 9 percentual de ocorréncia para cada um dos e6digos ~ Escreva totos os valores obtidos no item anterior 13 - Construit um algoritmo que escreva 0s 30 primeiros niimeros primos (235.711 13,190) 14 - Dada uma seqiiéncia de letras, construa_um algoritmo para localizar a letra que ocorreu mais vezes ¢ determine o némero de ocorréncias. Considere que o caractere"*" seja o finalizador. OBS.: A seqiiéncia de letras esta em ordem alfabética 15 - Dados dois niimeros inteiros A.e B, construa um algoritmo para calcular a soma de todos os inteiros existentes entre A e B. 16 - Dada uma sequéncia de néimeros reais, construa um algoritmo que: - calcule média aritmética o percentual de valores abaixo da média o percentual de valores acima da média a razao entre 0 maior € 0 menor valor Desenvolvimento de Algoritmos 43 ESTRUTURA DE DADOS 10s Estruturados) cada varidvel tem por sua vez, uma , esta faixa de valores denominada de" em sempre sdo suficientes para representar osdados emum: 10. Construiremos novos tipos, denominados de radios", a partir da composicdo de primitivos. Estes novos tipos tém uma estrutura (estrutura de dados) que define edmo s dadk organizados, A estrutura de dados criada a partir de pos ai te soja, 440 Introdugao ao Desenvolvimento de Algortmos “31.1 Tipo Esealar tipo é definido como uma seqiiéncia de elementos que jem um conjun consti Exemplo: DECLARAGAO DE TIPOS dia = (dom, seg, ter, quit, qui DECLARACAO DE VARIAVEIS semana} SUCC(tipo_escalar)- — retornao ipo escalar) portanto esta fu ipo escalar. PRED(tipo_esealar)- _ retorna o predecessor lar) tanto esta funcdo € do tipo escalar. ORD(tipo_escalar)- _retornaaordem (posigdo) no co) tanto esta funcdo é do tipo int Exemplo: SUCC(se) - _retorna o sucessor de tanto ird retornar "ter" PRED(sex)- _retorna o predecessor de "sev" portanto ir retornar ORD(qua) - a posigto (ordem) de "qua dentro do conjun- Estruturas de Dados 2 45 Observagio: So definidos implicitamente como escalares os tipos primitivos CARACTERE, INTEIRO e LOGICO portanto estes tipos primitivos podem ser argumen- tos das fungdes acima, Exemplo: ‘SUCC(25)- _retorna o sucessor de 25 no conjuto (1,2,3,.. logo iré retornar 26 PRED(G)- _retorna o predecessor de "G" no conjunto (A,B,C...) logo iré retornar "F* retorna a posicao (ordem) de "J" no conjunto ORDG)- (ABC...) logo ird retornar 0 valor 10 “312 Tipos Subfaixas Este tipo é definido como uma "subfaixa" de um (dado) tipo escalar. Exemplo: DECLARACAODETIPOS dias = (domseg,ter,qua,qui.sexsab) ; {tipo escalar} dia_ttil = seg..sex; {tipo subfaixa} teste = A..E; {tipo subfaixa} DECLARACAO DE VARIAVEIS dias :dias_semana dia_itil: dias_trabalho ; teste: respostas 5 46 Iirodugéo ao Desenvolvimento de Algorimos Observacées: - A variavel "dias_semana’ foi declarada como sendo do tipo "dias" logo s6 poder4 armazenar valores per- tencentes a este conjunto, ibalho"foi declarada como sendo »g0 86 poderd armazenar valores ertencentes a este conjunto, ou seja, seg, ter, qua, Qui, sex. ~ A declaragio de tipos nao dectara variaveis, portan- to estas devem ser declaradas explicitamente como no exemplo acima. 3.2 - Estruturas de Dados Homogéneas 32.1-Vetores Acstrutura de dados mais comum nas linguagens procedurais, é 0 vetor (array). Esta estrutura permite a definigéo de um conjunto limitado de variévzis (todas do mesmo tipo e virtualmente como mesmo nome) acessiveis por um indice. Por este motivo, algumas vezes, esta estrutura é chamada de 'varidveis indexadas", Em termos de "memGria’, esta estrutura tem uma alocacao contigiia, ou seja, quando esta estrutura é declarada, ocorre a reserva de um niimero de "givetas” igual ao nimero de elementos declarados e, portanto, o ntimeto de elementos (variveis com mesmo nome, porém com indices diferentes), é sempre limitado pela "capacidade de ar- mazenamento" dameméria disponivel. Por exempo, supondo que um aluno tenha 4 notas, podemos declarar as varidveis necessérias para armazené-las da seguinte forma, Estruturas de Dados 47 doclarago usando deciaragao usendo Tipo Primitivo Tipo Estruturado DECLARAGAODE VARIAVEIS. DECLARAGAO DE TIPOS REAL: nt .n2,n3,.n4 v = VETOR [1..4] DE REAL; DECLARAGAO DE VARIAVEIS COW! etatste/) 10. passo que no famos apenas v = VETOR [1.200] DE REAL ; O tipo notas fosse 200, se tipo estruturado, EXEMPLO 3.2.1.4, faturamento mensal idades esto em uma rmo capaz de calcular nde Os precos € as quar \dos da seguinte forma -Prego: p_1,p_2,p3, =» p_1000 ~quantidade :q_1, 42, 43, =, 41000 FATURAMENTO = (¢_1xp_! §=1,2,3, .., 1000 + (q2xp2) t+ (izpi) 48 Introdugao ao Desemvolvimento de Algoritmos INICIO {algoritmo faturamento} | DECLARACAODETIPOS vet = VETOR[1..1000] DE REAL; DECLARACAO DE VARIAVEIS vet: quantidade, prego; INTEIRO:i REAL: fat_mensal vvfat_mensal « 0; © PARA i DE 1 ATE 1000 PASSO 1 FACA INICIO {bloco para_i_variar} | LETA(precoy i + {para_i_variar} ESCREVA(Faturamento Mensal = ",fat_mensal) ; FIM. {faturamento} EXEMPLO3.2.1.B Construir um algoritmo que leia um conjunto A de 100 elementos, construa e imprima outro conjunto B da seguinte forma: Os elementos de ordem par so correspondentes a A/2. (Os elementos de ordem impar so correspondentes a A*3 ie <5 12 304 55 aBls[4]2[s}—~ 8 bla [ 2 Esiruturas de Dados 49 DECLARAGAO DE TIPOS yet = VETOR [1.100] DE REAL; DECLARAGAO DE VARIAVEIS vel PARAlago DE 1 ATE 100 PASSO 1FACA INICIO {bloco pera} ENTAO {par} bllago] + aflago]/2 SENAO {impat} bilaga} = flag] * 35 FIM; {para} I ESCREVA (b) ; FIM, {algeitmo} EXEMPLO 3.2.1.C Construir um algoritmo que, dado um vetor A de 20 elementos, S = (A1- Azo)? + (Aa Ato)? +. + (Anv- Aun? INICIO {algortmo} DECLARAGAO DE TIPOS vel = VETOR [1.20] DE REAL; DECLARAGAO DE VARIAVEIS FIM. {algeritmo} 50 ‘ntrodugdo ao Desenvolvimento de Algorimos EXEMPLO 32.1.D Construir um algoritmo para calcular o niimero de alunos que tiraram nota adma da média da turma, As notas estdo dispostas da seguinte forma Ni, N2,N3,..., Nk onde: Nk é a nota do aluno ndmero k. INICIO {algoritmo} DECLARACAO DE CONSTANTES ‘num alunos = 40; DECLARAGAO DE TIPOS vel rot = VETOR {1..num_slunos] DE REAL; DECLARACAO DE VARIAVEIS vet_rot :nota_aluno ; REAL: med_notas, ac_notas ; INTEIRO : a, Iago; ac_notas = 00; etal +0; PARA ligo DE 1 ATE nom_ahinos PASSO 1 FAGA INICIO {bloco para k iar} TEIA (cota alonfl 2notas + acnotas + nota_lunolago FIM {para} sed nous © a¢_notas/ num. alunos; PARA ligo DE TATE num alunos PASSO 1 FACA INICIO {bloco para lago variar} SE nota anoflag] > med_notas ENTAO hale “ot_alu +1; FIM (para} ESCREVA (‘niimero de alunos acima da média é = *, ct_alu) ; ESCREVA (‘média:*,med_ nota) FIM, {algorimo} EXEMPLO32.2.E Contruir um algoritmo para calcular o valor do polindmio P para 10 valores de X. Estruturas de Dedos 51 P= (alxXN4) + (a2xX%?) + (a3xXN9) +. + (aNxX°) Leia Leia os eveficientes aK , K = 1...N,, assumir que N < 21. Leia as im6gnitas X2,2 = 1 Escreva: H,X1 F2)X2 10, x10 INICIO {akoritmo} DECLARACAO DE TIPOS vet = VETOR [1.20] DE REAL; yelp = VETOR [1.10] DEREAL; DECLARACAO DE VARIAVEIS au do polindie as inogitas Xe} ‘ATE n PASSO 1FACA P= 0; finicializaczo coletiva } PARA |DE 1 ATE 10 PASSO 1 FACA 52 Introdugao ao Desenvolvimento de Algartmos 3.2.2 - Manipulagio de Cadeia de Caracteres tipo primitive CARACTERE pode armazenar apenas 1 carac- Se quisermos armazenar uma ou mais palavras, teremos que ir uma seqiténcia (cadeia) de caracteres armazené-la em uma estrutura do tipo vetor. modelo DECLARACAO DE TIPOS vet_nome = VETOR [1.40] DE CARACTERE ; DECLARAGAO DE VARIAVEIS vet_nome ; nome ; A varivel "nome" que foi declarada como sendo do tipo "vet_nome’, pode armazenar um nome que tenha no méximo 40 carae- teres, incluindo os espagos em branco, entretanto grande parte dos izados atualmente nao possuem mais que 35 caracteres. Por iremos utilizar 0 caractere "\" para especificar o fim da cadeia de caracteres, pois. a varidvel nome sempre terdum comprimento de 40 caracteres, independente do comprimento do nome armazenado. Exemplo 1234 $678 91011121314 37 38 39 40 J] o]AJo| »[ Djal»|s|ilL[ val .. [ ] finalizador ——— EXEMPLO 3.2.2.4 Construir um algoritmo capaz de verificar se um dado caractere existe ou ndo na cadeia a seguir. Estruturas de Dados 53 123 4 5 67 8 19 20 AlK[i[L]P[B[clo|.. [p]F INICIO DECLARACAO DE TIPOS vel = VETOR [1.20] DE CARACTERE ; DECLARAGAO DE VARIAVEIS vet letras INTEIRO : laco, aux; CARACTERE: letra_ procs aux =; LEIA (tras, letra_proc) PARA ago DE 1 ATE 20 PASSO 1 FACA, | SE btra_proc ~ letrasfago] INICIO {loco letra locaizada} sux lao; ABANDONE {sbandona oago de repetigies} FIM; {letra localizada} SE ax=0 ENTAO ESCREVA (‘letra no existe no vetor’) SENAO | PN ESCREVA (tetra xh wa poi, a) FIM. {algortmo} EXEMPLO322B Construit um algoritmo que, dado um vetor de 30 elementos contendo um nome, seja capaz de verificar se uma determinada palavra esté contida nc nome ou nao. 123456789 “ SOLAN OP PARSE ARMATTANL - 13} Exemplo:Palavra procurada + SILVA 54 Inrodugéo ao Desenvolmento de Algorimos INicIo DE CARACTERE ; ‘VARIAVEIS, ina ‘LEIA {nome , subnome) ; ENQUANTG! <= 30FACA Nico SEsubnomefj] ~ nomi | ’VENTAO! INICIO {bloco entéo} i ys IM: (Sendo) itt FIM; (enguanto} Sean ENTAO, ESCREVA Cuomo pepiadn, SENAO ee TESCREVA (sbnome no fi encontrado); PIM. {aloritmo} 55 3.2.3-Matrizes Sao estru:uras Homogéneas multidimensionais que podem ser construidas a partir do tipo vetor. Estas estruturas so bastante utilizadas em matematica, mas do ponto de vista da estrutura de dados, ‘estamos mais irteressados na formade acesso aos dados armazenados, = Matrizes de duas Dimensbes DECLARAGAO DE TIPOS mat_2 = MATRIZ[I.2, 1.3] DE INTEIRO; DECLARAGAO DE VARIAVEIS smat_2: 12d; temos 6 elementos que sio referenciados pelos maga] | meaath,2] | maa] m2a2,1) | mi2d(2.2) | mt2df23) ch a3 Neste caso, dizemos que a matriz tem 2 dimenséo), 3 “colunas (segunda dimensiio). + Matrizes de Trés Dimensoes DECLARACAODE TIPos mat_3 = MATRIZ1.3, DECLARAGAO DE VARIAVET MAT.3:MT3D; 3] DEINTEIRO; Nesta matriz, temos 9 elementos que sio referenciados pelos indices : 56 Inrodugéo a0 DesenvéWvimento de Algorios mama etl meal 3.11] mt3¢[2,3,1] mi3d[3,3,1] 2 c-3) dimensao), 3 "olunas" (segunda dimensio) e 3 "paginas" (terceira dimensio). Observagdo: Podemos trabalhar com matrizes de dimensio N (endo N um nimero inteiro positive), dependendo do espaco disponivel na meméria. - Matrizes multdimensionais podem ser definidas da seguinte forma. DECLARACAO DE TIPOS mat_n = NATRIZE_ 1.5.1, Onde: i 2s 2 Jiads a] DE po qualquer dimensio j €0 limite inferior te superior da dimenséo j {= 123,50 © niimero de elementos na matriz & dado por : (s1 11+ 1)x(s.2-112 +1) x.x(s_n-lin + 1) Estruturas de Daios = 57 EXEMPLO333.4 Construir um algoritmo capaz de somar as colunas da matriz abaixo e armazenar os resultados em um vetor : matriz vetor CL?) 2 217) +[ s[ s/o | 5 | 9}| 2% a a] 2 9 | 4] | 24 INICIO {algoritmo} DECLARACAO DE TIPOS mat = MATRIZ.[1.3, 1.6] DE INTEIRO ; vet = VETOR (I. soma_eol + 0; ini PARAIDE 1 ATE3 PASSO 1 FAGA (0 { bloco para | variar} PARA ¢DE1 ATE 6 PASSO 1 FACA FIM. (algouitmo} EXEMPLO333.B Contruir um algoritmo que calcule a média de cada aluno e a média de turma. 58 Introdugao ao Desenvolvimento de Algoriimos Observacées: - A média da turma esta disposta em uma matri contendo em cada linha, 5 notas bimestrais obtidas pelo aluno. = O indice da cada linha representa 0 nimero do aluno. ~ A saida das informagoes deve ser feita da seguinte forma: N@ DOALUNO ——MEDIADO ALUNO MEDIA DA TURMA 1 x x 30 xx * INICIO {algo mat_nota = MATRIZ [1.$, 1.30] DE REAL; vet_média = VETOR [1.30] DE REAL; DECLARACAO DE VARIAVEIS rmat_nota :notas vet_média :med_nota REAL: soma_nota, med _turma INTEIRO 1, tra genérica da matriz de notas} 30 PASSO 1 FACA, INICIO {bloco para_| variar} | soma_nota_ 0; fncaiza soma p cada sluno) ed_turma ~ med_turma + soma_nota; FIM; {para_| variar} med _turma = med_turma/30; ESCREVA (‘nero do aluno’ ,"média do aluno" Estruturas de Dados 59 | “média da turma’) ; PARADE 1 ATE30 PASSO I FACA | "ESCREVA (med neal, med tum) ; FIM, {algortmo} EXEMPLO33.3.C A matriz abaixo, representa o patio de uma indGstria ¢ contém um cestoque de matéria-prima. Cada um dos valores é uma combinagao de nimeros, que representam c6digos de produtos e quantidades disponiveis no estoque. Exemplo: 1072 107-QUANTIDADE 2-CODIGO DO PRODUTO coDIGos: 1-cobre — 3-chumbo S-aluminio 2-carvio 4-ferro 6 niquel [0 = 2561 ‘000 Escrever um algoritmo, capaz de contar quantas toneladas de cada material existe no patio. safda de informagoes PRODUTO OUANTIDADE cobre sox 60 Introdugao a0 Desenvolvimento de Algorimos INICIO {algoritmo} DECLARAGAO DE TIPOS smal = MATRIZ[LA, 1.4]DEINTEIRO; et = VETOR (0.6] DEINTEIRO ; DECLARAGAO DE VARIAVEIS _matéria_prima ; INTEIRO :1,€,qt, cod; t_matéria_prima © 0: {ini so gonsrica LEIA (pitio ; (leituragenérica de matrz pio) PARA | DE 1 ATE4 PASSO 1 FAGA PARA c DE 1 ATE 4 PASSO 1 PACA INICIO {bloco para ¢ variar} | a mmstot 3/20): cod f/10)-i)* 105 at_pritalcod] +L mat_primaleod] + gt + {paca_¢_variar} | ESCREVA (‘eobre* | ESCREVA (que FIM. EXEMPLO3.33.D Construir um algoritmo, eapaz de obter a matriz C a partir da multiplicagdo da matriz A pela matriz B. Isto é,C = AxB. Estruturas de Dados 61 (Le) = A(L1) xB(L,¢) + AQ,2)xBQc) + .. + AGLN)xBON.) Onde: AéumamatrizMxN_ 6 B 6 uma matriz NxK. inicio DECLARACAO DE TIPOS ‘mat = MATRIZIL.3 1.3] DE INTEIRO ; DECLARAGAO DE VARIAVEIS mat :mat a, mat b, mat_e; INTEIRO: 1,08 mat_¢ + 0 {iniilizacdo coletiva} PARADE 1 ATE 3 PASSO 1 FACA INICIO | PARA cDE 1 ATE3 PASSO 1 FAGA INICIO LEIA (mat alle], mat bf el) PARADE! ATE SPASSOT FACA INICIO : | mat g{l,<] = mat cfl.e) + L Steel Gea kl mat Be) FIM; ESCREVA(mat FIM; FIM; FM. EXEMPLO333.E CConstruir um algoritmo,capaz de montar um "quadrado magic Observasio: «leia N (N deve ser impar e menor que 100) facto ‘asoma de cada coluna deve ser eT: Te fais igual a soma de cada linha, que por sua vez deve ser igual & soma de cada uma das z fe [s fw — diagonais. Figura 7e ‘0 preenchimento do quadro 6 dado por: primeira linha e na coluna central. © padrao do comportamento ar = Comercar o preenchimento 62 Introdugéo a0 Desenvolvimento de Algoritmos move-se uma coluna & esquerda (el - 1) ¢ uma linha acima (In - 1) se coluna for menor que 1, entdo coluna passa a ser N se linha for menor que 1, entdo linha passa a ser N se a nova posicao estiver ocupada, entZo retorne para a antiga Posigao, mantenha a mesma coluna e desca para a linha abaixo, INICIO {sgorimo quadrado mégico} DECLARACAO DE TIPOS mat = MATRIZ{t.99, 1,99] DEINTEIRO; DECLARAGAO DE VARIAVEIS INTEIRO: x,y, LEIA() 5 {ntimero de linhas} yo INT(2) +1; key asa; ENQUANTO (ct < =K"K)FACA, INICIO {bloco enquanio} quadradofx, y] = et; ye yok | SEx <1 ENTAO xe ky sey< 1 ENTAO yok SE quadradolx,y] <>0 ENTAO INICIO x x45 | si aat | key =k ENTAO yn yok: SEx >k ENTAO ke xk; FIM Lee ais FIM; {enquanto Estruturas de Dacios 63 EXEMPLO333.F Construir um algoritmo,capaz de gerar a tabela abaixo: 12- horas 20- horas 40 horas DE - Dedieacdo Exclusiva CTI +NA, AE, TT. CT2 +1228 LPARA_C() + funeao para transformar niimero INTEIRO em CARACTERE (riti2lal7iple 64 Inoue ao Desenvolvimento de Algorimos INICIO {constugso de tabola de mvs salarais} DECLAR/.CAO DE TIPOS mat = MATRIZ|[..3+28, 1..7] DE CARACTERE; DECLARACAO DE VARIAVEIS {converte inteiro em caractere} PARA dil DE TATE 3 PASSO 1 FACA FIM; PARA c12 DE 1 ATE 28 PASSO 1 FACA inicio FIM SENAO, FIM; SEINT(@H# c2/4) = (e1*c2/4) ENTAO| ——_ ....... 323.1 Matrie Esparsa Em algumas aplicagdes numéricas, aparece matrizes com a de seus elementos nulos. Uma matriz com esta caracteristica € ‘matriz esparsa 0)9)9]5] 0,9 0 12 [3[ololofo) o 0 vs [2 [oof 7 [ey 2 im [ojetoroaos) os, 0 Oe el led etedc6 om Se construirmos um algoritmo para manipular este tipo de matriz, teremos um consumo de meméria desnecessério ao armazenarmos os valores nulos. Podemos armazenar apenas os valores no mulos e suas SE et = (v +3) ENTAO ialquer instante. Este tipo de transformacio ir economizar memoria ¢ aumentar 0 tempo de execucio, devido as ‘operagdes de transformacio. Observagio: Este tipo de transformacdo deve ser feito em situagdes, onde o nimero de elementos da matriz, (sua dimensdo) ¢ 0 nfimero de elementos nulos sejam muito grandes, EXEMPLO333.G Construiremosumalgi {eserta genética da matrz tabela} de 20 elementos, itmo para "compactar" uma matrizesparsa lo de ilustagao. 66 irodugdo ao Desenvolvimento de Agorimes _Estruturas de Dados 67 numeragdo sequéneial na matriz Apresentamos abaixo, 0 vetor "vetmat" apds.a execucdo: HL if 27 ay aq 5 H Heaths BOVEY SERVE, LY, 3 [pe 3 as 1 [2[4] 5[9 17] 9/3 [7 [@ M4 Us [17 [18 [19 120" ra a ee cleded ef o5 Iremos utilizar uma estrutura do tipo vetor para armazenar os valores nao nulos e suas respectivas posigdes na matriz. O eéleulo da posicdo do elemento pode ser dado da seguinte forma: O elemento que est na linha 3 e na coluna 4, é o elemento de niimero 14. A posigao do elemento esti em fungao do niimero da linha e do mimero da coluna, por exemplo: (3 -Dx S )+ 4 =14 ((N® dalinha- 1) x N®de colunas) + N® da coluna = posi¢ao INICIO {compactagio"smazsnar marizesparsa em um vee") DECLARAGAO DE TIP | OS p= MATRIZIL.4, 1.5] DE INTEIRO X¢= VETOR(L-10] DE INTEIRO: DECLARAGAO DE VARIAVEIS K, poss agi colativa) ket; LEIA (mati) + PARADE 1 ATE4 PASSO 1 PACA, | | | isicio. | LATE S PASSO 1 PACA INICIO | PARA | SE mati ENTAG INICIO <>0 68 Introdugéo ao Desenvolvimento de Algormos Onde: V sdo os valores nao nulos ¢ P suas respectivas osigGes na matriz esparsa Dimensionamos 0 vetor "vetmat" com 10 elementos porque | cinhamos na matriz, apenas 5 elementos nao nulos. Se esta matriz tivesse Jum niimero maior, de elementos ndo nulos, ndo seria interesante ‘compacté-la, pois o némero de elementos no vetor poderia até ultrapas- sar 0 ntimero de elementos da matriz 3.3 - Estruturas de dados Heterogéneas Registro é uma estrutura composta por um conjunto de varidveis de tipos diferentes, primitivos e/ou estruturados, logicamente relacionadas, que podem ser referenciaclas por um mesmo nome (iden- tificador do tipo registro) ou individualmente. Este tipo de estrutura €utilizado para relacionar dados pertencentes a um mesmo objeto. Por exemplo, se estivermos interessados em montar um fichario (ar- ‘quivo), contendo dados de funciondrios, serd necessério desenhar uma ficha modelo (pad-ao) e, a partir daf, cadastrar todos os funcionérios. Note que todas as fichas terdo o mesmo tamanho, portanto deverdo conter 0 mesmo ntimero de informagdes. Estas informag6es esto con- tidas em subdivisdes chamadas de CAMPO, logo, um REGISTRO (ficha) € composto por CAMPOS (espaco delimitado para cada uma das informagGes) que por sua vez é composto por CARACTERES. Estruturas de Dados 69 bs © Declaramos as _variév oc como sendo do tipo re ‘mesma estrutura e podem armazenar,o mesmo volume de dedos. Observagio: Podemos att registro a outra varidvel do mesmo tipo. fuarmicuta sasse [oRARIO. 67 13 Nowe: 2€ canioce on SiLva Locagto: ‘SALAMI 2 'REGISTRO (FIGHAFUNGIONARIO" Exemplo: func férias ~fune_ativos Figura & neste caso, 0 registro fune_férias passou a conter todos 0s dados armazenados no registro fune_ativos, modelo | USS Referenciagie ~ aiahaiaaanaas ee eee Podemos fazer uma referenciagdo genérica, como ocorre com reg = REGISTRO vetores e matrizes. campo_l Exemplo: ESCREVA (funcionério) ;{escreve todos os dados existentes na fixa} LEIA (funcionétio) ; {16 todos os dados existentes na ficha} Podemos referenciar um CAMPO pertencente a uma variivel do tipo REGISTRO, ¢a seguinte forma : campo_n: tipo_campo_n; No cas da ficha nome_do_registo . nome_do_campo DECLARAGAO DETIPOS vel_7_car = VETOI vet_nome = VETOR[ reg fune = REGISTRO matricula : INTEIRO ; horério: vet_7_car nome : vet_nome ; Exemplo: LEIA (fu : abono ~ funcionério . salério.* 0.05 ; ESCREVA (funcionério . salirio + abono); Observagio: 0 nome do campo ¢ ligado ao nome do registro por um caractere”." (ponto). Podemos fazer uma referencia abreviada, usando aseguinte ago lotagio : vet_7_¢ DECLARAGAO DE VARIAVEIS reg_fune: func_ativos, fune_férias 70 Inrodugio ao Desenvolvimento de Algoritmos Esiruturas de Dados 7 at modelo exemplo COM none do_registroFAGA COM funcioniios FACA, {hocoabrevagso} INICIO {bloco de abrevagio} ala = 3786 campo. + valor_t; | some «= “fulano de | salirio 455500; | lotagio = “dprerh®; FIM; {abreviacio} ccanpo2 + valor_2; | eanpo_n = val FIM ;{abreviagdo} EXEMFLO 33.1.4 Construir um algoritmo, que gere uma tabela que exprima o grau fe MOgas € rapazes, a iinha os seguintes dados : - Cédigo : 0 para indicar um rapaz.e 1...9 para indicar 9 mogas nome : nome de um rapaz ou de uma moga - respostas : so e6digos que indicam as respostas adas 30 perguntas de um questiondrio, cada resposta s6 pode ser: 1-sim 2-indiferente 3-ndo -Existe uma linba com eédigo igual a 0 seguido de 9 linhas com codigos 1,2....9 72 Inrodugao a0 Desenvolvimento de Algortmos ~cada comparagdo inclui um rapaz.e umamogasendo Iculados os indices de afinidade e de incompati- lidade para cada moca em relacao 20 rapaz dado. Estes indices sao encontrados, calculando-se as res~ ppostas para as 30 perguntas, somando 1 ao fndice de afinidade, ou ao indice de ineompatibilidade. Exemplo: | [Resp. Rapaz 3 Pep vel_resp = VETORIL..0] DE INTEIRO ; reg: REGISTRO LETA(cartéo ENQUANTO (cartéo . cod <> -1) FACA Inicio. aux = eartio; ESCREVA(aux . nome, "inc" "comp" , “di PARA iDE 1 ATE 9 PASSO 1 FACA © Estruturas de Dades 73 iwicio LEIA(cartio . nome) ; PARADE 1 ATE 30 PASSO LEACA, INICIO SE (eux. respk] <> 2) (catéo. esp] <> 2) ENTAO SE aux . resplk] = cartéo resp] ENTAO Como os campos que constituem um registro podem ser de qualquer tip», podemos ter variaveis do tipo escalér, vetor, matriz e até ‘mesmo do tipo registro, como sendo um campo componente de um tipo registro. Em _muitas aplicagdes, devemos ter uma certa fle relagéo ao nimero de vezes que um determinado campo ird ocorrer em cada registro. Por exemplo, se estivermos. interessados em criar “espaco” no registro “funcional” (figura 8) de cada funcionério, para 74 Introdugao ao Desenvolvimento de Algoritmos armazenarmos 0 nome ¢ a idade de seus filhos, terfamos que abir ‘quantos campos?. E certo que 0 niimero de espacos nao poderia ser apenas um, itemos assumir um limite méximo para o nimero de filhos, digamos 10, neste caso, 0 nosso campo miltiplo que chamaremos de poderd armazenar nome e idade de até 10 filhos, vet fho ~~ (HHO Jose Besime ~ MATRICULA: 34532 NOME: Jose Carioca da Siva Idade(10) HORARIO: 07..18 [_] ml FILHO: Jose Primeiro IDADE:15 LS ‘idade [4] Shean, | HeerAcko: arin SALARIO: 2.197,00 Dade (3) reaisiro (icha) _ ‘dade [2] | “uncona iad {1 DECLARACAODE TIPOS vet_7_cat = VETOR[L.7] DE CARACTERE; smatricula: INTEIRO ; hordtio: vet_7_ear sali: REAL; lotagio vet 7_ear DECLARAGAODE VARIAVEIS reg func: func_ativos, func féras Estas de Dados 75 Se estivermos interessados em armazenar um conjunto de informagées relacionadas a cada filho, devemos declar ja estrutura represente estas informagoes. Como 0 i teremos que construir um vetor ja do tipo registro, ou seja, con- do tipo registro, ntimero de fi MATRICULA:34532 | HORARIO: 07.13 NOME: Ze Catioca do Rilo vet finof 10) FLHOS FILHO: Ze premier do lo | IDADE: 15 SEXO: Mas. | ESCOLARIDADE: Grau SS vet fof] SO eters ‘vot _hof2] LOTAGAG: gtvsep | SALARIO:2.197,00 J regisro (icha) uncional| vot fihof1] pa= stgutyos. , contendo cada funcionério. Se junto de registros (fichas) em uma gaveta, podemos enominar esta gaveta de ARQUIVO. nome > Facano [Nowe= FULANO [Lotagio= GRW/mmr = SALARIO = 56738,00 "ARQUNO [GAVETID REGISTRO (FICHA} Figura 9 A estrutura chamada ARQUIVO permite algumas operaches bésicas que podem ser visualizadas através de uma analogia com um armério, contendo algumas gavetas, Iremos assumir que cada uma das gavetas € um arquivo, neste caso: © Declarar um arquivo = (rotular uma gaveta com 0 nome do novo arquivo) DECLARACAO DE TIPOS arq_agends = ARQUIVO SEQUENCIAL DE reg agenda ; DECLARACAO DE VARIAVEIS. arq_agenda agenda; Estruturas de Dados 7 ‘© Abriro arquivo—(abrir a gaveta) Observacio: 6 podemos manipular os REGISTROS ({ichas) se © ARQUIVO (gaveta) estiver aberto. Portanto, a primeira operagio sobre um ARQUIVO é "ABRIR O ARQUIVO". ‘© Fechar o arquivo— (fechar a gaveta) Ap6s 0 término da manipulago dos REGISTROS, devemos Sempre fechar o ARQUIVO (gaveta), Portantoy a ‘operagao sobre um ARQUIVO € O ARGUIV ‘© Escrever um registro — (colocar uma nova ficha na gaveta) © Elininar um registro — (excluir uma ficha da gaveta) © Ler um registro —(retirar uma ficha para consulta) 3.4.1 - Organizagao Seqiiencial A principal caracterfstica deste tipo de organizacdo de arquivo é que os registros so armazenados seqiiéncialmente. O acesso aos registros, tanto na leitura quanto na escrita, € feito de forma seqiiéncial, isto é, a leitura de um registro s6 e possivel a seus antecessores, € a escrita s6 ¢ feita aps 0 tiltimo registro existente. Neste caso, serd necesséria a defini¢do de duas formas de abertura de arquivo seqiéncial, uma para leitura (posicionamento no inicio do arquivo "primeiro registro”) e outra para gravagio (posicionamento no fim do arquivo "aps o tiltimo registro"). ABRIR ARQUIVO (nome_arq, ESCRITA) ABRIR ARQUIVO (nome_arq, LEITURA) A consulta de um determinado registro deve ser feita por ‘comparagao. Verificamos se 0 contetido de um determinado campo é igual ao valor procurado. Se for igual, ento encontramos o registro procurado, caso contrério, iremos ler os registros subsequentes suces- sivamente até encontrarmos o registro procurado ou atingirmos o fim doarquivo. Utilizamos um finalizador (valor atribuido ao campo chave) para identificarmos 0 gltimo registro do arquivo. 78 Introdugéo a0 Desenvolvimento de Algoritmos EXEMPLO 34.1.4 Construir um algoritmo para localizar o registro, do arquivo agen- a, que contém o nome procurado. Observagio: —Iremos assumir que 0 campo chave de acesso € 0 campo "nome" ¢ que o finalizador € nome = "*". INICIO {algortmo para consulta agenda) DECLARAGAO DE TIPOS. ‘vet_nome = VETOR[I.30] DE CARACTERE ; vet fone = VETOR{L.i2] DE CARACTERE | res_agenda ~ REGISTRO | — ang agenda: agenda ; | YGICO : encoatrou ; vet_nome :nome_ procurado ; ABRIR ARQUIVO (agenda , LEITURA) ; encontrou = FALSO; LEIA (nome_procurado) ; LEIA(agenda, rez_agenda) ; ENQUANTOreg agenda . nome <> "*" FACA INICIO {Hoes enquanto nao foro fim do arquivo} SE reg agenda . nome = nome_procurado ENTAO INICIO | | encontou = VERDADETRO ; j Fn ABANDONE {interrompe a procara} LELA(agenda , reg agenda); ianto no foro fim do arquivo (home = "*")} = VERDADEIRO| TESCREVA (reg_agends)_ {mostra todos os camy sexeNGREVA Gee azends) pos} TESCREVA (‘nome nio existe na agends’ ROUNO Goss “ ere Esiruturas de Dados - 79 ‘3:42 - Organizagao Direta A principal caracteristica deste tipo de organizagdo de arquivo que os registros podem ser acessados diretamente. Isto € possivel por- ‘que cada registro € associado a um nimero que representa sua posicdo no arquivo. ra uw Rou Figura 10 EXEMPLO 3.4.2.4 Construir um algoritmo para acumulat 0 movimento didrio a0 ‘movimento mensal e inici Vamos supor que os dois arguivos "venda_més" e *venda_dia’ tenham o mesmo niimero de registros € ‘que 0s produtos estejam na mesma ordem (registros equivalentes com a mesma numeragio). Observas 80 Introdugdo ao Desenvolvimento de Algoritmos INICIO {algorimo para acumular movimento distio} DECLARACAO DE TIPOS | vet 8 cor = VETOR{I.8] DE CARACTERE; | reg mov = REGISTRO cod prod vet 8 car quantdade : INTEIR | Stent: REAL | data_venda vet 8 car | __arq_mos = ARQUIVO DIRETO DE reg. mov; | DECLARACAO DE VARIAVEIS arq_mot: venda_més , venda_dia; INTEIRO : et reg; {nimero do registra a ser ida) REAL: aux; | ABRIR ARQUIVO (venda_més) | ABRIR ARGUIVO (venda dis) ct reg <1; LEIA (venda_dia . reg_mov , et_reg); LIA (venda_m@s . rea_mov , crea); ENQUANTO (venda_més.reg_mav . cod _prod <> INICIO {bloco enquanto nso for ofim do arquivo} | aux venda_mes . reg_mov . valor venda faux “aux + venda dia . reg_mov . valor venda | venda_més . reg_mov . valor senda + aux; venda_dia . rog_mov . valor venda = 0; ESCREVA (venda_més . reg.mov , etree); ESCREVA (venda dia . rog_mov , et_reg); cL ngect reg +1; LEIA (senda, més . reg_mov , ci reg); FIM; {enquanto no foro fim do arquivo (nome =} FECHAR ARQUIVO (venda_més) ; FECHAR ARQUIVO (venda_ci FIM. (consulta agenda} See EACA, Esiruturas de Dados 81 43.4.3 - Organizagao Indexada O método de acesso direto € ineficiente para algumas aplicagoes, ionar o mimero do registro com o seu contetido. Por qual € o ndimero do registro que contém o produto cujo cédigo €"SAPT/126" (exemplo acima) ?. Este problema é resolvido, usando métodos de classificacao € pesquisa de dados (cap-6). Neste tipo de onganizacéo, teremos que construir um arquivo de registros, contendo apenas dois cam- wazenar a chave de acesso e 0 campo que ir armazenar o numero do registro no arquivo de organizagdo direta, EXEMPLO343.A. Iremos construir um arquivo de indice que p uma melhor forma de acesso aos dados armazenados no arquivo "'venda_més" (exem- plo 3.4.2A). - Construgio do Arquivo de Indice DECLARACAO DE TIPOS reg ind = REGISTRO cod_prod : vet_8 car; {campo chave de acesso} ‘num_seg: INTEIRO ; {ntimero do reg. no arquivo} arq_ind = ARQUIVO DIRETO DE reg ind ; DECLARAGAO DE VARIAVEIS + 0d ind ; {declara cod_ind como arquivo de indice} i Intodueéo ao Desenvolvimento da Algontmes - Visualizagao cod_prod — num_reg cod_prod outros dados 1- [SDL/o1i | 0003 j- | SPT/O89 2- |SDL028 | oneal 2 SDL/116 3- |SDL/116 | 0002 J S3- SDL/011 4~ [sprio7s | 0004 [_SPT/O7S 5- [sPryos9 | 0001 SPT/IS4 2 eee sitlbeal Et 6- [spriisa | 0005 SDI028 = cod_ind venda_més (arquivo de indice) (arquivo de dados) nimero do registro no arquivo de organizacgao direta. A localizagéio do e6digo do produto no arquivo de indice, pode ser feita por pesquisa bindria (cap-6), ¢ em seguida leremos o registro ntimero num_regno arquivo de dados. 3.5 - Exercicios 1 - Construir um algoritmo que: Dado um ndmero, escreva seu valor por extenso. Observacio: Exemplo: (© valor maximo a ser tranformado serd 9999.999,09, = dado 4.973,30 - escreva Quatro Mil Novecentos e Setenta e Trés € Trinta Centésimos 2 - Dados dois vetores A ¢ B com os dados ordenados, construa um algoritmo para intercalar os vetores A e B de tal modo que 0 novo vetor C também esteja ordenado. © Esinuturas de Dados 83 ab ,¢,b,a um algoritmo para contar qual € 0 numero de que 0 texto esteja ar- 80 colunas e que as = Suponha que exista 6 cidades ligadas por ferrovia, da seguinte forma: 84 Inrodugdo ao Desenvolvimento de Algoriinos 1 2 3004 5 6 1 [000 [100 | 01S | 000] 000 | 000 2|100 [000 | 040 | 180 | 200 | 000 3 [ots [040 | 000 | 4s | 09s | 000 4 {000 [180 | 045 | 000 | 000 | 10s s|000 [200 | 095 | 000 | 000 | 120 6 [000 [000 | 000 | 105 | 120 | 000 Construir um algoritmo que : ~ Leia duas cidades (origem e destino) - Encontre 0 menor caminho entre elas - Escreva este caminho 7 - Construir um algoritmo para emitir a pré- matricula de cada um dos alunos de um determinado curso. Os dados estdo dispostos em arquivos, conforme a estrutura a seguir: nome_disc,carga_horaria Tome do Tome dos have de arquivo campos acesso ‘curso cod_eurso, nome curso [cod auso isciplinas | cod_curso,cod_dise, cod_curso+cod_dise | | pré-requisito cod_curso,cod_dise cod_curso+ cod_dise dise-cursadas | cod_curso,N® matric, ‘Ne matric + cod_dise cod _dise,N® semestre 2 dise-a-cursar | cod_curso,N® matric, Nematriec+eod_dise cod_dise,N® semestre +N? semestre alunos: 'N? matricnome,cod_curso | cod_curso+N® matric Estruturas de Dados - Leia : : ~ Remover os dados do arquivo 'a_vencer” 'N® do semestre enquanto 0 cédigo do curso for diferente de zero a_receber recebidas a_receber recebidas Brgy ao ee — 1 [1373542] 1 [10/2342] 1 [13/3542] 1 [10] 2342] fome do curso, N° do semestre ,N® da matricula, nome do aluno t lista de disciplinas que o aluno podera cursar 2 |35 | 2.754) 2 [53 | 6.454} —e2 6 1.786) 2 53 6.454) Ob: Onome d ‘lide a 3 [46 | 1.786) 3 [17] 5.286] 3 [50]4.543] 3 17) 5.286 servacéo: —-Onome docursoser4lidono arquivo "curso" através da chave de acesso (0 arquivo deve estar indexado) 4 [50 | 4.543) 4 (35 | 2.754) = O nome do aluno seré lo no arquivo através da chave de acesso (0 arquivo deve estar indexado) as que poderdo ser cursadas sera lsc_a_cursar”e seram encontras a. da chave de acess0. tir um algoritmo para gerenciar atendimentos em uma ‘O menu de opgdes deve conter : Verifique se existe pré-requisitos para a disci 1-marear consulta 8 -Construirumalgoritmo pera sito (arquivo de pré-requisitos). As disci serem cursadas ndo poderdo ser listadas se os seus 3s pré-requisitos ndo estiverem no arquivo inas cursadas. valor e sua data de vencime: receber para um arquivo de ~ Leia data [ela Nom ento m ta enquanto for difere = Verique sia existéncia no arquivo de dup! “‘Transterir do arquivo "a_teceber” para 0 =Transferir a data de pagamento para 0 arqui Obs: =O arquivo "a_receber" tem os seguintes campos : rum_d ieala, valor, data vencimento - O arquivo "recel ‘mum dupliata, val tem os seguintes campos : ata_vencimento, data_pagamento 86 Invodugéo a0 Desenvolvimento de Algoriimos 2+ desmarcar consulta 3 - escrever mapa de horérios para um deter 4-escrever onome e as datas em que um paci 5 - escrever o nome ¢ telefone de todos 0s pac 6_femsullaosorreu hd mats de 6 meses equ fim ‘mapa dos horarios dias do mes een Clieel a 2 8 8 [c01 [000] 000[000 000 | 000] 000] 000 .000 | «00 [20 Joo [000 | 000 | 000 s 17 [000] 76 | 600] 000 jo00[ 000] 0007 000 Esiruturas'dle Dados Observagies: - Cada elemento desta tabela armazena o e6digo do te (KK) com consulta marcada ou zero para 9s livres. = Os dados de cada cliente entdo dispostos em um arquivo, onde cada registro tem a seguinte estrutura = e6digo do ~ nome do ~ idade ~ enderego = telefone ~ patologia = © mapa de hordrios pode ser tratado como sendo a matriz. deve ser carregada na da execugdo (tranferéncia dos arquivo para a memoria utilizando uma estrutura de tipo matriz) e no final da execucio,0 arquivo deve ser atualizado (0 arquivo pode ser do tipo seqiiéncial). - Relacione o mapa de hérérios-com 0 cadastro de pacientes para obter os dados do paciente nas opgoes 45. 1a matriz de 1000 linhas e 80 colunas, contendo um texto, faca um algoritmo para compactar e descompactar 0 texto. Isto €, cada palavra deve ser armazenada no vetor uma tinica vez: = leia a matriz ~ construa um yetor onde cada elemento é um registro, contendo: - um vetor de 20 elementos para armazenar a palavra = um vetor de 10 elementos para armazenar as posigdes onde a palavra ocorre na matriz. Observacio: estamos supondo que cada palavra tera no méxino 20 letras € que 0 nimero méximo de vezes que ela ocorre no texto (matriz) é 10. 88 Introdugéo ao Desenvolvimento de Algoriimos as palavras (‘traduzir o texto"), contendo 500 palavras af- . lavra do texto, verifique se ela existe no dicionério ¢ entao faga a substituigdo, caso contrario, nngo substitus a palavra 12 - Uma agéncia baneéria emite um relat6rio diario, contendo os seguintes campos: data de emissao : dd/mavaa N® conta, «tome; | mov. débito_; | mov. crédito, L = = 1 disrios de débito e vento” contendo os seguintes campos: digo da operagao (Db ou Cr) 0 para emitir este reltorio e atualizar o saldo = saldo anterior + soma dos débi Observacio: — - Escreva 0 nimero da conta € 0 nome do ‘epenas uma vez. - Escreva o valor nas colunas de dé dependendo do cédigo da operagao Estruturas de Dados a) MODULARIZACAO 4.1 - Modularizagio 4 ‘A soluggo de um problema pode ser fatorada em solugbes de subproblemas, 0 que permite a construgio de médulos isolados com subfungdes bem definidas. Este método permite que o sistema (conjun- tode programés, que como um todo resolve o problema) seja desenvol- vido por Varios programadores da equipe, jé que cada médulo tem sua independéncia dos demais. “G11 0 Conceito de Bloco loco (CAP-2.3.1) 6 usado também para delimitar vel de abrangéncia) de varisveis O conceito reas de escopo As variaveis declaradas em um bloco s6 existem efetivamente no seu interior, estas variveis so chamadas de variaveis locais. Quando um bloco comeca a ser executado, as variéveis declaradas no seu 90 Introdugéo ao Desenvolvimento de Algorimos srmino da execucdio ‘duranteaexecugio do mesmo. Com isso, teremos uma otimizaclo na meméria, 4.12 - Escopo de Vi Dados dois blocos Ae B, dizemos que A é externoa Bse A contém B. Neste sentido, uma varidvel declarada em um bloco é global para todos os blocos internos ¢ local para o préprio bloco. F varidveis declaradas no bloco A sao globais para Cos blocos B,CD.E e F e locais para o bloco A. fe Uma varidvel declarada no bloco A é reconhecida em = seu interior e em qualquer bloco contido em A, Figura 1.1 As declaragoes feitas no bloco A.s 6 blocos que estaono interior de A. Isto é, bloco A e globais para os blocos B,C,D ¢ E, iidas (existem) para todos declaragoes sao locais 20 As declaragées feitas no bloco B, sao validas (existem) para todos 08 blocos que esto no interior de B. Isto 6, as declaragées feitas em B io locias ao bloco B e globais ao bloco C. As declaragdes feitas no bloco C, so locais 20 bloco C, Isto &, s6 existem durante a execugdo do bloco C. “91 Se uma viridvel for declarada com um identificador jé existente, entio a varidvel ativa passaré a ser a vari EXEMPLO4.1.A is INICIO (tics asim Ge rearaaas DECLARACAO DE VARIAVEIS ii ri 5 DECLARACAO DE VARIAVEIS | ] REAL:i,k kets | ] ise yt SCRE o 2 4 (global) conserva-se porque a varidvel i (local) funciona como se fosse uma nova varidvel(i’), es6existe quando © bloco interne estiver sendo executado. 42-Procelimentos oll Um procedimento € um bloco precedido de um cabegalho que contém o nome do procedimento, Podemos referenciar (chamar para 92 Thurodugdo ao Desenvolvimento de Algortmos execugio) 0 bloco "procedimento" de qualquer ponto do algoritmo (programa) através de seu nome. Objeti a) Evjtar a repetigdo no algoritmo de, uma seqiéncia de apis fade escrevemos obloco apenas uma vez, chamando-o de'procedimen to", e quando for necessdrio escrevermos o bloco novamente faremos apenas uma chamada ao procedimento, Chamar 0 procedimenio € como escrever novamente 0 bloco neste ponto do algoritme, coerentes, alteragoes" como uma "caixa prei valores, armazenados ém varidveis de “entrada” e exprime a resposta em varidveis de "sada ‘modelo PROCEDIMENTO nome_procedimento INICIO apa: aps | apa: FIM; {lim procedimento} Modularizagéo 93 Observagie: - A declaragio de um procedimento deve vir sempre no inicio do bloco que iré conté-Ja, Este cuidado nos ‘ajuda a manter uma boa disciplina de programagio. = As aches apresentadas entre < .. > no modelo cima, ‘so opcionais 6, 0 procedimento nao precisa conter estas declaragdes necessariamente. 42.1 - Referenciagio Um procedimento 86 é executado sob chamada, Esta chamada é feita da seguinte forma: Coloca-se 0 nome do procedimento no ponto onde seria necessario escrever a seqiléncia de acdes primitivas equivalente a0 pfocedimento. Quando 0 nome do procedimento for encontrado, durante a execucao, & como se uma c6pia do procedimento fosse en- caixada neste ponto do algoritmo (programa). EXEMPLO42.4 Construir um algoritmo para gerenciar uma agenda, ou sej cadastrar,alterar, remover ou consultar dados relacionados a um d minado nome. 94 Introdugéo ao Desenvolvimento de Algoritmos DECLARACAO DI DE CARACTERE; DE _ARACTERE; ‘velaome : nome , enderego ; ide vetreg = VETO vetrog agenda ; velnome : nome” procurado ; INTERRO: ichave,ctopgio’s "AG DE PROCEDIMENTOS. (ENTO esereva ree EXECUTE bus SEshave = 1 ENTAO SCREVA(Nome jd cadastrado") ;nome nome_procurado ; | EXECUTE ea reg; FIM. finclusio} “Modularzagio SSS 95 | sicio é . | DECLARAGAO DE VARIAVEIS {variévis locas ao bloco} ‘CARACTERE: resposia; EXECUTE busca; SE chave = 1 ENTAQ, INICIO {bloco entdo} | EXECUTE esereva reg; ESCREVA('Confirma exclusio < SIN >"); LETA(resposta) SE resposta = ENTAO, | agent PIM {entio} SENAO | ESCREVA('Nome nio encontrado’); FIM; (Exclusio} PROCEDIMENTO consulta, INICIO. | EXECUTE busca SE chave = 1 ENTAO, EXECUTE esereva_reg SENAO | ESCREVA(Nome nio eadastrado’); FIM, PROCEDIMENTO alteragio INICIO. | EXECUTE busea SE chase = 1 EXECUTE esereva_reg FIM. {aleragio) 96 Introdugéo ao Desenvolvimento de Algaritmos oe Inicio, LEIA (nome procurado); | PARATDETATE ct PASSO LFAGA Inicio | PSE nome_procurad ~ agen ENTAO, INICIO ‘have = 1 ‘ABANDONE REPITA {inicio do bloco principal) INICIO. | LEIA (opeéo); ESCOLHA, | CASO opgio = 1 EXECUTE inclusio CASO apgio = 2 EXECUTE exclusio CASO opgio = 3 EXECUTE consulta CASO angio = 4 EXECUTE exclusio CASO opgio = 5 ABANDONE ; CASO CONTRARIO. | | ESCREVACOpeio invalida ") | FIM ESCOLHA; EXEMPLO42.B Constet variaveis, um procedimento para trocar o conteido de duas Modularizagao - 97 DECLARACAO DE PROCEDIMENTOS PROCEDIMENTO troca_xy INICIO - | DECLARAGAO DE VARIAVEIS INTEIRO : au; (varidve local ao procedimento} 42.2 - Procedimento com Passagem de Parametro No exemplo acima, antes de chamarmos 0 procedimento troca_xy, tivemos que repassar os valores das variveis "a" e "b" para as variaveis "y" respectivamente, pois 0 procedimento troca_xy troca apenas 0 contetido das variavei Este problema pode ser contornado com ‘apassagem de pardmetros que permitam a troca de conteiido entre dois identificadores quaisquer. modelo PROCEDIMENTO nome_procedimento 10 ‘=DECLARACAO DE TIPOS> tipo 1; p3, pt tipo 2) ‘ apd apa procedimento} 98 Introdugao a0 Desenvolvimento de Algoritmos Onde: 1, p2.sdo pardmetros do tipo “tipo_1" 4 stio pardmetros do tipo "tipo_2" )_1 e tipo_2 podem ser tipos pri construfdos. tives ou EXEMPLO4..C Inicio DECLARACAO DE VARIAVEIS PROCEDIMENTO troca(x , y: INTEIRO) Inicio DECLARACAO DE VARIAVEIS INTEIRO : aux; {varie local a0 procedimento} 43 - Funcies Quando € necessério atribuir o resultado da execugdo de um procedimento a uma variével, devemos definir um pardmetro de retor- no, declarado no procedimento. Na chamada ao procedimento, este pardmetro nao recebe valor, isto & no passa valor para dentro do procedimento, entretanto na execucdo do procedimento, este pardmetro recebe um valor (resposta) que serd passado para fora do procedimento. EXEMPLO43.4 Construir um algor caleular a raiz quadrada do valor absoluto de um atimero i to , se 0 nimero for negativo, devemos transformé-lo em positivo, pois a fungo SQR(X) retorna a raiz. quadrada de X (CAP-2.1.3) somente se X for positivo. " Modularizagéo 99 iwicio | DECLARAGAO DE VARIAVEIS INTEIRO:k, resp; DECLARAGAO DE PROCEDIMENTOS PROCEDIMENTO abs(x,:INTEIRO) INICIO { retomao valor abslato de x navariévly) | SEx >0 ENTAQ yex SENAO kes EXECUTE abs (k, resp); {executa 0 procedimento abs e retorna o} | {valor absoluto de k na varivel resp} Ww © SOR(resp) ; {wtecebe a raiz quadrada de resp} ESCREVA (w) FIM, mo} Seria mais conveniente se pudessemos eserever |w SOR (abs(k)); { reocbe a raz quadrada do valor} {absolut de k} Isto € possivel,, chamado FUNCAO. Neste tipo de procedimento, o rest € declarada com um tipo que pode ser primitivo ou estruturado. 100 Introdugao ao Desenvolvimento de Algorir:os izando um tipo especial de procedimento ado da execugdo retorna (Sai para tora do procedimento) no préprio nome da fungdo, que ra verdade, € 0 identificador de uma varidvel, pois a fungao EXEMPLO 43.B INICIO | DECLARACAO DE VARIAVEIS INTEIRO :k, w resp; DECLARACAO DE PROCEDIMENTOS: FUNCAO abs (x: INTEIRO) : INTEIRO INICIO {retorna o valor absoluto de xa “Tungio" abs} | SEx >0 ENTAO abe 1 10 {soma dos Nintcieos} | DECLARACAO DE VARIAVEIS INTEIRO : ums DECLARAGAO DE FROCEDIMENTO FUNCAO soma (n: INTEIRO) : INTEIRO {a soma nt ico SEn=1 ENTAO IN) pode ser encontrada a partir da solugao ficagdo do problema, pode! chegarmos a uma solugio triv = en error ae {primeira chamada & Fungo soma } 102 Introdugéo ao Desenvolvimento de Algoritmos Observagio: Durante a execucdo teremos as chamadas ¢ 0s retor- nos executados na seguinte ordem: ‘Vamos supor que 0 ntimero lido em "LEIA (num) :" seja 5 ESCREVA (soma(6)) A —J ESCREVA (15) 7 erwom— a soma <5 + soma —l B28 chamada soma 4434240 3) H-¥ retorno | soma <4 +,sona G3), ce — cee 6-2 retorme al soma'=3 4,1 “man _| soma «'2 + sona (1) | D-4%chamada —— E-Stchamada —___ | 41) ~ Modilarzagéo : “103 Observagdo: As chamadas e retornos foram executados na seguinte ordem: A,B,C,D,E,F.GHLJ. Durante a execugio de um programa recursivo, ocorre um em- pilhamento de valores a cada nova chamada. Por exemplo, durante a execugio do algoritmo acima, teremos na meméria, as seguintes pilhas: ESTADO DAS PILHAS ¥ chamade (empilha) ‘estado das pilhas 2 schamadalempitha) estado das pilhas 3° chamada (empilha) estado das pilhas 4° chamade (empilha) estado das pilhas 5*, chamads (empilha) estado das pilhas 104 SOMA 5 + soma(4) ‘soma’ 4 + soma(3) 5 + soma(4) soma, afee ale x 3 + soma(2) 4 + soma(3) 5 + soma(4) soma Bluawee sluson ak 2 + soma(1) 3 soma (2) 4 + soma(3) 5 + soma(4) soma 1 2 + soma(1) 3 + soma(2) 4 + soma(3) 5 + soma(4) soma Introdugéo ao Desenvolvimento de Algoritmos ESTADO DAS PILHAS N SOMA 1 1 Z 2 + soma(1) 3 3 + soma(2) 4 4 + soma(3) IF retorno (desempilha) SS) 5 + soma(4) estado das pithas Ay ~~ soma! 2 3 3 3 + soma(2) 4] 4+ soma(3) 2® retorno (desempitha) 5 5 + soma(4) estado das pilhas a ‘soma 3 oy 4 4+ soma(3) 3° retorno (desempilha) 5] 5 + soma(4) estado das pilhas n ~~soma— | 4 10 4* retorno (desempilha) 5 5 + soma(4) estado das pilhas 7 soma 5* retorno (desempilha) 5 1s estado das pithas 1m soma aumenta, 0 espaco disponivel na meméria (nimero de "gavetas") vai diminuindo, e 4 medida que ocorrem os retornos, 0 espago disponivel na meméria vai aumentando, ‘Modiularizacéo 105 EXEMPLO 44.8 Construir um algoritimo para encontrar o N-ésimo termo da série de fibonacd ( 1,1,2,3,5,8,13,21,. Resolugio : Analisando podeinos notar que seu padrdo de compor- tamento € 0 seguinte : O novo termo pode ser construfdo a partir da soma dos dois termos anteriores. Isto é, 0 N-simo termo FB(N) pode ser dado por : { 1 seN = 1ouN=2 FB(N) = FB(N-1) + FB(N-2) seN>1 INICIO (fibonsei recurso} DECLARAGAO DE VARIAVEIS INTEIRO: mum; DECLARAGAO DE PROCEDIMENTO FUNGAO f(a; INTEIRO) ; INTEIRO {termo¢incio} ‘cio SE(n=1)0U(@=2) ENTAO bea SENAO fh = fh(ot) + FIM; {feng LEIA (nam); ESCREVA (Tom) 5 FIM, {fibonacs recurso} 106 Introdugdo ao Desenvolvimento de Algorimos Durante a execugéo, teremos as chamadas (cN) e os, retornos (fN-V) executados na seguinte ordem: ‘Vamos supor que 0 néimero lido em "LEIA (num) ;* seja6 Observacéo: Figura 12 EXEMPLO4.4.C CConstruir uma fungio recursiva para encontrar NE -= Nx (N-1)x(N-2)x...x3 x2. 1, para N inteiro positivo note que NI = Nx(N-1)! pata N > 0 logo: fa seN=1 FAT(N) = } NxFAT(N-l) seN>1 107 Modularizagéo INICIO {atrial wtiizando fungio reeursva} DECLARAGAO DE VARIAVEIS INTEIRO : num; DECLARACAO DE PROCEDIMENTO 'FUNCAO fat(a : INTEIRO) : INTEIRO {fatorial¢inteiro} 10 SEn=1 ENTAO fa <1 SENAO fat © a fat(n); FIM {fungio fat} LEIA (num) 5 ESCREVA (fat(num)); FIM. {fatorialrecursvo} EXEMPLO 4.4.) inicio F ; DECLARACAO DE VARIAVEIS INTEIRO: 2 lat. DECLARAGAO DE PROCEDIMENTOS PROCEDIMENTO fat(np, ftp : INTEIRO) ; INIclo . : DECLARAGAO DE VARIAVEIS INTEIRO :p, slap; SE np = 1 EXECUTE fat(np-t vatp) 5 slatp ~ vitp” FIM, {procedimente fat} LELAG) vat = 0; EXECUTE fat(nfat) ; ESCREVA(vfat); FIM. 108 Inrodugéo ao Desenvolvimento de Algorimos Construir um procedimento recursivo para calcular 0 fatorial. EXEMPLO 44.5 Construir um algoritmo para efetuar um "controle de estoque’. INICIO {bloco psincipal} DECLARACAO DE TIPOS vei_nome = VETOR[T. 30] DE CARACTERE; vet_2 ear = VETOR|I.2] DE CARACTERE; vet"S-ear = VETOR[IS] DE CARACTERE; reg = REGISTRO vet 5 cat! n_prod ; {nimero do produto} REAL =p comprap_vendamov_saidaymov_ent; INTEIRD! abn asi compas ‘et_namo nome abnor | vel reg = VETOR(L. 1000] DE rex, DECLARAGAO DE VARIAVEIS vel ree: etoque INTEIRO: 1, chive, opgio, ct; at: REPITA Inicio. LETA(opdio); ESCOLIA opgao CASO opgio = 1 EXECUTE cadasiro; CASO opgio = 2 CASO opgia = 4 EXECUTE movimento; EXECUTE relario; CASO opeio = 6 ABANDONE casocONTRARIO | | haat’ FIM epi | areas =, Modolarizagao “109 PROCEDIMENTO leia_reg Inicio ‘COM estoquefi] FAGA INICIO LEIA(tpo); LBIA(classe) LEIA(nome) ; LEIA descrigdo); LEIA(p_compra) ; LEIA(p_venda) LEIA(q_ anima); LEIA(q_atual) LEIA(q_mixima) ; LELA(dat_ult_compra) ; LETA(«_ult_compea) ; LEIA(nome_fab) ; LEIA(nome_rev) ; FIM cia reg) PROCEDIMENTO esereva_reg, INICIO COM estoquefi] FAGA, inicio [ESCREVA (tipo) ; ESCREVA (classe); ESCREVA(nome) ; ESCREVA (deserigio) ; ESCREVA(p_compra); ESCREVA(p_venda) ; ESCREVA( minima) ; ESCREVA(q_atual) ESCREVA(q_miimma); ESCREVA (at_ult_compra) ; ESCREVA(q_ult_compra) ; ESCREVA(nome_fab) ; Introdugo 20 Dasanvolvimento de Algoritmos PROCEDIMENTO cadastro INICIO EXECUTE busca SE chave = 1 ENTAO ESCREVA(Produto jécadastrado’) SENAO Inicio ae atl; | estoquelt}._prod = n_prod proc isa; | | EXECUTE Kia_reg: f FIM; {sendo} IM; PROCEDIMENTO exclusio INICIO DECLARAGAO DE VARIAVEIS CARACTERE : resposta; EXECUTE busca SE chave = 1 ENTAO INICIO EXECUTE esereva reg; ESCREVA(‘Confirma < SiN >") LEIA (resposa) SE resposta = 'S* | ENTAO estoquefet].n_prod ="; FIM {entio} SENAO ESCREVA(Produto nfo cadastrado"); FIM. Modularizagao 114 PROCEDIMENTO alteracSo Inicio. EXECUTE busca ; SE chave = 1 ENTAO INICIO EXECUTE escreva regi EXECUTE leia_reg; FIM {entdo} SENAO ESCREVA(‘Produto nfo cadastrado*) ; FIM; PROCEDIMENTO movimento inicio REPITA Inicio LEIA (opsao) ; EXECUTE reajuste ; (CASO opgdo = 2 EXECUTE: CASO opgio = 3 EXECUTE dé ‘CASO opgio = 4 EXECUTE reajuste 5 CASO opgio = 5 ‘ABANDONE | CaSO CONTRARIO | ESCREVA(‘Opgio invélida); | FIMESCOLHA ; FIM; ATE opgio = 5; FIM; 112 Introdugao ao Desenvolvimento de Algoritmos PROCEDIMENTO entrada INICIO DECLARACAO DE TIPOS ESCREVA(‘Produto nio cadastrado") ; FIM. PROCEDIMENTO saida INICIO Sir meagioceraciam INICIO. EXECUTE escreva. reg; LEIA(G_prod) ; SE ¢ prod <= estoquefi}.q_atual qatual © estog toque] mov suida «esto FIM {entéo} 7 SENAO. ESCREVAOumtdace no Mocttarzagao ns. PROCEDIMENTO devolucéo inicio DECLARACAODE VARIAVEIS REAL: 4 p_dev; EXECUTE basca SE ctave = 1 ENTAO Inicio EXECUTE escreva_reg; FIM. PROCEDIMENTO resjute INIclo DECLARAGAODE VARIAVEIS REAL sea) CARACTERE esp ESCREVA(Reajuse global < SIN >"); ATE ct PASSO 1 FACA p.venda + (estoguel -p_venda * real) /100 ; esp + 'S'; ENQUANTO resp = 'S"FACA INICIO EXECUTE busca ; SE-chave = 1 ENTAO 114 Introducéo 40 Desenvolvimento de Algoritmos inicio EXECUTE esereva regs FIM ( SENAO ESCREVA(roduto nfo cadastrado’); ESCREVA(Atulizar mais alum SiN); LEIA FIM ; {enquanto} J rants teensy FIM; PROCEDIEMTO relatsrio INICIO REPITA ic10 LEIA(ope0) 5 ESCOLHA opeio (CASO opeio = 1 EXECUTE movinento_ditio; CASO opgao = 2 EXECUTE prod_ah_ext_minimo ; CASO = 3 ABANDONE CASO CONTRARIO ATE OFCAO = 3; FIM, . ‘Modularizagso 115 ‘COM estoqueli] FAGA, (clo ESCREVA(a 4 ESCREVA(nome) ESCREVA(p_venda) ESCREVA(mo¥_saia) ESCREVA(p compra) ESCREVA(p_venkla * mov inicio DECLARAGAO DE VARIAVEIS ‘CARACTERE : rep; SErep = ENTAO INICIO PARADE 1 ATE ct PASSO.1FACA. stoquemoy_ent <> 0) OU joque.mov_safda < > 0) SE chave = 1 ENTAO EXECUTE escreva_mov; {senio} FIM, 116 Introdugdo ao Desenvolvimento ce Algoritmos {OCEDIMENTO prod_ab_estminimo {produto abaisn do estoque minimo} 10 PARA DEI ATE ct PASSO 1 FACA INICIO ESCREVA(n ps ESCREVA(nome) ESCREVA(lasse); ESCREVA(4 minima); FSCREVA(G atual); FIM; FIM; {emtio} FIM; {para} | | anc FIM. PROCEDIMENTO busca {busca seqiéncial} 1N DECLARACAO DE TIPOS vet = VETORIL.5] DE CARACTERE;; DECLARAGAO DE VARIAVEIS. PARA {DE 1 ATE ct PASSO 1 FACA INICIO SE n_prod_proc = estoguefi}.n_prod ENTAO INICIO chave + 1; ABANDONE FIM ‘SENAO chave = 2; Modutarzagao = 117 45 - Exercicios oe 1 -Constrairuma fungao recursiva para calcular ovalor de N elevado ‘a0 expoente X, sendo X um niimero inteiro. analise 0 carater_recursivo da expressio K = N*e obtenha a fungio recursiva apresentada abaixo: 1 ex=0 K(NX) =¢ NxK(N, eX >1 WMNK(NX-)) eX <0 2 - Construir uma fungao recursiva para efetuar a andlise combinat6ria, dada abaixo, que pode ser utilizada no reenchimento de cartelas de loteria : CaP = CPt + Coa Pt (AB,CD.E}.5,3) ({A.BCD,}.4,3) (AB.CD.E} 42) a I ({A,BC}3,3) ({A,BC}3,2) ({A,B,C}.3,2) CABS) auc ADE BD,E CDE (ABh22) (AL) (AB}22)— AB}) { | \ 1 ABD, ACD ABE ACE BCD BCE 3 - Construir um procedimento recursivo capaz de inverter uma seqiiéncia de caracteres, armazenados em um vetor de 20 elemen- tos. 118 Introdugéo ao Desenvolvimento de Algoritmos 4+ Construir um procedimento para obter 0 reverso de um némero inteiro, por exemplo : 471 > 174. lgoritmo recursivo para o problema da torre de Hanoi, O problema consiste em tranferir N discos que esto na haste A para a haste C, utilizando as seguintes regras: 1 - mover somente um disco de cada vez. 2 - nenhum disco deve ser colocado sobre um disco menor. 3 = qualquer disco pode ser movido de qualquer haste para qualquer haste, respeitando a regra 2. PROCEDIMENTO hanoi(n:INTEIRO ; origem, destino, tempordrio : haste) & By ANTES DA execucio Figura 13 DePois 0k execugio Observagio: use recursividade e pilha n = IT mover da haste A para a haste C se ¢ n> Lmover n-1 discos da haste A para a haste B, usando a haste C como suporte e em seguida, mover o disco n da haste A para ahaste Ce finalmente, mover n-1 discos | da haste B para a haste C, usando a haste ( Acomo suporte indo funcdes e procedimentos para 6+ Construirum alg ‘0, atendendo as especificagdes a cdlculo de folha segul ~ Moduianzagéo™ — 119 - Carga koréria : 240 horas/més = veneimentos : salério_base = 6.484,00 salério_horas_extras = (salério_base /240) x 1.50 salério_famflia = 300,00x nimero_de_dependentes 1 - 5% do salério_base + salério_horas_extras 2 10% do salério_base + salério_horas_extras 3 - 20% do saldrio_base + salériohoras_extras quinquenios c6digos: 1,2,3,4 1-05 anos , 5% do salar 2-10 anos , 10% do sal 3-15 anos , 15% do sal 4-20 anos , 20% do sal vencimentos = )_base + salério_horas_extras + s smiflia + insalubridade + periculosidade + quinquenio = descontos : descontos_por_faltas = (salério_base / 240) x hhoras_descontadas iapas salério_dese_iapas = vencimentos - desconto_por_faltas “420 Tirodugdo 20 Desenvolvimento de Algortmos se salério_dese_iapas = 5_salério_minimo entio dese_iapas = 8,5%_salério_desc_iapas io_dese_iapas < 10_salério_minimo = 8,75%_salério_desc_iapas dese_iapas + 15_saléri is = 9,5%_saldrio_des sendio des_japas = 10%_de 20 salério_minimo imposto de renda saldrio_desc_i_r = vencimentos - desconto_por_faltas se 25%_salari entio isento sendo se liq_it = 53,000,00 iq i r-4.655,00 it -78.365,00 Modiularizagao aT ruto = vencimento- dese por faltas liquide = salério_bruto - desc_fapas - dese it existe uma ficha para cada funcionério, contendo: ~ mimero de matricula - niimero de horas extras = mimeo de horas a descontar - e6digo de insalubridade - e6digo de periculosidade + e6digo de quingiiénio cargo Considere que (nimero de matricula = 0) é 0 finalizador. As outras informagoes necessarias estéo dispostas nas seguintes tabelas : tabela de cargos e salarios cargo, salério tabela de bancos \N® matricula , nome do banco , N° da conta algoritmo deve emitir um relatério, contendo as seguintes informagoes: 122 Introdugéo a0 Desenvolvimento de Algoritmos N® matricula, nome do banco , N° da conta, salério Iiquido 7T- Construira fangéo digyer(x) do tipo inteir Xretorne um némero formado por x e seu -Leiax ~dig ~ digver(x) -Escreva dig dado opardmetro 10 verificador . Exemplo: —_ Supondo que o nimero lido em x seja 4048675 ‘onimero escrito seré 40486753 es 6 BS x6 TBD. 12+ 00 + 20 + 48 + 42 + 56 + 45 = 223-+203| 11 03 20 40486753 = 3 8- Escreva uma funcéo do tipo l6gico para verificar se o nfimero lido estd correto (compare o digito verificador). 9- Construir uma funcio que retorne uma seqiiéneia de ar- ‘mazenados em um vetor de 40 elementos. subseq(nome_vetor,intcio,tamanho) “nome vetor o nome do vetor de onde a subseqiéncia seré la € 2 posigio no inicio da subseqiléncia no vet = tamanho é o nlimero de caracreres que a subseqii Modularizagéo 123 Observagio: a fungio receberd 3 pardmetros ¢ iré retornar um vetor com 40 elementos no maximo. 10 - Construir uma fungdo que : dada uma data retorne o dia da semana. n = INT(365,25) x g(am)) + INT(30,6 x f(m)) + d- 621049 ds = ((0/7)-INT(n7)) x7 + +1 a-lsem <2 g(am) = a som>2 m+ 13sem< 2 f{(m) = m+1 sem > 2 2sen < 36523 ve Ise 36523. < n < 73048 Ose n > 73048 Observagio: _O dia da semana seré dado por ds da seguinte forma: 1-domingo , 2- segunda, .. 124 Introdugdo ao DesenvoWvimento de Algormos ESTRUTURA DE DADOS COM_ ALOCACAO DINAMICA _ 3: Ponteiros _——. Nas estruturas de dados do tipo vetor ou matriz, a alocagio (organizacdo dos dados na mem6ria) é feita de forma contigtia, isto é, existir retas" disponiveis, dispostas de tal "gaveta" g_N esteja imediatamente & direita da "gaveta’ g N-1. que a alocagéo contigua na meméria C el g2 g3 gN2 gNl gN ‘Como isto nem sempre & pos disponiveisna meméria, porém di Neste caso, seria impossivel d elementos. Estruturas de Dados com Alocagao Dinamica 428 Apresentaremos um mecanismo que permita : ~ Alocar espago para novas varidveis em tempo de execugio. - Definir "ligagdes" entre estas varidveis de forma dindmica, Quando declaramos uma varigvel, definimos um tificador da veriavel) e entao toda referéncia feita a esta através deste nome. Outra forma de referenciar uma v de seu endereco. Fazendo uma analogia da meméria com um armario, podemos dizer que o endereco de uma variavel €equivalente ao ntimero da gaveta, supondo que todas as gavetas do armério sejam numeradas da seguinte forma : wenn! bp = wee Ken Figura 14 Onde gK €0 endereco (ntimero) da variével na memoria, As varidveis declaradas na rea de declaragao de var VARIAVEIS ESTATICAS e existem (sto alocadas na meméria) apenas durante a execucdo do bloco que as contém. VARIAVEIS DINAMICAS ndo sto declaradas na 4rea de declaracao de variaveis, logo nao podem ser referenciadas diretamente (ndo possuem identificadores). Para fazermos referéncia a uma varidvel din&mica, usaremos 0 conceito de ponteio, varidvel cujo conteiido s6 ode ser 0 endereco (niémero) de uma variavel na meméria, Declara-se um ponteiro, fornecendo o tipo da variavel para a qual le iré apontar, isto é, p € um ponteiro do tipo t se houver a declaracao: DECLARACAO DE TIPOS Pltipo_t = PONTEIRO PARA OTIPOt; DECLARAGAO DE VARIAVEIS PLsipo_t:; 126 " Inrodugéo a0 Desenvolvimento de Algorimos Dizer que p aponta para uma varidvel do tipo t, significa dizer que a varidvel p esté armazenando o enderegg (niimero da "gaveta’ na ‘meméria) de uma varidvel do tipo t, isto é, 0 ponteiro aponta para 0 primeiro endereco de uma rea de meméria reservada para armazenar © registro, denominada de “heap”, Nas estruturas do tipo vetor € matriz, 0 mimero maximo de elementos deve ser conhecido ou estimado durante a construgéo do ide de meméria douma melhor utilizagio da a importante da estrutura de alocagdo dindmica €a facilidade de remogdo sergio de elementos, diferentemente das estruturas do tipo vetor e matriz, que podem exigir considerével movimentagao dos dados neste tipo de operacio. Procedimentos primitivos para variaveis de alocagdo dinamica: ALOQUE (p) _- Reserva um espago na meméria, com tamanho suficiente para armazenar os dados pertencentes a uma variével do tipo n6 ( p é um ponteiro para o tipo n6).. Tepresentacdo do efeito na meméria Figura 16 DESALOQUE (p) - Libera 0 espaco que foi alocado pela varidvel dindmica (n6). Outra conseqiiéncia é que o contetido da varigvel apontador passa a ser in- definido, isto é, p passa a apontar para um local de informag6es mulas. Estruturas de Dados com Alocagdo Dindmica 127 Figure 16 Gy, p NIL - Esta at jo faz com que a vari apontador p receba um valor indefinido, isto é, que 2 varigvel aponte para um local de informacSes rules (NIL). representagio do efeito na meméria Figura 17 1 “8.2 Listas Lineares ‘52.1 Lista Simplesmente Encadeada. Uma lista encadeada é uma seqiiéncia de elementos (registros) ligados por um apontado , cada registro tem um campo (apon- tador) que contém o endereco do proximo registro. Por exemplo, um grupo de notas pode ser definida como uma lista, da seguinte forma: DECLARAGAO DE TIFOS pir = PONTEIRO PARA O TIPO nb; 6 = REGISTRO ota: REAL} prox.nd: pte DECLARACAO DE VARIAVEIS ess) 128 Introcueso a0 Desenvolvimento de Algorimos alocagdo : Podemos representar 0 grupo de notas { 5.7,8.1,3.4 } da seguinte forma: oes ered No" NOTA PROXNo™ Figura 18 Neste exemplo podemos identificar : = Oponteiro para o ink a lista chamado de “infcio" = Uma seqiléncia de 3 elementos (ns) ~ Em cada n6 existem duas variaveis, "nota" que armazena a nota e avaridvel 'prox_né" que armazena o enderegona memoria, onde esta alocado o préximo né, isto 6, aponta para o né subsequente. yonta para um local de fim da lista. E24 Operas Bsieas para Manipulag de Lista Encadeada a) - insergao de um nd b) - localizaedo de um n6 ©) Femogio de um n6 a) A insergio ce um n6 pode ser feita de varias maneiras, exem- plificaremos dois casos : 1) O novo n6 seré colocado no final da lista 2) 0 novo n6 ser colocadio na ‘mantenham ordenados através do cont de forma que os nos se jo deum derminado campo. 1° Caso (iremos inserir 0 novo né no fim da lista da fig-18). 1° Passo Utilizaremos um ponteiro auxi (ptr_aux) ¢ faremos sua ~ Estruturas de Dados com Alocagéo Dindmica "429 5 4° Passo wie NOTA PROK.NO' NOTA PROX_NGT NOTA PROX.NO” G- Gi —- Is— EA Fazemos prt_aux apontar para NIL. ee |] -—_] s Se ee 2°, Passo Atribuiremos a nota ao novo né e faremos prox_n6 apontar para Figura 22 NIL. PROCEDIMENTO ar INI agin pun dat) V" BecianacAoDEriPos b= FONTEIRO PARA O THO; pir_auxt. nota +96; ptr_auxt. prox_né « NIL; } +} 6 = REGISTRO @- EI er ices PROK.NS NOTA TR. AUX | nota: REAL} fess }=——fe prox 26: pir; igure rt cial | DecLaRAGAO DE vaRIAVEIS pr inf; 3° Passo Localizaremos 0 Giltimo elemento da lista (isto ocorre quando prox_né apoata para NIL, ou seja, prox_né = NIL) e em seguida, faremos prox_n6 apontar para 0 né apontado por ptr_aux. Be ee aes Figura 21 130 Inrodugéo a0 Desenvolvimento de Algortmos Estruturas de Dados com Alocagéo Dindmica 131 PROCEDIMENTO insert. fim da fsta INICIO {alr inser no fim a ita} DECLARAGAO DE TIPOS HI = FONTEIRO PARA OTIPO 15; 16 = REGISTRO seta: REAL; | rox n6: prs DECLARAGAO DE VARIAVEIS pir_auxt) nota + nova_sota; ptr_auxt. prox.n6 + NIL; fim + inicio ENQUANTO (fim. proxnd < > NIL) FAGA fim + fim. proxn6; {fim aponta para prox_n6} + {Prox_né aponta 0 novo n6} ptr_aux + NIL {deixa de apo fim © NIL; {deixa de FIM; {insere_fim_da lista} fim. prox_nd'« pir 22, Caso Suponhamos que cada elemento deva ser inserido na modo, que a lista se mantenha ordenada pelo valor das no! crescente. 18 Passo aremos um ponteiro at yux) € faremos sua “132 Introdugéo ao Desenvowimento de Algortmos Figura 23 28, Passo Atribuiremos a nota ao novo né e faremos prox_né apontar para NIL. ptr_auxt. nota = 63 ; ptr_auxt. prox n6 « NIL; Figura 24 3°, Passo Percorreremos a lista, fazendo 0 ponteiro ptr_maior apontar para © proximo née ponteiro ptr_menor apontar para 0 né atual, enquanto a nota do né atual for menor que a nova nota. "Estruturas de Dados com Alocagio Dinémica 133 Figura 25, 42, Passo ras a} fel, ae i= [Ere ses Faremos ptt_maiort. prox_né apontar para o n6 apontado por ptr_aux (nova nota é imediatamente maior que nota). aS Ta Figura 26 5°. Passo } — | T]erewsion Faremos prt_aux. prox_né apontar para 0 n6 apontado por ptr_maior (nova nota é imediatamente maior que nota). Figura 27, 134 NOTA PROXNO" NOTA PROX.NO' NOTA PROX. NO" NOTA PROX.No* ale (x: Je}—~ [aslo ae eel Introdugao ao Desenvolvimento de Algoritmos 62, Passo Faremos os ponteiros auxiliares ptr_aux , ptr_menor e ptr_maior apontarem para NIL, BsT4— [evTe}— [esTo Figura 26 GR Ea Gh PROCEDIMEN70 ins INICIO algorima DECLARAGAO DE TIPOS. ptr = PONTEIRO PARA otiponé; 16 = REGISTRO aioe f. nota < pir_auxt. nota E cmaiort. proxné <> NILFACA nor ~ pir_maior ; ior «ptr maior}. prox.n6 ; - nota > ptr_aux t nota menor T. prox né« ptr_aux; {menor apoata nara nove n6} a ptr aid: {novo né spon pra maior it~ RIL; {dea de apontar} oe: tuaior = Nit (eb de aponar ‘menor « NI i a da ita} Estrturas de Dados com Alocagéo Dinimica ===S*~*~S*S*~«w b) Remogio de um né 1, Passo (remocio do 6 cuja nota é 6.3) Localizat 0 n6 que serd removido, ptr_temove e ptr_menor, endo a diferente da nota a ser izando os ponteiros fa enquanto a nota for 29, Passo H eel} 136 Introdugéo ao Desenvolvimento de Algoritmos 3°, Passo Faremos ptr_remove t. prox_n6 e ptr_menor apontar para NIL. th ome 4°. Passo 3) 0 espago de memo NTA PROX.NG'NOTAPROKNS' NOTA Figura 32 © Estruturas de Dados com Alocagéo Dinémica 137 PROCEDIMENTO remover _n6_da lista INICIO ‘algoritmo remogio de um determinado n6 da lista} DECLARACAO DE TIPOS pr = PONTEIRO PARA OTIPO 16; 13 = REGISTRO nota: REAL prox 6: pir: removet. nota <> nota_a remover E pir_remove }.prox_n6 <> NIL FACA wicio ptr_menor = ptr_remove ; tr remove « pur_remove}. prox nd ; SE pir_remove }. nota = nota_a remover ENTAO NicIo | ptr_menor t. prox.n6 = ptr_remove t. prox nd; remove f. prox_n6 = FIM; finsere_meio_da lista) $337 sia Duplamente Bacadeada Se em uma lista encadeada unicamente , tivermos um apontador apontando para um determinado n6, podemos continuar a percorrer a lista sequencialmente (da esquerda para direita). Porém se mudarmos de idéia e resolvermos voltar a apontar para 0 né anterior, ficarfamos 138 Introdugéo ao Desenvolvimento de Algoritmos té apontarmos para o nd desejado. iremos construir um registro (n6) que ird ‘conter 2 apontadores, n_ae m_p, que irdo apontar para o n6 anterior e ara 0 nd posterior respectivamente. + declaragao DECLARACAO DE TIPOS ptr = PONTEIRO PARA O TIPO 26; 16 = REGISTRO 1a: prs {itd apontar para n6 anterior} nota: REAL an ar pra. ons patron DECLARAGAO DE VARIAVEIS nko; - representacao HAMDN? LANTAES AAnoTINE na nome Geta Gletlel— lela Gr rl uF if t t I nt Fowe 33 Com esta nova estrutura podemos percorrer a lista € voltarmos 20 6 anterior, caso seja necessdrio. Entretanto, as operacoes bisicas (insergéo e temogio) tornam-se mals detalhadas “Estruuras de Dacos com Aocagdo Dindmica 139 12, Caso (insergio no meio da lista) 12, Passo espago na meméria para a nova nota, usando um ponteiro auxiliar ), armazenar a nova nota (73) ¢ fazer os apontadores n_aen_papontarem para NIL. Figura 35 140 Inrodugdo a0 Desenvolvimento de Algortmos 3°, Passo Faremos ptr_auxt. n_p apontar para 0 n6 apontado por pir_maiore ptr_aux’ :pontar para 0 n6 apontado por ptr_menor. PIEXIG nort. n_p apontar para 0 né ap. 1_a apontar para o n6 apontado por NANOTAN? NLANGTA WLP NLANOTA wp NANOTA (rls«[+}+-— [ -t— [tbsle I | (is z rrasr Fears dass ops nee 58, Passo Faremos 03 ponteiros auxiliares ptr_menor , ptr_aux e ptr_maior apontarem para NIL. fh Gi GR _no_meio_da lista [algoritmo insergio no meio da lista duplamente encadeada} DECLARACAO DE TIPOS ptr ~ PONTEIRO PARA O TIPO 16 ; ng = REGISTRO ‘a: ptr; {aponta pora 0 n6 anterior} nota: REAL; 1p: ptr; {aponta para o 6 posterior} | DECLARAGAO DE VARIAVEIS pile incio, ptt_menor, ptr_maior, ptr_sux; REAL: nova_nota; ALOQUE (ptr_au) LEIA (cova_nota); ptr_auxt. nota + nova_nota ; “4142 i Introdugao 20. Desenvolvimento de Algoritmos pirat. aaeNIL; pi_awt. apeNIL; ptr_maior + inicio; ENQUANTO ptr prtmaior t. a_p <> NIL inicio plr_menor © ptr_maior; jor 1. nota < ptr_auxt. nota ENTAO INICIO sx; {menor aponta para novo nb} {maior aponta para nove n6} taux NIL; (deea de spontar} pU_maior « NIL; U_menor © NIL FM; FIM; (insere_meio da _, 522.1 - Lista Cirealar. Se em uma lista duplamente encadeada, fizermos o ponteiro n_p | (Ponteiro que aponta para o préximo n6) do tiltimo né apontar para 0 | primeiro n6, ¢ 0 ponteiro n_a (ponteiro que aponta para 0 né anterior) do primeio n6 apontar para o diltimo n6, teremos uma estrutura denominada de lista circular duplamente encadeada, Estraturas de Dados cam Alocagdo Dinémica 143 NANOTANP —NARNOBNP NS fase Glsls Gly Ghels rario (percurso circul rapidamente o tiltimo n6, a fim de percorrer a lista no sentido contrério, “$32: Pithas ‘Uma pilha é uma lista na qual as operagdes de insergio ¢ remogio sao feitas na mesma extremidade, denominada "topo" da pilha. Desta forma, otiltimo né a ser inserido é 0 primero né a ser removido, 144 Tinrodugso ao Desenvolvimento ce Algorimos 533-Deque (filadeduasextremidades) ‘Um deque ¢ uma estrutura linear mais geral,na qual as operagées de insergdo e remogio sfo_permitidas em ambas as extremidades da ii _34-Arvores ‘Uma érvore é uma representagio capaz de exprimir a relagio de hiierarquia existente entre 0s dados, ou a relagao de composigio onde uum conjunto de dades é subordinado a outro. 5.4.1 - Construcaode Figura 40 Umn6 K (nivel-N) é denominado de filho do n6 M (nivel-Y) se N for igual a Y +1. Um n6 K (nivel-N) é denominado de pai do n6 M (ni for igual a Y - 1. Na drvore acima, os nds B ¢ C sio filhos do n6 A , logo 0 n6 A & pai dos nés Be C. Estraturas de Dados com Alocapto Dindmica : 445 Observagio: Um né H (nivel-J) & denominado de raiz da érvore se J for igual aum . Neste caso, on6 A (acima) & a raiz da drvore. Para acessarmos um determinado né da arvore, teremos que acessar obrigatoriamente todos os seus ancestrais. Isto 6, teremos que respeitar uma hierarquia, daf a relagio hierérquica. A Girvore acima, € denominada de drvore binéria pelo fato de que cada n6 pode ter dois filhos. A drvore bindria é largamente utilizada, devido ao tempo de recuperacio das informagdes (tempo de acesso) ‘que € da ordem de log(N), ver (cap-6). Outras representagdes podem ser construidas, dependendo do tipo de aplicagio, isto & , podemos ter uma drvore onde cada né tenha N filhos. + Insergiio de um né em uma drvore bindria Suponhamos que exista uma drvore onde cada n6 é um registro, ‘contendo os seguintes campos : DECLARAGAO DE TIPOS pir = PONTEIRO PARA OTIPOn6 126 = REGISTRO sponta pora o 26a esquerda} srmazens o valor} + faponta para o n6 A direita} DECLARAGAO DE VARIAVEIS er: inicio; 146 Introdugéo ao DesenvoWvimenta de Algoritmos Figura 41 Estamos interessados em inserir 0 valor $ na drvore acima, de forma que ela se mantenha ordenada, isto é: 18, Passo Alocar espago para 0 novo valor (ptr_aux) e fazer os ponteiros esquerdo (e) e diceito (d) apontarem para NIL e o ponteiro que iré ercorrer a drvore (ptr_pe) apontar para a raiz.da érvore. Figura 42 2°, Passo (Caminharemos na drvore até encontrarmos o n6 que seré.o pai do 16 apontado por ptt_aux, tomando as decisées a seguir: Estraturas de Dados com Alocagdo Dinémica 147 SE novo valor (ptr_auxt. v) for menor que va ENTAO ‘SE 0 filho esquerdo (ptr_pet. ¢) for diferente de NIL. ENTAO ‘vamos para oflho esquerdo (ptt_pet. ©) SENAO fagafhoxquerdo (ptr pet.«) apolar paraon6 apontado por pir aus SENAO SSE novo valor (ptr_auxt. v) for maior que valor (ptt_pet ¥) ENTAO Eo filho dreito (ptr_pet .d) for diferente de NIL ENTAO ‘vamos para. filho direto (pit_pe?. d) SENAO facafilhodircto (ptr_pet. d) apontarparaon6 apontado por plr_aus SENAO nig inseri o novo valor 3, Passo. Sana ina, Figura 43 148 ° trodugdo a0 Desanvavimento de Algorimos Faca ptr_aux e ptr_pe apontar para NIL oft, Figura 44 INICIO {eriaga insergio em Arvorebindria) DECLARAGAO DE TIPOS ptr: PONTEIRO PARA O TIPO 16; 1n0 = REGISTRO ‘e:ptr; {aponta pora on6 a esquerda) ty:REAL ; farmazena o valo < sptr;{aponta para o n6 ds | DECLARAGAO DE VARIAVEIS {varivesglobis} Pt into, ptr_awes REAL tor} DECLARACAO DE PROCEDIMENTOS PROCEDIMENTO aloca(ptt_aloe: ptr; vl aloc: REAL) {procedimento para alocar espago para o novo valor} ALOQUE (ptr_aloc) pu_aort.¥ = vLaloc, piraoct. e# NIL; piraloct. d « NIL; FIM; {procedimento aloca} Estruturas de Dados com Alocagdo Dindmica 149 PROCEDIMENTO insero(ptr_pe: pr; vl proc: REAL) INICIO {procedimento para insercdo em Aivore bindria} ‘0 EXECUTE insere(ptr_pe’. ©, v1_proc) SENAO_ INICIO EXECUTE aloca(ptt_aucj¥l_proc) 5 pir_pet. eps 5 FIM SENAO SEvLproc > plr_pet.v ENTAO SEptepe.d <> NIL ENTAO EXECUTE insere(pts_pet. d,vl_proe) SENAO INICIO EXECUTE aloca(ptt_aux,¥L_proe) ; pir_pet. d= pir aux; FM SENAO ESCREVA ("este valor eiste na devon); Fibs {procedimentansere) inicio + NIL; ENQUANTO valor <> -1 PACA valor for diferente de 1} Figura 45 ) caminhamento pré-fixado: {MCABGHP } 1 -vista a raz 2+ porcorre a subrvore da esquarda 1 = percorre a subérvore da esquerda 2- visita a raiz ‘9 percorre a subérvore da direta, ¢) caminhamento pés-fixado: { ABCHP GM } 1 = porcorre a sublérvore da esquerda 2- percore a subérvore da delta 3 vista a ralz EXEMPLO 5.4.3 Construir um porcedimento recursivo para caminhamento pré- fixado Esirturas de Dados com Alocagéo Dinémica 151 PROCEDIMENTO pré_fiado(pere_p_f:prt)_{recursivo} Inicio ‘SEpere pf < > NIL ENTAO Inicio ESCREVA (pere_p ft. valor); EXECUTE pré_fixado(pere_p_tt. dit); EXECUTE pré_fixado(pere_p ft. esq); FIM; FIM; Observagio : A ordemaser escritaé: { M,C, A,B, G, H, P } EXEMPLO54.B Construir um procedimento iterativo para caminhamento pré- fixado Observagio: _- Utilizaremos 0 conceito de pilha ‘mos 0s ponteiros rafzes das subérvor izando os procedimentos e desempilha que deverdo ser (exercicio 3). 152 Irtrodugéo ao Desenvolvimento de Algortmas PROCEDIMENTO pré fuado(pere_p_f:px)_{teraivo} INICIO DECLARAGAO DE VARIAVEIS aie | sep pt = ML | ENTAO ESCREVA (‘cvore vai") SENAO | » pere_pDs ENQUANTO topo <> NILFACA | INICIO | topo < desempilha(topo) ; SEtopo <> NIL ENTAO INicIO _ 55 - Exercicios = 1-Manipulacio de ‘Construir procedimentos para: 4) inicializar uma lista duplamente encadeada ) vercar se uma lista esta vazia €} remover um né de uma lista duplamente encadeada Estruturas de Dados com Alocacéo Dinamica - 153 2- Manipulagao de filas. Construir procedimentos para : a) inserir um n6 na fil b) remover um n6 di ©) verificar se a fila es 3 Manipulacao de pilhas. Construir procedimentos para : lizar (criar) uma pilha a) Dns ym n6 na ROCEDIMENTO empilha ©) remover um n6 da pilha ; FUNGAO desenpilha(topo) Observacdo: A fungdo deve ser definida como sendo do tipo pon- teiro e deve retornar NIL quando a pilha ficar vazia, 4-Manipulacio de drvores. ‘Construir procedimentos recursivos para: a) remover um n6 da érvore ) verificar se um um dado valor esté contido na drvore ¢ )dadaa expresso aritmética (A + B)*2-2 + C* D} pode- ‘mos representé-la através de Arvore bindria de tal forma, que 2 prioridade das operagoes fique imp ’) Caminhe pela arvore na ordem pés-fixada empilhando o con- tetido de cada um dos n6s, A expresséo obtida { AB + 2*2C D* + - } € denominada de notagdo polonesa inversa para ex- presstes aritméticas. ii) Construir uma funcao que, caminhando na érvore, calcule 0 valorda expressdo: Os valores de A,B,C,D devem ser passados como pardmetros. 154 Inrodugéo a0 Desenvolvimento ce Algortmos 4 a He ; 5 A a Estruturas de Dads com Alocagéo Dinémica 155 =a PESQUISA DE DADOS 6.1- Andlise da Complexidade de Algoritmos Dado um problema que pode ser resolvido por um determinado algoritmo, aperecem questdes como: Este algoritmo é um bom algorit- ‘mo para resolver o problema ? , a solugdo € apresentada no menor tempo possivel ? 0 espaco de memoria utilizado € 0 menor possfvel 2. Os critérios mais utilizados para avaliara eficiéncia de um algorit- ‘mo sd0 0s seguintes : © Medir de alguma maneira o tempo de execugéo. ¢ Medir_a quantidade de meméria necesséria para a execugio do algoritmo. A anélise da complexidade de um algoritmo fornece medidas & criterios para medir a eficiéncia dos algoritmos. A complexidade de um algoritmo ou de uma classe de algoritmos, tem a ver com a "per- 156 Introdugéo 20 Desenvolvimento de Algorimas 2 diffculdade de geralmente requer formance" (desempenho) do algoritmo e no construgao do mesmo, embora um problema di ‘um algoritmo complexo. Para medirmos 0 tempo de execucdo de um algoritmo empirica- mente, é razoavel contarmos 0 mimero de passos executados por uma [pessoa ou uma maquina, que siga as instrugbes, até obter o resultado. Neste caso, o ntimero de passos é chamado de "tempo" de execucio do algoritmo. Esta medida de tempo ("passo") que tomamos depende, basicamente, da pessoa ou maquina que o executa. Isto 6, estamos considerando que um passo é a execugio de uma instrugao (agio primitiva) da nossa linguagem hipotética, entretanto cada aco primitiva ‘nossa linguagem é decomposta em varias instrugdes de "baixo nivel” (instrugdes executéveis por um computador real) para que o algoritmo seja executado, Desta forma, 0 tempo de execucdo de um algoritmo depende basicamente da maquina que iré executé-lo, isto 6, para compararmos ‘© desempenho de um grupo de algoritmos, deveremos executé-los em ‘uma tnica maquina ¢ com o mesmo conjunto de dados de entrada, além disso, todos os algoritmos deverdo ser implementados em uma tinica linguagem de programacio. Outra medida, comunmente utilizada para avaliar a eficiéncia de tum grupo de algoritmo, é a verificacao do espaco de memériautilizado pelo computador, durante a execucdo dos algoritmos com 0 mesmo conjunto de dados de entrada. Podemos avaliar a eficiéncia de um algoritmo, utilizando um processo analitico jé ue 0 processo empirico,citado acima,depende de ‘uma maquina ‘Suponhamos uma méquit tempo de execugio de qualquer instrugdo & constante e igu » estamos admit ‘o mesmo tempo gas:o na execugdo de uma adigéo. Supos seadmitirmos que arazdo entre o tempo de execugio de duas instruges distintas & constante, entdo, podemos dizer que um algoritmo tem complexidade de ordem N (O(N)) se o ntimero de passos seguidos para obter o resultado € proporcional a N (ntimero de dados de entrada), ou Pesquisa de Dados . 157 seja, serd executado um néimero de passos proporcional a N para se obter 0 resultado. No célculo da complexidade de um algoritmo, estamos interes- sados no comportamento assinttico de F(N), ou seja, no comportamen- to de F(N) quando N é muito grande. Uma fungdo F(N) domina assintoticamente outra fungdo G(N) se existem constamtes positivas M tais que, para N > M temos | GQ) | < {Kx | FN) |} Constante Logartmica Linear Quactrtica Cabica Exponencial Algoritmos de ordem polinomial séo mais eficientes que algorit- mos de ordem exponencial. Entretanto, existem problemas, cuja solugéo exige algoritmos de ordem exponencial. 158 Introdugao a0 DesenvoWvimento de Algorimos A. recuperagio de dados, geralmente armazenados em ar- quivos, exige algoritmos eficientes (recuperacdo répida dos dados). Estudaremos alguns métodos de pesquisa de dados, analisando sua eficigncia. Por exemplo, um algoritmo de busca seqiiéncial tem com- plexidade O(N), pois 0 ntimero médio de passos executados para en- contrarmos 0 valer procurado € N/2 , dizemos O(N), pois o nimero de ‘Passos serd sempre proporcional aN : Podemos com KxN passos (K constante) € um alg O(N), sendo No tamanho dos dados de entrada, ‘Uma 4rvore bindria de altura K tem no maximo 2X- 1 elementos (ns), ou seja: Nesta frvore temos 3 nfveis (altura K = 3 ) logo temos 7 nés, Figura 47 Bis7 K = LogN Oniimero méximo de comparagbes em uma rvore bindria seré K para uma drvore d ‘é, 0 ndimero méximo de comparacdes € proporcional a Log “omplexidade de um algoritmo para busca em drvore bindria (busca bindria) é O(Log N). Este é 0 melhor tempo possivel, portanto qualquer algoritmo com essa complexidade é um algoritmo "6timo" para pesquisa de dados. 2-1=N Raney Pesquisa de Dados “159 ‘Uma buses seqiiéncial consiste em percorrer uma estrutura (por exemplo, um vetor de registro), comparando o valor procurado com 0 contetido do campo chave (campo cujo contetido € a chave de acesso ‘aos dados). Se ovalor for encontrado, entéo abandonamos 0 percurso, v1 ENTAO {caminha para filho direito} ‘buse_bin « buse_bin(pait J ‘SENAO {caminha para filho esquerdo} ‘buse_bin + buse_bin(pait esq, l) FIM; {fungéo buse_bin} Introdugéo 20 Desenvolvimento de Algortmos 162 —65-BuseaIndexada SSS Podemos construir uma estrutura paralela do tipo vetor, érvore ou arquivo para conter o campo chave (em uma ordem de classificacao) e ‘um campo para conter 0 niimero do elemento na estrutura, onde os dados esto organizados. Por exemplo, podemos ter um vetor de registros (R), contendo os dados (campo id" e os outros campos) € outro vetor de registros (C), contendo a chave (nl) e o fndice (id) relacionado a esta chave no vetor (R), vetor (©) vetor (R) ia nl id outros campos 1fal3 1[D 2 [Bl 2 2/B 3lela 3la 4|p|1 4{e| O acesso ao vetor (C) pode s¢ to por busca seqiténcial ou por bicessdio. Ap6s localizarmos a chave "id" no vetor (C), podemos fazer acesso direto ao registro no vetor (R), cuja chave é igual 4 chave Procurada, através do nimero da linka no vetor (R) armazenado no campo "al" do veto: (C).. Este tipo de acesso € dados onde um arquivo "gran do cada um deles uma dete dados classificados de divers dados através do arquivo de indice que contém a classificagdo desejada, A grande vantagem deste método € que os dados nio sofrem movimentagio durante a classificacio, isto é os dados sempre se ‘mantém na ordem em que foram escritos. No exemplo acima, o vetor lizado em geréncia de banco de m varios arquivos de indice, conten- inada chave, portanto pademos "ver" os aneiras, bastando: i Pesquisa de Dados (©) estd classificado pelo campo chamado "nl", esta classificacdo im- | plicou na movimentagéo de campos, pois a principio o vetor (C) néo a ae do vetor(V) ¢ um registro contendo os estava classificado, sendo obrigatéria a troca de valores entre 0s indices. 7 D ro do registro (nr), esquerdo (e) e di Observacao: 0 filho esquerdo do né que esté armazenado no 6.6 - Exercicios elemento de indice K, €016 que esté armazenado 6.6 - Exercicios jento de indice (K x 2) e 0 filho direito no elemento de indice (Kx2 + 1). 1 - Escrever um procedimento recursivo para busca seqiiéncial. 2 Escrever um procedimento iterativo para busca por bissegio. f Gle Ge Ele Ele 3 Escrever um procedimento recursivo para busca por bissegio. Ele E> 4 - Escrever um procedimento iterativo para busca bindria. | ae nt ° § - Escrever um procedimento para acessar registros em um arquivo de acesso direto (CAP-5), através do niimero de registro ar- ‘mazenado em uma estrutara do tipo drvore bindria, Figura 50 a) supocha que exista uma érvore binéria, contendo os némeros de reysiro, de forma a representa 0 arquivo de dados clas- sificado por uma determinada chave. Leu mT Tou T dev Tew 1 PTE] Fle] feleTs To] naz Figura 49 b) suponha que exista um vetor, simulando uma érvore bindria, contendo os numeros de registro, de forma a representar 0 ar- quivo de dados classificado por uma determinada chave, 164 Intredugéo a0 Desenvolvimento de Algortmos Pesquisa de Dados 165 CLASSIFICACAO DE DADOS icagdo de dados fez. com que surgissem 0, apresentando cada um deles um desempenho diferente, dependendo da forma como os dados de entrada esto arranjados, isto é, existem metodos que apresentam uma grande ineficiéncia quando a colegio de dados de entrada esti classificada na ordem inversa, outros métodos apresentam seu melhor desenpenho justamente quando os dados de entrada, esto na ordem inversa. A ia das aplicagdes requer métodos que apresentem um desem- penho razodvel independentemente da ordem dos dados de entrada, pois dificilmente teremos condigoes de estabelecer esta ordem a priori. A importincia da ¢ varios métodes de clas (Os dados de entrada podem estar organizados da seguinte forma: © classificados na ordem desejada -ados na ordem inversa {dos aleatoriamente 166 Introdugéo ao Desenvolvimento de Algoritmos Um método de classiticagto efi penho fortemente aietado, qualquer q de entrada. ate ndo deve ter seu desem- ja 0 organizacao dos dados _7.1 = Classificagéo Simples ___ Este método consiste em determinar o elemento de menor valor existente entre os N elementos atmazenados no vetor, e trocar 0 contetido deste eleraento com 0 contetido do elemento que esti na primeira posigio do vetor, em seguida, repetir o percurso, trocando e conterido do segundo menor elemento com o contetido do segundo elemento do vetor, e assim, sucessivamente. Supondo um vetor com 5 elementos, tezemos-0s seguint para a classificacdo: 2 -08 seguintes passos ERE 3° Passo isal4 4° Passo Gassing do becca a O miémero de comparagées em cada passo é: Passo (N-1) = 4 2 Paso (N-2) =3 3°Passo — (N-3) =2 4ePaso | (N-4) = 1 Note queo niimero total de comparagdes € : (N-3) + (N-2) + (N-1) 142434. ‘Observe que : 1 (NI) = N52 + (N-2) = 253 + (N-3) = Nim logo 1+24+34..+(N-3) + (N-2) + (N-1) =Nx(N-1)/2 Portanto o ntimero de comparagées necessérias para uma classificagéo simples é : Nx(N-1) N-N 2 2 Logo, a complexidade de uma classificao simples € de O(N”), pois o maior expoente afeta mais fortemente o méimero de comparagoes necessirias. “7.2 Classificacao por Intercalacao (merge) Este método consiste em dividir um vetor de N elemetos em vetores de doiselementos, isto &, ontimero de divisbes K do vetor inicial € igual ao nimero de vezes que o vetor pode ser dividido por 2 mais 1. 168 Introdugéo ao Desenvolvimento de Algortmos Supondo um vetor com 7 elementos teremos os seguintes passos para classificacéo : 3[s[7[4[2]ej1 1°, Passo (dividir 0 vetor em vetores de 2 elementos) 3/8] [14 2[6 1 2°, Passo (classficar cada um dos vetores) 38] [4[7 2/6 a 3°, Passo (intercalar os vetores dois a dois) Figura 51 4°, Passo (intercalar os vetores resultantes) Classiicagdo de Dados 169 ‘O ntimero de comparagdes na classificacdo & [(N - 1) DIV2 + 1] que € igual a [Log (N- 1) + 1], logo, o nimero de comparagdes 6 proporcional a Log (N).. ‘© nimero de passos em uma intercalagdo & N/2 ,logo, 0 némero de passos proporcional aN. Portanto, a complexidade do método de intercalagdo & de O(N x Log). principal, pois na maioria das vezes, a meméria dispontvel nao & sufi- ciente para armazenar todos os dados. Podemos contornar este problema trazendo para a meméria apenas 0 campo chave, e entdo podemos utilizar qualquer método de classificacdo que exija que todas as chaves este} mniveis na meméria de uma s6 vez. Entretanto, se ameméri el ndo for suficiente para armazenar todas as chaves, teremos que utilizar 0 método de intercalagéo, pois com este método podemos ordenar seqiiéncias de qualquer tamanho, analisando apenas dois componentes por vez. 7.3 - Classificagio Répida (quick) Este € um dos métodos de classificagio mais eficiente e mais utilizado. Daco um vetor, tomamos 0 seu elemento central, esquerda colocamos 0s elementos menores que ele ¢ a sua di maiores. Repetimos 0 processo sucessivamente para cada “sul ‘Supondo um vetor com 8 elementos, teremos os seguintes passos para a classificagio (20 [30] 1] 5 [18 [e217 [ [53 170 Introdugo a0 DesenvoWvimento de Algontmos 1, Passo (encontrar o elemento central) 207 30] S| 18 | 2 [17 | [ss { a } 28, Passo (trocar 20 com 02) o2 | 30 | 15 | 18 | 62 [17 [20 [33 { =a } 3° Passo (trocar 30 com 17) 02] 17 [15 [18 [62 [30 [20 [53 { = } 4° Passo (localizar os elementos centrais nos "subvetores") o2| 17] 15] 18] 62 | 30 [ 20 [53] Ct ie. ‘5% Passo (trocar 17 com 15 ; trocar 62.com 20) 2] 15[ 17] 18] 20 | 30 [62 [53 =) ae } ‘6% Passo (localizar os elementos centrais nos "subvetores") 2] 15] 17] 18] 20] 30 | 62 [53 tH to} f+ {— } Clessiicagéo de Dados 7° Passo (trocar 62 com 53) 17 | 18 | 20 [30 | 53 [ =) det tt OF € Log N € 0 nimero de logo a complexidade deste [oz | 1: Note que o nimero de "subvetore ‘comparagdes é N em cada nova part método € O(N x Log N). Este método apresenta uma vantagem em relagio aos metodos que utilizam méltiplos vetores, isto é, ocorre uma economia de memiéria devido ao fato de que a classificagio é feita em um nico vetor (vetor original, EXEMPLO 73.4 Construirum procedimento recursivo para classificagdo usando 0 método quick. Inicio | DECLARAGAO DE CONSTANTES | = VETOR[l. 1 ]DEINTEIRO; VARIAVEIS 172 Introdugéo ao Desenvolvimento de Algoritmos < meio) FAGA la{depois)) FACA, depois}: ~ tabelafdepois); SE (nico < depois) ENTAO EXECUTE qu SE (antes < fim) ENTAO EXECUTE quick (antes, fi) FIM ; {procedimento quick) + depois) 7.4 - Arvore Balanceada (AVL) Podemos corstruir uma érvore binéria a fim de mantermos 0s dados organizados de tal forma que seja possivel, através de um ‘caminhamento, exibir os dados em uma certa classificacao ou recuperar 0 dados rapidamente, eens 7 Iremos construir uma Srvore para organizar a seqiiéncia abaixo, de forma que os valores menores sejam colacados a esquerda e os maiores Adireita de seu pai. I {4,6,2,3,7,1,5} d Hh ce doh 4] ea J —~ CTE EH hy Figura 53 Nesta dvore a recuperagio de dados pode ser feita com um algoritmo de complexidade O(Log N). Por exemplo, para recuperar~ ‘mos 0 valor 1, faremos 3 comparacdes, entretanto, se a seqiiéncia fosse [7,6,5,4,3,2, 1], farfamos 7 comparacées pois terfamos a seguinte rvore. Figura 58 Introdugéo ao Desenvolvimento de Algortm | 174 ‘As drvores bindrias cujos nés s6 possuem filho diteito (ou filho esquerdo) so denominadas de "vores desequilibradas" que nada mais sdo do que listaslineares, que possuem a maioria dos nés relativamente distantes da raiz, levando um tempo de recuperagio de O(N), a0 passo que se a drvore estivesse equilibrada, 0 tempo de recuperagao seria de O(LogN). ada. Em resumo, itemos trabalhar com um mecanismo que minimize a altura das arvores ¢ desta forma, permitir que as operagoes que tém rapidez proporcional & altura das arvores, sejam efetuadas eficientemente. A recuperagdo dindmica dos n6s pode ser efetuada num tempo O(Log N), contanto que a érvore tenha N n6s ¢ uma altura maxima K igual a Log N, resultado da natureza equilibrada da drvore, o mesmo tempo um n6 pode ser inserido ou removido de tal drvore num tempo O(Log N), sendo que a drvore resultante permanece com uma altura equilibrada, Definigées : Sendo T uma drvore binéria subérvores esquerda e direita resp. librada, contanto que 10 vazia) com Te e Td como (erd uma altura equi- id [5 1, onde He e Hd sejam as alturas de Te e Td respectivamente, © fator de equilibrio Fe(N) de um n6 N numa drvore binéria, é Gefinido como sendo He - Hé. Para qualquer n6 N de uma arvore AVL, rio s6 pode assumir os valores -1,0,1, isto é Classiticagdo de Dados 175 Supondo uma seqiiéncia com 7 elementos, teremos os seguintes ppassos para a chsificagao : {4,5,7,2,1,3,6} 12 Passo (inseriv4) Figura 57 ‘176 Inrodugdo a0 Desonvohimento de Algorimos 4° Passo (rotagao DD) Juando 0 novo Gireita do n6 ancestral m: aser +2 ou-2, imo, cujo fator de e¢ HW Figura 58 5° Passo (inserir 2) ion Fe Te Je naz >} Figura 59 Classticagao de Dados ar, 6° Passo (inserit 1) Figura 60 7 Passo (rotagio EE) Quando ¢ novo né Arvore esquerda do né anc Fe passou a ser + 20u-2. Ton eo T Ti Jott EB Figura 61 178 Inrodugéo 20 Desenvolvimento de Aigorimos 8 Passo (inserir 3) 98 Passo (rotagdo DE) Quando 0 nevo né esquerda do n6 ancestral passou a ser + 2cu-2 Glassiicagéo de Dedos 10° Passo (inserir 6) Figura 64 1? Passo (rotagio ED) Ton ee Cree Figura 69 EXEMPLO 7.4. Construir um algoritmo para manipulagdes em drvores AVL, de forma a manter a érvore equilibrada. 180 Introdugo ao Desenvolvimento de Algoritmos Classiicacdo de Dedos INICIO {algoritmo AVE} DECLARACAO DE TIPOS tipo_chave = char; pir = PONTEIRO PARA O TIPO reg; reg = REGISTRO (define {formato { dos { be ria da évore asl ndmero de nésna érvore a liares PROCEDIMENTO aux escreva_al (p: pt Inicio. SE(p < > NIL) ENTAO PROCEDIMENTO escreva_sol(p: prt) INICIO ESCREVA (‘A Awvore Contém SE(p <> NIL) ENTAO EXECUTE aux_esereva_ al (p) | SENAo } “ESCREVA (‘Arvore Vazia) ; FIM; 181 182 FUNCAO altura (p: pte): INTEIRO 5 INicIo. altura + -1 | seNao’ ‘altura pt alt; Introdugéo ao Desenvolvimento de Algoritmos PROCEDIMENTO rotacon INICIO {n6 desequilibrado DECLARACAO DE VARIAVEIS plrsawe aux, aux, aud; CARACTERE: car pir); fexecuta = rotagio sobre} do==>", vt. chave); ENT INICIO | SE ( (caso ~ T) OU (caso = 5)) yale vt esq | SE (cao 1) ENTAO EXECUTE rotaciona SENAO pare* VERDADETRO; FIM; PROCEDIMENTO remove_auxd(q,7: ptr) NICK | _DESALOOUE vi sexA) INCIO EXECUTE remove a2(q,rt dir); SE (NAO pare) ENTAO EXECUTE remove_sue (r); | FIM; FIM; Glassircagao de Dacos 185 “186° PROCEDMENTO remove (x: tipo_chave ; p: ptr); inicio DECLARAGAO DE VARIAVEIS ESCREVA ("6 ndo existe"); SENAO, SE(pt. chave = x) ENTAO SE(pt. dir = NIL) SE (pt. esq = NIL) ENTAO INICIO, | ax pi pert. dis pare = FALSO; nie iglate! ty DESALOQUE (aux) ; HM SENAO INICIO EXECUTE remove aux! (p,pt- 9); SE (NAO pare) ENTAO [EXECUTE remove_auxt (p); FIM; Inrodugéo ao Desenvolmento de Algorimas SENAO, INICIO SE(x

p t-chave) ENTAO EXECUTE insere (x, p t dir, alt, parou) SP < VERDADEIRO; I “Classic rpdo de Dacos my FIM FIM; INICIO SE (NAO parou) ENTAO SE (alt = pt. alt) | ENTAO, pt. alt «alt +15 esq + altura (pt. esa dir = akura (pt. dir); SE (ABS (esq- dir) > 1) ENTAO INicto EXECUTE rotaciona | parou = VERDADE! FUNGAO contido (x: tipo_chave;p: ptr) : LOGICA; SENAO SE(pt, chave = x) ENTAO contdo « VERDADEIRO SENAO_ SE(x < pt. chave) ENTAO condo = conto (x, pt. esq) SEN; ‘eontido + contido (x, pt. dir); PROCEDIMENTO menu ( op: INTEIRO ); Introdugéo ao Desenvolvimento de Algoritmos INICIO {emda principal} anos = 03 aia + NIL} REPITA INICIO EXECUTE meno (opeS0) ; ESCOLHA opeo ‘CASO opgio = 1 REPITA, inicio rodou + FALSO; ESCREVA (inser ao"); ‘Novo Elemento = = >"); +1) {condigéo de parada} EXECUTE inere (aux, raz, altur , pare; (SAO rodou) ENTAO | “EXECUTE escra_el (rai); FIM; | ATE (fim ="); | CASO opgio = 2 | EXECUTE escreva_ai(raiz,3); SE(taiz_ <> NIL) | ENTAO ESCREVA (‘remogao’); | ESCREVA(‘Remover Elemento= = >"); LEIA (aux) ; EXECUTE remove (ux, raiz); SE (NAO rodow } ENTAO. EXECUTE escreva. il (ri); | | Glassticagéo de Dados 189 ATE (aux = -1); 1+ Construir algoritmos iterativos, utilizando varidveis estiticas, para os tré § Métodos apresentados. 2+ Construir algoritmos iterativos, utilizando variveis dinamicas, para os trés 3s métodos apresentados, sivos, utilizando varidveis estiticas, ara os dois primeiros métodos dpresentados. indo, varisveis dindmicas, tados. $+ Construir umalgor pare AVL. “FBO tba dis saa dois ‘8 elle ALGORITMOS x FLUXOGRAMAS Apresentaremos um paralelo entre a técnica de desenvolvimento de Algoritmos e outras formas de representagéo da ldgica de Programacao. FLUXOGRAMA: Esté é a técnica mais convencional. tiga e a mais utilizada na programacéo 492 Introdugio 20 Desenvotimento de Algoritmos SeQuEncia SIMPLES = conoigo ‘RORO-REBT z ‘acno-RE2e| — RerETi¢ao | [acao-reen Figura A1 “"DIAGRAMA DE CHAPIN ae Nesta forma de representagdo, as estruturas légicas sio repre~ sentadas angulares, pe (entido do ap6s a outra de cima para baixo. A execugdo das agoes € feita ‘Apéndlce A Algortmos @ Fuogramas 193 seqiiéncialmente uma apés a outrae a nica formade executar uma agao anterior é estabelecendo uma estrutura de repetigao. “Agio- 1 as Agio-3 Seqiéncia Simples = ae ‘Agio-N mdiga —— Agio-F-1] Agio-V-1 ‘Agio-F-2| Acdo-V-2 Agao-F-3| Agi 23 ‘Agio-F-K) Agio-V-Z Condigéo Condigio [Agao-Repete-1 | Agdo-Repete-2 Repetigao ‘Agao = Repete = N ‘Agio-Repete- Do ponto de vista da programacdo estruturada, o fluxograma € condendvel devido aos seguintes aspectos: nao € permitido 0 uso de desvio smo afeta profundamente uma ¢ Na programacao estrut incondicional ¢ ‘uma vez que as setas, qu 9. podem apontar para qualquer figura contida no fluxograma, podendo tornd-lo 194 Inrodugéo ao Desenvolvimento de Algoritmos desestruturado, "Gragas’ a esta "Flexi lade", encontramos programas do tipo: 510. 520 Goro 300 Ler um programa deste tipo é com ler um livro, contendo na pag-40 a seguinte instrugdo "Agora leia da Pag-500 até a Pag-520" § guando voc estiver endo 8 pag-20, id encontrar a seuinte instrucéo "agora volte & pag-300" (© que voce diria deste Autor ? Néo seria mais fécil entender o contetido se a leitura fosse seqiiéncial ? Este tipo de programa tem sua inteligibilidade fortemente afetada devido & quebra de sequéneia . terfstica negativa na técnica de fluxograma é que as, io-de- do reténgulo de seqiéncia simples. Talvez foss chamé-la de "SF". Neste caso, surgiram perguntas do tipo est armazenando em SF ", comprometendo assim, 0 ni inteligibilidade do programa’ Apéndice A. Algoritmos e Fluxogramas Do ponto de vista de um programacdo estruturada, o diagrama de Chapin atende aos requisitos, pois ndo permite desvio incondicional. de, 0 uso do diagrama de Chapin nao ie as estruturas do tipo condigéo ou vio sendo inseridas no diagrama, o tamanho dos retangulos subseqiténtes (Comprimento da linha) vai diminuindo, de forma que os rnomes significativos para variével passam a ndo eaber em seu interior, Avvantagem da técnica de desenvolvimento de algoritmos é que a l6gica de programacao nao esté expressa através de figuras, mas sim em ‘uma linguagem natural (Portugués). SE (Condes) ENTAO nfcto AGAOVA 5 AGAO-V2 5 > Condicéo AGKOV-K FM SENAO INICIO ACAO-FA 5 ACAO-F2 5 ENQUANTO (Candigio) FACA, Inicio AGAO-REPETE-1 AGAO-REPETE? ; + Repetigio ACAO-REPETEN ; FIM; EXEMPLO: Dada uma lista com notas e matriculas dispostas da seguinte forma: MATRICULA NOTA 1 16 2 38 3 47 - OBSERVACAO: - A matricula -1 é finalizador = Suponha que néo existam notas iguais n encontre as duas maiores notas € suas respectivas matriculas. Apéndloe A- Algorimos @ Flax : "ae? = Solugo através do diagrama de Chapin + Solugio através do fluxograma: NI = 0 |_NT2 + 0 MTI = 0 MTZ = 0 MI #-1 NT > NTI N s NT>NIZ_—7 N s NI2+NTL I NTZ 1) FACA Inicio ‘SE (aota_> prim_maior_nota) ENTAO INICIO rie prim maior matic ; prim_maior nota * nota 3 rim_maior matiemateeula ; HM SENAO SE (nota > se¢_msior_nota) | LEIA (matrcula , nota) ; FIM; ESCREVA (prim_maior_+ ESCREVA (seq_maior_m: FIM, S68. maior_n 200 inrodugo ao Desenvolvimento de Algorimes Analisando osexer tado (Técnica de deset uma vez que 0 entendi yento de Algori da descrigéo da acima, concluimos que ométodo apt ‘mais natural devido utilizago de uma linguagem proxima ao portugués. ~ 201 ‘Apindioe A Algorimos eFizogramas 9 WMLsoN Siva PATO INTRODUGAD AD DESENVOLVIMENTO| ALGORTTMOS Conheca outros livros da area | INTRODUGAO AO DESENVOLVIMENTO DE E ESTRUTURA DE DADOS ie > > aap (Mi Gam dimer Gee PROGRAMACAO DE COMPUTADORES PROGRAMAGAO ESTRUTURADA DO E QUALIDADE enica

Você também pode gostar