You are on page 1of 42

Lógica de programação

Prof. Jonas de Araújo Luz Junior


jonasluz@gmail.com

Resolvendo problemas e
Linguagens de Programação
As Torres de Hanói

● Objetivo: passar todos os discos para outra haste.


● Regras [1]:
– mover apenas um disco por vez;
– pode-se mover apenas o disco do topo de cada haste;
– nenhum disco pode ser posto sobre um disco menor.
As Torres de Hanói
● A solução ótima para o caso de três discos:
1. A → B;
2. A → C;
3. B → C;
4. A → B;
5. C → A;
6. C → B;
7. A → B.
As Torres de Hanói
● Para 3 discos, foram necessários 7 passos.
– São possíveis outras soluções, mas a solução dada é a
com o menor número de passos – solução ótima.
● Para n discos:
n
hn=2 −1

● Seria possível a construção de um algoritmo para


a resolução do problema das Torres de Hanói
para n discos?
Resolvendo problemas [2]
● Análise e síntese de problemas:
– Análise: Entendimento do problema, por meio de sua
quebra em partes menores. Envolve:
● levantamento dos dados necessários e condições para
solução do problema, verificando-se se estes dados e
condições são necessários, redundantes ou insuficientes;
● Modelagem do problema por meio de diagramas, gráficos,
desenhos e equações.
● Através de processos de abstração, define-se um plano de
ação para a solução do problema.
Resolvendo problemas
● Análise e síntese de problemas:
– Síntese: especificação formal do problema e de sua
solução. Envolve:
● modelagem do plano de ação definido na análise;
● validação da solução modelada através de testes sobre os
algoritmos;
● no caso da existência de erros, estes são corrigidos e o
processo é repetido até que se obtenha a solução ótima.
Resolvendo problemas
● Modelagem de problemas e soluções:
– Representação formal da abstração teórica de um
problema e de sua solução, pela caracterização de das
propriedades e da forma como estas se relacionam.
– Em matemática, a modelagem é feita por meio da
linguagem matemática (simbólica).
– No desenvolvimento de software, a modelagem é feita
por meio de diagramas e algoritmos.
● A Unified Modeling Language (UML) se propõe a
padronizar os diagramas usados em modelagem.
Resolvendo problemas
● Dicas para análise e síntese de problemas:
– Formalizar o objetivo (o que se deseja obter).
– Levantar os dados e condições necessários e
suficientes para a resolução.
– Verificar a existência destes dados e condições.
– Relacionar os dados e condições.
– Se possível, fazer uma modelagem matemática.
Resolvendo problemas
● Dicas para análise e síntese de problemas:
– Verificar em sua experiência se já resolveu problemas
semelhantes. A nova solução pode ser achada por:
● analogia: quando apesar de enunciados semelhantes, os
problemas (o já resolvido e o novo) guardam semelhanças
entre suas estruturas.
● generalização: quando a partir de soluções particulares,
pode se estabelecer uma solução geral.
● especialização: quando o novo problema pode ser
caracterizado como um caso específico de um problema
geral cuja solução já se conhece.
Resolvendo problemas
● Dicas para análise e síntese de problemas:
– Verificar se há necessidade de se introduzir algum
elemento novo no problema, como um problema
auxiliar.
– Para problemas complexos, tentar quebrá-lo em
problemas menores para solucioná-los (abordagem
top-down).
– Tente visualizar o problema por diferentes
abordagens, procurando uma que lhe dê o melhor
entendimento.
Resolvendo problemas
● Dicas para a modelagem da solução:
– Formalizar a solução por meio de diagramas e
algoritmos.
– Certificar-se de que cada passo dos algoritmos é
inequívoco e correto.
– Testar a lógica dos algoritmos, submetendo-os a casos
conhecidos do problema.
– Otimizar a solução, tentando reduzir o número de
passos ou dados, até encontrar uma solução ótima.
– Repetir os testes dos algoritmos até sua validação.
Exercício
● Escrever uma solução genérica do problema das
Torres de Hanói para n discos.
Linguagens de programação
● Revendo: um programa de computador ou
software é um conjunto de instruções e dados a
serem executados pelo computador a fim de
cumprir certo objetivo.
– Os programas são construídos em uma linguagem de
programação e modelados por meios de algoritmos.
– Existem diversas linguagens de programação com
diversas aplicabilidades.
● Por isso, os fundamentos de lógica de programação são
estudados em uma pseudolinguagem.
Linguagens de programação
● Uma linguagem de programação [1 e 4] é uma
linguagem artificial que pode ser usada para
constrolar o comportamento de uma máquina,
especificamente, um computador. É definida por
um conjunto de regras sintáticas e semânticas.
– Muitas têm suas regras definidas por alguma forma
escrita e formal. Outras têm as regras definidas apenas
por uma implementação formal.
Linguagens de programação
● Paradigmas de programação [3 e 4]
– “Um paradigma é um conjunto de regras que
estabelecem fronteiras e descrevem como resolver os
problemas dentro dessas fronteiras. (...)”.
Daniel C. Morris e Joel S. Brandon (in [3]).
– “Um paradigma de programação fornece e determina
a visão que o programador possui sobre a estruturação
de um programa.” [4].
Linguagens de programação
● Paradigmas de programação [4]
– Programação linear: trata a programação de forma
imperativa, usando três estruturas básicas: seqüência,
decisão e iteração. O programa corresponde a uma
única sequência de passos executada do começo ao
fim, mas o fluxo podia ser desviado por meio de
comandos do tipo goto.
● Exemplos históricos: BASIC, Fortran.
As Torres de Hanói em BASIC
1  REM * The Towers Of Hanoi
2  REM * BASIC
3  REM * Copyright (C) 1998 Amit Singh. All Rights Reserved.
4  REM * http://hanoi.kernelthread.com
5  REM * Tested under Chipmunk BASIC 1.0, Microsoft QBasic 1.1
6  REM ­­­ S is the stack
10 DIM S(4096)
15 REM ­­­ b is the stack pointer
20 b = 1
25 REM ­­­ _sfTO
30 t = 2
35 REM ­­­ _sfFR
40 f = 0
45 REM ­­­ _sfUS
50 u = 1
55 REM ­­­ _sfNU
60 n = 3
65 REM ­­­ _sfEN
As Torres de Hanói em BASIC
70 e = 0
75 REM ­­­ remain
80 m = 0
85 REM ­­­ the stack variable
90 INPUT "Number of disks (0 < disks < 10)"; v
91 IF v>0 AND v<10 THEN GOTO 100 ELSE GOTO 92
92 PRINT "Illegal number of disks"
93 GOTO 90
95 REM ­­­ PUSH N (=v here)
100 GOSUB 2000
110 v = 1
120 GOSUB 2000
130 v = 3
140 GOSUB 2000
150 v = 0
160 GOSUB 2000
170 WHILE b > 1
180 GOSUB 3000
190 e = v
As Torres de Hanói em BASIC
200 GOSUB 3000
210 t = v
220 GOSUB 3000
230 f = v
240 GOSUB 3000
250 n = v
260 m = 6 ­ f ­ t
270 IF e <> 0 THEN GOTO 280 ELSE GOTO 380
280 GOSUB 4000
290 v = n ­ 1
300 GOSUB 2000
310 v = m
320 GOSUB 2000
330 v = t
340 GOSUB 2000
350 v = 0
360 GOSUB 2000
370 GOTO 570
As Torres de Hanói em BASIC
380 IF n <> 1 THEN GOTO 390 ELSE GOTO 560
390 v = n
400 GOSUB 2000
410 v = f
420 GOSUB 2000
430 v = t
440 GOSUB 2000
450 v = 1
460 GOSUB 2000
470 v = n ­ 1
480 GOSUB 2000
490 v = f
500 GOSUB 2000
510 v = m
520 GOSUB 2000
530 v = 0
540 GOSUB 2000
550 GOTO 570
560 GOSUB 4000
As Torres de Hanói em BASIC
570 WEND
580 END

