Vous êtes sur la page 1sur 14

Apostila: Construo de Algoritmos

Construo de Algoritmos A T7012A Engenharia da Computao

1 Algoritmo
Programar criar Algoritmos. Algoritmos Seqncia de aes necessrias para a obteno da soluo de um determinado tipo de problema (classe de problemas). Cada ao deve ocorrer num intervalo finito de tempo. No desenvolvimento de Algoritmos devem ser considerados dois aspectos: 1. Aspecto (ou viso) Esttica A seqncia de aes expressas em seqncia. 2. Aspecto Dinmico Expressa a transformao de valores de variveis conforme as aes so executadas no tempo. A viso dinmica expressa o fluxo de execuo das aes para um conjunto de dados. A capacidade de desenvolver algoritmos est intimamente relacionado com a compreenso e explorao desses 2 aspectos dos algoritmos (a relao entre os 2 aspectos). Estrutura de Dados a forma na qual os dados relevantes de um problema esto organizados. Programao Corresponde, essencialmente, a estruturar dados e construir algoritmos que iro manipular e modificar esses dados. Problema Memria Anlise Algoritmos Varivel Soluo Identificador

Os seguintes operadores e funes bsicas (ou primitivas) sero considerados no desenvolvimento dos algoritmos no escopo desta disciplina. Operadores - Lgicos (E, OU, XOU, NO) - Aritmticos (+, -, *, /, ^, MOD, DIV) - Relacionais (=, <>, >=, >, <=, <)
Prof. Angelo Passaro pgina 1

Apostila: Construo de Algoritmos

Funes Primitivas - Matemticas (SEN(X), COS(X), TAN(X), SQRT(X), ABS(X),...) - Entrada e Sada (leia, armazene, imprima, ...) - Outras. Tipos Primitivos de Dados INTEIRO, REAL, CARACTERE, LGICA Relao: Tipo Operadores

Constantes um valor fixo que no pode ser modificado ao longo do tempo de execuo do algrotimo. Modelo para declarao de variveis e constantes(Exemplo) Declarao de Constantes A = 4; PI = 3.1415 Declarao de Variveis var1 , var2 : INTEIRO var3 : REAL Estrutura de Controle - Seqencial - Condicional Simples Se (condio) ento Inicio BLOCO de instruo Fim_se Composta Se (condio) ento Inicio BLOCO executado se a condio VERDADEIRA Fim Seno Inicio BLOCO executado se a condio FALSA Fim_se Se (condio 1) ento Inicio

Aninhada

Prof. Angelo Passaro

pgina 2

Apostila: Construo de Algoritmos

Fim Seno Inicio

Se (condio 2) ento Inicio BLOCO A Fim Seno Inicio BLOCO B Fim_se

Se (condio 3) ento Inicio BLOCO C Fim_se Fim_se Repetio Enquanto (condio) faa Inicio BLOCO executado enquanto a condio verdadeira Fim_enquanto Para i Inicio valor_inicial at valor_final, INCR(j), Faa

BLOCO executado enquanto a varivel de controle encontra-se no intervalo Valor_inicial <= i <= valor_final Fim_para OBS.: INCR(j) indica que i (varivel de controle) varia com incrementos de j: i i + j; Quando j = 1 o trecho entre virgulas opcional Para incrementos negativos utilizaremos DECR ao invs de INCR, j ser sempre positivo. BLOCO de instrues executado enquanto a condio verdadeira Enquanto (condio); Estruturas de dados homogneas. Arrays - Permite a manipulao de um conjunto finito de dados do mesmo tipo. Em termos de memria, esse conjunto de dados armazenado de forma contnua (armazenamento contguo). O acesso aos dados feito por meio de ndices (varivel indexada). Faa

Prof. Angelo Passaro

pgina 3

Apostila: Construo de Algoritmos

Vetor - (Arrays unidimensionais) O acesso aos dados armazenados em um vetor feito com o uso de apenas um ndice.A Figura 1 ilustra o ndice e o posicionamento dos elementos de um vetor na memria. incio . . . 1 5 10 15 . . .

Vetor [1] Vetor [2] Vetor [3] Vetor [4]

Vetor 1 5 10 15 (4 valores inteiros)

fim

Figura 1. Representao de um vetor na memria.

