Estrutura de Dados e Algoritmos ( www.ic.uff.br/~boeres/ed.html ) Tópicos! Introdução/Revisão! Algoritmos, Noções de Complexidade! Listas, Pilhas e Filas! Tabelas Hash ( etc! Árvores (binárias, AVL, B,! Heap: lista de prioridades 1
Estrutura de Dados e Algoritmos ( www.ic.uff.br/~boeres/ed.html ) Bibliografia:! J. Szwarcfiter e L. Markeson, Estrutura de Dados e Algoritmos, Editora LTC.! Cormen, Leiserson and Rivest, Introduction to Algorithms, MIT Press. 2
Introdução! Implementação de uma Aplicação! representa uma abstração da realidade! consiste de um conjunto selecionado de dados relacionados com o problema a ser resolvido! deste conjunto, é possível a obtenção dos resultados esperados 3
Introdução! Cadastro de Pessoal de uma Empresa! Modelo Abstrato - simplificação! Empregado - conjunto de dados! os que são relevantes para o empregador e para os procedimentos contábeis da empresa! identificação, salário, dependentes,...! Abstraem-se dados irrelevantes:! cor do cabelo, estatura, peso 4
Introdução! Resolução de um problema! escolher uma abstração da realidade! o que é relevante para o problema! informação: um conjunto de dados! comportamento: um conjunto de operações a forma como se representa informação e suas operações estão intimamente ligadas 5
Introdução! Dados Relevantes em um Problema! escolher um conjunto de dados: uma representação possível da situação real! orientada às características do problema! os dados precisam ser representados! a etapa seguinte é a escolha de uma forma de representação 6
Introdução! Como representar dados?! depende da ferramenta usada na solução! não é uma tarefa muito trivial! não existe uma única solução! não existe receita! a solução de um problema no computador é um modelo! a construção do modelo transcende diversos níveis de detalhe 7
Introdução! A decisão é influenciada pelo problema! As outras são dependentes da ferramenta tecnologia que se emprega! Programador: focaliza o problema! decisões de nível mais baixo - projetistas do equipamento computacional! ferramentas que permitam ao programador se concentrar nas características do problema 8
Algoritmo! Um processo sistemático para a resolução de problemas! dois aspectos básicos no estudo de algoritmos correção e análise! correção: exatidão do método empregado! análise: obtenção de parâmetros que permitam verificar a eficiência do algoritmo ( ocupada (execução e memória 9
Algoritmo! Computa uma saída (o resultado do problema) a partir de uma entrada! durante o processo, manipula dados gerados a partir de sua entrada! dados dispostos e manipulados de forma homogênea Tipo Abstrato de dados! um conjunto de dados + operações que podem ser executadas sobre esses dados 10
Algoritmo! Tipo Abstrato de dados: exemplo! estrutura do tipo aluno struct aluno{ int matricula; int nome; char outras_info[1024]; }! operação: procura_aluno_matricula ( aluno.matricula ) 11
Algoritmo! Um algoritmo é projetado em termos de Tipos Abstratos de Dados! Para implementá-lo em uma Linguagem de programação:! como representá-lo nesta linguagem?! tipos e Operações suportadas pelo computador.! na sua representação emprega-se Estruturas de Dados 12
Algoritmos e Estruturas de Dados! Resolução de um Problema! Algoritmo! representação do comportamento! Estrutura de Dados! representação da informação 13
Algoritmos e Estruturas de Dados! No processo de construção de programas: formulação do algoritmo definição de estruturas de dados estão intimamente ligadas 14
Algoritmos e Estruturas de Dados! Decisões sobre estruturas de dados não podem ser tomadas sem conhecimento dos algoritmos aplicados e vice-versa! Num algoritmo vamos distinguir dois aspectos complementares:! estático e dinâmico 15
Estrutura de Dados! Como a informação é organizada, como será manipulada e como será utilizada! estudo envolve dois objetivos complementares:! Identificar e desenvolver entidades matemáticas e operações! Determinar que classes de problemas podem ser resolvidas usando essas entidades e operações 16
Algoritmo! Um texto contendo comandos (instruções)! devem ser executados na ordem especificada! corresponde a representação concreta e tem caráter estático! esse texto nos interessa pelos efeitos que causa decorrentes de sua execução dado um conjunto de valores iniciais! execução: evento dinâmico " evolui no tempo 17
Algoritmo! Uma dificuldade na concepção e no entendimento de algoritmos é o relacionamento dos aspectos estático e dinâmico! como entender as estruturas dinâmicas das possíveis execuções do algoritmo a partir da estrutura estática 18
Algoritmo! Deve utilizar Estruturas Básicas de controle! formas naturais de pensar e adequadas à construção de algoritmos inteligíveis! SE... ENTÃO...SENÃO... 19
Algoritmo! Estado de um dado sistema é o conjunto de propriedades desse sistema que são relevantes na situação considerada! conjunto de valores de variáveis de um programa! Ação - evento que ocorre num período de tempo finito estabelecendo um efeito desejado e bem definido! ação: o interesse é decorrente do efeito produzido 20
Algoritmo! Em todo evento pode-se reconhecer um padrão de comportamento, fazendo-se abstração de diferentes estados iniciais e efeitos! cada vez que o padrão de comportamento é seguido, o evento ocorre! seu efeito é totalmente determinado pelo padrão de comportamento e pelo estado inicial 21
Algoritmo! É a descrição de um padrão de comportamento, em termos de um repertório bem definido e finito de ações primitivas, que podem ser executadas! possui um caráter imperativo! uma ação no algoritmo: um comando! é uma norma executável para estabelecer um certo efeito desejado 22
Apresentação dos Algoritmos! formato livre com comandos das linguagens estruturadas! estrutura de blocos! identação! funções! Linguagem C 23
Processamento de um Programa ( a>b ) If { ( maior printf ( A é } else { ( maior printf ( B é } Tradutor: Compilador + Linkeditor A é maior 24
Processamento de Linguagens! Linguagens de Programação: são projetadas em função da facilidade na construção e confiabilidade dos programas! Como executar em arquiteturas diferentes?! Duas alternativas:! Interpretação! Tradução 25
Interpretação 1. Obter o próximo comando do programa 2. Determinar que ações devem ser executadas 3. Executar essas ações! Esta seqüência é bastante semelhante àquela executada por computadores tradicionais: 1. Obter a próxima instrução (PC) 2. Incrementar o PC 3. Decodificar a instrução 4. Executar a instrução 26
Tradução! Programas escritos em LP de alto nível são traduzidos para versões equivalentes em linguagem de máquina antes de serem executados! Essa tradução é feita em vários passos! Compilador! Linkeditor! Loader 27
Compilação! Logicamente, a tradução pode ser dividida em 2 grandes partes:! análise do programa fonte (dados de ( entrada! síntese do programa objeto executável 28
Síntese do programa objeto! A saída da fase anterior consiste basicamente de ( o.*)! programas quase executáveis! podem fazer referências a dados externos ou outros programas! Linkedição: une diversos *.o em um programa executável pronto para rodar 29
Programa pgm1.c ( a>b ) If { ( maior printf ( A é } else { ( maior printf ( B é } compilação pgm1.o pgm2.c ( a>b ) If { ( maior printf ( A é } else { ( maior printf ( B é } pgm3.c compilação ( a>b ) If { ( maior printf ( A é } else { ( maior printf ( B é } compilação pgm2.0 pgm3.0 linkedição programa.exe 30
Síntese do programa objeto! Linkedição! um procedimento para finalizar a resolução de referências! programas podem ser traduzidos separadamente! ou utiliza-se uma biblioteca 31
Visão Geral de um Programa! O Problema Imprimir uma mensagem mostrando o que está sendo somado Calcular a soma de três números Imprimir o resultado 32
Visão Geral de um Programa! Este programa não faz muita coisa! Como seleciona os números a somar?! Não imprime nenhuma mensagem explicativa?! Que tipos de números soma? 33
Visão Geral de um Programa Definindo melhor o problema Exibir para o usuário o que faz o programa Exibir o que espera como entrada Pedir os três valores (A, B,C) e armazenar Somar A + B + C e guardar em SOMA Exibir o valor SOMA ao usuário 34
Modelo de um Programa Entrada Processa a Entrada Saída! Este é um modelo seguido pelos programas! Um programa tem que ser capaz de armazenar sua entrada em algum lugar 35
Modelo de um Programa! Entradas são armazenadas para serem processadas e gerar uma saída útil e desejada! Dados são armazenados em variáveis! posições de memória com um nome que podem conter dados! as variáveis podem conter tipos diferentes de dados 36
Variáveis e Tipos de Dados! Variáveis podem conter valores diferentes durante a execução do programa! os valores são consistentes com o tipo da variável! Alguns valores não devem ser alterados durante a execução! Constantes 37
Variáveis e Tipos de Dados! Dados - em variáveis ou constantes -podem ser de diferentes tipos ( longos! inteiros ( curtos /! reais - ponto flutuante! precisão simples ou dupla! caracteres isolados! string de caracteres 38
Variáveis! Variável é algo que se altera! Dados armazenados em uma variável podem se modificar! Em um programa! definir uma variável significa reservar uma memória para armazenar seus valores 39
Variáveis! Deve-se atribuir às variáveis nomes que o ajudem a lembrar a finalidade de cada uma delas! Nomes mais longos tornam seu programa mais claro! outros podem ter que revisar seu código! pode ser necessário revisar o programa daqui a 6 meses 40
Identificadores! Elemento básico da Linguagem! Identificadores dão nomes a:! Variáveis! Trechos de Programa 41
Identificadores! C- Padrão ANSI: nomes de variáveis, funções, rótulos == identificadores! Tamanho: 1 a diversos caracteres: pelo menos os 61ºs são válidos! 1o. caracter - letra ou sublinhado! letras maiúsculas e minúsculas são tratadas diferentemente 42
Blocos! um conjunto de comandos com uma função bem definida! serve para definir os limites onde as variáveis declaradas em seu interior são conhecidas! Variáveis locais a blocos e globais a blocos! Blocos podem possuir um nome: subprogramas (funções no C) ou não! são delimitados por { } 43
Tipo de Dados! Na matemática, variáveis são classificadas de acordo com algumas características importantes! Existe distinção clara entre! variáveis reais, complexas e lógicas! valores individuais e conjunto de valores! funções 44
Tipo de Dados! Esta noção de classificação é muito importante! Cada constante, variável, expressão ou função é de um certo tipo! refere-se ao conjunto de valores que pode assumir 45
Tipo de Dados! Em programas (em geral), não é possível deduzir o tipo da variável a partir do seu contexto! é necessário explicitar o tipo de cada variável! a cada tipo de dados está associada uma representação na computador! é necessário conhecer o tipo de dados para saber qual a sua representação 46
Tipo de Dados! A um tipo de dados está associado:! uma representação! o tamanho de células de memória para armazenar esta representação! a área de memória onde ficará o valor da variável tem que ter dimensões compatíveis com a sua representação! conjunto de valores que variáveis de um dado tipo podem assumir 47
Tipo de Dados! As operações exigem argumentos de um dado tipo e produzem resultados do mesmo tipo! É importante para o compilador saber o tipo de cada variável antes de empregá-la em uma operação 48
Definição de Variáveis! int X1! float A, B;! char Nome; 49
Definição de Variáveis! A semântica da declaração de uma variável corresponde a! criação de locais na memória rotulados com o nome da variável (identificador)! marcada com o tipo de valores que ela pode conter (equivale a um tamanho e forma de ( representação! X1: é o nome do local de memória que só pode conter variáveis do tipo inteiro! A e B só podem conter variáveis do tipo real 50
Compatibilidade de Tipos! É importante observar que:! o resultado da expressão do lado direito de um comando de atribuição deve ser coerente com o tipo declarado para a variável do lado esquerdo! a = b+c; b e c float então a deve ser float 51
Expressões! forma linearizada usada na matemática! Operadores Aritméticos! +, -, *, / ( inteiros (divisão de 1 = 3/2!! Precedência: da matemática! uso de parênteses! a = b+c * (x*y-5);! a = a+2;! mod : resto da divisão inteira 52
Expressões! Operadores Lógicos! dentro das relações lógicas, usaremos conectivos lógicos usuais (&&)! E ( )! OU (!)! NEGAÇÃO! Conectivos relacionais! >, <, >=, <=, ==,!= 53
Expressões! Prioridades para operações mistas! 1o. : parênteses e funções! 2o. : expressões aritméticas *, / ( binários ) -, +! 3o. : comparações >, >=, <, <=, ==,!=! 4o. :!! 5o. : &&! 6o. : 54
Comentários! Uma anotacão! Servem para ajudar a explicar a codificação! Seu programa deve ser compreendido por qualquer outro programador! /* COMENTÁRIO..*/! // comentário até o fim da linha 55
Comentários! Devem ser utilizados com liberalidade em todo o programa! Devem explicar seu algoritmo! Estão relacionados com a solução do problema! Não devem ser óbvios 56
Atribuição! Atribuição! designam valores a uma variável! A = B; /* Faz A = B */! /* Este é um comentário óbvio - desnecessário */! os valores atribuídos a uma variável devem ser compatíveis com seu tipo! Sintáxe: identificador = valor ; 57
Operações Especiais do C! Incrementando 1:! i++;! ++i;! Decrementando 1:! i--;! --i; 58
Fluxo de Controle! o que deve ser executado: processo dinâmico! determina em cada passo da execução, qual o próximo comando a ser executado! a ordem de execução das ações é a chave para entender o funcionamento do algoritmo! depende dos dados de entrada 59
Estruturas Básicas de Controle! Um algoritmo deve ser determinístico:! dada as mesmas condições iniciais deve produzir a final da execução os mesmos resultados! só estamos interessados em algoritmos que terminam em um tempo finito! Programas:! uma certa espécie de algoritmos 60
Estruturas Básicas de Controle! Seqüenciamento:! Separa um comando do outro e determina a execução em seqüência dos comandos! estrutura de controle mais simples: seqüência simples traz a cesta com batatas; traz a panela do armário; coloca o avental; descasca batatas; devolve a cesta; 61
Estruturas Básicas de Controle! condicional: se... então traz a cesta com batatas; traz a panela do armário; se roupa é clara então coloca avental; descasca batatas; devolve a cesta; if ( condição) {...} else {...} 62
Instruções Condicionais ( NaoAguentaCalor )! if { } ( JanelaNaoAbre ) if { } FiqueForaDaCozinha; else { LavePratos;} 63
Comandos Básicos do C! <condição> é qualquer expressão cujo resultado é um valor booleano! onde está relacionado um bloco de comandos (limitados por { / }) pode ser usado um único comando! bloco: como um novo comando / extensão da linguagem 64
Comandos Básicos do C! Repetição! quando um conjunto de ações é executado repetidamente enquanto uma determinada condição permanece válida! condição é uma expressão cujo resultado é um valor lógico 65
Comandos Básicos do C! Repetição enquanto <condição> faça C1; C2; C3; C4; fim enquanto; 66
Comandos Básicos do C! Repetição - C while ( <condição> ) { } C1; C2; C3; C4; 67
Comandos Básicos do C! Repetição faça C1; C2; C3; C4; enquanto <condição>; 68
Comandos Básicos do C! Repetição C do { C1; C2; C3; C4; } while (<condição>); 69
Comandos Básicos do C! Repetição { (++ i for (i=0; i<n; }; C1; C2; C3; C4; 70
Comandos Básicos do C! Repetição! while<condição>...! se já da primeira vez a condição for falsa, os comandos não são executados nenhuma vez! do { } while, condição>! se da primeira vez a condição for falsa, os comandos são executados uma vez! Enquanto a condição for verdadeira os comandos são executados, quando for falsa, o comando é abandonado 71
Tipos de Dados Simples Inteiros! Qualquer valor do conjunto dos números inteiros! inteiros curtos - int - 4 bytes! inteiros longos - long - 8 bytes! operações! = ( inteiros /(divisão de *, -, +,!! mod 72
Reais! Também chamados de ponto flutuante! Qualquer valor do conjunto dos números reais! estão limitados no número de dígitos decimais - float ou double! sua representação: mantissa e expoente! operações :=, +, -, *, / 73
Usando Tipos! Se tenho que definir uma variável para conter idades, que tipo usar?! inteiros, e curtos são suficientes! É função do:! conjunto de valores que a variável pode assumir! da precisão que se deseja no resultado de operações 74
Caracteres! É qualquer caracter isolado representado no computador! letras e números são caracteres! caracteres especiais - &, %! caracteres especiais e não visíveis - ESC, CR, LF,! ocupam 1 byte - ASCII! char a = A ; 75
Strings de Caracteres! Um número arbitrário de ocorrências de caracteres! deixa em aberto o número de ocorrências! não possui uma representação direta no C! char a[50]! #define nome Maria 76