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

Aed 01

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

   EMBED


Share

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