apostila de algorítimos e estrutura de dados - prof. conway

69
1 Pontifícia Universidade Católica de Minas Gerais Campus Belo Horizonte – Núcleo Universitário Contagem Curso: Sistema de Informação - Noite Disciplina: Algoritmos e Estruturas de Dados Professor: Júlio César Dillinger Conway ALGORITMOS E ESTURTURAS DE DADOS AED PROFESSOR: JÚLIO C. D. CONWAY

Upload: felipe-barros

Post on 03-Jan-2016

532 views

Category:

Documents


2 download

DESCRIPTION

Apostila de AED - Professor Júlio César Dillinger Conway - SI - PUC MINAS Contagem

TRANSCRIPT

Page 1: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

1

Pontifiacutecia Universidade Catoacutelica de Minas GeraisCampus Belo Horizonte ndash Nuacutecleo Universitaacuterio Contagem

Curso Sistema de Informaccedilatildeo - NoiteDisciplina Algoritmos e Estruturas de Dados

Professor Juacutelio Ceacutesar Dillinger Conway

ALGORITMOS E ESTURTURAS DE DADOS

AED

PROFESSOR JUacuteLIO C D CONWAY

2

UNIDADES DE ENSINO

UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)11 Classes e Objetos12 Mecanismos de visibilidade Encapsulamento

121 Atributos e meacutetodos de classe13 Heranccedila14 Polimorfismo 15 Exemplos de POO em C Sharp

UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)21 TIPOS ABSTRATOS DE DADOS - Conceitos22 LISTAS23 FILAS24 PILHAS

UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)31 Conceitos32 Funccedilotildees recursivas33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci

UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)41 Algoritmo de Seleccedilatildeo42 Algoritmo de Inserccedilatildeo43 Algoritmo Quicksort

UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)51 Pesquisa sequumlencial52 Pesquisa binaacuteria53 Aacutervores de pesquisa 531 Conceitos 532 Aacutervores de Pesquisa Binaacuteria 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem54 Tabelas Hash

UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)61 Ordem de Complexidade de Algoritmos62 Classes de Comportamento assintoacutetico de Funccedilotildees63 Anaacutelise do pior caso caso meacutedio e melhor caso

3

CRITEacuteRIOS DE AVALIACcedilAtildeO

Avaliaccedilatildeo Prova 11 5 pontos Prova 12 35 pontos Prova 21 5 pontos Prova 22 35 pontos Trab1 10 pontos Trab2 10 pontos ________________ Total 100 pontos

Obs1 O aluno teraacute direito a uma prova substitutiva na data prevista no calendaacuterio Natildeo eacute permitido fazer prova substitutiva para melhorar a nota de uma prova jaacute realizada O conteuacutedo da prova seraacute toda a mateacuteria

Obs2 Abono de faltas somente de acordo com os casos previstos no estatuto da PUC Portanto verifique a chamada do seu nome

Obs3 Valor da reavaliaccedilatildeo 100 pontos Nota final meacutedia da reavaliaccedilatildeo mais nota semestral Nota para fazer a reavaliaccedilatildeo igual ou superior a 40 pontos e menor de 60 pontos

Obs4 Todo o material da disciplina seraacute disponibilizado no SGA mas eacute importante tambeacutem estudar nos livros relacionados abaixo

Bibliografia Baacutesica

ZIVIANI Nivio Projeto de algoritmos com implementaccedilotildees em Java e C++ Satildeo Paulo Thomson Learning c2007 621 p ISBN 8522105251 (Consta no acervo da PUC Minas)

MANZANO Joseacute Augusto N G OLIVEIRA Jayr Figueiredo de Algoritmos logica para desenvolvimento de programaccedilatildeo 11 ed Satildeo Paulo Erica 2001 236p ISBN 85-7194-718-X (Consta no acervo da PUC Minas)

SZWARCFITER Jayme Luiz MARKENZON Lilian Estruturas de dados e seus algoritmos 2ed rev Rio de Janeiro LTC - Livros Teacutecnicos e Cientiacuteficos c1994 320p ISBN 8521610149 (Consta no acervo da PUC Minas)

Bibliografia Complementar

CORMEN Thomas H et al Algoritmos teoria e praacutetica Rio de Janeiro Campus 2002 916p ISBN 8535209263 (Consta no acervo da PUC Minas)

KNUTH Donald Ervin The art of computer programming volume 1 fundamental algorithms 3rd ed Reading Addison Wesley 1997- 650p (Consta no acervo da PUC Minas)

KNUTH Donald Ervin The art of computer programming volume 2 seminumerical algorithms 3rd ed Reading Addison Wesley 2003 762p (Consta no acervo da PUC Minas)

KNUTH Donald Ervin The art of computer programming volume 3 sorting and searching 2nd ed Reading

4

Addison Wesley 2003 780p (Consta no acervo da PUC Minas)

1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)

Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo Um objeto eacute uma entidade auto-contida com uma identidade e propriedades particulares

11 CONCEITOS FUNDAMENTAIS

1 Encapsulamento2 Heranccedila e Reuso3 Polimorfismo

ENCAPSULAMENTO

bull Um transistor eacute auto-contido ele faz uma tarefa bem definida e faz completamente bull Fazer uma tarefa completamente eacute chamada de encapsulamentobull Todas as propriedades do transistor satildeo encapsuladas no objeto transistorbull Natildeo eacute necessaacuterio saber como o transistor trabalha para usaacute-lo efetivamente

HERANCcedilA E REUSO

bull A ideacuteia de reuso eacute suportada atraveacutes da heranccedila de classesbull Um novo tipo que eacute uma extensatildeo de um tipo jaacute existente pode ser declaradobull Esta nova sub-classe eacute derivada da classe existente e eacute chamada classe derivada

bull Heranccedila eacute o mecanismo que permite a Classe Derivada herdar as propriedades da classe Base

bull Dizemos que ldquoA Derivada herda da Baserdquobull Objetos da classe Derivada tem acesso a dados e funccedilotildees da classe Base sem a necessidade

de redefini-los

bull HERANCcedilA SIMPLES

bull Uma classe derivada pode ser a classe base para outras derivaccedilotildees

5

POLIMORFISMO

bull O polimorfismo permite a uma entidade (variaacutevel funccedilatildeo ou objeto) ter vaacuterias representaccedilotildeesbull Uma variaacutevel pode ter diferentes tipos dependendo do contexto em um momento particularbull O polimorfismo permite-nos usar o mesmo nome de funccedilotildees desde que a lista de paracircmetros seja

diferente (Sobrecarga de funccedilotildees)bull Objetos herdados de uma classe podem ser sobrecarregados em uma classe derivadabullbull Analisando a palavra Polimorfismo ela significa muitas formas Ou seja para uma aacutervore de

heranccedila temos muitas formas de objetos e meacutetodos a partir de uma superclasse e suas subclasses Polimorfismo eacute o princiacutepio pelo qual usamos objetos construiacutedos a partir de uma aacutervore de heranccedila atraveacutes de referecircncias do tipo de uma superclasse da hierarquia

bull Formas de polimorfismobull Subclassesbull Sobrescrita de meacutetodobull Sobrecarga de meacutetodo ou construtorbull Sobre escrita de meacutetodos ndash Overriding bull Esta utilidade nos permite escrever numa subclasse um ou mais meacutetodos presentes numa das

superclasses podendo alterar o comportamento da superclasse bull Exemplo

Classe Base

Classe Derivada A

Classe Derivada B

Classe Derivada C

Classe Base para a Classe Derivada A

Classe Base para a Classe Derivada B

Classe Base para as Classes Derivadas CD e E

Classe Derivada D

Classe Derivada E

6

bull Quando numa subclasse reescrevemos um meacutetodo jaacute existente numa superclasse chamamos de sobre escrita de meacutetodo ou reescrita de meacutetodo mas o termo teacutecnico eacute Method Overriding Lembrando que a sobre escrita de meacutetodos soacute eacute valida quando o meacutetodo reescrito na subclasse tem exatamente a mesma identificaccedilatildeo (nome tipos etc) do meacutetodo da superclasse

bullbull Sobrecarga de meacutetodos ndash Overloading bull O Polimorfismo ainda permite que numa mesma classe tenhamos meacutetodos com o mesmo nome

desde que o nuacutemero ou tipos de paracircmetros passados sejam diferentes bull Exemplo

7

bull A sobrecarga de meacutetodos eacute uma ferramenta poderosa pois nos permite criar vaacuterios meacutetodos com o mesmo nome isso facilita o entendimento de problemas mais complexos pois natildeo eacute necessaacuteria a criaccedilatildeo de nomes de funcionalidades sem sentido aparente

8

12 CLASSES

bull Uma classe eacute uma estrutura que encapsula dados (chamados de propriedades) e funccedilotildees (chamadas de meacutetodos) em um pacote auto-contido

13 OBJETOS

Um objeto eacute uma instacircncia de uma classe Podemos entender a classe como uma declaraccedilatildeo e o objeto como uma variaacutevel do tipo da classe Trabalhamos com o objeto a classe nos diz somente de que tipo o objeto eacute

Eacute identificado unicamente pelo seu nome Define um estado que eacute representado pelos valores dos seus atributos em um dado momento O comportamento de um objeto eacute definido pelo conjunto de funccedilotildees que podem ser aplicados a ele Podem existir vaacuterios objetos de uma mesma classe POO eacute portanto a implementaccedilatildeo de tipos abstratos de dados classes e objetos Um programa escrito em C++ ou C pode ser visto como uma coleccedilatildeo de objetos

CRIANDO OBJETOS

Agora que jaacute sabemos como definir uma classe podemos passar ao ponto de criar objetos da classe definida Eacute importante perceber o fato de que podemos criar vaacuterios objetos da mesma classe natildeo ficando limitado a apenas um objeto

No C++ podemos declarar um objeto de maneira estaacutetica Suponha que a classe cTempo jaacute estaacute definida Veja a declaraccedilatildeo abaixo em C++

cTempo Aniversario Aniversario eacute um objeto (instacircncia da classe cTempo)

Quando vamos criar um objeto em C utilizamos a palavra chave new seguindo o seguinte esquema

ltTipogt ltnomegt = new ltTipogt()

Assim teriacuteamos em relaccedilatildeo ao exemplo anterior

MEacuteTODOS

PROPRIEDADES

CLASSE

Os meacutetodos satildeo funccedilotildees normais em linguagem C ou C++

As propriedades satildeo variaacuteveis normais int char struct

9

cTempo Aniversario = new cTempo() Aniversario eacute um objeto (instacircncia da classe cTempo)

Veja entatildeo um exemplo de criaccedilatildeo de um objeto de uma classe hipoteacutetica Computador com o nome de comp1

Computador comp1 = new Computador() comp1 e um objeto da classe Computador

O operador new eacute responsaacutevel por calcular o nuacutemero correto de bytes para o objeto especificado e adquirir memoacuteria suficiente (esta aacuterea de memoacuteria eacute chamada de heap) Assim no C a keyword new eacute o caminho para criar um objeto Dentro de uma classe assim como em programas comuns da linguagem lsquoCrsquo podem existir variaacuteveis e funccedilotildees Dentro da classe as variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos

Veja outro exemplo

using System

class HelloClass propriedades meacutetodos

public static int Main(string[] args) Vocecirc pode declarar e criar um novo objeto em uma simples linha HelloClass c1 = new HelloClass()

ou quebrar a declaraccedilatildeo e criaccedilatildeo em duas linhas HelloClass c2 c2 = new HelloClass()

Aqui satildeo alocados dois objetos da classe HelloClass Variaacuteveis de objeto em C realmente satildeo uma referecircncia ao objeto na memoacuteria natildeo o proacuteprio objeto em si Assim c1 e c2 referenciam dois objetos da classe HelloClass alocados na memoacuteria heap

Perceba que na criaccedilatildeo do objetos c1 e c2 apoacutes o new chamamos o tipo HelloClass seguido de parecircnteses Essa notaccedilatildeo significa que neste momento seraacute executado um meacutetodo especial da classe HelloClass chamado construtor

14 MEacuteTODO CONSTRUTOR

O construtor eacute um meacutetodo que possui o mesmo nome da classe que natildeo retorna nenhum valor e que eacute chamado cada vez que um objeto da classe eacute criado Por padratildeo quando natildeo criamos nenhum construtor (como na classe HelloClass) o construtor vazio que natildeo recebe nenhum paracircmetro e tambeacutem natildeo executa nenhum coacutedigo eacute criado automaticamente Apoacutes criarmos um construtor o construtor vazio automaacutetico natildeo eacute mais criado devendo ser criado pelo desenvolvedor caso precise Veja o exemplo abaixo

10

HelloClass com construtores

using System

class HelloClass

public string strMensagem

Construtor padratildeo

public HelloClass()

ConsoleWriteLine(Construtor padratildeo chamado)

Construtor customizado

public HelloClass (string msg)

ConsoleWriteLine(Construtor customizado chamado)

strMensagem = msg

Ponto de entrada do programa

public static int Main(string[] args)

Chamando o construtor padratildeo

HelloClass c1 = new HelloClass()

ConsoleWriteLine(Mensagem do usuaacuterio 0n c1strMensagem)

Chamando o construtor customizado passando uma string como paracircmetro

HelloClass c2

c2 = new HelloClass(Testando 1 2 3)

ConsoleWriteLine(Mensagem do usuaacuterio 0 c2strMensagem)

ConsoleReadLine()

return 0

15 ATRIBUTOS E MEacuteTODOS

Veja a classe Computador com um construtor que recebe 3 strings e preenche os atributos da classe com essas strings monitor teclado e mouse satildeo os atributos da classe

Meacutetodo com o mesmo nome da classe sem paracircmetro

Meacutetodo com o mesmo nome da classe com paracircmetro

11

namespace Construtor

class Computador

string monitorstring tecladostring mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

Computador comp1 = new Computador(Monitor1Teclado1Mouse1)Computador comp2 = new Computador(Monitor2Teclado2Mouse2)Computador comp3 = new Computador(SamsungAcerLogitch)

Obs Foram criados 3 objetos (comp1 comp2 e comp3) da classe Computador onde cada um recebeu 3 argumentos diferentes

16 TIPOS POR VALOR X TIPOS POR REFEREcircNCIA

Os tipos preacute-definidos em C satildeo normalmente conhecidos como tipos por valor Esses tipos devem permitir um acesso raacutepido jaacute que satildeo muitas vezes utilizados no coacutedigo Dessa forma os tipos por valor tecircm guardados na memoacuteria apenas o seu valor sem nenhuma outra informaccedilatildeo adicional que poderia causar um gasto desnecessaacuterio de memoacuteria

Os tipos criados por classes os objetos satildeo conhecidos como tipos por referecircncia Essa denominaccedilatildeo vem do fato de que esses tipos natildeo guardam o seu valor mas sim uma referecircncia para um local na memoacuteria que conteacutem o valor No C e no C++ chamariacuteamos esta referecircncia de ponteiro

Com essas definiccedilotildees eacute importante perceber que se copiarmos as informaccedilotildees de variaacuteveis de tipos por valor e de variaacuteveis de tipos por referecircncia teremos comportamentos diferentes Caso copiemos uma variaacutevel por valor o que ocorre eacute que uma nova coacutepia do valor eacute passada para a outra variaacutevel Isso significa que caso modifiquemos uma das variaacuteveis nada ocorreraacute com a outra

Em variaacuteveis por referecircncia o que ocorre ao copiarmos para outra variaacutevel eacute que apenas a referecircncia eacute copiada natildeo o valor Apoacutes a coacutepia o que acontece eacute que teremos duas variaacuteveis apontando para um mesmo valor Isso significa que ao modificarmos uma variaacutevel estaremos na realidade modificando o valor para o qual a outra variaacutevel tambeacutem estaacute apontando significando que o valor da outra variaacutevel tambeacutem seraacute modificado

Meacutetodo construtor (tem o mesmo nome da classe) e recebe 3 paracircmetros

Atributos da Classe satildeo variaacuteveis comuns e podem ser de qualquer tipo

Programa Principalonde os objetos satildeo criados (instanciados)

Meacutetodo imprime um meacutetodo da classe Veja que eacute uma simples funccedilatildeo para impressatildeo

12

Veja o coacutedigo abaixo e observe o resultado

class Computador public string monitor public string tecladdo public string mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public void Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

cria uma variaacutevel de tipo por valorint valor1 = 10copia para outra variaacutevelint valor2 = valor1adiciona 5 a valor2valor2 += 5imprime o valor das duasConsoleWriteLine(valor1 + valor1)ConsoleWriteLine(valor2 + valor2)

cria um objeto de tipo por referecircnciaComputador comp1 = new Computador(Monitor1Teclado1Mouse1)

copia a referecircncia do objeto comp1 para o objeto comp2Computador comp2 = comp1

modifica o valor do monitorcomp2monitor = Modificadoimprime os dois computadorescomp1imprime()comp2imprime()

Veja o resultado

Veja que inicialmente o nome do monitor de comp1 era Monitor1 Mesmo tendo modificado apenas um dos objetos (o comp2) o comp1 tambeacutem foi modificado provando que na verdade os dois objetos referenciam o mesmo endereccedilo na memoacuteria

13

EXERCIacuteCIO

O aluno deveraacute desenvolver a classe funcionario que tem a seguinte especificaccedilatildeo

ATRIBUTOS Matricula int nome endereco string peso altura float sexo char

MEacuteTODOS

funcionaacuterio() este eacute o meacutetodo construtor padratildeo(lembre-se que o meacutetodo construtor tem o mesmo nome da classe)Entradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprimir a mensagem ldquoConstrutor Padrao Chamado rdquo

funcionaacuterio(string msg) este eacute outro meacutetodo construtor sobrecarregadoEntradas mensagem vinda do mainSaiacutedas nenhumaFunccedilatildeo imprime a mensagem recebida

funcionaacuterio(int mat string nom string end float pes float alt char sex ) este eacute outro meacutetodo construtor sobrecarregadoEntradas dados vindos do mainSaiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

atualizaDados(int mat string nom string end float pes float alt char sex) Entradas dados vindos do main

Saiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

imprimeDadosEntradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprime todos os dados do funcionario

Agora estaacute na hora de usar a classe Usando meacutetodos da classe funcionario definida acima e criada por vocecirc crie uma aplicaccedilatildeo que faccedila o seguinte na ordem dada

1 Instancie trecircs objeto da classe funcionaacuterio

objJoaoutilize o construtor padratildeo

objPedroutilize o segundo construtor e passe a mensagem

ldquoSegundo construtor obrecarregado chamado rdquo

objMaria chame o terceiro construtor e passe os seguintes dados

matricula 2341 nome ldquoMaria da Silvardquo endereccedilo Rua das Flores 34 peso 676 altura 176 sexo lsquoFrsquo

2 Imprima os dados do objeto objMaria

3 Atualize os dados do objJoao com

14

matricula 6784 nome ldquoJoao Marquesrdquo endereccedilo Rua das Acacias 45 peso 896 altura 190 sexo lsquoMrsquo

4 Atualize os dados do objPedro com

matricula 4523 nome ldquoPedro Villarrdquo endereccedilo Rua Torta 33 peso 789 altura 176 sexo lsquoMrsquo

5 Imprima os dados dos objetos objJoao e objPedro

17 HERANCcedilA

Heranccedila eacute um dos trecircs princiacutepios fundamentais da programaccedilatildeo orientada a objetos porque ela permite a criaccedilatildeo de hierarquia nos objetos que compotildeem o sistema Em C uma classe que tem seus dados e meacutetodos herdados por outra eacute chamada de classe base ou super classe e a classe que herda tais dados eacute chamada de classe derivada ou sub-classe

O que um aluno um professor e um funcionaacuterio possuem em comum Todos eles satildeo pessoas e portanto compartilham alguns dados comuns Todos tecircm nome idade endereccedilo etc E o que diferencia um aluno de outra pessoa qualquer Um aluno possui uma matriacutecula Um funcionaacuterio possui um coacutedigo de funcionaacuterio data de admissatildeo salaacuterio etc Um professor possui um coacutedigo de professor e informaccedilotildees relacionadas agrave sua formaccedilatildeo

Eacute aqui que a heranccedila se torna uma ferramenta de grande utilidade Podemos criar uma classe Pessoa que possui todos os atributos e meacutetodos comuns a todas as pessoas e herdar estes atributos e meacutetodos em classes mais especiacuteficas ou seja a heranccedila parte do geral para o mais especiacutefico Comece criando uma classe Pessoa como mostrado no coacutedigo a seguir

class Pessoa public string nome public int idade

Esta classe possui as propriedades nome e idade Estas propriedades satildeo comuns a todas as pessoas Veja agora como podemos criar uma classe Aluno que herda estas propriedades da classe Pessoa e inclui suas proacuteprias propriedades a saber seu nuacutemero de matriacutecula Eis o coacutedigo

class Aluno Pessoa public string matricula

Observe que em C os dois-pontos satildeo usados para indicar a heranccedila A classe Aluno agora possui trecircs atributos nome idade e matricula Veja um aplicativo demonstrando este relacionamento

static void Main(string[] args) cria um objeto da classe Aluno Aluno aluno = new Aluno()

alunonome = Osmar J Silva

As propriedades nome e idade foram herdadas da classe Pessoa pela classe Aluno

15

alunoidade = 36 alunomatricula = AC33-65

Exibe o resultado ConsoleWriteLine(Nome + alunonome + n + Idade + alunoidade + n + Matriacutecula + alunomatricula)

ConsoleWriteLine(nnPressione uma tecla para sair) ConsoleReadKey()

A heranccedila nos fornece um grande benefiacutecio Ao concentrarmos caracteriacutesticas comuns em uma classe e derivar as classes mais especiacuteficas a partir desta noacutes estamos preparados para a adiccedilatildeo de novas funcionalidades ao sistema Se mais adiante uma nova propriedade comum tiver que ser adicionada natildeo precisaremos efetuar alteraccedilotildees em todas as classes Basta alterar a superclasse e pronto As classes derivadas seratildeo automaticamente atualizadas

16

1048576

EXEMPLO DE COacuteDIGO CONSTRUINDO UMA CLASSE

Suponha que queiramos escrever um programa que manipula datas (minuto hora dia mecircs ano) Ao inveacutes de cinco variaacuteveis isoladas poderiacuteamos colocar estes dados em uma estrutura uacutenica englobando a data completa Assim poderiacuteamos declarar uma variaacutevel do tipo struct da seguinte maneira

struct Tempo int anoint mesint diaint horaint minuto

Ok ateacute aqui nada de novo (certo) Soacute declaramos uma estrutura em C padratildeo que conteacutem 5 variaacuteveis ano mecircs dia hora e minuto Agora imagine que aleacutem dessas variaacuteveis a estrutura Tempo pudesse tambeacutem ter embutida (encapsulada) funccedilotildees em C ou C Por exemplo uma funccedilatildeo que mostra a data na tela Esta estrutura seria mais ldquopoderosardquo pois os dados poderiam ser manipulados de dentro da proacutepria estrutura atraveacutes da sua funccedilatildeo interna Essa estrutura mais versaacutetil que conteacutem declaraccedilotildees de variaacuteveis e funccedilotildees constitui-se em uma classe como vimos anteriormente As variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos Assim poderiacuteamos reescrever nossa estrutura Tempo como uma classe cTempo

public class cTempo

public int ano variavel publica da classepublic int mes variavel publica da classepublic int dia variavel publica da classepublic int hora variavel publica da classepublic int minuto variavel publica da classe public void mostra_data() meacutetodo publico da classe

ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

Ok estamos prontos agora para usar nossa classe CTempo Como Temos que observar duas coisas

1 Natildeo trabalhamos com a classe CTempo Temos que instanciar um objeto da classe CTempo e trabalhar com este objeto

2 Abaixo temos a declaraccedilatildeo (instanciaccedilatildeo) do objeto e um pequeno programa em C

17

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos satildeo acessiacuteveis pelo main desde que sejam publicos public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto) Programa Principal static void Main(string[] args)

instanciando o objeto aniversario da classe cTempo cTempo aniversario = new cTempo() ConsoleWriteLine(Exemplo de POO em Cn)

para acessar metodos faccedila nome_objetonome_metodo

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data Para acessar atributos publicos faccedila nome_objetonome_atributo

aniversariodia = 9 aniversariomes = 2 aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23 ConsoleWriteLine(Nova datan) aniversariomostra_data() ConsoleReadKey()

A saiacuteda do programa seraacute

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 2: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

2

UNIDADES DE ENSINO

UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)11 Classes e Objetos12 Mecanismos de visibilidade Encapsulamento

121 Atributos e meacutetodos de classe13 Heranccedila14 Polimorfismo 15 Exemplos de POO em C Sharp

UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)21 TIPOS ABSTRATOS DE DADOS - Conceitos22 LISTAS23 FILAS24 PILHAS

UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)31 Conceitos32 Funccedilotildees recursivas33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci

UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)41 Algoritmo de Seleccedilatildeo42 Algoritmo de Inserccedilatildeo43 Algoritmo Quicksort

UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)51 Pesquisa sequumlencial52 Pesquisa binaacuteria53 Aacutervores de pesquisa 531 Conceitos 532 Aacutervores de Pesquisa Binaacuteria 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem54 Tabelas Hash

UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)61 Ordem de Complexidade de Algoritmos62 Classes de Comportamento assintoacutetico de Funccedilotildees63 Anaacutelise do pior caso caso meacutedio e melhor caso

3

CRITEacuteRIOS DE AVALIACcedilAtildeO

Avaliaccedilatildeo Prova 11 5 pontos Prova 12 35 pontos Prova 21 5 pontos Prova 22 35 pontos Trab1 10 pontos Trab2 10 pontos ________________ Total 100 pontos

Obs1 O aluno teraacute direito a uma prova substitutiva na data prevista no calendaacuterio Natildeo eacute permitido fazer prova substitutiva para melhorar a nota de uma prova jaacute realizada O conteuacutedo da prova seraacute toda a mateacuteria

Obs2 Abono de faltas somente de acordo com os casos previstos no estatuto da PUC Portanto verifique a chamada do seu nome

Obs3 Valor da reavaliaccedilatildeo 100 pontos Nota final meacutedia da reavaliaccedilatildeo mais nota semestral Nota para fazer a reavaliaccedilatildeo igual ou superior a 40 pontos e menor de 60 pontos

Obs4 Todo o material da disciplina seraacute disponibilizado no SGA mas eacute importante tambeacutem estudar nos livros relacionados abaixo

Bibliografia Baacutesica

ZIVIANI Nivio Projeto de algoritmos com implementaccedilotildees em Java e C++ Satildeo Paulo Thomson Learning c2007 621 p ISBN 8522105251 (Consta no acervo da PUC Minas)

MANZANO Joseacute Augusto N G OLIVEIRA Jayr Figueiredo de Algoritmos logica para desenvolvimento de programaccedilatildeo 11 ed Satildeo Paulo Erica 2001 236p ISBN 85-7194-718-X (Consta no acervo da PUC Minas)

SZWARCFITER Jayme Luiz MARKENZON Lilian Estruturas de dados e seus algoritmos 2ed rev Rio de Janeiro LTC - Livros Teacutecnicos e Cientiacuteficos c1994 320p ISBN 8521610149 (Consta no acervo da PUC Minas)

Bibliografia Complementar

CORMEN Thomas H et al Algoritmos teoria e praacutetica Rio de Janeiro Campus 2002 916p ISBN 8535209263 (Consta no acervo da PUC Minas)

KNUTH Donald Ervin The art of computer programming volume 1 fundamental algorithms 3rd ed Reading Addison Wesley 1997- 650p (Consta no acervo da PUC Minas)

KNUTH Donald Ervin The art of computer programming volume 2 seminumerical algorithms 3rd ed Reading Addison Wesley 2003 762p (Consta no acervo da PUC Minas)

KNUTH Donald Ervin The art of computer programming volume 3 sorting and searching 2nd ed Reading

4

Addison Wesley 2003 780p (Consta no acervo da PUC Minas)

1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)

Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo Um objeto eacute uma entidade auto-contida com uma identidade e propriedades particulares

11 CONCEITOS FUNDAMENTAIS

1 Encapsulamento2 Heranccedila e Reuso3 Polimorfismo

ENCAPSULAMENTO

bull Um transistor eacute auto-contido ele faz uma tarefa bem definida e faz completamente bull Fazer uma tarefa completamente eacute chamada de encapsulamentobull Todas as propriedades do transistor satildeo encapsuladas no objeto transistorbull Natildeo eacute necessaacuterio saber como o transistor trabalha para usaacute-lo efetivamente

HERANCcedilA E REUSO

bull A ideacuteia de reuso eacute suportada atraveacutes da heranccedila de classesbull Um novo tipo que eacute uma extensatildeo de um tipo jaacute existente pode ser declaradobull Esta nova sub-classe eacute derivada da classe existente e eacute chamada classe derivada

bull Heranccedila eacute o mecanismo que permite a Classe Derivada herdar as propriedades da classe Base

bull Dizemos que ldquoA Derivada herda da Baserdquobull Objetos da classe Derivada tem acesso a dados e funccedilotildees da classe Base sem a necessidade

de redefini-los

bull HERANCcedilA SIMPLES

bull Uma classe derivada pode ser a classe base para outras derivaccedilotildees

5

POLIMORFISMO

bull O polimorfismo permite a uma entidade (variaacutevel funccedilatildeo ou objeto) ter vaacuterias representaccedilotildeesbull Uma variaacutevel pode ter diferentes tipos dependendo do contexto em um momento particularbull O polimorfismo permite-nos usar o mesmo nome de funccedilotildees desde que a lista de paracircmetros seja

diferente (Sobrecarga de funccedilotildees)bull Objetos herdados de uma classe podem ser sobrecarregados em uma classe derivadabullbull Analisando a palavra Polimorfismo ela significa muitas formas Ou seja para uma aacutervore de

heranccedila temos muitas formas de objetos e meacutetodos a partir de uma superclasse e suas subclasses Polimorfismo eacute o princiacutepio pelo qual usamos objetos construiacutedos a partir de uma aacutervore de heranccedila atraveacutes de referecircncias do tipo de uma superclasse da hierarquia

bull Formas de polimorfismobull Subclassesbull Sobrescrita de meacutetodobull Sobrecarga de meacutetodo ou construtorbull Sobre escrita de meacutetodos ndash Overriding bull Esta utilidade nos permite escrever numa subclasse um ou mais meacutetodos presentes numa das

superclasses podendo alterar o comportamento da superclasse bull Exemplo

Classe Base

Classe Derivada A

Classe Derivada B

Classe Derivada C

Classe Base para a Classe Derivada A

Classe Base para a Classe Derivada B

Classe Base para as Classes Derivadas CD e E

Classe Derivada D

Classe Derivada E

6

bull Quando numa subclasse reescrevemos um meacutetodo jaacute existente numa superclasse chamamos de sobre escrita de meacutetodo ou reescrita de meacutetodo mas o termo teacutecnico eacute Method Overriding Lembrando que a sobre escrita de meacutetodos soacute eacute valida quando o meacutetodo reescrito na subclasse tem exatamente a mesma identificaccedilatildeo (nome tipos etc) do meacutetodo da superclasse

bullbull Sobrecarga de meacutetodos ndash Overloading bull O Polimorfismo ainda permite que numa mesma classe tenhamos meacutetodos com o mesmo nome

desde que o nuacutemero ou tipos de paracircmetros passados sejam diferentes bull Exemplo

7

bull A sobrecarga de meacutetodos eacute uma ferramenta poderosa pois nos permite criar vaacuterios meacutetodos com o mesmo nome isso facilita o entendimento de problemas mais complexos pois natildeo eacute necessaacuteria a criaccedilatildeo de nomes de funcionalidades sem sentido aparente

8

12 CLASSES

bull Uma classe eacute uma estrutura que encapsula dados (chamados de propriedades) e funccedilotildees (chamadas de meacutetodos) em um pacote auto-contido

13 OBJETOS

Um objeto eacute uma instacircncia de uma classe Podemos entender a classe como uma declaraccedilatildeo e o objeto como uma variaacutevel do tipo da classe Trabalhamos com o objeto a classe nos diz somente de que tipo o objeto eacute

Eacute identificado unicamente pelo seu nome Define um estado que eacute representado pelos valores dos seus atributos em um dado momento O comportamento de um objeto eacute definido pelo conjunto de funccedilotildees que podem ser aplicados a ele Podem existir vaacuterios objetos de uma mesma classe POO eacute portanto a implementaccedilatildeo de tipos abstratos de dados classes e objetos Um programa escrito em C++ ou C pode ser visto como uma coleccedilatildeo de objetos

CRIANDO OBJETOS

Agora que jaacute sabemos como definir uma classe podemos passar ao ponto de criar objetos da classe definida Eacute importante perceber o fato de que podemos criar vaacuterios objetos da mesma classe natildeo ficando limitado a apenas um objeto

No C++ podemos declarar um objeto de maneira estaacutetica Suponha que a classe cTempo jaacute estaacute definida Veja a declaraccedilatildeo abaixo em C++

cTempo Aniversario Aniversario eacute um objeto (instacircncia da classe cTempo)

Quando vamos criar um objeto em C utilizamos a palavra chave new seguindo o seguinte esquema

ltTipogt ltnomegt = new ltTipogt()

Assim teriacuteamos em relaccedilatildeo ao exemplo anterior

MEacuteTODOS

PROPRIEDADES

CLASSE

Os meacutetodos satildeo funccedilotildees normais em linguagem C ou C++

As propriedades satildeo variaacuteveis normais int char struct

9

cTempo Aniversario = new cTempo() Aniversario eacute um objeto (instacircncia da classe cTempo)

Veja entatildeo um exemplo de criaccedilatildeo de um objeto de uma classe hipoteacutetica Computador com o nome de comp1

Computador comp1 = new Computador() comp1 e um objeto da classe Computador

O operador new eacute responsaacutevel por calcular o nuacutemero correto de bytes para o objeto especificado e adquirir memoacuteria suficiente (esta aacuterea de memoacuteria eacute chamada de heap) Assim no C a keyword new eacute o caminho para criar um objeto Dentro de uma classe assim como em programas comuns da linguagem lsquoCrsquo podem existir variaacuteveis e funccedilotildees Dentro da classe as variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos

Veja outro exemplo

using System

class HelloClass propriedades meacutetodos

public static int Main(string[] args) Vocecirc pode declarar e criar um novo objeto em uma simples linha HelloClass c1 = new HelloClass()

ou quebrar a declaraccedilatildeo e criaccedilatildeo em duas linhas HelloClass c2 c2 = new HelloClass()

Aqui satildeo alocados dois objetos da classe HelloClass Variaacuteveis de objeto em C realmente satildeo uma referecircncia ao objeto na memoacuteria natildeo o proacuteprio objeto em si Assim c1 e c2 referenciam dois objetos da classe HelloClass alocados na memoacuteria heap

Perceba que na criaccedilatildeo do objetos c1 e c2 apoacutes o new chamamos o tipo HelloClass seguido de parecircnteses Essa notaccedilatildeo significa que neste momento seraacute executado um meacutetodo especial da classe HelloClass chamado construtor

14 MEacuteTODO CONSTRUTOR

O construtor eacute um meacutetodo que possui o mesmo nome da classe que natildeo retorna nenhum valor e que eacute chamado cada vez que um objeto da classe eacute criado Por padratildeo quando natildeo criamos nenhum construtor (como na classe HelloClass) o construtor vazio que natildeo recebe nenhum paracircmetro e tambeacutem natildeo executa nenhum coacutedigo eacute criado automaticamente Apoacutes criarmos um construtor o construtor vazio automaacutetico natildeo eacute mais criado devendo ser criado pelo desenvolvedor caso precise Veja o exemplo abaixo

10

HelloClass com construtores

using System

class HelloClass

public string strMensagem

Construtor padratildeo

public HelloClass()

ConsoleWriteLine(Construtor padratildeo chamado)

