SlideShare ist ein Scribd-Unternehmen logo
1 von 60
Downloaden Sie, um offline zu lesen
Algoritmos
                        Carlos A. P. Campani
                        6 de setembro de 2006


Sum´rio
   a
1 Introdu¸˜o
         ca                                                                                                               2

2 Conceitos B´sicos
               a                                                                                                           3
  2.1 Comando de Escrita .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    4
  2.2 Constantes . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    6
  2.3 Vari´veis . . . . . . . .
          a                       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    6
  2.4 Atribui¸ao . . . . . . .
             c˜                   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    7
  2.5 Comando de Leitura .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    8
  2.6 Express˜es Aritm´ticas
             o           e        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10
  2.7 Express˜es L´gicas . .
             o      o             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13

3 Estrutura Condicional                                                                                                   14

4 Estrutura de Repeti¸˜o
                     ca                                                                                                   16

5 Algoritmos com Acumulador                                                                                               19

6 Refinamentos Sucessivos                                                                                                  21

7 Usando Matrizes                                                        24
  7.1 Declara¸ao de Matrizes . . . . . . . . . . . . . . . . . . . . . . 25
             c˜
  7.2 Tratando com Matrizes . . . . . . . . . . . . . . . . . . . . . . 26




                                              1
8 Usando Listas                                                                                                    29
  8.1 Constantes Lista . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
  8.2 Opera¸˜es com Listas . . . .
            co                         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
  8.3 Declara¸ao de Vari´vel Lista
             c˜         a              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
  8.4 Tratando Listas . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   32

9 Sub-algoritmos                                                          35
  9.1 Sub-rotinas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
  9.2 Fun¸˜es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
         co

10 Recursividade                                                                                                   44

11 Algoritmos de Ordena¸˜o
                         ca                                                                                        50
   11.1 BUBLE SORT . . . . . . . . . . . . . . . . . . . . . . . . . .                                             50
            ¸˜
   11.2 SELECAO DIRETA . . . . . . . . . . . . . . . . . . . . . . .                                               50
   11.3 QUICK SORT . . . . . . . . . . . . . . . . . . . . . . . . . . .                                           51

12 Programa¸˜o Funcional
              ca                                                           55
   12.1 Declara¸˜o de Fun¸oes Lambda . . . . . . . . . . . . . . . . . 55
               ca         c˜
   12.2 Estruturas de Programa¸˜o Funcional . . . . . . . . . . . . . . 55
                               ca
   12.3 Escrevendo Fun¸oes . . . . . . . . . . . . . . . . . . . . . . . . 56
                       c˜


Bibliografia
    • FARRER, H. et alii. Algoritmos Estruturados. Rio de Janeiro, Editora
      Guanabara, 1989;

    • WIRTH, N. Programa¸˜o Sistem´tica. Rio de Janeiro, Ed. Campus,
                        ca        a
      1978.


1     Introdu¸˜o
             ca
Algoritmos s˜o ferramentas importantes no estudo de ciˆncia da computa¸˜o.
            a                                         e               ca
A compreens˜o das t´cnicas de desenvolvimento e constru¸ao de algoritmos
            a        e                                   c˜
´ uma ferramenta valiosa, n˜o s´ para o aprendizado de linguagens de pro-
e                           a o
grama¸ao, mas para o estudo das mais variadas disciplinas da ´rea. Um
      c˜                                                         a
exemplo poderia ser dado se lembrarmos que boa parte da teoria matem´tica
                                                                     a


                                      2
da computa¸˜o baseia-se no conceito de “algoritmo”, como uma id´ia primi-
              ca                                                   e
tiva.
    Nesta disciplina, desenvolveremos os algoritmos usando uma linguagem
hipot´tica, cuja estrutura e funcionamento ser˜o descritos ao longo do desen-
      e                                       a
volvimento da disciplina. A linguagem adotada aqui foi projetada para que
fosse f´cil a implementa¸ao dos exemplos apresentados em uma linguagem de
       a                c˜
programa¸ao usual, particularmente visando Python como linguagem alvo.
           c˜


2      Conceitos B´sicos
                  a
Algoritmo ´ a descri¸˜o de um conjunto de comandos que, efetuados, resul-
           e         ca
tam numa sucess˜o finita de a¸˜es. Uma outra forma: Algoritmo ´ uma
                  a            co                                 e
lista de instru¸oes (comandos) ordenadas que tem por finalidade resolver
               c˜
um determinado problema. Exemplos de algoritmos: Uma receita culin´ria;
                                                                    a
Instru¸oes para montar algo.
       c˜
    Ex. Algoritmo para fritar um ovo:
    1. Colocar um ovo na frigideira;

    2. Esperar o ovo ficar frito;

    3. Tirar o ovo.
    O algoritmo acima n˜o est´ detalhado. Uma vers˜o mais aceit´vel ´:
                       a     a                    a            a    e
    1. Retirar um ovo da geladeira;

    2. Colocar a frigideira no fogo;

    3. Colocar ´leo;
               o

    4. Esperar at´ o ´leo ficar quente;
                 e o

    5. Quebrar o ovo separando a casca;

    6. Colocar o conte´do na frigideira;
                      u

    7. Esperar um minuto;

    8. Retirar o ovo da frigideira;

    9. Apagar o fogo.

                                         3
Esta vers˜o ´ mais completa e detalhada que a anterior. Para que um
             a e
algoritmo possa ser executado ´ necess´rio que seu usu´rio conhe¸a a termi-
                               e       a               a         c
nologia nele utilizada. No exemplo anterior, para que o algoritmo seja util,
                                                                        ´
´ necess´rio que o usu´rio conhe¸a o significado dos verbos Retirar, Colocar,
e       a              a         c
Esperar assim como dos substantivos utilizados.
    Os algoritmos estudados em aula ser˜o algoritmos computacionais, listas
                                         a
de comandos a serem executados por um computador. Para que o computa-
dor consiga executa-los ele tambem deve conhecer a terminologia utilizada.
Ao conjunto de comandos que fazem parte de uma linguagem de programa¸˜o  ca
chama-se sintaxe da linguagem de programa¸˜o.ca
    Os algoritmos estudados na disciplina de Algoritmos ser˜o desenvolvidos
                                                           a
utilizando uma sintaxe que ser´ apresentada progressivamente ao longo do
                               a
semestre. Esta sintaxe pode ser chamada de portuguˆs estruturado e os
                                                         e
algoritmos nela desenvolvidos podem ser facilmente adapt´veis as diversas
                                                           a
linguagens de programa¸˜o existentes.
                         ca
    A forma geral dos algoritmos a ser adotada em aula ´:e

Algoritmo
  { lista-de-comandos }
fim_algoritmo

onde { lista-de-comandos } ´ uma lista com um ou mais comandos. Note
                               e
a endenta¸ao dos comandos dentro do ambiente Algoritmo-fim_algoritmo.
         c˜
   Vamos imaginar uma m´quina virtual que executa os comandos de nossos
                           a
algoritmos, lendo os dados de uma entrada fict´
                                             ıcia, e imprimindo os resulta-
dos em uma tela virtual. Embora esta m´quina n˜o exista no mundo real,
                                        a         a
com ela poderemos mentalmente executar os nossos algoritmos. Com relati-
vamente pouca dificuldade ´ poss´ traduzir os algoritmos de sala de aula
                            e    ıvel
para uma linguagem de programa¸˜o real.
                                 ca

2.1    Comando de Escrita
O comando de escrita ´ utilizado quando se deseja que o algoritmo escreva
                       e
algo. Esta “escrita” pode ser em uma impressora, um terminal de v´ıdeo ou
outra sa´ qualquer. O formato do comando ´:
        ıda                                 e

Escreva { lista-de-express~es }
                          o



                                     4
onde { lista-de-express~es } ´ uma lista de uma ou mais express˜es e
                          o    e                                   o
uma express˜o pode ser uma constante, uma express˜o aritm´tica, vari´vel
            a                                    a       e          a
ou chamada de fun¸ao.
                   c˜
   Ex: (dica: use endenta¸ao)
                         c˜
Algoritmo
  Escreva ’Jo~o Vitor’,’ ’,’Luana’
              a                              Escreva ’1’
  Escreva 1 + 2
fim_algoritmo
   Ao ser executado este algoritmo o resultado ser´:
                                                  a
Jo~o Vitor Luana
  a
1
3
    O exemplo ´ composto de trˆs comandos de escrita. Observe que podemos
              e               e
colocar mais de um comando por linha (op¸ao n˜o muito interessante pois
                                           c˜ a
esconde a estrutura do algoritmo e confunde a sua leitura).
    O primeiro comando manda escrever uma lista de trˆs constantes, no
                                                          e
segundo deve escrever uma constante e no terceiro deve escrever o resultado
de uma express˜o aritm´tica. Quando um comando de escrita tiver mais de
               a        e
um valor a ser escrito como no primeiro, os diversos valores s˜o separados
                                                              a
por v´ırgula.
    Observe que ’Jo~o Vitor’ ´ um literal, ou seja, tudo que estiver entre
                    a           e
dois ’ ser´ impresso exatamente da forma com que est´ escrito. A utilidade
           a                                           a
do ’ ’ ´ efetuar a separa¸ao entre os diversos termos a serem impressos j´
         e                c˜                                              a
que o comando Escreva imprime os termos sem espa¸os entre eles.
                                                     c
    Ex2:
Algoritmo
  Escreva ’Jo~o Vitor’,’Luana’
              a
  Escreva 1+2
  Escreva ’1+2’
fim_algoritmo
Produzindo:
Jo~o VitorLuana
  a
3
1+2

                                    5
Observe o efeito da ausˆncia de ’ ’ entre ’Jo~o Vitor’ e ’Luana’.
                       e                     a
    Os comandos como Algoritmo e fim_algoritmo s˜o chamados palavras
                                                    a
reservadas da linguagem. A linguagem trata mai´sculas e min´sculas como
                                                u           u
iguais.

2.2    Constantes
Uma constante ´ um valor que n˜o se modifica com o tempo. As constan-
                 e                 a
tes com que trabalharemos podem ser de trˆs tipos diferentes, num´ricas,
                                              e                       e
l´gicas ou literais. Constantes num´ricas podem conter quaisquer valores
 o                                    e
num´ricos, reais ou inteiros, positivos ou negativos, etc. Exemplos de cons-
     e
tantes num´ricas s˜o:
           e        a

25
3.14
-2.57
-0.0003
-10

   Constantes literais podem conter um ou mais caracteres alfab´ticos ou
                                                                 e
num´ricos. S˜o delimitados por aspas. Exemplos de constantes literais s˜o:
    e       a                                                          a

’Jose da Silva’
’1245’
’1 2 3 de oliveira’

   Constantes l´gicas podem conter somente dois valores, verdadeiro e
               o
falso. Normalmente s˜o utilizadas em testes em algoritmos.
                     a

2.3    Vari´veis
           a
Uma vari´vel ´ um valor que pode ser alterado em um algoritmo. Cada
          a   e
vari´vel tem um nome associado a ela que a identifica. O identificador de
    a
uma vari´vel deve come¸ar por uma letra e pode conter letras ou d´
         a            c                                          ıgitos. Ex:

A
X5
Joao



                                     6
Assim como as constantes as vari´veis tamb´m podem ser de trˆs tipos:
                                      a         e                   e
num´ricas, l´gicas ou literais.
     e       o
    Para utilizar uma vari´vel em um algoritmo ´ necess´rio que ela seja
                            a                      e       a
declarada no in´ ıcio do algoritmo, ou seja, defina-se no in´
                                                           ıcio do algoritmo
qual o tipo de valor com que a vari´vel ir´ trabalhar ( num´rico, l´gico ou
                                     a      a                 e     o
literal ). O formato do comando de declara¸˜o ´:
                                             ca e
Declare <lista de identificadores> <tipo das vari´veis>
                                                 a
   Ex:
Declare Nota,Codigo,X5 Num´rico
                          e
Declare Teste,Sim L´gico
                   o
Declare Nome,End1,End2 Literal
   Assim, a forma geral de um algoritmo passa a ser:
Algoritmo
  { declara¸oes }
           c~
  { corpo do algoritmo }
fim_algoritmo

2.4      Atribui¸˜o
                ca
Uma vari´vel pode armazenar qualquer valor e seu valor pode ser alterado a
         a
qualquer momento no algoritmo. O comando utilizado para alterar o valor
de uma vari´vel ´ o comando de atribui¸˜o. Sua forma geral ´ a seguinte:
           a    e                     ca                   e
<identificador de vari´vel> := <express~o>
                      a                a
onde <express~o> pode ser uma constante, express˜o aritm´tica, vari´vel
             a                                  a       e          a
ou chamada de fun¸ao. Por exemplo:
                 c˜
A := 5
    O comando acima (lˆ-se “A recebe cinco”) faz com que a vari´vel A passe
                       e                                        a
a valer 5. O valor anterior da vari´vel A ´ perdido e seu novo valor passa a
                                   a      e
ser 5.
    Assim, por exemplo:
{A=10}
A := 5
{A=5}

                                     7
E fica perdido o valor anterior da vari´vel (10).
                                      a
   Ent˜o, como trocar dois valores? Resposta: Usando uma vari´vel auxiliar.
       a                                                     a
Ex: trocar os valores de a e b.

aux := a
a := b
b:= aux

   Outros exemplos de atribui¸˜o s˜o:
                             ca a

A := 3 + 2
A := B
X5 := A + 1

    No primeiro exemplo a vari´vel A recebe o resultado da express˜o aritm´tica
                               a                                  a       e
3 + 2, express˜o esta que cont´m somente constantes. No segundo exemplo a
               a                e
vari´vel A recebe o conte´do da vari´vel B e no terceiro exemplo a vari´vel X5
    a                    u          a                                  a
recebe o resultado da express˜o aritm´tica A + 1, express˜o esta que cont´m
                              a       e                    a               e
a vari´vel A e a constante 1.
      a
    Um exemplo interessante:

{A=10}
A := A+1
{A=11}

Ou seja, a express˜o A+1 ´ avaliada, tendo como resultado 10 + 1 = 11 e o
                   a       e
