Informática I Aula 14 http://www.ic.uff.br/~bianca/informatica1/ Aula 14 - 10/10/2007 1 Ementa • • • • • • • • • • • • • • Noções Básicas de Computação (Hardware, Software e Internet) HTML e Páginas Web Internet e a Web Javascript e páginas dinâmicas Números e expressões em Javascript Formulários em HTML Histórico dos Computadores Abstração e Definição de Funções Algoritmos e linguagens de programação Programação orientada a eventos Ciência da computação como disciplina Execução condicional Representação de dados Computação e sociedade Aula 14 - 10/10/2007 2 Algoritmos • Um algoritmo é uma seqüência finita e não ambígua de instruções para executar uma tarefa específica. • A programação de computadores pode ser vista como o processo de criar e implementar algoritmos que o computador seja capaz de executar. Aula 14 - 10/10/2007 3 Análise de algoritmos • Quando mais de um algoritmo existe para resolver um problema, é necessário determinar qual é o melhor. • O critério de “melhor” é subjetivo. – Algumas vezes queremos um algoritmo simples, de fácil entendimento. – Muitas vezes, estamos preocupados com o tempo de execução do algoritmo. Aula 14 - 10/10/2007 4 Exemplo • No algoritmo 1, perguntamos a cada pessoa sua idade e comparamos sua idade com a idade no papel. – Logo o tempo de execução é proporcional à quantidade de pessoas. – Se há 100 pessoas na fila e demoramos 5s para fazer a pergunta e comparação, então a execução do algoritmo demora 500s. – Se o número de pessoas sobe para 200, a execução demora 1000s. – Em geral, o tempo de execução será 5*N, onde N é o número de pessoas na sala. Aula 14 - 10/10/2007 5 Exemplo (cont.) • No algoritmo 2, fazemos várias comparações simultaneamente, o que economiza tempo. – O tempo de execução é proporcional ao número de rodadas do algoritmo e não ao número de pessoas. – A cada rodada, o número de pessoas é diminuído pela metade. • Se começamos com 8 pessoas, teremos 3 rodadas (8→4, 4→ 2, 2→1). • Se começamos com 16 pessoas, teremos 4 rodadas (16→8, 8→ 4, 4→ 2, 2→1). • Em geral, o número de rodadas será log2(N). • Logo, se demora 5s para fazer uma comparação, o tempo de execução será 5* log2(N). Aula 14 - 10/10/2007 6 Exemplo (cont.) • Como log2(N) cresce muito mais devagar do que N, o algoritmo 2 é muito mais rápido para valores de N grandes. Aula 14 - 10/10/2007 7 Representando o tempo de execução • Para representar o tempo de execução de um algoritmo em relação ao tamanho do problema, cientistas da computação usam a notação O (ordem). – Um algoritmo O(N) tem o tempo de execução proporcional ao tamanho N do problema. – Um algoritmo O(log(N)) tem o tempo de execução proporcional ao logaritmo do tamanho N do problema. Aula 14 - 10/10/2007 8 Algoritmos de busca • O problema de achar a pessoa mais velha é parecido com vários problemas que encontramos em programação. – Por exemplo, num banco de dados de uma loja contendo centenas de produtos queremos procurar um produto com alguma característica. • Algoritmos para esse tipo de problema são chamados de algoritmos de busca. Aula 14 - 10/10/2007 9 Busca Seqüencial • O algoritmo mais simples para fazer busca em uma lista é a busca seqüencial. – Cada item da lista é examinado em seqüência até que o item desejado seja encontrado. – Fica impraticável para listas muito grandes. • Imagine fazer uma busca em uma lista telefônica desta forma. Busca seqüencial para encontrar um item em uma lista 1. Comece no início da lista. 2. Para cada item da lista: a. Examine o item. Se este é o item procurado, terminou a busca. b. Se este não é o item procurado, vá para o próximo item. Aula 14 - 10/10/2007 10 Busca Binária • É uma maneira mais eficiente de se fazer busca em uma lista, se a lista tem ordem. – Por exemplo, uma lista telefônica é organizada por ordem alfabética. – O primeiro passo é examinar um item no meio da lista. • Se este for o item procurado, a busca terminou. • Senão continua-se a busca na primeira metade se o item for “maior” do que o procurado e na segunda metade se o item for “menor”. Aula 14 - 10/10/2007 11 Busca Binária Busca binária para encontrar um item em uma lista 1. Inicialmente considere o intervalo válido como sendo lista inteira. 2. Enquanto existam itens no intervalo válido e o item procurado não for encontrado: a. Examine o item no meio do intervalo válido. b. Se o item do meio for o item procurado, a busca terminou. c. Se o item do meio for maior que o item procurado, reduza o intervalo válido de modo que ele cubra apenas os itens à esquerda do item do meio. d. Se o item do meio for menor que o item procurado, reduza o intervalo válido de modo que ele cubra apenas os itens à direita do item do meio. Aula 14 - 10/10/2007 12 Exemplo • Busca por Illinois Aula 14 - 10/10/2007 13 Análise dos algoritmos • Busca seqüencial: – Cada item da lista é examinado. – Logo o tempo de execução é O(N) onde N é o tamanho da lista. • Busca binária: – Cada item examinado elimina metade dos itens válidos. • Então temos o efeito logaritmico. – Logo o tempo de execução é O(logN) onde N é o tamanho da lista. – Usando busca binária, podemos encontrar um item em uma lista de 1 milhão de itens fazendo 24 consultas. Aula 14 - 10/10/2007 14 Algoritmo para Raiz Quadrada • Em Javascript vimos a função Math.sqrt que calcula raiz quadrada. – Não precisávamos entender o seu funcionamento interno, apenas como usá-la. • Agora veremos como implementar uma função que calcule raiz quadrada. • Existem muitos algoritmos com este propósito. – Um simples foi inventado por Newton no século XVII. Aula 14 - 10/10/2007 15 Algoritmo para Raiz Quadrada Algoritmo de Newton para calcular raiz quadrada de N: 1. Comece com a raiz inicial 1. 2. Enquanto houver mudança na raiz: a. Modifique a raiz utilizando a fórmula: raiz = (raiz + N/raiz)/2 Calculando a raiz quadrada de 1024: Aula 14 - 10/10/2007 16 Algoritmos e Programação • Programar nada mais é do que projetar e implementar algoritmos para resolver problemas. – Os algoritmos têm que ser especificados precisamente para que o computador possa entendê-los. – Por isso, não utilizamos linguagem comum e sim uma linguagem de programação para especificar os algoritmos para o computador. Aula 14 - 10/10/2007 17 Linguagens de Máquina • As primeiras linguagens de programação, introduzidas nos anos 40, têm instruções que correspondem exatamente às operações do hardware da máquina. – Por isso são chamadas de linguagem de máquina. – Elas lidam diretamente com os componentes do hardware, incluindo a memória e registradores. Aula 14 - 10/10/2007 18 Linguagens de Máquina • Exemplo de programa em linguagem de máquina: – Mover o valor do endereço de memória 100 para o registrador 3. – Adicionar 1 ao valor do registrador 3. – Pular para a instrução no endereço de memória 1024. • Porém, as instruções acima não são dadas em português e sim em binário: – 0110000000011 – 1100000100011 – 0101010000000 • Programas em linguagem de máquina são compostos de sequências de números binários correspondentes a operações do hardware. Aula 14 - 10/10/2007 19 Linguagens Assembly • Programas em linguagem de máquina são muito difíceis de entender e corrigir. • Nos anos 1950, foram criadas as linguagem Assembly que tem um nível de abstração maior. – As instruções são especificadas usando palavras e não números em binário. • Exemplos – MOV #100, R3 – ADD 1, R3 – JUMP #1024 – Mas as instruções ainda são equivalentes a operações no hardware. Aula 14 - 10/10/2007 20 Linguagens de Alto Nível • Linguagens de alto nível permitem a programação de maneira mais próxima a que os humanos pensam. – Definição e uso de variáveis ao invés de registradores e posições na memória. – Escolhas condicionais (IF) ao invés de pular para uma instrução na memória. – Repetição de comandos. – Definição de funções. • Dessa forma fica mais fácil descrever a solução de um problema do que usando linguagem de máquina ou Assembly. • Exemplos: Fortran, C, C++, Pascal, Java, JavaScript,… Aula 14 - 10/10/2007 21 Mesmo programa em duas linguagens Aula 14 - 10/10/2007 22 Compilação • Os programas em linguagem de alto nível tem que ser “traduzidos” para linguagem de máquina antes de serem executados. • O programa que faz essa tradução é chamado de compilador. – O compilador recebe como entrada um arquivo em linguagem de alto nível e produz um arquivo em linguagem de máquina (.exe). • Algumas linguagens não são compiladas e sim interpretadas. – Cada comando é “traduzido” individualmente e executado logo após a tradução. Aula 14 - 10/10/2007 23 Compilação Aula 14 - 10/10/2007 24