1999 REM ­­­ procedure push(v)
2000 S(b) = v
2010 b = b + 1
2020 RETURN

2999 REM ­­­ procedure pop()
3000 IF b = 0 THEN GOTO 3030 ELSE GOTO 3010
3010 b = b ­ 1
3020 v = S(b)
3030 RETURN

3999 REM ­­­ procedure movedisk(from, to)
4000 PRINT USING "move # ­­> #"; f; t;
4010 PRINT ""
4020 RETURN
Linguagens de programação
● Paradigmas de programação
– Programação procedural ou estruturada: Evoluída da
programação linear, mas permite a divisão do código
em procedimentos, que são blocos de instruções.
● Exemplos: C e Pascal.
As Torres de Hanói em Pascal
(* The Towers Of Hanoi                                 *)
(* Pascal                                              *)
(* Copyright (C) 1998 Amit Singh. All Rights Reserved. *)
(* http://hanoi.kernelthread.com                       *)
(*                                                     *)
(* Tested under p2c and the GNU Pascal compiler        *)

PROGRAM Hanoi(input, output);

VAR N:integer;

PROCEDURE dohanoi(N, Tfrom, Tto, Tusing : integer);
  BEGIN
    if N > 0 THEN
    BEGIN
      dohanoi(N­1, Tfrom, Tusing, Tto);
      writeln('move ', Tfrom:1, ' ­­> ', Tto:1);
      dohanoi(N­1, Tusing, Tto, Tfrom);
    END
  END;
As Torres de Hanói em Pascal
BEGIN
  write('N = ? ');
  readln(N);
  writeln;
  dohanoi(N, 1, 3, 2)
END.
Linguagens de programação
● Paradigmas de programação
– Programação funcional: trata a programação como
uma avaliação de funções matemáticas, e que evita
estados ou dados mutáveis. Enfatiza a aplicação de
funções, em contraste com a programação imperativa,
que enfatiza mudanças no estado do programa.
● Exemplo principal: Haskell.
As Torres de Hanói em Haskell
­­
­­ The Towers Of Hanoi
­­ Haskell
­­ Copyright (C) 1998 Amit Singh. All Rights Reserved.
­­ http://hanoi.kernelthread.com
­­

dohanoi(0, _, _, _) = []

dohanoi(n, from, to, using) = 
    dohanoi(n ­ 1, from, using, to) ++
        [(from, to)] ++
        dohanoi(n ­ 1, using, to, from)

hanoi(n) = dohanoi(n, 1, 3, 2)
Linguagens de programação
● Paradigmas de programação
– Programação orientada a objetos: usa “objetos” e suas
interações para a construção das aplicações e
programas de computador. Não era muito popular até
a década de 90. Hoje, muitas linguagens modernas
suportam orientação a objetos (OO).
● Exemplos: Smalltalk, C++, Java.
As Torres de Hanói em Java
/*
 * The Towers Of Hanoi
 * Java
 * Copyright (C) 1999 Amit Singh. All Rights Reserved.
 * http://hanoi.kernelthread.com
 *
 * Tested under Linux jdk­1.1.?
 */

class hanoi
{
  public static void main (String args[])
  {
    if (args.length != 1) {
      System.err.println(
"error: a single integer argument needed");
      System.exit(1);
    }
    Integer N = new Integer(args[0]);
    H_dohanoi(N.intValue(), 3, 1, 2);
As Torres de Hanói em Java
    System.exit(0);
  }

  static void H_dohanoi(int n, int t, int f, int u)
  {
    if (n > 0) {
      H_dohanoi(n­1, u, f, t);
      H_moveit(f, t);
      H_dohanoi(n­1, t, u, f);
    }
  }

  static void H_moveit(int from, int to)
  {
    System.out.print("move ");
    System.out.print(from);
    System.out.print(" ­­> ");
    System.out.println(to);
  }
}
Linguagens de Programação
● Tradução de código
– Como é possível haver tantas linguagens de
programação? Como podem se criar novas linguagens
sem que se alterem as máquinas (os computadores)?
Linguagens de Programação
● Tradução de código
– Como é possível haver tantas linguagens de
programação? Como podem se criar novas linguagens
sem que se alterem as máquinas (os computadores)?
● O computador entende apenas uma única linguagem, que
depende de seu micro-processador: a chamada linguagem
de máquina, classificada como de “baixo nível”.
– Todo computador possui um conjunto de instruções que seu
processador é capaz de executar – chamadas código de máquina –
que são representadas por um conjunto de bits, normalmente
limitados ao número de bits do registrador principal do
processador, limitação que se denomina palavra do computador.
Linguagens de Programação
● Tradução de código
– Como é possível haver tantas linguagens de
programação? Como podem se criar novas linguagens
sem que se alterem as máquinas (os computadores)?
● As linguagens de programação classificadas como de “alto
nível” - assim ditas por serem escritas com legibilidade
próxima à da linguagem natural e abstraírem características
do hardware – são, portanto, traduzidas para a linguagem
de máquina antes da execução do programa nelas escrito.
Linguagens de Programação
● Tradução de código
– Há duas formas básicas de tradução:
● Compilação: o programa é escrito na linguagem de alto
nível (o chamado código-fonte) e depois de pronto é
traduzido para a linguagem de máquina por um outro
programa chamado compilador, gerando um programa
executável, que pode então ser usado.
– Exemplos: C, C++, Pascal.
Linguagens de Programação
● Tradução de código
– Há duas formas básicas de tradução:
● Interpretação: o programa é escrito na linguagem de alto
nível (o chamado código-fonte) e é usado nesta forma. A
tradução ocorre durante a execução do programa, pelo
chamado interpretador, necessário, portanto, para o uso
do programa.
– Exemplos: BASIC, JavaScript.
Linguagens de Programação
● Tradução de código
– Algumas linguagens fazem uso das duas estratégias,
compilando para uma linguagem intermediária – o
bytecode – que, para ser usado, deverá ser
interpretado. Neste caso, o interpretador é chamado de
máquina virtual.
● Exemplos: Java e linguagens .NET.
Linguagens de Programação
● A pseudolinguagem Portugol
– Devido à grande quantidade e variedade de
linguagens de programação existentes (milhares de
linguagens e dialetos existem hoje e novas são criadas
a cada ano), e à existência de variadas especificidades
em cada linguagem, o ensino de lógica de
programação normalmente faz uso de uma
pseudolinguagem (ou linguagem algorítmica),
baseada na língua portuguesa, chamada Portugol.
Linguagens de Programação
● A pseudolinguagem Portugol
– Entretanto, pela dificuldade de se testarem os
algoritmos feitos em Portugol, surgiu a necessidade
de se implementarem interpretadores da linguagem,
dos quais citam-se dois:
● O PORTUGOL, desenvolvido por pesquisadores do
Instituto Politécnico de Tomar, da Escola Superior de
Tecnologia de Tomar, em Portugal.
– Sítio web: http://orion.ipt.pt/~manso/Portugol/
● O G-Portugol, desenvolvido pelo brasileiro Thiago Silva.
– Sítio web: http://gpt.berlios.de/site/
Resumo
● A solução de um problema passa por duas fases:
a análise e a síntese.
● Através da modelagem, formalizam-se as
representações abstratas do problema e de sua
solução.
● O dado é um valor representado no computador,
enquanto a informação é o significado atribuído a
este dado.
Resumo
● Linguagem de programação é uma linguagem
artificial formalmente definida que permite o
controle de uma máquina, especificamente, um
computador.
● Entre os principais paradigmas de programação,
estão: linear, procedural/estruturada, orientada a
objetos e funcional.
Resumo
● A tradução do código de alto-nível de um
programa para o código de máquina se dá de duas
formas possíveis: por compilação ou por
interpretação; havendo hoje uma tendência para o
uso das duas estratégias, com uso de bytecodes e
máquinas virtuais.
● O Portugol é uma pseudolinguagem, ou
linguagem algorítmica, utilizado para o ensino de
programação que favorece a língua portuguesa.
Bibliografia
(1) Wikipedia. Em: http://en.wikipedia.org
(2) SOUZA, Marco Antônio Furlan de et. al.
Algoritmo e Lógica de Programação.
São Paulo: Thomson Learning, 2005.
(3) PUGA, Sandra. Lógica de programação e
estruturas de dados com aplicações em Java.
São Paulo: Pearson Prentice-Hall, 2003.
(4) Wikipédia. Em: http://pt.wikipedia.org
Bibliografia
(5)GUIMARÃES / LAGES. Algoritmos e
Estruturas de Dados. 13ª Tiragem.
Rio de Janeiro: LTC, 1985.
(6) FORBELLONE, André Luiz /
EBERSPÄCHER, Henri Frederico. Lógica de
Programação. 3ª Edição.
São Paulo: Pearson Prentice-Hall, 2005.

You might also like