valor ´ atribuido ` vari´vel A.
      e           a     a

2.5    Comando de Leitura
O comando de leitura ´ utilizado quando o algoritmo deve receber um valor
                      e
externo, por exemplo, de um teclado. Seu formato geral ´:
                                                       e

Leia <lista-de-vari´veis>
                   a

    Este comando faz com que a primeira vari´vel da lista receba o primeiro
                                              a
valor digitado no teclado, a segunda vari´vel receba o segundo valor e assim
                                         a
por diante.
    Ex:

Leia A,B

                                      8
Ao executar este comando o computador espera que sejam fornecidos dois
valores na entrada virtual ( p.ex: 10 e 20 ). A vari´vel A receber´ ent˜o o
                                                     a            a    a
primeiro valor (10) e a vari´vel B receber´ o segundo valor (20).
                            a             a
    Ex 2.8 - Escrever um algoritmo que lˆ trˆs n´meros, calcula as m´dias
                                           e e u                      e
aritm´tica, harmˆnica e geom´trica e escreve os n´meros lidos e as m´dias
      e          o             e                   u                  e
calculadas.
              A+B+C                 √
                                    3                              3
       MA =                 MG =        A×B×C      MH =    1       1       1
                3                                          A
                                                               +   B
                                                                       +   C

   Ex 2.9 - Escrever um algoritmo que lˆ o nome de um funcion´rio, o
                                          e                           a
n´mero do funcion´rio, seu n´mero de horas trabalhadas, o valor que recebe
 u                 a        u
por hora, o n´mero de filhos com idade menor que 14 anos e calcula o sal´rio
             u                                                           a
deste funcion´rio.
             a
   Ex 2.10 - Escrever um algoritmo que calcula o fatorial de 5.
   Ex 2.11 - Escrever um algoritmo que lˆ trˆs valores, a, b e c e calcula:
                                        e e
  1. A ´rea do triˆngulo que tem a por base e b por altura;
       a          a

  2. A ´rea do c´
       a        ırculo de raio c;

  3. A ´rea do trap´zio que tem a e b por bases e c por altura;
       a           e

  4. A ´rea do quadrado de lado b;
       a

  5. A ´rea do retˆngulo de lados a e b;
       a          a

  6. A ´rea da superf´ de um cubo que tem c por aresta.
       a             ıcie
   Ex 2.12 - Escrever um algoritmo que escreve os n´meros ´
                                                         u      ımpares entre
10 e 20.
   Ex 2.13 - Escrever um algoritmo que lˆ p, u e r, respectivamente o primeiro
                                        e
termo de uma progress˜o aritm´tica, o ultimo termo da progress˜o e a raz˜o
                       a       e       ´                          a         a
desta progress˜o. Determinar a soma dos termos desta progress˜o aritm´tica.
              a                                                 a        e
                           an + a1               an − a1
                  soma =           ×n       n=           +1
                              2                     r
     Ex 2.14 - Escrever um algoritmo que lˆ o c´digo da pe¸a 1, o n´mero de
                                          e    o          c        u
pe¸as 1, o valor unit´rio da pe¸a 1, o c´digo da pe¸a 2, o n´mero de pe¸as
   c                  a         c       o           c       u           c
2, o valor unit´rio da pe¸a 2 e a percentagem do IPI a ser acrescentado e
                a          c
calcula o valor total a ser pago.

                                        9
Opera¸˜o
                           ca      S´
                                    ımbolo    Precedˆncia
                                                     e
                     Adi¸ao
                         c˜           +            3
                    Subtra¸ao
                           c˜         -            3
                   Multiplica¸˜o
                              ca      *            2
                     Divis˜o
                           a          /            2
                   Potencia¸˜o
                             ca       **           1


                      Tabela 1: Opera¸oes Aritm´ticas
                                     c˜        e

2.6    Express˜es Aritm´ticas
              o        e
Para que uma express˜o possa ser avaliada em um algoritmo ela deve seguir
                        a
uma sintaxe bem definida. As opera¸˜es utilizadas nas express˜es aritm´ticas
                                      co                        o        e
em nossa linguagem s˜o as mostradas na Tabela 1 junto com as suas pre-
                         a
cedˆncias. A precedˆncia dos operadores indica a ordem que eles ser˜o ava-
    e                 e                                                a
liados em uma express˜o. a
    A precedˆncia dos operadores ´ relevante para o resultado da avalia¸ao
               e                    e                                      c˜
de uma express˜o. Por exemplo, a avalia¸ao da express˜o 3 + 4 * 2 pode
                  a                         c˜             a
resultar 14 se a soma for efetuada em primeiro lugar ou 11 se a multiplica¸˜o
                                                                           ca
for efetuada em primeiro lugar. Para isto se define a prioridade das opera¸oes.
                                                                          c˜
Ao avaliar uma express˜o primeiro s˜o efetuada as potencia¸oes, ap´s s˜o efe-
                         a           a                       c˜     o a
tuadas as multiplica¸oes e divis˜es e por fim as adi¸˜es e subtra¸˜es. Quando
                      c˜         o                 co            co
houverem duas opera¸oes de mesma prioridade para serem efetuadas, a or-
                        c˜
dem de execu¸˜o ´ da esquerda para a direita.
                ca e
     ´
    E poss´ alterar a ordem de execu¸ao das opera¸oes em uma express˜o
           ıvel                          c˜           c˜                     a
com o uso de parˆnteses. Em uma express˜o com parˆnteses em primeiro
                    e                          a          e
lugar s˜o efetuadas as opera¸oes entre parˆnteses.
        a                     c˜             e
    Ex: Express˜o para o c´lculo das ra´ de uma equa¸˜o de segundo grau
                  a         a            ızes             ca
segundo a f´rmula de Bascara (usar o - un´rio).
             o                                a

X1 := (-B+(B**2-4*A*C)**(1/2))/(2*A)
X2 := (-B-(B**2-4*A*C)**(1/2))/(2*A)

     Al´m das opera¸oes acima descritas a nossa ’linguagem’ oferece as fun¸˜es
       e           c˜                                                     co
pr´-definidas da Tabela 2.
   e
     Ex: ABS(-2)= 2, QUOCIENTE(7,2)= 3, RESTO(5,2)= 1, TRUNCA(3.9)=
3, ARREDONDA(3.4)= 3 e ARREDONDA(3.5)= 4.


                                     10
Fun¸˜o
                ca                      Especifica¸ao
                                                   c˜
             LOG(x)              logaritmo de x na base 10
             LN(x)                 logaritmo natural de x
             EXP(x)            e elevado na x-´sima potˆncia
                                               e         e
             ABS(x)            m´dulo ( valor absoluto ) de x
                                 o
           TRUNCA(x)                  valor inteiro de x
          ARREDONDA(x)            inteiro mais pr´ximo a x
                                                  o
            SINAL(x)                     −1 se x < 0
                                          0 se x = 0
                                          1 se x > 0
        QUOCIENTE(x,y)     quociente inteiro da divis˜o de x por y
                                                      a
          RESTO(x,y)         resto da divis˜o inteira de x por y
                                           a


                     Tabela 2: Fun¸oes Pr´-definidas
                                  c˜     e

    Ex 2.16 - Escrever um algoritmo para calcular os sucessivos valores de
E usando a s´rie abaixo considerando primeiro 3 termos, depois 4 termos e
             e
finalmente 5 termos:
                               1    1   1    1
                          E= + + +
                               1! 2! 3! 4!
    Ex 2.17 - Escrever um algoritmo que lˆ o valor de um empr´stimo e
                                          e                      e
calcula o valor de cada amortiza¸ao considerando 24 amortiza¸oes a uma
                                 c˜                           c˜
taxa de 48%. Depois fazer o mesmo algoritmo lendo os valores da taxa e do
n´mero de amortiza¸oes.
 u                  c˜

              VAMORT = VEMPREST × TAXA/NAMORT

onde VAMORT ´ o valor da amortiza¸˜o, VEMPREST ´ o valor do empr´s-
                  e                  ca                e                e
timo, TAXA ´ a taxa, e NAMORT ´ o n´mero de amortiza¸oes.
               e                   e    u                 c˜
     Ex 2.18 - Escrever um algoritmo que lˆ um valor em cruzeiros e calcula
                                          e
qual o menor n´mero poss´ de notas de 5000, 1000, 500, 200, 100, 50, 10,
                 u         ıvel
5 e 1 em que o valor lido pode ser decomposto. Escrever o valor lido e a
rela¸ao de notas necess´rias.
     c˜                 a
     Ex 2.19 - Escrever um algoritmo que lˆ o n´mero do vendedor, o seu
                                            e   u
sal´rio fixo, o total de vendas por ele efetuadas e o percentual que ganha
    a
sobre o total de vendas. Calcular o sal´rio total do vendedor. Escrever o
                                        a
n´mero do vendedor e o sal´rio total.
  u                         a

                                    11
Ex 2.20 - Escrever um algoritmo que lˆ 3 valores a, b e c que s˜o lados de
                                          e                      a
um triˆngulo e calcule a ´rea deste triˆngulo.
      a                  a             a

                      ´rea =
                      a        s(s − a)(s − b)(s − c)
onde s = (a + b + c)/2 (semi-per´
                                ımetro).
   Ex 2.21 - Um sistema de equa¸˜es lineares do tipo:
                                  co
                               ax + by = c
                               dx + ey = f
pode ser resolvido segundo mostrado abaixo:
                            ce − bf             af − cd
                       x=                  y=
                            ae − bd             ae − bd
Escrever um algoritmo que lˆ os coeficientes a, b, c, d, e, e f , e calcula e
                             e
escreve os valores de x e y.
    Ex 2.22 - O custo ao consumidor, de um carro novo, ´ a soma do custo
                                                           e
de f´brica com a porcentagem do distribuidor e dos impostos ( aplicados ao
    a
custo de f´brica ). Supondo que a percentagem do distribuidor seja de 28%
          a
e os impostos de 45%, escrever um algoritmo para ler o custo de f´brica de
                                                                    a
um carro e escrever o custo ao consumidor. Depois fazer o mesmo algoritmo
lendo os valores da porcentagem do distribuidor e dos impostos.
    Ex 2.23 - Uma revendedora de carros usados paga a seus funcion´rios  a
vendedores, um sal´rio fixo por mˆs, mais uma comiss˜o tamb´m fixa para
                    a              e                     a      e
cada carro vendido e mais 5% do valor das vendas por ele efetuadas. Escrever
um algoritmo que lˆ o nome do vendedor, o n´mero do vendedor, o n´mero
                    e                          u                       u
de carros por ele vendidos, o valor total de suas vendas, o sal´rio fixo e o
                                                                a
valor que recebe por carro vendido e calcula o sal´rio mensal do vendedor,
                                                     a
escrevendo-o juntamente com o seu nome e seu n´mero de identifica¸˜o.
                                                   u                  ca
    Ex 2.24 - Considerando que o aumento dos funcion´rios ´ de 80% do INPC
                                                       a   e
e mais um percentual de produtividade discutido com a empresa. Escrever
um algoritmo que lˆ o nome do funcion´rio, o n´mero do funcion´rio, seu
                    e                     a         u                a
sal´rio atual, o valor do INPC e o ´
   a                                  ındice de produtividade conquistado e
escreve o nome do funcion´rio, seu aumento e o valor do novo sal´rio.
                           a                                      a
    Ex 2.25 - Escrever um algoritmo que lˆ 3 valores a, b e c e os escreve.
                                            e
Encontre a seguir o maior dos trˆs valores e o escreva com a mensagem: ”E
                                 e                                         ´
o maior”.
                                    a + b + |a − b|
                           maior =
                                           2

                                      12
Relacional     Significado
                            =           Igual a
                        <> ou =      Diferente de
                            >         Maior que
                            <         Menor que
                           >=       Maior ou igual a
                           <=       Menor ou igual a


                          Tabela 3: Relacionais
              Operador                Significado
                N~o
                 a        Inverte o valor l´gico do operando
                                           o
                 E          Verdadeiro se e somente se os
                            dois opeandos s˜o verdadeiros
                                             a
                  Ou      Verdadeiro se pelo menos um dos
                             dois operandos ´ verdadeiro
                                              e


                       Tabela 4: Operadores L´gicos
                                             o

2.7    Express˜es L´gicas
              o    o
Express˜es l´gicas s˜o express˜es que avaliadas resultam em um valor l´gico
        o o         a         o                                       o
( verdadeiro ou falso ). Assim como as express˜es aritm´ticas elas tamb´m
                                                 o       e              e
disp˜em de um conjunto de operadores, s´
     o                                   ımbolos e prioridades. Os operado-
res s˜o divididos em operadores relacionais e operadores l´gicos.
     a                                                    o
    Operadores relacionais atuam sobre operandos num´ricos mas resultam
                                                        e
em valores l´gicos. S˜o operadores de compara¸˜o entre dois operandos. A
             o        a                          ca
Tabela 3
    Operadores l´gicos atuam sobre valores l´gicos e resultam em valores
                 o                             o
l´gicos (veja Tabela 4).
 o
    Exemplos de express˜es l´gicas:
                         o o

A > 0 E B > 3
Teste OU A * B > C

   A precedˆncia de operadores da nossa linguagem ´ apresentada na Ta-
           e                                      e
bela 5.


                                     13
Operador           Precedˆncia
                                                  e
                  Operadores Aritm´ticos
                                   e            1
                  Operadores Relacionais        2
                          Nao                   3
                            E                   4
                           OU                   5


                Tabela 5: Operadores e suas Precedˆncias
                                                  e

   Ex: Se A = 1, B = 2 e C = 2 qual o resultado da avalia¸ao da express˜o
                                                         c˜            a
seguinte?

A + B = 0 E C <> 0
3 = 0 E C <> 0
Falso E Verdadeiro
Falso


3     Estrutura Condicional
Utilizada quando um trecho de algoritmo s´ deve ser executado em determi-
                                         o
nadas condi¸oes. Formas Gerais:
            c˜

    1. Se <condi¸ao>
                c~
         ent~o <lista-de-comandos>
            a
       fim_se

    2. Se <condi¸ao>
                c~
         ent~o <lista-de-comandos>
            a
         sen~o <lista-de-comandos>
            a
       fim_se

onde <condi¸ao> ´ uma express˜o l´gica qualquer.
           c~ e              a o
   Ex:

Se a>b
  ent~o Escreva a
     a
  sen~o Escreva b
     a
fim_se

                                   14
Ao ser executado este comando a express˜o a > b ´ avaliada e depen-
                                           a         e
dendo do resultado da avalia¸˜o ´ executado o primeiro comando (escreva
                            ca e
a) ou o segundo comando (escreva b). Observe que as estruturas podem ser
“aninhadas”.
   Ex2:

Se a<>b
  ent~o Se a>b
     a
          ent~o Escreva ’a maior que b’
             a
          sen~o Escreva ’a menor que b’
             a
        fim_se
  sen~o Escreva ’a igual a b’
     a
fim_se

   Ex3: Algoritmo que calcula a raiz da equa¸ao y = ax + b.
                                            c˜

Algoritmo
  Declare A,B,X num´rico
                   e

  Leia A,B
  Se A = 0
    ent~o Escreva ’N~o h´ raizes’
       a             a   a
    sen~o X := -B/A
       a
           Escreva ’Raiz=’,X
  fim_se
fim_algoritmo




                                   15
Ex4: Algoritmo que calcula as raizes da equa¸ao y = ax2 + bx + c.
                                                c˜

Algoritmo
  Declare A,B,C,Delta num´rico
                         e

  Leia A,B,C
  Delta := B**2-4*A*C
  Se Delta = 0
    ent~o Escreva ’S´ h´ uma raiz’,-B/(2*A)
       a             o a
  fim_se
  Se Delta < 0
    ent~o Escreva ’h´ duas raizes complexas’
       a             a
          Escreva -B/(2*A),’+-’,ABS((-Delta)**0.5/(2*A)),’J’
  fim_se
  Se Delta > 0
    ent~o Escreva ’Ha duas raizes reais’
       a
          Escreva (-B+Delta**0.5)/(2*A),’ E ’,
             (-B-(Delta**0.5))/(2*A)
  fim_se
fim_algoritmo

   Observe o  no algoritmo. Ele serve para indicar que a linha continua na
seguinte. Isto ´ util quando a linha de um algoritmo ´ muito grande.
               e´                                    e


4     Estrutura de Repeti¸˜o
                         ca
Utilizada quando um trecho de um algoritmo deve ser repetido um deter-
minado n´mero de vezes. Esta estrutura tamb´m ´ chamada de la¸o de
          u                                 e e                 c
repeti¸ao. Forma geral:
      c˜

    1. Enquanto <condi¸ao>
                      c~
         fa¸a { lista-de-comandos }
           c
       fim_enquanto

    2. Repita
         { lista de comandos }
       at´ <condi¸ao>
         e       c~



                                    16
Na primeira forma os comandos s˜o executados repetitivamente enquanto
                                    a
a condi¸˜o ´ verdadeira, e a condi¸˜o ´ testada antes (pode n˜o executar ne-
       ca e                       ca e                       a
nhuma vez). Na segunda forma os comandos s˜o executados repetitivamente
                                              a
at´ a condi¸˜o tornar-se verdadeira (testa depois de executar, assim sempre
  e        ca
´ executado pelo menos uma vez).
e
    Ex: Escrever os n´meros de 1 a 10.
                     u

Algoritmo
  Declare I num´rico
               e

  I := 1
  Repita
    Escreva I
    I := I + 1
  at´ I > 10
    e
fim_algoritmo

                  e                 u               co        c ´
    A vari´vel I ´ quem controla o n´mero de repeti¸˜es do la¸o. E chamada
           a
vari´vel contadora. Uma vari´vel contadora ´ uma vari´vel que recebe um
    a                         a               e          a
valor inicial, ´ incrementada de um valor constante no la¸o e tem seu valor
               e                                           c
testado em algum ponto do la¸o. Ao chegar a um determinado valor o la¸o ´
                              c                                          c e
interrompido. A inicializa¸˜o da vari´vel contadora deve ir, necessariamente,
                           ca        a
fora do la¸o.
          c
    Existem diversas maneiras de implementar o mesmo la¸o, mas todo la¸o
                                                            c             c
com vari´vel de controle deve conter:
         a

   • inicializa¸˜o;
               ca

   • incremento (ou decremento);

   • teste de valor final.

   Abaixo s˜o mostradas outras trˆs maneiras de implementar o algoritmo
           a                     e
anterior:




                                     17
1. Algoritmo
       Declare I num´rico
                    e

       I := 0
       Repita
         I := I + 1
         Escreva I
       at´ I = 10
         e
     fim_algoritmo

  2. Algoritmo
       Declare I num´rico
                    e

       I := 0
       Enquanto I < 10
         fa¸a
           c
           I := I + 1
           Escreva I
       fim_enquanto
     fim_algoritmo

  3. Algoritmo
       Declare I num´rico
                    e

       I := 1
       Enquanto I < 11
         fa¸a
           c
           Escreva I
           I := I + 1
       fim_enquanto
     fim_algoritmo

   Ainda existe uma possibilidade adicional de abandonar um la¸o de re-
                                                               c
peti¸ao (tanto o Repita quanto o Enquanto) em qualquer lugar por meio de
    c˜
um comando Interrompa:




                                  18
Enquanto verdadeiro
  fa¸a
    c
    Leia x
    Se x>0 ent~o Interrompa fim_se
              a
    Escreva ’Valor inv´lido’
                      a
    Escreva ’Digite novamente’
fim_enquanto

significando que o la¸o (condi¸ao de parada do la¸o ´ verdadeiro) ser´ in-
                     c       c˜                  c e                 a
terrompido (pelo comando Interrompa) apenas quando o usu´rio fornecer
                                                               a
um n´mero maior que zero.
     u
    Ex. 4.7 Escrever um algoritmo que gera e escreve os n´meros impares
                                                            u
entre 100 e 200.
    Exerc. Escrever um algoritmo para calcular o fatorial de um n´mero.
                                                                 u


5    Algoritmos com Acumulador
Quando o algoritmo necessitar efetuar alguma totaliza¸˜o usa-se uma vari´vel
                                                     ca                 a
chamada acumulador. A vari´vel acumuladora tamb´m deve ser inicializada
                            a                       e
(normalmente com zero) e pode ser incrementada ou n˜o de um valor vari´vel
                                                     a                  a
no la¸o.
     c
   Ex: Somar os n´meros de 1 a 10.
                  u

S := 0
I := 0
Enquanto I<10
  fa¸a
    c
    I := I + 1
    S := S + I
fim_enquanto

    Assim, os valores de S e I ao longo da execu¸˜o do algoritmo s˜o mostra-
                                                ca                a
dos na Tabela 6.
    Ex. 4.6 - Escrever um algoritmo que lˆ 5 valores para a, um de cada vez,
                                          e
e conta quantos destes valores s˜o negativos, escrevendo esta informa¸˜o.
                                 a                                    ca
    Ex. 4.8 - Escrever um algoritmo que lˆ 10 valores, um de cada vez,
                                              e
e conta quantos deles est˜o no intervalo [10,20] e quantos deles est˜o fora
                           a                                         a
deste intervalo, escrevendo estas informa¸˜es.
                                          co

                                    19
Volta do la¸o
                   c    Valor de I (ao final)   Valor de S (ao final)
              1                  1                       1
              2                  2                       3
              3                  3                       6
              4                  4                      10
              .
              .                   .
                                  .                      .
                                                         .
              .                   .                      .
              10                 10                    55


                   Tabela 6: Execu¸ao Programa de Soma
                                  c˜

    Ex. 4.9 - Escrever um algoritmo que lˆ um n´mero n˜o conhecido de va-
                                            e       u    a
lores, um de cada vez, e conta quantos deles est˜o em cada um dos intervalos
                                                  a
[0,25], (25,50], (50,75], (75,100].
    Ex. 4.10 - Escrever um algoritmo semelhante ao anterior que calcula as
m´dias aritm´ticas de cada intervalo e as escreve, juntamente com o n´mero
  e            e                                                      u
de valores de cada intervalo.
    Exerc´ıcio: A s´rie de Fibonacci ´ uma sequˆncia de n´meros em que os
                    e                  e           e       u
dois primeiros s˜o 0 e 1 e a partir da´ cada n´mero ´ a soma dos anteriores,
                  a                     ı       u     e
ou seja
                                 tn = tn−1 + tn−2
   Escrever um algoritmo que escreve os 10 primeiros termos da s´rie.
                                                                e
   Ex. 4.11 - Escrever um algoritmo que gera os 10 primeiros termos da
S´rie de Fibonacci e calcula e escreve a soma destes termos.
 e
   Exerc´ıcio: Escrever um algoritmo que leia um n´mero N e escreva o
                                                       u
n´mero de divisores de N.
 u




                                      20
Algoritmo
  Declare N,acum,I num´rico
                      e

  Leia N
  acum := 0
  I := 1
  Repita
    Se Resto(N,I)=0
      entao acum := acum+1
    fim_se
    I := I+1
  at´ I>N
    e
  escreva acum
fim_algoritmo

    Escrever um algoritmo que leia um n´mero e escreva uma mensagem
                                           u
dizendo: “O n´mero ´ primo” ou “O n´mero n˜o ´ primo” conforme o caso.
              u       e                u       a e
    Ex. 4.12 - Escrever um algoritmo que gera os 30 primeiros termos da
                                                                ´
s´rie de Fibonacci e escreve os termos gerados com a mensagem: “E primo”
 e
ou “N˜o ´ primo” conforme o caso.
       a e


6    Refinamentos Sucessivos
´
E uma t´cnica para desenvolver um algoritmo em diversos passos aumentando
         e
o n´
   ıvel de detalhamento a cada passo. A partir do problema gerar uma
poss´ solu¸˜o e detalh´-la at´ um n´ aceit´vel.
    ıvel    ca          a     e      ıvel    a
   Ex: Escrever um algoritmo que leia um n´mero e escreva a mensagem “E
                                           u                            ´
primo” ou “N˜o ´ primo”. Primeira Vers˜o:
             a e                         a
Algoritmo
  Declare n´mero
           u
  Leia n´mero
         u
  {Verifica se n´mero ´ primo}
                u     e
  Se {n´mero ´ primo}
       u      e
    ent~o escreva ’n´mero ´ primo’
       a            u     e
    sen~o escreva ’n´mero n~o ´ primo’
       a            u       a e
  fim_se
fim_algoritmo

                                   21
Detalhamentos:
{ Verifica se n´mero ´ primo }
               u     e
   Um n´mero ´ primo se ´ divis´ somente por si e pela unidade (1). Uma
         u     e           e     ıvel
maneira de descobrir isto ´ contando o n´mero de divisores do n´mero. Se
                          e               u                       u
possuir apenas dois divisores (1 e o pr´prio n´mero ) ele ´ primo.
                                       o      u           e
   { Verifica se n´mero ´ primo } ⇒ { Conta n´mero de divisores }
                  u     e                    u
{ Conta n´mero de divisores }
          u
acum := 0
i := 1
Repita
  Se Resto(Numero,i)=0
    ent~o acum:=acum+1
       a
  fim_se
  i:=i+1
at´ i>n´mero
  e    u
{ N´mero ´ primo }
   u      e
Se acum=2
  ent~o...
     a
   O refinamento para { Conta n´mero de divisores } n˜o ´ bom, por-
                                 u                        a e
que basta verificar que existem mais de dois divisores do n´mero para ele
                                                          u
n˜o ser primo. Assim, rebatizando { Conta n´mero de divisores } para
 a                                          u
{ Verifica se h´ mais de dois divisores }, obtemos, usando o coman-
                 a
do Interrompa:
{ Verifica se h´ mais de dois divisores }
                a
acum := 1
i := 1
Enquanto i <= TRUNCA(n´mero/2)
                       u
  Fa¸a
    c
    Se Resto(Numero,i)=0
       ent~o acum:=acum+1
          a
    fim_se
    Se acum>2 ent~o Interrompa fim_se
                  a
    i:=i+1
fim_enquanto

                                  22
ff P rincipal
                                        fffff
                               fffffffff
                          fffff
                    rfffff                           
  { n´mero ´ primo }
     u     e                      { Verifica de n´mero ´ primo }
                                                 u     e

                                                    
                           { Verifica se h´ mais de dois divisores }
                                          a


          Figura 1: Diagrama de Refinamentos para o Exemplo

Isto melhora a performance do algoritmo, pois ele abandona o la¸o assim
                                                                   c
que percebe que j´ existem mais de dois divisores e faz divis˜es apenas at´
                 a                                           o            e
TRUNCA(n´mero/2).
         u
    A Figura 1 apresenta o diagrama de refinamentos para este exemplo.
    Montando as partes obtemos a vers˜o final:
                                     a

Algoritmo
  Declare n´mero,i,acum num´rico
           u               e

  Leia n´mero
          u
  acum := 1
  i := 1
  Enquanto i = TRUNCA(n´mero/2)
                          u
    Fa¸a
      c
      Se Resto(Numero,i)=0
          ent~o acum:=acum+1
             a
      fim_se
      Se acum2 ent~o Interrompa fim_se
                     a
      i:=i+1
  fim_enquanto
  Se acum=2
    ent~o escreva ’n´mero ´ primo’
        a              u     e
    sen~o escreva ’n´mero n~o ´ primo’
        a              u       a e
  fim_se
fim_algoritmo



                                     23
Usar refinamentos sucessivos:
   Ex 1.12.30. Escrever um algoritmo para gerar e escrever uma tabela
com os valores do seno de um ˆngulo A em radianos, utilizando a s´rie de
                             a                                   e
Mac-Laurin truncada com 20 termos:
                               A1 A3 A5 A7
                     sin(A) =     −    +    −     ···
                               1!   3!   5!    7!
   Os valores dos ˆngulos A devem variar de 0.0 a 6.3 de 0.1 em 0.1.
                  a
   Exerc.: Repetir o exerc´ anterior, truncando a s´rie considerando uma
                          ıcio                      e
precis˜o de 0,0001 na aproxima¸ao obtida (dica: considere o valor absoluto
      a                        c˜
do ultimo termo).
   ´
   Ex. 1.12.40. Fazer um algoritmo que calcule e escreva o cosseno de A
usando a s´rie truncada com 20 termos:
          e
                                A2 A4 A6 A8
                   cos(A) = 1 −    +     −     +    ···
                                2!    4!    6!   8!
    Ex. 1.12.32. O valor aproximado de ? pode ser calculado usando-se a
s´rie:
 e
                          1    1    1     1    1
                     S = 3 − 3 + 3 − 3 + 3 ···
                          1    3    5    7     9
           √
           3
sendo π ≈ S × 32. Fazer um algoritmo para calcular e escrever o valor de
π com 51 termos.


7    Usando Matrizes
Matriz ´ um conjunto de vari´veis, cada uma podendo representar o valor
        e                      a
de uma constante, como se fossem vari´veis simples, mas todas elas com-
                                        a
                                 ´
partilhando um nome comum. Indices s˜o associados a este nome comum
                                         a
permitindo individualizar os elementos do conjunto.
   Ex: conjunto de 5 elementos e nome a
                            a1    a2   a3   a4   a5
    Qual ´ a utilidade dos matrizes? Resposta: Tratar com dados em s´rie
          e                                                              e
do mesmo tipo.
    Ex: Deseja-se calcular a m´dia de notas de 10 alunos e determinar quantos
                              e
ficaram acima da m´dia. Portanto, deve-se calcular a m´dia de 10 n´meros
                     e                                     e           u
lidos e determinar quantos destes n´meros est˜o acima da m´dia.
                                    u           a              e
    Para calcular a m´dia podemos usar o seguinte algoritmo:
                       e

                                       24
Algoritmo
  Declare cont,soma,num num´rico
                           e

  cont := 10
  soma := 0
  Repita
    Leia num
    soma := soma+num
    cont := cont-1
  At´ cont=0
    e
  Escreva soma/10
fim_algoritmo

    Problema: Quando os n´meros s˜o lidos n˜o conhecemos ainda o valor
                              u        a        a
da m´dia. Ao final do programa anterior n˜o temos mais acesso aos n´meros
      e                                    a                        u
lidos (pois j´ foram lidos). Lˆ-los novamente seria perda de tempo.
             a                 e
    Como fazer este algoritmo sem matrizes?
    Resposta: Ler os 10 n´meros e guarda-los em 10 vari´veis para testar
                            u                               a
uma a uma ap´s obter a m´dia.
                o            e
    Problema: E se fossem 1000 alunos? Teriamos dificuldades de manipular
1000 vari´veis diferentes.
          a
    Solu¸˜o: uso de uma matriz para armazenar os valores das notas para
        ca
posteriormente processa-los.

7.1    Declara¸˜o de Matrizes
              ca
Deve-se definir nas declara¸oes:
                          c˜

  1. Quais vari´veis do algoritmo s˜o do tipo matriz;
               a                   a

  2. Quantas dimens˜es possui cada uma delas;
                   o

  3. Qual o tamanho de cada dimens˜o;
                                  a

  4. O tipo dos componentes individuais da matriz.

   Nota¸˜o:
       ca

Declare Nome ’(’ tamanho ’)’ tipo
Declare Nome ’(’ tamanho ’,’ tamanho ... ’)’ tipo

                                   25
Ex: Declare a(5),m(6,8) num´rico.
                                e
  Conven¸ao: O primeiro ´
          c˜            ındice representa a linha e o segundo a coluna.
O menor ´
        ındice ´ o 1.
               e

7.2    Tratando com Matrizes
Para ler uma matriz ´ necess´rio ler cada um dos seus componentes indivi-
                    e       a
duais.
   Ex: Ler 5 elementos da matriz a.
Algoritmo
  Declare i,a(5) num´rico
                    e

  i := 1
  Enquanto i6
    fa¸a
      c
      Leia a(i)
      i:=i+1
  fim_enquanto
fim_algoritmo
    Observa¸ao: a vari´vel i ´ chamada de ´
           c˜         a      e            ındice.
    Ex: Ler os 48 elementos da matriz m(6, 8). Devemos usar duas vari´veis
                                                                     a
de ´
   ındice.
Algoritmo
  Declare i,j,m(6,8) num´rico
                        e

  i:=1
  Enquanto i7
    fa¸a
       c
       j:=1
       Enquanto j9
         fa¸a
            c
            Leia m(i,j)
            j:=j+1
       fim_enquanto
       i:=i+1
  fim_enquanto
fim_algoritmo

                                   26
Observe que este algoritmo usa dois la¸os aninhados.
                                         c
   Ex: Somar os elementos da diagonal principal de m(10, 10), lendo a matriz
antes e escrevendo a soma ao final.

Algoritmo
  Declare soma,i,j,m(10,10) num´rico
                               e

  i:=1
  Repita
    j:=1
    Repita
       Leia m(i,j)
       j:=j+1
    at´ j10
       e
    i:=i+1
  at´ i10
    e
  soma:=0
  i:=1
  Repita
    soma:=soma+m(i,i)
    i:=i+1
  at´ i10
    e
  Escreva soma
fim_algoritmo

   Exerc.: Calcular a m´dia de 10 alunos de uma disciplina, entrando a
                         e
nota e o nome do aluno. Determinar o n´mero de alunos que tiveram nota
                                        u
superior a m´dia e imprimir o nome dos alunos que tiveram este feito.
             e
   Ex. 2.5.1.4. Dado um conjunto de 100 valores num´ricos dispon´
                                                     e             ıveis na
entrada, fazer um algoritmo para armazen´-los em uma matriz e calcular e
                                          a
imprimir o valor do somat´rio dado a seguir:
                          o

      S = (v1 − v100 )3 + (v2 − v99 )3 + (v3 − v98 )3 + · · · + (v50 − v51 )3

   Determinar a posi¸ao, dentro de uma matriz quadrada, de um elemento
                     c˜
pode ser muito util em alguns tipos de algoritmos. Por exemplo, determi-
               ´
nar se determinado elemento est´ acima ou abaixo da diagonal principal da
                               a
matriz.


                                        27
Figura 2: Posi¸oes em uma Matriz
                                  c˜

    Algumas rela¸˜es s˜o importantes para determinar a posi¸ao dos elemen-
                co a                                       c˜
tos de uma matriz quadrada (veja Figura 2).
                                                      
                           a11 a12    a13     · · · a1n
                                                       
                       
                       
                           a21 a22    a23     · · · a2n 
                                                        
                          a31 a32    a33     · · · a3n 
                                                       
                           .   .      .      ..     . 
                       
                       
                            .
                            .   .
                                .      .
                                       .          . . 
                                                     . 
                           an1 an2    an3     · · · ann

   Sendo i e j os ´
                  ındices dos elementos da matriz:

   • Diagonal principal – i = j;

   • Diagonal secund´ria – i + j = n + 1;
                    a

   • Abaixo da diagonal principal – i  j;

   • Acima da diagonal principal – i  j;

   • Acima da diagonal secund´ria – i + j  n + 1;
                             a

   • Abaixo da diagonal secund´ria – i + j  n + 1.
                              a

   Exerc. Escrever um algoritmo para ler um valor n e a seguir ler uma
matriz n × n. Ent˜o, determinar a soma de todos os elementos acima da
                    a
diagonal principal e imprimi-lo.
   Exerc. Escrever um algoritmo para ler uma matriz a de tamanho n × m
e outra matriz b de tamanho m × p. Ent˜o, determinar e imprimir a matriz
                                       a
produto c de tamanho n × p.
                                      m
                              cij =         aik bkj
                                      k=1




                                      28
CAR CDR



     1             2               3                             c     nil




                                                 a               b     nil




                 Figura 3: Representa¸˜o Gr´fica da Lista
                                     ca    a

8        Usando Listas
Uma estrutura formada por uma seq¨ˆncia de elementos de tipos diversos ´
                                   ue                                  e
chamada de lista. Importante observar que um elemento de uma lista pode
ser outra lista.
    Por exemplo:
[1,2,3,[’a’,’b’],’c’]
que ´ uma lista com cinco elementos e o quarto elemento da lista ´ uma outra
     e                                                           e
lista de dois elementos.
     Na representa¸˜o interna de lista, cada elemento de uma lista ´ formado
                   ca                                              e
por um nodo com dois elementos (CAR e CDR – pronuncia-se “cuder”) que
podem ser preenchidos com valores constantes (num´ricos, literais ou l´gicos)
                                                    e                  o
ou elos. Um elo ´ um indicador da posi¸ao de um outro nodo na mem´ria da
                 e                       c˜                            o
m´quina. Existe um elo especial (nil) que n˜o aponta para nenhum lugar e
   a                                           a
´ usado para indicar o fim de uma lista. nil pode indicar tamb´m uma lista
e                                                               e
vazia. Observe que uma matriz n˜o pode ser um elemento de uma lista.
                                   a
     Exemplo:
[1,2,3,[’a’,’b’],’c’]
seria armazenado internamente na mem´ria da m´quina como ilustrado na
                                    o        a
Figura 3.
    Comumente se chama a parte CAR de cabe¸a da lista e a parte CDR de
                                          c
resto ou rabo da lista.

                                       29
8.1    Constantes Lista
As constantes listas s˜o qualquer seq¨ˆncia de num´ricos, literais ou l´gicos,
                      a               ue           e                   o
separados por v´ırgulas e delimitados por [ e ]. Uma constante lista pode ter
em um ou mais de seus termos outras listas e assim por diante. Ex:
[1,2,[’a’,’b’,[1,’b’]],3]

8.2    Opera¸oes com Listas
            c˜
Est˜o definidas em nossa linguagem de algoritmos as fun¸oes e opera¸oes
   a                                                  c˜          c˜
sobre listas da Tabela 7. Ex:
CAR(CDR([1,2,3]))=2
CDR(CDR([’a’,’b’,’c’,’d’]))=[’c’,’d’]
CDR(CAR(CDR([1,[2,3],4])))=[3]
CONS(’a’,[’b’,’c’])=[’a’,’b’,’c’]
CONS(’a’,nil)=[’a’]
CONS([1,2],[’a’,’b’])=[[1,2],’a’,’b’]
NIL([1,2])=falso
[1,2,3,4,5](2)=3
   A Figura 4 apresenta a interpreta¸˜o gr´fica das opera¸oes CAR e CDR para
                                    ca    a             c˜
a avalia¸˜o CDR(CAR(CDR([a,[b,[c]],d]))).
        ca

8.3    Declara¸˜o de Vari´vel Lista
              ca         a
Uma vari´vel lista ´ declarada da seguinte forma:
        a          e
Declare x lista
   Podemos agora manipular a vari´vel lista em uma atribui¸ao.
                                 a                        c˜
   Ex:
x := [2,3,4]
x := CONS(1,x)
que resulta em x igual a [1,2,3,4].
    Observa¸ao: N˜o podemos atribuir um valor a uma posi¸ao qualquer da
            c˜    a                                     c˜
lista. S´ podemos trocar sua cabe¸a:
        o                        c
x := [1,2,3,4]
x := CONS(10,CDR(x))
que resulta em x igual a [10,2,3,4].

                                     30
a
                                primeiro CDR



CAR



      b                              d      nil

                                      segundo CDR
                               nil



       c       nil

      Figura 4: Interpreta¸ao Gr´fica de CAR e CDR
                          c˜    a




                          31
Opera¸ao
                c˜                    Significado
            CAR(x)            Obt´m a cabe¸a de uma lista
                                 e         c
                                 (devolve o CAR de x)
            CDR(x)            Obt´m o resto de uma lista
                                  e
                               (devolve a lista CDR de x)
          CONS(x,y)         Constroi um nodo tendo como
                                 CAR x, e como CDR y
                       (segundo argumento deve ser uma lista)
             x(i)        Devolve a i-´sima posi¸ao da lista x
                                      e          c˜
                         (o ´
                            ındice da primeira posi¸ao ´ zero)
                                                    c˜ e
            TAM(x)                Tamanho da lista x
            NIL(x)             Verifica se a lista ´ vazia
                                                  e
                               (testa se x ´ igual a nil,
                                           e
                          retornando verdadeiro ou falso)


               Tabela 7: Fun¸oes e Opera¸oes sobre Listas
                            c˜          c˜

8.4   Tratando Listas
Listas s˜o uma estrutura dinˆmica muito poderosa e flex´ para construir
        a                     a                            ıvel
algoritmos que tratem com situa¸oes em que os dados est˜o constantemente
                                  c˜                       a
sendo inseridos e retirados (pilhas e filas s˜o exemplos).
                                            a
    Tamb´m s˜o uma boa alternativa `s matrizes, em casos em que o tama-
          e   a                        a