Usaremos o smbolo [] (colchetes) para indicar que estamos tratando com um Array e o ndice do elemento do vetor posicionado no interior dos colchetes. A declarao de um vetor ser feita com o uso da seguinte sintaxe na declarao de variveis: id_vetor: vetor [Ii .. If] tipo Exemplos: Declarar um vetor com o nome A, Inteiro, de 30 elementos e um vetor B de 10 elementos do tipo Real : A: vetor [1..30] Inteiro B: vetor [1..10] Real Matrizes - (Arrays bidimensional) So necessrios 2 ndices para se ter acesso a um elemento do array. Os elementos da matriz so armazenados em seqncia na memria, em ordem de linha ou de colunas, dependendo da linguagem de programao adotada. Estruturas de dados heterogneas Registro: Estrutura de dados composta por um conjunto de variveis de tipos diferentes, primitivos e/ou estruturados (homogneos ou heterogneos), que esto relacionadas logicamente e podem ser referenciadas por um mesmo nome (um identificador de registro) ou individualmente. A sintaxe de declarao de um registro utilizada :
Prof. Angelo Passaro pgina 4

Apostila: Construo de Algoritmos

Declarao de tipos id_tipo_reg : Registro inicio campo_1 : tipo_campo_1; campo_2 : tipo_campo_2; ........ campo_N: tipo_campo_N; fim_registro onde: id_tipo_reg o identificador do novo tipo registro. campo_i corresponde ao identificador dos componentes do registro. Se vrios campos (ou componentes) apresentam o mesmo tipo, sua declarao pode ser efetuada na mesma linha de declarao. A declarao de uma varivel do tipo id_tipo_reg feita na seo de declarao de variveis: registro1 : id_tipo_reg Exemplo Declarao de tipos Data : Registro inicio dia, mes, ano: inteiro; fim_registro Declarao de variveis i, j : inteiro inicio_aulas : Data

2 Tcnicas de desenvolvimento de algoritmos


Existem vrias tcnicas para o desenvolvimento de algoritmos. Dentre elas, destaca-se a programao estrutura. A Programao Estruturada um conjunto de metodologias para o desenvolvimento organizado de software, buscando obter produtos confiveis, legveis, portveis e flexveis, de forma a garantir fcil manuteno. A programao estruturada no elimina a necessidade de reflexo e entendimento do problema.

Prof. Angelo Passaro

pgina 5

Apostila: Construo de Algoritmos

As idias bsicas associadas ao desenvolvimento estruturado podem ser resumidas como segue: 1. utilizao de um nmero limitado de estruturas de controle (seqencial, condicional e de repetio), e 2. desenvolvimento de algoritmos utilizando a tcnica de refinamentos sucessivos; 3. transformao de alguns refinamentos em mdulos. O primeiro item corresponde ao uso das estruturas de controle j discutidas anteriormente. Pode ser provado que qualquer problema pode ser resolvido com a aplicao das estruturas seqencial, condicional e de repetio. Os demais itens so discutidos nas duas subsees a seguir. 2.1 TCNICA DE REFINAMENTOS SUCESSIVOS (REFINAMENTO TOP-DOWN) O segundo item est relacionado ao processo criativo de desenvolvimento da soluo de um problema a partir da decomposio de um problema em problemas menores e mais simples de serem resolvidos do que o inicial. A decomposio dos subproblemas deve ser feita at que as solues estejam expressas por um conjunto de aes (instrues, operaes e funes) elementares, como as citadas anteriormente. Os refinamentos sucessivos possibilitam ao desenvolvedor a preocupao com detalhes conforme o nvel do processo de refinamento. Com este procedimento, o volume de noes a serem manipuladas e entendidas a cada instante mantido sob controle, o que facilita o entendimento necessrio para se formular, completa e corretamente, a soluo do problema a ser resolvido. O processo de refinamento sucessivo leva modularizao da soluo. 2.2 MODULARIZAO O ltimo item est associado construo de mdulos isolados com funes bem definidas. Um mdulo um grupo de instrues (comandos) que se constitui em uma funo bem definida e o mais independente possvel em relao ao restante do algoritmo. Este mtodo permite que a soluo do problema possa ser desenvolvida por vrios programadores de uma equipe, j que um mdulo independente dos demais. Este procedimento tambm concorre para o desenvolvimento de um conjunto de mdulos que podem ser reutilizados, j que sua funo independente do problema original mas contribui para a soluo. A gerao de mdulos tem por objetivos: 1. evitar a duplicao de cdigo, ou seja, que uma determinada seqncia de comandos necessria em vrios locais do algoritmo seja repetida em cada um desses locais; 2. dividir e estruturar um algoritmo em partes fechadas e logicamente coerentes 3. aumentar a legibilidade do cdigo, 4. facilitar a documentao do algoritmo.