Construtor customizado

public HelloClass (string msg)

ConsoleWriteLine(Construtor customizado chamado)

strMensagem = msg

Ponto de entrada do programa

public static int Main(string[] args)

Chamando o construtor padratildeo

HelloClass c1 = new HelloClass()

ConsoleWriteLine(Mensagem do usuaacuterio 0n c1strMensagem)

Chamando o construtor customizado passando uma string como paracircmetro

HelloClass c2

c2 = new HelloClass(Testando 1 2 3)

ConsoleWriteLine(Mensagem do usuaacuterio 0 c2strMensagem)

ConsoleReadLine()

return 0

15 ATRIBUTOS E MEacuteTODOS

Veja a classe Computador com um construtor que recebe 3 strings e preenche os atributos da classe com essas strings monitor teclado e mouse satildeo os atributos da classe

Meacutetodo com o mesmo nome da classe sem paracircmetro

Meacutetodo com o mesmo nome da classe com paracircmetro

11

namespace Construtor

class Computador

string monitorstring tecladostring mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

Computador comp1 = new Computador(Monitor1Teclado1Mouse1)Computador comp2 = new Computador(Monitor2Teclado2Mouse2)Computador comp3 = new Computador(SamsungAcerLogitch)

Obs Foram criados 3 objetos (comp1 comp2 e comp3) da classe Computador onde cada um recebeu 3 argumentos diferentes

16 TIPOS POR VALOR X TIPOS POR REFEREcircNCIA

Os tipos preacute-definidos em C satildeo normalmente conhecidos como tipos por valor Esses tipos devem permitir um acesso raacutepido jaacute que satildeo muitas vezes utilizados no coacutedigo Dessa forma os tipos por valor tecircm guardados na memoacuteria apenas o seu valor sem nenhuma outra informaccedilatildeo adicional que poderia causar um gasto desnecessaacuterio de memoacuteria

Os tipos criados por classes os objetos satildeo conhecidos como tipos por referecircncia Essa denominaccedilatildeo vem do fato de que esses tipos natildeo guardam o seu valor mas sim uma referecircncia para um local na memoacuteria que conteacutem o valor No C e no C++ chamariacuteamos esta referecircncia de ponteiro

Com essas definiccedilotildees eacute importante perceber que se copiarmos as informaccedilotildees de variaacuteveis de tipos por valor e de variaacuteveis de tipos por referecircncia teremos comportamentos diferentes Caso copiemos uma variaacutevel por valor o que ocorre eacute que uma nova coacutepia do valor eacute passada para a outra variaacutevel Isso significa que caso modifiquemos uma das variaacuteveis nada ocorreraacute com a outra

Em variaacuteveis por referecircncia o que ocorre ao copiarmos para outra variaacutevel eacute que apenas a referecircncia eacute copiada natildeo o valor Apoacutes a coacutepia o que acontece eacute que teremos duas variaacuteveis apontando para um mesmo valor Isso significa que ao modificarmos uma variaacutevel estaremos na realidade modificando o valor para o qual a outra variaacutevel tambeacutem estaacute apontando significando que o valor da outra variaacutevel tambeacutem seraacute modificado

Meacutetodo construtor (tem o mesmo nome da classe) e recebe 3 paracircmetros

Atributos da Classe satildeo variaacuteveis comuns e podem ser de qualquer tipo

Programa Principalonde os objetos satildeo criados (instanciados)

Meacutetodo imprime um meacutetodo da classe Veja que eacute uma simples funccedilatildeo para impressatildeo

12

Veja o coacutedigo abaixo e observe o resultado

class Computador public string monitor public string tecladdo public string mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public void Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

cria uma variaacutevel de tipo por valorint valor1 = 10copia para outra variaacutevelint valor2 = valor1adiciona 5 a valor2valor2 += 5imprime o valor das duasConsoleWriteLine(valor1 + valor1)ConsoleWriteLine(valor2 + valor2)

cria um objeto de tipo por referecircnciaComputador comp1 = new Computador(Monitor1Teclado1Mouse1)

copia a referecircncia do objeto comp1 para o objeto comp2Computador comp2 = comp1

modifica o valor do monitorcomp2monitor = Modificadoimprime os dois computadorescomp1imprime()comp2imprime()

Veja o resultado

Veja que inicialmente o nome do monitor de comp1 era Monitor1 Mesmo tendo modificado apenas um dos objetos (o comp2) o comp1 tambeacutem foi modificado provando que na verdade os dois objetos referenciam o mesmo endereccedilo na memoacuteria

13

EXERCIacuteCIO

O aluno deveraacute desenvolver a classe funcionario que tem a seguinte especificaccedilatildeo

ATRIBUTOS Matricula int nome endereco string peso altura float sexo char

MEacuteTODOS

funcionaacuterio() este eacute o meacutetodo construtor padratildeo(lembre-se que o meacutetodo construtor tem o mesmo nome da classe)Entradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprimir a mensagem ldquoConstrutor Padrao Chamado rdquo

funcionaacuterio(string msg) este eacute outro meacutetodo construtor sobrecarregadoEntradas mensagem vinda do mainSaiacutedas nenhumaFunccedilatildeo imprime a mensagem recebida

funcionaacuterio(int mat string nom string end float pes float alt char sex ) este eacute outro meacutetodo construtor sobrecarregadoEntradas dados vindos do mainSaiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

atualizaDados(int mat string nom string end float pes float alt char sex) Entradas dados vindos do main

Saiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

imprimeDadosEntradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprime todos os dados do funcionario

Agora estaacute na hora de usar a classe Usando meacutetodos da classe funcionario definida acima e criada por vocecirc crie uma aplicaccedilatildeo que faccedila o seguinte na ordem dada

1 Instancie trecircs objeto da classe funcionaacuterio

objJoaoutilize o construtor padratildeo

objPedroutilize o segundo construtor e passe a mensagem

ldquoSegundo construtor obrecarregado chamado rdquo

objMaria chame o terceiro construtor e passe os seguintes dados

matricula 2341 nome ldquoMaria da Silvardquo endereccedilo Rua das Flores 34 peso 676 altura 176 sexo lsquoFrsquo

2 Imprima os dados do objeto objMaria

3 Atualize os dados do objJoao com

14

matricula 6784 nome ldquoJoao Marquesrdquo endereccedilo Rua das Acacias 45 peso 896 altura 190 sexo lsquoMrsquo

4 Atualize os dados do objPedro com

matricula 4523 nome ldquoPedro Villarrdquo endereccedilo Rua Torta 33 peso 789 altura 176 sexo lsquoMrsquo

5 Imprima os dados dos objetos objJoao e objPedro

17 HERANCcedilA

Heranccedila eacute um dos trecircs princiacutepios fundamentais da programaccedilatildeo orientada a objetos porque ela permite a criaccedilatildeo de hierarquia nos objetos que compotildeem o sistema Em C uma classe que tem seus dados e meacutetodos herdados por outra eacute chamada de classe base ou super classe e a classe que herda tais dados eacute chamada de classe derivada ou sub-classe

O que um aluno um professor e um funcionaacuterio possuem em comum Todos eles satildeo pessoas e portanto compartilham alguns dados comuns Todos tecircm nome idade endereccedilo etc E o que diferencia um aluno de outra pessoa qualquer Um aluno possui uma matriacutecula Um funcionaacuterio possui um coacutedigo de funcionaacuterio data de admissatildeo salaacuterio etc Um professor possui um coacutedigo de professor e informaccedilotildees relacionadas agrave sua formaccedilatildeo

Eacute aqui que a heranccedila se torna uma ferramenta de grande utilidade Podemos criar uma classe Pessoa que possui todos os atributos e meacutetodos comuns a todas as pessoas e herdar estes atributos e meacutetodos em classes mais especiacuteficas ou seja a heranccedila parte do geral para o mais especiacutefico Comece criando uma classe Pessoa como mostrado no coacutedigo a seguir

class Pessoa public string nome public int idade

Esta classe possui as propriedades nome e idade Estas propriedades satildeo comuns a todas as pessoas Veja agora como podemos criar uma classe Aluno que herda estas propriedades da classe Pessoa e inclui suas proacuteprias propriedades a saber seu nuacutemero de matriacutecula Eis o coacutedigo

class Aluno Pessoa public string matricula

Observe que em C os dois-pontos satildeo usados para indicar a heranccedila A classe Aluno agora possui trecircs atributos nome idade e matricula Veja um aplicativo demonstrando este relacionamento

static void Main(string[] args) cria um objeto da classe Aluno Aluno aluno = new Aluno()

alunonome = Osmar J Silva

As propriedades nome e idade foram herdadas da classe Pessoa pela classe Aluno

15

alunoidade = 36 alunomatricula = AC33-65

Exibe o resultado ConsoleWriteLine(Nome + alunonome + n + Idade + alunoidade + n + Matriacutecula + alunomatricula)

ConsoleWriteLine(nnPressione uma tecla para sair) ConsoleReadKey()

A heranccedila nos fornece um grande benefiacutecio Ao concentrarmos caracteriacutesticas comuns em uma classe e derivar as classes mais especiacuteficas a partir desta noacutes estamos preparados para a adiccedilatildeo de novas funcionalidades ao sistema Se mais adiante uma nova propriedade comum tiver que ser adicionada natildeo precisaremos efetuar alteraccedilotildees em todas as classes Basta alterar a superclasse e pronto As classes derivadas seratildeo automaticamente atualizadas

16

1048576

EXEMPLO DE COacuteDIGO CONSTRUINDO UMA CLASSE

Suponha que queiramos escrever um programa que manipula datas (minuto hora dia mecircs ano) Ao inveacutes de cinco variaacuteveis isoladas poderiacuteamos colocar estes dados em uma estrutura uacutenica englobando a data completa Assim poderiacuteamos declarar uma variaacutevel do tipo struct da seguinte maneira

struct Tempo int anoint mesint diaint horaint minuto

Ok ateacute aqui nada de novo (certo) Soacute declaramos uma estrutura em C padratildeo que conteacutem 5 variaacuteveis ano mecircs dia hora e minuto Agora imagine que aleacutem dessas variaacuteveis a estrutura Tempo pudesse tambeacutem ter embutida (encapsulada) funccedilotildees em C ou C Por exemplo uma funccedilatildeo que mostra a data na tela Esta estrutura seria mais ldquopoderosardquo pois os dados poderiam ser manipulados de dentro da proacutepria estrutura atraveacutes da sua funccedilatildeo interna Essa estrutura mais versaacutetil que conteacutem declaraccedilotildees de variaacuteveis e funccedilotildees constitui-se em uma classe como vimos anteriormente As variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos Assim poderiacuteamos reescrever nossa estrutura Tempo como uma classe cTempo

public class cTempo

public int ano variavel publica da classepublic int mes variavel publica da classepublic int dia variavel publica da classepublic int hora variavel publica da classepublic int minuto variavel publica da classe public void mostra_data() meacutetodo publico da classe

ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

Ok estamos prontos agora para usar nossa classe CTempo Como Temos que observar duas coisas

1 Natildeo trabalhamos com a classe CTempo Temos que instanciar um objeto da classe CTempo e trabalhar com este objeto

2 Abaixo temos a declaraccedilatildeo (instanciaccedilatildeo) do objeto e um pequeno programa em C

17

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos satildeo acessiacuteveis pelo main desde que sejam publicos public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto) Programa Principal static void Main(string[] args)

instanciando o objeto aniversario da classe cTempo cTempo aniversario = new cTempo() ConsoleWriteLine(Exemplo de POO em Cn)

para acessar metodos faccedila nome_objetonome_metodo

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data Para acessar atributos publicos faccedila nome_objetonome_atributo

aniversariodia = 9 aniversariomes = 2 aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23 ConsoleWriteLine(Nova datan) aniversariomostra_data() ConsoleReadKey()

A saiacuteda do programa seraacute

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 3: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

3

CRITEacuteRIOS DE AVALIACcedilAtildeO

Avaliaccedilatildeo Prova 11 5 pontos Prova 12 35 pontos Prova 21 5 pontos Prova 22 35 pontos Trab1 10 pontos Trab2 10 pontos ________________ Total 100 pontos

Obs1 O aluno teraacute direito a uma prova substitutiva na data prevista no calendaacuterio Natildeo eacute permitido fazer prova substitutiva para melhorar a nota de uma prova jaacute realizada O conteuacutedo da prova seraacute toda a mateacuteria

Obs2 Abono de faltas somente de acordo com os casos previstos no estatuto da PUC Portanto verifique a chamada do seu nome

Obs3 Valor da reavaliaccedilatildeo 100 pontos Nota final meacutedia da reavaliaccedilatildeo mais nota semestral Nota para fazer a reavaliaccedilatildeo igual ou superior a 40 pontos e menor de 60 pontos

Obs4 Todo o material da disciplina seraacute disponibilizado no SGA mas eacute importante tambeacutem estudar nos livros relacionados abaixo

Bibliografia Baacutesica

ZIVIANI Nivio Projeto de algoritmos com implementaccedilotildees em Java e C++ Satildeo Paulo Thomson Learning c2007 621 p ISBN 8522105251 (Consta no acervo da PUC Minas)

MANZANO Joseacute Augusto N G OLIVEIRA Jayr Figueiredo de Algoritmos logica para desenvolvimento de programaccedilatildeo 11 ed Satildeo Paulo Erica 2001 236p ISBN 85-7194-718-X (Consta no acervo da PUC Minas)

SZWARCFITER Jayme Luiz MARKENZON Lilian Estruturas de dados e seus algoritmos 2ed rev Rio de Janeiro LTC - Livros Teacutecnicos e Cientiacuteficos c1994 320p ISBN 8521610149 (Consta no acervo da PUC Minas)

Bibliografia Complementar

CORMEN Thomas H et al Algoritmos teoria e praacutetica Rio de Janeiro Campus 2002 916p ISBN 8535209263 (Consta no acervo da PUC Minas)

KNUTH Donald Ervin The art of computer programming volume 1 fundamental algorithms 3rd ed Reading Addison Wesley 1997- 650p (Consta no acervo da PUC Minas)

KNUTH Donald Ervin The art of computer programming volume 2 seminumerical algorithms 3rd ed Reading Addison Wesley 2003 762p (Consta no acervo da PUC Minas)

KNUTH Donald Ervin The art of computer programming volume 3 sorting and searching 2nd ed Reading

4

Addison Wesley 2003 780p (Consta no acervo da PUC Minas)

1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)

Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo Um objeto eacute uma entidade auto-contida com uma identidade e propriedades particulares

11 CONCEITOS FUNDAMENTAIS

1 Encapsulamento2 Heranccedila e Reuso3 Polimorfismo

ENCAPSULAMENTO

bull Um transistor eacute auto-contido ele faz uma tarefa bem definida e faz completamente bull Fazer uma tarefa completamente eacute chamada de encapsulamentobull Todas as propriedades do transistor satildeo encapsuladas no objeto transistorbull Natildeo eacute necessaacuterio saber como o transistor trabalha para usaacute-lo efetivamente

HERANCcedilA E REUSO

bull A ideacuteia de reuso eacute suportada atraveacutes da heranccedila de classesbull Um novo tipo que eacute uma extensatildeo de um tipo jaacute existente pode ser declaradobull Esta nova sub-classe eacute derivada da classe existente e eacute chamada classe derivada

bull Heranccedila eacute o mecanismo que permite a Classe Derivada herdar as propriedades da classe Base

bull Dizemos que ldquoA Derivada herda da Baserdquobull Objetos da classe Derivada tem acesso a dados e funccedilotildees da classe Base sem a necessidade

de redefini-los

bull HERANCcedilA SIMPLES

bull Uma classe derivada pode ser a classe base para outras derivaccedilotildees

5

POLIMORFISMO

bull O polimorfismo permite a uma entidade (variaacutevel funccedilatildeo ou objeto) ter vaacuterias representaccedilotildeesbull Uma variaacutevel pode ter diferentes tipos dependendo do contexto em um momento particularbull O polimorfismo permite-nos usar o mesmo nome de funccedilotildees desde que a lista de paracircmetros seja

diferente (Sobrecarga de funccedilotildees)bull Objetos herdados de uma classe podem ser sobrecarregados em uma classe derivadabullbull Analisando a palavra Polimorfismo ela significa muitas formas Ou seja para uma aacutervore de

heranccedila temos muitas formas de objetos e meacutetodos a partir de uma superclasse e suas subclasses Polimorfismo eacute o princiacutepio pelo qual usamos objetos construiacutedos a partir de uma aacutervore de heranccedila atraveacutes de referecircncias do tipo de uma superclasse da hierarquia

bull Formas de polimorfismobull Subclassesbull Sobrescrita de meacutetodobull Sobrecarga de meacutetodo ou construtorbull Sobre escrita de meacutetodos ndash Overriding bull Esta utilidade nos permite escrever numa subclasse um ou mais meacutetodos presentes numa das

superclasses podendo alterar o comportamento da superclasse bull Exemplo

Classe Base

Classe Derivada A

Classe Derivada B

Classe Derivada C

Classe Base para a Classe Derivada A

Classe Base para a Classe Derivada B

Classe Base para as Classes Derivadas CD e E

Classe Derivada D

Classe Derivada E

6

bull Quando numa subclasse reescrevemos um meacutetodo jaacute existente numa superclasse chamamos de sobre escrita de meacutetodo ou reescrita de meacutetodo mas o termo teacutecnico eacute Method Overriding Lembrando que a sobre escrita de meacutetodos soacute eacute valida quando o meacutetodo reescrito na subclasse tem exatamente a mesma identificaccedilatildeo (nome tipos etc) do meacutetodo da superclasse

bullbull Sobrecarga de meacutetodos ndash Overloading bull O Polimorfismo ainda permite que numa mesma classe tenhamos meacutetodos com o mesmo nome

desde que o nuacutemero ou tipos de paracircmetros passados sejam diferentes bull Exemplo

7

bull A sobrecarga de meacutetodos eacute uma ferramenta poderosa pois nos permite criar vaacuterios meacutetodos com o mesmo nome isso facilita o entendimento de problemas mais complexos pois natildeo eacute necessaacuteria a criaccedilatildeo de nomes de funcionalidades sem sentido aparente

8

12 CLASSES

bull Uma classe eacute uma estrutura que encapsula dados (chamados de propriedades) e funccedilotildees (chamadas de meacutetodos) em um pacote auto-contido

13 OBJETOS

Um objeto eacute uma instacircncia de uma classe Podemos entender a classe como uma declaraccedilatildeo e o objeto como uma variaacutevel do tipo da classe Trabalhamos com o objeto a classe nos diz somente de que tipo o objeto eacute

Eacute identificado unicamente pelo seu nome Define um estado que eacute representado pelos valores dos seus atributos em um dado momento O comportamento de um objeto eacute definido pelo conjunto de funccedilotildees que podem ser aplicados a ele Podem existir vaacuterios objetos de uma mesma classe POO eacute portanto a implementaccedilatildeo de tipos abstratos de dados classes e objetos Um programa escrito em C++ ou C pode ser visto como uma coleccedilatildeo de objetos

CRIANDO OBJETOS

Agora que jaacute sabemos como definir uma classe podemos passar ao ponto de criar objetos da classe definida Eacute importante perceber o fato de que podemos criar vaacuterios objetos da mesma classe natildeo ficando limitado a apenas um objeto

No C++ podemos declarar um objeto de maneira estaacutetica Suponha que a classe cTempo jaacute estaacute definida Veja a declaraccedilatildeo abaixo em C++

cTempo Aniversario Aniversario eacute um objeto (instacircncia da classe cTempo)

Quando vamos criar um objeto em C utilizamos a palavra chave new seguindo o seguinte esquema

ltTipogt ltnomegt = new ltTipogt()

Assim teriacuteamos em relaccedilatildeo ao exemplo anterior

MEacuteTODOS

PROPRIEDADES

CLASSE

Os meacutetodos satildeo funccedilotildees normais em linguagem C ou C++

As propriedades satildeo variaacuteveis normais int char struct

9

cTempo Aniversario = new cTempo() Aniversario eacute um objeto (instacircncia da classe cTempo)

Veja entatildeo um exemplo de criaccedilatildeo de um objeto de uma classe hipoteacutetica Computador com o nome de comp1

Computador comp1 = new Computador() comp1 e um objeto da classe Computador

O operador new eacute responsaacutevel por calcular o nuacutemero correto de bytes para o objeto especificado e adquirir memoacuteria suficiente (esta aacuterea de memoacuteria eacute chamada de heap) Assim no C a keyword new eacute o caminho para criar um objeto Dentro de uma classe assim como em programas comuns da linguagem lsquoCrsquo podem existir variaacuteveis e funccedilotildees Dentro da classe as variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos

Veja outro exemplo

using System

class HelloClass propriedades meacutetodos

public static int Main(string[] args) Vocecirc pode declarar e criar um novo objeto em uma simples linha HelloClass c1 = new HelloClass()

ou quebrar a declaraccedilatildeo e criaccedilatildeo em duas linhas HelloClass c2 c2 = new HelloClass()

Aqui satildeo alocados dois objetos da classe HelloClass Variaacuteveis de objeto em C realmente satildeo uma referecircncia ao objeto na memoacuteria natildeo o proacuteprio objeto em si Assim c1 e c2 referenciam dois objetos da classe HelloClass alocados na memoacuteria heap

Perceba que na criaccedilatildeo do objetos c1 e c2 apoacutes o new chamamos o tipo HelloClass seguido de parecircnteses Essa notaccedilatildeo significa que neste momento seraacute executado um meacutetodo especial da classe HelloClass chamado construtor

14 MEacuteTODO CONSTRUTOR

O construtor eacute um meacutetodo que possui o mesmo nome da classe que natildeo retorna nenhum valor e que eacute chamado cada vez que um objeto da classe eacute criado Por padratildeo quando natildeo criamos nenhum construtor (como na classe HelloClass) o construtor vazio que natildeo recebe nenhum paracircmetro e tambeacutem natildeo executa nenhum coacutedigo eacute criado automaticamente Apoacutes criarmos um construtor o construtor vazio automaacutetico natildeo eacute mais criado devendo ser criado pelo desenvolvedor caso precise Veja o exemplo abaixo

10

HelloClass com construtores

using System

class HelloClass

public string strMensagem

Construtor padratildeo

public HelloClass()

ConsoleWriteLine(Construtor padratildeo chamado)

Construtor customizado

public HelloClass (string msg)

ConsoleWriteLine(Construtor customizado chamado)

strMensagem = msg

Ponto de entrada do programa

public static int Main(string[] args)

Chamando o construtor padratildeo

HelloClass c1 = new HelloClass()

ConsoleWriteLine(Mensagem do usuaacuterio 0n c1strMensagem)

Chamando o construtor customizado passando uma string como paracircmetro

HelloClass c2

c2 = new HelloClass(Testando 1 2 3)

ConsoleWriteLine(Mensagem do usuaacuterio 0 c2strMensagem)

ConsoleReadLine()

return 0

15 ATRIBUTOS E MEacuteTODOS

Veja a classe Computador com um construtor que recebe 3 strings e preenche os atributos da classe com essas strings monitor teclado e mouse satildeo os atributos da classe

Meacutetodo com o mesmo nome da classe sem paracircmetro

Meacutetodo com o mesmo nome da classe com paracircmetro

11

namespace Construtor

class Computador

string monitorstring tecladostring mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

Computador comp1 = new Computador(Monitor1Teclado1Mouse1)Computador comp2 = new Computador(Monitor2Teclado2Mouse2)Computador comp3 = new Computador(SamsungAcerLogitch)

Obs Foram criados 3 objetos (comp1 comp2 e comp3) da classe Computador onde cada um recebeu 3 argumentos diferentes

16 TIPOS POR VALOR X TIPOS POR REFEREcircNCIA

Os tipos preacute-definidos em C satildeo normalmente conhecidos como tipos por valor Esses tipos devem permitir um acesso raacutepido jaacute que satildeo muitas vezes utilizados no coacutedigo Dessa forma os tipos por valor tecircm guardados na memoacuteria apenas o seu valor sem nenhuma outra informaccedilatildeo adicional que poderia causar um gasto desnecessaacuterio de memoacuteria

Os tipos criados por classes os objetos satildeo conhecidos como tipos por referecircncia Essa denominaccedilatildeo vem do fato de que esses tipos natildeo guardam o seu valor mas sim uma referecircncia para um local na memoacuteria que conteacutem o valor No C e no C++ chamariacuteamos esta referecircncia de ponteiro

Com essas definiccedilotildees eacute importante perceber que se copiarmos as informaccedilotildees de variaacuteveis de tipos por valor e de variaacuteveis de tipos por referecircncia teremos comportamentos diferentes Caso copiemos uma variaacutevel por valor o que ocorre eacute que uma nova coacutepia do valor eacute passada para a outra variaacutevel Isso significa que caso modifiquemos uma das variaacuteveis nada ocorreraacute com a outra

Em variaacuteveis por referecircncia o que ocorre ao copiarmos para outra variaacutevel eacute que apenas a referecircncia eacute copiada natildeo o valor Apoacutes a coacutepia o que acontece eacute que teremos duas variaacuteveis apontando para um mesmo valor Isso significa que ao modificarmos uma variaacutevel estaremos na realidade modificando o valor para o qual a outra variaacutevel tambeacutem estaacute apontando significando que o valor da outra variaacutevel tambeacutem seraacute modificado

Meacutetodo construtor (tem o mesmo nome da classe) e recebe 3 paracircmetros

Atributos da Classe satildeo variaacuteveis comuns e podem ser de qualquer tipo

Programa Principalonde os objetos satildeo criados (instanciados)

Meacutetodo imprime um meacutetodo da classe Veja que eacute uma simples funccedilatildeo para impressatildeo

12

Veja o coacutedigo abaixo e observe o resultado

class Computador public string monitor public string tecladdo public string mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public void Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

cria uma variaacutevel de tipo por valorint valor1 = 10copia para outra variaacutevelint valor2 = valor1adiciona 5 a valor2valor2 += 5imprime o valor das duasConsoleWriteLine(valor1 + valor1)ConsoleWriteLine(valor2 + valor2)

cria um objeto de tipo por referecircnciaComputador comp1 = new Computador(Monitor1Teclado1Mouse1)

copia a referecircncia do objeto comp1 para o objeto comp2Computador comp2 = comp1

modifica o valor do monitorcomp2monitor = Modificadoimprime os dois computadorescomp1imprime()comp2imprime()

Veja o resultado

Veja que inicialmente o nome do monitor de comp1 era Monitor1 Mesmo tendo modificado apenas um dos objetos (o comp2) o comp1 tambeacutem foi modificado provando que na verdade os dois objetos referenciam o mesmo endereccedilo na memoacuteria

13

EXERCIacuteCIO

O aluno deveraacute desenvolver a classe funcionario que tem a seguinte especificaccedilatildeo

ATRIBUTOS Matricula int nome endereco string peso altura float sexo char

MEacuteTODOS

funcionaacuterio() este eacute o meacutetodo construtor padratildeo(lembre-se que o meacutetodo construtor tem o mesmo nome da classe)Entradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprimir a mensagem ldquoConstrutor Padrao Chamado rdquo

funcionaacuterio(string msg) este eacute outro meacutetodo construtor sobrecarregadoEntradas mensagem vinda do mainSaiacutedas nenhumaFunccedilatildeo imprime a mensagem recebida

funcionaacuterio(int mat string nom string end float pes float alt char sex ) este eacute outro meacutetodo construtor sobrecarregadoEntradas dados vindos do mainSaiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

atualizaDados(int mat string nom string end float pes float alt char sex) Entradas dados vindos do main

Saiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

imprimeDadosEntradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprime todos os dados do funcionario

Agora estaacute na hora de usar a classe Usando meacutetodos da classe funcionario definida acima e criada por vocecirc crie uma aplicaccedilatildeo que faccedila o seguinte na ordem dada

1 Instancie trecircs objeto da classe funcionaacuterio

objJoaoutilize o construtor padratildeo

objPedroutilize o segundo construtor e passe a mensagem

ldquoSegundo construtor obrecarregado chamado rdquo

objMaria chame o terceiro construtor e passe os seguintes dados

matricula 2341 nome ldquoMaria da Silvardquo endereccedilo Rua das Flores 34 peso 676 altura 176 sexo lsquoFrsquo

2 Imprima os dados do objeto objMaria

3 Atualize os dados do objJoao com

14

matricula 6784 nome ldquoJoao Marquesrdquo endereccedilo Rua das Acacias 45 peso 896 altura 190 sexo lsquoMrsquo

4 Atualize os dados do objPedro com

matricula 4523 nome ldquoPedro Villarrdquo endereccedilo Rua Torta 33 peso 789 altura 176 sexo lsquoMrsquo

5 Imprima os dados dos objetos objJoao e objPedro

17 HERANCcedilA

Heranccedila eacute um dos trecircs princiacutepios fundamentais da programaccedilatildeo orientada a objetos porque ela permite a criaccedilatildeo de hierarquia nos objetos que compotildeem o sistema Em C uma classe que tem seus dados e meacutetodos herdados por outra eacute chamada de classe base ou super classe e a classe que herda tais dados eacute chamada de classe derivada ou sub-classe

O que um aluno um professor e um funcionaacuterio possuem em comum Todos eles satildeo pessoas e portanto compartilham alguns dados comuns Todos tecircm nome idade endereccedilo etc E o que diferencia um aluno de outra pessoa qualquer Um aluno possui uma matriacutecula Um funcionaacuterio possui um coacutedigo de funcionaacuterio data de admissatildeo salaacuterio etc Um professor possui um coacutedigo de professor e informaccedilotildees relacionadas agrave sua formaccedilatildeo

Eacute aqui que a heranccedila se torna uma ferramenta de grande utilidade Podemos criar uma classe Pessoa que possui todos os atributos e meacutetodos comuns a todas as pessoas e herdar estes atributos e meacutetodos em classes mais especiacuteficas ou seja a heranccedila parte do geral para o mais especiacutefico Comece criando uma classe Pessoa como mostrado no coacutedigo a seguir

class Pessoa public string nome public int idade

Esta classe possui as propriedades nome e idade Estas propriedades satildeo comuns a todas as pessoas Veja agora como podemos criar uma classe Aluno que herda estas propriedades da classe Pessoa e inclui suas proacuteprias propriedades a saber seu nuacutemero de matriacutecula Eis o coacutedigo

class Aluno Pessoa public string matricula

Observe que em C os dois-pontos satildeo usados para indicar a heranccedila A classe Aluno agora possui trecircs atributos nome idade e matricula Veja um aplicativo demonstrando este relacionamento

static void Main(string[] args) cria um objeto da classe Aluno Aluno aluno = new Aluno()

alunonome = Osmar J Silva

As propriedades nome e idade foram herdadas da classe Pessoa pela classe Aluno

15

alunoidade = 36 alunomatricula = AC33-65

Exibe o resultado ConsoleWriteLine(Nome + alunonome + n + Idade + alunoidade + n + Matriacutecula + alunomatricula)

ConsoleWriteLine(nnPressione uma tecla para sair) ConsoleReadKey()

A heranccedila nos fornece um grande benefiacutecio Ao concentrarmos caracteriacutesticas comuns em uma classe e derivar as classes mais especiacuteficas a partir desta noacutes estamos preparados para a adiccedilatildeo de novas funcionalidades ao sistema Se mais adiante uma nova propriedade comum tiver que ser adicionada natildeo precisaremos efetuar alteraccedilotildees em todas as classes Basta alterar a superclasse e pronto As classes derivadas seratildeo automaticamente atualizadas

16

1048576

EXEMPLO DE COacuteDIGO CONSTRUINDO UMA CLASSE

Suponha que queiramos escrever um programa que manipula datas (minuto hora dia mecircs ano) Ao inveacutes de cinco variaacuteveis isoladas poderiacuteamos colocar estes dados em uma estrutura uacutenica englobando a data completa Assim poderiacuteamos declarar uma variaacutevel do tipo struct da seguinte maneira

struct Tempo int anoint mesint diaint horaint minuto

Ok ateacute aqui nada de novo (certo) Soacute declaramos uma estrutura em C padratildeo que conteacutem 5 variaacuteveis ano mecircs dia hora e minuto Agora imagine que aleacutem dessas variaacuteveis a estrutura Tempo pudesse tambeacutem ter embutida (encapsulada) funccedilotildees em C ou C Por exemplo uma funccedilatildeo que mostra a data na tela Esta estrutura seria mais ldquopoderosardquo pois os dados poderiam ser manipulados de dentro da proacutepria estrutura atraveacutes da sua funccedilatildeo interna Essa estrutura mais versaacutetil que conteacutem declaraccedilotildees de variaacuteveis e funccedilotildees constitui-se em uma classe como vimos anteriormente As variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos Assim poderiacuteamos reescrever nossa estrutura Tempo como uma classe cTempo

public class cTempo

public int ano variavel publica da classepublic int mes variavel publica da classepublic int dia variavel publica da classepublic int hora variavel publica da classepublic int minuto variavel publica da classe public void mostra_data() meacutetodo publico da classe

ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

Ok estamos prontos agora para usar nossa classe CTempo Como Temos que observar duas coisas

1 Natildeo trabalhamos com a classe CTempo Temos que instanciar um objeto da classe CTempo e trabalhar com este objeto

2 Abaixo temos a declaraccedilatildeo (instanciaccedilatildeo) do objeto e um pequeno programa em C

17

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos satildeo acessiacuteveis pelo main desde que sejam publicos public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto) Programa Principal static void Main(string[] args)

instanciando o objeto aniversario da classe cTempo cTempo aniversario = new cTempo() ConsoleWriteLine(Exemplo de POO em Cn)

para acessar metodos faccedila nome_objetonome_metodo

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data Para acessar atributos publicos faccedila nome_objetonome_atributo

aniversariodia = 9 aniversariomes = 2 aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23 ConsoleWriteLine(Nova datan) aniversariomostra_data() ConsoleReadKey()

A saiacuteda do programa seraacute

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 4: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

4

Addison Wesley 2003 780p (Consta no acervo da PUC Minas)

1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)

Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo Um objeto eacute uma entidade auto-contida com uma identidade e propriedades particulares

11 CONCEITOS FUNDAMENTAIS

1 Encapsulamento2 Heranccedila e Reuso3 Polimorfismo

ENCAPSULAMENTO

bull Um transistor eacute auto-contido ele faz uma tarefa bem definida e faz completamente bull Fazer uma tarefa completamente eacute chamada de encapsulamentobull Todas as propriedades do transistor satildeo encapsuladas no objeto transistorbull Natildeo eacute necessaacuterio saber como o transistor trabalha para usaacute-lo efetivamente

HERANCcedilA E REUSO

bull A ideacuteia de reuso eacute suportada atraveacutes da heranccedila de classesbull Um novo tipo que eacute uma extensatildeo de um tipo jaacute existente pode ser declaradobull Esta nova sub-classe eacute derivada da classe existente e eacute chamada classe derivada

bull Heranccedila eacute o mecanismo que permite a Classe Derivada herdar as propriedades da classe Base

bull Dizemos que ldquoA Derivada herda da Baserdquobull Objetos da classe Derivada tem acesso a dados e funccedilotildees da classe Base sem a necessidade

de redefini-los

bull HERANCcedilA SIMPLES

bull Uma classe derivada pode ser a classe base para outras derivaccedilotildees

5

POLIMORFISMO

bull O polimorfismo permite a uma entidade (variaacutevel funccedilatildeo ou objeto) ter vaacuterias representaccedilotildeesbull Uma variaacutevel pode ter diferentes tipos dependendo do contexto em um momento particularbull O polimorfismo permite-nos usar o mesmo nome de funccedilotildees desde que a lista de paracircmetros seja

diferente (Sobrecarga de funccedilotildees)bull Objetos herdados de uma classe podem ser sobrecarregados em uma classe derivadabullbull Analisando a palavra Polimorfismo ela significa muitas formas Ou seja para uma aacutervore de