nho dos dados ´ conhecido apenas em tempo de execu¸ao. Por exemplo, se
                e                                       c˜
desejamos encontrar o n´mero de elementos que s˜o menores que a m´dia de
                         u                        a               e
um conjunto de num´ricos:
                      e




                                  32
Algoritmo
  Declare x,n,i,acum,m num´rico
                          e
  Declare a lista

  Escreva ’Entre a quantidade de valores’
  Leia n
  i := 1
  a := nil
  acum := 0
  Enquanto in+1
    fa¸a
      c
      Escreva ’Entre com valor ’,i
      Leia x
      a := CONS(x,a)
      i := i+1
      acum:=acum+x
  fim_enquanto
  m := acum/n
  acum := 0
  Enquanto N~o NIL(a)
             a
    fa¸a
      c
      Se a(0)m ent~o acum := acum+1 fim_se
                   a
      a := CDR(a)
  fim_enquanto
  Escreva acum
fim_algoritmo

   Exerc´ıcio: Escreva um trecho de algoritmo que apague o ultimo elemento
                                                           ´
de uma lista qualquer.
   Exerc´ıcio: Escrever um algoritmo que leia uma lista de 10 elementos e
depois apague da lista todos os elementos que forem menores que 100.




                                   33
Solu¸˜o:
       ca

Algoritmo
  Declare x,i num´rico
                 e
  Declare a,b lista

  i := 1
  a := nil
  Enquanto i11
    fa¸a
      c
      Leia x
      a := CONS(x,a)
      i := i+1
  fim_enquanto

  i := 1
  b := nil
  Enquanto N~o NIL(a)
             a
    fa¸a
      c
      Se CAR(a)=100
         ent~o b:=CONS(CAR(a),b)
            a
      fim_se
      a := CDR(a)
  fim_enquanto
  Escreva b
fim_algoritmo

   Exerc´ıcio: Escreva um trecho de algoritmo que encontre o maior valor de
uma lista de num´ricos.
                  e
   Exerc´ıcio: Escrever um trecho de algoritmo que inverta uma lista.
   E se precis´ssemos fazer a concatena¸˜o de duas listas? Assim, se a=[1,2,3]
              a                        ca
e b=[4,5] sua concatena¸ao ser´ [1,2,3,4,5].
                         c˜      a
   Aten¸ao: CONS(a,b) n˜o vai funcionar. Por que?
        c˜                a
   Exerc´ıcio: Escrever um trecho de algoritmo para concatenar duas listas.




                                    34
9     Sub-algoritmos
Sub-algoritmos s˜o trechos de algoritmos que efetuam um ou mais c´lculos
                 a                                                  a
determinados em sua declara¸ao ou defini¸˜o. Ao inv´s de escrever-se um
                              c˜           ca        e
algoritmo grande, escrevem-se v´rios algoritmos menores, os quais, n˜o iso-
                                 a                                  a
                                                             ´
ladamente, mas em conjunto, resolvem o problema proposto. E conveniente
usa-los quando uma determinada tarefa ´ efetuada em diversos lugares no
                                         e
mesmo algoritmo. Ao inv´s de escrever-se o mesmo trecho diversas vezes,
                           e
escreve-se o sub-algoritmo e o mesmo ´ chamado diversas vezes.
                                     e
    As vantagens s˜o:
                   a

    • Eles reduzem o tamanho do algoritmo;

    • Facilitam a compreens˜o e visualiza¸ao do algoritmo;
                           a             c˜

    • Isolam determinadas partes do algoritmo para que possam ser desen-
      volvidas e testadas em separado.

   O sub-algoritmo ´ definido ap´s as declara¸˜es de vari´veis e antes do
                     e            o            co          a
corpo principal do algoritmo. Assim, a estrutura dos nossos algoritmos pas-
sar´ a ser:
   a

Algoritmo
  { Declara¸oes de vari´veis }
           c~          a
  { Defini¸oes de sub-algoritmos }
          c~
  { corpo do algoritmo }
fim_algoritmo

    Argumentos (ou parˆmetros) s˜o valores enviados ao sub-algoritmo para
                        a         a
serem processados, e/ou recebidos do sub-algoritmo como resultados do pro-
cessamento.
    Um sub-algoritmo pode conter declara¸˜es de vari´veis, mas as vari´veis
                                          co          a                a
declaradas nele (chamadas vari´veis locais do sub-algoritmo) s´ podem ser
                                a                              o
acessadas dentro dele. Al´m de suas vari´veis locais, um sub-algoritmo
                            e                a
pode acessar vari´veis declaradas fora dele, no algoritmo principal (chama-
                  a
das vari´veis globais). Os parˆmetros usados na defini¸ao do sub-algoritmo
        a                     a                         c˜
s˜o chamados parˆmetros formais, e os parˆmetros usados na chamada do
 a                 a                        a
sub-algoritmo s˜o chamados de parˆmetros reais.
                a                   a
    Ex:


                                    35
Algoritmo
  Declare a,b num´rico
                 e

  Sub-rotina y(c,d num´ricos)
                      e
    Declare e,f num´rico
                   e
    { comandos de y }
  fim_sub-rotina

  Sub-rotina z(e num´rico)
                    e
    Declare f num´rico
                 e
    { comandos de z }
  fim_sub-rotina

  y(1,2)
  z(10)
fim_algoritmo

Onde: a, b – vari´veis globais (acessadas pelo algoritmo e pelos dois sub-
                   a
algoritmos);
       e, f – vari´veis locais a y (acessadas apenas pelo sub-algoritmo y);
                  a
       c, d – parˆmetros formais de y (usados na hora da chamada de y)
                  a
declarados como num´ricos;
                       e
       f – variavel local a z (acessada somente pelo sub-algoritmo z, n˜o   a
possuindo qualquer rela¸ao com a outra variavel f (local a y);
                          c˜
       e – parˆmetro formal de z, declarado como num´rico;
               a                                         e
       y(1, 2) – chamada de y com parˆmetros reais 1 e 2 (1 ser´ atribuido a
                                         a                       a
c e 2 ser´ atribuido a d);
         a
       z(10) – chamada de z.
    Existem v´rios tipos de passagem de parˆmetros para sub-algoritmo:
               a                               a

Passagem por valor Envia um valor para o sub-algoritmo e n˜o retorna
                                                                 a
     valores pelo parˆmetro formal (s´ entrada). No momento da chamada
                      a                o
     os valores dos parˆmetros reais s˜o copiados para os parˆmetros formais
                        a             a                      a
     para serem usados dentro do sub-algoritmo sem que se modifiquem os
     valores armazenados nos parˆmetros reais. Ex: PASCAL (padr˜o);
                                  a                                   a

Passagem Copia-restaura Envia e recebe valores do sub-algoritmo (en-
     trada e sa´
               ıda). Na chamada os valores passados s˜o copiados para os
                                                     a
     parˆmetros formais e usados. Ao final (no retorno do sub-algoritmo)
        a

                                     36
os valores finais dos parˆmetros formais s˜o copiados de volta nos
                               a                 a
      parˆmetros reais (´ ´bvio que os parˆmetros reais, neste caso, dever˜o
          a             eo                a                               a
      ser vari´veis);
              a

Passagem por referˆncia Envia e recebe valores do sub-algoritmo (en-
                     e
     trada e sa´
               ıda) usando uma referˆncia ` vari´vel (n˜o faz c´pia; usa o
                                      e     a    a      a      o
     pr´prio parˆmetro real dentro do sub-algoritmo). Ex: PASCAL (VAR).
       o         a
   Nos nossos algoritmos usaremos passagem Copia-restaura e por valor.
Indicaremos o tipo copia-restaura antecedendo a palavra reservada CR aos
parˆmetros deste tipo.
   a
   Existem dois tipos de sub-algoritmos: sub-rotinas (ou procedures) e fun-
¸˜es.
co

9.1    Sub-rotinas
Retornam valores apenas pelos argumentos (caso sejam passados como copia-
restaura).
    Declara¸˜o:
           ca
sub-rotina nome[’(’lista de par^metros formais’)’]
                                  a
  { declara¸oes locais ` sub-rotina }
           c~          a
  { comandos }
fim_sub-rotina
    Observe que podemos definir uma sub-rotina sem parˆmetros formais
                                                          a
(para qual n˜o precisamos passar nenhum parˆmetro na chamada). Observe
             a                                a
tamb´m que ´ poss´
      e        e     ıvel definir um sub-algoritmo dentro de outro (aninha-
mento), pois n˜o faremos nenhuma restri¸ao ao que pode ser declarado den-
                a                        c˜
tro de um sub-algoritmo. Sub-algoritmos declarados dentro de outros s˜o a
locais a estes (desconhecidos fora).
    Ex.: Sub-rotina troca
sub-rotina troca(x,y num´rico)
                        e
  Declare aux num´rico
                 e

  aux:=x
  x:=y
  y:=aux
fim_sub-rotina

                                     37
Esta sub-rotina n˜o funciona. Porque? Resposta: falta definir a passagem
                    a
de parˆmetros Copia-restaura).
      a

sub-rotina troca(CR x,y num´rico)
                           e
  Declare aux num´rico
                 e

  aux:=x
  x:=y
  y:=aux
fim_sub-rotina

Exemplo: Um algoritmo para ordenar 3 valores em ordem crescente.

Algoritmo
  Declare a,b,c : num´rico
                     e

  sub-rotina troca(CR x,y num´rico)
                             e
    Declare aux num´rico
                   e

    aux:=x
    x:=y
    y:=aux
  fim_sub-rotina

  Leia a,b,c
  Se ab
    ent~o troca(a,b)
       a
  fim_se
  Se ac
    ent~o troca(a,c)
       a
  fim_se
  Se bc
    ent~o troca(b,c)
       a
  fim_se
  Escreva a,b,c
fim_algoritmo




                                   38
9.2     Fun¸oes
           c˜
Retornam um valor pelo seu nome (al´m de pelos parˆmetros declarados
                                     e            a
como copia-restaura).
   Ex: ABS(x), TRUNCA(x) (fun¸oes pr´-definidas)
                             c˜     e
   Declara¸˜o:
          ca

fun¸~o tipo nome[’(’lista de par^metros formais’)’]
   ca                                a
  { declara¸oes locais }
           c~
  { comandos }
fim_fun¸~o
       ca

     Observe que devemos declarar o tipo que ser´ retornado pela fun¸˜o.
                                                a                   ca
     Chamada:

a := TRUNCA(3.5)

ou

se SINAL(x)=0 ...

     Retorno do valor usando a palavra reservada Retorna.
     Ex: Fun¸ao fatorial(n):
            c˜

fun¸~o num´rico fatorial(n num´rico)
   ca     e                   e
  Declare fat num´rico
                 e

  fat:=1
  Enquanto n1
    fa¸a
      c
      fat:=fat*n
      n:=n-1
  fim_enquanto
  Retorna fat
fim_fun¸~o
       ca

   Usando sub-algoritmos:
   Ex 3.3: Escrever um algoritmo que leia as medidas dos trˆs lados a, b
                                                             e
e c de um paralelep´
                   ıpedo, calcule e escreva o valor de sua diagonal (veja
Figura 5).


                                     39
dia
  c
                                   d
                                                                        b
                               a
                          Figura 5: Paralelep´
                                             ıpedo

    Ex 3.4: Escrever uma fun¸˜o l´gica que recebe uma vari´vel unidimen-
                                ca o                              a
sional M de num´ricos, o n´mero N de elementos de M , e um valor X e
                   e          u
retorne verdadeiro se X pertence a M ou falso em caso contr´rio.    a
    Como passar uma matriz como parˆmetro real?
                                        a
    Resposta: encontra(m(),n,x num´rico) (n˜o indicar seu tamanho –
                                        e          a
decidido na hora da chamada).
    Ex 3.5: Escrever uma fun¸˜o que calcule a distˆncia entre dois pontos de
                               ca                   a
