Preview only show first 10 pages with watermark. For full document please download

Aed 04

Aula de Algoritmo e Estrutura de Dados do Professor Patrick Pedreira.

   EMBED


Share

Transcript

Algoritmos e Estruturas de Dados Sumário ❖ Tópicos a serem abordados na aula ◗ Introduç Introdução à programaç programação modular ◗ Vantagens e o funcionamento dos mó módulos. Módulos ◗ Mecanismos de retorno de valores e passagem de parâmetros Prof. Patrick Pedreira Módulos ❖ Problemas mais complexos e longos ◗ faz com que a resolução destes se torne cada vez mais difícil ❖ Uma abordagem com eficiência comprovada para nos auxiliar a resolver problemas com mais facilidade é a divisão de tarefas complexas e longas em atividades mais simples e curtas ❖ Conceito existente em vá várias áreas de atuaç atuação ◗ pode construir o todo dividindodividindo-se as responsabilidades pelas partes do processo.  Exemplo: a construç construção de um carro pode ser pensada como a junç junção de componentes variados ◗ Esta abordagem de divisão de problemas é chamada de toptopdown, down, pois se parte do todo, dividedivide-se em vá vários componentes menores e repeterepete-se este processo até até o menor componente Módulos ❖ Outra abordagem existente, porém menos utilizada, é a bottom-up. ❖ Essa abordagem parte do princípio oposto. Começa-se a resolver o problema pela parte menor, geralmente menos complexa, e vai-se agregando novas partes até chegar ao Problema maior. ❖ Várias áreas de conhecimento utilizam esta abordagem: ◗ matemática, em que as operações básicas (adição, multiplicação etc.) são ensinadas antes das operações mais complexas que delas se utilizam, como potenciação, radiciação e assim sucessivamente. ◗ biologia, a abordagem bottom-up seria como partir do nível celular, para chegar aos tecidos, depois aos órgãos, sistemas e, por fim, ao ser humano. 1 Módulos Módulos ❖ Uma das vantagens da divisão das atividades é muitas vezes a solução para um problema menor pode ser reaproveitada na resolução de diversos problemas maiores. ◗ Na construção de um carro, a atividade de se construir rodas pode ser útil para a “resolução do problema” da construção de diversos carros. ◗ Vejamos um exemplo desta abordagem em algoritmos:  Na soma dos 100 primeiros números primos, basicamente podemos identificar dois problemas diferentes: • o primeiro é a varredura dos números e a realização da soma. • O segundo é a definição do número como primo ou não.  A identificação de um número como primo ou não pode ser útil tanto para esse algoritmo como para um outro que queira determinar a soma dos números primos entre 1.000 e 2.000 ❖ Os mecanismos de modularizaç modularização visam justamente a facilitar a utilizaç utilização desse tipo de abordagem. Módulos ❖ Modularizando algoritmos ◗ A modularizaç modularização de um algoritmo/programa é uma forma de dividir as tarefas em subalgoritmos/subprogramas subalgoritmos/subprogramas,, e cada um desses mó módulos cuida de uma parte separada do problema. ◗ Cada mó módulo funciona semelhanternente a um programa, tendo, em geral, entrada, processamento e saí saída. As entradas e saí saídas dos mó módulos são os meios pelos quais os mó módulos interagem entre si. ◗ Para que um mó módulo possa ser executado, precisa ser ativado ou chamado por um outro mó módulo  Isto ocorre com todos os mó módulos pertencentes ao algoritmo, exceto o mó módulo principal, que é um mó módulo que todos os algoritmos contêm • É sempre por esse mó módulo que o algoritmo inicia sua execuç execução Módulos ❖ Fluxo de execução ◗ Começ Começa pelo mó módulo principal e é desviado para qualquer outro módulo que seja ativado no mó módulo principal. ❖ Exemplo ◗ Dentro deste mó módulo, eventualmente, pode haver chamadas a outros módulos. ◗ Cada mó módulo que é chamado é executado do iní início ao fim. fim. Apó Após seu término, o algoritmo prossegue do ponto em que o mó módulo foi chamado, ou seja, do ponto de ativaç ativação. ◗ Os mó módulos ativados geralmente são escritos antes dos mó módulos ativadores.  Isto ocorre na maioria das linguagens de programaç programação por uma caracterí característica da implementaç implementação dos compiladores.  Nas linguagens de programaç programação em que é possí possível evitar essa obrigatoriedade seqü seqüencial, algumas outras tarefas precisam ser feitas. • Na linguagem C, por exemplo, é necessá necessária a declaraç declaração das interfaces, neste caso chamadas de protó protótipos dos mó módulos no iní início do programa.  Em nosso pseudocó pseudocódigo, procuraremos manter os mó módulos na seqü seqüência (ativados — ativadores) na implementaç implementação final. 2 Módulos ❖ Teste de mesa Módulos ❖ Sintaxe ❖ Todo módulo tem um cabeçalho, que é uma espécie de declaração do módulo. ❖ Também podemos chamar o cabeçalho de interface ou protótipo do módulo. ❖ A sintaxe do cabeçalho segue: Módulos Módulos ❖ A ativação do módulo é feita apenas pelo nome do módulo, com os parâmetros que serão passados dentro de parênteses. ❖ Em algumas linguagens de programação, como Pascal, módulos que não retornam valores são chamados de procedimentos e módulos que retornam valores, de funções. ❖ Exemplo: ❖ Em C, independentemente do retorno ou não de valores, todos os módulos são chamados de funções. Teste(12, V, ‘a’); 3 Módulos ❖ Retorno de valores ◗ O retorno de valores é a saída do módulo.  Por meio dele, o módulo pode dar uma “resposta“ para o módulo ativador. ◗ Resposta pode ser um indicador de se todas as operações realizadas dentro do módulo foram realizadas com sucesso, do resultado de uma operação, etc. ◗ As respostas são valores pertencentes aos tipos existentes na linguagem de programação. ◗ O retorno do valor do módulo ativado precisa ser recebido e tratado dentro do módulo ativador.  Normalmente, esse valor é armazenado em uma variável, mas também pode ser usado em comparações, escritas etc. Módulos ❖ O retorno do valor é feito por meio do comando: ◗ retorne (); ❖ A execução do comando de retorno muda o fluxo do algoritmo, direcionando-o para o final do módulo. ◗ Ou seja, após a execução do retorno, o módulo é encerrado e o fluxo do algoritmo volta para o módulo ativador.  De modo geral, o valor retornado por um módulo pode ser tratado como uma variável no módulo ativador. Módulos ❖ Problema - Identificar se um número é par/ímpar ou um ano bissexto Módulos ❖ Módulo Principal ❖ Faça um algoritmo capaz de identificar se um número é par ou ímpar e se representa um ano bissexto. Caso não seja nenhuma dessas opções, o algoritmo deve retornar uma mensagem informando ao usuário que a operação solicitada não é válida. ❖ Cada uma das alternativas deve ser um módulo que retornará V ou F, dependendo da característica do número analisado. Também adapte a entrada para garantir que uma opção válida seja entrada e faça dessa entrada um módulo separado. 4 Módulos Módulos Exercício 5 Módulos Módulos ❖ Escopo de variáveis ◗ Módulos podem ser considerados subprogramas. ◗ A idéia é que eles sejam o mais independentes possível entre si.  É interessante que cada módulo possua suas próprias variáveis, ficando a dependência dos módulos restrita basicamente à interface (cabeç (cabeçalho) do mó módulo.  Antes de utilizarmos mó módulos, as variá variáveis definidas podiam ser acessadas em qualquer parte do algoritrno. algoritrno. Agora poderemos ter duas situaç situações: • variá variáveis globais e locais. ❖ Variá Variáveis globais ❖ As variá variáveis globais são declaradas antes de todos os módulos e podem ser manipuladas em qualquer mó módulo. ◗ Dizemos que seu escopo é global. ❖ Sintaxe: ... ❖ A vantagem das variá variáveis globais é sua fá fácil utilizaç utilização. ◗ Declaradas como globais poderão ser utilizadas em qualquer módulo Módulos ❖ Variá Variáveis globais ◗ O inconveniente do uso de variá variáveis globais é a dependência que causa entre mó módulos ◗ Como a variá variável pode ser acessada em qualquer mó módulo, uma alteraç alteração no valor em um mó módulo será será vista em todos os outros módulos. ◗ Em uma possí possível manutenç manutenção do algoritmo/programa, uma alteraç alteração no valor de uma variá variável global dentro mó módulo pode ter efeitos colaterais não previstos pelo programador em outros módulos  exigindo que o programador analise todas as ocorrências da variá variável no programa para verificar se a alteraç alteração não trará trará nenhum resultado indesejado Módulos ❖ Variá Variáveis locais ◗ As variá variáveis locais são declaradas no iní início do mó módulo ao qual pertencem.  só podem ser acessadas dentro do mó módulo em que foram declaradas.  Dizem escopo é local. ◗ Sintaxe: ... 6 Módulos Módulos ❖ Existem linguagens de programaç programação que não implementam variá variáveis locais para o mó módulo principal. ◗ Linguagem Pascal, em que as variá variáveis definidas no mó módulo principal são as globais. ◗ Na linguagem C, há há variá variáveis locais no módulo principal distintas das variá variáveis globais que são definidas fora dos módulos. ❖ Pode haver coincidência nos identificadores de variá variáveis globais e locais. ❖ Apesar de terem o mesmo nome, tais identificadores se referem a diferentes espaç espaços de memó memória. ◗ Durante a execuç execução do mó módulo em que a variá variável local homônima da global foi declarada, o identificador refererefere-se à variá variável local, deixando, assim, a variá variável temporariamente inacessí inacessível. ◗ Desta forma, podemos dizer que o escopo da variá variável local prevalece sobre o escopo da variá variável global. ◗ Fora do mó módulo referido, o identificador aponta exclusivamente para a variá variável global. ◗ O tempo de vida das variá variáveis locais é curto, visto que começ começam a existir no mó módulo em que são definidas e terminam no final cio módulo. ◗ Assim, també também podemos ter variá variáveis locais com o mesmo nome em diferentes mó módulos, sem nenhum conflito em sua identificaç identificação. Módulos Módulos ❖ Teste de mesa de mó módulos e pilhas ❖ Pilhas são estruturas de dados utilizadas em compiladores para lidar com variá variáveis locais e globais. ❖ Pilha é uma estrutura do tipo FILO (First (First In Last Out), Out), ◗ o primeiro a chegar é sempre o último a sair.  Analogia com uma pilha de pratos ◗ Esta estraté estratégia é utilizada pelos compiladores para armazenar variá variáveis de diferentes mó módulos durante a execuç execução de um programa 7 Quais são as saí saídas do algoritmo? algoritmo? 8 Exercício ❖ Acompanhe o algoritmo seguinte utilizando pilhas var v1: inteiro; M1(): inteiro var v_loc, v_loc, b: inteiro; iní início v1 v1v1+1; b2; v_loc v_loc v1+b; retorne(v_loc ); retorne(v_loc); fim Módulos ❖ Passagem de parâmetros ◗ Um mó módulo pode se comportar como uma funç função matemá matemática de uma variá variável. Por exemplo, considere a funç função f(x) = 10*x + 2. Podemos dizer que x é o parâmetro de entrada dessa funç função, que será será utilizado no seu cá cálculo. Assim: f(1)=10*1+2= 12 f(5) = 10 * 5 + 2= 52 ◗ Da mesma forma, um mó módulo pode receber valores que utilizará utilizará.  Esses valores são parâmetros passados pelo mó módulo ativador e são considerados a entrada do mó módulo, també também chamados de argumentos. ◗ Argumentos pode ser: constantes, valores literais (nú (números, letras, etc.) ou variá variáveis. M2(): inteiro var v_loc, v_loc, a: inteiro; iní início v_loc v_loc4; se (v1=1) então aM1(); senão a v_loc; v_loc; v1 v1v1+1; retorne(a); fim Principal(): neutro var n1, n2: inteiro; iní início v1 v10; n1 n1M2(); n2 n2M2(); escreva(n1, n2, v1); fim Módulos ❖ Passagem de parâmetros por valor ◗ Uma có cópia da variá variável é feita durante a ativaç ativação do módulo. ◗ Os valores dos argumentos são atribuí atribuídos aos parâmetros de entrada no mó módulo ativado. ◗ Essas variá variáveis (parâmetros) ficam na pilha de memó memória destinada ao mó módulo ativado, enquanto as variá á veis usadas como argumentos na ativaç vari ativação são mantidas na pilha do mó módulo ativador. ◗ O parâmetro é uma variá variável local dentro do mó módulo ativado, totalmente independente dos argumentos da ativaç ativação.  Mesmo que o valor tenha sido passado por meio de uma variá variável, possí possíveis alteraç alterações que sejam feitas sobre esse módulo não serão refletidas no mó módulo ativador. 9 Módulos ❖Passagem de parâmetros por valor Módulos ❖ Ativaç Ativação poderia ser qualquer uma das seguintes ◗ Sintaxe do cabeç cabeçalho  ([: ; : ;...]):  Exemplo do cabeç cabeçalho: Média(n1: inteiro; n2: inteiro; n3: inteiro; n4: inteiro): real  També Também podemos fazer: Mé Média(n1, n2, n3, n4: inteiro): real ❖ Os argumentos ◗ Devem ser passados na ordem em que estão declarados ◗ Devem ser compatí compatíveis com o tipo do parâmetro correspondente ❖ Desvantagens passagem por valor: ◗ Desperdí Desperdício de memó memória (ex. duplicaç duplicação de um array); array); ◗ Custo da transferência (ex. tempo de có cópia do array). array). Módulos ❖ Passagem de parâmetros por referência ◗ O endereç endereço da variá variável e não uma có cópia do valor, é passado durante a ativaç ativação do mó módulo ◗ Apesar de ter outro identificador, os valores manipulados no módulo ativado (parâmetros) aponta para o mesmo endereç endereço de memó memória dos argumentos do mó módulo ativador e são, efetivamente, a mesma variá variável  Todas as possí possíveis alteraç alterações que sejam feitas no mó módulo ativado serão refletidas no mó módulo ativador Módulos ❖ Passagem de parâmetros por referência ◗ Desvantagens  Acesso mais lento aos parâmetros formais (comparado com passagem por valor)  Potenciais e nãonão-desejados efeitos colaterais e apelidos (aliasing) aliasing) ◗ Sintaxe do cabeç cabeçalho  (ref dulo>(ref : ):  A palavra ref significa que o parâmetro a ser recebido será será por referência ◗ Ativaç Ativação  (ref dulo>(ref );  A palavra ref significa que o parâmetro esta sendo passado por referência 10 Escopo - Visibilidade ❖ O escopo de uma variá variável, representa a área do programa onde esta é visí visível. ◗ Ex. em C e C++(escopo definido por bloco): void foo (int x) { // iní início do escopo de x int y; // iní início do escopo de y x = y = 0; } // fim do escopo of x and y ❖ As regras de escopo de uma L.P. determinam a forma como as referências e nomes estão associadas a variá variáveis. Escopo - Visibilidade ❖ Algumas regras de escopo: ◗ 1. Procurar variá variáveis localmente ◗ 2. Procurar em ordem crescente do escopo até até encontrar uma declaraç declaração para o nome da variá variável. ❖ Escopos aninhados: ◗ definiç definição de escopos dentro de outros, formando uma sequência de escopos com sucessores e antecessores. ❖ A redefiniç redefinição de uma variá variável com o mesmo nome (num escopo interior) de uma já já existente num escopo exterior, permite "esconder" a definiç definição exterior. ◗ C++, Pascal, ADA, etc. permitem o acesso a estas variá variáveis escondidas em escopos exteriores. Escopo - Visibilidade ❖ O escopo de uma variá variável pode ser: ◗ Está Estático; ◗ Dinâmico. ❖ Escopo Está Estático ◗ Baseado no texto está estático do programa; ◗ Para associar uma referência a uma variá variável é necessá necessário procurar a sua declaraç declaração; ◗ O escopo está estático pode ser determinado estaticamente antes da execuç execução (Load (Load Time). 11 Escopo - Visibilidade ❖ Escopo Está Estático - Avaliaç Avaliação ◗ As variá variáveis globais são visí visíveis a todos os procedimentos/funç procedimentos/funções/mé ões/métodos; ◗ Dificulta futuras modificaç modificações ao programa; ◗ A maioria das linguagens imperativas utilizam escopo está estático: Pascal, C, C++, Java, Ada, etc.. Escopo - Visibilidade ❖ Escopo Dinâmico ◗ O escopo dinâmico baseiabaseia-se na sequência de chamadas de subprogramas e pode ser determinado somente em tempo de execuç execução. ◗ Para associar uma referência a uma variá variável é necessá necessário procurar a sequencia de invocaç invocação até até encontrar a sua declaraç declaração. 12 Escopo - Visibilidade ❖ Escopo Dinâmico – Avaliaç Avaliação ◗ Programas menos confiá confiáveis que os de escopos está estáticos; ◗ Problemas com a legibilidade do programa; ◗ Execuç Execução mais lenta; ◗ Menos utilizado que o escopo está estático; ◗ Linguagens que utilizam escopo dinâmico: Smalltalk, Smalltalk, APL, SNOBOL. Módulos ❖ Problema - Ordenar dois nú números determinando o tipo de ordenaç ordenação ❖ Faç Faça um algoritmo que ordene dois valores. A ordenaç ordenação dos nú números deve estar contida em um módulo. Um terceiro parâmetro determinará determinará a ordem (crescente ou decrescente) para a ordenaç ordenação. Suponha que os dois valores a serem ordenados, passados como parâmetros para o mó módulo, são sempre diferentes. Alé Além disso, considere que o mó módulo ordena deve retornar Verdadeiro, caso consiga executar a operaç operação, e Falso, caso a opç opção seja invá inválida. 13 Exercicios ❖ 1- Em que consiste a programaç programação modular? Qual a sua vantagem? ❖ 2 - Em que consistem as abordagens top down e bottom up? up? ❖ 3- Qual a funç função do mó módulo principal em um algoritmo? ❖ 4- Descreva o fluxo de execuç execução de um algoritmo modular. ❖ 5- Diferencie variá variáveis globais de locais e indique como elas devem ser declaradas em um algoritmo. ❖ 6 - Qual a vantagem da utilizaç utilização de variá variáveis globais? ❖ 7- Quais os problemas potenciais que podem ocorrer com a utilizaç utilização de variá variáveis globais. Crie um pequeno código e associe à sua explicaç explicação. Exercicios ❖ 8 – Indique como funciona a propriedade de escopo das variá variáveis considerando as situaç situações em que há há coincidência nos identificadores de variá á veis globais e locais. vari ❖ 9- Diferencie passagem de parâmetros por valor e por referência. Crie pequenos exemplos que ilustrem esses dois modos de passagem de parâmetros. ❖ 1010- Escreva um algoritmo modular que receba um nú número indeterminado de entradas numé numéricas (nú (números inteiros) diferentes de 0 e que ao final do processo retorne a soma dos valores entrados. Ao digitar o nú número zero, o programa deve ser finalizado imprimindo a soma total. ❖ 1111- Escreva um algoritmo modular que receba dez nú números inteiros e que ao final do processo retorne o nú número de valores positivos, negativos e elementos zero digitados. O algoritmo deve ainda informar a soma de todos os nú números entrados, considerando o valor em mó módulo (sem considerar o sinal do nú número). 14