heranccedila temos muitas formas de objetos e meacutetodos a partir de uma superclasse e suas subclasses Polimorfismo eacute o princiacutepio pelo qual usamos objetos construiacutedos a partir de uma aacutervore de heranccedila atraveacutes de referecircncias do tipo de uma superclasse da hierarquia

bull Formas de polimorfismobull Subclassesbull Sobrescrita de meacutetodobull Sobrecarga de meacutetodo ou construtorbull Sobre escrita de meacutetodos ndash Overriding bull Esta utilidade nos permite escrever numa subclasse um ou mais meacutetodos presentes numa das

superclasses podendo alterar o comportamento da superclasse bull Exemplo

Classe Base

Classe Derivada A

Classe Derivada B

Classe Derivada C

Classe Base para a Classe Derivada A

Classe Base para a Classe Derivada B

Classe Base para as Classes Derivadas CD e E

Classe Derivada D

Classe Derivada E

6

bull Quando numa subclasse reescrevemos um meacutetodo jaacute existente numa superclasse chamamos de sobre escrita de meacutetodo ou reescrita de meacutetodo mas o termo teacutecnico eacute Method Overriding Lembrando que a sobre escrita de meacutetodos soacute eacute valida quando o meacutetodo reescrito na subclasse tem exatamente a mesma identificaccedilatildeo (nome tipos etc) do meacutetodo da superclasse

bullbull Sobrecarga de meacutetodos ndash Overloading bull O Polimorfismo ainda permite que numa mesma classe tenhamos meacutetodos com o mesmo nome

desde que o nuacutemero ou tipos de paracircmetros passados sejam diferentes bull Exemplo

7

bull A sobrecarga de meacutetodos eacute uma ferramenta poderosa pois nos permite criar vaacuterios meacutetodos com o mesmo nome isso facilita o entendimento de problemas mais complexos pois natildeo eacute necessaacuteria a criaccedilatildeo de nomes de funcionalidades sem sentido aparente

8

12 CLASSES

bull Uma classe eacute uma estrutura que encapsula dados (chamados de propriedades) e funccedilotildees (chamadas de meacutetodos) em um pacote auto-contido

13 OBJETOS

Um objeto eacute uma instacircncia de uma classe Podemos entender a classe como uma declaraccedilatildeo e o objeto como uma variaacutevel do tipo da classe Trabalhamos com o objeto a classe nos diz somente de que tipo o objeto eacute

Eacute identificado unicamente pelo seu nome Define um estado que eacute representado pelos valores dos seus atributos em um dado momento O comportamento de um objeto eacute definido pelo conjunto de funccedilotildees que podem ser aplicados a ele Podem existir vaacuterios objetos de uma mesma classe POO eacute portanto a implementaccedilatildeo de tipos abstratos de dados classes e objetos Um programa escrito em C++ ou C pode ser visto como uma coleccedilatildeo de objetos

CRIANDO OBJETOS

Agora que jaacute sabemos como definir uma classe podemos passar ao ponto de criar objetos da classe definida Eacute importante perceber o fato de que podemos criar vaacuterios objetos da mesma classe natildeo ficando limitado a apenas um objeto

No C++ podemos declarar um objeto de maneira estaacutetica Suponha que a classe cTempo jaacute estaacute definida Veja a declaraccedilatildeo abaixo em C++

cTempo Aniversario Aniversario eacute um objeto (instacircncia da classe cTempo)

Quando vamos criar um objeto em C utilizamos a palavra chave new seguindo o seguinte esquema

ltTipogt ltnomegt = new ltTipogt()

Assim teriacuteamos em relaccedilatildeo ao exemplo anterior

MEacuteTODOS

PROPRIEDADES

CLASSE

Os meacutetodos satildeo funccedilotildees normais em linguagem C ou C++

As propriedades satildeo variaacuteveis normais int char struct

9

cTempo Aniversario = new cTempo() Aniversario eacute um objeto (instacircncia da classe cTempo)

Veja entatildeo um exemplo de criaccedilatildeo de um objeto de uma classe hipoteacutetica Computador com o nome de comp1

Computador comp1 = new Computador() comp1 e um objeto da classe Computador

O operador new eacute responsaacutevel por calcular o nuacutemero correto de bytes para o objeto especificado e adquirir memoacuteria suficiente (esta aacuterea de memoacuteria eacute chamada de heap) Assim no C a keyword new eacute o caminho para criar um objeto Dentro de uma classe assim como em programas comuns da linguagem lsquoCrsquo podem existir variaacuteveis e funccedilotildees Dentro da classe as variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos

Veja outro exemplo

using System

class HelloClass propriedades meacutetodos

public static int Main(string[] args) Vocecirc pode declarar e criar um novo objeto em uma simples linha HelloClass c1 = new HelloClass()

ou quebrar a declaraccedilatildeo e criaccedilatildeo em duas linhas HelloClass c2 c2 = new HelloClass()

Aqui satildeo alocados dois objetos da classe HelloClass Variaacuteveis de objeto em C realmente satildeo uma referecircncia ao objeto na memoacuteria natildeo o proacuteprio objeto em si Assim c1 e c2 referenciam dois objetos da classe HelloClass alocados na memoacuteria heap

Perceba que na criaccedilatildeo do objetos c1 e c2 apoacutes o new chamamos o tipo HelloClass seguido de parecircnteses Essa notaccedilatildeo significa que neste momento seraacute executado um meacutetodo especial da classe HelloClass chamado construtor

14 MEacuteTODO CONSTRUTOR

O construtor eacute um meacutetodo que possui o mesmo nome da classe que natildeo retorna nenhum valor e que eacute chamado cada vez que um objeto da classe eacute criado Por padratildeo quando natildeo criamos nenhum construtor (como na classe HelloClass) o construtor vazio que natildeo recebe nenhum paracircmetro e tambeacutem natildeo executa nenhum coacutedigo eacute criado automaticamente Apoacutes criarmos um construtor o construtor vazio automaacutetico natildeo eacute mais criado devendo ser criado pelo desenvolvedor caso precise Veja o exemplo abaixo

10

HelloClass com construtores

using System

class HelloClass

public string strMensagem

Construtor padratildeo

public HelloClass()

ConsoleWriteLine(Construtor padratildeo chamado)

Construtor customizado

public HelloClass (string msg)

ConsoleWriteLine(Construtor customizado chamado)

strMensagem = msg

Ponto de entrada do programa

public static int Main(string[] args)

Chamando o construtor padratildeo

HelloClass c1 = new HelloClass()

ConsoleWriteLine(Mensagem do usuaacuterio 0n c1strMensagem)

Chamando o construtor customizado passando uma string como paracircmetro

HelloClass c2

c2 = new HelloClass(Testando 1 2 3)

ConsoleWriteLine(Mensagem do usuaacuterio 0 c2strMensagem)

ConsoleReadLine()

return 0

15 ATRIBUTOS E MEacuteTODOS

Veja a classe Computador com um construtor que recebe 3 strings e preenche os atributos da classe com essas strings monitor teclado e mouse satildeo os atributos da classe

Meacutetodo com o mesmo nome da classe sem paracircmetro

Meacutetodo com o mesmo nome da classe com paracircmetro

11

namespace Construtor

class Computador

string monitorstring tecladostring mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

Computador comp1 = new Computador(Monitor1Teclado1Mouse1)Computador comp2 = new Computador(Monitor2Teclado2Mouse2)Computador comp3 = new Computador(SamsungAcerLogitch)

Obs Foram criados 3 objetos (comp1 comp2 e comp3) da classe Computador onde cada um recebeu 3 argumentos diferentes

16 TIPOS POR VALOR X TIPOS POR REFEREcircNCIA

Os tipos preacute-definidos em C satildeo normalmente conhecidos como tipos por valor Esses tipos devem permitir um acesso raacutepido jaacute que satildeo muitas vezes utilizados no coacutedigo Dessa forma os tipos por valor tecircm guardados na memoacuteria apenas o seu valor sem nenhuma outra informaccedilatildeo adicional que poderia causar um gasto desnecessaacuterio de memoacuteria

Os tipos criados por classes os objetos satildeo conhecidos como tipos por referecircncia Essa denominaccedilatildeo vem do fato de que esses tipos natildeo guardam o seu valor mas sim uma referecircncia para um local na memoacuteria que conteacutem o valor No C e no C++ chamariacuteamos esta referecircncia de ponteiro

Com essas definiccedilotildees eacute importante perceber que se copiarmos as informaccedilotildees de variaacuteveis de tipos por valor e de variaacuteveis de tipos por referecircncia teremos comportamentos diferentes Caso copiemos uma variaacutevel por valor o que ocorre eacute que uma nova coacutepia do valor eacute passada para a outra variaacutevel Isso significa que caso modifiquemos uma das variaacuteveis nada ocorreraacute com a outra

Em variaacuteveis por referecircncia o que ocorre ao copiarmos para outra variaacutevel eacute que apenas a referecircncia eacute copiada natildeo o valor Apoacutes a coacutepia o que acontece eacute que teremos duas variaacuteveis apontando para um mesmo valor Isso significa que ao modificarmos uma variaacutevel estaremos na realidade modificando o valor para o qual a outra variaacutevel tambeacutem estaacute apontando significando que o valor da outra variaacutevel tambeacutem seraacute modificado

Meacutetodo construtor (tem o mesmo nome da classe) e recebe 3 paracircmetros

Atributos da Classe satildeo variaacuteveis comuns e podem ser de qualquer tipo

Programa Principalonde os objetos satildeo criados (instanciados)

Meacutetodo imprime um meacutetodo da classe Veja que eacute uma simples funccedilatildeo para impressatildeo

12

Veja o coacutedigo abaixo e observe o resultado

class Computador public string monitor public string tecladdo public string mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public void Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

cria uma variaacutevel de tipo por valorint valor1 = 10copia para outra variaacutevelint valor2 = valor1adiciona 5 a valor2valor2 += 5imprime o valor das duasConsoleWriteLine(valor1 + valor1)ConsoleWriteLine(valor2 + valor2)

cria um objeto de tipo por referecircnciaComputador comp1 = new Computador(Monitor1Teclado1Mouse1)

copia a referecircncia do objeto comp1 para o objeto comp2Computador comp2 = comp1

modifica o valor do monitorcomp2monitor = Modificadoimprime os dois computadorescomp1imprime()comp2imprime()

Veja o resultado

Veja que inicialmente o nome do monitor de comp1 era Monitor1 Mesmo tendo modificado apenas um dos objetos (o comp2) o comp1 tambeacutem foi modificado provando que na verdade os dois objetos referenciam o mesmo endereccedilo na memoacuteria

13

EXERCIacuteCIO

O aluno deveraacute desenvolver a classe funcionario que tem a seguinte especificaccedilatildeo

ATRIBUTOS Matricula int nome endereco string peso altura float sexo char

MEacuteTODOS

funcionaacuterio() este eacute o meacutetodo construtor padratildeo(lembre-se que o meacutetodo construtor tem o mesmo nome da classe)Entradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprimir a mensagem ldquoConstrutor Padrao Chamado rdquo

funcionaacuterio(string msg) este eacute outro meacutetodo construtor sobrecarregadoEntradas mensagem vinda do mainSaiacutedas nenhumaFunccedilatildeo imprime a mensagem recebida

funcionaacuterio(int mat string nom string end float pes float alt char sex ) este eacute outro meacutetodo construtor sobrecarregadoEntradas dados vindos do mainSaiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

atualizaDados(int mat string nom string end float pes float alt char sex) Entradas dados vindos do main

Saiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

imprimeDadosEntradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprime todos os dados do funcionario

Agora estaacute na hora de usar a classe Usando meacutetodos da classe funcionario definida acima e criada por vocecirc crie uma aplicaccedilatildeo que faccedila o seguinte na ordem dada

1 Instancie trecircs objeto da classe funcionaacuterio

objJoaoutilize o construtor padratildeo

objPedroutilize o segundo construtor e passe a mensagem

ldquoSegundo construtor obrecarregado chamado rdquo

objMaria chame o terceiro construtor e passe os seguintes dados

matricula 2341 nome ldquoMaria da Silvardquo endereccedilo Rua das Flores 34 peso 676 altura 176 sexo lsquoFrsquo

2 Imprima os dados do objeto objMaria

3 Atualize os dados do objJoao com

14

matricula 6784 nome ldquoJoao Marquesrdquo endereccedilo Rua das Acacias 45 peso 896 altura 190 sexo lsquoMrsquo

4 Atualize os dados do objPedro com

matricula 4523 nome ldquoPedro Villarrdquo endereccedilo Rua Torta 33 peso 789 altura 176 sexo lsquoMrsquo

5 Imprima os dados dos objetos objJoao e objPedro

17 HERANCcedilA

Heranccedila eacute um dos trecircs princiacutepios fundamentais da programaccedilatildeo orientada a objetos porque ela permite a criaccedilatildeo de hierarquia nos objetos que compotildeem o sistema Em C uma classe que tem seus dados e meacutetodos herdados por outra eacute chamada de classe base ou super classe e a classe que herda tais dados eacute chamada de classe derivada ou sub-classe

O que um aluno um professor e um funcionaacuterio possuem em comum Todos eles satildeo pessoas e portanto compartilham alguns dados comuns Todos tecircm nome idade endereccedilo etc E o que diferencia um aluno de outra pessoa qualquer Um aluno possui uma matriacutecula Um funcionaacuterio possui um coacutedigo de funcionaacuterio data de admissatildeo salaacuterio etc Um professor possui um coacutedigo de professor e informaccedilotildees relacionadas agrave sua formaccedilatildeo

Eacute aqui que a heranccedila se torna uma ferramenta de grande utilidade Podemos criar uma classe Pessoa que possui todos os atributos e meacutetodos comuns a todas as pessoas e herdar estes atributos e meacutetodos em classes mais especiacuteficas ou seja a heranccedila parte do geral para o mais especiacutefico Comece criando uma classe Pessoa como mostrado no coacutedigo a seguir

class Pessoa public string nome public int idade

Esta classe possui as propriedades nome e idade Estas propriedades satildeo comuns a todas as pessoas Veja agora como podemos criar uma classe Aluno que herda estas propriedades da classe Pessoa e inclui suas proacuteprias propriedades a saber seu nuacutemero de matriacutecula Eis o coacutedigo

class Aluno Pessoa public string matricula

Observe que em C os dois-pontos satildeo usados para indicar a heranccedila A classe Aluno agora possui trecircs atributos nome idade e matricula Veja um aplicativo demonstrando este relacionamento

static void Main(string[] args) cria um objeto da classe Aluno Aluno aluno = new Aluno()

alunonome = Osmar J Silva

As propriedades nome e idade foram herdadas da classe Pessoa pela classe Aluno

15

alunoidade = 36 alunomatricula = AC33-65

Exibe o resultado ConsoleWriteLine(Nome + alunonome + n + Idade + alunoidade + n + Matriacutecula + alunomatricula)

ConsoleWriteLine(nnPressione uma tecla para sair) ConsoleReadKey()

A heranccedila nos fornece um grande benefiacutecio Ao concentrarmos caracteriacutesticas comuns em uma classe e derivar as classes mais especiacuteficas a partir desta noacutes estamos preparados para a adiccedilatildeo de novas funcionalidades ao sistema Se mais adiante uma nova propriedade comum tiver que ser adicionada natildeo precisaremos efetuar alteraccedilotildees em todas as classes Basta alterar a superclasse e pronto As classes derivadas seratildeo automaticamente atualizadas

16

1048576

EXEMPLO DE COacuteDIGO CONSTRUINDO UMA CLASSE

Suponha que queiramos escrever um programa que manipula datas (minuto hora dia mecircs ano) Ao inveacutes de cinco variaacuteveis isoladas poderiacuteamos colocar estes dados em uma estrutura uacutenica englobando a data completa Assim poderiacuteamos declarar uma variaacutevel do tipo struct da seguinte maneira

struct Tempo int anoint mesint diaint horaint minuto

Ok ateacute aqui nada de novo (certo) Soacute declaramos uma estrutura em C padratildeo que conteacutem 5 variaacuteveis ano mecircs dia hora e minuto Agora imagine que aleacutem dessas variaacuteveis a estrutura Tempo pudesse tambeacutem ter embutida (encapsulada) funccedilotildees em C ou C Por exemplo uma funccedilatildeo que mostra a data na tela Esta estrutura seria mais ldquopoderosardquo pois os dados poderiam ser manipulados de dentro da proacutepria estrutura atraveacutes da sua funccedilatildeo interna Essa estrutura mais versaacutetil que conteacutem declaraccedilotildees de variaacuteveis e funccedilotildees constitui-se em uma classe como vimos anteriormente As variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos Assim poderiacuteamos reescrever nossa estrutura Tempo como uma classe cTempo

public class cTempo

public int ano variavel publica da classepublic int mes variavel publica da classepublic int dia variavel publica da classepublic int hora variavel publica da classepublic int minuto variavel publica da classe public void mostra_data() meacutetodo publico da classe

ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

Ok estamos prontos agora para usar nossa classe CTempo Como Temos que observar duas coisas

1 Natildeo trabalhamos com a classe CTempo Temos que instanciar um objeto da classe CTempo e trabalhar com este objeto

2 Abaixo temos a declaraccedilatildeo (instanciaccedilatildeo) do objeto e um pequeno programa em C

17

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos satildeo acessiacuteveis pelo main desde que sejam publicos public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto) Programa Principal static void Main(string[] args)

instanciando o objeto aniversario da classe cTempo cTempo aniversario = new cTempo() ConsoleWriteLine(Exemplo de POO em Cn)

para acessar metodos faccedila nome_objetonome_metodo

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data Para acessar atributos publicos faccedila nome_objetonome_atributo

aniversariodia = 9 aniversariomes = 2 aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23 ConsoleWriteLine(Nova datan) aniversariomostra_data() ConsoleReadKey()

A saiacuteda do programa seraacute

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 5: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

5

POLIMORFISMO

bull O polimorfismo permite a uma entidade (variaacutevel funccedilatildeo ou objeto) ter vaacuterias representaccedilotildeesbull Uma variaacutevel pode ter diferentes tipos dependendo do contexto em um momento particularbull O polimorfismo permite-nos usar o mesmo nome de funccedilotildees desde que a lista de paracircmetros seja

diferente (Sobrecarga de funccedilotildees)bull Objetos herdados de uma classe podem ser sobrecarregados em uma classe derivadabullbull Analisando a palavra Polimorfismo ela significa muitas formas Ou seja para uma aacutervore de

heranccedila temos muitas formas de objetos e meacutetodos a partir de uma superclasse e suas subclasses Polimorfismo eacute o princiacutepio pelo qual usamos objetos construiacutedos a partir de uma aacutervore de heranccedila atraveacutes de referecircncias do tipo de uma superclasse da hierarquia

bull Formas de polimorfismobull Subclassesbull Sobrescrita de meacutetodobull Sobrecarga de meacutetodo ou construtorbull Sobre escrita de meacutetodos ndash Overriding bull Esta utilidade nos permite escrever numa subclasse um ou mais meacutetodos presentes numa das

superclasses podendo alterar o comportamento da superclasse bull Exemplo

Classe Base

Classe Derivada A

Classe Derivada B

Classe Derivada C

Classe Base para a Classe Derivada A

Classe Base para a Classe Derivada B

Classe Base para as Classes Derivadas CD e E

Classe Derivada D

Classe Derivada E

6

bull Quando numa subclasse reescrevemos um meacutetodo jaacute existente numa superclasse chamamos de sobre escrita de meacutetodo ou reescrita de meacutetodo mas o termo teacutecnico eacute Method Overriding Lembrando que a sobre escrita de meacutetodos soacute eacute valida quando o meacutetodo reescrito na subclasse tem exatamente a mesma identificaccedilatildeo (nome tipos etc) do meacutetodo da superclasse

bullbull Sobrecarga de meacutetodos ndash Overloading bull O Polimorfismo ainda permite que numa mesma classe tenhamos meacutetodos com o mesmo nome

desde que o nuacutemero ou tipos de paracircmetros passados sejam diferentes bull Exemplo

7

bull A sobrecarga de meacutetodos eacute uma ferramenta poderosa pois nos permite criar vaacuterios meacutetodos com o mesmo nome isso facilita o entendimento de problemas mais complexos pois natildeo eacute necessaacuteria a criaccedilatildeo de nomes de funcionalidades sem sentido aparente

8

12 CLASSES

bull Uma classe eacute uma estrutura que encapsula dados (chamados de propriedades) e funccedilotildees (chamadas de meacutetodos) em um pacote auto-contido

13 OBJETOS

Um objeto eacute uma instacircncia de uma classe Podemos entender a classe como uma declaraccedilatildeo e o objeto como uma variaacutevel do tipo da classe Trabalhamos com o objeto a classe nos diz somente de que tipo o objeto eacute

Eacute identificado unicamente pelo seu nome Define um estado que eacute representado pelos valores dos seus atributos em um dado momento O comportamento de um objeto eacute definido pelo conjunto de funccedilotildees que podem ser aplicados a ele Podem existir vaacuterios objetos de uma mesma classe POO eacute portanto a implementaccedilatildeo de tipos abstratos de dados classes e objetos Um programa escrito em C++ ou C pode ser visto como uma coleccedilatildeo de objetos

CRIANDO OBJETOS

Agora que jaacute sabemos como definir uma classe podemos passar ao ponto de criar objetos da classe definida Eacute importante perceber o fato de que podemos criar vaacuterios objetos da mesma classe natildeo ficando limitado a apenas um objeto

No C++ podemos declarar um objeto de maneira estaacutetica Suponha que a classe cTempo jaacute estaacute definida Veja a declaraccedilatildeo abaixo em C++

cTempo Aniversario Aniversario eacute um objeto (instacircncia da classe cTempo)

Quando vamos criar um objeto em C utilizamos a palavra chave new seguindo o seguinte esquema

ltTipogt ltnomegt = new ltTipogt()

Assim teriacuteamos em relaccedilatildeo ao exemplo anterior

MEacuteTODOS

PROPRIEDADES

CLASSE

Os meacutetodos satildeo funccedilotildees normais em linguagem C ou C++

As propriedades satildeo variaacuteveis normais int char struct

9

cTempo Aniversario = new cTempo() Aniversario eacute um objeto (instacircncia da classe cTempo)

Veja entatildeo um exemplo de criaccedilatildeo de um objeto de uma classe hipoteacutetica Computador com o nome de comp1

Computador comp1 = new Computador() comp1 e um objeto da classe Computador

O operador new eacute responsaacutevel por calcular o nuacutemero correto de bytes para o objeto especificado e adquirir memoacuteria suficiente (esta aacuterea de memoacuteria eacute chamada de heap) Assim no C a keyword new eacute o caminho para criar um objeto Dentro de uma classe assim como em programas comuns da linguagem lsquoCrsquo podem existir variaacuteveis e funccedilotildees Dentro da classe as variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos

Veja outro exemplo

using System

class HelloClass propriedades meacutetodos

public static int Main(string[] args) Vocecirc pode declarar e criar um novo objeto em uma simples linha HelloClass c1 = new HelloClass()

ou quebrar a declaraccedilatildeo e criaccedilatildeo em duas linhas HelloClass c2 c2 = new HelloClass()

Aqui satildeo alocados dois objetos da classe HelloClass Variaacuteveis de objeto em C realmente satildeo uma referecircncia ao objeto na memoacuteria natildeo o proacuteprio objeto em si Assim c1 e c2 referenciam dois objetos da classe HelloClass alocados na memoacuteria heap

Perceba que na criaccedilatildeo do objetos c1 e c2 apoacutes o new chamamos o tipo HelloClass seguido de parecircnteses Essa notaccedilatildeo significa que neste momento seraacute executado um meacutetodo especial da classe HelloClass chamado construtor

14 MEacuteTODO CONSTRUTOR

O construtor eacute um meacutetodo que possui o mesmo nome da classe que natildeo retorna nenhum valor e que eacute chamado cada vez que um objeto da classe eacute criado Por padratildeo quando natildeo criamos nenhum construtor (como na classe HelloClass) o construtor vazio que natildeo recebe nenhum paracircmetro e tambeacutem natildeo executa nenhum coacutedigo eacute criado automaticamente Apoacutes criarmos um construtor o construtor vazio automaacutetico natildeo eacute mais criado devendo ser criado pelo desenvolvedor caso precise Veja o exemplo abaixo

10

HelloClass com construtores

using System

class HelloClass

public string strMensagem

Construtor padratildeo

public HelloClass()

ConsoleWriteLine(Construtor padratildeo chamado)

Construtor customizado

public HelloClass (string msg)

ConsoleWriteLine(Construtor customizado chamado)

strMensagem = msg

Ponto de entrada do programa

public static int Main(string[] args)

Chamando o construtor padratildeo

HelloClass c1 = new HelloClass()

ConsoleWriteLine(Mensagem do usuaacuterio 0n c1strMensagem)

Chamando o construtor customizado passando uma string como paracircmetro

HelloClass c2

c2 = new HelloClass(Testando 1 2 3)

ConsoleWriteLine(Mensagem do usuaacuterio 0 c2strMensagem)

ConsoleReadLine()

return 0

15 ATRIBUTOS E MEacuteTODOS

Veja a classe Computador com um construtor que recebe 3 strings e preenche os atributos da classe com essas strings monitor teclado e mouse satildeo os atributos da classe

Meacutetodo com o mesmo nome da classe sem paracircmetro

Meacutetodo com o mesmo nome da classe com paracircmetro

11

namespace Construtor

class Computador

string monitorstring tecladostring mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

Computador comp1 = new Computador(Monitor1Teclado1Mouse1)Computador comp2 = new Computador(Monitor2Teclado2Mouse2)Computador comp3 = new Computador(SamsungAcerLogitch)

Obs Foram criados 3 objetos (comp1 comp2 e comp3) da classe Computador onde cada um recebeu 3 argumentos diferentes

16 TIPOS POR VALOR X TIPOS POR REFEREcircNCIA

Os tipos preacute-definidos em C satildeo normalmente conhecidos como tipos por valor Esses tipos devem permitir um acesso raacutepido jaacute que satildeo muitas vezes utilizados no coacutedigo Dessa forma os tipos por valor tecircm guardados na memoacuteria apenas o seu valor sem nenhuma outra informaccedilatildeo adicional que poderia causar um gasto desnecessaacuterio de memoacuteria

Os tipos criados por classes os objetos satildeo conhecidos como tipos por referecircncia Essa denominaccedilatildeo vem do fato de que esses tipos natildeo guardam o seu valor mas sim uma referecircncia para um local na memoacuteria que conteacutem o valor No C e no C++ chamariacuteamos esta referecircncia de ponteiro

Com essas definiccedilotildees eacute importante perceber que se copiarmos as informaccedilotildees de variaacuteveis de tipos por valor e de variaacuteveis de tipos por referecircncia teremos comportamentos diferentes Caso copiemos uma variaacutevel por valor o que ocorre eacute que uma nova coacutepia do valor eacute passada para a outra variaacutevel Isso significa que caso modifiquemos uma das variaacuteveis nada ocorreraacute com a outra

Em variaacuteveis por referecircncia o que ocorre ao copiarmos para outra variaacutevel eacute que apenas a referecircncia eacute copiada natildeo o valor Apoacutes a coacutepia o que acontece eacute que teremos duas variaacuteveis apontando para um mesmo valor Isso significa que ao modificarmos uma variaacutevel estaremos na realidade modificando o valor para o qual a outra variaacutevel tambeacutem estaacute apontando significando que o valor da outra variaacutevel tambeacutem seraacute modificado

Meacutetodo construtor (tem o mesmo nome da classe) e recebe 3 paracircmetros

Atributos da Classe satildeo variaacuteveis comuns e podem ser de qualquer tipo

Programa Principalonde os objetos satildeo criados (instanciados)

Meacutetodo imprime um meacutetodo da classe Veja que eacute uma simples funccedilatildeo para impressatildeo

12

Veja o coacutedigo abaixo e observe o resultado

class Computador public string monitor public string tecladdo public string mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public void Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

cria uma variaacutevel de tipo por valorint valor1 = 10copia para outra variaacutevelint valor2 = valor1adiciona 5 a valor2valor2 += 5imprime o valor das duasConsoleWriteLine(valor1 + valor1)ConsoleWriteLine(valor2 + valor2)

cria um objeto de tipo por referecircnciaComputador comp1 = new Computador(Monitor1Teclado1Mouse1)

copia a referecircncia do objeto comp1 para o objeto comp2Computador comp2 = comp1

modifica o valor do monitorcomp2monitor = Modificadoimprime os dois computadorescomp1imprime()comp2imprime()

Veja o resultado

Veja que inicialmente o nome do monitor de comp1 era Monitor1 Mesmo tendo modificado apenas um dos objetos (o comp2) o comp1 tambeacutem foi modificado provando que na verdade os dois objetos referenciam o mesmo endereccedilo na memoacuteria

13

EXERCIacuteCIO

O aluno deveraacute desenvolver a classe funcionario que tem a seguinte especificaccedilatildeo

ATRIBUTOS Matricula int nome endereco string peso altura float sexo char

MEacuteTODOS

funcionaacuterio() este eacute o meacutetodo construtor padratildeo(lembre-se que o meacutetodo construtor tem o mesmo nome da classe)Entradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprimir a mensagem ldquoConstrutor Padrao Chamado rdquo

funcionaacuterio(string msg) este eacute outro meacutetodo construtor sobrecarregadoEntradas mensagem vinda do mainSaiacutedas nenhumaFunccedilatildeo imprime a mensagem recebida

funcionaacuterio(int mat string nom string end float pes float alt char sex ) este eacute outro meacutetodo construtor sobrecarregadoEntradas dados vindos do mainSaiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

atualizaDados(int mat string nom string end float pes float alt char sex) Entradas dados vindos do main

Saiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

imprimeDadosEntradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprime todos os dados do funcionario

Agora estaacute na hora de usar a classe Usando meacutetodos da classe funcionario definida acima e criada por vocecirc crie uma aplicaccedilatildeo que faccedila o seguinte na ordem dada

1 Instancie trecircs objeto da classe funcionaacuterio

objJoaoutilize o construtor padratildeo

objPedroutilize o segundo construtor e passe a mensagem

ldquoSegundo construtor obrecarregado chamado rdquo

objMaria chame o terceiro construtor e passe os seguintes dados

matricula 2341 nome ldquoMaria da Silvardquo endereccedilo Rua das Flores 34 peso 676 altura 176 sexo lsquoFrsquo

2 Imprima os dados do objeto objMaria

3 Atualize os dados do objJoao com

14

matricula 6784 nome ldquoJoao Marquesrdquo endereccedilo Rua das Acacias 45 peso 896 altura 190 sexo lsquoMrsquo

4 Atualize os dados do objPedro com

matricula 4523 nome ldquoPedro Villarrdquo endereccedilo Rua Torta 33 peso 789 altura 176 sexo lsquoMrsquo

5 Imprima os dados dos objetos objJoao e objPedro

17 HERANCcedilA

Heranccedila eacute um dos trecircs princiacutepios fundamentais da programaccedilatildeo orientada a objetos porque ela permite a criaccedilatildeo de hierarquia nos objetos que compotildeem o sistema Em C uma classe que tem seus dados e meacutetodos herdados por outra eacute chamada de classe base ou super classe e a classe que herda tais dados eacute chamada de classe derivada ou sub-classe

O que um aluno um professor e um funcionaacuterio possuem em comum Todos eles satildeo pessoas e portanto compartilham alguns dados comuns Todos tecircm nome idade endereccedilo etc E o que diferencia um aluno de outra pessoa qualquer Um aluno possui uma matriacutecula Um funcionaacuterio possui um coacutedigo de funcionaacuterio data de admissatildeo salaacuterio etc Um professor possui um coacutedigo de professor e informaccedilotildees relacionadas agrave sua formaccedilatildeo

Eacute aqui que a heranccedila se torna uma ferramenta de grande utilidade Podemos criar uma classe Pessoa que possui todos os atributos e meacutetodos comuns a todas as pessoas e herdar estes atributos e meacutetodos em classes mais especiacuteficas ou seja a heranccedila parte do geral para o mais especiacutefico Comece criando uma classe Pessoa como mostrado no coacutedigo a seguir

class Pessoa public string nome public int idade

Esta classe possui as propriedades nome e idade Estas propriedades satildeo comuns a todas as pessoas Veja agora como podemos criar uma classe Aluno que herda estas propriedades da classe Pessoa e inclui suas proacuteprias propriedades a saber seu nuacutemero de matriacutecula Eis o coacutedigo

class Aluno Pessoa public string matricula

Observe que em C os dois-pontos satildeo usados para indicar a heranccedila A classe Aluno agora possui trecircs atributos nome idade e matricula Veja um aplicativo demonstrando este relacionamento

static void Main(string[] args) cria um objeto da classe Aluno Aluno aluno = new Aluno()

alunonome = Osmar J Silva

As propriedades nome e idade foram herdadas da classe Pessoa pela classe Aluno

15

alunoidade = 36 alunomatricula = AC33-65

Exibe o resultado ConsoleWriteLine(Nome + alunonome + n + Idade + alunoidade + n + Matriacutecula + alunomatricula)

ConsoleWriteLine(nnPressione uma tecla para sair) ConsoleReadKey()

A heranccedila nos fornece um grande benefiacutecio Ao concentrarmos caracteriacutesticas comuns em uma classe e derivar as classes mais especiacuteficas a partir desta noacutes estamos preparados para a adiccedilatildeo de novas funcionalidades ao sistema Se mais adiante uma nova propriedade comum tiver que ser adicionada natildeo precisaremos efetuar alteraccedilotildees em todas as classes Basta alterar a superclasse e pronto As classes derivadas seratildeo automaticamente atualizadas

16

1048576

EXEMPLO DE COacuteDIGO CONSTRUINDO UMA CLASSE

Suponha que queiramos escrever um programa que manipula datas (minuto hora dia mecircs ano) Ao inveacutes de cinco variaacuteveis isoladas poderiacuteamos colocar estes dados em uma estrutura uacutenica englobando a data completa Assim poderiacuteamos declarar uma variaacutevel do tipo struct da seguinte maneira

struct Tempo int anoint mesint diaint horaint minuto

Ok ateacute aqui nada de novo (certo) Soacute declaramos uma estrutura em C padratildeo que conteacutem 5 variaacuteveis ano mecircs dia hora e minuto Agora imagine que aleacutem dessas variaacuteveis a estrutura Tempo pudesse tambeacutem ter embutida (encapsulada) funccedilotildees em C ou C Por exemplo uma funccedilatildeo que mostra a data na tela Esta estrutura seria mais ldquopoderosardquo pois os dados poderiam ser manipulados de dentro da proacutepria estrutura atraveacutes da sua funccedilatildeo interna Essa estrutura mais versaacutetil que conteacutem declaraccedilotildees de variaacuteveis e funccedilotildees constitui-se em uma classe como vimos anteriormente As variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos Assim poderiacuteamos reescrever nossa estrutura Tempo como uma classe cTempo

public class cTempo

public int ano variavel publica da classepublic int mes variavel publica da classepublic int dia variavel publica da classepublic int hora variavel publica da classepublic int minuto variavel publica da classe public void mostra_data() meacutetodo publico da classe

ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

Ok estamos prontos agora para usar nossa classe CTempo Como Temos que observar duas coisas

1 Natildeo trabalhamos com a classe CTempo Temos que instanciar um objeto da classe CTempo e trabalhar com este objeto

2 Abaixo temos a declaraccedilatildeo (instanciaccedilatildeo) do objeto e um pequeno programa em C

17

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos satildeo acessiacuteveis pelo main desde que sejam publicos public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto) Programa Principal static void Main(string[] args)

instanciando o objeto aniversario da classe cTempo cTempo aniversario = new cTempo() ConsoleWriteLine(Exemplo de POO em Cn)