Prof. Angelo Passaro

pgina 6

Apostila: Construo de Algoritmos

Em geral, os mdulos devem ter um tamanho limitado. Alm disso, uma das caractersticas interessantes de mdulos a possibilidade de se definir estruturas de dados prprias do mdulo, necessrias e suficientes para que estes executem suas tarefas. O uso de dados locais (definidos no escopo do mdulo) que no tm nenhum significado fora do mdulo fator importante para a reutilizao de um mdulo criado para resolver um determinado problema na soluo de outros problemas, alm de simplificar a manuteno de softwares. Sem o uso de dados globais necessrio um mecanismo para o compartilhamento de informaes entre mdulos. Esses mecanismos so descritos na seo 2.2.2. A descrio estrutural da modularizao pode ser feita por meio de diagramas hierrquicos. Na Figura 2 so representados seis mdulos. O mdulo A aciona os mdulos B e C. O mdulo B aciona os mdulos D, E e F e o mdulo C tambm aciona o mdulo F.
mdulo A

mdulo B

mdulo C

mdulo D

mdulo E

mdulo F

Figura 2 Mdulos hierarquicamente organizados.

2.2.1 FERRAMENTAS PARA MODULARIZAO Praticamente todas as linguagens modernas de programao dispem de ferramentas bsicas de modularizao, ou seja, permitem criar e manipular mdulos. Dentre as principais ferramentas pode-se citar as sub-rotinas e as funes. 2.2.2 VINCULAO ENTRE MDULOS (PASSAGEM DE PARMETROS) Visto que os mdulos correpondem a um conjunto de comandos com um significado lgico e o mais independente possvel dos detalhes do problema que se deseja resolver necessrio informar a ele com base em que dados a computao deve ser realizada. Isso pode ser feito transferindo os dados necessrios por meio de passagem de parmetros, os quais acabam por vincular os mdulos que concorrem para resolver o problema. Os principais modos de transferncia de dados so: Passagem de parmetros por valor (parmetros de entrada): As alteraes efetuadas nos parmetros formais (veja seo 2.2.3) no mdulo chamado no so propagados para os parmetros atuais no mdulo que faz a chamada.

Prof. Angelo Passaro

pgina 7

Apostila: Construo de Algoritmos

Passagem de parmetros por resultado (parmetros de saida): Permite retornar um valor calculado num mdulo para o mdulo que fez a chamada. Passagem de parmetros por referncia (parmetros de entrada e sada): Toda alterao dos parmetros formais passados por referncia para o mdulo chamado se reflete nos parmetros atuais do mdulo que fez a chamada. 2.2.3 SINTAXE A SER UTILIZADA NA DESCRIO DE MDULOS A sintaxe de definio de mdulos utilizada nesta disciplina apresentada a seguir: Identificador_mdulo(lista de parmetros formais) : tipo_retorno inicio bloco de instrues do mdulo fim_mdulo onde: Identificador_mdulo: nome (identificao) do mdulo tipo_retorno: indica o tipo do parmetro de resultado. Se nenhum tipo de retorno indicado significa que o mdulo no apresenta parmetro de resultado. Lista de parmetros formais: parmetros que permitem a vinculao de mdulos. Algoritmo 1: Mdulo para o clculo da mdia dos elementos de um vetor Media (A:vetor de real, N: inteiro) : real Declarao de variveis (locais) soma,med : real; inicio soma 0 Para i 1 at N faa soma soma + A[i] med soma/N retorna med fim_mdulo Neste exemplo, A e N so parmetros (N passado por valor e o vetor passado por referncia). O mdulo calcula e retorna um valor por meio da instruo retorna. 2.3 RECURSIVIDADE uma das principais tcnicas de projeto de algoritmos. Um procedimento recursivo se chama a si mesmo, direta ou indiretamente.
Prof. Angelo Passaro pgina 8

Apostila: Construo de Algoritmos

Em geral, o uso da recursividade permite uma descrio mais clara e concisa de algoritmos, principalmente quando o problema a ser resolvido recursivo por natureza ou permite a utilizao de estruturas recursivas, tais como rvores. Todo processo recursivo deve implementar uma condio de TERMINAO. A chamada recursiva a um procedimento P deve estar sujeita a uma condio B, a qual se torna no satisfeita em algum momento da computao. Conforme definido por Wirth (1976):
P se B ento C [S i , P ]

