Transcript
Algoritmos e Estruturas de Dados
Introdução aos Algoritmos
Prof. Patrick Pedreira
Sumário ❖ Definiç Definição de algoritmos ❖ Linguagem de programaç programação ❖ Linguagem estruturada ❖ Elaboraç Elaboração de programas
1
Conceito de Problema
Conceito de Problema ❖ Problema (Dicionário Michaelis): ◗ Substantivo Masculino. ◗ Questão matemática proposta para ser resolvida. ◗ Questão difícil, delicada, suscetível de diversas soluções. ◗ Qualquer coisa de difícil explicação; mistério, enigma. ◗ Dúvida, questão.
2
Exemplos de Problemas ❖ Problemas fazem parte do nosso cotidiano. ❖ Exemplo de problemas cotidianos: ◗ Trocar a resistência de um chuveiro. ◗ Definir onde Almoçar. ◗ Trocar o pneu de um carro
❖ Sempre que nos deparamos com um problema buscamos um procedimento para solucionar o mesmo.
Exemplos de Solução ❖ Por exemplo, para trocar a resistência de um chuveiro devemos: ◗ Adquirir uma resistência nova; ◗ Localizar o chuveiro a ser manipulado; ◗ Abrir o chuveiro; ◗ Retirar a resistência defeituosa; ◗ Colocar a resistência nova; ◗ Fechar o chuveiro; ◗ Descartar a resistência defeituosa.
❖ Definir onde Almoçar. ❖ ...
3
Conceitos de Lógica ❖ O que orientou a obtenção dos procedimentos para as soluções vislumbradas? ◗ A lógica.
❖ O que é lógica? ◗ A lógica é o ramo da Filosofia e da Matemática que estuda os métodos e princípios que permitem fazer distinção entre raciocínios válidos e não válidos, determinando o processo que leva ao conhecimento verdadeiro.
Conceitos de Lógica ❖ O uso da lógica é primordial na solução de problemas. Com ela é possível alcançar objetivos com eficiência e eficácia. ❖ Ninguém ensina outra pessoa a pensar, mas a desenvolver e aperfeiçoar esta técnica, com persistência e constância.
4
Conceito de Algoritmo ❖ Ao utilizarmos a lógica para listar passos ordenados que resultam na solução de um determinado problema estamos construindo um algoritmo. ❖ Contrapondo o que normalmente se imagina, o termo algoritmo não foi originado na computação e muito menos pode ser utilizado apenas no contexto computacional. ❖ Podemos definir um algoritmo como: ◗ uma seqüência de passos que visa atingir um objetivo bem definido; ◗ uma seqüência de passos bem definida que deve ser seguida para a realização de uma tarefa ou solução de um problema em. ◗ Descriç Descrição de um conjunto finito de comandos para a soluç solução de um problema em um tempo finito
Exemplos de Algoritmos ❖ Como vimos os conceitos de algoritmo são bem amplos, é importante salientar que qualquer tarefa que siga determinado padrão pode ser descrita por um algoritmo, como por exemplo:
5
Algoritmo – Exemplo :: Trocar o pneu de um carro
Algoritmo – Exemplo :: Trocar o pneu de um carro 1. Desparafusar a roda.
6
Algoritmo – Exemplo :: Trocar o pneu de um carro 2. Suspender o carro com um macaco.
Algoritmo – Exemplo :: Trocar o pneu de um carro 3. Retirar a roda com o pneu furado.
7
Algoritmo – Exemplo :: Trocar o pneu de um carro 4. Colocar o step. step.
Algoritmo – Exemplo :: Trocar o pneu de um carro 5. Abaixar o carro.
8
Algoritmo – Exemplo :: Trocar o pneu de um carro 6. Parafusar a roda.
Algoritmo – Exemplo :: Trocar o pneu de um carro ❖ Note ❖ 1. Pré-suposições do algoritmo ❖
Existem operações que você já sabe fazer, que podem ser básicas ou mais elaboradas.
❖ 2. Nível de detalhamento ❖ ❖
PASSO 2: Instalar o macaco e levantar o carro do lado do pneu a ser trocado. 1. Tire o macaco da mala.
❖
2. Instale o macaco sob o carro próximo ao pneu a ser trocado.
❖
3. Se o carro está em local ladeiroso, colocar um suporte de madeira para evitar que ele se mova.
❖
4. Alavanque o macaco até que haja espaço para o pneu estepe entrar.
9
Algoritmo – Mais Exemplos ❖ Pegar um ônibus para a UESB. ❖ Fazer um bolo. ❖ Fazer um barco de papel.
Algoritmo – Propriedades ❖ Possui um estado inicial ❖ Possui seqü seqüência ló lógica ❖ Conté Contém ações claras e precisas ❖ Possui dados de entrada ❖ Produz estado final previsí previsível ❖ Deve ser eficaz
10
Algoritmos Computacionais ❖ Entrada: Dados inicialmente conhecidos, os quais permitem encontrar a solução do problema. ❖ Saída: Resultado obtido pelo processamento de uma entrada específica (instância).
Entrada
Algoritmo
Saída
Definição alternativa de Algoritmo Computacional: Procedimento que transforma dados em informação. Método usado por um computador para resolver um problema
Algoritmo – Fluxo Entrada
Seqü Seqüência Ló Lógica
Saí Saída
11
Algoritmo – Fluxo Raio R de uma circunferência
P=2*π*R Perímetro P da circunferência
Por que estudar algoritmos? ❖ Razões práticas e teóricas ◗ Devemos conhecer um conjunto de algoritmos de diferentes áreas ◗ Devemos ser capazes de projetar novos algoritmos e medirmos sua eficiência ◗ O estudo de algoritmos é reconhecidamente a pedra fundamental da ciência da computaç computação
12
Por que estudar algoritmos? Algoritmos é muito mais que um ramo da ciência da computação. É o núcleo da ciência da computação e, com toda a imparcialidade, pode ser considerado relevante para a maioria das ciências, negócios e tecnologia. David Harel
Algoritmos Computacionais ❖ Um algoritmo deve satisfazer os seguintes crité critérios: ◗ Entrada: uma ou mais quantidades são fornecidas externamente ◗ Saí Saída: Ao menos uma quantidade é produzida ◗ Certeza: Cada instruç instrução é clara e não ambí ambígua ◗ Finito: Se seguirmos as instruç instruções de um algoritmo, então, para todos os casos, o algoritmo termina apó após um nú número finito de passos. ◗ Efetividade: Cada instruç instrução deve ser simples o suficiente de modo a permitir que uma pessoa utilizando somente lá lápis e papel realize– realize–o.
13
Algoritmos Computacionais ❖ Em resumo: ◗ Técnicas especí específicas de projeto de algoritmos podem ser interpretadas como estraté estratégias para a resoluç resolução de problemas que podem ser úteis, estando ou não um computador envolvido. ◗ Atenç Atenção!!! ão!!! Nem todos os problemas podem ser resolvidos por algoritmos. Ex. Como se tornar rico e famoso
Sumário ❖ Definiç Definição de algoritmos ❖ Linguagem de programaç programação ❖ Linguagem estruturada ❖ Elaboraç Elaboração de programas
14
Programa ❖ 1. Arquitetura do Computador ◗ Programa é executado sobre a arquitetura do computador ◗ Historicamente utilizamos linguagens de programaç programação considerando de má máquinas de von Neumann. ◗ Últimos 40 anos: imensa maioria das linguagens de programaç programação foi projetada em funç função da arquitetura Von Neumann
Programas Modelo da arquitetura de Von Newmann
MEMÓRIA resultados (“piped”)
GARGALO de Von Newmann
Execução de código numa máquina Von Newmann: ciclo “busca-executa” Programas: residem na memória mas são executados na CPU (cada instrução é transferida da memória para o processador) Endereço da próxima instrução: mantido num registro chamado “program counter”
instruções e dados (“piped”)
ULA
UC
Unidade Ló Lógico Aritmé Aritmética
Unidade de Controle
E/S
CPU
15
Programas EXECUÇ EXECUÇÃO ❖ inicialize o program counter ❖ repeat forever ◗ Fetch (busca) ◗ Decode (decodifica) ◗ Execute (executa)
Programa ❖ Programa é a codificaç codificação de um algoritmo em uma linguagem de programaç programação. ❖ Um computador é uma má máquina que, a partir de uma entrada, entrada, realiza um nú número de cálculos matemá matemáticos e ló lógicos, gerando uma saí saída. da. ❖ Programa é o elemento que diz ao computador quais cá cálculos devem ser realizados. ◗ Um programa nada mais é do que um tipo de algoritmos ◗ Sua particularidade é que suas operaç operações são especí específicas para o computador e restritas ao conjunto de instruç instruções que o processador pode executar ◗ Podemos considerar esse conjunto de intruç intruções como a primeira linguagem de programaç programação do computador, també também chamada de linguagem de má máquina.
16
Algoritmo × Linguagem de Programação
Raciocínio
Algoritmo
int a, b, c; if (a > 2) a = b + c; else a = b – c; return;
Programa
Linguagem de programação ❖ Estabelece regras de sintaxe para que o algoritmo possa ser entendido por uma máquina. ❖ Classificamos as linguagens de programaç programação segundo sua proximidade com a linguagem de máquina ◗ Quanto maior a semelhanç semelhança com a linguagem de máquina, mais baixo é o ní nível da linguagem Linguagens de baixo ní nível Linguagens de alto ní nível
17
Linguagem de programação ❖ A linguagem de programaç programação que o computador é capaz de entender é formada simplesmente por nú números ◗ Assim, fazer algoritmos na linguagem de programaç programação do computador ou em sua linguagem de má máquina é um processo extremamente complicado para nó nós humanos ◗ Foi necessá necessária a criaç criação de um có código que relacionasse a linguagem de má máquina a uma linguagem mais fá á cil de ser compreendida f A ling. de montagem (ou assembly) assembly) é um có código que tem uma instruç instrução alfanumé alfanumérica para cada instruç instrução numé numérica em ling. de má máquina.
Linguagem de programação ❖ Para que um programa escrito em linguagem de montagem possa ser executado é necessá necessário sua traduç tradução para có código de má máquina. ◗ Isso é feito por meio de um programa chamado assembler
❖ Linguagem de montagem é ainda muito pró próxima da ling. de má máquina ❖ Cada processador tem sua ling. de montagem ◗ Código tem que ser refeito se quisermos executar o programa em um processador não compatí compatível Nesse caso, tem um có código que não é portá portável
18
Linguagem de programação ❖ Para diminuir a complexidade, facilitar e aumentar a portabilidade foram criadas as ling. de alto ní nível ◗ São independentes do processador em que serão executadas ◗ Instruç Instruções pró próximas da ling. humana ◗ O processo de traduç tradução do có códigodigo-fonte para ling. de máquina é feito por um compilador
Métodos de Implementação ❖ Compilaç Compilação ❖ Interpretaç Interpretação Pura ❖ Sistemas hí híbridos
19
Métodos de Implementação ❖ 1. Compilaç Compilação ◗ Traduz programas de altoalto-nível em có código de máquina; ◗ Traduç Tradução vagarosa; ◗ Execuç Execução do programa muito rá rápida;
O processo de compilação Guarda infos sobre nomes declarados em um programa
Programa-fonte
alto nível
Analisador Léxico tokens
Separa em: identificadores, palavras especiais, operadores, sí símbolos de pontuaç pontuação
Analisador Sintático Estruturas hierárquicas: árvores sintáticas (parse trees)
Tabela de símbolos
Analisador Semântico Gerador de código intermediário Gerador de código ling. máquina - baixo nível
dados de entrada
Otimização cód. intermediário
Computador Resultados
20
Métodos de Implementação • 2. Interpretaç Interpretação Pura – Nenhuma traduç tradução; Programas são interpretados por outro programa (interpretador), sem conversão – Lida com as instruç instruções de alto ní nível sem convertêconvertê-las para ling. de má máquina – Interpretador = simulador de software, máquina virtual cujas instruç instruções são um programa em ling. alto ní nível – TornandoTornando-se raro.
• vantagem: facilidade de depuraç depuração, aponta erros diretamente no có códigodigofonte • desvantagem: lentidão ( 10 a 100x mais lenta); muito espaç espaço de memó memória • Exemplos: Linguagens de scripting, LISP...
Métodos de Implementação • 3. Implementaç Implementação Hí Híbrida – Traduç Tradução para linguagem intermé intermédia (ex.: Java, Perl); – Pequeno custo de traduç tradução; – Rapidez mé média de execuç execução;
• Implementaç Implementações de Java – código intermediá intermediário de Java = “código de bytes” bytes” independente de processador – portabilidade – cód. bytes + interpretador = Java Virtual Machine – hoje: traduç tradução do có cód. bytes p/ có cód. máquina – applets Java = são baixados em código de bytes
21
Sumário ❖ Revisão de algoritmos ❖ Linguagem de programaç programação ❖ Linguagem estruturada ❖ Elaboraç Elaboração de programas
O que é linguagem estruturada? ❖ É uma forma de programaç programação de computadores que preconiza que todos os programas possí possíveis podem ser reduzidos a apenas três estruturas: ◗ Seqü Seqüência ◗ Decisão ◗ Iteraç teração
22
Características ❖ Sua principal caracterí característica é a utilizaç utilização de blocos para soluç solução de um problema. ❖ Permite a utilizaç utilização combinada de subsub-rotinas compiladas separadamente, separadamente, sem que pertenç pertençam ao mesmo programa propriamente dito.
Formas de representação de algoritmos
23
Descrição Narrativa ❖ Conforme vimos até o momento a descrição narrativa em linguagem natural foi utilizada na descrição dos algoritmos. ❖ Qual a vantagem? ◗ Não há a necessidade de aprender nenhum novo conceito.
❖ Qual a desvantagem? ◗ Em virtude da ambigüidade presente na linguagem natural a descrição narrativa é passível de mais de uma interpretação.
Descrição Narrativa ❖ Um exemplo de ambigüidade presente em uma sentença na linguagem natural é: ◗ O policial escutou o barulho da porta.
❖ Esta frase pode ter pelo menos três interpretações: ◗ 1 - O policial escutou o barulho produzido pela porta. ◗ 2 - O policial estava junto à porta e escutou o barulho. ◗ 3 - O policial escutou o barulho que veio através da porta.
24
Métodos de Representação de Algoritmos ❖ Do ponto de vista computacional um algoritmo será implementado em uma linguagem de computação gerando um programa, o qual visa instruir um computador (uma máquina) a executar determinada tarefa. ❖ Devemos ter consciência que um computador não é dotado da capacidade de tomar decisões com base em premissas. ❖ Portanto, não podemos instruir um computador com sentenças dúbias.
Métodos de Representação de Algoritmos ❖ Sendo assim, consideraremos que um algoritmo é uma seqüência, que não permite ambigüidade, de passos finitos, passível de ser executada com um esforço finito em tempo finito e que acaba para qualquer entrada (inclusive erro). ❖ O algoritmo tem como papel fundamental ser o elo de ligação entre dois mundos (real e computacional). A atividade de programação tem início com a construção do algoritmo.
25
Funcionalidade do Algoritmo
Métodos de Representação de Algoritmos ❖ Contudo, quando falamos em algoritmo sob o enfoque computacional, como já foi mencionado, não podemos utilizar uma descrição narrativa para representar um algoritmo. ❖ Sendo assim, veremos dois métodos para representação de algoritmos: ◗ fluxograma – representação gráfica; ◗ pseudocódigo (português estruturado) – representação textual.
26
Métodos de Representação de Algoritmos ❖ Os métodos em questão impõem regras e disponibilizam um conjunto reduzido de palavras/símbolos passiveis de serem utilizados (rigidez sintática). O objetivo é obter uma consistência semântica para a eliminação da ambigüidade intrínseca à linguagem natural. ❖ Destacaremos agora uma vantagem e uma desvantagem de cara uma das formas, mencionadas, de representação de algoritmos.
Métodos de Representação de Algoritmos ❖ Fluxograma: ❖ Vantagem – a representação gráfica é mais concisa que a representação textual. ❖ Desvantagem – é necessário aprender a simbologia dos fluxogramas. ❖ Pseudocódigo: ❖ Vantagem – sua transcrição para qualquer linguagem de programação é quase que direta. ❖ Desvantagem – é necessário aprender as regras do pseudocódigo.
27
Métodos de Representação de Algoritmos ❖ Solução do problema de trocar a resistência de um chuveiro resolvido com um algoritmo representado em pseudocódigo. ❖ Conforme foi mencionado são impostas regras e é definido um número restrito de ações. Neste caso as ações disponíveis são: pegar, largar, abrir, fechar, retirar e colocar.
Métodos de Representação de Algoritmos ❖ Solução do problema de trocar a resistência de um chuveiro resolvido com um algoritmo representado em fluxograma. ❖ Conforme foi mencionado são impostas regras e é definido um número restrito de ações/símbolos. ❖ Neste caso as ações disponíveis e os símbolos a elas associados são:
28
Métodos de Representação de Algoritmos
Métodos de Representação de Algoritmos ❖ Pseudocódigo ◗ Poderámos representar algoritmos diretamente em linguagens de programação. Desvantagens: • Não é tão legível
Vantagens • Código pronto para execução (após compilação) • Rigidez sintática e semântica
◗ O pseudocódigo visa manter essas vantagens, tentando diminuir o ônus da ling. de programação Abre-se mão do código compilável Código menos rígido, menos dependente das peculiaridades dos compiladores
29
Métodos de Representação de Algoritmos ❖ Pseudocódigo ◗ Outra vantagem é a possibilidade de utilização do idioma nativo Maioria das ling. de prog. usam termos em inglês
◗ Porém ainda deve ser mantida rigidez semântica Ele é intermediário entre a ling. natural e a ling. de programação
◗ Um pseudocódigo bastante conhecido no Brasil é o Portugol Simples Rigidez mantida Usa o português Usaremos o Portugol com pequenas variações
Métodos de Representação de Algoritmos ❖ Pseudocódigo ◗ Exemplo: Algoritmo Maior var num1, num2, maior: inteiro; início leia(num1,num2); se(num1 > num2) então maior num1; senão maior num2; escreva(maior); fim
30
Sumário ❖ Revisão de algoritmos ❖ Linguagem de programaç programação ❖ Linguagem estruturada ❖ Elaboraç Elaboração de programas
Passos para elaboração de um programa 1. Compreender o problema. 2. Esboç Esboçar um procedimento para resolver o problema. 3. Formular o algoritmo. 4. Traduzir o algoritmo para uma linguagem de programaç programação (Codificaç (Codificação).
31
Passos para elaboração de um programa :: Exemplo ❖ Calcular as raí raízes reais de:
ax 2 + bx + c
1. Compreender o problema ❖ Exemplo: Equaç Equação de 2o. grau ❖ Possibilidades de raí raízes:
02 raí raízes complexas; complexas;
02 raí raízes reais idênticas; idênticas;
02 raí raízes reais distintas; distintas;
❖ Condiç Condição para haver raí raízes reais: ∆ ≥ 0
32
2. Esboçar um procedimento para resolver o problema ❖ Calcular ∆. ❖ Se ∆ ≥ 0, calcular raí raízes reais. ❖ Caso contrá contrário, informar que não há há raí raízes reais.
3. Formular o algoritmo ler(a,b,c) ler(a,b,c) delta = b^2 – 4*a*c se (delta ≥ 0) então r1 = – b – (delta)^(– (delta)^(–1/2) r2 = – b + (delta)^(– (delta)^(–1/2) escrever(r1,r2) escrever(r1,r2) senão escrever( escrever(“Não há há raiz real” real”) fim do se fim do algoritmo
33
4. Codificar #include #include #include int main(void main(void)) { float a, b, c, delta, r1, r2; scanf("%f scanf("%f %f %f" %f", &a, &b, &c); delta = b*b – 4*a*c; if (delta >= 0) { r1 = – b – sqrt(delta); sqrt(delta); r2 = – b + sqrt(delta); sqrt(delta); printf("r1 printf("r1 = %f \n r2 = %f", %f", r1, r2); } else printf("Nao printf("Nao ha raiz real\ real\n"); n"); }
Gerando um programa executável ❖ Passos necessá necessários para gerar um programa executá executável: A. Codificaç Codificação B. Geraç Geração de Có Código Objeto C. Linkagem D. Depuraç Depuração (debug)
34
Gerando um programa executável Codificação
Código fonte
Depuração
Geração de código objeto Código objeto
Bibliotecas Linkagem
Programa Executável
Gerando um programa executável A. Codificação ❖ É a escrita de um programa de acordo com uma linguagem de programaç programação. ❖ Utiliza Editores de Texto. Texto. ❖ Resultado: códigodigo-fonte. fonte.
35
Gerando um programa executável B. Geração de código-objeto ❖ Traduç Tradução do có códigodigo-fonte para o có código de máquina do processador. ❖ Realizado pelos Compiladores. Compiladores. ❖ Resultado: códigodigo-objeto. objeto.
Gerando um programa executável C. Linkagem ❖ Rearranja o có código do programa ❖ Incorpora as partes referenciadas no có código original (obtidas de uma biblioteca). biblioteca). ❖ Realizada pelos Ligadores. Ligadores. ❖ Resultado: código executá executável pelo processador.
36
Gerando um programa executável D. Depuração (debug) ❖ Auxilia o programador a eliminar erros dos programas (“ (“bugs” bugs”). ❖ Permite:
execuç execução passopasso-a-passo. passo. visualizaç visualização do estado do programa atravé através das variá á veis. vari
Dúvidas
37