para acessar metodos faccedila nome_objetonome_metodo

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data Para acessar atributos publicos faccedila nome_objetonome_atributo

aniversariodia = 9 aniversariomes = 2 aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23 ConsoleWriteLine(Nova datan) aniversariomostra_data() ConsoleReadKey()

A saiacuteda do programa seraacute

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 6: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

6

bull Quando numa subclasse reescrevemos um meacutetodo jaacute existente numa superclasse chamamos de sobre escrita de meacutetodo ou reescrita de meacutetodo mas o termo teacutecnico eacute Method Overriding Lembrando que a sobre escrita de meacutetodos soacute eacute valida quando o meacutetodo reescrito na subclasse tem exatamente a mesma identificaccedilatildeo (nome tipos etc) do meacutetodo da superclasse

bullbull Sobrecarga de meacutetodos ndash Overloading bull O Polimorfismo ainda permite que numa mesma classe tenhamos meacutetodos com o mesmo nome

desde que o nuacutemero ou tipos de paracircmetros passados sejam diferentes bull Exemplo

7

bull A sobrecarga de meacutetodos eacute uma ferramenta poderosa pois nos permite criar vaacuterios meacutetodos com o mesmo nome isso facilita o entendimento de problemas mais complexos pois natildeo eacute necessaacuteria a criaccedilatildeo de nomes de funcionalidades sem sentido aparente

8

12 CLASSES

bull Uma classe eacute uma estrutura que encapsula dados (chamados de propriedades) e funccedilotildees (chamadas de meacutetodos) em um pacote auto-contido

13 OBJETOS

Um objeto eacute uma instacircncia de uma classe Podemos entender a classe como uma declaraccedilatildeo e o objeto como uma variaacutevel do tipo da classe Trabalhamos com o objeto a classe nos diz somente de que tipo o objeto eacute

Eacute identificado unicamente pelo seu nome Define um estado que eacute representado pelos valores dos seus atributos em um dado momento O comportamento de um objeto eacute definido pelo conjunto de funccedilotildees que podem ser aplicados a ele Podem existir vaacuterios objetos de uma mesma classe POO eacute portanto a implementaccedilatildeo de tipos abstratos de dados classes e objetos Um programa escrito em C++ ou C pode ser visto como uma coleccedilatildeo de objetos

CRIANDO OBJETOS

Agora que jaacute sabemos como definir uma classe podemos passar ao ponto de criar objetos da classe definida Eacute importante perceber o fato de que podemos criar vaacuterios objetos da mesma classe natildeo ficando limitado a apenas um objeto

No C++ podemos declarar um objeto de maneira estaacutetica Suponha que a classe cTempo jaacute estaacute definida Veja a declaraccedilatildeo abaixo em C++

cTempo Aniversario Aniversario eacute um objeto (instacircncia da classe cTempo)

Quando vamos criar um objeto em C utilizamos a palavra chave new seguindo o seguinte esquema

ltTipogt ltnomegt = new ltTipogt()

Assim teriacuteamos em relaccedilatildeo ao exemplo anterior

MEacuteTODOS

PROPRIEDADES

CLASSE

Os meacutetodos satildeo funccedilotildees normais em linguagem C ou C++

As propriedades satildeo variaacuteveis normais int char struct

9

cTempo Aniversario = new cTempo() Aniversario eacute um objeto (instacircncia da classe cTempo)

Veja entatildeo um exemplo de criaccedilatildeo de um objeto de uma classe hipoteacutetica Computador com o nome de comp1

Computador comp1 = new Computador() comp1 e um objeto da classe Computador

O operador new eacute responsaacutevel por calcular o nuacutemero correto de bytes para o objeto especificado e adquirir memoacuteria suficiente (esta aacuterea de memoacuteria eacute chamada de heap) Assim no C a keyword new eacute o caminho para criar um objeto Dentro de uma classe assim como em programas comuns da linguagem lsquoCrsquo podem existir variaacuteveis e funccedilotildees Dentro da classe as variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos

Veja outro exemplo

using System

class HelloClass propriedades meacutetodos

public static int Main(string[] args) Vocecirc pode declarar e criar um novo objeto em uma simples linha HelloClass c1 = new HelloClass()

ou quebrar a declaraccedilatildeo e criaccedilatildeo em duas linhas HelloClass c2 c2 = new HelloClass()

Aqui satildeo alocados dois objetos da classe HelloClass Variaacuteveis de objeto em C realmente satildeo uma referecircncia ao objeto na memoacuteria natildeo o proacuteprio objeto em si Assim c1 e c2 referenciam dois objetos da classe HelloClass alocados na memoacuteria heap

Perceba que na criaccedilatildeo do objetos c1 e c2 apoacutes o new chamamos o tipo HelloClass seguido de parecircnteses Essa notaccedilatildeo significa que neste momento seraacute executado um meacutetodo especial da classe HelloClass chamado construtor

14 MEacuteTODO CONSTRUTOR

O construtor eacute um meacutetodo que possui o mesmo nome da classe que natildeo retorna nenhum valor e que eacute chamado cada vez que um objeto da classe eacute criado Por padratildeo quando natildeo criamos nenhum construtor (como na classe HelloClass) o construtor vazio que natildeo recebe nenhum paracircmetro e tambeacutem natildeo executa nenhum coacutedigo eacute criado automaticamente Apoacutes criarmos um construtor o construtor vazio automaacutetico natildeo eacute mais criado devendo ser criado pelo desenvolvedor caso precise Veja o exemplo abaixo

10

HelloClass com construtores

using System

class HelloClass

public string strMensagem

Construtor padratildeo

public HelloClass()

ConsoleWriteLine(Construtor padratildeo chamado)

Construtor customizado

public HelloClass (string msg)

ConsoleWriteLine(Construtor customizado chamado)

strMensagem = msg

Ponto de entrada do programa

public static int Main(string[] args)

Chamando o construtor padratildeo

HelloClass c1 = new HelloClass()

ConsoleWriteLine(Mensagem do usuaacuterio 0n c1strMensagem)

Chamando o construtor customizado passando uma string como paracircmetro

HelloClass c2

c2 = new HelloClass(Testando 1 2 3)

ConsoleWriteLine(Mensagem do usuaacuterio 0 c2strMensagem)

ConsoleReadLine()

return 0

15 ATRIBUTOS E MEacuteTODOS

Veja a classe Computador com um construtor que recebe 3 strings e preenche os atributos da classe com essas strings monitor teclado e mouse satildeo os atributos da classe

Meacutetodo com o mesmo nome da classe sem paracircmetro

Meacutetodo com o mesmo nome da classe com paracircmetro

11

namespace Construtor

class Computador

string monitorstring tecladostring mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

Computador comp1 = new Computador(Monitor1Teclado1Mouse1)Computador comp2 = new Computador(Monitor2Teclado2Mouse2)Computador comp3 = new Computador(SamsungAcerLogitch)

Obs Foram criados 3 objetos (comp1 comp2 e comp3) da classe Computador onde cada um recebeu 3 argumentos diferentes

16 TIPOS POR VALOR X TIPOS POR REFEREcircNCIA

Os tipos preacute-definidos em C satildeo normalmente conhecidos como tipos por valor Esses tipos devem permitir um acesso raacutepido jaacute que satildeo muitas vezes utilizados no coacutedigo Dessa forma os tipos por valor tecircm guardados na memoacuteria apenas o seu valor sem nenhuma outra informaccedilatildeo adicional que poderia causar um gasto desnecessaacuterio de memoacuteria

Os tipos criados por classes os objetos satildeo conhecidos como tipos por referecircncia Essa denominaccedilatildeo vem do fato de que esses tipos natildeo guardam o seu valor mas sim uma referecircncia para um local na memoacuteria que conteacutem o valor No C e no C++ chamariacuteamos esta referecircncia de ponteiro

Com essas definiccedilotildees eacute importante perceber que se copiarmos as informaccedilotildees de variaacuteveis de tipos por valor e de variaacuteveis de tipos por referecircncia teremos comportamentos diferentes Caso copiemos uma variaacutevel por valor o que ocorre eacute que uma nova coacutepia do valor eacute passada para a outra variaacutevel Isso significa que caso modifiquemos uma das variaacuteveis nada ocorreraacute com a outra

Em variaacuteveis por referecircncia o que ocorre ao copiarmos para outra variaacutevel eacute que apenas a referecircncia eacute copiada natildeo o valor Apoacutes a coacutepia o que acontece eacute que teremos duas variaacuteveis apontando para um mesmo valor Isso significa que ao modificarmos uma variaacutevel estaremos na realidade modificando o valor para o qual a outra variaacutevel tambeacutem estaacute apontando significando que o valor da outra variaacutevel tambeacutem seraacute modificado

Meacutetodo construtor (tem o mesmo nome da classe) e recebe 3 paracircmetros

Atributos da Classe satildeo variaacuteveis comuns e podem ser de qualquer tipo

Programa Principalonde os objetos satildeo criados (instanciados)

Meacutetodo imprime um meacutetodo da classe Veja que eacute uma simples funccedilatildeo para impressatildeo

12

Veja o coacutedigo abaixo e observe o resultado

class Computador public string monitor public string tecladdo public string mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public void Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

cria uma variaacutevel de tipo por valorint valor1 = 10copia para outra variaacutevelint valor2 = valor1adiciona 5 a valor2valor2 += 5imprime o valor das duasConsoleWriteLine(valor1 + valor1)ConsoleWriteLine(valor2 + valor2)

cria um objeto de tipo por referecircnciaComputador comp1 = new Computador(Monitor1Teclado1Mouse1)

copia a referecircncia do objeto comp1 para o objeto comp2Computador comp2 = comp1

modifica o valor do monitorcomp2monitor = Modificadoimprime os dois computadorescomp1imprime()comp2imprime()

Veja o resultado

Veja que inicialmente o nome do monitor de comp1 era Monitor1 Mesmo tendo modificado apenas um dos objetos (o comp2) o comp1 tambeacutem foi modificado provando que na verdade os dois objetos referenciam o mesmo endereccedilo na memoacuteria

13

EXERCIacuteCIO

O aluno deveraacute desenvolver a classe funcionario que tem a seguinte especificaccedilatildeo

ATRIBUTOS Matricula int nome endereco string peso altura float sexo char

MEacuteTODOS

funcionaacuterio() este eacute o meacutetodo construtor padratildeo(lembre-se que o meacutetodo construtor tem o mesmo nome da classe)Entradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprimir a mensagem ldquoConstrutor Padrao Chamado rdquo

funcionaacuterio(string msg) este eacute outro meacutetodo construtor sobrecarregadoEntradas mensagem vinda do mainSaiacutedas nenhumaFunccedilatildeo imprime a mensagem recebida

funcionaacuterio(int mat string nom string end float pes float alt char sex ) este eacute outro meacutetodo construtor sobrecarregadoEntradas dados vindos do mainSaiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

atualizaDados(int mat string nom string end float pes float alt char sex) Entradas dados vindos do main

Saiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

imprimeDadosEntradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprime todos os dados do funcionario

Agora estaacute na hora de usar a classe Usando meacutetodos da classe funcionario definida acima e criada por vocecirc crie uma aplicaccedilatildeo que faccedila o seguinte na ordem dada

1 Instancie trecircs objeto da classe funcionaacuterio

objJoaoutilize o construtor padratildeo

objPedroutilize o segundo construtor e passe a mensagem

ldquoSegundo construtor obrecarregado chamado rdquo

objMaria chame o terceiro construtor e passe os seguintes dados

matricula 2341 nome ldquoMaria da Silvardquo endereccedilo Rua das Flores 34 peso 676 altura 176 sexo lsquoFrsquo

2 Imprima os dados do objeto objMaria

3 Atualize os dados do objJoao com

14

matricula 6784 nome ldquoJoao Marquesrdquo endereccedilo Rua das Acacias 45 peso 896 altura 190 sexo lsquoMrsquo

4 Atualize os dados do objPedro com

matricula 4523 nome ldquoPedro Villarrdquo endereccedilo Rua Torta 33 peso 789 altura 176 sexo lsquoMrsquo

5 Imprima os dados dos objetos objJoao e objPedro

17 HERANCcedilA

Heranccedila eacute um dos trecircs princiacutepios fundamentais da programaccedilatildeo orientada a objetos porque ela permite a criaccedilatildeo de hierarquia nos objetos que compotildeem o sistema Em C uma classe que tem seus dados e meacutetodos herdados por outra eacute chamada de classe base ou super classe e a classe que herda tais dados eacute chamada de classe derivada ou sub-classe

O que um aluno um professor e um funcionaacuterio possuem em comum Todos eles satildeo pessoas e portanto compartilham alguns dados comuns Todos tecircm nome idade endereccedilo etc E o que diferencia um aluno de outra pessoa qualquer Um aluno possui uma matriacutecula Um funcionaacuterio possui um coacutedigo de funcionaacuterio data de admissatildeo salaacuterio etc Um professor possui um coacutedigo de professor e informaccedilotildees relacionadas agrave sua formaccedilatildeo

Eacute aqui que a heranccedila se torna uma ferramenta de grande utilidade Podemos criar uma classe Pessoa que possui todos os atributos e meacutetodos comuns a todas as pessoas e herdar estes atributos e meacutetodos em classes mais especiacuteficas ou seja a heranccedila parte do geral para o mais especiacutefico Comece criando uma classe Pessoa como mostrado no coacutedigo a seguir

class Pessoa public string nome public int idade

Esta classe possui as propriedades nome e idade Estas propriedades satildeo comuns a todas as pessoas Veja agora como podemos criar uma classe Aluno que herda estas propriedades da classe Pessoa e inclui suas proacuteprias propriedades a saber seu nuacutemero de matriacutecula Eis o coacutedigo

class Aluno Pessoa public string matricula

Observe que em C os dois-pontos satildeo usados para indicar a heranccedila A classe Aluno agora possui trecircs atributos nome idade e matricula Veja um aplicativo demonstrando este relacionamento

static void Main(string[] args) cria um objeto da classe Aluno Aluno aluno = new Aluno()

alunonome = Osmar J Silva

As propriedades nome e idade foram herdadas da classe Pessoa pela classe Aluno

15

alunoidade = 36 alunomatricula = AC33-65

Exibe o resultado ConsoleWriteLine(Nome + alunonome + n + Idade + alunoidade + n + Matriacutecula + alunomatricula)

ConsoleWriteLine(nnPressione uma tecla para sair) ConsoleReadKey()

A heranccedila nos fornece um grande benefiacutecio Ao concentrarmos caracteriacutesticas comuns em uma classe e derivar as classes mais especiacuteficas a partir desta noacutes estamos preparados para a adiccedilatildeo de novas funcionalidades ao sistema Se mais adiante uma nova propriedade comum tiver que ser adicionada natildeo precisaremos efetuar alteraccedilotildees em todas as classes Basta alterar a superclasse e pronto As classes derivadas seratildeo automaticamente atualizadas

16

1048576

EXEMPLO DE COacuteDIGO CONSTRUINDO UMA CLASSE

Suponha que queiramos escrever um programa que manipula datas (minuto hora dia mecircs ano) Ao inveacutes de cinco variaacuteveis isoladas poderiacuteamos colocar estes dados em uma estrutura uacutenica englobando a data completa Assim poderiacuteamos declarar uma variaacutevel do tipo struct da seguinte maneira

struct Tempo int anoint mesint diaint horaint minuto

Ok ateacute aqui nada de novo (certo) Soacute declaramos uma estrutura em C padratildeo que conteacutem 5 variaacuteveis ano mecircs dia hora e minuto Agora imagine que aleacutem dessas variaacuteveis a estrutura Tempo pudesse tambeacutem ter embutida (encapsulada) funccedilotildees em C ou C Por exemplo uma funccedilatildeo que mostra a data na tela Esta estrutura seria mais ldquopoderosardquo pois os dados poderiam ser manipulados de dentro da proacutepria estrutura atraveacutes da sua funccedilatildeo interna Essa estrutura mais versaacutetil que conteacutem declaraccedilotildees de variaacuteveis e funccedilotildees constitui-se em uma classe como vimos anteriormente As variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos Assim poderiacuteamos reescrever nossa estrutura Tempo como uma classe cTempo

public class cTempo

public int ano variavel publica da classepublic int mes variavel publica da classepublic int dia variavel publica da classepublic int hora variavel publica da classepublic int minuto variavel publica da classe public void mostra_data() meacutetodo publico da classe

ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

Ok estamos prontos agora para usar nossa classe CTempo Como Temos que observar duas coisas

1 Natildeo trabalhamos com a classe CTempo Temos que instanciar um objeto da classe CTempo e trabalhar com este objeto

2 Abaixo temos a declaraccedilatildeo (instanciaccedilatildeo) do objeto e um pequeno programa em C

17

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos satildeo acessiacuteveis pelo main desde que sejam publicos public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto) Programa Principal static void Main(string[] args)

instanciando o objeto aniversario da classe cTempo cTempo aniversario = new cTempo() ConsoleWriteLine(Exemplo de POO em Cn)

para acessar metodos faccedila nome_objetonome_metodo

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data Para acessar atributos publicos faccedila nome_objetonome_atributo

aniversariodia = 9 aniversariomes = 2 aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23 ConsoleWriteLine(Nova datan) aniversariomostra_data() ConsoleReadKey()

A saiacuteda do programa seraacute

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 7: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

7

bull A sobrecarga de meacutetodos eacute uma ferramenta poderosa pois nos permite criar vaacuterios meacutetodos com o mesmo nome isso facilita o entendimento de problemas mais complexos pois natildeo eacute necessaacuteria a criaccedilatildeo de nomes de funcionalidades sem sentido aparente

8

12 CLASSES

bull Uma classe eacute uma estrutura que encapsula dados (chamados de propriedades) e funccedilotildees (chamadas de meacutetodos) em um pacote auto-contido

13 OBJETOS

Um objeto eacute uma instacircncia de uma classe Podemos entender a classe como uma declaraccedilatildeo e o objeto como uma variaacutevel do tipo da classe Trabalhamos com o objeto a classe nos diz somente de que tipo o objeto eacute

Eacute identificado unicamente pelo seu nome Define um estado que eacute representado pelos valores dos seus atributos em um dado momento O comportamento de um objeto eacute definido pelo conjunto de funccedilotildees que podem ser aplicados a ele Podem existir vaacuterios objetos de uma mesma classe POO eacute portanto a implementaccedilatildeo de tipos abstratos de dados classes e objetos Um programa escrito em C++ ou C pode ser visto como uma coleccedilatildeo de objetos

CRIANDO OBJETOS

Agora que jaacute sabemos como definir uma classe podemos passar ao ponto de criar objetos da classe definida Eacute importante perceber o fato de que podemos criar vaacuterios objetos da mesma classe natildeo ficando limitado a apenas um objeto

No C++ podemos declarar um objeto de maneira estaacutetica Suponha que a classe cTempo jaacute estaacute definida Veja a declaraccedilatildeo abaixo em C++

cTempo Aniversario Aniversario eacute um objeto (instacircncia da classe cTempo)

Quando vamos criar um objeto em C utilizamos a palavra chave new seguindo o seguinte esquema

ltTipogt ltnomegt = new ltTipogt()

Assim teriacuteamos em relaccedilatildeo ao exemplo anterior

MEacuteTODOS

PROPRIEDADES

CLASSE

Os meacutetodos satildeo funccedilotildees normais em linguagem C ou C++

As propriedades satildeo variaacuteveis normais int char struct

9

cTempo Aniversario = new cTempo() Aniversario eacute um objeto (instacircncia da classe cTempo)

Veja entatildeo um exemplo de criaccedilatildeo de um objeto de uma classe hipoteacutetica Computador com o nome de comp1

Computador comp1 = new Computador() comp1 e um objeto da classe Computador

O operador new eacute responsaacutevel por calcular o nuacutemero correto de bytes para o objeto especificado e adquirir memoacuteria suficiente (esta aacuterea de memoacuteria eacute chamada de heap) Assim no C a keyword new eacute o caminho para criar um objeto Dentro de uma classe assim como em programas comuns da linguagem lsquoCrsquo podem existir variaacuteveis e funccedilotildees Dentro da classe as variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos

Veja outro exemplo

using System

class HelloClass propriedades meacutetodos

public static int Main(string[] args) Vocecirc pode declarar e criar um novo objeto em uma simples linha HelloClass c1 = new HelloClass()

ou quebrar a declaraccedilatildeo e criaccedilatildeo em duas linhas HelloClass c2 c2 = new HelloClass()

Aqui satildeo alocados dois objetos da classe HelloClass Variaacuteveis de objeto em C realmente satildeo uma referecircncia ao objeto na memoacuteria natildeo o proacuteprio objeto em si Assim c1 e c2 referenciam dois objetos da classe HelloClass alocados na memoacuteria heap

Perceba que na criaccedilatildeo do objetos c1 e c2 apoacutes o new chamamos o tipo HelloClass seguido de parecircnteses Essa notaccedilatildeo significa que neste momento seraacute executado um meacutetodo especial da classe HelloClass chamado construtor

14 MEacuteTODO CONSTRUTOR

O construtor eacute um meacutetodo que possui o mesmo nome da classe que natildeo retorna nenhum valor e que eacute chamado cada vez que um objeto da classe eacute criado Por padratildeo quando natildeo criamos nenhum construtor (como na classe HelloClass) o construtor vazio que natildeo recebe nenhum paracircmetro e tambeacutem natildeo executa nenhum coacutedigo eacute criado automaticamente Apoacutes criarmos um construtor o construtor vazio automaacutetico natildeo eacute mais criado devendo ser criado pelo desenvolvedor caso precise Veja o exemplo abaixo

10

HelloClass com construtores

using System

class HelloClass

public string strMensagem

Construtor padratildeo

public HelloClass()

ConsoleWriteLine(Construtor padratildeo chamado)

Construtor customizado

public HelloClass (string msg)

ConsoleWriteLine(Construtor customizado chamado)

strMensagem = msg

Ponto de entrada do programa

public static int Main(string[] args)

Chamando o construtor padratildeo

HelloClass c1 = new HelloClass()

ConsoleWriteLine(Mensagem do usuaacuterio 0n c1strMensagem)

Chamando o construtor customizado passando uma string como paracircmetro

HelloClass c2

c2 = new HelloClass(Testando 1 2 3)

ConsoleWriteLine(Mensagem do usuaacuterio 0 c2strMensagem)

ConsoleReadLine()

return 0

15 ATRIBUTOS E MEacuteTODOS

Veja a classe Computador com um construtor que recebe 3 strings e preenche os atributos da classe com essas strings monitor teclado e mouse satildeo os atributos da classe

Meacutetodo com o mesmo nome da classe sem paracircmetro

Meacutetodo com o mesmo nome da classe com paracircmetro

11

namespace Construtor

class Computador

string monitorstring tecladostring mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

Computador comp1 = new Computador(Monitor1Teclado1Mouse1)Computador comp2 = new Computador(Monitor2Teclado2Mouse2)Computador comp3 = new Computador(SamsungAcerLogitch)

Obs Foram criados 3 objetos (comp1 comp2 e comp3) da classe Computador onde cada um recebeu 3 argumentos diferentes

16 TIPOS POR VALOR X TIPOS POR REFEREcircNCIA

Os tipos preacute-definidos em C satildeo normalmente conhecidos como tipos por valor Esses tipos devem permitir um acesso raacutepido jaacute que satildeo muitas vezes utilizados no coacutedigo Dessa forma os tipos por valor tecircm guardados na memoacuteria apenas o seu valor sem nenhuma outra informaccedilatildeo adicional que poderia causar um gasto desnecessaacuterio de memoacuteria

Os tipos criados por classes os objetos satildeo conhecidos como tipos por referecircncia Essa denominaccedilatildeo vem do fato de que esses tipos natildeo guardam o seu valor mas sim uma referecircncia para um local na memoacuteria que conteacutem o valor No C e no C++ chamariacuteamos esta referecircncia de ponteiro

Com essas definiccedilotildees eacute importante perceber que se copiarmos as informaccedilotildees de variaacuteveis de tipos por valor e de variaacuteveis de tipos por referecircncia teremos comportamentos diferentes Caso copiemos uma variaacutevel por valor o que ocorre eacute que uma nova coacutepia do valor eacute passada para a outra variaacutevel Isso significa que caso modifiquemos uma das variaacuteveis nada ocorreraacute com a outra

Em variaacuteveis por referecircncia o que ocorre ao copiarmos para outra variaacutevel eacute que apenas a referecircncia eacute copiada natildeo o valor Apoacutes a coacutepia o que acontece eacute que teremos duas variaacuteveis apontando para um mesmo valor Isso significa que ao modificarmos uma variaacutevel estaremos na realidade modificando o valor para o qual a outra variaacutevel tambeacutem estaacute apontando significando que o valor da outra variaacutevel tambeacutem seraacute modificado

Meacutetodo construtor (tem o mesmo nome da classe) e recebe 3 paracircmetros

Atributos da Classe satildeo variaacuteveis comuns e podem ser de qualquer tipo

Programa Principalonde os objetos satildeo criados (instanciados)

Meacutetodo imprime um meacutetodo da classe Veja que eacute uma simples funccedilatildeo para impressatildeo

12

Veja o coacutedigo abaixo e observe o resultado

class Computador public string monitor public string tecladdo public string mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public void Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

cria uma variaacutevel de tipo por valorint valor1 = 10copia para outra variaacutevelint valor2 = valor1adiciona 5 a valor2valor2 += 5imprime o valor das duasConsoleWriteLine(valor1 + valor1)ConsoleWriteLine(valor2 + valor2)

cria um objeto de tipo por referecircnciaComputador comp1 = new Computador(Monitor1Teclado1Mouse1)

copia a referecircncia do objeto comp1 para o objeto comp2Computador comp2 = comp1

modifica o valor do monitorcomp2monitor = Modificadoimprime os dois computadorescomp1imprime()comp2imprime()

Veja o resultado

Veja que inicialmente o nome do monitor de comp1 era Monitor1 Mesmo tendo modificado apenas um dos objetos (o comp2) o comp1 tambeacutem foi modificado provando que na verdade os dois objetos referenciam o mesmo endereccedilo na memoacuteria

13

EXERCIacuteCIO

O aluno deveraacute desenvolver a classe funcionario que tem a seguinte especificaccedilatildeo

ATRIBUTOS Matricula int nome endereco string peso altura float sexo char

MEacuteTODOS

funcionaacuterio() este eacute o meacutetodo construtor padratildeo(lembre-se que o meacutetodo construtor tem o mesmo nome da classe)Entradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprimir a mensagem ldquoConstrutor Padrao Chamado rdquo

funcionaacuterio(string msg) este eacute outro meacutetodo construtor sobrecarregadoEntradas mensagem vinda do mainSaiacutedas nenhumaFunccedilatildeo imprime a mensagem recebida

funcionaacuterio(int mat string nom string end float pes float alt char sex ) este eacute outro meacutetodo construtor sobrecarregadoEntradas dados vindos do mainSaiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

atualizaDados(int mat string nom string end float pes float alt char sex) Entradas dados vindos do main

Saiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

imprimeDadosEntradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprime todos os dados do funcionario

Agora estaacute na hora de usar a classe Usando meacutetodos da classe funcionario definida acima e criada por vocecirc crie uma aplicaccedilatildeo que faccedila o seguinte na ordem dada

1 Instancie trecircs objeto da classe funcionaacuterio

objJoaoutilize o construtor padratildeo

objPedroutilize o segundo construtor e passe a mensagem

ldquoSegundo construtor obrecarregado chamado rdquo

objMaria chame o terceiro construtor e passe os seguintes dados

matricula 2341 nome ldquoMaria da Silvardquo endereccedilo Rua das Flores 34 peso 676 altura 176 sexo lsquoFrsquo

2 Imprima os dados do objeto objMaria

3 Atualize os dados do objJoao com

14

matricula 6784 nome ldquoJoao Marquesrdquo endereccedilo Rua das Acacias 45 peso 896 altura 190 sexo lsquoMrsquo

4 Atualize os dados do objPedro com

matricula 4523 nome ldquoPedro Villarrdquo endereccedilo Rua Torta 33 peso 789 altura 176 sexo lsquoMrsquo

5 Imprima os dados dos objetos objJoao e objPedro

17 HERANCcedilA

Heranccedila eacute um dos trecircs princiacutepios fundamentais da programaccedilatildeo orientada a objetos porque ela permite a criaccedilatildeo de hierarquia nos objetos que compotildeem o sistema Em C uma classe que tem seus dados e meacutetodos herdados por outra eacute chamada de classe base ou super classe e a classe que herda tais dados eacute chamada de classe derivada ou sub-classe

O que um aluno um professor e um funcionaacuterio possuem em comum Todos eles satildeo pessoas e portanto compartilham alguns dados comuns Todos tecircm nome idade endereccedilo etc E o que diferencia um aluno de outra pessoa qualquer Um aluno possui uma matriacutecula Um funcionaacuterio possui um coacutedigo de funcionaacuterio data de admissatildeo salaacuterio etc Um professor possui um coacutedigo de professor e informaccedilotildees relacionadas agrave sua formaccedilatildeo

Eacute aqui que a heranccedila se torna uma ferramenta de grande utilidade Podemos criar uma classe Pessoa que possui todos os atributos e meacutetodos comuns a todas as pessoas e herdar estes atributos e meacutetodos em classes mais especiacuteficas ou seja a heranccedila parte do geral para o mais especiacutefico Comece criando uma classe Pessoa como mostrado no coacutedigo a seguir

class Pessoa public string nome public int idade

Esta classe possui as propriedades nome e idade Estas propriedades satildeo comuns a todas as pessoas Veja agora como podemos criar uma classe Aluno que herda estas propriedades da classe Pessoa e inclui suas proacuteprias propriedades a saber seu nuacutemero de matriacutecula Eis o coacutedigo

class Aluno Pessoa public string matricula

Observe que em C os dois-pontos satildeo usados para indicar a heranccedila A classe Aluno agora possui trecircs atributos nome idade e matricula Veja um aplicativo demonstrando este relacionamento

static void Main(string[] args) cria um objeto da classe Aluno Aluno aluno = new Aluno()

alunonome = Osmar J Silva

As propriedades nome e idade foram herdadas da classe Pessoa pela classe Aluno

15

alunoidade = 36 alunomatricula = AC33-65

Exibe o resultado ConsoleWriteLine(Nome + alunonome + n + Idade + alunoidade + n + Matriacutecula + alunomatricula)

ConsoleWriteLine(nnPressione uma tecla para sair) ConsoleReadKey()

A heranccedila nos fornece um grande benefiacutecio Ao concentrarmos caracteriacutesticas comuns em uma classe e derivar as classes mais especiacuteficas a partir desta noacutes estamos preparados para a adiccedilatildeo de novas funcionalidades ao sistema Se mais adiante uma nova propriedade comum tiver que ser adicionada natildeo precisaremos efetuar alteraccedilotildees em todas as classes Basta alterar a superclasse e pronto As classes derivadas seratildeo automaticamente atualizadas

16

1048576

EXEMPLO DE COacuteDIGO CONSTRUINDO UMA CLASSE

Suponha que queiramos escrever um programa que manipula datas (minuto hora dia mecircs ano) Ao inveacutes de cinco variaacuteveis isoladas poderiacuteamos colocar estes dados em uma estrutura uacutenica englobando a data completa Assim poderiacuteamos declarar uma variaacutevel do tipo struct da seguinte maneira

struct Tempo int anoint mesint diaint horaint minuto

Ok ateacute aqui nada de novo (certo) Soacute declaramos uma estrutura em C padratildeo que conteacutem 5 variaacuteveis ano mecircs dia hora e minuto Agora imagine que aleacutem dessas variaacuteveis a estrutura Tempo pudesse tambeacutem ter embutida (encapsulada) funccedilotildees em C ou C Por exemplo uma funccedilatildeo que mostra a data na tela Esta estrutura seria mais ldquopoderosardquo pois os dados poderiam ser manipulados de dentro da proacutepria estrutura atraveacutes da sua funccedilatildeo interna Essa estrutura mais versaacutetil que conteacutem declaraccedilotildees de variaacuteveis e funccedilotildees constitui-se em uma classe como vimos anteriormente As variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos Assim poderiacuteamos reescrever nossa estrutura Tempo como uma classe cTempo

public class cTempo

public int ano variavel publica da classepublic int mes variavel publica da classepublic int dia variavel publica da classepublic int hora variavel publica da classepublic int minuto variavel publica da classe public void mostra_data() meacutetodo publico da classe

ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

Ok estamos prontos agora para usar nossa classe CTempo Como Temos que observar duas coisas

1 Natildeo trabalhamos com a classe CTempo Temos que instanciar um objeto da classe CTempo e trabalhar com este objeto

2 Abaixo temos a declaraccedilatildeo (instanciaccedilatildeo) do objeto e um pequeno programa em C

17

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos satildeo acessiacuteveis pelo main desde que sejam publicos public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto) Programa Principal static void Main(string[] args)

instanciando o objeto aniversario da classe cTempo cTempo aniversario = new cTempo() ConsoleWriteLine(Exemplo de POO em Cn)

para acessar metodos faccedila nome_objetonome_metodo

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data Para acessar atributos publicos faccedila nome_objetonome_atributo

aniversariodia = 9 aniversariomes = 2 aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23 ConsoleWriteLine(Nova datan) aniversariomostra_data() ConsoleReadKey()

A saiacuteda do programa seraacute

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 8: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

8

12 CLASSES

bull Uma classe eacute uma estrutura que encapsula dados (chamados de propriedades) e funccedilotildees (chamadas de meacutetodos) em um pacote auto-contido

13 OBJETOS

Um objeto eacute uma instacircncia de uma classe Podemos entender a classe como uma declaraccedilatildeo e o objeto como uma variaacutevel do tipo da classe Trabalhamos com o objeto a classe nos diz somente de que tipo o objeto eacute

Eacute identificado unicamente pelo seu nome Define um estado que eacute representado pelos valores dos seus atributos em um dado momento O comportamento de um objeto eacute definido pelo conjunto de funccedilotildees que podem ser aplicados a ele Podem existir vaacuterios objetos de uma mesma classe POO eacute portanto a implementaccedilatildeo de tipos abstratos de dados classes e objetos Um programa escrito em C++ ou C pode ser visto como uma coleccedilatildeo de objetos

CRIANDO OBJETOS

Agora que jaacute sabemos como definir uma classe podemos passar ao ponto de criar objetos da classe definida Eacute importante perceber o fato de que podemos criar vaacuterios objetos da mesma classe natildeo ficando limitado a apenas um objeto

No C++ podemos declarar um objeto de maneira estaacutetica Suponha que a classe cTempo jaacute estaacute definida Veja a declaraccedilatildeo abaixo em C++

cTempo Aniversario Aniversario eacute um objeto (instacircncia da classe cTempo)

Quando vamos criar um objeto em C utilizamos a palavra chave new seguindo o seguinte esquema

ltTipogt ltnomegt = new ltTipogt()

Assim teriacuteamos em relaccedilatildeo ao exemplo anterior

MEacuteTODOS

PROPRIEDADES

CLASSE

Os meacutetodos satildeo funccedilotildees normais em linguagem C ou C++

As propriedades satildeo variaacuteveis normais int char struct

9

cTempo Aniversario = new cTempo() Aniversario eacute um objeto (instacircncia da classe cTempo)

Veja entatildeo um exemplo de criaccedilatildeo de um objeto de uma classe hipoteacutetica Computador com o nome de comp1

Computador comp1 = new Computador() comp1 e um objeto da classe Computador

O operador new eacute responsaacutevel por calcular o nuacutemero correto de bytes para o objeto especificado e adquirir memoacuteria suficiente (esta aacuterea de memoacuteria eacute chamada de heap) Assim no C a keyword new eacute o caminho para criar um objeto Dentro de uma classe assim como em programas comuns da linguagem lsquoCrsquo podem existir variaacuteveis e funccedilotildees Dentro da classe as variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos

Veja outro exemplo

using System

class HelloClass propriedades meacutetodos

public static int Main(string[] args) Vocecirc pode declarar e criar um novo objeto em uma simples linha HelloClass c1 = new HelloClass()

ou quebrar a declaraccedilatildeo e criaccedilatildeo em duas linhas HelloClass c2 c2 = new HelloClass()

Aqui satildeo alocados dois objetos da classe HelloClass Variaacuteveis de objeto em C realmente satildeo uma referecircncia ao objeto na memoacuteria natildeo o proacuteprio objeto em si Assim c1 e c2 referenciam dois objetos da classe HelloClass alocados na memoacuteria heap

Perceba que na criaccedilatildeo do objetos c1 e c2 apoacutes o new chamamos o tipo HelloClass seguido de parecircnteses Essa notaccedilatildeo significa que neste momento seraacute executado um meacutetodo especial da classe HelloClass chamado construtor

14 MEacuteTODO CONSTRUTOR

O construtor eacute um meacutetodo que possui o mesmo nome da classe que natildeo retorna nenhum valor e que eacute chamado cada vez que um objeto da classe eacute criado Por padratildeo quando natildeo criamos nenhum construtor (como na classe HelloClass) o construtor vazio que natildeo recebe nenhum paracircmetro e tambeacutem natildeo executa nenhum coacutedigo eacute criado automaticamente Apoacutes criarmos um construtor o construtor vazio automaacutetico natildeo eacute mais criado devendo ser criado pelo desenvolvedor caso precise Veja o exemplo abaixo

10

HelloClass com construtores

using System

class HelloClass

public string strMensagem

Construtor padratildeo

public HelloClass()

ConsoleWriteLine(Construtor padratildeo chamado)

Construtor customizado

public HelloClass (string msg)

ConsoleWriteLine(Construtor customizado chamado)

strMensagem = msg

Ponto de entrada do programa

public static int Main(string[] args)

Chamando o construtor padratildeo

HelloClass c1 = new HelloClass()

ConsoleWriteLine(Mensagem do usuaacuterio 0n c1strMensagem)

Chamando o construtor customizado passando uma string como paracircmetro

HelloClass c2

c2 = new HelloClass(Testando 1 2 3)

ConsoleWriteLine(Mensagem do usuaacuterio 0 c2strMensagem)

ConsoleReadLine()

return 0

15 ATRIBUTOS E MEacuteTODOS

Veja a classe Computador com um construtor que recebe 3 strings e preenche os atributos da classe com essas strings monitor teclado e mouse satildeo os atributos da classe

Meacutetodo com o mesmo nome da classe sem paracircmetro

Meacutetodo com o mesmo nome da classe com paracircmetro

11

namespace Construtor

class Computador

string monitorstring tecladostring mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

Computador comp1 = new Computador(Monitor1Teclado1Mouse1)Computador comp2 = new Computador(Monitor2Teclado2Mouse2)Computador comp3 = new Computador(SamsungAcerLogitch)

Obs Foram criados 3 objetos (comp1 comp2 e comp3) da classe Computador onde cada um recebeu 3 argumentos diferentes

16 TIPOS POR VALOR X TIPOS POR REFEREcircNCIA

Os tipos preacute-definidos em C satildeo normalmente conhecidos como tipos por valor Esses tipos devem permitir um acesso raacutepido jaacute que satildeo muitas vezes utilizados no coacutedigo Dessa forma os tipos por valor tecircm guardados na memoacuteria apenas o seu valor sem nenhuma outra informaccedilatildeo adicional que poderia causar um gasto desnecessaacuterio de memoacuteria

Os tipos criados por classes os objetos satildeo conhecidos como tipos por referecircncia Essa denominaccedilatildeo vem do fato de que esses tipos natildeo guardam o seu valor mas sim uma referecircncia para um local na memoacuteria que conteacutem o valor No C e no C++ chamariacuteamos esta referecircncia de ponteiro

Com essas definiccedilotildees eacute importante perceber que se copiarmos as informaccedilotildees de variaacuteveis de tipos por valor e de variaacuteveis de tipos por referecircncia teremos comportamentos diferentes Caso copiemos uma variaacutevel por valor o que ocorre eacute que uma nova coacutepia do valor eacute passada para a outra variaacutevel Isso significa que caso modifiquemos uma das variaacuteveis nada ocorreraacute com a outra

Em variaacuteveis por referecircncia o que ocorre ao copiarmos para outra variaacutevel eacute que apenas a referecircncia eacute copiada natildeo o valor Apoacutes a coacutepia o que acontece eacute que teremos duas variaacuteveis apontando para um mesmo valor Isso significa que ao modificarmos uma variaacutevel estaremos na realidade modificando o valor para o qual a outra variaacutevel tambeacutem estaacute apontando significando que o valor da outra variaacutevel tambeacutem seraacute modificado

Meacutetodo construtor (tem o mesmo nome da classe) e recebe 3 paracircmetros

Atributos da Classe satildeo variaacuteveis comuns e podem ser de qualquer tipo

Programa Principalonde os objetos satildeo criados (instanciados)

Meacutetodo imprime um meacutetodo da classe Veja que eacute uma simples funccedilatildeo para impressatildeo

12

Veja o coacutedigo abaixo e observe o resultado

class Computador public string monitor public string tecladdo public string mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public void Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

cria uma variaacutevel de tipo por valorint valor1 = 10copia para outra variaacutevelint valor2 = valor1adiciona 5 a valor2valor2 += 5imprime o valor das duasConsoleWriteLine(valor1 + valor1)ConsoleWriteLine(valor2 + valor2)

cria um objeto de tipo por referecircnciaComputador comp1 = new Computador(Monitor1Teclado1Mouse1)

copia a referecircncia do objeto comp1 para o objeto comp2Computador comp2 = comp1

modifica o valor do monitorcomp2monitor = Modificadoimprime os dois computadorescomp1imprime()comp2imprime()

Veja o resultado

Veja que inicialmente o nome do monitor de comp1 era Monitor1 Mesmo tendo modificado apenas um dos objetos (o comp2) o comp1 tambeacutem foi modificado provando que na verdade os dois objetos referenciam o mesmo endereccedilo na memoacuteria

13

EXERCIacuteCIO

O aluno deveraacute desenvolver a classe funcionario que tem a seguinte especificaccedilatildeo

ATRIBUTOS Matricula int nome endereco string peso altura float sexo char

MEacuteTODOS

funcionaacuterio() este eacute o meacutetodo construtor padratildeo(lembre-se que o meacutetodo construtor tem o mesmo nome da classe)Entradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprimir a mensagem ldquoConstrutor Padrao Chamado rdquo

funcionaacuterio(string msg) este eacute outro meacutetodo construtor sobrecarregadoEntradas mensagem vinda do mainSaiacutedas nenhumaFunccedilatildeo imprime a mensagem recebida

funcionaacuterio(int mat string nom string end float pes float alt char sex ) este eacute outro meacutetodo construtor sobrecarregadoEntradas dados vindos do mainSaiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

atualizaDados(int mat string nom string end float pes float alt char sex) Entradas dados vindos do main

Saiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

imprimeDadosEntradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprime todos os dados do funcionario

Agora estaacute na hora de usar a classe Usando meacutetodos da classe funcionario definida acima e criada por vocecirc crie uma aplicaccedilatildeo que faccedila o seguinte na ordem dada

1 Instancie trecircs objeto da classe funcionaacuterio

objJoaoutilize o construtor padratildeo

objPedroutilize o segundo construtor e passe a mensagem

ldquoSegundo construtor obrecarregado chamado rdquo

objMaria chame o terceiro construtor e passe os seguintes dados

matricula 2341 nome ldquoMaria da Silvardquo endereccedilo Rua das Flores 34 peso 676 altura 176 sexo lsquoFrsquo

2 Imprima os dados do objeto objMaria

3 Atualize os dados do objJoao com

14

matricula 6784 nome ldquoJoao Marquesrdquo endereccedilo Rua das Acacias 45 peso 896 altura 190 sexo lsquoMrsquo

4 Atualize os dados do objPedro com

matricula 4523 nome ldquoPedro Villarrdquo endereccedilo Rua Torta 33 peso 789 altura 176 sexo lsquoMrsquo

5 Imprima os dados dos objetos objJoao e objPedro

17 HERANCcedilA

Heranccedila eacute um dos trecircs princiacutepios fundamentais da programaccedilatildeo orientada a objetos porque ela permite a criaccedilatildeo de hierarquia nos objetos que compotildeem o sistema Em C uma classe que tem seus dados e meacutetodos herdados por outra eacute chamada de classe base ou super classe e a classe que herda tais dados eacute chamada de classe derivada ou sub-classe

O que um aluno um professor e um funcionaacuterio possuem em comum Todos eles satildeo pessoas e portanto compartilham alguns dados comuns Todos tecircm nome idade endereccedilo etc E o que diferencia um aluno de outra pessoa qualquer Um aluno possui uma matriacutecula Um funcionaacuterio possui um coacutedigo de funcionaacuterio data de admissatildeo salaacuterio etc Um professor possui um coacutedigo de professor e informaccedilotildees relacionadas agrave sua formaccedilatildeo

Eacute aqui que a heranccedila se torna uma ferramenta de grande utilidade Podemos criar uma classe Pessoa que possui todos os atributos e meacutetodos comuns a todas as pessoas e herdar estes atributos e meacutetodos em classes mais especiacuteficas ou seja a heranccedila parte do geral para o mais especiacutefico Comece criando uma classe Pessoa como mostrado no coacutedigo a seguir

class Pessoa public string nome public int idade

Esta classe possui as propriedades nome e idade Estas propriedades satildeo comuns a todas as pessoas Veja agora como podemos criar uma classe Aluno que herda estas propriedades da classe Pessoa e inclui suas proacuteprias propriedades a saber seu nuacutemero de matriacutecula Eis o coacutedigo

class Aluno Pessoa public string matricula

Observe que em C os dois-pontos satildeo usados para indicar a heranccedila A classe Aluno agora possui trecircs atributos nome idade e matricula Veja um aplicativo demonstrando este relacionamento

static void Main(string[] args) cria um objeto da classe Aluno Aluno aluno = new Aluno()

alunonome = Osmar J Silva

As propriedades nome e idade foram herdadas da classe Pessoa pela classe Aluno

15

alunoidade = 36 alunomatricula = AC33-65

Exibe o resultado ConsoleWriteLine(Nome + alunonome + n + Idade + alunoidade + n + Matriacutecula + alunomatricula)

ConsoleWriteLine(nnPressione uma tecla para sair) ConsoleReadKey()

A heranccedila nos fornece um grande benefiacutecio Ao concentrarmos caracteriacutesticas comuns em uma classe e derivar as classes mais especiacuteficas a partir desta noacutes estamos preparados para a adiccedilatildeo de novas funcionalidades ao sistema Se mais adiante uma nova propriedade comum tiver que ser adicionada natildeo precisaremos efetuar alteraccedilotildees em todas as classes Basta alterar a superclasse e pronto As classes derivadas seratildeo automaticamente atualizadas

16

1048576

EXEMPLO DE COacuteDIGO CONSTRUINDO UMA CLASSE

Suponha que queiramos escrever um programa que manipula datas (minuto hora dia mecircs ano) Ao inveacutes de cinco variaacuteveis isoladas poderiacuteamos colocar estes dados em uma estrutura uacutenica englobando a data completa Assim poderiacuteamos declarar uma variaacutevel do tipo struct da seguinte maneira

struct Tempo int anoint mesint diaint horaint minuto

Ok ateacute aqui nada de novo (certo) Soacute declaramos uma estrutura em C padratildeo que conteacutem 5 variaacuteveis ano mecircs dia hora e minuto Agora imagine que aleacutem dessas variaacuteveis a estrutura Tempo pudesse tambeacutem ter embutida (encapsulada) funccedilotildees em C ou C Por exemplo uma funccedilatildeo que mostra a data na tela Esta estrutura seria mais ldquopoderosardquo pois os dados poderiam ser manipulados de dentro da proacutepria estrutura atraveacutes da sua funccedilatildeo interna Essa estrutura mais versaacutetil que conteacutem declaraccedilotildees de variaacuteveis e funccedilotildees constitui-se em uma classe como vimos anteriormente As variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos Assim poderiacuteamos reescrever nossa estrutura Tempo como uma classe cTempo

public class cTempo

public int ano variavel publica da classepublic int mes variavel publica da classepublic int dia variavel publica da classepublic int hora variavel publica da classepublic int minuto variavel publica da classe public void mostra_data() meacutetodo publico da classe

ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

Ok estamos prontos agora para usar nossa classe CTempo Como Temos que observar duas coisas

1 Natildeo trabalhamos com a classe CTempo Temos que instanciar um objeto da classe CTempo e trabalhar com este objeto

2 Abaixo temos a declaraccedilatildeo (instanciaccedilatildeo) do objeto e um pequeno programa em C

17

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos satildeo acessiacuteveis pelo main desde que sejam publicos public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto) Programa Principal static void Main(string[] args)

instanciando o objeto aniversario da classe cTempo cTempo aniversario = new cTempo() ConsoleWriteLine(Exemplo de POO em Cn)

para acessar metodos faccedila nome_objetonome_metodo

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data Para acessar atributos publicos faccedila nome_objetonome_atributo

aniversariodia = 9 aniversariomes = 2 aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23 ConsoleWriteLine(Nova datan) aniversariomostra_data() ConsoleReadKey()

A saiacuteda do programa seraacute

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 9: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

9

cTempo Aniversario = new cTempo() Aniversario eacute um objeto (instacircncia da classe cTempo)

Veja entatildeo um exemplo de criaccedilatildeo de um objeto de uma classe hipoteacutetica Computador com o nome de comp1

Computador comp1 = new Computador() comp1 e um objeto da classe Computador

O operador new eacute responsaacutevel por calcular o nuacutemero correto de bytes para o objeto especificado e adquirir memoacuteria suficiente (esta aacuterea de memoacuteria eacute chamada de heap) Assim no C a keyword new eacute o caminho para criar um objeto Dentro de uma classe assim como em programas comuns da linguagem lsquoCrsquo podem existir variaacuteveis e funccedilotildees Dentro da classe as variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos

Veja outro exemplo

using System

class HelloClass propriedades meacutetodos

public static int Main(string[] args) Vocecirc pode declarar e criar um novo objeto em uma simples linha HelloClass c1 = new HelloClass()

ou quebrar a declaraccedilatildeo e criaccedilatildeo em duas linhas HelloClass c2 c2 = new HelloClass()

Aqui satildeo alocados dois objetos da classe HelloClass Variaacuteveis de objeto em C realmente satildeo uma referecircncia ao objeto na memoacuteria natildeo o proacuteprio objeto em si Assim c1 e c2 referenciam dois objetos da classe HelloClass alocados na memoacuteria heap

Perceba que na criaccedilatildeo do objetos c1 e c2 apoacutes o new chamamos o tipo HelloClass seguido de parecircnteses Essa notaccedilatildeo significa que neste momento seraacute executado um meacutetodo especial da classe HelloClass chamado construtor

14 MEacuteTODO CONSTRUTOR

O construtor eacute um meacutetodo que possui o mesmo nome da classe que natildeo retorna nenhum valor e que eacute chamado cada vez que um objeto da classe eacute criado Por padratildeo quando natildeo criamos nenhum construtor (como na classe HelloClass) o construtor vazio que natildeo recebe nenhum paracircmetro e tambeacutem natildeo executa nenhum coacutedigo eacute criado automaticamente Apoacutes criarmos um construtor o construtor vazio automaacutetico natildeo eacute mais criado devendo ser criado pelo desenvolvedor caso precise Veja o exemplo abaixo

10

HelloClass com construtores

using System

class HelloClass

public string strMensagem

Construtor padratildeo

public HelloClass()

ConsoleWriteLine(Construtor padratildeo chamado)

Construtor customizado

public HelloClass (string msg)

ConsoleWriteLine(Construtor customizado chamado)

strMensagem = msg

Ponto de entrada do programa

public static int Main(string[] args)

Chamando o construtor padratildeo

HelloClass c1 = new HelloClass()

ConsoleWriteLine(Mensagem do usuaacuterio 0n c1strMensagem)

Chamando o construtor customizado passando uma string como paracircmetro

HelloClass c2

c2 = new HelloClass(Testando 1 2 3)

ConsoleWriteLine(Mensagem do usuaacuterio 0 c2strMensagem)

ConsoleReadLine()

return 0

15 ATRIBUTOS E MEacuteTODOS

Veja a classe Computador com um construtor que recebe 3 strings e preenche os atributos da classe com essas strings monitor teclado e mouse satildeo os atributos da classe

Meacutetodo com o mesmo nome da classe sem paracircmetro

Meacutetodo com o mesmo nome da classe com paracircmetro

11

namespace Construtor

class Computador

string monitorstring tecladostring mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

Computador comp1 = new Computador(Monitor1Teclado1Mouse1)Computador comp2 = new Computador(Monitor2Teclado2Mouse2)Computador comp3 = new Computador(SamsungAcerLogitch)

Obs Foram criados 3 objetos (comp1 comp2 e comp3) da classe Computador onde cada um recebeu 3 argumentos diferentes

16 TIPOS POR VALOR X TIPOS POR REFEREcircNCIA

Os tipos preacute-definidos em C satildeo normalmente conhecidos como tipos por valor Esses tipos devem permitir um acesso raacutepido jaacute que satildeo muitas vezes utilizados no coacutedigo Dessa forma os tipos por valor tecircm guardados na memoacuteria apenas o seu valor sem nenhuma outra informaccedilatildeo adicional que poderia causar um gasto desnecessaacuterio de memoacuteria

Os tipos criados por classes os objetos satildeo conhecidos como tipos por referecircncia Essa denominaccedilatildeo vem do fato de que esses tipos natildeo guardam o seu valor mas sim uma referecircncia para um local na memoacuteria que conteacutem o valor No C e no C++ chamariacuteamos esta referecircncia de ponteiro

Com essas definiccedilotildees eacute importante perceber que se copiarmos as informaccedilotildees de variaacuteveis de tipos por valor e de variaacuteveis de tipos por referecircncia teremos comportamentos diferentes Caso copiemos uma variaacutevel por valor o que ocorre eacute que uma nova coacutepia do valor eacute passada para a outra variaacutevel Isso significa que caso modifiquemos uma das variaacuteveis nada ocorreraacute com a outra

Em variaacuteveis por referecircncia o que ocorre ao copiarmos para outra variaacutevel eacute que apenas a referecircncia eacute copiada natildeo o valor Apoacutes a coacutepia o que acontece eacute que teremos duas variaacuteveis apontando para um mesmo valor Isso significa que ao modificarmos uma variaacutevel estaremos na realidade modificando o valor para o qual a outra variaacutevel tambeacutem estaacute apontando significando que o valor da outra variaacutevel tambeacutem seraacute modificado

Meacutetodo construtor (tem o mesmo nome da classe) e recebe 3 paracircmetros

Atributos da Classe satildeo variaacuteveis comuns e podem ser de qualquer tipo

Programa Principalonde os objetos satildeo criados (instanciados)

Meacutetodo imprime um meacutetodo da classe Veja que eacute uma simples funccedilatildeo para impressatildeo

12

Veja o coacutedigo abaixo e observe o resultado

class Computador public string monitor public string tecladdo public string mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public void Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

cria uma variaacutevel de tipo por valorint valor1 = 10copia para outra variaacutevelint valor2 = valor1adiciona 5 a valor2valor2 += 5imprime o valor das duasConsoleWriteLine(valor1 + valor1)ConsoleWriteLine(valor2 + valor2)

cria um objeto de tipo por referecircnciaComputador comp1 = new Computador(Monitor1Teclado1Mouse1)

copia a referecircncia do objeto comp1 para o objeto comp2Computador comp2 = comp1

modifica o valor do monitorcomp2monitor = Modificadoimprime os dois computadorescomp1imprime()comp2imprime()

Veja o resultado

Veja que inicialmente o nome do monitor de comp1 era Monitor1 Mesmo tendo modificado apenas um dos objetos (o comp2) o comp1 tambeacutem foi modificado provando que na verdade os dois objetos referenciam o mesmo endereccedilo na memoacuteria

13

EXERCIacuteCIO

O aluno deveraacute desenvolver a classe funcionario que tem a seguinte especificaccedilatildeo

ATRIBUTOS Matricula int nome endereco string peso altura float sexo char

MEacuteTODOS

funcionaacuterio() este eacute o meacutetodo construtor padratildeo(lembre-se que o meacutetodo construtor tem o mesmo nome da classe)Entradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprimir a mensagem ldquoConstrutor Padrao Chamado rdquo

funcionaacuterio(string msg) este eacute outro meacutetodo construtor sobrecarregadoEntradas mensagem vinda do mainSaiacutedas nenhumaFunccedilatildeo imprime a mensagem recebida

funcionaacuterio(int mat string nom string end float pes float alt char sex ) este eacute outro meacutetodo construtor sobrecarregadoEntradas dados vindos do mainSaiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

atualizaDados(int mat string nom string end float pes float alt char sex) Entradas dados vindos do main

Saiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

imprimeDadosEntradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprime todos os dados do funcionario

Agora estaacute na hora de usar a classe Usando meacutetodos da classe funcionario definida acima e criada por vocecirc crie uma aplicaccedilatildeo que faccedila o seguinte na ordem dada

1 Instancie trecircs objeto da classe funcionaacuterio

objJoaoutilize o construtor padratildeo

objPedroutilize o segundo construtor e passe a mensagem

ldquoSegundo construtor obrecarregado chamado rdquo

objMaria chame o terceiro construtor e passe os seguintes dados

matricula 2341 nome ldquoMaria da Silvardquo endereccedilo Rua das Flores 34 peso 676 altura 176 sexo lsquoFrsquo

2 Imprima os dados do objeto objMaria

3 Atualize os dados do objJoao com

14

matricula 6784 nome ldquoJoao Marquesrdquo endereccedilo Rua das Acacias 45 peso 896 altura 190 sexo lsquoMrsquo

4 Atualize os dados do objPedro com

matricula 4523 nome ldquoPedro Villarrdquo endereccedilo Rua Torta 33 peso 789 altura 176 sexo lsquoMrsquo

5 Imprima os dados dos objetos objJoao e objPedro

17 HERANCcedilA

Heranccedila eacute um dos trecircs princiacutepios fundamentais da programaccedilatildeo orientada a objetos porque ela permite a criaccedilatildeo de hierarquia nos objetos que compotildeem o sistema Em C uma classe que tem seus dados e meacutetodos herdados por outra eacute chamada de classe base ou super classe e a classe que herda tais dados eacute chamada de classe derivada ou sub-classe

O que um aluno um professor e um funcionaacuterio possuem em comum Todos eles satildeo pessoas e portanto compartilham alguns dados comuns Todos tecircm nome idade endereccedilo etc E o que diferencia um aluno de outra pessoa qualquer Um aluno possui uma matriacutecula Um funcionaacuterio possui um coacutedigo de funcionaacuterio data de admissatildeo salaacuterio etc Um professor possui um coacutedigo de professor e informaccedilotildees relacionadas agrave sua formaccedilatildeo

Eacute aqui que a heranccedila se torna uma ferramenta de grande utilidade Podemos criar uma classe Pessoa que possui todos os atributos e meacutetodos comuns a todas as pessoas e herdar estes atributos e meacutetodos em classes mais especiacuteficas ou seja a heranccedila parte do geral para o mais especiacutefico Comece criando uma classe Pessoa como mostrado no coacutedigo a seguir

class Pessoa public string nome public int idade

Esta classe possui as propriedades nome e idade Estas propriedades satildeo comuns a todas as pessoas Veja agora como podemos criar uma classe Aluno que herda estas propriedades da classe Pessoa e inclui suas proacuteprias propriedades a saber seu nuacutemero de matriacutecula Eis o coacutedigo

class Aluno Pessoa public string matricula

Observe que em C os dois-pontos satildeo usados para indicar a heranccedila A classe Aluno agora possui trecircs atributos nome idade e matricula Veja um aplicativo demonstrando este relacionamento

static void Main(string[] args) cria um objeto da classe Aluno Aluno aluno = new Aluno()

alunonome = Osmar J Silva

As propriedades nome e idade foram herdadas da classe Pessoa pela classe Aluno

15

alunoidade = 36 alunomatricula = AC33-65

Exibe o resultado ConsoleWriteLine(Nome + alunonome + n + Idade + alunoidade + n + Matriacutecula + alunomatricula)

ConsoleWriteLine(nnPressione uma tecla para sair) ConsoleReadKey()

A heranccedila nos fornece um grande benefiacutecio Ao concentrarmos caracteriacutesticas comuns em uma classe e derivar as classes mais especiacuteficas a partir desta noacutes estamos preparados para a adiccedilatildeo de novas funcionalidades ao sistema Se mais adiante uma nova propriedade comum tiver que ser adicionada natildeo precisaremos efetuar alteraccedilotildees em todas as classes Basta alterar a superclasse e pronto As classes derivadas seratildeo automaticamente atualizadas

16

1048576

EXEMPLO DE COacuteDIGO CONSTRUINDO UMA CLASSE

Suponha que queiramos escrever um programa que manipula datas (minuto hora dia mecircs ano) Ao inveacutes de cinco variaacuteveis isoladas poderiacuteamos colocar estes dados em uma estrutura uacutenica englobando a data completa Assim poderiacuteamos declarar uma variaacutevel do tipo struct da seguinte maneira

struct Tempo int anoint mesint diaint horaint minuto

Ok ateacute aqui nada de novo (certo) Soacute declaramos uma estrutura em C padratildeo que conteacutem 5 variaacuteveis ano mecircs dia hora e minuto Agora imagine que aleacutem dessas variaacuteveis a estrutura Tempo pudesse tambeacutem ter embutida (encapsulada) funccedilotildees em C ou C Por exemplo uma funccedilatildeo que mostra a data na tela Esta estrutura seria mais ldquopoderosardquo pois os dados poderiam ser manipulados de dentro da proacutepria estrutura atraveacutes da sua funccedilatildeo interna Essa estrutura mais versaacutetil que conteacutem declaraccedilotildees de variaacuteveis e funccedilotildees constitui-se em uma classe como vimos anteriormente As variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos Assim poderiacuteamos reescrever nossa estrutura Tempo como uma classe cTempo

public class cTempo

public int ano variavel publica da classepublic int mes variavel publica da classepublic int dia variavel publica da classepublic int hora variavel publica da classepublic int minuto variavel publica da classe public void mostra_data() meacutetodo publico da classe

ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

Ok estamos prontos agora para usar nossa classe CTempo Como Temos que observar duas coisas

1 Natildeo trabalhamos com a classe CTempo Temos que instanciar um objeto da classe CTempo e trabalhar com este objeto

2 Abaixo temos a declaraccedilatildeo (instanciaccedilatildeo) do objeto e um pequeno programa em C

17

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos satildeo acessiacuteveis pelo main desde que sejam publicos public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto) Programa Principal static void Main(string[] args)

instanciando o objeto aniversario da classe cTempo cTempo aniversario = new cTempo() ConsoleWriteLine(Exemplo de POO em Cn)

para acessar metodos faccedila nome_objetonome_metodo

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data Para acessar atributos publicos faccedila nome_objetonome_atributo

aniversariodia = 9 aniversariomes = 2 aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23 ConsoleWriteLine(Nova datan) aniversariomostra_data() ConsoleReadKey()

A saiacuteda do programa seraacute

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 10: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

10

HelloClass com construtores

using System

class HelloClass

public string strMensagem

Construtor padratildeo

public HelloClass()

ConsoleWriteLine(Construtor padratildeo chamado)

Construtor customizado

public HelloClass (string msg)

ConsoleWriteLine(Construtor customizado chamado)

strMensagem = msg

Ponto de entrada do programa

public static int Main(string[] args)

Chamando o construtor padratildeo

HelloClass c1 = new HelloClass()

ConsoleWriteLine(Mensagem do usuaacuterio 0n c1strMensagem)

Chamando o construtor customizado passando uma string como paracircmetro

HelloClass c2

c2 = new HelloClass(Testando 1 2 3)

ConsoleWriteLine(Mensagem do usuaacuterio 0 c2strMensagem)

ConsoleReadLine()

return 0

15 ATRIBUTOS E MEacuteTODOS

Veja a classe Computador com um construtor que recebe 3 strings e preenche os atributos da classe com essas strings monitor teclado e mouse satildeo os atributos da classe

Meacutetodo com o mesmo nome da classe sem paracircmetro

Meacutetodo com o mesmo nome da classe com paracircmetro

11

namespace Construtor

class Computador

string monitorstring tecladostring mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

Computador comp1 = new Computador(Monitor1Teclado1Mouse1)Computador comp2 = new Computador(Monitor2Teclado2Mouse2)Computador comp3 = new Computador(SamsungAcerLogitch)

Obs Foram criados 3 objetos (comp1 comp2 e comp3) da classe Computador onde cada um recebeu 3 argumentos diferentes

16 TIPOS POR VALOR X TIPOS POR REFEREcircNCIA

Os tipos preacute-definidos em C satildeo normalmente conhecidos como tipos por valor Esses tipos devem permitir um acesso raacutepido jaacute que satildeo muitas vezes utilizados no coacutedigo Dessa forma os tipos por valor tecircm guardados na memoacuteria apenas o seu valor sem nenhuma outra informaccedilatildeo adicional que poderia causar um gasto desnecessaacuterio de memoacuteria

Os tipos criados por classes os objetos satildeo conhecidos como tipos por referecircncia Essa denominaccedilatildeo vem do fato de que esses tipos natildeo guardam o seu valor mas sim uma referecircncia para um local na memoacuteria que conteacutem o valor No C e no C++ chamariacuteamos esta referecircncia de ponteiro

Com essas definiccedilotildees eacute importante perceber que se copiarmos as informaccedilotildees de variaacuteveis de tipos por valor e de variaacuteveis de tipos por referecircncia teremos comportamentos diferentes Caso copiemos uma variaacutevel por valor o que ocorre eacute que uma nova coacutepia do valor eacute passada para a outra variaacutevel Isso significa que caso modifiquemos uma das variaacuteveis nada ocorreraacute com a outra

Em variaacuteveis por referecircncia o que ocorre ao copiarmos para outra variaacutevel eacute que apenas a referecircncia eacute copiada natildeo o valor Apoacutes a coacutepia o que acontece eacute que teremos duas variaacuteveis apontando para um mesmo valor Isso significa que ao modificarmos uma variaacutevel estaremos na realidade modificando o valor para o qual a outra variaacutevel tambeacutem estaacute apontando significando que o valor da outra variaacutevel tambeacutem seraacute modificado

Meacutetodo construtor (tem o mesmo nome da classe) e recebe 3 paracircmetros

Atributos da Classe satildeo variaacuteveis comuns e podem ser de qualquer tipo

Programa Principalonde os objetos satildeo criados (instanciados)

Meacutetodo imprime um meacutetodo da classe Veja que eacute uma simples funccedilatildeo para impressatildeo

12

Veja o coacutedigo abaixo e observe o resultado

class Computador public string monitor public string tecladdo public string mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public void Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

cria uma variaacutevel de tipo por valorint valor1 = 10copia para outra variaacutevelint valor2 = valor1adiciona 5 a valor2valor2 += 5imprime o valor das duasConsoleWriteLine(valor1 + valor1)ConsoleWriteLine(valor2 + valor2)

cria um objeto de tipo por referecircnciaComputador comp1 = new Computador(Monitor1Teclado1Mouse1)

copia a referecircncia do objeto comp1 para o objeto comp2Computador comp2 = comp1

modifica o valor do monitorcomp2monitor = Modificadoimprime os dois computadorescomp1imprime()comp2imprime()

Veja o resultado

Veja que inicialmente o nome do monitor de comp1 era Monitor1 Mesmo tendo modificado apenas um dos objetos (o comp2) o comp1 tambeacutem foi modificado provando que na verdade os dois objetos referenciam o mesmo endereccedilo na memoacuteria

13

EXERCIacuteCIO

O aluno deveraacute desenvolver a classe funcionario que tem a seguinte especificaccedilatildeo

ATRIBUTOS Matricula int nome endereco string peso altura float sexo char

MEacuteTODOS

funcionaacuterio() este eacute o meacutetodo construtor padratildeo(lembre-se que o meacutetodo construtor tem o mesmo nome da classe)Entradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprimir a mensagem ldquoConstrutor Padrao Chamado rdquo

funcionaacuterio(string msg) este eacute outro meacutetodo construtor sobrecarregadoEntradas mensagem vinda do mainSaiacutedas nenhumaFunccedilatildeo imprime a mensagem recebida

funcionaacuterio(int mat string nom string end float pes float alt char sex ) este eacute outro meacutetodo construtor sobrecarregadoEntradas dados vindos do mainSaiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

atualizaDados(int mat string nom string end float pes float alt char sex) Entradas dados vindos do main

Saiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

imprimeDadosEntradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprime todos os dados do funcionario

Agora estaacute na hora de usar a classe Usando meacutetodos da classe funcionario definida acima e criada por vocecirc crie uma aplicaccedilatildeo que faccedila o seguinte na ordem dada

1 Instancie trecircs objeto da classe funcionaacuterio

objJoaoutilize o construtor padratildeo

objPedroutilize o segundo construtor e passe a mensagem

ldquoSegundo construtor obrecarregado chamado rdquo

objMaria chame o terceiro construtor e passe os seguintes dados

matricula 2341 nome ldquoMaria da Silvardquo endereccedilo Rua das Flores 34 peso 676 altura 176 sexo lsquoFrsquo

2 Imprima os dados do objeto objMaria

3 Atualize os dados do objJoao com

14

matricula 6784 nome ldquoJoao Marquesrdquo endereccedilo Rua das Acacias 45 peso 896 altura 190 sexo lsquoMrsquo

4 Atualize os dados do objPedro com

matricula 4523 nome ldquoPedro Villarrdquo endereccedilo Rua Torta 33 peso 789 altura 176 sexo lsquoMrsquo

5 Imprima os dados dos objetos objJoao e objPedro

17 HERANCcedilA

Heranccedila eacute um dos trecircs princiacutepios fundamentais da programaccedilatildeo orientada a objetos porque ela permite a criaccedilatildeo de hierarquia nos objetos que compotildeem o sistema Em C uma classe que tem seus dados e meacutetodos herdados por outra eacute chamada de classe base ou super classe e a classe que herda tais dados eacute chamada de classe derivada ou sub-classe

O que um aluno um professor e um funcionaacuterio possuem em comum Todos eles satildeo pessoas e portanto compartilham alguns dados comuns Todos tecircm nome idade endereccedilo etc E o que diferencia um aluno de outra pessoa qualquer Um aluno possui uma matriacutecula Um funcionaacuterio possui um coacutedigo de funcionaacuterio data de admissatildeo salaacuterio etc Um professor possui um coacutedigo de professor e informaccedilotildees relacionadas agrave sua formaccedilatildeo

Eacute aqui que a heranccedila se torna uma ferramenta de grande utilidade Podemos criar uma classe Pessoa que possui todos os atributos e meacutetodos comuns a todas as pessoas e herdar estes atributos e meacutetodos em classes mais especiacuteficas ou seja a heranccedila parte do geral para o mais especiacutefico Comece criando uma classe Pessoa como mostrado no coacutedigo a seguir

class Pessoa public string nome public int idade

Esta classe possui as propriedades nome e idade Estas propriedades satildeo comuns a todas as pessoas Veja agora como podemos criar uma classe Aluno que herda estas propriedades da classe Pessoa e inclui suas proacuteprias propriedades a saber seu nuacutemero de matriacutecula Eis o coacutedigo

class Aluno Pessoa public string matricula

Observe que em C os dois-pontos satildeo usados para indicar a heranccedila A classe Aluno agora possui trecircs atributos nome idade e matricula Veja um aplicativo demonstrando este relacionamento