onde C uma composio de comandos Si (outras instrues) e P(chamada ao procedimento recursivo). Tcnica Bsica: Definir f(x) tal que: f(x) <= 0 corresponde condio de terminao; f(x) decrementada a cada iterao, onde x um conjunto de variveis do programa. Simplificao: Associar um parmetro n para P (por valor) e chamar P recursivamente com (n-1). Nestas condies a B substituda por N > 0 :
P se n > 0 ento C [S i , P(n 1)]

Algoritmo 2 : Clculo do Fatorial Por definio o fatorial de N>= 0 (N inteiro) dado por
N! = N * (N - 1)* (N - 2)* ...* 3 * 2 * 1 , para N > 1 1, para N = 0 e N = 1

Observe que N! = N * (N-1)! Com base nisso, podemos escrever uma verso recursiva do clculo do fatorial: Fatorial (N : inteiro): inteiro inicio Se N <= 1 retorna 1 seno retorna (N * Fatorial (N-1)) fim_mdulo

Prof. Angelo Passaro

pgina 9

Apostila: Construo de Algoritmos

Algoritmo 3 : rvore binria de pesquisa Seja a rvore apresentada na Figura 3. A estrutura de dados pode ser representada por: Tipo Reg : Registro inicio chave : inteiro fim Tipo Apontador: ponteiro para NO. Tipo NO : Registro inicio R : Reg Esq, Dir : Apontador fim
5 3 7

folha
Figura 3 Uma rvore binria de pesquisa.

O seguinte algoritmo permite a realizao de pesquisa central na rvore utilizando um procedimento recursivo. A no indicao do tipo de retorno indica que este mdulo nada retorna. Busca_Central(p: Apontador) inicio Se p <> folha ento Busca_Central(p->Esq) Escreve(p->R.chave) Busca_Central(p->Dir) fim_se fim_mdulo
Prof. Angelo Passaro pgina 10

Apostila: Construo de Algoritmos

Para a implementao de um procedimento recursivo o nvel mais profundo deve ser finito e pequeno, pois cada ativao recursiva utiliza uma parcela de memria para aculumar variveis a cada chamada. Por outro lado, para que um procedimento recursivo seja eficiente importante que se considere um algoritmo balanceado (o balanceamento tambm uma tcnica bsica para um bom projeto de algoritmos). H situaes nas quais, mesmo que o algoritmo seja naturalmente recursivo, no vale a pena utilizar recursividade. Estas situaes ocorrem por exemplo no caso de recursividade de cauda (procedimentos recursivos com chamadas ao final do algoritmo), representada como:
P se B ento C [S , P ]

Problemas com essa caracterstica podem ser transformados facilmente em verses no recursivas:
P ( x x 0 ; Enquanto B faa S )

O caso do clculo do fatorial um exemplo de recursividade de cauda. A verso no recursiva mais eficiente do que a apresentada anteriormente. O mesmo vale para o algoritmo para o clculo da seqncia de Fibonacci. Algoritmos 4 e 5: Nmeros de Fibonacci Os nmeros de Fibonacci tm grande aplicao em Matemtica, Teoria dos Jogos e Cincia da Computao. Sua primeira apresentao se deu por volta do sculo XII em um estudo da velocidade de reproduo de coelhos realizado pelo matemtico Fibonacci (Itlia). Os nmeros de Fibonacci so dados pela srie: { 0,1,1,2,3,5,8,13,21,34,55,89, ....} a qual representada pela relao de recorrncia: f0 = 0, f1 = 1 fn = fn-1 + fn-2 para n 2 O algoritmo recursivo (Algoritmo 4) apresentado a seguir. Fibrec (n:inteiro ): inteiro Declarao de variveis: fib : inteiro;
Prof. Angelo Passaro pgina 11

Apostila: Construo de Algoritmos

inicio

se n < 2 ento fib n seno fib FibRec(n-1) + FibRec(n-2) retorna fib fim_mdulo