um plano, sendo fornecidas as coordenadas (x1 , y1 ) e (x2 , y2 ).
    Exerc´ıcio: Escrever um algoritmo que leia 10 conjuntos de valores x1,y1,
x2, y2, x3 e y3 coordenadas de 10 triangulos e calcule a ´rea dos 10 triangulos,
                                                         a
usando a fun¸˜o do exerc´ anterior. Usar duas fun¸oes:
               ca         ıcio                          c˜

  1. A do exerc´ anterior;
               ıcio

  2. Uma que chame a anterior trˆs vezes e use a f´rmula do semi-per´
                                e                 o                 ımetro
     para calcular a ´rea.
                     a

   Ex 3.6: escrever um algoritmo que:

   • Leia v´rios pares de n´meros inteiros positivos, M e P ;
           a               u


                                       40
• calcule e escreva o n´mero de arranjos e combina¸oes de M elementos
                           u                         c˜
     P a P , dado pelas f´rmulas:
                          o
                               M!                    M!
                      AP =
                       M
                                           P
                                          CM =
                             (M − P )!           P (M − P )!

     Se M  P , por defini¸ao:
                         c˜

                                AP = 0 CM = 0
                                 M
                                        P



   Ao final de cada c´lculo de um par ´ perguntado se deseja continuar. A
                       a                e
resposta deve ser ’S’ ou ’N’.
   Exerc. Utilizando as seguintes s´ries, com 20 termos:
                                   e

                                       x2 x3
                        ex = 1 + x +      +    + ···
                                       2!   3!
                   x−1 1           x−1 2            x−1 3
          ln(x) =          + 1/2           + 1/3             + ···
                     x               x                x
   Fa¸a um algoritmo que gere uma tabela de x, ex , e ln(x), para x variando
      c
entre 1 e 100 com intervalos de 0.5 (x = 1, x = 1.5, x = 2, . . . , x = 100).
Defina sub-algoritmos onde for necess´rio.
                                    a
   Solu¸˜o (observe as fun¸˜es aninhadas e seu escopo):
        ca                co

Algoritmo
  Declare x num´rico
               e
  { declara¸oes das fun¸oes }
            c~         c~
  x := 1
  Repita
    Escreva x,’ ’,exp2(x),’ ’,ln2(x)
    x := x+0.5
  at´ x100
    e
fim_algoritmo




                                     41
Fun¸oes:
      c˜
Fun¸~o num´rico exp2(x num´rico)
   ca     e               e
  Declare soma,ind num´rico
                      e

  Fun¸~o num´rico fatorial(n num´rico)
     ca      e                  e
    Declare fat num´rico
                   e
    fat := 1
    Enquanto n1
      fa¸a
        c
        fat := fat*n
        n := n-1
    fim_enquanto
    Retorna fat
  fim_fun¸~o
         ca

  soma := 1
  ind := 1
  Repita
    soma := soma+(x**ind)/fatorial(ind)
    ind := ind+1
  at´ ind19
    e
  Retorna soma
fim_fun¸~o
       ca

Fun¸~o num´rico ln2(x num´rico)
   ca     e              e
  Declare soma,ind num´rico
                      e

  soma := 0
  ind := 1
  Repita
    soma := soma+(((x-1)/x)**ind)/ind
    ind := ind+1
  at´ ind20
    e
  Retorna soma
fim_fun¸~o
       ca

   Observe que o la¸o da fun¸˜o exp2 tem como condi¸ao de parada ind19,
                   c        ca                        c˜
pois ser˜o somados 20 termos e o primeiro ´ 1 e j´ foi somado (soma := 1).
        a                                 e      a

                                   42
Exerc. A partir das seguintes s´ries do sin e cos, e usando fun¸˜es, escreva
                                   e                               co
um algoritmo que gere uma tabela de x, sin(x), cos(x), tan(x), cot(x), sec(x),
e csc(x) para x variando de 0.5 a 1.5 em intervalos de 0.1. Calcule os valores
do sin e do cos com erro m´ximo de 0.0001 (≈ m´dulo do ultimo termo).
                            a                       o         ´

                                      x3 x5 x7
                       sin(x) = x −      +    −    + ···
                                      3!   5!   7!
                                      x2 x4 x6
                       cos(x) = 1 −      +    −    + ···
                                      2!   4!   6!
   Rela¸˜es:
       co
              sin(x)                1                    1                    1
  tan(x) =             cot(x) =             sec(x) =            csc(x) =
              cos(x)              tan(x)               cos(x)              sin(x)
   Solu¸˜o:
       ca

Algoritmo
  Declare x num´rico
               e
  { declara¸oes de fun¸oes }
            c~        c~
  x := 0.5
  Repita
    Escreva x,’ ’,sen(x),’ ’,cos(x),’ ’,sen(x)/cos(x),’ ’,
      cos(x)/sen(x),’ ’,1/cos(x),’ ’,1/sen(x)
    x := x+0.1
  at´ x1.5
    e
fim_algoritmo

   Fun¸oes:
      c˜

Fun¸~o num´rico fatorial(n num´rico)
   ca      e                  e
  Declare fat,cont num´rico
                      e
  cont := 1
  fat := 1
  Repita
    fat := fat*cont
    cont := cont+1
  at´ contn
    e
  Retorna fat
fim_fun¸~o
       ca

                                       43
Fun¸~o num´rico sen(x num´rico)
   ca      e             e
  Declare acum,soma,ind,termo,sinal num´rico
                                       e
  acum := 0
  ind := 1
  sinal := 1
  Enquanto abs(termo)0.0001
    fa¸a
      c
      termo := sinal*(x**ind)/fatorial(ind)
      acum := acum+termo
      sinal := -sinal
      ind := ind+2
  fim_enquanto
  Retorna acum
fim_fun¸~o
       ca

Fun¸~o num´rico cos(x num´rico)
   ca      e             e
  Declare acum,ind,termo,sinal num´rico
                                  e
  acum := 1
  ind := 2
  sinal := -1
  Enquanto abs(termo)0.0001
    fa¸a
      c
      termo := sinal*(x**ind)/fatorial(ind)
      acum := acum+termo
      ind := ind+2
      sinal := -sinal
  fim_enquanto
  Retorna acum
fim_fun¸~o
       ca


10     Recursividade
Uma fun¸ao ´ dita recursiva quando cont´m, em seu corpo, uma chamada a si
         c˜ e                          e
mesma (este tipo de recursividade ´ chamada recursividade direta). S˜o uti-
                                  e                                 a
lizadas quando ´ poss´ decompor o problema a ser resolvido em problemas
               e     ıvel
menores, um dos quais ´ semelhante ao problema inicial.
                       e


                                    44
Ex.: Fatorial.

                    n! = n × (n − 1) × (n − 2) · · · 3 × 2 × 1

   Uma forma recursiva de definir o fatorial ´:
                                            e
      fat(n) = 1                    n=0∨n=1               (Base)
      fat(n) = n × fat(n − 1)       n1                   (Passo recursivo)

   Outro ex.: A soma dos n´meros de 1 a n pode ser definida de forma
                          u
recursiva como:
                     soma(1) = 1
                     soma(n) = n + soma(n − 1)         n1

   A soma dos n´meros ´
               u      ımpares de 1 a n pode ser definida de forma recursiva
por:
       
        somaimp(1) = 1
       
           somaimp(n) = somaimp(n − 1)               n par ∧ n  1
       
       
           somaimp(n) = n + somaimp(n − 2)           n impar ∧ n  2

   Algoritmo da fun¸ao fatorial definida recursivamente:
                   c˜

Fun¸~o num´rico fatorial(n num´rico)
   ca     e                   e
  Se n=0 OU n=1
    ent~o Retorna 1
       a
    sen~o Retorna n*fatorial(n-1)
       a
  fim_se
fim_fun¸~o
       ca

   A execu¸˜o desta fun¸˜o para uma chamada fatorial(3) ´ a mostrada
            ca           ca                                 e
na Figura 6.
   Exerc.: Definir recursivamente a fun¸ao que devolve a soma dos n´meros
                                        c˜                        u
´
ımpares de 1 a n.
   Exerc.: Definir recursivamente a fun¸ao que determina o n-´simo termo
                                         c˜                  e
da s´rie de fibonacci (veja a Tabela 8).
    e




                                       45
fatorial(3)

       
3 ∗ fatorial(2)                         /3×2=6   / 6
                                           8
                                        qqq
                                     qqq
                                  qqq
                              qqq
2 ∗ fatorial(1)         /2×1=2
                          6
                     mmmmm
                mmmmm
            mmm
fatorial(1) = 1


           Figura 6: Execu¸ao de fatorial(3)
                          c˜




                   n   fibonacci(n)
                   0         0
                   1         1
                   2         1
                   3         2
                   4         3
                   5         5
                   6         8
                   .
                   .         .
                             .
                   .         .


             Tabela 8: Tabela do Fibonacci




                          46
Solu¸˜o:
       ca
Fun¸~o num´rico fibonacci(n num´rico)
   ca     e                    e
  Se n=0 OU n=1
    ent~o Retorna n
       a
    sen~o Retorna fibonacci(n-1)+fibonacci(n-2)
       a
  fim_se
fim_fun¸~o
       ca
    Exerc.: Considere uma seq¨ˆncia de n´meros onde cada termo ´ dado pela
                             ue         u                      e
combina¸˜o dos 4 termos anteriores An = An−4 +2×An−3 +3×An−2 +4×An−1
         ca
e os 4 primeiros termos s˜o por defini¸ao:
                         a           c˜
                    A1 = 1 A2 = 2 A3 = 3 A4 = 4
   Escreva uma fun¸˜o recursiva SEQ que receba um n´mero n e retorne o
                  ca                               u
termo An .
   Solu¸˜o:
       ca
Fun¸~o num´rico seq(n num´rico)
   ca     e              e
  Se n=4
    ent~o Retorna n
       a
    sen~o Retorna seq(n-4)+2*seq(n-3)+3*seq(n-2)+4*seq(n-1)
       a
  fim_se
fim_fun¸~o
       ca
  Exerc.: Dois n´meros s˜o amigos entre si, se a soma dos divisores de cada
                  u       a
um deles ´ igual ao outro. Exemplo, 220 e 284:
         e
    Divisores de 220 Divisores de 284
    1                  1
    2                  2
    4                  4
    5                  71
    10                 142
    11                 Soma 220
    20
    22
    44
    55
    110
    Soma 284

                                    47
Fa¸a um algoritmo que leia dois n´meros e verifique se s˜o amigos.
    c                              u                     a
  Solu¸˜o:
      ca
Algoritmo
  Declare a,b num´rico
                 e
  { declara¸ao de fun¸oes }
           c~         c~
  Leia a,b
  Se a=soma(b) E b=soma(a)
    entao Escreva ’S~o amigos’
                    a
    sen~o Escreva ’N~o s~o amigos’
       a            a    a
  fim_se
fim_algoritmo
  Fun¸oes com solu¸ao n˜o recursiva:
     c˜           c˜ a
Fun¸~o num´rico soma(n num´rico)
   ca      e               e
  Declare aux,ind num´rico
                      e
  ind := 1
  aux := 0
  Repita
    Se resto(n,ind)=0
      ent~o aux := aux+ind
         a
    fim_se
    ind := ind+1
  at´ ind=n
    e
  Retorna aux
fim_fun¸~o
       ca
  Solu¸˜o recursiva (chamar soma(n,n-1)):
      ca
Fun¸~o num´rico soma(num,cont num´rico)
   ca      e                      e
  Se cont=1
    ent~o Retorna 1
       a
    sen~o
       a
      Se RESTO(num,cont)=0
         ent~o Retorna cont+soma(num,cont-1)
             a
         sen~o Retorna soma(num,cont-1)
             a
      fim_se
  fim_se
fim_fun¸~o
       ca

                                  48
A            B             C

                         Figura 7: Torre de Hanoi

   Exemplo: Torre de Hanoi (objetivo ´ mover os trˆs discos de A para C,
                                     e            e
movendo um por vez e sem nunca colocar um disco maior sobre um menor;
veja Figura 7).

Mover 3 discos de A para C=
        Mover 2 discos de A para B=
                Mover 1 de A para C
                Mover 1 de A para B
                Mover 1 de C para B
        Mover 1 disco de A para C=
                Mover 1 de A para C
        Mover 2 discos de B para C=
                Mover 1 de B para A
                Mover 1 de B para C
                Mover 1 de A para C

   Solu¸˜o (chamar move(3,1,3,2)):
       ca

Sub-rotina move(num,origem,destino,interm num´rico)
                                             e
  Se num=1
    ent~o Escreva ’move de ’,origem,’ para ’,destino
       a
    sen~o
       a
      move(num-1,origem,interm,destino)
      move(1,origem,destino,interm)
      move(num-1,interm,destino,origem)

                                   49
fim_se
fim_sub-rotina
   Outros problemas interessantes que podem ser resolvidos recursivamente:
O problema do cavalo Mover o cavalo por todas as casas do tabuleiro sem
    ocupar nunca duas vezes a mesma casa come¸ando em qualquer casa;
                                             c

O problema das oito rainhas Colocar oito rainhas em um tabuleiro sem
    que nenhuma ataque a outra.


11     Algoritmos de Ordena¸˜o
                           ca
Os algoritmos de ordena¸˜o (ou classifica¸˜o) permitem ordenar os dados em
                       ca               ca
alguma ordem (crescente ou decrescente). Podem ser aplicados sobre dados
num´ricos ou alfab´ticos (neste caso deve-se associar uma ordem entre os
    e              e
simbolos alfab´ticos).
              e

11.1    BUBLE SORT
´
E um tipo de algoritmo de ordena¸ao por troca com tempo de ordena¸ao
                                c˜                               c˜
                  2
proporcional a O(N ) trocas.

                        10 19 13 12 7 .
                        10 13 12 7 .   19
                        10 12 7 .   13 19
                        10 7 .   12 13 19
                        7 .   10 12 13 19

11.2        ¸˜
        SELECAO DIRETA
´
E um tipo de algoritmo de ordena¸ao por sele¸˜o com tempo de ordena¸˜o
                                c˜          ca                     ca
                   2
proporcional a O(N ) compara¸˜es.
                             co

                        .   10   19    13 12 7
                        7   .    19    13 12 10
                        7   10   .     13 12 19
                        7   10   12    .  13 19
                        7   10   12    13 .  19

                                      50
Implementa¸ao:
             c˜

Sub-rotina selec(vet(),inic,fim num´rico)
                                   e
  Declare elem,pos num´rico
                       e
  Se inicfim
    ent~o
       a
      pos := menor(vet,inic,fim)
      elem := vet(pos)
      vet(pos) := vet(inic)
      vet(inic) := elem
      selec(vet,inic+1,fim)
  fim_se
fim_sub-rotina

e menor ´ uma fun¸˜o que encontra o menor elemento e devolve seu ´
        e          ca                                                ındice
na matriz.
   Exerc´ıcio: Reescrever esta sub-rotina usando listas. Escrever tamb´m a
                                                                      e
fun¸ao menor para este caso.
   c˜
   Exerc´ıcio: Implementar o Buble Sort.

11.3    QUICK SORT
´
E um tipo de algoritmo de ordena¸ao por troca e parti¸˜o com tempo de or-
                                  c˜                  ca
dena¸ao proporcional a O(n log2 n). Baseia-se no princ´ que ´ mais r´pido
     c˜                                               ıpio    e      a
ordenar dois vetores de n/2 elementos do que um vetor com n elementos.
   Baseia-se em um algoritmo que particiona o vetor em dois, o primeiro
dos valores menores e um segundo dos valores maiores que um elemento de
compara¸ao. O elemento de compara¸ao ´, normalmente, o primeiro ele-
         c˜                            c˜ e
mento do vetor. Depois o algoritmo ´ repetido para as duas partes, obtendo
                                     e
a ordena¸ao completa.
         c˜
   O particionador come¸a em ambas as extremidades do vetor efetuando
                          c
trocas para colocar os elementos menores e maiores que o de compara¸ao em
                                                                    c˜
seus lugares.
   Exemplo de particionamento:




                                    51
60 83     25 98 94 36        99   73   45   15   22   10
         10                                                    60
            60                                                 83
            22                                            60
                      60                                  98
                      15                             60
                           60                        94
                           45                   60
                                   60           99
         10 22 25     15 45     36 60 73        99 94     98   83
  Algoritmo:

Sub-rotina quick(CR x lista)
  Declare elem num´rico
                  e
  Declare x1,x2 lista

  { fun¸ao concat }
       c~
  { sub-rotina partic }

  Se TAM(x)1
    partic(x,x1,elem,x2)
    quick(x1)
    quick(x2)
    x := concat(x1,CONS(elem,x2))
  fim_se
fim_sub-rotina

  Fun¸ao concat:
     c˜

Fun¸~o concat(x1,x2 lista) lista
   ca
  Se NIL(x1)
    ent~o
       a
      Retorna x2
    sen~o
       a
      Retorna CONS(CAR(x1),concat(CDR(x1),x2))
  fim_se
fim_fun¸~o
       ca



                                 52
Fun¸oes auxiliares de partic:
     c˜

Fun¸~o adiciona_final(l lista, e num´rico) lista
   ca                               e
  Se NIL(l)
    ent~o
       a
      Retorna CONS(e,nil)
    sen~o
       a
      Retorna CONS(CAR(l),adicional_final(CDR(l),e))
fim_fun¸~o
       ca

Fun¸~o retira_ultimo(l lista) lista
   ca
  Se NIL(CDR(l))
    ent~o
       a
      Retorna nil
    sen~o
       a
      Retorna CONS(CAR(l),retira_ultimo(CDR(l)))
  fim_se
fim_fun¸~o
       ca

  Particionador:




                                  53
sub-rotina partic(x lista, CR x1 lista, CR elem num´rico,
                                                   e
                     CR x2 lista)
  Declare esq l´gico
               o

  { fun¸oes auxiliares }
       c~

  elem := x(0)
  x := CDR(x)
  esq := verdadeiro
  x1 := nil
  x2 := nil
  Enquanto N~o NIL(x)
             a
    fa¸a
      c
      Se esq
         ent~o
            a
           Se elemx(TAM(x)-1)
             ent~o
                a
               x1 := concat(x1,CONS(x(TAM(x)-1),nil))
               x := retira_ultimo(x)
               esq := falso
             sen~o
                a
               x2 := CONS(x(TAM(x)-1),x2)
               x := retira_ultimo(x)
           fim_se
         sen~o
            a
           Se elemx(0)
             ent~o
                a
               x2 := CONS(x(0),x2)
               x := CDR(x)
               esq := verdadeiro
             sen~o
                a
               x1 := adiciona_final(x1,x(0))
               x := CDR(x)
           fim_se
      fim_se
  fim_enquanto
fim_sub-rotina


                               54
12       Programa¸˜o Funcional
                 ca
Com os recursos de manipula¸ao de listas que j´ temos em nossa linguagem e
                             c˜               a
com alguns outros recursos podemos implementar programa¸˜o funcional em
                                                          ca
nossa linguagem. Programa¸ao funcional ´ um paradigma de programa¸ao
                            c˜            e                            c˜
em que as principais entidades s˜o fun¸˜es e listas. Programa¸ao funcio-
                                  a    co                       c˜
nal se baseia na avalia¸ao de express˜es simb´licas. Este paradigma est´
                       c˜            o         o                         a
plenamente representado na linguagem de programa¸˜o LISP.
                                                   ca
   Algumas caracter´ısticas de programa¸ao funcional pura:
                                        c˜
   • N˜o existe declara¸ao de tipos. Todos os dados s˜o dinˆmicos e a
       a               c˜                            a     a
     linguagem efetua convers˜es de tipo impl´
                             o               ıcitas;

   • Homogeneidade das estruturas;

   • N˜o h´ la¸os de repeti¸ao, apenas recursividade;
      a a c                c˜

   • Baseado em nota¸˜o-λ (fun¸oes-λ).
                    ca        c˜
   A estrutura b´sica de programa¸ao funcional ´ o ´tomo que pode ser
                 a                 c˜             e a
num´rico ou literal (embora n˜o precise ser declarado como tal). Um par
    e                         a
de elementos com lado esquerdo (CAR) e lado direito (CDR) ´ chamado
                                                              e
express˜o-S. A fun¸ao CONS serve para construir express˜es-S.
       a          c˜                                   o

12.1     Declara¸˜o de Fun¸˜es Lambda
                ca        co
Para declarar uma fun¸ao lambda:
                     c˜
Fun¸~o lambda nome’(’lista de par^metros’)’ ’(’ {defini¸ao} ’)’
   ca                               a                      c~
   Ex:
Fun¸~o lambda cuder(x)(CDR(x))
   ca
   Observe que n˜o ´ necess´rio declarar nenhum tipo de dado.
                a e        a

12.2     Estruturas de Programa¸˜o Funcional
                               ca
Substituindo a estrutura “Se-ent˜o-sen˜o” tradicional, existe uma fun¸˜o
                                a     a                              ca
COND, que recebe trˆs argumentos:
                   e
COND(condi¸~o,fun¸ao 1,fun¸~o 2)
           ca       c~         ca

                                   55
Algoritmos: Conceitos Básicos e Estruturas
Algoritmos: Conceitos Básicos e Estruturas
Algoritmos: Conceitos Básicos e Estruturas
Algoritmos: Conceitos Básicos e Estruturas
Algoritmos: Conceitos Básicos e Estruturas

Weitere ähnliche Inhalte

Was ist angesagt?

Estudo de Séries Temporais do Mercado Financeiro - Murilo Antunes Braga
Estudo de Séries Temporais do Mercado Financeiro - Murilo Antunes BragaEstudo de Séries Temporais do Mercado Financeiro - Murilo Antunes Braga
Estudo de Séries Temporais do Mercado Financeiro - Murilo Antunes Bragamurilobraga
 
Limites modelo normal_2016
Limites modelo normal_2016Limites modelo normal_2016
Limites modelo normal_2016JacintoDala2
 