static void Main(string[] args) cria um objeto da classe Aluno Aluno aluno = new Aluno()

alunonome = Osmar J Silva

As propriedades nome e idade foram herdadas da classe Pessoa pela classe Aluno

15

alunoidade = 36 alunomatricula = AC33-65

Exibe o resultado ConsoleWriteLine(Nome + alunonome + n + Idade + alunoidade + n + Matriacutecula + alunomatricula)

ConsoleWriteLine(nnPressione uma tecla para sair) ConsoleReadKey()

A heranccedila nos fornece um grande benefiacutecio Ao concentrarmos caracteriacutesticas comuns em uma classe e derivar as classes mais especiacuteficas a partir desta noacutes estamos preparados para a adiccedilatildeo de novas funcionalidades ao sistema Se mais adiante uma nova propriedade comum tiver que ser adicionada natildeo precisaremos efetuar alteraccedilotildees em todas as classes Basta alterar a superclasse e pronto As classes derivadas seratildeo automaticamente atualizadas

16

1048576

EXEMPLO DE COacuteDIGO CONSTRUINDO UMA CLASSE

Suponha que queiramos escrever um programa que manipula datas (minuto hora dia mecircs ano) Ao inveacutes de cinco variaacuteveis isoladas poderiacuteamos colocar estes dados em uma estrutura uacutenica englobando a data completa Assim poderiacuteamos declarar uma variaacutevel do tipo struct da seguinte maneira

struct Tempo int anoint mesint diaint horaint minuto

Ok ateacute aqui nada de novo (certo) Soacute declaramos uma estrutura em C padratildeo que conteacutem 5 variaacuteveis ano mecircs dia hora e minuto Agora imagine que aleacutem dessas variaacuteveis a estrutura Tempo pudesse tambeacutem ter embutida (encapsulada) funccedilotildees em C ou C Por exemplo uma funccedilatildeo que mostra a data na tela Esta estrutura seria mais ldquopoderosardquo pois os dados poderiam ser manipulados de dentro da proacutepria estrutura atraveacutes da sua funccedilatildeo interna Essa estrutura mais versaacutetil que conteacutem declaraccedilotildees de variaacuteveis e funccedilotildees constitui-se em uma classe como vimos anteriormente As variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos Assim poderiacuteamos reescrever nossa estrutura Tempo como uma classe cTempo

public class cTempo

public int ano variavel publica da classepublic int mes variavel publica da classepublic int dia variavel publica da classepublic int hora variavel publica da classepublic int minuto variavel publica da classe public void mostra_data() meacutetodo publico da classe

ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

Ok estamos prontos agora para usar nossa classe CTempo Como Temos que observar duas coisas

1 Natildeo trabalhamos com a classe CTempo Temos que instanciar um objeto da classe CTempo e trabalhar com este objeto

2 Abaixo temos a declaraccedilatildeo (instanciaccedilatildeo) do objeto e um pequeno programa em C

17

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos satildeo acessiacuteveis pelo main desde que sejam publicos public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto) Programa Principal static void Main(string[] args)

instanciando o objeto aniversario da classe cTempo cTempo aniversario = new cTempo() ConsoleWriteLine(Exemplo de POO em Cn)

para acessar metodos faccedila nome_objetonome_metodo

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data Para acessar atributos publicos faccedila nome_objetonome_atributo

aniversariodia = 9 aniversariomes = 2 aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23 ConsoleWriteLine(Nova datan) aniversariomostra_data() ConsoleReadKey()

A saiacuteda do programa seraacute

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 11: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

11

namespace Construtor

class Computador

string monitorstring tecladostring mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

Computador comp1 = new Computador(Monitor1Teclado1Mouse1)Computador comp2 = new Computador(Monitor2Teclado2Mouse2)Computador comp3 = new Computador(SamsungAcerLogitch)

Obs Foram criados 3 objetos (comp1 comp2 e comp3) da classe Computador onde cada um recebeu 3 argumentos diferentes

16 TIPOS POR VALOR X TIPOS POR REFEREcircNCIA

Os tipos preacute-definidos em C satildeo normalmente conhecidos como tipos por valor Esses tipos devem permitir um acesso raacutepido jaacute que satildeo muitas vezes utilizados no coacutedigo Dessa forma os tipos por valor tecircm guardados na memoacuteria apenas o seu valor sem nenhuma outra informaccedilatildeo adicional que poderia causar um gasto desnecessaacuterio de memoacuteria

Os tipos criados por classes os objetos satildeo conhecidos como tipos por referecircncia Essa denominaccedilatildeo vem do fato de que esses tipos natildeo guardam o seu valor mas sim uma referecircncia para um local na memoacuteria que conteacutem o valor No C e no C++ chamariacuteamos esta referecircncia de ponteiro

Com essas definiccedilotildees eacute importante perceber que se copiarmos as informaccedilotildees de variaacuteveis de tipos por valor e de variaacuteveis de tipos por referecircncia teremos comportamentos diferentes Caso copiemos uma variaacutevel por valor o que ocorre eacute que uma nova coacutepia do valor eacute passada para a outra variaacutevel Isso significa que caso modifiquemos uma das variaacuteveis nada ocorreraacute com a outra

Em variaacuteveis por referecircncia o que ocorre ao copiarmos para outra variaacutevel eacute que apenas a referecircncia eacute copiada natildeo o valor Apoacutes a coacutepia o que acontece eacute que teremos duas variaacuteveis apontando para um mesmo valor Isso significa que ao modificarmos uma variaacutevel estaremos na realidade modificando o valor para o qual a outra variaacutevel tambeacutem estaacute apontando significando que o valor da outra variaacutevel tambeacutem seraacute modificado

Meacutetodo construtor (tem o mesmo nome da classe) e recebe 3 paracircmetros

Atributos da Classe satildeo variaacuteveis comuns e podem ser de qualquer tipo

Programa Principalonde os objetos satildeo criados (instanciados)

Meacutetodo imprime um meacutetodo da classe Veja que eacute uma simples funccedilatildeo para impressatildeo

12

Veja o coacutedigo abaixo e observe o resultado

class Computador public string monitor public string tecladdo public string mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public void Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

cria uma variaacutevel de tipo por valorint valor1 = 10copia para outra variaacutevelint valor2 = valor1adiciona 5 a valor2valor2 += 5imprime o valor das duasConsoleWriteLine(valor1 + valor1)ConsoleWriteLine(valor2 + valor2)

cria um objeto de tipo por referecircnciaComputador comp1 = new Computador(Monitor1Teclado1Mouse1)

copia a referecircncia do objeto comp1 para o objeto comp2Computador comp2 = comp1

modifica o valor do monitorcomp2monitor = Modificadoimprime os dois computadorescomp1imprime()comp2imprime()

Veja o resultado

Veja que inicialmente o nome do monitor de comp1 era Monitor1 Mesmo tendo modificado apenas um dos objetos (o comp2) o comp1 tambeacutem foi modificado provando que na verdade os dois objetos referenciam o mesmo endereccedilo na memoacuteria

13

EXERCIacuteCIO

O aluno deveraacute desenvolver a classe funcionario que tem a seguinte especificaccedilatildeo

ATRIBUTOS Matricula int nome endereco string peso altura float sexo char

MEacuteTODOS

funcionaacuterio() este eacute o meacutetodo construtor padratildeo(lembre-se que o meacutetodo construtor tem o mesmo nome da classe)Entradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprimir a mensagem ldquoConstrutor Padrao Chamado rdquo

funcionaacuterio(string msg) este eacute outro meacutetodo construtor sobrecarregadoEntradas mensagem vinda do mainSaiacutedas nenhumaFunccedilatildeo imprime a mensagem recebida

funcionaacuterio(int mat string nom string end float pes float alt char sex ) este eacute outro meacutetodo construtor sobrecarregadoEntradas dados vindos do mainSaiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

atualizaDados(int mat string nom string end float pes float alt char sex) Entradas dados vindos do main

Saiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

imprimeDadosEntradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprime todos os dados do funcionario

Agora estaacute na hora de usar a classe Usando meacutetodos da classe funcionario definida acima e criada por vocecirc crie uma aplicaccedilatildeo que faccedila o seguinte na ordem dada

1 Instancie trecircs objeto da classe funcionaacuterio

objJoaoutilize o construtor padratildeo

objPedroutilize o segundo construtor e passe a mensagem

ldquoSegundo construtor obrecarregado chamado rdquo

objMaria chame o terceiro construtor e passe os seguintes dados

matricula 2341 nome ldquoMaria da Silvardquo endereccedilo Rua das Flores 34 peso 676 altura 176 sexo lsquoFrsquo

2 Imprima os dados do objeto objMaria

3 Atualize os dados do objJoao com

14

matricula 6784 nome ldquoJoao Marquesrdquo endereccedilo Rua das Acacias 45 peso 896 altura 190 sexo lsquoMrsquo

4 Atualize os dados do objPedro com

matricula 4523 nome ldquoPedro Villarrdquo endereccedilo Rua Torta 33 peso 789 altura 176 sexo lsquoMrsquo

5 Imprima os dados dos objetos objJoao e objPedro

17 HERANCcedilA

Heranccedila eacute um dos trecircs princiacutepios fundamentais da programaccedilatildeo orientada a objetos porque ela permite a criaccedilatildeo de hierarquia nos objetos que compotildeem o sistema Em C uma classe que tem seus dados e meacutetodos herdados por outra eacute chamada de classe base ou super classe e a classe que herda tais dados eacute chamada de classe derivada ou sub-classe

O que um aluno um professor e um funcionaacuterio possuem em comum Todos eles satildeo pessoas e portanto compartilham alguns dados comuns Todos tecircm nome idade endereccedilo etc E o que diferencia um aluno de outra pessoa qualquer Um aluno possui uma matriacutecula Um funcionaacuterio possui um coacutedigo de funcionaacuterio data de admissatildeo salaacuterio etc Um professor possui um coacutedigo de professor e informaccedilotildees relacionadas agrave sua formaccedilatildeo

Eacute aqui que a heranccedila se torna uma ferramenta de grande utilidade Podemos criar uma classe Pessoa que possui todos os atributos e meacutetodos comuns a todas as pessoas e herdar estes atributos e meacutetodos em classes mais especiacuteficas ou seja a heranccedila parte do geral para o mais especiacutefico Comece criando uma classe Pessoa como mostrado no coacutedigo a seguir

class Pessoa public string nome public int idade

Esta classe possui as propriedades nome e idade Estas propriedades satildeo comuns a todas as pessoas Veja agora como podemos criar uma classe Aluno que herda estas propriedades da classe Pessoa e inclui suas proacuteprias propriedades a saber seu nuacutemero de matriacutecula Eis o coacutedigo

class Aluno Pessoa public string matricula

Observe que em C os dois-pontos satildeo usados para indicar a heranccedila A classe Aluno agora possui trecircs atributos nome idade e matricula Veja um aplicativo demonstrando este relacionamento

static void Main(string[] args) cria um objeto da classe Aluno Aluno aluno = new Aluno()

alunonome = Osmar J Silva

As propriedades nome e idade foram herdadas da classe Pessoa pela classe Aluno

15

alunoidade = 36 alunomatricula = AC33-65

Exibe o resultado ConsoleWriteLine(Nome + alunonome + n + Idade + alunoidade + n + Matriacutecula + alunomatricula)

ConsoleWriteLine(nnPressione uma tecla para sair) ConsoleReadKey()

A heranccedila nos fornece um grande benefiacutecio Ao concentrarmos caracteriacutesticas comuns em uma classe e derivar as classes mais especiacuteficas a partir desta noacutes estamos preparados para a adiccedilatildeo de novas funcionalidades ao sistema Se mais adiante uma nova propriedade comum tiver que ser adicionada natildeo precisaremos efetuar alteraccedilotildees em todas as classes Basta alterar a superclasse e pronto As classes derivadas seratildeo automaticamente atualizadas

16

1048576

EXEMPLO DE COacuteDIGO CONSTRUINDO UMA CLASSE

Suponha que queiramos escrever um programa que manipula datas (minuto hora dia mecircs ano) Ao inveacutes de cinco variaacuteveis isoladas poderiacuteamos colocar estes dados em uma estrutura uacutenica englobando a data completa Assim poderiacuteamos declarar uma variaacutevel do tipo struct da seguinte maneira

struct Tempo int anoint mesint diaint horaint minuto

Ok ateacute aqui nada de novo (certo) Soacute declaramos uma estrutura em C padratildeo que conteacutem 5 variaacuteveis ano mecircs dia hora e minuto Agora imagine que aleacutem dessas variaacuteveis a estrutura Tempo pudesse tambeacutem ter embutida (encapsulada) funccedilotildees em C ou C Por exemplo uma funccedilatildeo que mostra a data na tela Esta estrutura seria mais ldquopoderosardquo pois os dados poderiam ser manipulados de dentro da proacutepria estrutura atraveacutes da sua funccedilatildeo interna Essa estrutura mais versaacutetil que conteacutem declaraccedilotildees de variaacuteveis e funccedilotildees constitui-se em uma classe como vimos anteriormente As variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos Assim poderiacuteamos reescrever nossa estrutura Tempo como uma classe cTempo

public class cTempo

public int ano variavel publica da classepublic int mes variavel publica da classepublic int dia variavel publica da classepublic int hora variavel publica da classepublic int minuto variavel publica da classe public void mostra_data() meacutetodo publico da classe

ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

Ok estamos prontos agora para usar nossa classe CTempo Como Temos que observar duas coisas

1 Natildeo trabalhamos com a classe CTempo Temos que instanciar um objeto da classe CTempo e trabalhar com este objeto

2 Abaixo temos a declaraccedilatildeo (instanciaccedilatildeo) do objeto e um pequeno programa em C

17

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos satildeo acessiacuteveis pelo main desde que sejam publicos public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto) Programa Principal static void Main(string[] args)

instanciando o objeto aniversario da classe cTempo cTempo aniversario = new cTempo() ConsoleWriteLine(Exemplo de POO em Cn)

para acessar metodos faccedila nome_objetonome_metodo

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data Para acessar atributos publicos faccedila nome_objetonome_atributo

aniversariodia = 9 aniversariomes = 2 aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23 ConsoleWriteLine(Nova datan) aniversariomostra_data() ConsoleReadKey()

A saiacuteda do programa seraacute

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 12: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

12

Veja o coacutedigo abaixo e observe o resultado

class Computador public string monitor public string tecladdo public string mouse

public Computador(string m string t string r)

monitor = mteclado = tmouse = r

public void Imprime()

ConsoleWriteLine(monitor + + teclado + + mouse)

public class App public static void Main()

cria uma variaacutevel de tipo por valorint valor1 = 10copia para outra variaacutevelint valor2 = valor1adiciona 5 a valor2valor2 += 5imprime o valor das duasConsoleWriteLine(valor1 + valor1)ConsoleWriteLine(valor2 + valor2)

cria um objeto de tipo por referecircnciaComputador comp1 = new Computador(Monitor1Teclado1Mouse1)

copia a referecircncia do objeto comp1 para o objeto comp2Computador comp2 = comp1

modifica o valor do monitorcomp2monitor = Modificadoimprime os dois computadorescomp1imprime()comp2imprime()

Veja o resultado

Veja que inicialmente o nome do monitor de comp1 era Monitor1 Mesmo tendo modificado apenas um dos objetos (o comp2) o comp1 tambeacutem foi modificado provando que na verdade os dois objetos referenciam o mesmo endereccedilo na memoacuteria

13

EXERCIacuteCIO

O aluno deveraacute desenvolver a classe funcionario que tem a seguinte especificaccedilatildeo

ATRIBUTOS Matricula int nome endereco string peso altura float sexo char

MEacuteTODOS

funcionaacuterio() este eacute o meacutetodo construtor padratildeo(lembre-se que o meacutetodo construtor tem o mesmo nome da classe)Entradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprimir a mensagem ldquoConstrutor Padrao Chamado rdquo

funcionaacuterio(string msg) este eacute outro meacutetodo construtor sobrecarregadoEntradas mensagem vinda do mainSaiacutedas nenhumaFunccedilatildeo imprime a mensagem recebida

funcionaacuterio(int mat string nom string end float pes float alt char sex ) este eacute outro meacutetodo construtor sobrecarregadoEntradas dados vindos do mainSaiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

atualizaDados(int mat string nom string end float pes float alt char sex) Entradas dados vindos do main

Saiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

imprimeDadosEntradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprime todos os dados do funcionario

Agora estaacute na hora de usar a classe Usando meacutetodos da classe funcionario definida acima e criada por vocecirc crie uma aplicaccedilatildeo que faccedila o seguinte na ordem dada

1 Instancie trecircs objeto da classe funcionaacuterio

objJoaoutilize o construtor padratildeo

objPedroutilize o segundo construtor e passe a mensagem

ldquoSegundo construtor obrecarregado chamado rdquo

objMaria chame o terceiro construtor e passe os seguintes dados

matricula 2341 nome ldquoMaria da Silvardquo endereccedilo Rua das Flores 34 peso 676 altura 176 sexo lsquoFrsquo

2 Imprima os dados do objeto objMaria

3 Atualize os dados do objJoao com

14

matricula 6784 nome ldquoJoao Marquesrdquo endereccedilo Rua das Acacias 45 peso 896 altura 190 sexo lsquoMrsquo

4 Atualize os dados do objPedro com

matricula 4523 nome ldquoPedro Villarrdquo endereccedilo Rua Torta 33 peso 789 altura 176 sexo lsquoMrsquo

5 Imprima os dados dos objetos objJoao e objPedro

17 HERANCcedilA

Heranccedila eacute um dos trecircs princiacutepios fundamentais da programaccedilatildeo orientada a objetos porque ela permite a criaccedilatildeo de hierarquia nos objetos que compotildeem o sistema Em C uma classe que tem seus dados e meacutetodos herdados por outra eacute chamada de classe base ou super classe e a classe que herda tais dados eacute chamada de classe derivada ou sub-classe

O que um aluno um professor e um funcionaacuterio possuem em comum Todos eles satildeo pessoas e portanto compartilham alguns dados comuns Todos tecircm nome idade endereccedilo etc E o que diferencia um aluno de outra pessoa qualquer Um aluno possui uma matriacutecula Um funcionaacuterio possui um coacutedigo de funcionaacuterio data de admissatildeo salaacuterio etc Um professor possui um coacutedigo de professor e informaccedilotildees relacionadas agrave sua formaccedilatildeo

Eacute aqui que a heranccedila se torna uma ferramenta de grande utilidade Podemos criar uma classe Pessoa que possui todos os atributos e meacutetodos comuns a todas as pessoas e herdar estes atributos e meacutetodos em classes mais especiacuteficas ou seja a heranccedila parte do geral para o mais especiacutefico Comece criando uma classe Pessoa como mostrado no coacutedigo a seguir

class Pessoa public string nome public int idade

Esta classe possui as propriedades nome e idade Estas propriedades satildeo comuns a todas as pessoas Veja agora como podemos criar uma classe Aluno que herda estas propriedades da classe Pessoa e inclui suas proacuteprias propriedades a saber seu nuacutemero de matriacutecula Eis o coacutedigo

class Aluno Pessoa public string matricula

Observe que em C os dois-pontos satildeo usados para indicar a heranccedila A classe Aluno agora possui trecircs atributos nome idade e matricula Veja um aplicativo demonstrando este relacionamento

static void Main(string[] args) cria um objeto da classe Aluno Aluno aluno = new Aluno()

alunonome = Osmar J Silva

As propriedades nome e idade foram herdadas da classe Pessoa pela classe Aluno

15

alunoidade = 36 alunomatricula = AC33-65

Exibe o resultado ConsoleWriteLine(Nome + alunonome + n + Idade + alunoidade + n + Matriacutecula + alunomatricula)

ConsoleWriteLine(nnPressione uma tecla para sair) ConsoleReadKey()

A heranccedila nos fornece um grande benefiacutecio Ao concentrarmos caracteriacutesticas comuns em uma classe e derivar as classes mais especiacuteficas a partir desta noacutes estamos preparados para a adiccedilatildeo de novas funcionalidades ao sistema Se mais adiante uma nova propriedade comum tiver que ser adicionada natildeo precisaremos efetuar alteraccedilotildees em todas as classes Basta alterar a superclasse e pronto As classes derivadas seratildeo automaticamente atualizadas

16

1048576

EXEMPLO DE COacuteDIGO CONSTRUINDO UMA CLASSE

Suponha que queiramos escrever um programa que manipula datas (minuto hora dia mecircs ano) Ao inveacutes de cinco variaacuteveis isoladas poderiacuteamos colocar estes dados em uma estrutura uacutenica englobando a data completa Assim poderiacuteamos declarar uma variaacutevel do tipo struct da seguinte maneira

struct Tempo int anoint mesint diaint horaint minuto

Ok ateacute aqui nada de novo (certo) Soacute declaramos uma estrutura em C padratildeo que conteacutem 5 variaacuteveis ano mecircs dia hora e minuto Agora imagine que aleacutem dessas variaacuteveis a estrutura Tempo pudesse tambeacutem ter embutida (encapsulada) funccedilotildees em C ou C Por exemplo uma funccedilatildeo que mostra a data na tela Esta estrutura seria mais ldquopoderosardquo pois os dados poderiam ser manipulados de dentro da proacutepria estrutura atraveacutes da sua funccedilatildeo interna Essa estrutura mais versaacutetil que conteacutem declaraccedilotildees de variaacuteveis e funccedilotildees constitui-se em uma classe como vimos anteriormente As variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos Assim poderiacuteamos reescrever nossa estrutura Tempo como uma classe cTempo

public class cTempo

public int ano variavel publica da classepublic int mes variavel publica da classepublic int dia variavel publica da classepublic int hora variavel publica da classepublic int minuto variavel publica da classe public void mostra_data() meacutetodo publico da classe

ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

Ok estamos prontos agora para usar nossa classe CTempo Como Temos que observar duas coisas

1 Natildeo trabalhamos com a classe CTempo Temos que instanciar um objeto da classe CTempo e trabalhar com este objeto

2 Abaixo temos a declaraccedilatildeo (instanciaccedilatildeo) do objeto e um pequeno programa em C

17

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos satildeo acessiacuteveis pelo main desde que sejam publicos public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto) Programa Principal static void Main(string[] args)

instanciando o objeto aniversario da classe cTempo cTempo aniversario = new cTempo() ConsoleWriteLine(Exemplo de POO em Cn)

para acessar metodos faccedila nome_objetonome_metodo

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data Para acessar atributos publicos faccedila nome_objetonome_atributo

aniversariodia = 9 aniversariomes = 2 aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23 ConsoleWriteLine(Nova datan) aniversariomostra_data() ConsoleReadKey()

A saiacuteda do programa seraacute

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 13: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

13

EXERCIacuteCIO

O aluno deveraacute desenvolver a classe funcionario que tem a seguinte especificaccedilatildeo

ATRIBUTOS Matricula int nome endereco string peso altura float sexo char

MEacuteTODOS

funcionaacuterio() este eacute o meacutetodo construtor padratildeo(lembre-se que o meacutetodo construtor tem o mesmo nome da classe)Entradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprimir a mensagem ldquoConstrutor Padrao Chamado rdquo

funcionaacuterio(string msg) este eacute outro meacutetodo construtor sobrecarregadoEntradas mensagem vinda do mainSaiacutedas nenhumaFunccedilatildeo imprime a mensagem recebida

funcionaacuterio(int mat string nom string end float pes float alt char sex ) este eacute outro meacutetodo construtor sobrecarregadoEntradas dados vindos do mainSaiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

atualizaDados(int mat string nom string end float pes float alt char sex) Entradas dados vindos do main

Saiacutedas nenhumaFunccedilatildeo atualiza os dados do objeto funcionaacuterio de acordo com os dados vindos do main

imprimeDadosEntradas nenhumaSaiacutedas nenhumaFunccedilatildeo imprime todos os dados do funcionario

Agora estaacute na hora de usar a classe Usando meacutetodos da classe funcionario definida acima e criada por vocecirc crie uma aplicaccedilatildeo que faccedila o seguinte na ordem dada

1 Instancie trecircs objeto da classe funcionaacuterio

objJoaoutilize o construtor padratildeo

objPedroutilize o segundo construtor e passe a mensagem

ldquoSegundo construtor obrecarregado chamado rdquo

objMaria chame o terceiro construtor e passe os seguintes dados

matricula 2341 nome ldquoMaria da Silvardquo endereccedilo Rua das Flores 34 peso 676 altura 176 sexo lsquoFrsquo

2 Imprima os dados do objeto objMaria

3 Atualize os dados do objJoao com

14

matricula 6784 nome ldquoJoao Marquesrdquo endereccedilo Rua das Acacias 45 peso 896 altura 190 sexo lsquoMrsquo

4 Atualize os dados do objPedro com

matricula 4523 nome ldquoPedro Villarrdquo endereccedilo Rua Torta 33 peso 789 altura 176 sexo lsquoMrsquo

5 Imprima os dados dos objetos objJoao e objPedro

17 HERANCcedilA

Heranccedila eacute um dos trecircs princiacutepios fundamentais da programaccedilatildeo orientada a objetos porque ela permite a criaccedilatildeo de hierarquia nos objetos que compotildeem o sistema Em C uma classe que tem seus dados e meacutetodos herdados por outra eacute chamada de classe base ou super classe e a classe que herda tais dados eacute chamada de classe derivada ou sub-classe

O que um aluno um professor e um funcionaacuterio possuem em comum Todos eles satildeo pessoas e portanto compartilham alguns dados comuns Todos tecircm nome idade endereccedilo etc E o que diferencia um aluno de outra pessoa qualquer Um aluno possui uma matriacutecula Um funcionaacuterio possui um coacutedigo de funcionaacuterio data de admissatildeo salaacuterio etc Um professor possui um coacutedigo de professor e informaccedilotildees relacionadas agrave sua formaccedilatildeo

Eacute aqui que a heranccedila se torna uma ferramenta de grande utilidade Podemos criar uma classe Pessoa que possui todos os atributos e meacutetodos comuns a todas as pessoas e herdar estes atributos e meacutetodos em classes mais especiacuteficas ou seja a heranccedila parte do geral para o mais especiacutefico Comece criando uma classe Pessoa como mostrado no coacutedigo a seguir

class Pessoa public string nome public int idade

Esta classe possui as propriedades nome e idade Estas propriedades satildeo comuns a todas as pessoas Veja agora como podemos criar uma classe Aluno que herda estas propriedades da classe Pessoa e inclui suas proacuteprias propriedades a saber seu nuacutemero de matriacutecula Eis o coacutedigo

class Aluno Pessoa public string matricula

Observe que em C os dois-pontos satildeo usados para indicar a heranccedila A classe Aluno agora possui trecircs atributos nome idade e matricula Veja um aplicativo demonstrando este relacionamento

static void Main(string[] args) cria um objeto da classe Aluno Aluno aluno = new Aluno()

alunonome = Osmar J Silva

As propriedades nome e idade foram herdadas da classe Pessoa pela classe Aluno

15

alunoidade = 36 alunomatricula = AC33-65

Exibe o resultado ConsoleWriteLine(Nome + alunonome + n + Idade + alunoidade + n + Matriacutecula + alunomatricula)

ConsoleWriteLine(nnPressione uma tecla para sair) ConsoleReadKey()

A heranccedila nos fornece um grande benefiacutecio Ao concentrarmos caracteriacutesticas comuns em uma classe e derivar as classes mais especiacuteficas a partir desta noacutes estamos preparados para a adiccedilatildeo de novas funcionalidades ao sistema Se mais adiante uma nova propriedade comum tiver que ser adicionada natildeo precisaremos efetuar alteraccedilotildees em todas as classes Basta alterar a superclasse e pronto As classes derivadas seratildeo automaticamente atualizadas

16

1048576

EXEMPLO DE COacuteDIGO CONSTRUINDO UMA CLASSE

Suponha que queiramos escrever um programa que manipula datas (minuto hora dia mecircs ano) Ao inveacutes de cinco variaacuteveis isoladas poderiacuteamos colocar estes dados em uma estrutura uacutenica englobando a data completa Assim poderiacuteamos declarar uma variaacutevel do tipo struct da seguinte maneira

struct Tempo int anoint mesint diaint horaint minuto

Ok ateacute aqui nada de novo (certo) Soacute declaramos uma estrutura em C padratildeo que conteacutem 5 variaacuteveis ano mecircs dia hora e minuto Agora imagine que aleacutem dessas variaacuteveis a estrutura Tempo pudesse tambeacutem ter embutida (encapsulada) funccedilotildees em C ou C Por exemplo uma funccedilatildeo que mostra a data na tela Esta estrutura seria mais ldquopoderosardquo pois os dados poderiam ser manipulados de dentro da proacutepria estrutura atraveacutes da sua funccedilatildeo interna Essa estrutura mais versaacutetil que conteacutem declaraccedilotildees de variaacuteveis e funccedilotildees constitui-se em uma classe como vimos anteriormente As variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos Assim poderiacuteamos reescrever nossa estrutura Tempo como uma classe cTempo

public class cTempo

public int ano variavel publica da classepublic int mes variavel publica da classepublic int dia variavel publica da classepublic int hora variavel publica da classepublic int minuto variavel publica da classe public void mostra_data() meacutetodo publico da classe

ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

Ok estamos prontos agora para usar nossa classe CTempo Como Temos que observar duas coisas

1 Natildeo trabalhamos com a classe CTempo Temos que instanciar um objeto da classe CTempo e trabalhar com este objeto

2 Abaixo temos a declaraccedilatildeo (instanciaccedilatildeo) do objeto e um pequeno programa em C

17

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos satildeo acessiacuteveis pelo main desde que sejam publicos public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto) Programa Principal static void Main(string[] args)

instanciando o objeto aniversario da classe cTempo cTempo aniversario = new cTempo() ConsoleWriteLine(Exemplo de POO em Cn)

para acessar metodos faccedila nome_objetonome_metodo

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data Para acessar atributos publicos faccedila nome_objetonome_atributo

aniversariodia = 9 aniversariomes = 2 aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23 ConsoleWriteLine(Nova datan) aniversariomostra_data() ConsoleReadKey()

A saiacuteda do programa seraacute

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 14: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

14

matricula 6784 nome ldquoJoao Marquesrdquo endereccedilo Rua das Acacias 45 peso 896 altura 190 sexo lsquoMrsquo

4 Atualize os dados do objPedro com

matricula 4523 nome ldquoPedro Villarrdquo endereccedilo Rua Torta 33 peso 789 altura 176 sexo lsquoMrsquo

5 Imprima os dados dos objetos objJoao e objPedro

17 HERANCcedilA

Heranccedila eacute um dos trecircs princiacutepios fundamentais da programaccedilatildeo orientada a objetos porque ela permite a criaccedilatildeo de hierarquia nos objetos que compotildeem o sistema Em C uma classe que tem seus dados e meacutetodos herdados por outra eacute chamada de classe base ou super classe e a classe que herda tais dados eacute chamada de classe derivada ou sub-classe

O que um aluno um professor e um funcionaacuterio possuem em comum Todos eles satildeo pessoas e portanto compartilham alguns dados comuns Todos tecircm nome idade endereccedilo etc E o que diferencia um aluno de outra pessoa qualquer Um aluno possui uma matriacutecula Um funcionaacuterio possui um coacutedigo de funcionaacuterio data de admissatildeo salaacuterio etc Um professor possui um coacutedigo de professor e informaccedilotildees relacionadas agrave sua formaccedilatildeo

Eacute aqui que a heranccedila se torna uma ferramenta de grande utilidade Podemos criar uma classe Pessoa que possui todos os atributos e meacutetodos comuns a todas as pessoas e herdar estes atributos e meacutetodos em classes mais especiacuteficas ou seja a heranccedila parte do geral para o mais especiacutefico Comece criando uma classe Pessoa como mostrado no coacutedigo a seguir

class Pessoa public string nome public int idade

Esta classe possui as propriedades nome e idade Estas propriedades satildeo comuns a todas as pessoas Veja agora como podemos criar uma classe Aluno que herda estas propriedades da classe Pessoa e inclui suas proacuteprias propriedades a saber seu nuacutemero de matriacutecula Eis o coacutedigo

class Aluno Pessoa public string matricula

Observe que em C os dois-pontos satildeo usados para indicar a heranccedila A classe Aluno agora possui trecircs atributos nome idade e matricula Veja um aplicativo demonstrando este relacionamento

static void Main(string[] args) cria um objeto da classe Aluno Aluno aluno = new Aluno()

alunonome = Osmar J Silva

As propriedades nome e idade foram herdadas da classe Pessoa pela classe Aluno

15

alunoidade = 36 alunomatricula = AC33-65

Exibe o resultado ConsoleWriteLine(Nome + alunonome + n + Idade + alunoidade + n + Matriacutecula + alunomatricula)

ConsoleWriteLine(nnPressione uma tecla para sair) ConsoleReadKey()

A heranccedila nos fornece um grande benefiacutecio Ao concentrarmos caracteriacutesticas comuns em uma classe e derivar as classes mais especiacuteficas a partir desta noacutes estamos preparados para a adiccedilatildeo de novas funcionalidades ao sistema Se mais adiante uma nova propriedade comum tiver que ser adicionada natildeo precisaremos efetuar alteraccedilotildees em todas as classes Basta alterar a superclasse e pronto As classes derivadas seratildeo automaticamente atualizadas

16

1048576

EXEMPLO DE COacuteDIGO CONSTRUINDO UMA CLASSE

Suponha que queiramos escrever um programa que manipula datas (minuto hora dia mecircs ano) Ao inveacutes de cinco variaacuteveis isoladas poderiacuteamos colocar estes dados em uma estrutura uacutenica englobando a data completa Assim poderiacuteamos declarar uma variaacutevel do tipo struct da seguinte maneira

struct Tempo int anoint mesint diaint horaint minuto

Ok ateacute aqui nada de novo (certo) Soacute declaramos uma estrutura em C padratildeo que conteacutem 5 variaacuteveis ano mecircs dia hora e minuto Agora imagine que aleacutem dessas variaacuteveis a estrutura Tempo pudesse tambeacutem ter embutida (encapsulada) funccedilotildees em C ou C Por exemplo uma funccedilatildeo que mostra a data na tela Esta estrutura seria mais ldquopoderosardquo pois os dados poderiam ser manipulados de dentro da proacutepria estrutura atraveacutes da sua funccedilatildeo interna Essa estrutura mais versaacutetil que conteacutem declaraccedilotildees de variaacuteveis e funccedilotildees constitui-se em uma classe como vimos anteriormente As variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos Assim poderiacuteamos reescrever nossa estrutura Tempo como uma classe cTempo

public class cTempo

public int ano variavel publica da classepublic int mes variavel publica da classepublic int dia variavel publica da classepublic int hora variavel publica da classepublic int minuto variavel publica da classe public void mostra_data() meacutetodo publico da classe

ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

Ok estamos prontos agora para usar nossa classe CTempo Como Temos que observar duas coisas

1 Natildeo trabalhamos com a classe CTempo Temos que instanciar um objeto da classe CTempo e trabalhar com este objeto

2 Abaixo temos a declaraccedilatildeo (instanciaccedilatildeo) do objeto e um pequeno programa em C

17

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos satildeo acessiacuteveis pelo main desde que sejam publicos public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto) Programa Principal static void Main(string[] args)

instanciando o objeto aniversario da classe cTempo cTempo aniversario = new cTempo() ConsoleWriteLine(Exemplo de POO em Cn)

para acessar metodos faccedila nome_objetonome_metodo

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data Para acessar atributos publicos faccedila nome_objetonome_atributo

aniversariodia = 9 aniversariomes = 2 aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23 ConsoleWriteLine(Nova datan) aniversariomostra_data() ConsoleReadKey()

A saiacuteda do programa seraacute

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 15: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

15

alunoidade = 36 alunomatricula = AC33-65