Este algoritmo ineficiente devido repetio de clculos. Isto pode ser avaliado realizando um acompanhamento do comportamento dinmico das chamadas recursivas, por exemplo, para N = 5. Uma implementao no recursiva apresentada a seguir (Algoritmo 5). Note que a legibilidade menor, mas o algoritmo muito mais eficiente. FibIter (n:inteiro ): inteiro Declarao de variveis: fib : inteiro; i,k,F : inteiro inicio i 1; F 0 Para k 1 at n faa inicio Fi+F iFi fim_para fib F retorna fib fim_mdulo Em geral, evita-se o uso de recursividade quando existe uma soluo bvia por iterao.

3 Diretrizes para o desenvolvimento de algoritmos


As diretrizes apresentadas abaixo so genricas e podem ser usadas ou adaptadas na organizao dos passos que comporo a soluo de um determinado problema (ou seja, na criao de um algoritmo para atingir um objetivo determinado). 1. Identificao do problema: determinar o que se quer resolver ou qual objetivo a ser atingido. 2. Identificao das entradas de dados: informaes fornecidas, a partir das quais se desenvolvero os clculos. 3. Identificao das sadas de dados: as informaes a serem geradas como resultado.
Prof. Angelo Passaro pgina 12

Apostila: Construo de Algoritmos

4. Identificao das regras e limitaes do problema ou das limitaes impostas ao problema (recursos de hardware, por exemplo). 5. Determinao dos procedimentos para transformar as entradas em sadas. Neste ponto deve ser determinada a seqncia de aes que leve soluo do problema. Para isto preciso: 5.1. observar as regras e limitaes j identificadas; 5.2. determinar aes possveis de serem realizadas. 6. Construo do Algoritmo, utilizando uma forma adequada para a representao de algoritmos (em nosso caso, utilizaremos o portugus estruturado, com regras de sintaxe definidas anteriormente neste texto);. 7. Teste da soluo - execuo de todas as aes do algoritmo, seguindo o fluxo estabelecido para verificar se ele est realmente gerando os resultados esperados ou detectar possveis erros em sua descrio. Trata-se da verificao do comportamento dinmico do algoritmo, apresentado anteriormente. Algoritmo 6: Identificar o maior divisor comum (mdc) de dois inteiros. objetivo a ser atingido: encontrar o maior inteiro que divide dois inteiros dados de entrada: dois inteiros denominados u e v dados de sada : o mdc restries: inteiros maiores que zero. Descrio da soluo: Para resolver este problema utilizaremos o algoritmo de Euclides, o qual conhecido a mais de dois mil anos. A idia bsica : se u > v, ento o mdc de u e v o mesmo de v e (u-v) Algoritmo: u e v so inteiros fornecidos a partir de algum procedimento externo e passados por valor. mdc (u, v: inteiro) : inteiro Declarao de variveis t: inteiro Inicio Enquanto (u > 0) inicio se (u <v) ento inicio t u; u v; v t; fim_se u u v fim_enquanto retorna v fim_mdulo

Prof. Angelo Passaro

pgina 13

Apostila: Construo de Algoritmos

4 Exerccios
1. Escrever um algoritmo que calcule e imprima a mdia das notas da classe. (escrever a parte do algoritmo que calcula a mdia em separado, reservando-o para o prximo exerccio) 2. Escrever um algoritmo que calcule e escreva o nmero de alunos em uma sala com nota superior mdia (utilizar o clculo da mdia obtido no exerccio anterior, e aproveitar para incluir a noo de funo (modularizao). Lembrar que dependendo da linguagem certas adaptaes podem ser necessrias). 3. Faa um teste de comportamento dinmico do algoritmo 6 utilizando como dados de entrada: a. u = 4 e v = 8 b. u = 3 e v = 13 c. u = 3 e v = 0 d. u = 0 e v = 7 4. O algoritmo 6 funciona sempre? Se no, sugira uma correo no algoritmo apresentado. 5. Desenvolva um algoritmo que reduza uma frao a seus termos bsicos. Utilize no algoritmo um registro para a representao da frao: Declarao de tipo Frac: registro inicio n, d : inteiro fim Declarao de variveis f: Frac 6. Uma universidade est interessada em identificar se existem alunos cursando as disciplinas de construo de algoritmos e de clculo numrico simultaneamente. As listas com o nmero de registro dos alunos de construo de algoritmos (no mximo 100 alunos) e de clculo numrico(no mximo 75 alunos) fornecida, e cada conjunto de nmero de registro em uma disciplina tem um nmero de registro fictcio igual a 1 no final. Desenvolva um algoritmo para resolver o problema.

Prof. Angelo Passaro

pgina 14

Vous aimerez peut-être aussi