História da criptografia
História da criptografiaHistória da criptografia
História da criptografiatiojoffre
 
Livro de ..calculo 3
Livro de ..calculo 3Livro de ..calculo 3
Livro de ..calculo 3Ana Chavier
 
Algoritmos jabour
Algoritmos jabourAlgoritmos jabour
Algoritmos jabourfjabour
 
Dissertação Mestrado
Dissertação MestradoDissertação Mestrado
Dissertação MestradoJoel Carvalho
 
2013 artur bontempolima
2013 artur bontempolima2013 artur bontempolima
2013 artur bontempolimaJosh Santos
 
K19 k01-logica-de-programacao-em-java
K19 k01-logica-de-programacao-em-javaK19 k01-logica-de-programacao-em-java
K19 k01-logica-de-programacao-em-javaAndré Bellarmino
 

Was ist angesagt? (16)

Estrutura de dados 2
Estrutura de dados 2Estrutura de dados 2
Estrutura de dados 2
 
Estudo de Séries Temporais do Mercado Financeiro - Murilo Antunes Braga
Estudo de Séries Temporais do Mercado Financeiro - Murilo Antunes BragaEstudo de Séries Temporais do Mercado Financeiro - Murilo Antunes Braga
Estudo de Séries Temporais do Mercado Financeiro - Murilo Antunes Braga
 
Curso estatistica descritiva no r
Curso   estatistica descritiva no rCurso   estatistica descritiva no r
Curso estatistica descritiva no r
 
Curso de simulink 2 0
Curso de simulink 2 0Curso de simulink 2 0
Curso de simulink 2 0
 
Guiao aluno pic
Guiao aluno picGuiao aluno pic
Guiao aluno pic
 
Php
PhpPhp
Php
 
Limites modelo normal_2016
Limites modelo normal_2016Limites modelo normal_2016
Limites modelo normal_2016
 
Pascal
PascalPascal
Pascal
 
História da criptografia
História da criptografiaHistória da criptografia
História da criptografia
 
Livro de ..calculo 3
Livro de ..calculo 3Livro de ..calculo 3
Livro de ..calculo 3
 
Apostila winplot
Apostila winplotApostila winplot
Apostila winplot
 
Algoritmos jabour
Algoritmos jabourAlgoritmos jabour
Algoritmos jabour
 
Dissertação Mestrado
Dissertação MestradoDissertação Mestrado
Dissertação Mestrado
 
Ap ami v8
Ap ami v8Ap ami v8
Ap ami v8
 
2013 artur bontempolima
2013 artur bontempolima2013 artur bontempolima
2013 artur bontempolima
 
K19 k01-logica-de-programacao-em-java
K19 k01-logica-de-programacao-em-javaK19 k01-logica-de-programacao-em-java
K19 k01-logica-de-programacao-em-java
 

Ähnlich wie Algoritmos: Conceitos Básicos e Estruturas

F ferrari ccechinel-introducao-a-algoritmos
F ferrari ccechinel-introducao-a-algoritmosF ferrari ccechinel-introducao-a-algoritmos
F ferrari ccechinel-introducao-a-algoritmosRicardo Borges
 
F ferrari ccechinel-introducao-a-algoritmos
F ferrari ccechinel-introducao-a-algoritmosF ferrari ccechinel-introducao-a-algoritmos
F ferrari ccechinel-introducao-a-algoritmospaula maria
 
F ferrari ccechinel-introducao-a-algoritmos
F ferrari ccechinel-introducao-a-algoritmosF ferrari ccechinel-introducao-a-algoritmos
F ferrari ccechinel-introducao-a-algoritmososmarpx
 
Conceitos básicos de Software R
Conceitos básicos de Software RConceitos básicos de Software R
Conceitos básicos de Software RThais Amaral
 
PSI2594 - Projeto de Formatura - Escola Politecnica da Usp - LabTeX : Interfa...
PSI2594 - Projeto de Formatura - Escola Politecnica da Usp - LabTeX : Interfa...PSI2594 - Projeto de Formatura - Escola Politecnica da Usp - LabTeX : Interfa...
PSI2594 - Projeto de Formatura - Escola Politecnica da Usp - LabTeX : Interfa...Fernando José Capeletto Neto
 
Apostila c# iniciantes
Apostila c# iniciantesApostila c# iniciantes
Apostila c# iniciantesCaique Moretto
 
Fortran_95_curso_basico_Editora_XXX.pdf
Fortran_95_curso_basico_Editora_XXX.pdfFortran_95_curso_basico_Editora_XXX.pdf
Fortran_95_curso_basico_Editora_XXX.pdfMarcosSilva130534
 
Apostila sobre Controle Digital
Apostila sobre Controle DigitalApostila sobre Controle Digital
Apostila sobre Controle DigitalFernando Passold
 
Klavaro manual-pt-1.0.8
Klavaro manual-pt-1.0.8Klavaro manual-pt-1.0.8
Klavaro manual-pt-1.0.8vixblu
 
Apostila de Java: Orientação a Objetos
Apostila de Java: Orientação a ObjetosApostila de Java: Orientação a Objetos
Apostila de Java: Orientação a ObjetosK19 Treinamentos
 
Handbook de ti_para_concursos
Handbook de ti_para_concursosHandbook de ti_para_concursos
Handbook de ti_para_concursosfernandao777
 
Handbook de ti para concursos – o guia definitivo
Handbook de ti para concursos – o guia definitivoHandbook de ti para concursos – o guia definitivo
Handbook de ti para concursos – o guia definitivoAri Filho
 
Redes de Petri
Redes de PetriRedes de Petri
Redes de Petriuern
 
Programacao Orientada A Objetos (Java)
Programacao Orientada A Objetos (Java)Programacao Orientada A Objetos (Java)
Programacao Orientada A Objetos (Java)Robson Silva Espig
 

Ähnlich wie Algoritmos: Conceitos Básicos e Estruturas (20)

Scilab programacao
Scilab programacaoScilab programacao
Scilab programacao
 
F ferrari ccechinel-introducao-a-algoritmos
F ferrari ccechinel-introducao-a-algoritmosF ferrari ccechinel-introducao-a-algoritmos
F ferrari ccechinel-introducao-a-algoritmos
 
F ferrari ccechinel-introducao-a-algoritmos
F ferrari ccechinel-introducao-a-algoritmosF ferrari ccechinel-introducao-a-algoritmos
F ferrari ccechinel-introducao-a-algoritmos
 
F ferrari ccechinel-introducao-a-algoritmos
F ferrari ccechinel-introducao-a-algoritmosF ferrari ccechinel-introducao-a-algoritmos
F ferrari ccechinel-introducao-a-algoritmos
 
F ferrari ccechinel-introducao-a-algoritmos
F ferrari ccechinel-introducao-a-algoritmosF ferrari ccechinel-introducao-a-algoritmos
F ferrari ccechinel-introducao-a-algoritmos
 
Conceitos básicos de Software R
Conceitos básicos de Software RConceitos básicos de Software R
Conceitos básicos de Software R
 
Principio de Ánalise
Principio de Ánalise Principio de Ánalise
Principio de Ánalise
 
PSI2594 - Projeto de Formatura - Escola Politecnica da Usp - LabTeX : Interfa...
PSI2594 - Projeto de Formatura - Escola Politecnica da Usp - LabTeX : Interfa...PSI2594 - Projeto de Formatura - Escola Politecnica da Usp - LabTeX : Interfa...
PSI2594 - Projeto de Formatura - Escola Politecnica da Usp - LabTeX : Interfa...
 
Poojava
PoojavaPoojava
Poojava
 
Poojava
PoojavaPoojava
Poojava
 
Apostila c# iniciantes
Apostila c# iniciantesApostila c# iniciantes
Apostila c# iniciantes
 
Fortran_95_curso_basico_Editora_XXX.pdf
Fortran_95_curso_basico_Editora_XXX.pdfFortran_95_curso_basico_Editora_XXX.pdf
Fortran_95_curso_basico_Editora_XXX.pdf
 
Apostila sobre Controle Digital
Apostila sobre Controle DigitalApostila sobre Controle Digital
Apostila sobre Controle Digital
 
Klavaro manual-pt-1.0.8
Klavaro manual-pt-1.0.8Klavaro manual-pt-1.0.8
Klavaro manual-pt-1.0.8
 
Apostila de Java: Orientação a Objetos
Apostila de Java: Orientação a ObjetosApostila de Java: Orientação a Objetos
Apostila de Java: Orientação a Objetos
 
Handbook de ti_para_concursos
Handbook de ti_para_concursosHandbook de ti_para_concursos
Handbook de ti_para_concursos
 
Handbook de ti para concursos – o guia definitivo
Handbook de ti para concursos – o guia definitivoHandbook de ti para concursos – o guia definitivo
Handbook de ti para concursos – o guia definitivo
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dados
 
Redes de Petri
Redes de PetriRedes de Petri
Redes de Petri
 
Programacao Orientada A Objetos (Java)
Programacao Orientada A Objetos (Java)Programacao Orientada A Objetos (Java)
Programacao Orientada A Objetos (Java)
 

Mehr von Carlos Campani

Técnicas de integração
Técnicas de integraçãoTécnicas de integração
Técnicas de integraçãoCarlos Campani
 
Lista de exercícios 3
Lista de exercícios 3Lista de exercícios 3
Lista de exercícios 3Carlos Campani
 
Lista de exercícios 2
Lista de exercícios 2Lista de exercícios 2
Lista de exercícios 2Carlos Campani
 
Aplicações da integração
Aplicações da integraçãoAplicações da integração
Aplicações da integraçãoCarlos Campani
 
Lista de exercícios 1
Lista de exercícios 1Lista de exercícios 1
Lista de exercícios 1Carlos Campani
 
ANÁLISE COMPLETA DE UMA FUNÇÃO
ANÁLISE COMPLETA DE UMA FUNÇÃOANÁLISE COMPLETA DE UMA FUNÇÃO
ANÁLISE COMPLETA DE UMA FUNÇÃOCarlos Campani
 
PROPRIEDADES DAS FUNÇÕES
PROPRIEDADES DAS FUNÇÕESPROPRIEDADES DAS FUNÇÕES
PROPRIEDADES DAS FUNÇÕESCarlos Campani
 
Funções, suas propriedades e gráfico
Funções, suas propriedades e gráficoFunções, suas propriedades e gráfico
Funções, suas propriedades e gráficoCarlos Campani
 
Solução de equações modulares
Solução de equações modularesSolução de equações modulares
Solução de equações modularesCarlos Campani
 
Equações polinomiais
Equações polinomiaisEquações polinomiais
Equações polinomiaisCarlos Campani
 
Instruções de Aprendiz
Instruções de AprendizInstruções de Aprendiz
Instruções de AprendizCarlos Campani
 
Álgebra básica, potenciação, notação científica, radiciação, polinômios, fato...
Álgebra básica, potenciação, notação científica, radiciação, polinômios, fato...Álgebra básica, potenciação, notação científica, radiciação, polinômios, fato...
Álgebra básica, potenciação, notação científica, radiciação, polinômios, fato...Carlos Campani
 

Mehr von Carlos Campani (20)

Técnicas de integração
Técnicas de integraçãoTécnicas de integração
Técnicas de integração
 
Lista de exercícios 3
Lista de exercícios 3Lista de exercícios 3
Lista de exercícios 3
 
Lista de exercícios 2
Lista de exercícios 2Lista de exercícios 2
Lista de exercícios 2
 
Aplicações da integração
Aplicações da integraçãoAplicações da integração
Aplicações da integração
 
Lista de exercícios 1
Lista de exercícios 1Lista de exercícios 1
Lista de exercícios 1
 
Integral
IntegralIntegral
Integral
 
Semana 14
Semana 14 Semana 14
Semana 14
 
Semana 13
Semana 13 Semana 13
Semana 13
 
Semana 12
Semana 12Semana 12
Semana 12
 
Semana 11
Semana 11Semana 11
Semana 11
 
Semana 10
Semana 10 Semana 10
Semana 10
 
Semana 9
Semana 9 Semana 9
Semana 9
 
ANÁLISE COMPLETA DE UMA FUNÇÃO
ANÁLISE COMPLETA DE UMA FUNÇÃOANÁLISE COMPLETA DE UMA FUNÇÃO
ANÁLISE COMPLETA DE UMA FUNÇÃO
 
PROPRIEDADES DAS FUNÇÕES
PROPRIEDADES DAS FUNÇÕESPROPRIEDADES DAS FUNÇÕES
PROPRIEDADES DAS FUNÇÕES
 
Funções, suas propriedades e gráfico
Funções, suas propriedades e gráficoFunções, suas propriedades e gráfico
Funções, suas propriedades e gráfico
 
Solução de equações modulares
Solução de equações modularesSolução de equações modulares
Solução de equações modulares
 
Equações polinomiais
Equações polinomiaisEquações polinomiais
Equações polinomiais
 
PROVAS DE TEOREMAS
PROVAS DE TEOREMASPROVAS DE TEOREMAS
PROVAS DE TEOREMAS
 
Instruções de Aprendiz
Instruções de AprendizInstruções de Aprendiz
Instruções de Aprendiz
 
Álgebra básica, potenciação, notação científica, radiciação, polinômios, fato...
Álgebra básica, potenciação, notação científica, radiciação, polinômios, fato...Álgebra básica, potenciação, notação científica, radiciação, polinômios, fato...
Álgebra básica, potenciação, notação científica, radiciação, polinômios, fato...
 