Exibe o resultado ConsoleWriteLine(Nome + alunonome + n + Idade + alunoidade + n + Matriacutecula + alunomatricula)

ConsoleWriteLine(nnPressione uma tecla para sair) ConsoleReadKey()

A heranccedila nos fornece um grande benefiacutecio Ao concentrarmos caracteriacutesticas comuns em uma classe e derivar as classes mais especiacuteficas a partir desta noacutes estamos preparados para a adiccedilatildeo de novas funcionalidades ao sistema Se mais adiante uma nova propriedade comum tiver que ser adicionada natildeo precisaremos efetuar alteraccedilotildees em todas as classes Basta alterar a superclasse e pronto As classes derivadas seratildeo automaticamente atualizadas

16

1048576

EXEMPLO DE COacuteDIGO CONSTRUINDO UMA CLASSE

Suponha que queiramos escrever um programa que manipula datas (minuto hora dia mecircs ano) Ao inveacutes de cinco variaacuteveis isoladas poderiacuteamos colocar estes dados em uma estrutura uacutenica englobando a data completa Assim poderiacuteamos declarar uma variaacutevel do tipo struct da seguinte maneira

struct Tempo int anoint mesint diaint horaint minuto

Ok ateacute aqui nada de novo (certo) Soacute declaramos uma estrutura em C padratildeo que conteacutem 5 variaacuteveis ano mecircs dia hora e minuto Agora imagine que aleacutem dessas variaacuteveis a estrutura Tempo pudesse tambeacutem ter embutida (encapsulada) funccedilotildees em C ou C Por exemplo uma funccedilatildeo que mostra a data na tela Esta estrutura seria mais ldquopoderosardquo pois os dados poderiam ser manipulados de dentro da proacutepria estrutura atraveacutes da sua funccedilatildeo interna Essa estrutura mais versaacutetil que conteacutem declaraccedilotildees de variaacuteveis e funccedilotildees constitui-se em uma classe como vimos anteriormente As variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos Assim poderiacuteamos reescrever nossa estrutura Tempo como uma classe cTempo

public class cTempo

public int ano variavel publica da classepublic int mes variavel publica da classepublic int dia variavel publica da classepublic int hora variavel publica da classepublic int minuto variavel publica da classe public void mostra_data() meacutetodo publico da classe

ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

Ok estamos prontos agora para usar nossa classe CTempo Como Temos que observar duas coisas

1 Natildeo trabalhamos com a classe CTempo Temos que instanciar um objeto da classe CTempo e trabalhar com este objeto

2 Abaixo temos a declaraccedilatildeo (instanciaccedilatildeo) do objeto e um pequeno programa em C

17

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos satildeo acessiacuteveis pelo main desde que sejam publicos public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto) Programa Principal static void Main(string[] args)

instanciando o objeto aniversario da classe cTempo cTempo aniversario = new cTempo() ConsoleWriteLine(Exemplo de POO em Cn)

para acessar metodos faccedila nome_objetonome_metodo

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data Para acessar atributos publicos faccedila nome_objetonome_atributo

aniversariodia = 9 aniversariomes = 2 aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23 ConsoleWriteLine(Nova datan) aniversariomostra_data() ConsoleReadKey()

A saiacuteda do programa seraacute

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 16: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

16

1048576

EXEMPLO DE COacuteDIGO CONSTRUINDO UMA CLASSE

Suponha que queiramos escrever um programa que manipula datas (minuto hora dia mecircs ano) Ao inveacutes de cinco variaacuteveis isoladas poderiacuteamos colocar estes dados em uma estrutura uacutenica englobando a data completa Assim poderiacuteamos declarar uma variaacutevel do tipo struct da seguinte maneira

struct Tempo int anoint mesint diaint horaint minuto

Ok ateacute aqui nada de novo (certo) Soacute declaramos uma estrutura em C padratildeo que conteacutem 5 variaacuteveis ano mecircs dia hora e minuto Agora imagine que aleacutem dessas variaacuteveis a estrutura Tempo pudesse tambeacutem ter embutida (encapsulada) funccedilotildees em C ou C Por exemplo uma funccedilatildeo que mostra a data na tela Esta estrutura seria mais ldquopoderosardquo pois os dados poderiam ser manipulados de dentro da proacutepria estrutura atraveacutes da sua funccedilatildeo interna Essa estrutura mais versaacutetil que conteacutem declaraccedilotildees de variaacuteveis e funccedilotildees constitui-se em uma classe como vimos anteriormente As variaacuteveis satildeo chamadas de atributos e as funccedilotildees de meacutetodos Assim poderiacuteamos reescrever nossa estrutura Tempo como uma classe cTempo

public class cTempo

public int ano variavel publica da classepublic int mes variavel publica da classepublic int dia variavel publica da classepublic int hora variavel publica da classepublic int minuto variavel publica da classe public void mostra_data() meacutetodo publico da classe

ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

Ok estamos prontos agora para usar nossa classe CTempo Como Temos que observar duas coisas

1 Natildeo trabalhamos com a classe CTempo Temos que instanciar um objeto da classe CTempo e trabalhar com este objeto

2 Abaixo temos a declaraccedilatildeo (instanciaccedilatildeo) do objeto e um pequeno programa em C

17

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos satildeo acessiacuteveis pelo main desde que sejam publicos public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto) Programa Principal static void Main(string[] args)

instanciando o objeto aniversario da classe cTempo cTempo aniversario = new cTempo() ConsoleWriteLine(Exemplo de POO em Cn)

para acessar metodos faccedila nome_objetonome_metodo

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data Para acessar atributos publicos faccedila nome_objetonome_atributo

aniversariodia = 9 aniversariomes = 2 aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23 ConsoleWriteLine(Nova datan) aniversariomostra_data() ConsoleReadKey()

A saiacuteda do programa seraacute

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 17: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

17

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos satildeo acessiacuteveis pelo main desde que sejam publicos public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto) Programa Principal static void Main(string[] args)

instanciando o objeto aniversario da classe cTempo cTempo aniversario = new cTempo() ConsoleWriteLine(Exemplo de POO em Cn)

para acessar metodos faccedila nome_objetonome_metodo

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data Para acessar atributos publicos faccedila nome_objetonome_atributo

aniversariodia = 9 aniversariomes = 2 aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23 ConsoleWriteLine(Nova datan) aniversariomostra_data() ConsoleReadKey()

A saiacuteda do programa seraacute

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 18: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

18

Podemos tambeacutem especificar a privacidade dos atributos e meacutetodos atraveacutes dos identificadores public e private Todos os membros de uma classe ndash atributos e meacutetodos ndash satildeo por definiccedilatildeo privados ou seja podem ser acessados somente por meacutetodos da classe Membros puacuteblicos podem ser acessados por qualquer objeto da classe ou seja podem ser acessados do main

Como uma regra geral vocecirc deve manter os dados de uma classe privados Portanto vocecirc deve criar funccedilotildees puacuteblicas conhecidas como meacutetodos de acesso para acessar estes dados privados Meacutetodos de acesso satildeo as funccedilotildees membro que outras partes do seu programa chamam para acessar os atributos privados Meacutetodos de acesso permitem que vocecirc separe os detalhes de como o dado eacute armazenado dentro do objeto de como ele eacute usado (encapsulamento)

Podemos agora escrever um coacutedigo mais completo acrescentando meacutetodos agrave classe CTempo para retirar do objeto a data ou entatildeo para atualizaacute-la dentro do objeto Estes meacutetodos em geral satildeo chamados de meacutetodos de acesso Veja o esquema abaixo

Objeto

ATRIBUTOS

Meacutetodo de acessopara alterar o valor dos atributos

Meacutetodo de acesso para obter o valor dos atributos

main

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 19: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

19

Nosso programa ficaria entatildeo da seguinte maneira acrescentando os meacutetodos1 obtem_data2 atualiza_data

using Systemusing SystemCollectionsGenericusing SystemText

namespace Classe_Tempo class Program Classe para manipulacao do tempo public class cTempo atributos publicos satildeo acessiacuteveis pelo main public int ano = 2010 variavel membro public int mes = 1 variavel membro public int dia = 1 variavel membro public int hora = 12 variavel membro public int minuto = 0 variavel membro

mostra a data na tela public void mostra_data() funccedilatildeo membro ConsoleWriteLine(dia + + mes + + ano) ConsoleWriteLine(hora + + minuto)

retorna a data armazenada no objeto por referenciapublic void obtem_data(ref int d ref int m ref int a ref int h ref int min)

d = dia m = mes a = ano h = hora min = minuto

armazena uma data no objeto por valor public void atualiza_data(int d int m int a int h

int min) dia = d mes = m ano = a hora = h minuto = min

Programa Principal

static void Main(string[] args) cTempo aniversario = new cTempo()

int v1 = 0 v2 = 0 v3 = 0 v4 = 0 v5 = 0 ConsoleWriteLine(Exemplo de POO em Cn)

ConsoleWriteLine(Data inicial) aniversariomostra_data()

inicializando nova data aniversariodia = 9 aniversariomes = 2

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 20: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

20

aniversarioano = 2010 aniversariohora = 19 aniversariominuto = 23

ConsoleWriteLine(Nova datan) aniversariomostra_data()

retirando nova data no objeto (GET) ConsoleWriteLine(nRetirando a data armazenada no objeto) ConsoleWriteLine(atraves do metodo obtem_data) aniversarioobtem_data(ref v1 ref v2 ref v3 ref v4 ref v5)

ConsoleWriteLine(v1 + + v2 + + v3) ConsoleWriteLine(v4 + + v5)

inicializando nova data no objeto (SET) ConsoleWriteLine(nInicializando a data armazenada no

objeto com outra data atraves do metodo atualiza_data)

v1 = 24 v2 = 12 v3 = 2010 v4 = 23 v5 = 59

aniversarioatualiza_data(v1 v2 v3 v4 v5)

ConsoleWriteLine(Nova data atualizadan) aniversariomostra_data()

ConsoleReadKey()

A saiacuteda do programa ficaria assim

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 21: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

21

EXERCIacuteCIOS DE REVISAtildeO

Exerciacutecio 1 ndash Defina POO Heranccedila Encapsulamento e Polimorfismo

Exerciacutecio 2 ndash Defina Classes Objetos Meacutetodos e Atributos

Exerciacutecio 3 ndash No caso especiacutefico da linguagem C a sintaxe para acessar um atributo utiliza qual operador

Exerciacutecio 4 ndash Como podemos criar uma referecircncia para um objeto em C Decirc um exemplo

Exerciacutecio 4 ndash Explique os modificadores de acesso public protected e private

Exerciacutecio 5 ndash Defina meacutetodo Construtor Qual o nome que um Construtor deve ter

Exerciacutecio 6 ndash Explique o que eacute sobrecarga de meacutetodos

Exerciacutecio 7 ndash Comente o coacutedigo abaixo linha por linha

class Cliente public string nome public int codigo

class TestaCliente static void Main () Cliente c1 = new Cliente() c1nome = Rafael Cosentino c1codigo = 1

Cliente c2 = new Cliente() c2nome = Jonas Hirata c2codigo = 2

SystemConsoleWriteLine(c1nome ) SystemConsoleWriteLine(c1codigo )

SystemConsoleWriteLine(c2nome ) SystemConsoleWriteLine(c2codigo )

Exerciacutecio 8 ndash Seguindo o modelo de coacutedigo do exerciacutecio 7 crie uma classe cartaoDeCredito com os segintes atributos puacuteblicos

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito que conteacutem o meacutetodo principal (main) Instancie dois objetos conforme abaixo

Objeto cdc1 numero = 111111 dataDeValidade = 01012013

Objeto cdc2 numero = 222222 dataDeValidade = 01012014

Imprima o nuacutemero e a data de validade de cada cartatildeo

EXERCIacuteCIOS COMPLEMENTARES

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 22: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

22

1 Implemente uma classe chamada Aluno para definir os objetos que representaratildeo os alunos de uma escola Essa classe deve declarar trecircs atributos o primeiro para o nome o segundo para o RG e o terceiro para a data de nascimento dos alunos

2 Faccedila uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles A classe tambeacutem deve mostrar na tela as informaccedilotildees desses objetos

3 Em uma escola aleacutem dos alunos temos os funcionaacuterios que tambeacutem precisam ser representados em nossa aplicaccedilatildeo Entatildeo implemente outra classe chamada Funcionario que contenha dois atributos o primeiro para o nome e o segundo para o cargo dos funcionaacuterios

4 Faccedila uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles Mostre na tela as informaccedilotildees desses objetos

5 Em uma escola os alunos precisam ser divididos por turmas que devem ser representadas dentro da aplicaccedilatildeo Implemente uma classe chamada Turma que contenha quatro atributos o primeiro para o periacuteodo o segundo para definir a seacuterie o terceiro para sigla e o quarto para o tipo de ensino

6 Faccedila uma classe chamada TestaTurma para criar dois objetos da classe Turma Adicione informaccedilotildees a eles e depois mostre essas informaccedilotildees na tela

TRABALHO EM GRUPO DE 4 ALUNOSENTREGA NO DIA DA PROVA1O QUE DEVE SER ENTREGUE ARQUIVO(S)FONTE ARQUIVO EXECUTAacuteVEL (NO SGA)VALOR 5 PONTOS

1 Em relaccedilatildeo agrave classe cTempo dada em sala de aula faccedilaMude o status dos atributos para privateAcrescente o atributo privado segundoCrie uma classe derivada da classe cTempo chamada cTrataDatas Nesta nova classe faccedila

11 Crie o meacutetodo puacuteblico verifica_hora Funccedilatildeo Este meacutetodo recebe uma hora completa (inclusive os segundos) e faz a consistecircncia da hora ou seja se a hora estaacute entre 0-23 e se o minuto e segundo estatildeo entre 0-59

Entrada hora minuto e segundoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

12 Crie o meacutetodo puacuteblico verifica_data Funccedilatildeo Este meacutetodo recebe uma data completa (dia mecircs e ano) e faz a consistecircncia da data ou seja se o dia estaacute entre 0-31 se o mecircs estaacute entre 0-12 e se o ano estaacute entre 1970-2099 Natildeo precisa verificar se eacute ano bissexto

Entrada dia mecircs e anoSaiacuteda true se a data for vaacutelida false se a data for invaacutelida

13 Crie o meacutetodo puacuteblico compara_horas Funccedilatildeo Este meacutetodo recebe duas horas completas e verifica se a primeira eacute maior menor ou igual a segundaEntrada hora1 minuto1 segundo1e hora2 minuto2 segundo2Saiacutedas 1 se hora1 gt hora2

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 23: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

23

-1 se hora1 lt hora2 0 se hora1 = hora2

14 Crie o meacutetodo puacuteblico imprime_horaFunccedilatildeo Este meacutetodo recebe uma unidade de tempo em segundos (valor maacuteximo que poderaacute ser recebido 86399) e determina o tempo em horas minutos e segundos A seguir o meacutetodo imprime a hora no formato padratildeo e no formato americanoEntrada tempo (em segundos)Saiacuteda true se a hora fornecida eacute vaacutelida (lt 86399) False se a hora fornecida eacute invaacutelida (gt 86399)

Exemplos Entrada 72300Impressatildeo 20 horas 05 minutos 00 segundos 8 horas PM 05 minutos 00 segundos Entrada 21015Impressatildeo 05 horas 50 minutos 15 segundos 05 horas AM 50 minutos 15 segundos Entrada 10000Impressatildeo hora invaacutelidaEntrada 43285Impressatildeo 12 horas 01 minutos 26 segundos 12 horas PM 01 minutos 26 segundos Entrada 3285Impressatildeo 00 horas 54 minutos 45 segundos 12 horas AM 54 minutos 45 segundos DicaNo formato americano tem-se de 0 ndash 1159 da manhatilde seraacute sempre AM (ante meridium ndash antes do meio dia) e de 1200 ndash 2359 seraacute sempre PM (post-meridium ndash depois do meio dia) Portanto se o valor das horas for maior que 12 obtenha o resto das horas por 12 e imprima este valor com PM em seguida caso contraacuterio imprima as horas e AM

2 Crie um programa main para testar a nova classe cTempo e a nova classe cTrataDatas Os objetos abaixo devem ser criados no mesmo programa principal (main)21 Crie um objeto da classe cTempo chamado tempo_1 Atualize a data com a data de hoje Mostre a

data22 Crie um objeto da classe cTrataDatas chamado hora_1 Este objeto receberaacute trecircs valores de horas

conforme abaixo e deveraacute ser verificado se as horas estatildeo corretasHora 1 132465

Hora 2 170712 Hora 3 246015

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_hora e da seguinte forma

ldquoA hora 1 estaacute certaerradardquoldquoA hora 2 estaacute certacorretardquoldquoA hora 3 estaacute certaerradardquo

23 Crie um objeto da classe cTrataDatas chamado data_1 Este objeto receberaacute trecircs valores de datas conforme abaixo e deveraacute ser verificado se as datas estatildeo corretasData 1 3006-2000

Data 2 23152012 Data 3 17072012

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 24: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

24

O resultado deve ser mostrado somente no main de acordo com o retorno do meacutetodo verifica_data e da seguinte forma

ldquoA data 1 estaacute certaerradardquoldquoA data 2 estaacute certacorretardquoldquoA data 3 estaacute certaerradardquo

24 Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os meacutetodos da classe Este objeto deveraacute

241 Receber a data 16132100 e verificar se estaacute correta242 Receber a hora 174554 e verificar se estaacute correta243 Receber as horas hora1 231545 e hora2 121734 e imprimir se satildeo iguais se hora1 e maior

que a hora2 ou se a hora2 eacute maior que a hora1 de acordo com o meacutetodo compara_horas244 Receber as unidades de tempo em segundos do item 14 e imprimir os valores corretos no

formato padratildeo e no formato americano conforme os exemplos do item 1425 O que deveraacute ser entregue Os aquivos cs exe do programa e um arquivo com telas de impressatildeo

de todos os resultados

3 Arquivos de grupos diferentes idecircnticos ou parcialmente idecircnticos seratildeo anulados

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 25: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

25

2 TIPO ABSTRATO DE DADOS

21 LISTAS LINEARES

Uma das formas mais simples de interligar os elementos de um conjunto Estruturas em que as operaccedilotildees inserir retirar e localizar satildeo definidas para qualquer posiccedilatildeo Podem crescer ou diminuir de tamanho durante a execuccedilatildeo de um programa de acordo com a demanda Duas listas podem ser concatenadas para formar uma lista uacutenica ou uma pode ser partida em duas ou

mais listas Adequadas quando natildeo eacute possiacutevel prever a demanda por memoacuteria permitindo a manipulaccedilatildeo de

quantidades imprevisiacuteveis de dados de formato tambeacutem imprevisiacutevel

Uma lista eacute uma sequumlecircncia de 0 ou mais itens x1 x2 xn onde

o xi eacute de um determinado tipoo n representa o tamanho da lista linear

Exemplos Agenda telefocircnica Lista de alunos Relaccedilatildeo de peccedilas de um carro Lista de passageiros de um vocirco Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados

Eacute o conjunto de operaccedilotildees a ser definido e depende de cada aplicaccedilatildeo Um conjunto de operaccedilotildees necessaacuterio a maioria das aplicaccedilotildees eacute

Criar uma lista linear vazia Inserir um novo item imediatamente apoacutes o i-eacutesimo item Retirar o i-eacutesimo item Localizar o i-eacutesimo item para examinar eou alterar o conteuacutedo de seus componentes Combinar duas ou mais listas lineares em uma lista uacutenica Partir uma lista linear em duas ou mais listas Fazer uma coacutepia da lista linear Ordenar os itens da lista em ordem ascendente ou descendente de acordo com alguns de seus

componentes Pesquisar a ocorrecircncia de um item com um valor particular em algum componente

Vaacuterias estruturas de dados podem ser usadas para representar listas lineares cada uma comvantagens e desvantagens particulares _ As duas representaccedilotildees mais utilizadas satildeo as implementaccedilotildees por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memoacuteria)

Exemplo de Conjunto de Operaccedilotildees criaLista() cria uma lista vazia insere(x) insere x apoacutes o uacuteltimo item da lista retira(x) remove o item x da lista vazia() esta funccedilatildeo retorna true se a lista estaacute vazia e false caso contraacuterio imprime() imprime os itens da lista na ordem de ocorrecircncia

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 26: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

26

IMPLEMENTACcedilAtildeO DE LISTAS LINEARES

A lista eacute constituiacuteda de ceacutelulas Cada item da lista conteacutem a informaccedilatildeo que eacute necessaacuteria para alcanccedilar o proacuteximo item Permite utilizar posiccedilotildees natildeo contiacuteguas de memoacuteria Eacute possiacutevel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista Haacute uma ceacutelula cabeccedila para simplificar as operaccedilotildees sobre a lista Cada ceacutelula conteacutem um item da lista e uma referecircncia para a ceacutelula seguinte

LISTAS SEQUENCIAIS

Uma lista eacute sequumlencial se para cada componente da lista o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da lista

Pode ser implementada atraveacutes de vetores

o Desvantagens O tamanho maacuteximo da lista precisa ser conhecido e alocado antecipadamente Natildeo pode ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento

da lista Inserccedilotildees e remoccedilotildees podem exigir consideraacutevel movimentaccedilatildeo de dados

aumentando assim o custo dessas operaccedilotildees

o Vantagens Simplicidade na implementaccedilatildeo Economia de memoacuteria

LISTAS ENCADEADAS

Uma lista eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Uma lista encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo

apontador responsaacutevel em indicar o endereccedilo do registro seguinte da lista

Desvantagenso Complexidade na implementaccedilatildeo em relaccedilatildeo agrave lista sequumlencialo Utilizaccedilatildeo de memoacuteria extra para armazenar os apontadores

Vantagens

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 27: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

27

o O tamanho da lista natildeo precisa ser conhecido antecipadamente ou seja a lista encadeada deve ser utilizada em aplicaccedilotildees onde natildeo existe previsatildeo sobre o crescimento da lista

o Inserccedilotildees e remoccedilotildees ocorrem a um custo constante

Nodo Cabeccedila

Para criar a lista pode-se implementar com vetores ou ponteiros e entatildeo escrever todo o coacutedigo Uma outra alternativa eacute utilizar uma classe pronta

No C existe uma classe para criaccedilatildeo e manipulaccedilatildeo dos elementos de uma lista Eacute a classe List

22 COLECcedilOtildeES

Um das partes mais importantes do NET Framework satildeo coleccedilotildees que satildeo um grupo de objetos framework NET conteacutem um grande nuacutemero de coleccedilotildees Coleccedilotildees simplificam muito a tarefa de programaccedilatildeo pois implementam a maioria das estruturas utilizadas liberando o programador da tarefa aacuterdua de codificar todas as funcionalidades de uma coleccedilatildeo como a lista por exemplo Algumas coleccedilotildees disponiacuteveis na plataforma NET

List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As coleccedilotildees natildeo geneacutericas do C satildeo declaradas em SystemCollections Coleccedilotildees geneacutericas satildeo declaradas em SystemCollectionsGeneric Abaixo uma descriccedilatildeo dos meacutetodos gerais destas coleccedilotildees

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 28: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

28

A classe List eacute derivada destas coleccedilotildees e portanto herda os meacutetodos Aleacutem disso possui seus proacuteprios meacutetodos

23 O loop foreach

O loop foreach eacute usado para acessar os elementos de uma coleccedilatildeo (collection) do C Uma coleccedilatildeo eacute um grupo de objetos como por exemplo uma lista pilha ou fila C define vaacuterios tipos de coleccedilotildees das quais uma eacute um array (vetor) A forma geral do foreach eacute

foreach(type loopvar in collection) statement

O loop foreach trabalha da seguinte maneira quando o loop comeccedila o primeiro elemento da coleccedilatildeo eacute obtido e copiado em loopvar Cada iteraccedilatildeo subsequumlente obteacutem o proacuteximo elemento da coleccedilatildeo e armazena em loopvar O loop termina quando natildeo existem mais elementos para se obter Assim foreach percorre todo da coleccedilatildeo do iniacutecio ao fim

Um ponto importante eacute que a variaacutevel loopvar soacute pode ser lida Isto significa que vocecirc natildeo pode mudar os conteuacutedos da coleccedilatildeo usando o foreach

Aqui temos um exemplo simples que usa foreach Ele cria um vetor de inteiros com valores iniciais O foreach eacute usado para mostrar esses valores computando a soma dos elementos

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 29: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

29

using Systemclass ForeachDemo static void Main() int sum = 0 int[] nums = new int[10]

preenchendo o vetor nums for(int i = 0 i lt 10 i++) nums[i] = i

Usando foreach para mostrar e somar os valores de nums foreach(int x in nums) ConsoleWriteLine(Valor e + x) sum += x ConsoleWriteLine(Soma + sum) Saiacuteda do Programa Valor e 0Valor e 1Valor e 2Valor e 3Valor e 4Valor e 5Valor e 6Valor e 7Valor e 8Valor e 9Soma 45

O exemplo a seguir mostra o uso da classe List onde o loop foreach eacute usado

Demonstraccedilatildeo de ListltTgtusing Systemusing SystemCollectionsGeneric

class ListDemo static void Main() Cria uma lista de inteiros Listltintgt lst = new Listltintgt() ConsoleWriteLine(Numero inicial de elementos + lstCount) ConsoleWriteLine()

ConsoleWriteLine(Adicionando 5 elementos) lstAdd(1) lstAdd(-2) lstAdd(14) lstAdd(9) lstAdd(88) ConsoleWriteLine(Numero de elementos + lstCount)

Mostra a lista usando iacutendices ConsoleWrite(Conteudos ) for(int i=0 i lt lstCount i++) ConsoleWrite(lst[i] + ) ConsoleWriteLine(n)

ConsoleWriteLine(Removendo 2 elementos) lstRemove(-2) lstRemove(88) ConsoleWriteLine(Numero de elementos + lstCount)

Percorrendo a lista usando foreach ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + ) ConsoleWriteLine(n)

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 30: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

30

ConsoleWriteLine(Adicionando 10 elementos para forcar a lista a crescer) for(int i=0 i lt 10 i++) lstAdd(i)

ConsoleWriteLine(Numero de elementos apos adicionar 10 + lstCount)

ConsoleWrite(Conteudos )

foreach(int i in lst) para cada inteiro i na lista lst faccedila ConsoleWrite(i + )

ConsoleWriteLine(n) ConsoleWriteLine(Mudando os 3 primeiros elementos) lst[0] = -10 lst[1] = -lst[1] lst[2] = 99 ConsoleWrite(Conteudos ) foreach(int i in lst) ConsoleWrite(i + )

ConsoleWriteLine()

Saiacuteda

Numero inicial de elementos 0Adicionando 5 elementos Numero de elementos 5Conteudos 1 -2 14 9 88Removendo 2 elementos Numero de elementos 3Conteudos 1 14 9Adicionando 10 elementos para forcar a lista a crescerNumero de elementos apos adicionar 10 elementos 13Conteudos 1 14 9 0 1 2 3 4 5 6 7 8 9Mudando os 3 primeiros elementos Conteudos -10 -14 99 0 1 2 3 4 5 6 7 8 9

TAD LISTA ndash EXEMPLO USANDO ESTRUTURAS

Em C as estruturas (struct) satildeo mais versaacuteteis do que em outras versotildees do ldquoCrdquo Como sabemos classes satildeo tipos referecircncia diferente dos tipos valor que satildeo acessados diretamente Entretanto pode ser uacutetil algumas vezes acessar um objeto diretamente por valor do mesmo modo os tipos valor satildeo Uma razatildeo para isto eacute a eficiecircncia Acessar um objeto atraveacutes de referecircncia introduz uma sobrecarga em cada processo Aleacutem disso espaccedilo de memoacuteria eacute gasto Para cada pequeno objeto este espaccedilo extra pode ser significante Para evitar estes inconvenientes C oferece a struct Em C uma struct eacute semelhante a uma classe mas eacute um tipo valor ao inveacutes de um tipo referecircncia Estruturas satildeo declaradas usando a palavra reservada struct e satildeo sintaticamente semelhantes agraves classes

Estruturas natildeo podem herdar outras estruturas ou classes ou ser base para outras estruturas ou classes Como classes os membros de uma struct podem ser meacutetodos e propriedades Estruturas tambeacutem podem definir construtores mas natildeo destrutores Entretanto natildeo pode ser definido um construtor sem paracircmetros (default) para uma estrutura Isto ocorre porque o C define automaticamente um construtor default para todas as estruturas e este construtor default natildeo pode ser mudado

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 31: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

31

Um objeto do tipo struct pode ser criado usando new no mesmo modo que um objeto comum (do tipo class) Quando new eacute usado o construtor eacute chamado Quando new natildeo eacute usado o objeto eacute ainda criado mas natildeo eacute inicializado Assim qualquer inicializaccedilatildeo deveraacute ser feita manualmente Por exemplo

Entenda o coacutedigo abaixo

Demonstrando uma estruturausing System

Define uma structurastruct Conta public string nome public double saldo

public Conta(string n double b) nome = n saldo = b

Demonstrando o uso da estrutura Conta

class StructDemo static void Main() Conta acc1 = new Conta(Tom 123222) construtor explicito Conta acc2 = new Conta() construtor default Conta acc3 sem construtor ConsoleWriteLine(acc1nome + tem um saldo de + acc1saldo) ConsoleWriteLine() if(acc2nome == null) ConsoleWriteLine(acc2nome e nullo) ConsoleWriteLine(acc2saldo e + acc2saldo) ConsoleWriteLine() acc3 deve ser inicializado antes do uso acc3 = new Conta() acc3nome = Maria acc3saldo = 9933 ConsoleWriteLine(acc3nome + tem um saldo de + acc3saldo)

A saiacuteda do programa seraacute

Tom tem um saldo de 123222acc2nome e nullacc2saldo e 0Maria tem um saldo de 9933

Exerciacutecio 1 ndash Implementar em C o coacutedigo de um aplicativo que faccedila o seguinte1 Crie uma classe cTurma

2 Para guardar os dados de um aluno crie uma propriedade do tipo struct chamada aluno (struct aluno) com os seguintes campos matriacutecula curso CPF nome data do nascimento endereccedilo

3 Usando a Collection List crie uma lista de alunos Por exemplo se a lista se chamar lstAlunos teremos

Listltalunogt lstAlunos = new Listltalunogt()

4 Crie o atributo aln para guardar a estrutura aluno

aluno aln = new aluno()

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 32: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

32

5 Crie o meacutetodo cadastra cadastra um aluno e insere em lstAlunos6 Crie o meacutetodo imprime imprime todos os alunos de lstAlunos

No main a Usando a classe cTurma instancie um objeto chamado turmaAED e cadastre trecircs alunos

(quaisquer dados) na turmab Imprima todos os alunos do objeto turmaAEDc Apoacutes testar o coacutedigo acima crie o seguinte menu de opccedilotildees (ele seraacute a base para o trabalho

maior de laboratoacuterio)

MENU DE OPCOES [1] CADASTRA [2] IMPRIME [3] SAI Opcao

7 Teste o aplicativo inserindo um nuacutemero aleatoacuterio de alunos

SOLUCcedilAtildeO PROPOSTA

using Systemusing SystemCollectionsGenericusing SystemLinqusing SystemText

namespace ExemploListaDeObjetosStruct public class cTurma A T R I B U T O S

estrutura simples usada para guardar os dados de um aluno public struct aluno public int mat public string nome public double peso

lstAlunos eacute uma lista onde cada elemento eacute uma estrutura aluno Listltalunogt lstAlunos = new Listltalunogt()

aln eacute um atributo do tipo estrutura aluno usado para manipular os dados de um aluno Eacute uma variavel de uso geral para cadastrar imprimir etc

aluno aln = new aluno()

public void cadastra() ConsoleClear() ConsoleWriteLine(ntt - CADASTRO DE ALUNO -) ConsoleWrite(n Informe a matricula ) alnmat = intParse(ConsoleReadLine()) ConsoleWriteLine(n Informe o nome do passageiro ) alnnome = ConsoleReadLine() ConsoleWrite(n Informe o peso ) alnpeso = doubleParse(ConsoleReadLine())

ao final do cadastro insere na turma lstAlunosAdd(aln)

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 33: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

33

public void imprime() int i = 0 ConsoleClear() foreach (aluno al in lstAlunos) i++ ConsoleWriteLine(nnttALUNO [ + i + ]) ConsoleWrite(nttMATRICULA ) ConsoleWriteLine(almat) ConsoleWriteLine(ttNOME + alnome) ConsoleWriteLine(ttPESO + alpeso) fim classe cAluno

class Program static void Main(string[] args) cTurma turmaAED = new cTurma()

cadastrando trecircs alunos da turmaAED for(int i=0 ilt 3 i++) turmaAEDcadastra()

imprimindo a lista de alunos daturmaAED turmaAEDimprime()

ConsoleReadKey()

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 34: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

34

24 TADA FILA

Uma fila eacute um tipo especial de lista em que a operaccedilatildeo de inserccedilatildeo eacute feita em uma extremidade da estrutura (conhecida como fim da fila) e a operaccedilatildeo de remoccedilatildeo eacute feita na outra extremidade da estrutura (conhecida como iniacutecio da fila)

O modelo intuitivo eacute de uma fila de espera em que as pessoas no iniacutecio da fila satildeo servidas primeiro e as pessoas que chegam entram no fim da fila

PropriedadeO primeiro item inserido eacute o primeiro item a ser retirado da fila Assim as filas satildeo chamadas de Listas FIFO (ldquofirst in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma fila Cria Fila(fila) Vazia (fila) ver se uma determinada fila estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da fila Enfileira (x fila) insere um determinado item ldquoxrdquo em uma fila a inserccedilatildeo sempre eacute feita no fim da fila Desenfileira (fila x) retira o item do iniacutecio de uma fila o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho (fila) retorna a quantidade de itens uacuteteis de uma determinada fila Mostra() mostra (imprime) a fila

Filas SequumlenciaisUma fila eacute sequumlencial se para cada componente da fila o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da fila A implementaccedilatildeo mais comum eacute atraveacutes de vetores

Filas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma fila eacute encadeada se os seus itens estiverem em posiccedilotildees natildeo contiacuteguas de memoacuteria Assim uma fila encadeada eacute uma coleccedilatildeo de registros onde cada registro possui um item e um campo do tipo apontador responsaacutevel em indicar o endereccedilo do registro seguinte da fila

Nodo Cabeccedila

Em C para trabalharmos com filas usamos a classe embutida Queue QueueltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na fila (FIFO)Meacutetodos Principais

Para enfileirar objetos em uma fila Enqueue( ) Para desenfileirar objetos de uma fila Dequeue( ) Para retornar um objeto da fila sem remover Peek( )

Exemplo Uso da classe QueueltTgt para colocar elementos na fila

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 35: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

35

using Systemusing SystemCollectionsGenericclass QueueDemo static void Main() Queueltstringgt userQ = new Queueltstringgt() ConsoleWriteLine(ldquoColocando usuarios na filan)

userQEnqueue(Eric) userQEnqueue(Tom) userQEnqueue(Ralph) userQEnqueue(Ken) ConsoleWriteLine(ldquoRetirando os usuarios da fila (FIFO)n) while(userQCount gt 0)

ConsoleWriteLine(ldquoElemento + userQDequeue()) ConsoleWriteLine(A fila de usuarios esta vazia)

Saiacuteda do Programa Colocando usuarios na fila Retirando os usuarios da fila (FIFO) Elemento Eric Elemento Tom Elemento Ralph Elemento Ken A fila de usuarios esta vazia

25 TADA PILHA

Uma pilha eacute um tipo especial de lista em que as operaccedilotildees de inserccedilatildeo e remoccedilatildeo satildeo feitas apenas em uma uacutenica extremidade da estrutura conhecida como topo da pilha Os itens de uma pilha estatildeo colocados um sobre o outro com o item inserido mais recentemente no topo da pilha e o item inserido menos recentemente no fundo da pilha

PropriedadeO uacuteltimo item inserido eacute o primeiro item a ser retirado da pilha Assim as pilhas satildeo chamadas de Listas LIFO (ldquolast in first outrdquo)

Exemplos de operaccedilotildees baacutesicas e necessaacuterias sobre uma pilha Cria Pilha Vazia() verifica se uma determinada pilha estaacute ou natildeo vazia Retorna um valor loacutegico indicando o estado

da pilha Empilha(x) insere um determinado item ldquoxrdquo em uma pilha a inserccedilatildeo sempre eacute feita no topo da pilha Desempilha(x) retira o item que estaacute no topo de uma pilha o item retirado eacute retornado na variaacutevel ldquoxrdquo Tamanho() retorna a quantidade de itens uacuteteis de uma determinada pilha Mostra() mostra (imprime) a pilha

Pilhas SequumlenciaisUma pilha eacute sequumlencial se para cada componente da pilha o seu sucessor estiver armazenado na posiccedilatildeo fiacutesica seguinte da pilha A implementaccedilatildeo mais comum eacute atraveacutes de vetores

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 36: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

36

Pilhas Encadeadas (usando Alocaccedilatildeo Dinacircmica)Uma pilha utilizando alocaccedilatildeo dinacircmica utiliza ponteiros para encadear os elementos da pilha Desta forma os elementos natildeo precisam ficar em posiccedilotildees contiacuteguas de memoacuteria

Devemos notar que no topo natildeo empilhamos nenhum elemento O topo eacute utilizado somente para marcar o ldquofimrdquo da pilha e tambeacutem eacute chamado de nodo cabeccedila (head node)

O conceito de pilha pode ser utilizado em vaacuterias situaccedilotildees No processamento de estruturas aninhadas de profundidade imprevisiacutevel pois a ordem de remoccedilatildeo

da pilha garante que estruturas mais internas seratildeo processadas antes das estruturas mais externas Em editores de texto Para anaacutelise sintaacutetica de expressotildees aritimeacuteticas Para o controle de sequecircncia de chamadas de subrotinas (funcotildees) Pode ser associado agrave algoritmos recursivos

Em C para trabalharmos com pilhas usamos a classe embutida Stack StackltTipogt eacute uma coleccedilatildeo dinacircmica que cresce quando necessaacuterio para acomodar os elementos que devem ser armazenados na pilha (LIFO)Meacutetodos Principais

Para empilhar objetos em uma pilha push( ) Para desempilhar objetos de uma pilha pop( )

Exemplo Uso da classe StackltTgt para colocar elementos na pilhausing System using SystemCollections public class SamplesStack public static void Main() Stack myStack = new Stack() myStackPush(Hello) myStackPush(World) myStackPush() Mostra as propriedades e valores da pilha criada ConsoleWriteLine( myStack )

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 37: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

37

ConsoleWriteLine( tCount 0 myStackCount ) ConsoleWrite( tValores na pilha ) PrintValues( myStack ) public static void PrintValues( IEnumerable myCollection ) foreach ( Object obj in myCollection ) ConsoleWrite( 0 obj ) ConsoleWriteLine() Saiacuteda do programa myStack Count 3 Values World Hello

EXERCIacuteCIOS DE REVISAtildeO ndash LISTA FILA E PILHA

Exerciacutecio 1 ndash Qual a diferenccedila entre as listas sequumlenciais e as listas encadeadas

Exerciacutecio 2 ndash Qual a diferenccedila entre Pilhas Filas e Listas em relaccedilatildeo agrave inserccedilatildeo e remoccedilatildeo de elementos

Exerciacutecio 3 ndash Uma pilha implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 4 ndash Uma fila implementa o mecanismo de inserccedilatildeoremoccedilatildeoa) FIFOb) FIFAc) LIFOd) SIFOe) NDA

Exerciacutecio 5 ndash No meacutetodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nuacutemeros inteiros Faccedila tambeacutem as seguintes operaccedilotildees

a) Iinserir os nuacutemeros 10 20 30 40 50b) Imprimir todos os nuacutemeros da listac) Inserir o nuacutemero 14 no fim da listad) Ler um nuacutemero e inseri-lo no iniacutecio da listae) Ler um nuacutemero e procuraacute-lo na lista Se o nuacutemero estiver na lista imprima ldquoO nuacutemero procurado

estaacute na listardquo se natildeo estiver na lista imprimir ldquoO nuacutemero procurado natildeo estaacute na listardquo

Exerciacutecio 6 ndash Utilizando o objeto MyList do exerciacutecio 1 modifique o programa para se certificar que natildeo pode ser adicionado elementos iguais a algum elemento jaacute existente na lista

Exerciacutecio 7 ndash Implemente no meacutetodo main() de uma classe chamada TestaPilha um programa que leia 15 nuacutemeros e proceda para cada um deles como segue

se o nuacutemero for par insira-o na pilha se o nuacutemero lido for iacutempar retire um nuacutemero da pilha Ao final esvazie a pilha imprimindo os elementos

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 38: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

38

Exerciacutecio 8 ndash No meacutetodo main() de uma classe chamada TestaPilha2 dadas duas pilhas (objetos N e P) respectivamente ler diversos nuacutemeros e para cada um

se positivo inserir na pilha P se negativo inserir na pilha N se zero retirar um elemento de cada pilha

Exerciacutecio 9 ndash Duas pilhas sequumlenciais numeacutericas estatildeo ordenadas crescentemente a partir do topo Transferir os elementos dessas pilhas para uma terceira pilha inicialmente vazia de modo que ela fique ordenada decrescentemente com o maior valor no topo

Exerciacutecio 10 ndash O que seraacute impresso pelo programa abaixo

public static void main(String args[]) Queue q = new Queue() qenqueue(1) qenqueue(2) qenqueue(3) qenqueue(4) qenqueue(5) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) ConsoleWriteline(qdequeue()) qenqueue(6) qenqueue(7) qenqueue(8) qenqueue(9) qprint()Exerciacutecio 11 ndash Dado o estado inicial das pilhas p1 p2 e p3 na figura abaixo mostre (desenhe as pilhas) o estado final dessas mesmas pilhas apoacutes as operaccedilotildees descritas no coacutedigo abaixo Considere que p1 p2 e p3 sejam instacircncias da classe Stack (pilha com alocaccedilatildeo sequumlencial) Caso natildeo seja possiacutevel realizar alguma operaccedilatildeo escreva que natildeo foi possiacutevel e ignore-a

int temp = p1pop()p2push(temp)p3push(p1pop())p2push(p1pop())temp = p1pop()p3push(temp)p1push(p2pop())

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 39: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

39

p3push(p2pop())p3push(p1pop())

Exerciacutecio 12 ndash Suponha a existecircncia de uma pilha s de inteiros s e uma fila de inteiros q Desenhe a ilustraccedilatildeo de s e q depois das seguintes operaccedilotildees

Stack s = new Stack (6)Queue q = new Queue (5)spush (3)spush(12)qenqueue (5)qenqueue (8)int x = spop()spush(2)qenqueue (x)spush(x)

Desenhe o resultado do que eacute pedido de acordo com o estado inicial das estruturas definidas no coacutedigo abaixoa) spush(qdequeue())b) spush(qgetFirst())c) qenqueue(qdequeue())d) spush(spop())e) qenqueue(spop())

Stack s = new Stack (7)Queue q = new Queue (7)spush(2)spush(3)qenqueue(1)qenqueue(2)qenqueue(4)

Exerciacutecio 13 ndash Utilizando o TAD fila considere F uma fila natildeo vazia e P uma pilha vazia Usando apenas a variaacutevel temporaacuteria x e as quatro operaccedilotildees desempilha empilha desenfileira enfileira e vazia escreva um algoritmo para reverter a ordem dos elementos em F

Exerciacutecio 14 ndash Usando as classes LIST e STACK e considerando que a fila abaixo jaacute estaacute preenchida pede-se

fila original = 24 8 13 2 401 Escreva um algoritmo para inverter a ordem dos elementos da fila

fila apoacutes o algoritmo 40 2 13 8 242 Implemente o algoritmo como chamadas de meacutetodos das classes LIST e STACK no main

Exerciacutecio 15 ndash Fazer um programa em C para concatenar duas pilhas de inteiros e produzir uma terceira mantendo a ordem Por exemplo P1 P2 P3

4 8 8

5 12 12

6 9 9

7 16 16

4

5

6

7

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 40: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

40

Exerciacutecio 16 ndash Fazer um programa para retirar todos os nuacutemeros iacutempares de uma lista jaacute preenchida e armazenar estes nuacutemeros iacutempares em outra lista Mostrar ambas as listas

Exerciacutecio 17 ndash Exerciacutecio de Programaccedilatildeo

1) Escreva uma classe para conter 3 membros privados (propriedades) do tipo int hora min e seg e chame-a de cHora

a) Crie um construtor que inicialize as propriedades com hora=12 min=0 e seg=0b) Crie um meacutetodo inic_hora que recebe a hora os minutos e os segundos e atualiza as propried da classec) Crie um meacutetodo obtem_hora que retorna a hora os minutos e os segundosc) Crie um meacutetodo print que imprime a hora os minutos e os segundos no formato HHMMSSd) Crie um meacutetodo diff que receba dois valores de horas e retorna o nuacutemero de segundos entre elase) Escreva um programa main correspondente que faccedila o seguinte (seguir a ordem indicada)

1 Instancia um objeto da classe cHora2 Imprime a hora completa armazenada na classe3 Solicita a hora completa do usuaacuterio e atualiza as propriedades da classe4 Imprime a hora completa armazenada na classe5 Solicita um valor de hora completa do usuaacuterio (diferente da hora armazenada no objeto) e retorna o nuacutemero de

segundos entre esta hora e a hora armazenada na classe

2) Crie uma classe chamada math em C Vocecirc deveraacute fazer todo o projeto da classe 3 Declaraccedilatildeo da Classe4 Implementaccedilatildeo dos Meacutetodos5 Teste da Classe

Especificaccedilatildeo da Classe1 Sua classe deveraacute conter a seguinte propriedade do tipo texto

mensagem

2 Sua classe deveraacute conter os seguintes meacutetodos1 Meacutetodo construtor

atualiza a propriedade mensagem com um texto passado no main imprime o texto

2 area_quadrado recebe lado e devolve a aacuterea do quadrado3 perimetro_quadrado recebe lado e devolve o periacutemetro do quadrado4 area_retangulo recebe base e altura e devolve a aacuterea do retacircngulo5 perimetro_retacircngulo recebe base e altura e devolve o periacutemetro do retacircngulo6 area_ciacuterculo recebe o raio e devolve a aacuterea do ciacuterculo7 perimetro_ciacuterculo recebe o raio e devolve o periacutemetro

Obs estes 6 meacutetodos satildeo muito simples com uma linha de retorno cada um Portanto se estiver ficando grande pare e pense

3 Para testar sua classe implemente um programa main paraa Instanciar trecircs objetos da classe math chamados mathQuad mathRet e mathCirc Ao instanciar cada

objeto passar as mensagens ldquoOperaccedilotildees com Quadradordquo ldquoOperaccedilotildees com Retacircngulordquo e ldquoOperaccedilotildees com Ciacuterculordquo respectivamente

b Imprimir os seguintes resultadosi Aacuterea do quadrado com lado=545

ii Periacutemetro do quadrado com lado=1544iii Aacuterea do retacircngulo com base=367 e altura=567iv Periacutemetro do retacircngulo especificado em iiiv Aacuterea do ciacuterculo com raio=77

vi Periacutemetro do ciacuterculo com raio=525 Obs estas 6 operaccedilotildees satildeo muito simples pois podem ser implementadas cada uma em apenas uma linha

de coacutedigo e aleacutem disto natildeo existe entrada do usuaacuterio ou menu de opccedilotildees Portanto se estiver ficando

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 41: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

41

grande pare e pense3) Utilizando o tipo abstrato de dados lista ( Classe List do C) faccedila um programa para representar as peccedilas de um automoacutevel Faccedila uma lista de estruturas Cada elemento da lista deve ser do tipo da seguinte estrutura

2 coacutedigo da peccedila (inteiro)3 nome da peccedila (por exemplo motor volante carburador etc)4 preccedilo da peccedila5 peso da peccedila6 cor da peccedila

a) Crie uma classe chamada CadastroDePeccedilas Esta classe deveraacute ter os seguintes meacutetodosI CadastraPeccedila

II PesquisaPeccedilaIII ImprimePeccedilaIV ImprimeLista

b) Seu programa deve exibir o seguinte menu de opccedilotildees

1 ndash INSERIR PECcedilA I Solicitando todos os dadoscoacutedigo nome preccedilo peso e cor e insere na lista

2 ndash PESQUISAR PECcedilA I Pesquisar pelo coacutedigo

II Se achou a peccedila imprime o cadastro daquela peccedila caso contraacuterio mostra a mensagem ldquoPeccedila Inexistenterdquo

3 ndash REMOVER PECcedilAI Solicita o coacutedigo da peccedila e remove a peccedila Se a peccedila natildeo estiver na lista mostra a mensagem ldquoPeccedila

Inexistenterdquo

4 ndash IMPRIME LISTAI Imprime toda a lista

5 ndash Fazer um programa principal para testar sua classe contendo o menu de opccedilotildees acima Crie duas listas LstHonda e LstFiat Insira 5 pelas em cada lista e mostre os resultados de todas as operaccedilotildees do menu para cada lista Mostrar as telas de testes

Dica coloque a estrutura que guarda os dados da peccedila fora da classe (antes de tudo) Desta maneira vocecirc pode usar a estrutura tanto na classe quanto no main

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 42: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

42

3 ALGORITMOS RECURSIVOS

ldquoRecursatildeo eacute uma teacutecnica fundamental no projeto de algoritimos eficientes resolve-se um problema resolvendo versotildees menores do mesmo problema (Sedgewick1983)

Na praacutetica temos uma funccedilatildeo que chama ela mesma dentro do seu corpo passando novos paracircmetros a cada chamada

Um programa recursivo deve ter uma condiccedilatildeo de parada ou seja ele natildeo pode chamar a si mesmo indefinidamente Apesar de oacutebvio eacute o erro mais comum quando se usa programas recursivos

Deve-se evitar fazer chamadas recursivas para problemas muito grandes desde que isto pode levar a um loop no qual o programa tenta resolver problemas cada vez maiores

Nem todos os ambientes aceitam recursatildeo Ex FORTRAN

A recursatildeo pode levar a uma ineficiecircncia inaceitaacutevel Algumas vezes eacute necessaacuterio retirar a recursatildeo

Recursividade Direta o Quando uma funccedilatildeo conteacutem referecircncias expliacutecitas a si mesmo

Recursividade Indireta o Quando uma segunda funccedilatildeo refere-se a um primeira que o aciona

A cada chamada da funccedilatildeo uma nova aacuterea de dados eacute reservada para uso Isto pode determinar o uso ou natildeo da recursividade

o A quantidade de memoacuteria disponiacutevel pode natildeo ser suficiente para a profundidade da soluccedilatildeo recursiva

31 Condiccedilotildees para aplicaccedilatildeo da Recursividade

Quantidade de memoacuteria

O problema pode ser decomposto em subproblemas que representem instacircncias menores do que o original

O processo de decomposiccedilatildeo deve ser finito e limitado ou seja a cada nova instacircncia o subproblema resultante eacute menor e o nuacutemero de instacircncias natildeo deve ser grande

32 Problemas que Admitem Soluccedilatildeo Recursiva

Problemas que apresentem uma decomposiccedilatildeo naturalmente recursiva em subproblemas da mesma classe com o caacutelculo do fatorial de um nuacutemero

Problemas que tratam estruturas de dados naturalmente recursivas como as listas encadeadas ou as aacutervores

33 Problemas onde a Recursatildeo natildeo eacute Indicada

Problemas que apresentam somente uma chamada recursiva no iniacutecio ou no final do conjunto de accedilotildees

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 43: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

43

o Uma soluccedilatildeo iterativa usando mais variaacuteveis pode resolver o problema Problemas que apresentam crescimento exponencial no nuacutemero de chamadas com recaacutelculo de valores

o Pode haver comprometimento de espaccedilo de memoacuteria

Exemplo 1 Fatorial de um Nuacutemero Natural

0 = 1

N N(N-1) para N gt=1

Versatildeo Iterativa

int fatorial(int N)

int i F = 1if(N == 0) F=1else for(i=2 i lt= N i++)

F= Fireturn(F)

Versatildeo Recursiva

int fatorial(int N)

int Fif(N==0) F=1else F= N fatorial(N-1)return(F)

Observaccedilotildees

bull O algoritimo tem recursividade direta pois chama diretamente a si proacutepriobull Pelo menos para um valor (N=0) a funccedilatildeo eacute definida em termos que natildeo a envolvembull Haacute uma saiacuteda da sequecircncia de chamadas recursivas (condiccedilatildeo de parada)

Por exemplo o fatorial de 5 pode ser acompanhado da seguinte maneira

fat(5) =gt F1 = 5 fat(4) = 120 eacute necessaacuterio calcular o fatorial de 4 Assim F1 fica aguardando o resultado de fat(4)

fat(4) =gt F2 = 4 fat(3) = 24

fat(3) =gt F3 = 3 fat(2) = 6

fat(2) =gt F4 = 2 fat(1) = 2

fat(1) =gt F5 = 1 fat(0) = 1

1

2

6

24

1

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 44: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

44

fat(0) =gt F6 = 1 (por definiccedilatildeo)

Funcionamento

Cada vez que eacute feita uma chamada recursiva agrave funccedilatildeo fatorial uma coacutepia da variaacutevel F eacute criada na memoacuteria Satildeo criadas 6 coacutepias de F (veja os subscritos)

Cada coacutepia aguarda o resultado da sua chamada recursiva Assim F1 estaacute aguardando o resultado de F2 F2 de F3 e assim sucessivamente

Apoacutes o paracircmetro N atingir o valor zero ocorre a condiccedilatildeo de parada do algoritmo e comeccedila entatildeo um processo de voltar com os resultados para as instacircncias anteriores da variaacutevel F que estatildeo aguardando os caacutelculos

Somente quando todas as chamadas satildeo resolvidas e o resultado de F1 eacute calculado o valor 120 eacute retornado para a funccedilatildeo que chamou o fatorial (por exemplo a funccedilatildeo main)

Exemplo 2 Seacuterie de Fibonacci

Termo 0 1 2 3 4 5 6 7Num Fibonacci 1 1 2 3 5 8 13 21

Assim o termo de iacutendide 4 da seacuterie tem o valor 5 o termo de iacutendice 7 tem o valor 21

fibonacci(0) = fibonacci(1) = 1

fibonacci(N) fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Versatildeo Iterativa

const int MAX = 25int fibonacci(int N)

int i Fint Fib[MAX]Fib[i] = 1 Fib[2] = 1for(i=2 i lt= N i++)

Fib[i] = Fib[i-1] + Fib[i-2]return(Fib[n])

Versatildeo Recursiva

int fibonacci(int N)

int Fif(N == 0 || N == 1) F = 1

else F= fibonacci(N-1) + fibonacci(N-2)return(F)

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 45: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

45

Exemplo Fibonacci(4)

fibonacci(4)

fibonacci(3) + fibonacci(2)

fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0)

fibonacci(1) + fibonacci(0)

Observaccedilotildees

bull O algoritmo tem recursividade direta com duas chamadas recursivas bullbull A recursatildeo natildeo eacute bem empregada Por exemplo no acompanhamento do algoritmo acima fibonacci de 2

eacute calculado 2 vezes fibonacci de 1 eacute calculado 3 vezes e fibonacci de 0 eacute calculado 2 vezes

bull O aumento da profundidade faz aparecer o recaacutelculo do mesmo valor o que leva a uma ineficiecircncia do algoritimo

bull Assim esta versatildeo gasta muito tempo para valores de N acima de 40 e muita memoacuteria tambeacutem

34 Quando usar a Recursividade

bull A resposta deveraacute analisar as situaccedilotildees em quebull O problema estiver definido de forma recursivabull A profundidade da recursatildeo for relativamente pequenabull A conversatildeo para uma alternativa com iteraccedilatildeo for complicada ou exigir o uso de memoacuteria

auxiliarbull A funccedilatildeo natildeo constituir parte criacutetica do sistema ou o tempo natildeo for fator criacutetico para o

desempenho

EXERCIacuteCIOS

1 Determine o que faz a funccedilatildeo recursiva a seguir Mostre o fluxo para n=5

int Recursiva(int n) if(n lt= 0) return 1

else return( Recursiva(n-1) + Recursiva(n-1) )

2 Qual eacute o resultado da execuccedilatildeo do programa abaixo

11

2 1

3

1 1

2

5

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 46: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

46

Exerciacutecio 9 - Critique a seguinte funccedilatildeo recursiva

int XX (int n) if (n == 0) return 0 else return XX((n3)+1) + n

Exerciacutecio 1- - A seacuterie de Fibonacci eacute representada como 1 1 2 3 5 8 13 21 e eacute definida como fibonacci(0) = fibonacci(1) = 1fibonacci(N)

fibonacci(N-1) + fibonacci(N-2) para N gt= 2

Onde N eacute o n-eacutesimo elemento da seacuterie Assim para uma seacuterie com 8 elementos (de 0 a 7) temos

elemento 0 elemento 1 elemento 2 elemento 3 elemento 4 elemento 5 elemento 6 elemento 71 1 2 3 5 8 13 21

Pede-se Escreva a versatildeo recursiva da Seacuterie de FibonacciFaccedila o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor eacute 13

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 47: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

47

4 ALGORITMOS DE ORDENACcedilAtildeO

Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenaccedilatildeo de arquivos de registros que conteacutem uma chave Objetivo Facilitar a posterior recuperaccedilatildeo de itens no conjunto ordenado Ordenaccedilatildeo Interna

o Todo o conjunto a ser ordenado pode ser alocado na memoacuteria interna do computador Ordenaccedilatildeo Externa

o Envolve arquivos compostos por um nuacutemero de registros que eacute maior do que a memoacuteria interna do computador pode armazenar

Fatores criacuteticos nos meacutetodos de ordenaccedilatildeo Eficiecircncia

o nuacutemero de comparaccedilotildees o nuacutemero de trocas

memoacuteria extra utilizada o nenhuma - ordenam na proacutepria estrutura o usam listas de ponteiros o usam coacutepia da estrutura a ser ordenada

Meacutetodos Simples o Seleccedilatildeo o Inserccedilatildeo

Meacutetodos Eficienteso Shellsort o Quicksort o Heapsort

41 Ordenaccedilatildeo ndash Seleccedilatildeo

Funcionamento o Selecione o menor item do vetor o Troque-o com o item que estaacute na primeira posiccedilatildeo do vetor o Repita a operaccedilatildeo anterior para os n-1 itens restantes depois para os n-2 ateacute que reste apenas

um elemento

Implementaccedilatildeo

void selecao (int A[] int n)int i j min aux

for (i=0 i lt n-1 i++) min = i for (j= i+1 j lt n j++)

if (A[j] lt A[min]) min = j

aux = A[min] A[min] = A[i] A[i] = aux

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 48: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

48

Vantagens Eacute simples Pequeno nuacutemero de movimentaccedilatildeo de registros Indicado para arquivos com registros grandes

Desvantagens Custo quadraacutetico Natildeo eacute sensiacutevel agrave ordenaccedilatildeo inicial Indicado para arquivos pequenos

42 Ordenaccedilatildeo ndash Inserccedilatildeo

Funcionamento

similar ao utilizado para organizar cartas de baralho em cada passo a partir de i= 2 o i-eacutesimo item da sequumlecircncia fonte eacute transferido para seu lugar apropriado

Implementaccedilatildeo

void Insercao (int A[] int n) int i j v for (i= 1 i lt n i++) v = A[i] A[0]= v sentinela j= i while (A[j-1] gt v) A[j] = A[j-1] j-- A[j] = v

Vantagens Eacute simples O tempo eacute linear qdo o arquivo jaacute estaacute ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo jaacute ordenado

Desvantagens Custo quadraacutetico Grande nuacutemero de movimentaccedilatildeo de registros

42 Ordenaccedilatildeo ndash Quicksort

Proposto por Hoare em 1960 e publicado em 1962 Eacute o algoritmo de ordenaccedilatildeo interna mais raacutepido que se conhece para uma ampla variedade de situaccedilotildees Provavelmente eacute o mais utilizado A ideacuteia baacutesica eacute dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores Os problemas menores satildeo ordenados independentemente Os resultados satildeo combinados para produzir a soluccedilatildeo final

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 49: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

49

Funcionamento

A parte mais delicada do meacutetodo eacute o processo de particcedilatildeo

O vetor v[esqdir] eacute rearranjado por meio da escolha arbitraacuteria de um pivocirc x

O vetor v eacute particionado em duas partes o Parte esquerda chaves le x o Parte direita chaves ge x

Algoritmo para o particionamento

1 Escolha arbitrariamente um pivocirc x 2 Percorra o vetor a partir da esquerda ateacute que v[i] ge x 3 Percorra o vetor a partir da direita ateacute que v[j] le x 4 Troque v[i] com v[j] 5 Continue este processo ateacute os apontadores i e j se cruzarem

Ao final do algoritmo de particcedilatildeo

1 Vetor v[esqdir] estaacute particionado de tal forma que 2 Os itens em v[esq] v[esq + 1] v[j] satildeo menores ou iguais a x 3 Os itens em v[i] v[i + 1] v[dir] satildeo maiores ou iguais a x

Exemplo vetor de inteiros

O pivocirc x eacute escolhido como sendo o elemento central v[(i + j) 2]

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 50: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

50

Implementaccedilatildeo

void Particao(int a[]int esq int dir int ampp int ampq) int i j v t i = esq j= dir v = a[(i+j)2] pivo do while (v gt a[i]) i++ while (v lt a[j]) j-- if (i lt= j) t = a[i] a[i] = a[j] a[j] = t

i++ j-- while (i lt= j) p = i q = j

void quicksort (int a[] int esq int dir) int i j Particao(aesqdirampiampj) if (esq lt j) quicksort(aesqj) if (i lt dir) quicksort(aidir)

Observaccedilotildees

O anel interno da funccedilatildeo Particcedilatildeo eacute extremamente simplesRazatildeo pela qual o algoritmo QuickSort eacute tatildeo raacutepido

Pior caso para o QuickSortO(n) = n2

O pior caso ocorre quando sistematicamente o pivocirc eacute escolhido como sendo um dos extremos de um arquivo jaacute ordenado

Caso meacutedio de acordo com Sedgewick e Flajolet (1996 p 17) O(n) asymp 1386n log n ndash 0846n

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 51: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

51

Melhor caso para o QuickSortO(n) = n log nOcorre quando o problema eacute sempre divido em subproblemas de igual tamanho apoacutes a particcedilatildeo

Vantagens Eacute extremamente eficiente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memoacuteria auxiliar Requer O(n log n) comparaccedilotildees em

meacutedia (caso meacutedio) para ordenar n itensDesvantagens Tem um pior caso O(n2) comparaccedilotildees Sua implementaccedilatildeo eacute delicada e difiacutecil

o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados

EXERCIacuteCIOS

1 Dada a sequecircncia de nuacutemeros 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenaccedilatildeo QuickSort apresentado a sequecircncia dos nuacutemeros a cada passo

2 Dada a funccedilatildeo abaixo execute o algoritmo para o conjunto de seis chaves apresentadas a seguir Vocecirc deve mostrar passo a passo a evoluccedilatildeo do vetor ateacute o algoritmo terminar n eacute o tamanho do vetor

3 Dada a funccedilatildeo ordena abaixo pede-se

Fazer o acompanhamento do algoritmo para a seguinte entrada de dados mostrando a evoluccedilatildeo das variaacuteveis i j A[min] e temp Para cada valor de i mostrar os valores do vetor A

A[ ]= | 8 | 5 | 10 | 1 | 4 | 9 | 2 | 6 |

Determinar a ordem de complexidade da funccedilatildeo ordena justificando sua resposta

void funcao(char A[] int n) int i j min aux for (i=0 i lt n-1 i++) min = i

for (j= i+1 j lt n j++) if (A[j] lt A[min])

min = j

aux = A[min]A[min] = A[i]A[i] = aux

Chaves iniciais FUNCAO

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 52: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

52

4 Para os algoritmos Seleccedilatildeo Inserccedilatildeo e Quicksort respondaQual o comportamento (ordem de complexidade) de cada um em relaccedilatildeo ao nuacutemero de entradas (n)

void Ordena(int A[]) int ijmintemp1 for (i=1 iltn i++)2 min = i3 for (j=i+1 jlt=n j++) 4 if (A[j] lt A[min])5 min=j Troca A[min] com A[i]6 temp = A[min]7 A[min] = A[i]8 A[i] = temp

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 53: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

53

5 ALGORITMOS DE PESQUISA

bull Algoritmos de pesquisa tem por objetivo a eecuperaccedilatildeo de informaccedilotildees a partir de uma massa de dados armazenada

bull A informaccedilatildeo eacute dividida em registros onde cada registro possui uma chave para ser usada na pesquisabull O objetivo da pesquisa eacute encontrar uma ou mais ocorrecircncias de registros com chaves iguais agrave chave de

pesquisabull Meacutetodos de pesquisa

ndash pesquisa sequumlencialndash pesquisa binaacuteriandash aacutervore binaacuteriandash hashing

51 PESQUISA SEQUENCIAL

bull Eacute o meacutetodo de pesquisa mais simples que existebull Funcionamento a partir do primeiro elemento pesquise sequumlencialmente ateacute encontrar a chave procuradabull Indicado para tabelas com ateacute 25 itensbull Para pesquisar um conjunto de n elementos temos

ndash no melhor caso 1 pesquisa (a chave procurada eacute a primeira)ndash no pior caso n pesquisas (a chave procurada eacute a uacuteltima)ndash no caso meacutedio (n+1)2 pesquisas

EXEMPLO DE UM ALGORTIMO DE PESQUISA SEQUENCIAL

Pesquisa(int x T[] int n) int i T[0] = x i = n +1 do i - - while (T[i] = x) return i

Obs este algoritmo utiliza a posiccedilatildeo zero do vetor que natildeo deve ser usada

52 PESQUISA BINAacuteRIA

bull Vantagemndash Meacutetodo de pesquisa eficiente Indicado para tabelas mais estaacuteticas

bull Desvantagemndash A tabela deve estar ordenada

bull Princiacutepiondash A ideacuteia eacute iniciar a pesquisa pelo elemento que estiver no meio da tabela se natildeo for encontrado

aiacute e a chave for menor entatildeo o elemento deve estar na primeira metade se a chave for maior entatildeo a segunda metade deve contecirc-lo O processo deve ser repetido ateacute que a chave seja encontrada ou reste apenas um registro cuja chave eacute diferente da procurada

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 54: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

54

Implementaccedilatildeo

int Binaria (int x int T[] int n) int i esq dir if n = 0 return 0 else esq = 1 dir = n do i = (esq + dir) 2

if (x gt T[i]) esq = i + 1 else dir = i - 1

while (x = T[i] ampamp esq lt= dir) if (x == T[i]) return i else return 0

EXERCIacuteCIOS

1 Considere a seguinte inicializaccedilatildeo de um vetor de inteiros

int elementos[ ] = 14 26 23 17 7 3 5 13 18 16 12 11 21 30 27 9 22 1 25 9 8 28 20 4 29 10 24 2 15 6

Implemente o algoritmo de pesquisa sequumlencial com protoacutetipo abaixo e que use todas as posiccedilotildees do vetor elementos

int pesqSequencial(int v[ ] int numElem int val)

o algoritmo deve retornar o iacutendice onde se encontra o valor val e caso natildeo existir devolve -1

2 Utilizando o algoritmo de pesquisa binaacuteria modifique este algoritmo e o algoritmo do exerciacutecio 1 para que eles contabilizem o nuacutemero de testes que efetuam O que concluir em termos de complexidade algoriacutetmica Analise os piores casos e trace graacuteficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos

14 6 27 9 7 15 7

3 Escreva uma versatildeo recursiva do algoritmo de pesquisa binaacuteria

4 - Utilizando o algoritmo de pesquisa binaacuteria e o vetor T pede-se

T = 2 5 8 9 12 18 22 26 34 37 38 43 45 49 54 58 65 69 76 81 84 88 93 95 100 102 110 112 117 120 126 140

Fazer o do algoritmo para x= 8 (chave)1 Verificar quantas vezes a comparaccedilatildeo if(x gt T[i]) eacute executada

2 Verificar se este valor corresponde agrave ordem de complexidade (log n)3 Considere que o vetor comeccedila em 1 e termina em n (natildeo interfere no algoritmo)

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo
Page 55: Apostila de Algorítimos e Estrutura de Dados - Prof. Conway

55

5 Em um vetor com 25000 registros quantos registros satildeo comparados (aproximadamente) quando a chave que estaacute sendo procurada natildeo se encontra no vetor considerando-se uma pesquisa binaacuteria

6 Dada a seguinte sequumlecircncia de nomes (chaves) 0 1 2 3 4 5 6 7 8ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZEacuteLIA

Faccedila uma anaacutelise comparativa entre a eficiecircncia da pesquisa sequumlencial e da pesquisa binaacuteria para este caso considerando o nuacutemero meacutedio de comparaccedilotildees para cada caso

  • ALGORITMOS E ESTURTURAS DE DADOS
  • AED
  • PROFESSOR JUacuteLIO C D CONWAY
  • UNIDADES DE ENSINO
  • UNIDADE 1 REVISAtildeO DE PROGRAMACcedilAtildeO ORIENTADA POR OBJETOS 18 ha (4 semanas)
  • 11 Classes e Objetos
  • 12 Mecanismos de visibilidade Encapsulamento
  • 121 Atributos e meacutetodos de classe
  • 13 Heranccedila
  • 14 Polimorfismo
  • 15 Exemplos de POO em C Sharp
  • UNIDADE 2 ESTRUTURAS DE DADOS FUNDAMENTAIS 10 ha (3 semanas)
  • 21 TIPOS ABSTRATOS DE DADOS - Conceitos
  • 22 LISTAS
  • 23 FILAS
  • 24 PILHAS
  • UNIDADE 3 ALGORITMOS RECURSIVOS 8 ha (2 semanas)
  • 31 Conceitos
  • 32 Funccedilotildees recursivas
  • 33 Estudos de casos Algoritmos Fatorial e Seacuterie de Fibonacci
  • UNIDADE 4 ALGORITMOS DE ORDENACcedilAtildeO 4 ha (2 semanas)
  • 41 Algoritmo de Seleccedilatildeo
  • 42 Algoritmo de Inserccedilatildeo
  • 43 Algoritmo Quicksort
  • UNIDADE 5 PESQUISA EM MEMOacuteRIA PRIMAacuteRIA 16 ha (4 semanas)
  • 51 Pesquisa sequumlencial
  • 52 Pesquisa binaacuteria
  • 53 Aacutervores de pesquisa
  • 531 Conceitos
  • 532 Aacutervores de Pesquisa Binaacuteria
  • 533 Caminhamento em Aacutervores InOrdem PreOrdem PosOrdem
  • 54 Tabelas Hash
  • UNIDADE 6 ANAacuteLISE DE ALGORITMOS 8 ha (2 semanas)
  • 61 Ordem de Complexidade de Algoritmos
  • 62 Classes de Comportamento assintoacutetico de Funccedilotildees
  • 63 Anaacutelise do pior caso caso meacutedio e melhor caso
  • CRITEacuteRIOS DE AVALIACcedilAtildeO
  • 1 Introduccedilatildeo agrave Programaccedilatildeo Orientada a Objetos (POO)
  • Essecircncia tratar dados e procedimentos que atuam sobre estes dados como um uacutenico ldquoobjetordquo