Algoritmos: Conceitos Básicos e Estruturas

  • 1. Algoritmos Carlos A. P. Campani 6 de setembro de 2006 Sum´rio a 1 Introdu¸˜o ca 2 2 Conceitos B´sicos a 3 2.1 Comando de Escrita . . . . . . . . . . . . . . . . . . . . . . . 4 2.2 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.3 Vari´veis . . . . . . . . a . . . . . . . . . . . . . . . . . . . . . . 6 2.4 Atribui¸ao . . . . . . . c˜ . . . . . . . . . . . . . . . . . . . . . . 7 2.5 Comando de Leitura . . . . . . . . . . . . . . . . . . . . . . . 8 2.6 Express˜es Aritm´ticas o e . . . . . . . . . . . . . . . . . . . . . . 10 2.7 Express˜es L´gicas . . o o . . . . . . . . . . . . . . . . . . . . . . 13 3 Estrutura Condicional 14 4 Estrutura de Repeti¸˜o ca 16 5 Algoritmos com Acumulador 19 6 Refinamentos Sucessivos 21 7 Usando Matrizes 24 7.1 Declara¸ao de Matrizes . . . . . . . . . . . . . . . . . . . . . . 25 c˜ 7.2 Tratando com Matrizes . . . . . . . . . . . . . . . . . . . . . . 26 1
  • 2. 8 Usando Listas 29 8.1 Constantes Lista . . . . . . . . . . . . . . . . . . . . . . . . . 30 8.2 Opera¸˜es com Listas . . . . co . . . . . . . . . . . . . . . . . . . 30 8.3 Declara¸ao de Vari´vel Lista c˜ a . . . . . . . . . . . . . . . . . . . 30 8.4 Tratando Listas . . . . . . . . . . . . . . . . . . . . . . . . . . 32 9 Sub-algoritmos 35 9.1 Sub-rotinas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 9.2 Fun¸˜es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 co 10 Recursividade 44 11 Algoritmos de Ordena¸˜o ca 50 11.1 BUBLE SORT . . . . . . . . . . . . . . . . . . . . . . . . . . 50 ¸˜ 11.2 SELECAO DIRETA . . . . . . . . . . . . . . . . . . . . . . . 50 11.3 QUICK SORT . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 12 Programa¸˜o Funcional ca 55 12.1 Declara¸˜o de Fun¸oes Lambda . . . . . . . . . . . . . . . . . 55 ca c˜ 12.2 Estruturas de Programa¸˜o Funcional . . . . . . . . . . . . . . 55 ca 12.3 Escrevendo Fun¸oes . . . . . . . . . . . . . . . . . . . . . . . . 56 c˜ Bibliografia • FARRER, H. et alii. Algoritmos Estruturados. Rio de Janeiro, Editora Guanabara, 1989; • WIRTH, N. Programa¸˜o Sistem´tica. Rio de Janeiro, Ed. Campus, ca a 1978. 1 Introdu¸˜o ca Algoritmos s˜o ferramentas importantes no estudo de ciˆncia da computa¸˜o. a e ca A compreens˜o das t´cnicas de desenvolvimento e constru¸ao de algoritmos a e c˜ ´ uma ferramenta valiosa, n˜o s´ para o aprendizado de linguagens de pro- e a o grama¸ao, mas para o estudo das mais variadas disciplinas da ´rea. Um c˜ a exemplo poderia ser dado se lembrarmos que boa parte da teoria matem´tica a 2
  • 3. da computa¸˜o baseia-se no conceito de “algoritmo”, como uma id´ia primi- ca e tiva. Nesta disciplina, desenvolveremos os algoritmos usando uma linguagem hipot´tica, cuja estrutura e funcionamento ser˜o descritos ao longo do desen- e a volvimento da disciplina. A linguagem adotada aqui foi projetada para que fosse f´cil a implementa¸ao dos exemplos apresentados em uma linguagem de a c˜ programa¸ao usual, particularmente visando Python como linguagem alvo. c˜ 2 Conceitos B´sicos a Algoritmo ´ a descri¸˜o de um conjunto de comandos que, efetuados, resul- e ca tam numa sucess˜o finita de a¸˜es. Uma outra forma: Algoritmo ´ uma a co e lista de instru¸oes (comandos) ordenadas que tem por finalidade resolver c˜ um determinado problema. Exemplos de algoritmos: Uma receita culin´ria; a Instru¸oes para montar algo. c˜ Ex. Algoritmo para fritar um ovo: 1. Colocar um ovo na frigideira; 2. Esperar o ovo ficar frito; 3. Tirar o ovo. O algoritmo acima n˜o est´ detalhado. Uma vers˜o mais aceit´vel ´: a a a a e 1. Retirar um ovo da geladeira; 2. Colocar a frigideira no fogo; 3. Colocar ´leo; o 4. Esperar at´ o ´leo ficar quente; e o 5. Quebrar o ovo separando a casca; 6. Colocar o conte´do na frigideira; u 7. Esperar um minuto; 8. Retirar o ovo da frigideira; 9. Apagar o fogo. 3
  • 4. Esta vers˜o ´ mais completa e detalhada que a anterior. Para que um a e algoritmo possa ser executado ´ necess´rio que seu usu´rio conhe¸a a termi- e a a c nologia nele utilizada. No exemplo anterior, para que o algoritmo seja util, ´ ´ necess´rio que o usu´rio conhe¸a o significado dos verbos Retirar, Colocar, e a a c Esperar assim como dos substantivos utilizados. Os algoritmos estudados em aula ser˜o algoritmos computacionais, listas a de comandos a serem executados por um computador. Para que o computa- dor consiga executa-los ele tambem deve conhecer a terminologia utilizada. Ao conjunto de comandos que fazem parte de uma linguagem de programa¸˜o ca chama-se sintaxe da linguagem de programa¸˜o.ca Os algoritmos estudados na disciplina de Algoritmos ser˜o desenvolvidos a utilizando uma sintaxe que ser´ apresentada progressivamente ao longo do a semestre. Esta sintaxe pode ser chamada de portuguˆs estruturado e os e algoritmos nela desenvolvidos podem ser facilmente adapt´veis as diversas a linguagens de programa¸˜o existentes. ca A forma geral dos algoritmos a ser adotada em aula ´:e Algoritmo { lista-de-comandos } fim_algoritmo onde { lista-de-comandos } ´ uma lista com um ou mais comandos. Note e a endenta¸ao dos comandos dentro do ambiente Algoritmo-fim_algoritmo. c˜ Vamos imaginar uma m´quina virtual que executa os comandos de nossos a algoritmos, lendo os dados de uma entrada fict´ ıcia, e imprimindo os resulta- dos em uma tela virtual. Embora esta m´quina n˜o exista no mundo real, a a com ela poderemos mentalmente executar os nossos algoritmos. Com relati- vamente pouca dificuldade ´ poss´ traduzir os algoritmos de sala de aula e ıvel para uma linguagem de programa¸˜o real. ca 2.1 Comando de Escrita O comando de escrita ´ utilizado quando se deseja que o algoritmo escreva e algo. Esta “escrita” pode ser em uma impressora, um terminal de v´ıdeo ou outra sa´ qualquer. O formato do comando ´: ıda e Escreva { lista-de-express~es } o 4
  • 5. onde { lista-de-express~es } ´ uma lista de uma ou mais express˜es e o e o uma express˜o pode ser uma constante, uma express˜o aritm´tica, vari´vel a a e a ou chamada de fun¸ao. c˜ Ex: (dica: use endenta¸ao) c˜ Algoritmo Escreva ’Jo~o Vitor’,’ ’,’Luana’ a Escreva ’1’ Escreva 1 + 2 fim_algoritmo Ao ser executado este algoritmo o resultado ser´: a Jo~o Vitor Luana a 1 3 O exemplo ´ composto de trˆs comandos de escrita. Observe que podemos e e colocar mais de um comando por linha (op¸ao n˜o muito interessante pois c˜ a esconde a estrutura do algoritmo e confunde a sua leitura). O primeiro comando manda escrever uma lista de trˆs constantes, no e segundo deve escrever uma constante e no terceiro deve escrever o resultado de uma express˜o aritm´tica. Quando um comando de escrita tiver mais de a e um valor a ser escrito como no primeiro, os diversos valores s˜o separados a por v´ırgula. Observe que ’Jo~o Vitor’ ´ um literal, ou seja, tudo que estiver entre a e dois ’ ser´ impresso exatamente da forma com que est´ escrito. A utilidade a a do ’ ’ ´ efetuar a separa¸ao entre os diversos termos a serem impressos j´ e c˜ a que o comando Escreva imprime os termos sem espa¸os entre eles. c Ex2: Algoritmo Escreva ’Jo~o Vitor’,’Luana’ a Escreva 1+2 Escreva ’1+2’ fim_algoritmo Produzindo: Jo~o VitorLuana a 3 1+2 5
  • 6. Observe o efeito da ausˆncia de ’ ’ entre ’Jo~o Vitor’ e ’Luana’. e a Os comandos como Algoritmo e fim_algoritmo s˜o chamados palavras a reservadas da linguagem. A linguagem trata mai´sculas e min´sculas como u u iguais. 2.2 Constantes Uma constante ´ um valor que n˜o se modifica com o tempo. As constan- e a tes com que trabalharemos podem ser de trˆs tipos diferentes, num´ricas, e e l´gicas ou literais. Constantes num´ricas podem conter quaisquer valores o e num´ricos, reais ou inteiros, positivos ou negativos, etc. Exemplos de cons- e tantes num´ricas s˜o: e a 25 3.14 -2.57 -0.0003 -10 Constantes literais podem conter um ou mais caracteres alfab´ticos ou e num´ricos. S˜o delimitados por aspas. Exemplos de constantes literais s˜o: e a a ’Jose da Silva’ ’1245’ ’1 2 3 de oliveira’ Constantes l´gicas podem conter somente dois valores, verdadeiro e o falso. Normalmente s˜o utilizadas em testes em algoritmos. a 2.3 Vari´veis a Uma vari´vel ´ um valor que pode ser alterado em um algoritmo. Cada a e vari´vel tem um nome associado a ela que a identifica. O identificador de a uma vari´vel deve come¸ar por uma letra e pode conter letras ou d´ a c ıgitos. Ex: A X5 Joao 6
  • 7. Assim como as constantes as vari´veis tamb´m podem ser de trˆs tipos: a e e num´ricas, l´gicas ou literais. e o Para utilizar uma vari´vel em um algoritmo ´ necess´rio que ela seja a e a declarada no in´ ıcio do algoritmo, ou seja, defina-se no in´ ıcio do algoritmo qual o tipo de valor com que a vari´vel ir´ trabalhar ( num´rico, l´gico ou a a e o literal ). O formato do comando de declara¸˜o ´: ca e Declare <lista de identificadores> <tipo das vari´veis> a Ex: Declare Nota,Codigo,X5 Num´rico e Declare Teste,Sim L´gico o Declare Nome,End1,End2 Literal Assim, a forma geral de um algoritmo passa a ser: Algoritmo { declara¸oes } c~ { corpo do algoritmo } fim_algoritmo 2.4 Atribui¸˜o ca Uma vari´vel pode armazenar qualquer valor e seu valor pode ser alterado a a qualquer momento no algoritmo. O comando utilizado para alterar o valor de uma vari´vel ´ o comando de atribui¸˜o. Sua forma geral ´ a seguinte: a e ca e <identificador de vari´vel> := <express~o> a a onde <express~o> pode ser uma constante, express˜o aritm´tica, vari´vel a a e a ou chamada de fun¸ao. Por exemplo: c˜ A := 5 O comando acima (lˆ-se “A recebe cinco”) faz com que a vari´vel A passe e a a valer 5. O valor anterior da vari´vel A ´ perdido e seu novo valor passa a a e ser 5. Assim, por exemplo: {A=10} A := 5 {A=5} 7
  • 8. E fica perdido o valor anterior da vari´vel (10). a Ent˜o, como trocar dois valores? Resposta: Usando uma vari´vel auxiliar. a a Ex: trocar os valores de a e b. aux := a a := b b:= aux Outros exemplos de atribui¸˜o s˜o: ca a A := 3 + 2 A := B X5 := A + 1 No primeiro exemplo a vari´vel A recebe o resultado da express˜o aritm´tica a a e 3 + 2, express˜o esta que cont´m somente constantes. No segundo exemplo a a e vari´vel A recebe o conte´do da vari´vel B e no terceiro exemplo a vari´vel X5 a u a a recebe o resultado da express˜o aritm´tica A + 1, express˜o esta que cont´m a e a e a vari´vel A e a constante 1. a Um exemplo interessante: {A=10} A := A+1 {A=11} Ou seja, a express˜o A+1 ´ avaliada, tendo como resultado 10 + 1 = 11 e o a e valor ´ atribuido ` vari´vel A. e a a 2.5 Comando de Leitura O comando de leitura ´ utilizado quando o algoritmo deve receber um valor e externo, por exemplo, de um teclado. Seu formato geral ´: e Leia <lista-de-vari´veis> a Este comando faz com que a primeira vari´vel da lista receba o primeiro a valor digitado no teclado, a segunda vari´vel receba o segundo valor e assim a por diante. Ex: Leia A,B 8
  • 9. Ao executar este comando o computador espera que sejam fornecidos dois valores na entrada virtual ( p.ex: 10 e 20 ). A vari´vel A receber´ ent˜o o a a a primeiro valor (10) e a vari´vel B receber´ o segundo valor (20). a a Ex 2.8 - Escrever um algoritmo que lˆ trˆs n´meros, calcula as m´dias e e u e aritm´tica, harmˆnica e geom´trica e escreve os n´meros lidos e as m´dias e o e u e calculadas. A+B+C √ 3 3 MA = MG = A×B×C MH = 1 1 1 3 A + B + C Ex 2.9 - Escrever um algoritmo que lˆ o nome de um funcion´rio, o e a n´mero do funcion´rio, seu n´mero de horas trabalhadas, o valor que recebe u a u por hora, o n´mero de filhos com idade menor que 14 anos e calcula o sal´rio u a deste funcion´rio. a Ex 2.10 - Escrever um algoritmo que calcula o fatorial de 5. Ex 2.11 - Escrever um algoritmo que lˆ trˆs valores, a, b e c e calcula: e e 1. A ´rea do triˆngulo que tem a por base e b por altura; a a 2. A ´rea do c´ a ırculo de raio c; 3. A ´rea do trap´zio que tem a e b por bases e c por altura; a e 4. A ´rea do quadrado de lado b; a 5. A ´rea do retˆngulo de lados a e b; a a 6. A ´rea da superf´ de um cubo que tem c por aresta. a ıcie Ex 2.12 - Escrever um algoritmo que escreve os n´meros ´ u ımpares entre 10 e 20. Ex 2.13 - Escrever um algoritmo que lˆ p, u e r, respectivamente o primeiro e termo de uma progress˜o aritm´tica, o ultimo termo da progress˜o e a raz˜o a e ´ a a desta progress˜o. Determinar a soma dos termos desta progress˜o aritm´tica. a a e an + a1 an − a1 soma = ×n n= +1 2 r Ex 2.14 - Escrever um algoritmo que lˆ o c´digo da pe¸a 1, o n´mero de e o c u pe¸as 1, o valor unit´rio da pe¸a 1, o c´digo da pe¸a 2, o n´mero de pe¸as c a c o c u c 2, o valor unit´rio da pe¸a 2 e a percentagem do IPI a ser acrescentado e a c calcula o valor total a ser pago. 9
  • 10. Opera¸˜o ca S´ ımbolo Precedˆncia e Adi¸ao c˜ + 3 Subtra¸ao c˜ - 3 Multiplica¸˜o ca * 2 Divis˜o a / 2 Potencia¸˜o ca ** 1 Tabela 1: Opera¸oes Aritm´ticas c˜ e 2.6 Express˜es Aritm´ticas o e Para que uma express˜o possa ser avaliada em um algoritmo ela deve seguir a uma sintaxe bem definida. As opera¸˜es utilizadas nas express˜es aritm´ticas co o e em nossa linguagem s˜o as mostradas na Tabela 1 junto com as suas pre- a cedˆncias. A precedˆncia dos operadores indica a ordem que eles ser˜o ava- e e a liados em uma express˜o. a A precedˆncia dos operadores ´ relevante para o resultado da avalia¸ao e e c˜ de uma express˜o. Por exemplo, a avalia¸ao da express˜o 3 + 4 * 2 pode a c˜ a resultar 14 se a soma for efetuada em primeiro lugar ou 11 se a multiplica¸˜o ca for efetuada em primeiro lugar. Para isto se define a prioridade das opera¸oes. c˜ Ao avaliar uma express˜o primeiro s˜o efetuada as potencia¸oes, ap´s s˜o efe- a a c˜ o a tuadas as multiplica¸oes e divis˜es e por fim as adi¸˜es e subtra¸˜es. Quando c˜ o co co houverem duas opera¸oes de mesma prioridade para serem efetuadas, a or- c˜ dem de execu¸˜o ´ da esquerda para a direita. ca e ´ E poss´ alterar a ordem de execu¸ao das opera¸oes em uma express˜o ıvel c˜ c˜ a com o uso de parˆnteses. Em uma express˜o com parˆnteses em primeiro e a e lugar s˜o efetuadas as opera¸oes entre parˆnteses. a c˜ e Ex: Express˜o para o c´lculo das ra´ de uma equa¸˜o de segundo grau a a ızes ca segundo a f´rmula de Bascara (usar o - un´rio). o a X1 := (-B+(B**2-4*A*C)**(1/2))/(2*A) X2 := (-B-(B**2-4*A*C)**(1/2))/(2*A) Al´m das opera¸oes acima descritas a nossa ’linguagem’ oferece as fun¸˜es e c˜ co pr´-definidas da Tabela 2. e Ex: ABS(-2)= 2, QUOCIENTE(7,2)= 3, RESTO(5,2)= 1, TRUNCA(3.9)= 3, ARREDONDA(3.4)= 3 e ARREDONDA(3.5)= 4. 10
  • 11. Fun¸˜o ca Especifica¸ao c˜ LOG(x) logaritmo de x na base 10 LN(x) logaritmo natural de x EXP(x) e elevado na x-´sima potˆncia e e ABS(x) m´dulo ( valor absoluto ) de x o TRUNCA(x) valor inteiro de x ARREDONDA(x) inteiro mais pr´ximo a x o SINAL(x) −1 se x < 0 0 se x = 0 1 se x > 0 QUOCIENTE(x,y) quociente inteiro da divis˜o de x por y a RESTO(x,y) resto da divis˜o inteira de x por y a Tabela 2: Fun¸oes Pr´-definidas c˜ e Ex 2.16 - Escrever um algoritmo para calcular os sucessivos valores de E usando a s´rie abaixo considerando primeiro 3 termos, depois 4 termos e e finalmente 5 termos: 1 1 1 1 E= + + + 1! 2! 3! 4! Ex 2.17 - Escrever um algoritmo que lˆ o valor de um empr´stimo e e e calcula o valor de cada amortiza¸ao considerando 24 amortiza¸oes a uma c˜ c˜ taxa de 48%. Depois fazer o mesmo algoritmo lendo os valores da taxa e do n´mero de amortiza¸oes. u c˜ VAMORT = VEMPREST × TAXA/NAMORT onde VAMORT ´ o valor da amortiza¸˜o, VEMPREST ´ o valor do empr´s- e ca e e timo, TAXA ´ a taxa, e NAMORT ´ o n´mero de amortiza¸oes. e e u c˜ Ex 2.18 - Escrever um algoritmo que lˆ um valor em cruzeiros e calcula e qual o menor n´mero poss´ de notas de 5000, 1000, 500, 200, 100, 50, 10, u ıvel 5 e 1 em que o valor lido pode ser decomposto. Escrever o valor lido e a rela¸ao de notas necess´rias. c˜ a Ex 2.19 - Escrever um algoritmo que lˆ o n´mero do vendedor, o seu e u sal´rio fixo, o total de vendas por ele efetuadas e o percentual que ganha a sobre o total de vendas. Calcular o sal´rio total do vendedor. Escrever o a n´mero do vendedor e o sal´rio total. u a 11
  • 12. Ex 2.20 - Escrever um algoritmo que lˆ 3 valores a, b e c que s˜o lados de e a um triˆngulo e calcule a ´rea deste triˆngulo. a a a ´rea = a s(s − a)(s − b)(s − c) onde s = (a + b + c)/2 (semi-per´ ımetro). Ex 2.21 - Um sistema de equa¸˜es lineares do tipo: co ax + by = c dx + ey = f pode ser resolvido segundo mostrado abaixo: ce − bf af − cd x= y= ae − bd ae − bd Escrever um algoritmo que lˆ os coeficientes a, b, c, d, e, e f , e calcula e e escreve os valores de x e y. Ex 2.22 - O custo ao consumidor, de um carro novo, ´ a soma do custo e de f´brica com a porcentagem do distribuidor e dos impostos ( aplicados ao a custo de f´brica ). Supondo que a percentagem do distribuidor seja de 28% a e os impostos de 45%, escrever um algoritmo para ler o custo de f´brica de a um carro e escrever o custo ao consumidor. Depois fazer o mesmo algoritmo lendo os valores da porcentagem do distribuidor e dos impostos. Ex 2.23 - Uma revendedora de carros usados paga a seus funcion´rios a vendedores, um sal´rio fixo por mˆs, mais uma comiss˜o tamb´m fixa para a e a e cada carro vendido e mais 5% do valor das vendas por ele efetuadas. Escrever um algoritmo que lˆ o nome do vendedor, o n´mero do vendedor, o n´mero e u u de carros por ele vendidos, o valor total de suas vendas, o sal´rio fixo e o a valor que recebe por carro vendido e calcula o sal´rio mensal do vendedor, a escrevendo-o juntamente com o seu nome e seu n´mero de identifica¸˜o. u ca Ex 2.24 - Considerando que o aumento dos funcion´rios ´ de 80% do INPC a e e mais um percentual de produtividade discutido com a empresa. Escrever um algoritmo que lˆ o nome do funcion´rio, o n´mero do funcion´rio, seu e a u a sal´rio atual, o valor do INPC e o ´ a ındice de produtividade conquistado e escreve o nome do funcion´rio, seu aumento e o valor do novo sal´rio. a a Ex 2.25 - Escrever um algoritmo que lˆ 3 valores a, b e c e os escreve. e Encontre a seguir o maior dos trˆs valores e o escreva com a mensagem: ”E e ´ o maior”. a + b + |a − b| maior = 2 12
  • 13. Relacional Significado = Igual a <> ou = Diferente de > Maior que < Menor que >= Maior ou igual a <= Menor ou igual a Tabela 3: Relacionais Operador Significado N~o a Inverte o valor l´gico do operando o E Verdadeiro se e somente se os dois opeandos s˜o verdadeiros a Ou Verdadeiro se pelo menos um dos dois operandos ´ verdadeiro e Tabela 4: Operadores L´gicos o 2.7 Express˜es L´gicas o o Express˜es l´gicas s˜o express˜es que avaliadas resultam em um valor l´gico o o a o o ( verdadeiro ou falso ). Assim como as express˜es aritm´ticas elas tamb´m o e e disp˜em de um conjunto de operadores, s´ o ımbolos e prioridades. Os operado- res s˜o divididos em operadores relacionais e operadores l´gicos. a o Operadores relacionais atuam sobre operandos num´ricos mas resultam e em valores l´gicos. S˜o operadores de compara¸˜o entre dois operandos. A o a ca Tabela 3 Operadores l´gicos atuam sobre valores l´gicos e resultam em valores o o l´gicos (veja Tabela 4). o Exemplos de express˜es l´gicas: o o A > 0 E B > 3 Teste OU A * B > C A precedˆncia de operadores da nossa linguagem ´ apresentada na Ta- e e bela 5. 13
  • 14. Operador Precedˆncia e Operadores Aritm´ticos e 1 Operadores Relacionais 2 Nao 3 E 4 OU 5 Tabela 5: Operadores e suas Precedˆncias e Ex: Se A = 1, B = 2 e C = 2 qual o resultado da avalia¸ao da express˜o c˜ a seguinte? A + B = 0 E C <> 0 3 = 0 E C <> 0 Falso E Verdadeiro Falso 3 Estrutura Condicional Utilizada quando um trecho de algoritmo s´ deve ser executado em determi- o nadas condi¸oes. Formas Gerais: c˜ 1. Se <condi¸ao> c~ ent~o <lista-de-comandos> a fim_se 2. Se <condi¸ao> c~ ent~o <lista-de-comandos> a sen~o <lista-de-comandos> a fim_se onde <condi¸ao> ´ uma express˜o l´gica qualquer. c~ e a o Ex: Se a>b ent~o Escreva a a sen~o Escreva b a fim_se 14
  • 15. Ao ser executado este comando a express˜o a > b ´ avaliada e depen- a e dendo do resultado da avalia¸˜o ´ executado o primeiro comando (escreva ca e a) ou o segundo comando (escreva b). Observe que as estruturas podem ser “aninhadas”. Ex2: Se a<>b ent~o Se a>b a ent~o Escreva ’a maior que b’ a sen~o Escreva ’a menor que b’ a fim_se sen~o Escreva ’a igual a b’ a fim_se Ex3: Algoritmo que calcula a raiz da equa¸ao y = ax + b. c˜ Algoritmo Declare A,B,X num´rico e Leia A,B Se A = 0 ent~o Escreva ’N~o h´ raizes’ a a a sen~o X := -B/A a Escreva ’Raiz=’,X fim_se fim_algoritmo 15
  • 16. Ex4: Algoritmo que calcula as raizes da equa¸ao y = ax2 + bx + c. c˜ Algoritmo Declare A,B,C,Delta num´rico e Leia A,B,C Delta := B**2-4*A*C Se Delta = 0 ent~o Escreva ’S´ h´ uma raiz’,-B/(2*A) a o a fim_se Se Delta < 0 ent~o Escreva ’h´ duas raizes complexas’ a a Escreva -B/(2*A),’+-’,ABS((-Delta)**0.5/(2*A)),’J’ fim_se Se Delta > 0 ent~o Escreva ’Ha duas raizes reais’ a Escreva (-B+Delta**0.5)/(2*A),’ E ’, (-B-(Delta**0.5))/(2*A) fim_se fim_algoritmo Observe o no algoritmo. Ele serve para indicar que a linha continua na seguinte. Isto ´ util quando a linha de um algoritmo ´ muito grande. e´ e 4 Estrutura de Repeti¸˜o ca Utilizada quando um trecho de um algoritmo deve ser repetido um deter- minado n´mero de vezes. Esta estrutura tamb´m ´ chamada de la¸o de u e e c repeti¸ao. Forma geral: c˜ 1. Enquanto <condi¸ao> c~ fa¸a { lista-de-comandos } c fim_enquanto 2. Repita { lista de comandos } at´ <condi¸ao> e c~ 16
  • 17. Na primeira forma os comandos s˜o executados repetitivamente enquanto a a condi¸˜o ´ verdadeira, e a condi¸˜o ´ testada antes (pode n˜o executar ne- ca e ca e a nhuma vez). Na segunda forma os comandos s˜o executados repetitivamente a at´ a condi¸˜o tornar-se verdadeira (testa depois de executar, assim sempre e ca ´ executado pelo menos uma vez). e Ex: Escrever os n´meros de 1 a 10. u Algoritmo Declare I num´rico e I := 1 Repita Escreva I I := I + 1 at´ I > 10 e fim_algoritmo e u co c ´ A vari´vel I ´ quem controla o n´mero de repeti¸˜es do la¸o. E chamada a vari´vel contadora. Uma vari´vel contadora ´ uma vari´vel que recebe um a a e a valor inicial, ´ incrementada de um valor constante no la¸o e tem seu valor e c testado em algum ponto do la¸o. Ao chegar a um determinado valor o la¸o ´ c c e interrompido. A inicializa¸˜o da vari´vel contadora deve ir, necessariamente, ca a fora do la¸o. c Existem diversas maneiras de implementar o mesmo la¸o, mas todo la¸o c c com vari´vel de controle deve conter: a • inicializa¸˜o; ca • incremento (ou decremento); • teste de valor final. Abaixo s˜o mostradas outras trˆs maneiras de implementar o algoritmo a e anterior: 17
  • 18. 1. Algoritmo Declare I num´rico e I := 0 Repita I := I + 1 Escreva I at´ I = 10 e fim_algoritmo 2. Algoritmo Declare I num´rico e I := 0 Enquanto I < 10 fa¸a c I := I + 1 Escreva I fim_enquanto fim_algoritmo 3. Algoritmo Declare I num´rico e I := 1 Enquanto I < 11 fa¸a c Escreva I I := I + 1 fim_enquanto fim_algoritmo Ainda existe uma possibilidade adicional de abandonar um la¸o de re- c peti¸ao (tanto o Repita quanto o Enquanto) em qualquer lugar por meio de c˜ um comando Interrompa: 18
  • 19. Enquanto verdadeiro fa¸a c Leia x Se x>0 ent~o Interrompa fim_se a Escreva ’Valor inv´lido’ a Escreva ’Digite novamente’ fim_enquanto significando que o la¸o (condi¸ao de parada do la¸o ´ verdadeiro) ser´ in- c c˜ c e a terrompido (pelo comando Interrompa) apenas quando o usu´rio fornecer a um n´mero maior que zero. u Ex. 4.7 Escrever um algoritmo que gera e escreve os n´meros impares u entre 100 e 200. Exerc. Escrever um algoritmo para calcular o fatorial de um n´mero. u 5 Algoritmos com Acumulador Quando o algoritmo necessitar efetuar alguma totaliza¸˜o usa-se uma vari´vel ca a chamada acumulador. A vari´vel acumuladora tamb´m deve ser inicializada a e (normalmente com zero) e pode ser incrementada ou n˜o de um valor vari´vel a a no la¸o. c Ex: Somar os n´meros de 1 a 10. u S := 0 I := 0 Enquanto I<10 fa¸a c I := I + 1 S := S + I fim_enquanto Assim, os valores de S e I ao longo da execu¸˜o do algoritmo s˜o mostra- ca a dos na Tabela 6. Ex. 4.6 - Escrever um algoritmo que lˆ 5 valores para a, um de cada vez, e e conta quantos destes valores s˜o negativos, escrevendo esta informa¸˜o. a ca Ex. 4.8 - Escrever um algoritmo que lˆ 10 valores, um de cada vez, e e conta quantos deles est˜o no intervalo [10,20] e quantos deles est˜o fora a a deste intervalo, escrevendo estas informa¸˜es. co 19
  • 20. Volta do la¸o c Valor de I (ao final) Valor de S (ao final) 1 1 1 2 2 3 3 3 6 4 4 10 . . . . . . . . . 10 10 55 Tabela 6: Execu¸ao Programa de Soma c˜ Ex. 4.9 - Escrever um algoritmo que lˆ um n´mero n˜o conhecido de va- e u a lores, um de cada vez, e conta quantos deles est˜o em cada um dos intervalos a [0,25], (25,50], (50,75], (75,100]. Ex. 4.10 - Escrever um algoritmo semelhante ao anterior que calcula as m´dias aritm´ticas de cada intervalo e as escreve, juntamente com o n´mero e e u de valores de cada intervalo. Exerc´ıcio: A s´rie de Fibonacci ´ uma sequˆncia de n´meros em que os e e e u dois primeiros s˜o 0 e 1 e a partir da´ cada n´mero ´ a soma dos anteriores, a ı u e ou seja tn = tn−1 + tn−2 Escrever um algoritmo que escreve os 10 primeiros termos da s´rie. e Ex. 4.11 - Escrever um algoritmo que gera os 10 primeiros termos da S´rie de Fibonacci e calcula e escreve a soma destes termos. e Exerc´ıcio: Escrever um algoritmo que leia um n´mero N e escreva o u n´mero de divisores de N. u 20
  • 21. Algoritmo Declare N,acum,I num´rico e Leia N acum := 0 I := 1 Repita Se Resto(N,I)=0 entao acum := acum+1 fim_se I := I+1 at´ I>N e escreva acum fim_algoritmo Escrever um algoritmo que leia um n´mero e escreva uma mensagem u dizendo: “O n´mero ´ primo” ou “O n´mero n˜o ´ primo” conforme o caso. u e u a e Ex. 4.12 - Escrever um algoritmo que gera os 30 primeiros termos da ´ s´rie de Fibonacci e escreve os termos gerados com a mensagem: “E primo” e ou “N˜o ´ primo” conforme o caso. a e 6 Refinamentos Sucessivos ´ E uma t´cnica para desenvolver um algoritmo em diversos passos aumentando e o n´ ıvel de detalhamento a cada passo. A partir do problema gerar uma poss´ solu¸˜o e detalh´-la at´ um n´ aceit´vel. ıvel ca a e ıvel a Ex: Escrever um algoritmo que leia um n´mero e escreva a mensagem “E u ´ primo” ou “N˜o ´ primo”. Primeira Vers˜o: a e a Algoritmo Declare n´mero u Leia n´mero u {Verifica se n´mero ´ primo} u e Se {n´mero ´ primo} u e ent~o escreva ’n´mero ´ primo’ a u e sen~o escreva ’n´mero n~o ´ primo’ a u a e fim_se fim_algoritmo 21
  • 22. Detalhamentos: { Verifica se n´mero ´ primo } u e Um n´mero ´ primo se ´ divis´ somente por si e pela unidade (1). Uma u e e ıvel maneira de descobrir isto ´ contando o n´mero de divisores do n´mero. Se e u u possuir apenas dois divisores (1 e o pr´prio n´mero ) ele ´ primo. o u e { Verifica se n´mero ´ primo } ⇒ { Conta n´mero de divisores } u e u { Conta n´mero de divisores } u acum := 0 i := 1 Repita Se Resto(Numero,i)=0 ent~o acum:=acum+1 a fim_se i:=i+1 at´ i>n´mero e u { N´mero ´ primo } u e Se acum=2 ent~o... a O refinamento para { Conta n´mero de divisores } n˜o ´ bom, por- u a e que basta verificar que existem mais de dois divisores do n´mero para ele u n˜o ser primo. Assim, rebatizando { Conta n´mero de divisores } para a u { Verifica se h´ mais de dois divisores }, obtemos, usando o coman- a do Interrompa: { Verifica se h´ mais de dois divisores } a acum := 1 i := 1 Enquanto i <= TRUNCA(n´mero/2) u Fa¸a c Se Resto(Numero,i)=0 ent~o acum:=acum+1 a fim_se Se acum>2 ent~o Interrompa fim_se a i:=i+1 fim_enquanto 22
  • 23. ff P rincipal fffff fffffffff fffff rfffff { n´mero ´ primo } u e { Verifica de n´mero ´ primo } u e { Verifica se h´ mais de dois divisores } a Figura 1: Diagrama de Refinamentos para o Exemplo Isto melhora a performance do algoritmo, pois ele abandona o la¸o assim c que percebe que j´ existem mais de dois divisores e faz divis˜es apenas at´ a o e TRUNCA(n´mero/2). u A Figura 1 apresenta o diagrama de refinamentos para este exemplo. Montando as partes obtemos a vers˜o final: a Algoritmo Declare n´mero,i,acum num´rico u e Leia n´mero u acum := 1 i := 1 Enquanto i = TRUNCA(n´mero/2) u Fa¸a c Se Resto(Numero,i)=0 ent~o acum:=acum+1 a fim_se Se acum2 ent~o Interrompa fim_se a i:=i+1 fim_enquanto Se acum=2 ent~o escreva ’n´mero ´ primo’ a u e sen~o escreva ’n´mero n~o ´ primo’ a u a e fim_se fim_algoritmo 23
  • 24. Usar refinamentos sucessivos: Ex 1.12.30. Escrever um algoritmo para gerar e escrever uma tabela com os valores do seno de um ˆngulo A em radianos, utilizando a s´rie de a e Mac-Laurin truncada com 20 termos: A1 A3 A5 A7 sin(A) = − + − ··· 1! 3! 5! 7! Os valores dos ˆngulos A devem variar de 0.0 a 6.3 de 0.1 em 0.1. a Exerc.: Repetir o exerc´ anterior, truncando a s´rie considerando uma ıcio e precis˜o de 0,0001 na aproxima¸ao obtida (dica: considere o valor absoluto a c˜ do ultimo termo). ´ Ex. 1.12.40. Fazer um algoritmo que calcule e escreva o cosseno de A usando a s´rie truncada com 20 termos: e A2 A4 A6 A8 cos(A) = 1 − + − + ··· 2! 4! 6! 8! Ex. 1.12.32. O valor aproximado de ? pode ser calculado usando-se a s´rie: e 1 1 1 1 1 S = 3 − 3 + 3 − 3 + 3 ··· 1 3 5 7 9 √ 3 sendo π ≈ S × 32. Fazer um algoritmo para calcular e escrever o valor de π com 51 termos. 7 Usando Matrizes Matriz ´ um conjunto de vari´veis, cada uma podendo representar o valor e a de uma constante, como se fossem vari´veis simples, mas todas elas com- a ´ partilhando um nome comum. Indices s˜o associados a este nome comum a permitindo individualizar os elementos do conjunto. Ex: conjunto de 5 elementos e nome a a1 a2 a3 a4 a5 Qual ´ a utilidade dos matrizes? Resposta: Tratar com dados em s´rie e e do mesmo tipo. Ex: Deseja-se calcular a m´dia de notas de 10 alunos e determinar quantos e ficaram acima da m´dia. Portanto, deve-se calcular a m´dia de 10 n´meros e e u lidos e determinar quantos destes n´meros est˜o acima da m´dia. u a e Para calcular a m´dia podemos usar o seguinte algoritmo: e 24
  • 25. Algoritmo Declare cont,soma,num num´rico e cont := 10 soma := 0 Repita Leia num soma := soma+num cont := cont-1 At´ cont=0 e Escreva soma/10 fim_algoritmo Problema: Quando os n´meros s˜o lidos n˜o conhecemos ainda o valor u a a da m´dia. Ao final do programa anterior n˜o temos mais acesso aos n´meros e a u lidos (pois j´ foram lidos). Lˆ-los novamente seria perda de tempo. a e Como fazer este algoritmo sem matrizes? Resposta: Ler os 10 n´meros e guarda-los em 10 vari´veis para testar u a uma a uma ap´s obter a m´dia. o e Problema: E se fossem 1000 alunos? Teriamos dificuldades de manipular 1000 vari´veis diferentes. a Solu¸˜o: uso de uma matriz para armazenar os valores das notas para ca posteriormente processa-los. 7.1 Declara¸˜o de Matrizes ca Deve-se definir nas declara¸oes: c˜ 1. Quais vari´veis do algoritmo s˜o do tipo matriz; a a 2. Quantas dimens˜es possui cada uma delas; o 3. Qual o tamanho de cada dimens˜o; a 4. O tipo dos componentes individuais da matriz. Nota¸˜o: ca Declare Nome ’(’ tamanho ’)’ tipo Declare Nome ’(’ tamanho ’,’ tamanho ... ’)’ tipo 25
  • 26. Ex: Declare a(5),m(6,8) num´rico. e Conven¸ao: O primeiro ´ c˜ ındice representa a linha e o segundo a coluna. O menor ´ ındice ´ o 1. e 7.2 Tratando com Matrizes Para ler uma matriz ´ necess´rio ler cada um dos seus componentes indivi- e a duais. Ex: Ler 5 elementos da matriz a. Algoritmo Declare i,a(5) num´rico e i := 1 Enquanto i6 fa¸a c Leia a(i) i:=i+1 fim_enquanto fim_algoritmo Observa¸ao: a vari´vel i ´ chamada de ´ c˜ a e ındice. Ex: Ler os 48 elementos da matriz m(6, 8). Devemos usar duas vari´veis a de ´ ındice. Algoritmo Declare i,j,m(6,8) num´rico e i:=1 Enquanto i7 fa¸a c j:=1 Enquanto j9 fa¸a c Leia m(i,j) j:=j+1 fim_enquanto i:=i+1 fim_enquanto fim_algoritmo 26
  • 27. Observe que este algoritmo usa dois la¸os aninhados. c Ex: Somar os elementos da diagonal principal de m(10, 10), lendo a matriz antes e escrevendo a soma ao final. Algoritmo Declare soma,i,j,m(10,10) num´rico e i:=1 Repita j:=1 Repita Leia m(i,j) j:=j+1 at´ j10 e i:=i+1 at´ i10 e soma:=0 i:=1 Repita soma:=soma+m(i,i) i:=i+1 at´ i10 e Escreva soma fim_algoritmo Exerc.: Calcular a m´dia de 10 alunos de uma disciplina, entrando a e nota e o nome do aluno. Determinar o n´mero de alunos que tiveram nota u superior a m´dia e imprimir o nome dos alunos que tiveram este feito. e Ex. 2.5.1.4. Dado um conjunto de 100 valores num´ricos dispon´ e ıveis na entrada, fazer um algoritmo para armazen´-los em uma matriz e calcular e a imprimir o valor do somat´rio dado a seguir: o S = (v1 − v100 )3 + (v2 − v99 )3 + (v3 − v98 )3 + · · · + (v50 − v51 )3 Determinar a posi¸ao, dentro de uma matriz quadrada, de um elemento c˜ pode ser muito util em alguns tipos de algoritmos. Por exemplo, determi- ´ nar se determinado elemento est´ acima ou abaixo da diagonal principal da a matriz. 27
  • 28. Figura 2: Posi¸oes em uma Matriz c˜ Algumas rela¸˜es s˜o importantes para determinar a posi¸ao dos elemen- co a c˜ tos de uma matriz quadrada (veja Figura 2).   a11 a12 a13 · · · a1n     a21 a22 a23 · · · a2n    a31 a32 a33 · · · a3n     . . . .. .    . . . . . . . .  .  an1 an2 an3 · · · ann Sendo i e j os ´ ındices dos elementos da matriz: • Diagonal principal – i = j; • Diagonal secund´ria – i + j = n + 1; a • Abaixo da diagonal principal – i j; • Acima da diagonal principal – i j; • Acima da diagonal secund´ria – i + j n + 1; a • Abaixo da diagonal secund´ria – i + j n + 1. a Exerc. Escrever um algoritmo para ler um valor n e a seguir ler uma matriz n × n. Ent˜o, determinar a soma de todos os elementos acima da a diagonal principal e imprimi-lo. Exerc. Escrever um algoritmo para ler uma matriz a de tamanho n × m e outra matriz b de tamanho m × p. Ent˜o, determinar e imprimir a matriz a produto c de tamanho n × p. m cij = aik bkj k=1 28
  • 29. CAR CDR 1 2 3 c nil a b nil Figura 3: Representa¸˜o Gr´fica da Lista ca a 8 Usando Listas Uma estrutura formada por uma seq¨ˆncia de elementos de tipos diversos ´ ue e chamada de lista. Importante observar que um elemento de uma lista pode ser outra lista. Por exemplo: [1,2,3,[’a’,’b’],’c’] que ´ uma lista com cinco elementos e o quarto elemento da lista ´ uma outra e e lista de dois elementos. Na representa¸˜o interna de lista, cada elemento de uma lista ´ formado ca e por um nodo com dois elementos (CAR e CDR – pronuncia-se “cuder”) que podem ser preenchidos com valores constantes (num´ricos, literais ou l´gicos) e o ou elos. Um elo ´ um indicador da posi¸ao de um outro nodo na mem´ria da e c˜ o m´quina. Existe um elo especial (nil) que n˜o aponta para nenhum lugar e a a ´ usado para indicar o fim de uma lista. nil pode indicar tamb´m uma lista e e vazia. Observe que uma matriz n˜o pode ser um elemento de uma lista. a Exemplo: [1,2,3,[’a’,’b’],’c’] seria armazenado internamente na mem´ria da m´quina como ilustrado na o a Figura 3. Comumente se chama a parte CAR de cabe¸a da lista e a parte CDR de c resto ou rabo da lista. 29
  • 30. 8.1 Constantes Lista As constantes listas s˜o qualquer seq¨ˆncia de num´ricos, literais ou l´gicos, a ue e o separados por v´ırgulas e delimitados por [ e ]. Uma constante lista pode ter em um ou mais de seus termos outras listas e assim por diante. Ex: [1,2,[’a’,’b’,[1,’b’]],3] 8.2 Opera¸oes com Listas c˜ Est˜o definidas em nossa linguagem de algoritmos as fun¸oes e opera¸oes a c˜ c˜ sobre listas da Tabela 7. Ex: CAR(CDR([1,2,3]))=2 CDR(CDR([’a’,’b’,’c’,’d’]))=[’c’,’d’] CDR(CAR(CDR([1,[2,3],4])))=[3] CONS(’a’,[’b’,’c’])=[’a’,’b’,’c’] CONS(’a’,nil)=[’a’] CONS([1,2],[’a’,’b’])=[[1,2],’a’,’b’] NIL([1,2])=falso [1,2,3,4,5](2)=3 A Figura 4 apresenta a interpreta¸˜o gr´fica das opera¸oes CAR e CDR para ca a c˜ a avalia¸˜o CDR(CAR(CDR([a,[b,[c]],d]))). ca 8.3 Declara¸˜o de Vari´vel Lista ca a Uma vari´vel lista ´ declarada da seguinte forma: a e Declare x lista Podemos agora manipular a vari´vel lista em uma atribui¸ao. a c˜ Ex: x := [2,3,4] x := CONS(1,x) que resulta em x igual a [1,2,3,4]. Observa¸ao: N˜o podemos atribuir um valor a uma posi¸ao qualquer da c˜ a c˜ lista. S´ podemos trocar sua cabe¸a: o c x := [1,2,3,4] x := CONS(10,CDR(x)) que resulta em x igual a [10,2,3,4]. 30
  • 31. a primeiro CDR CAR b d nil segundo CDR nil c nil Figura 4: Interpreta¸ao Gr´fica de CAR e CDR c˜ a 31
  • 32. Opera¸ao c˜ Significado CAR(x) Obt´m a cabe¸a de uma lista e c (devolve o CAR de x) CDR(x) Obt´m o resto de uma lista e (devolve a lista CDR de x) CONS(x,y) Constroi um nodo tendo como CAR x, e como CDR y (segundo argumento deve ser uma lista) x(i) Devolve a i-´sima posi¸ao da lista x e c˜ (o ´ ındice da primeira posi¸ao ´ zero) c˜ e TAM(x) Tamanho da lista x NIL(x) Verifica se a lista ´ vazia e (testa se x ´ igual a nil, e retornando verdadeiro ou falso) Tabela 7: Fun¸oes e Opera¸oes sobre Listas c˜ c˜ 8.4 Tratando Listas Listas s˜o uma estrutura dinˆmica muito poderosa e flex´ para construir a a ıvel algoritmos que tratem com situa¸oes em que os dados est˜o constantemente c˜ a sendo inseridos e retirados (pilhas e filas s˜o exemplos). a Tamb´m s˜o uma boa alternativa `s matrizes, em casos em que o tama- e a a nho dos dados ´ conhecido apenas em tempo de execu¸ao. Por exemplo, se e c˜ desejamos encontrar o n´mero de elementos que s˜o menores que a m´dia de u a e um conjunto de num´ricos: e 32
  • 33. Algoritmo Declare x,n,i,acum,m num´rico e Declare a lista Escreva ’Entre a quantidade de valores’ Leia n i := 1 a := nil acum := 0 Enquanto in+1 fa¸a c Escreva ’Entre com valor ’,i Leia x a := CONS(x,a) i := i+1 acum:=acum+x fim_enquanto m := acum/n acum := 0 Enquanto N~o NIL(a) a fa¸a c Se a(0)m ent~o acum := acum+1 fim_se a a := CDR(a) fim_enquanto Escreva acum fim_algoritmo Exerc´ıcio: Escreva um trecho de algoritmo que apague o ultimo elemento ´ de uma lista qualquer. Exerc´ıcio: Escrever um algoritmo que leia uma lista de 10 elementos e depois apague da lista todos os elementos que forem menores que 100. 33
  • 34. Solu¸˜o: ca Algoritmo Declare x,i num´rico e Declare a,b lista i := 1 a := nil Enquanto i11 fa¸a c Leia x a := CONS(x,a) i := i+1 fim_enquanto i := 1 b := nil Enquanto N~o NIL(a) a fa¸a c Se CAR(a)=100 ent~o b:=CONS(CAR(a),b) a fim_se a := CDR(a) fim_enquanto Escreva b fim_algoritmo Exerc´ıcio: Escreva um trecho de algoritmo que encontre o maior valor de uma lista de num´ricos. e Exerc´ıcio: Escrever um trecho de algoritmo que inverta uma lista. E se precis´ssemos fazer a concatena¸˜o de duas listas? Assim, se a=[1,2,3] a ca e b=[4,5] sua concatena¸ao ser´ [1,2,3,4,5]. c˜ a Aten¸ao: CONS(a,b) n˜o vai funcionar. Por que? c˜ a Exerc´ıcio: Escrever um trecho de algoritmo para concatenar duas listas. 34
  • 35. 9 Sub-algoritmos Sub-algoritmos s˜o trechos de algoritmos que efetuam um ou mais c´lculos a a determinados em sua declara¸ao ou defini¸˜o. Ao inv´s de escrever-se um c˜ ca e algoritmo grande, escrevem-se v´rios algoritmos menores, os quais, n˜o iso- a a ´ ladamente, mas em conjunto, resolvem o problema proposto. E conveniente usa-los quando uma determinada tarefa ´ efetuada em diversos lugares no e mesmo algoritmo. Ao inv´s de escrever-se o mesmo trecho diversas vezes, e escreve-se o sub-algoritmo e o mesmo ´ chamado diversas vezes. e As vantagens s˜o: a • Eles reduzem o tamanho do algoritmo; • Facilitam a compreens˜o e visualiza¸ao do algoritmo; a c˜ • Isolam determinadas partes do algoritmo para que possam ser desen- volvidas e testadas em separado. O sub-algoritmo ´ definido ap´s as declara¸˜es de vari´veis e antes do e o co a corpo principal do algoritmo. Assim, a estrutura dos nossos algoritmos pas- sar´ a ser: a Algoritmo { Declara¸oes de vari´veis } c~ a { Defini¸oes de sub-algoritmos } c~ { corpo do algoritmo } fim_algoritmo Argumentos (ou parˆmetros) s˜o valores enviados ao sub-algoritmo para a a serem processados, e/ou recebidos do sub-algoritmo como resultados do pro- cessamento. Um sub-algoritmo pode conter declara¸˜es de vari´veis, mas as vari´veis co a a declaradas nele (chamadas vari´veis locais do sub-algoritmo) s´ podem ser a o acessadas dentro dele. Al´m de suas vari´veis locais, um sub-algoritmo e a pode acessar vari´veis declaradas fora dele, no algoritmo principal (chama- a das vari´veis globais). Os parˆmetros usados na defini¸ao do sub-algoritmo a a c˜ s˜o chamados parˆmetros formais, e os parˆmetros usados na chamada do a a a sub-algoritmo s˜o chamados de parˆmetros reais. a a Ex: 35
  • 36. Algoritmo Declare a,b num´rico e Sub-rotina y(c,d num´ricos) e Declare e,f num´rico e { comandos de y } fim_sub-rotina Sub-rotina z(e num´rico) e Declare f num´rico e { comandos de z } fim_sub-rotina y(1,2) z(10) fim_algoritmo Onde: a, b – vari´veis globais (acessadas pelo algoritmo e pelos dois sub- a algoritmos); e, f – vari´veis locais a y (acessadas apenas pelo sub-algoritmo y); a c, d – parˆmetros formais de y (usados na hora da chamada de y) a declarados como num´ricos; e f – variavel local a z (acessada somente pelo sub-algoritmo z, n˜o a possuindo qualquer rela¸ao com a outra variavel f (local a y); c˜ e – parˆmetro formal de z, declarado como num´rico; a e y(1, 2) – chamada de y com parˆmetros reais 1 e 2 (1 ser´ atribuido a a a c e 2 ser´ atribuido a d); a z(10) – chamada de z. Existem v´rios tipos de passagem de parˆmetros para sub-algoritmo: a a Passagem por valor Envia um valor para o sub-algoritmo e n˜o retorna a valores pelo parˆmetro formal (s´ entrada). No momento da chamada a o os valores dos parˆmetros reais s˜o copiados para os parˆmetros formais a a a para serem usados dentro do sub-algoritmo sem que se modifiquem os valores armazenados nos parˆmetros reais. Ex: PASCAL (padr˜o); a a Passagem Copia-restaura Envia e recebe valores do sub-algoritmo (en- trada e sa´ ıda). Na chamada os valores passados s˜o copiados para os a parˆmetros formais e usados. Ao final (no retorno do sub-algoritmo) a 36
  • 37. os valores finais dos parˆmetros formais s˜o copiados de volta nos a a parˆmetros reais (´ ´bvio que os parˆmetros reais, neste caso, dever˜o a eo a a ser vari´veis); a Passagem por referˆncia Envia e recebe valores do sub-algoritmo (en- e trada e sa´ ıda) usando uma referˆncia ` vari´vel (n˜o faz c´pia; usa o e a a a o pr´prio parˆmetro real dentro do sub-algoritmo). Ex: PASCAL (VAR). o a Nos nossos algoritmos usaremos passagem Copia-restaura e por valor. Indicaremos o tipo copia-restaura antecedendo a palavra reservada CR aos parˆmetros deste tipo. a Existem dois tipos de sub-algoritmos: sub-rotinas (ou procedures) e fun- ¸˜es. co 9.1 Sub-rotinas Retornam valores apenas pelos argumentos (caso sejam passados como copia- restaura). Declara¸˜o: ca sub-rotina nome[’(’lista de par^metros formais’)’] a { declara¸oes locais ` sub-rotina } c~ a { comandos } fim_sub-rotina Observe que podemos definir uma sub-rotina sem parˆmetros formais a (para qual n˜o precisamos passar nenhum parˆmetro na chamada). Observe a a tamb´m que ´ poss´ e e ıvel definir um sub-algoritmo dentro de outro (aninha- mento), pois n˜o faremos nenhuma restri¸ao ao que pode ser declarado den- a c˜ tro de um sub-algoritmo. Sub-algoritmos declarados dentro de outros s˜o a locais a estes (desconhecidos fora). Ex.: Sub-rotina troca sub-rotina troca(x,y num´rico) e Declare aux num´rico e aux:=x x:=y y:=aux fim_sub-rotina 37
  • 38. Esta sub-rotina n˜o funciona. Porque? Resposta: falta definir a passagem a de parˆmetros Copia-restaura). a sub-rotina troca(CR x,y num´rico) e Declare aux num´rico e aux:=x x:=y y:=aux fim_sub-rotina Exemplo: Um algoritmo para ordenar 3 valores em ordem crescente. Algoritmo Declare a,b,c : num´rico e sub-rotina troca(CR x,y num´rico) e Declare aux num´rico e aux:=x x:=y y:=aux fim_sub-rotina Leia a,b,c Se ab ent~o troca(a,b) a fim_se Se ac ent~o troca(a,c) a fim_se Se bc ent~o troca(b,c) a fim_se Escreva a,b,c fim_algoritmo 38
  • 39. 9.2 Fun¸oes c˜ Retornam um valor pelo seu nome (al´m de pelos parˆmetros declarados e a como copia-restaura). Ex: ABS(x), TRUNCA(x) (fun¸oes pr´-definidas) c˜ e Declara¸˜o: ca fun¸~o tipo nome[’(’lista de par^metros formais’)’] ca a { declara¸oes locais } c~ { comandos } fim_fun¸~o ca Observe que devemos declarar o tipo que ser´ retornado pela fun¸˜o. a ca Chamada: a := TRUNCA(3.5) ou se SINAL(x)=0 ... Retorno do valor usando a palavra reservada Retorna. Ex: Fun¸ao fatorial(n): c˜ fun¸~o num´rico fatorial(n num´rico) ca e e Declare fat num´rico e fat:=1 Enquanto n1 fa¸a c fat:=fat*n n:=n-1 fim_enquanto Retorna fat fim_fun¸~o ca Usando sub-algoritmos: Ex 3.3: Escrever um algoritmo que leia as medidas dos trˆs lados a, b e e c de um paralelep´ ıpedo, calcule e escreva o valor de sua diagonal (veja Figura 5). 39
  • 40. dia c d b a Figura 5: Paralelep´ ıpedo Ex 3.4: Escrever uma fun¸˜o l´gica que recebe uma vari´vel unidimen- ca o a sional M de num´ricos, o n´mero N de elementos de M , e um valor X e e u retorne verdadeiro se X pertence a M ou falso em caso contr´rio. a Como passar uma matriz como parˆmetro real? a Resposta: encontra(m(),n,x num´rico) (n˜o indicar seu tamanho – e a decidido na hora da chamada). Ex 3.5: Escrever uma fun¸˜o que calcule a distˆncia entre dois pontos de ca a um plano, sendo fornecidas as coordenadas (x1 , y1 ) e (x2 , y2 ). Exerc´ıcio: Escrever um algoritmo que leia 10 conjuntos de valores x1,y1, x2, y2, x3 e y3 coordenadas de 10 triangulos e calcule a ´rea dos 10 triangulos, a usando a fun¸˜o do exerc´ anterior. Usar duas fun¸oes: ca ıcio c˜ 1. A do exerc´ anterior; ıcio 2. Uma que chame a anterior trˆs vezes e use a f´rmula do semi-per´ e o ımetro para calcular a ´rea. a Ex 3.6: escrever um algoritmo que: • Leia v´rios pares de n´meros inteiros positivos, M e P ; a u 40
  • 41. • calcule e escreva o n´mero de arranjos e combina¸oes de M elementos u c˜ P a P , dado pelas f´rmulas: o M! M! AP = M P CM = (M − P )! P (M − P )! Se M P , por defini¸ao: c˜ AP = 0 CM = 0 M P Ao final de cada c´lculo de um par ´ perguntado se deseja continuar. A a e resposta deve ser ’S’ ou ’N’. Exerc. Utilizando as seguintes s´ries, com 20 termos: e x2 x3 ex = 1 + x + + + ··· 2! 3! x−1 1 x−1 2 x−1 3 ln(x) = + 1/2 + 1/3 + ··· x x x Fa¸a um algoritmo que gere uma tabela de x, ex , e ln(x), para x variando c entre 1 e 100 com intervalos de 0.5 (x = 1, x = 1.5, x = 2, . . . , x = 100). Defina sub-algoritmos onde for necess´rio. a Solu¸˜o (observe as fun¸˜es aninhadas e seu escopo): ca co Algoritmo Declare x num´rico e { declara¸oes das fun¸oes } c~ c~ x := 1 Repita Escreva x,’ ’,exp2(x),’ ’,ln2(x) x := x+0.5 at´ x100 e fim_algoritmo 41
  • 42. Fun¸oes: c˜ Fun¸~o num´rico exp2(x num´rico) ca e e Declare soma,ind num´rico e Fun¸~o num´rico fatorial(n num´rico) ca e e Declare fat num´rico e fat := 1 Enquanto n1 fa¸a c fat := fat*n n := n-1 fim_enquanto Retorna fat fim_fun¸~o ca soma := 1 ind := 1 Repita soma := soma+(x**ind)/fatorial(ind) ind := ind+1 at´ ind19 e Retorna soma fim_fun¸~o ca Fun¸~o num´rico ln2(x num´rico) ca e e Declare soma,ind num´rico e soma := 0 ind := 1 Repita soma := soma+(((x-1)/x)**ind)/ind ind := ind+1 at´ ind20 e Retorna soma fim_fun¸~o ca Observe que o la¸o da fun¸˜o exp2 tem como condi¸ao de parada ind19, c ca c˜ pois ser˜o somados 20 termos e o primeiro ´ 1 e j´ foi somado (soma := 1). a e a 42
  • 43. Exerc. A partir das seguintes s´ries do sin e cos, e usando fun¸˜es, escreva e co um algoritmo que gere uma tabela de x, sin(x), cos(x), tan(x), cot(x), sec(x), e csc(x) para x variando de 0.5 a 1.5 em intervalos de 0.1. Calcule os valores do sin e do cos com erro m´ximo de 0.0001 (≈ m´dulo do ultimo termo). a o ´ x3 x5 x7 sin(x) = x − + − + ··· 3! 5! 7! x2 x4 x6 cos(x) = 1 − + − + ··· 2! 4! 6! Rela¸˜es: co sin(x) 1 1 1 tan(x) = cot(x) = sec(x) = csc(x) = cos(x) tan(x) cos(x) sin(x) Solu¸˜o: ca Algoritmo Declare x num´rico e { declara¸oes de fun¸oes } c~ c~ x := 0.5 Repita Escreva x,’ ’,sen(x),’ ’,cos(x),’ ’,sen(x)/cos(x),’ ’, cos(x)/sen(x),’ ’,1/cos(x),’ ’,1/sen(x) x := x+0.1 at´ x1.5 e fim_algoritmo Fun¸oes: c˜ Fun¸~o num´rico fatorial(n num´rico) ca e e Declare fat,cont num´rico e cont := 1 fat := 1 Repita fat := fat*cont cont := cont+1 at´ contn e Retorna fat fim_fun¸~o ca 43
  • 44. Fun¸~o num´rico sen(x num´rico) ca e e Declare acum,soma,ind,termo,sinal num´rico e acum := 0 ind := 1 sinal := 1 Enquanto abs(termo)0.0001 fa¸a c termo := sinal*(x**ind)/fatorial(ind) acum := acum+termo sinal := -sinal ind := ind+2 fim_enquanto Retorna acum fim_fun¸~o ca Fun¸~o num´rico cos(x num´rico) ca e e Declare acum,ind,termo,sinal num´rico e acum := 1 ind := 2 sinal := -1 Enquanto abs(termo)0.0001 fa¸a c termo := sinal*(x**ind)/fatorial(ind) acum := acum+termo ind := ind+2 sinal := -sinal fim_enquanto Retorna acum fim_fun¸~o ca 10 Recursividade Uma fun¸ao ´ dita recursiva quando cont´m, em seu corpo, uma chamada a si c˜ e e mesma (este tipo de recursividade ´ chamada recursividade direta). S˜o uti- e a lizadas quando ´ poss´ decompor o problema a ser resolvido em problemas e ıvel menores, um dos quais ´ semelhante ao problema inicial. e 44
  • 45. Ex.: Fatorial. n! = n × (n − 1) × (n − 2) · · · 3 × 2 × 1 Uma forma recursiva de definir o fatorial ´: e fat(n) = 1 n=0∨n=1 (Base) fat(n) = n × fat(n − 1) n1 (Passo recursivo) Outro ex.: A soma dos n´meros de 1 a n pode ser definida de forma u recursiva como: soma(1) = 1 soma(n) = n + soma(n − 1) n1 A soma dos n´meros ´ u ımpares de 1 a n pode ser definida de forma recursiva por:   somaimp(1) = 1  somaimp(n) = somaimp(n − 1) n par ∧ n 1   somaimp(n) = n + somaimp(n − 2) n impar ∧ n 2 Algoritmo da fun¸ao fatorial definida recursivamente: c˜ Fun¸~o num´rico fatorial(n num´rico) ca e e Se n=0 OU n=1 ent~o Retorna 1 a sen~o Retorna n*fatorial(n-1) a fim_se fim_fun¸~o ca A execu¸˜o desta fun¸˜o para uma chamada fatorial(3) ´ a mostrada ca ca e na Figura 6. Exerc.: Definir recursivamente a fun¸ao que devolve a soma dos n´meros c˜ u ´ ımpares de 1 a n. Exerc.: Definir recursivamente a fun¸ao que determina o n-´simo termo c˜ e da s´rie de fibonacci (veja a Tabela 8). e 45
  • 46. fatorial(3) 3 ∗ fatorial(2) /3×2=6 / 6 8 qqq qqq qqq qqq 2 ∗ fatorial(1) /2×1=2 6 mmmmm mmmmm mmm fatorial(1) = 1 Figura 6: Execu¸ao de fatorial(3) c˜ n fibonacci(n) 0 0 1 1 2 1 3 2 4 3 5 5 6 8 . . . . . . Tabela 8: Tabela do Fibonacci 46
  • 47. Solu¸˜o: ca Fun¸~o num´rico fibonacci(n num´rico) ca e e Se n=0 OU n=1 ent~o Retorna n a sen~o Retorna fibonacci(n-1)+fibonacci(n-2) a fim_se fim_fun¸~o ca Exerc.: Considere uma seq¨ˆncia de n´meros onde cada termo ´ dado pela ue u e combina¸˜o dos 4 termos anteriores An = An−4 +2×An−3 +3×An−2 +4×An−1 ca e os 4 primeiros termos s˜o por defini¸ao: a c˜ A1 = 1 A2 = 2 A3 = 3 A4 = 4 Escreva uma fun¸˜o recursiva SEQ que receba um n´mero n e retorne o ca u termo An . Solu¸˜o: ca Fun¸~o num´rico seq(n num´rico) ca e e Se n=4 ent~o Retorna n a sen~o Retorna seq(n-4)+2*seq(n-3)+3*seq(n-2)+4*seq(n-1) a fim_se fim_fun¸~o ca Exerc.: Dois n´meros s˜o amigos entre si, se a soma dos divisores de cada u a um deles ´ igual ao outro. Exemplo, 220 e 284: e Divisores de 220 Divisores de 284 1 1 2 2 4 4 5 71 10 142 11 Soma 220 20 22 44 55 110 Soma 284 47
  • 48. Fa¸a um algoritmo que leia dois n´meros e verifique se s˜o amigos. c u a Solu¸˜o: ca Algoritmo Declare a,b num´rico e { declara¸ao de fun¸oes } c~ c~ Leia a,b Se a=soma(b) E b=soma(a) entao Escreva ’S~o amigos’ a sen~o Escreva ’N~o s~o amigos’ a a a fim_se fim_algoritmo Fun¸oes com solu¸ao n˜o recursiva: c˜ c˜ a Fun¸~o num´rico soma(n num´rico) ca e e Declare aux,ind num´rico e ind := 1 aux := 0 Repita Se resto(n,ind)=0 ent~o aux := aux+ind a fim_se ind := ind+1 at´ ind=n e Retorna aux fim_fun¸~o ca Solu¸˜o recursiva (chamar soma(n,n-1)): ca Fun¸~o num´rico soma(num,cont num´rico) ca e e Se cont=1 ent~o Retorna 1 a sen~o a Se RESTO(num,cont)=0 ent~o Retorna cont+soma(num,cont-1) a sen~o Retorna soma(num,cont-1) a fim_se fim_se fim_fun¸~o ca 48
  • 49. A B C Figura 7: Torre de Hanoi Exemplo: Torre de Hanoi (objetivo ´ mover os trˆs discos de A para C, e e movendo um por vez e sem nunca colocar um disco maior sobre um menor; veja Figura 7). Mover 3 discos de A para C= Mover 2 discos de A para B= Mover 1 de A para C Mover 1 de A para B Mover 1 de C para B Mover 1 disco de A para C= Mover 1 de A para C Mover 2 discos de B para C= Mover 1 de B para A Mover 1 de B para C Mover 1 de A para C Solu¸˜o (chamar move(3,1,3,2)): ca Sub-rotina move(num,origem,destino,interm num´rico) e Se num=1 ent~o Escreva ’move de ’,origem,’ para ’,destino a sen~o a move(num-1,origem,interm,destino) move(1,origem,destino,interm) move(num-1,interm,destino,origem) 49
  • 50. fim_se fim_sub-rotina Outros problemas interessantes que podem ser resolvidos recursivamente: O problema do cavalo Mover o cavalo por todas as casas do tabuleiro sem ocupar nunca duas vezes a mesma casa come¸ando em qualquer casa; c O problema das oito rainhas Colocar oito rainhas em um tabuleiro sem que nenhuma ataque a outra. 11 Algoritmos de Ordena¸˜o ca Os algoritmos de ordena¸˜o (ou classifica¸˜o) permitem ordenar os dados em ca ca alguma ordem (crescente ou decrescente). Podem ser aplicados sobre dados num´ricos ou alfab´ticos (neste caso deve-se associar uma ordem entre os e e simbolos alfab´ticos). e 11.1 BUBLE SORT ´ E um tipo de algoritmo de ordena¸ao por troca com tempo de ordena¸ao c˜ c˜ 2 proporcional a O(N ) trocas. 10 19 13 12 7 . 10 13 12 7 . 19 10 12 7 . 13 19 10 7 . 12 13 19 7 . 10 12 13 19 11.2 ¸˜ SELECAO DIRETA ´ E um tipo de algoritmo de ordena¸ao por sele¸˜o com tempo de ordena¸˜o c˜ ca ca 2 proporcional a O(N ) compara¸˜es. co . 10 19 13 12 7 7 . 19 13 12 10 7 10 . 13 12 19 7 10 12 . 13 19 7 10 12 13 . 19 50
  • 51. Implementa¸ao: c˜ Sub-rotina selec(vet(),inic,fim num´rico) e Declare elem,pos num´rico e Se inicfim ent~o a pos := menor(vet,inic,fim) elem := vet(pos) vet(pos) := vet(inic) vet(inic) := elem selec(vet,inic+1,fim) fim_se fim_sub-rotina e menor ´ uma fun¸˜o que encontra o menor elemento e devolve seu ´ e ca ındice na matriz. Exerc´ıcio: Reescrever esta sub-rotina usando listas. Escrever tamb´m a e fun¸ao menor para este caso. c˜ Exerc´ıcio: Implementar o Buble Sort. 11.3 QUICK SORT ´ E um tipo de algoritmo de ordena¸ao por troca e parti¸˜o com tempo de or- c˜ ca dena¸ao proporcional a O(n log2 n). Baseia-se no princ´ que ´ mais r´pido c˜ ıpio e a ordenar dois vetores de n/2 elementos do que um vetor com n elementos. Baseia-se em um algoritmo que particiona o vetor em dois, o primeiro dos valores menores e um segundo dos valores maiores que um elemento de compara¸ao. O elemento de compara¸ao ´, normalmente, o primeiro ele- c˜ c˜ e mento do vetor. Depois o algoritmo ´ repetido para as duas partes, obtendo e a ordena¸ao completa. c˜ O particionador come¸a em ambas as extremidades do vetor efetuando c trocas para colocar os elementos menores e maiores que o de compara¸ao em c˜ seus lugares. Exemplo de particionamento: 51
  • 52. 60 83 25 98 94 36 99 73 45 15 22 10 10 60 60 83 22 60 60 98 15 60 60 94 45 60 60 99 10 22 25 15 45 36 60 73 99 94 98 83 Algoritmo: Sub-rotina quick(CR x lista) Declare elem num´rico e Declare x1,x2 lista { fun¸ao concat } c~ { sub-rotina partic } Se TAM(x)1 partic(x,x1,elem,x2) quick(x1) quick(x2) x := concat(x1,CONS(elem,x2)) fim_se fim_sub-rotina Fun¸ao concat: c˜ Fun¸~o concat(x1,x2 lista) lista ca Se NIL(x1) ent~o a Retorna x2 sen~o a Retorna CONS(CAR(x1),concat(CDR(x1),x2)) fim_se fim_fun¸~o ca 52
  • 53. Fun¸oes auxiliares de partic: c˜ Fun¸~o adiciona_final(l lista, e num´rico) lista ca e Se NIL(l) ent~o a Retorna CONS(e,nil) sen~o a Retorna CONS(CAR(l),adicional_final(CDR(l),e)) fim_fun¸~o ca Fun¸~o retira_ultimo(l lista) lista ca Se NIL(CDR(l)) ent~o a Retorna nil sen~o a Retorna CONS(CAR(l),retira_ultimo(CDR(l))) fim_se fim_fun¸~o ca Particionador: 53
  • 54. sub-rotina partic(x lista, CR x1 lista, CR elem num´rico, e CR x2 lista) Declare esq l´gico o { fun¸oes auxiliares } c~ elem := x(0) x := CDR(x) esq := verdadeiro x1 := nil x2 := nil Enquanto N~o NIL(x) a fa¸a c Se esq ent~o a Se elemx(TAM(x)-1) ent~o a x1 := concat(x1,CONS(x(TAM(x)-1),nil)) x := retira_ultimo(x) esq := falso sen~o a x2 := CONS(x(TAM(x)-1),x2) x := retira_ultimo(x) fim_se sen~o a Se elemx(0) ent~o a x2 := CONS(x(0),x2) x := CDR(x) esq := verdadeiro sen~o a x1 := adiciona_final(x1,x(0)) x := CDR(x) fim_se fim_se fim_enquanto fim_sub-rotina 54
  • 55. 12 Programa¸˜o Funcional ca Com os recursos de manipula¸ao de listas que j´ temos em nossa linguagem e c˜ a com alguns outros recursos podemos implementar programa¸˜o funcional em ca nossa linguagem. Programa¸ao funcional ´ um paradigma de programa¸ao c˜ e c˜ em que as principais entidades s˜o fun¸˜es e listas. Programa¸ao funcio- a co c˜ nal se baseia na avalia¸ao de express˜es simb´licas. Este paradigma est´ c˜ o o a plenamente representado na linguagem de programa¸˜o LISP. ca Algumas caracter´ısticas de programa¸ao funcional pura: c˜ • N˜o existe declara¸ao de tipos. Todos os dados s˜o dinˆmicos e a a c˜ a a linguagem efetua convers˜es de tipo impl´ o ıcitas; • Homogeneidade das estruturas; • N˜o h´ la¸os de repeti¸ao, apenas recursividade; a a c c˜ • Baseado em nota¸˜o-λ (fun¸oes-λ). ca c˜ A estrutura b´sica de programa¸ao funcional ´ o ´tomo que pode ser a c˜ e a num´rico ou literal (embora n˜o precise ser declarado como tal). Um par e a de elementos com lado esquerdo (CAR) e lado direito (CDR) ´ chamado e express˜o-S. A fun¸ao CONS serve para construir express˜es-S. a c˜ o 12.1 Declara¸˜o de Fun¸˜es Lambda ca co Para declarar uma fun¸ao lambda: c˜ Fun¸~o lambda nome’(’lista de par^metros’)’ ’(’ {defini¸ao} ’)’ ca a c~ Ex: Fun¸~o lambda cuder(x)(CDR(x)) ca Observe que n˜o ´ necess´rio declarar nenhum tipo de dado. a e a 12.2 Estruturas de Programa¸˜o Funcional ca Substituindo a estrutura “Se-ent˜o-sen˜o” tradicional, existe uma fun¸˜o a a ca COND, que recebe trˆs argumentos: e COND(condi¸~o,fun¸ao 1,fun¸~o 2) ca c~ ca 55