Você está na página 1de 55

1

PontifciaUniversidadeCatlicadeMinasGerais

CampusBeloHorizonteNcleoUniversitrioContagem Curso:SistemadeInformaoNoite Disciplina:AlgoritmoseEstruturasdeDados Professor:JlioCsarDillingerConway

ALGORITMOS E ESTURTURAS DE DADOS AED PROFESSOR: JLIO C. D. CONWAY

UNIDADES DE ENSINO
UNIDADE 1: REVISO DE PROGRAMAO ORIENTADA POR OBJETOS........... 18 h/a (4 semanas) 1.1 Classes e Objetos 1.2 Mecanismos de visibilidade: Encapsulamento 1.2.1 Atributos e mtodos de classe 1.3 Herana 1.4 Polimorfismo 1.5 Exemplos de POO em C Sharp UNIDADE 2: ESTRUTURAS DE DADOS FUNDAMENTAIS...................................... 10 h/a (3 semanas) 2.1 TIPOS ABSTRATOS DE DADOS - Conceitos 2.2 LISTAS 2.3 FILAS 2.4 PILHAS UNIDADE 3: ALGORITMOS RECURSIVOS................................................................... 8 h/a (2 semanas) 3.1 Conceitos 3.2 Funes recursivas 3.3 Estudos de casos: Algoritmos Fatorial e Srie de Fibonacci UNIDADE 4: ALGORITMOS DE ORDENAO........................................................... 4 h/a (2 semanas) 4.1 Algoritmo de Seleo 4.2 Algoritmo de Insero 4.3 Algoritmo Quicksort UNIDADE 5: PESQUISA EM MEMRIA PRIMRIA.................................................. 16 h/a (4 semanas) 5.1 Pesquisa seqencial............. 5.2 Pesquisa binria 5.3 rvores de pesquisa 5.3.1 Conceitos 5.3.2 rvores de Pesquisa Binria 5.3.3 Caminhamento em rvores: InOrdem, PreOrdem, PosOrdem 5.4 Tabelas Hash UNIDADE 6: ANLISE DE ALGORITMOS.................................................................. 8 h/a (2 semanas) 6.1 Ordem de Complexidade de Algoritmos 6.2 Classes de Comportamento assinttico de Funes 6.3 Anlise do pior caso, caso mdio e melhor caso

CRITRIOS DE AVALIAO
Avaliao: Prova 1.1: 5 pontos Prova 1.2: 35 pontos Prova 2.1: 5 pontos Prova 2.2: 35 pontos Trab1: 10 pontos Trab2: 10 pontos ________________ Total : 100 pontos Obs1: O aluno ter direito a uma prova substitutiva, na data prevista no calendrio. No permitido fazer prova substitutiva para melhorar a nota de uma prova j realizada. O contedo da prova ser toda a matria. 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 reavaliao: 100 pontos. Nota final: mdia da reavaliao mais nota semestral. Nota para fazer a reavaliao: igual ou superior a 40 pontos e menor de 60 pontos. Obs4: Todo o material da disciplina ser disponibilizado no SGA, mas importante tambm estudar nos livros relacionados abaixo: Bibliografia Bsica

ZIVIANI, Nivio. Projeto de algoritmos: com implementaes em Java e C++. So Paulo: Thomson Learning, c2007. 621 p. ISBN 8522105251 (Consta no acervo da PUC Minas)

MANZANO, Jos Augusto N. G; OLIVEIRA, Jayr Figueiredo de. Algoritmos: logica para desenvolvimento de programao. 11. ed. So 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. 2.ed. rev. Rio de Janeiro: LTC - Livros Tcnicos e Cientficos, c1994. 320p. ISBN 8521610149 (Consta no acervo da PUC Minas)

Bibliografia Complementar
CORMEN, Thomas H. et al. Algoritmos: teoria e prtica. 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: Addison Wesley, 2003 780p. (Consta no acervo da PUC Minas)

1. Introduo Programao Orientada a Objetos (POO)


Essncia: tratar dados e procedimentos que atuam sobre estes dados como um nico objeto. Um objeto uma entidade auto-contida com uma identidade e propriedades particulares.

1.1. CONCEITOS FUNDAMENTAIS


1. 2. 3. Encapsulamento Herana e Reuso Polimorfismo

ENCAPSULAMENTO
Um transistor auto-contido: ele faz uma tarefa bem definida e faz completamente. Fazer uma tarefa completamente chamada de encapsulamento. Todas as propriedades do transistor so encapsuladas no objeto transistor. No necessrio saber como o transistor trabalha para us-lo efetivamente.

HERANA E REUSO
A idia de reuso suportada atravs da herana de classes. Um novo tipo, que uma extenso de um tipo j existente, pode ser declarado. Esta nova sub-classe derivada da classe existente e chamada classe derivada: Herana o mecanismo que permite a Classe Derivada herdar as propriedades da classe Base. Dizemos que A Derivada herda da Base. Objetos da classe Derivada tem acesso a dados e funes da classe Base sem a necessidade de redefini-los.

HERANA SIMPLES
Uma classe derivada pode ser a classe base para outras derivaes.

Classe Base para a Classe Derivada A

Classe Base
Classe Base para a Classe Derivada B

Classe Derivada A Classe Derivada B

Classe Base para as Classes Derivadas C,D e E

Classe Derivada D

Classe Derivada C

Classe Derivada E

POLIMORFISMO
O polimorfismo permite a uma entidade (varivel, funo ou objeto) ter vrias representaes. Uma varivel pode ter diferentes tipos dependendo do contexto em um momento particular. O polimorfismo permite-nos usar o mesmo nome de funes, desde que a lista de parmetros seja diferente (Sobrecarga de funes). Objetos herdados de uma classe podem ser sobrecarregados em uma classe derivada. Analisando a palavra Polimorfismo, ela significa muitas formas. Ou seja, para uma rvore de herana, temos muitas formas de objetos e mtodos a partir de uma superclasse e suas subclasses. Polimorfismo o princpio pelo qual usamos objetos construdos a partir de uma rvore de herana, atravs de referncias do tipo de uma superclasse da hierarquia. Formas de polimorfismo: Subclasses; Sobrescrita de mtodo; Sobrecarga de mtodo ou construtor Sobre escrita de mtodos Overriding Esta utilidade nos permite escrever numa subclasse um ou mais mtodos presentes numa das superclasses podendo alterar o comportamento da superclasse. Exemplo:

Quando numa subclasse reescrevemos um mtodo j existente numa superclasse, chamamos de sobre escrita de mtodo ou reescrita de mtodo mas o termo tcnico Method Overriding. Lembrando que a sobre escrita de mtodos s valida quando o mtodo reescrito na subclasse tem exatamente a mesma identificao (nome, tipos, etc.) do mtodo da superclasse. Sobrecarga de mtodos Overloading O Polimorfismo ainda permite que numa mesma classe tenhamos mtodos com o mesmo nome, desde que o nmero ou tipos de parmetros passados sejam diferentes. Exemplo:

A sobrecarga de mtodos uma ferramenta poderosa, pois nos permite criar vrios mtodos com o mesmo nome, isso facilita o entendimento de problemas mais complexos, pois no necessria a criao de nomes de funcionalidades sem sentido aparente.

1.2. CLASSES
Uma classe uma estrutura que encapsula dados (chamados de propriedades) e funes (chamadas de mtodos) em um pacote auto-contido. Os mtodos so funes normais em linguagem C ou C++. CLASSE MTODOS As propriedades so variveis normais: int, char, struct

PROPRIEDADES

1.3 OBJETOS
Um objeto uma instncia de uma classe. Podemos entender a classe como uma declarao, e o objeto como uma varivel do tipo da classe. Trabalhamos com o objeto, a classe nos diz somente de que tipo o objeto . identificado unicamente pelo seu nome. Define um estado que representado pelos valores dos seus atributos em um dado momento. O comportamento de um objeto definido pelo conjunto de funes que podem ser aplicados a ele. Podem existir vrios objetos de uma mesma classe. POO portanto a implementao de tipos abstratos de dados: classes e objetos. Um programa, escrito em C++ ou C# pode ser visto como uma coleo de objetos.

CRIANDO OBJETOS
Agora que j sabemos como definir uma classe, podemos passar ao ponto de criar objetos da classe definida. importante perceber o fato de que podemos criar vrios objetos da mesma classe, no ficando limitado a apenas um objeto. No C++, podemos declarar um objeto de maneira esttica. Suponha que a classe cTempo j est definida. Veja a declarao abaixo em C++:
cTempo Aniversario;

// Aniversario um objeto (instncia da classe cTempo)

Quando vamos criar um objeto em C# utilizamos a palavra chave "new" seguindo o seguinte esquema:
<Tipo> <nome> = new <Tipo>()

Assim teramos, em relao ao exemplo anterior:

9
cTempo Aniversario = new cTempo();

// Aniversario um objeto (instncia da // classe cTempo)

Veja ento um exemplo de criao de um objeto de uma classe hipottica Computador com o nome de comp1:
Computador comp1 = new Computador(); // comp1 e um objeto da classe Computador

O operador new responsvel por calcular o nmero correto de bytes para o objeto especificado e adquirir memria suficiente (esta rea de memria chamada de heap). Assim, no C#, a keyword new o caminho para criar um objeto. Dentro de uma classe, assim como em programas comuns da linguagem C, podem existir variveis e funes. Dentro da classe, as variveis so chamadas de atributos e as funes de mtodos. Veja outro exemplo:
using System; class HelloClass { // propriedades ... // mtodos ... } public static int Main(string[] args) { // Voc pode declarar e criar um novo objeto em uma simples linha... HelloClass c1 = new HelloClass(); //ou quebrar a declarao e criao em duas linhas. HelloClass c2; c2 = new HelloClass(); ... }

Aqui so alocados dois objetos da classe HelloClass. Variveis de objeto em C#, realmente so uma referncia ao objeto na memria, no o prprio objeto em si. Assim, c1 e c2 referenciam dois objetos da classe HelloClass alocados na memria heap. Perceba que na criao do objetos c1 e c2, aps o new, chamamos o tipo HelloClass seguido de parnteses. Essa notao significa que neste momento ser executado um mtodo especial da classe HelloClass chamado construtor.

1.4. MTODO CONSTRUTOR


O construtor um mtodo que possui o mesmo nome da classe, que no retorna nenhum valor e que chamado cada vez que um objeto da classe criado. Por padro, quando no criamos nenhum construtor (como na classe HelloClass), o construtor vazio, que no recebe nenhum parmetro e tambm no executa nenhum cdigo, criado automaticamente. Aps criarmos um construtor o construtor vazio automtico no 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 padro public HelloClass() { Console.WriteLine("Construtor padro chamado!"); } // Construtor customizado public HelloClass (string msg) { Console.WriteLine("Construtor customizado chamado!"); strMensagem = msg; } // Ponto de entrada do programa public static int Main(string[] args) { // Chamando o construtor padro HelloClass c1 = new HelloClass(); Console.WriteLine("Mensagem do usurio: {0}\n", c1.strMensagem); // Chamando o construtor customizado passando uma string como parmetro HelloClass c2; c2 = new HelloClass("Testando, 1, 2, 3"); Console.WriteLine("Mensagem do usurio: {0}", c2.strMensagem); Console.ReadLine(); return 0; } }

Mtodo com o mesmo nome da classe, sem parmetro.

Mtodo com o mesmo nome da classe, com parmetro.

1.5. ATRIBUTOS E MTODOS


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

11
namespace Construtor { class Computador { string monitor; string teclado; string mouse;

Atributos da Classe: so variveis comuns, e podem ser de qualquer tipo.

Mtodo construtor (tem o mesmo nome da classe), e recebe 3 parmetros.

public Computador(string m, string t, string r) { monitor = m; teclado = t; mouse = r; }

Mtodo imprime: um mtodo da classe. Veja que uma simples funo para impresso.

public Imprime() { Console.WriteLine(monitor + " " + teclado + " " + mouse); }

Programa Principal:onde os objetos so criados (instanciados).

} }

public class App { public static void Main() { Computador comp1 = new Computador("Monitor1","Teclado1","Mouse1"); Computador comp2 = new Computador("Monitor2","Teclado2","Mouse2"); Computador comp3 = new Computador("Samsung","Acer","Logitch"); ... } }

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

1.6. TIPOS POR VALOR X TIPOS POR REFERNCIA


Os tipos pr-definidos em C# so normalmente conhecidos como tipos por valor. Esses tipos devem permitir um acesso rpido j que so muitas vezes utilizados no cdigo. Dessa forma, os tipos por valor tm guardados na memria apenas o seu valor, sem nenhuma outra informao adicional que poderia causar um gasto desnecessrio de memria. Os tipos criados por classes, os objetos, so conhecidos como tipos "por referncia". Essa denominao vem do fato de que esses tipos no guardam o seu valor, mas sim uma referncia para um local na memria que contm o valor. No C e no C++ chamaramos esta referncia de ponteiro. Com essas definies, importante perceber que, se copiarmos as informaes de variveis de tipos por valor e de variveis de tipos por referncia, teremos comportamentos diferentes. Caso copiemos uma varivel por valor, o que ocorre que uma nova cpia do valor passada para a outra varivel. Isso significa que caso modifiquemos uma das variveis, nada ocorrer com a outra. Em variveis por referncia o que ocorre ao copiarmos para outra varivel que apenas a referncia copiada, no o valor. Aps a cpia o que acontece que teremos duas variveis apontando para um mesmo valor. Isso significa que, ao modificarmos uma varivel, estaremos na realidade modificando o valor para o qual a outra varivel tambm est apontando, significando que o valor da outra varivel tambm ser modificado.

12

Veja o cdigo 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 = m; teclado = t; mouse = r; } public void Imprime() { Console.WriteLine(monitor + " " + teclado + " " + mouse); }

public class App { public static void Main() { //cria uma varivel de tipo por valor int valor1 = 10; //copia para outra varivel int valor2 = valor1; //adiciona 5 a valor2 valor2 += 5; //imprime o valor das duas: Console.WriteLine("valor1: " + valor1); Console.WriteLine("valor2: " + valor2); //cria um objeto de tipo por referncia Computador comp1 = new Computador("Monitor1","Teclado1","Mouse1"); //copia a referncia do objeto comp1 para o objeto comp2 Computador comp2 = comp1; //modifica o valor do monitor: comp2.monitor = "Modificado!"; //imprime os dois computadores: comp1.imprime() comp2.imprime();

} }

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 tambm foi modificado, provando que na verdade os dois objetos referenciam o mesmo endereo na memria.

13

EXERCCIO O aluno dever desenvolver a classe funcionario, que tem a seguinte especificao: ATRIBUTOS
Matricula: int nome, endereco: string peso, altura: float sexo: char;

MTODOS
funcionrio() : este o mtodo construtor padro(lembre-se que o mtodo construtor tem mesmo nome da classe): Entradas: nenhuma Sadas : nenhuma Funo : imprimir a mensagem Construtor Padrao Chamado ! funcionrio(string msg) : este outro mtodo construtor sobrecarregado: Entradas: mensagem vinda do main Sadas : nenhuma Funo : imprime a mensagem recebida funcionrio(int mat, string nom, string end, float pes, float alt, char sex ) : este outro mtodo construtor sobrecarregado: Entradas : dados vindos do main Sadas : nenhuma Funo : atualiza os dados do objeto funcionrio 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 Sadas : nenhuma Funo : atualiza os dados do objeto funcionrio de acordo com os dados vindos do main imprimeDados Entradas : nenhuma Sadas : nenhuma Funo : imprime todos os dados do funcionario o

Agora est na hora de usar a classe. Usando mtodos da classe funcionario definida acima e criada por voc, crie uma aplicao que faa o seguinte, na ordem dada: 1. Instancie trs objeto da classe funcionrio:
objJoao utilize o construtor padro objPedro utilize o segundo construtor e passe a mensagem: Segundo construtor obrecarregado chamado ! objMaria chame o terceiro construtor e passe os seguintes dados: matricula: 2341 nome: Maria da Silva endereo: Rua das Flores 34 peso: 67.6 altura: 1.76 sexo: F 2. Imprima os dados do objeto objMaria.

14

3. Atualize os dados do objJoao com: matricula: 6784 nome: Joao Marques endereo: Rua das Acacias 45 peso: 89.6 altura: 1.90 sexo: M 4. Atualize os dados do objPedro com: matricula: 4523 nome: Pedro Villar endereo: Rua Torta 33 peso: 78.9 altura: 1.76 sexo: M

5. Imprima os dados dos objetos objJoao

e objPedro.

1.7. HERANA
Herana um dos trs princpios fundamentais da programao orientada a objetos porque ela permite a criao de hierarquia nos objetos que compem o sistema. Em C#, uma classe que tem seus dados e mtodos herdados por outra chamada de classe base ou super classe e a classe que herda tais dados chamada de classe derivada ou sub-classe. O que um aluno, um professor e um funcionrio possuem em comum? Todos eles so pessoas e, portanto, compartilham alguns dados comuns. Todos tm nome, idade, endereo, etc. E, o que diferencia um aluno de outra pessoa qualquer? Um aluno possui uma matrcula; Um funcionrio possui um cdigo de funcionrio, data de admisso, salrio, etc; Um professor possui um cdigo de professor e informaes relacionadas sua formao. aqui que a herana se torna uma ferramenta de grande utilidade. Podemos criar uma classe Pessoa, que possui todos os atributos e mtodos comuns a todas as pessoas e herdar estes atributos e mtodos em classes mais especficas, ou seja, a herana parte do geral para o mais especfico. Comece criando uma classe Pessoa como mostrado no cdigo a seguir:
class Pessoa{ public string nome; public int idade; }

Esta classe possui as propriedades nome e idade. Estas propriedades so comuns a todas as pessoas. Veja agora como podemos criar uma classe Aluno que herda estas propriedades da classe Pessoa e inclui suas prprias propriedades, a saber, seu nmero de matrcula. Eis o cdigo:
class Aluno: Pessoa { public string matricula; }

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

Observe que, em C#, os dois-pontos so usados para indicar a herana. A classe Aluno agora possui trs 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();

15

aluno.nome = "Osmar J. Silva"; aluno.idade = 36; aluno.matricula = "AC33-65"; // Exibe o resultado Console.WriteLine("Nome: " + aluno.nome + "\n" + "Idade: " + aluno.idade + "\n" + "Matrcula: " + aluno.matricula); Console.WriteLine("\n\nPressione uma tecla para sair..."); Console.ReadKey(); }

A herana nos fornece um grande benefcio. Ao concentrarmos caractersticas comuns em uma classe e derivar as classes mais especficas a partir desta, ns estamos preparados para a adio de novas funcionalidades ao sistema. Se mais adiante uma nova propriedade comum tiver que ser adicionada, no precisaremos efetuar alteraes em todas as classes. Basta alterar a superclasse e pronto. As classes derivadas sero automaticamente atualizadas.

16

EXEMPLO DE CDIGO: CONSTRUINDO UMA CLASSE


Suponha que queiramos escrever um programa que manipula datas (minuto, hora, dia, ms, ano). Ao invs de cinco variveis isoladas, poderamos colocar estes dados em uma estrutura nica, englobando a data completa. Assim, poderamos declarar uma varivel do tipo struct da seguinte maneira:
struct Tempo { int ano; int mes; int dia; int hora; int minuto; }

Ok, at aqui nada de novo (certo?). S declaramos uma estrutura em C padro, que contm 5 variveis: ano, ms, dia, hora e minuto. Agora imagine que, alm dessas variveis, a estrutura Tempo pudesse tambm ter embutida (encapsulada), funes em C ou C# . Por exemplo, uma funo que mostra a data na tela. Esta estrutura seria mais poderosa, pois os dados poderiam ser manipulados de dentro da prpria estrutura, atravs da sua funo interna. Essa estrutura mais verstil, que contm declaraes de variveis e funes, constitui-se em uma classe, como vimos anteriormente. As variveis so chamadas de atributos e as funes de mtodos. Assim, poderamos reescrever nossa estrutura Tempo como uma classe cTempo:
public class cTempo { public int ano; public int mes; public int dia; public int hora; public int minuto; { } public void mostra_data()

// variavel publica da classe // variavel publica da classe // variavel publica da classe // variavel publica da classe // variavel publica da classe // mtodo publico da classe

Console.WriteLine(dia + "/" + mes + "/" + ano); Console.WriteLine(hora + ":" + minuto); };

Ok, estamos prontos agora para usar nossa classe CTempo. Como? Temos que observar duas coisas: 1. 2. No trabalhamos com a classe CTempo. Temos que instanciar um objeto da classe CTempo e trabalhar com este objeto. Abaixo temos a declarao (instanciao) do objeto e um pequeno programa em C#:

17
using System; using System.Collections.Generic; using System.Text; namespace Classe_Tempo { class Program { // Classe para manipulacao do tempo public class cTempo { // atributos so acessveis 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() // funo membro { Console.WriteLine(dia + "/" + mes + "/" + ano); Console.WriteLine(hora + ":" + minuto); } } // Programa Principal static void Main(string[] args) { // instanciando o objeto aniversario, da classe cTempo cTempo aniversario = new cTempo(); Console.WriteLine("Exemplo de POO em C#\n"); // para acessar metodos faa: // nome_objeto.nome_metodo Console.WriteLine("Data inicial"); aniversario.mostra_data(); // inicializando nova data. Para acessar atributos publicos faa: // nome_objeto.nome_atributo aniversario.dia = 9; aniversario.mes = 2; aniversario.ano = 2010; aniversario.hora = 19; aniversario.minuto = 23; Console.WriteLine("Nova data:\n"); aniversario.mostra_data(); Console.ReadKey(); } } }

A sada do programa ser:

18

Podemos tambm especificar a privacidade dos atributos e mtodos, atravs dos identificadores public e private. Todos os membros de uma classe atributos e mtodos so por definio privados, ou seja, podem ser acessados somente por mtodos da classe. Membros pblicos podem ser acessados por qualquer objeto da classe, ou seja, podem ser acessados do main. Como uma regra geral, voc deve manter os dados de uma classe privados. Portanto, voc deve criar funes pblicas, conhecidas como mtodos de acesso, para acessar estes dados privados. Mtodos de acesso so as funes membro que outras partes do seu programa chamam para acessar os atributos privados. Mtodos de acesso permitem que voc separe os detalhes de como o dado armazenado dentro do objeto, de como ele usado (encapsulamento). Podemos agora, escrever um cdigo mais completo, acrescentando mtodos classe CTempo, para retirar do objeto a data ou ento para atualiz-la dentro do objeto. Estes mtodos em geral so chamados de mtodos de acesso. Veja o esquema abaixo:

main

Objeto
Mtodo de acesso para alterar o valor dos atributos Mtodo de acesso para obter o valor dos atributos

ATRIBUTOS

19 Nosso programa ficaria ento da seguinte maneira, acrescentando os mtodos: 1. obtem_data 2. atualiza_data
using System; using System.Collections.Generic; using System.Text; namespace Classe_Tempo { class Program { // Classe para manipulacao do tempo public class cTempo { // atributos publicos so acessveis 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() // funo membro { Console.WriteLine(dia + "/" + mes + "/" + ano); Console.WriteLine(hora + ":" + minuto); } // retorna a data armazenada no objeto por referencia public 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; Console.WriteLine("Exemplo de POO em C#\n"); Console.WriteLine("Data inicial"); aniversario.mostra_data(); // inicializando nova data aniversario.dia = 9; aniversario.mes = 2;

20
aniversario.ano = 2010; aniversario.hora = 19; aniversario.minuto = 23; Console.WriteLine("Nova data:\n"); aniversario.mostra_data(); // retirando nova data no objeto (GET) Console.WriteLine("\nRetirando a data armazenada no objeto"); Console.WriteLine("atraves do metodo obtem_data:"); aniversario.obtem_data(ref v1, ref v2, ref v3, ref v4, ref Console.WriteLine(v1 + "/" + v2 + "/" + v3); Console.WriteLine(v4 + ":" + v5); // inicializando nova data no objeto (SET) Console.WriteLine("\nInicializando a data armazenada no objeto com outra data atraves do metodo atualiza_data:"); v1 v2 v3 v4 v5 = = = = = 24; 12; 2010; 23; 59; v5);

aniversario.atualiza_data(v1, v2, v3, v4, v5); Console.WriteLine("Nova data atualizada:\n"); aniversario.mostra_data(); } } } Console.ReadKey();

A sada do programa ficaria assim:

21

EXERCCIOS DE REVISO
Exerccio 1 Defina POO, Herana, Encapsulamento e Polimorfismo. Exerccio 2 Defina Classes, Objetos, Mtodos e Atributos Exerccio 3 No caso especfico da linguagem C#, a sintaxe para acessar um atributo utiliza qual operador ? Exerccio 4 Como podemos criar uma referncia para um objeto em C#? D um exemplo. Exerccio 4 Explique os modificadores de acesso public, protected e private. Exerccio 5 Defina mtodo Construtor. Qual o nome que um Construtor deve ter? Exerccio 6 Explique o que sobrecarga de mtodos. Exerccio 7 Comente o cdigo abaixo linha por linha.
class Cliente { public string nome ; public int codigo ; } class TestaCliente { static void Main () { Cliente c1 = new Cliente(); c1.nome = " Rafael Cosentino "; c1.codigo = 1; Cliente c2 = new Cliente(); c2.nome = " Jonas Hirata "; c2.codigo = 2; System.Console.WriteLine(c1.nome ); System.Console.WriteLine(c1.codigo ); System.Console.WriteLine(c2.nome ); System.Console.WriteLine(c2.codigo );

} }

Exerccio 8 Seguindo o modelo de cdigo do exerccio 7, crie uma classe cartaoDeCredito, com os segintes atributos pblicos:

int numero string dataDeValidade

Crie a classe TestaCartaoDeCredito, que contm o mtodo principal (main). Instancie dois objetos, conforme abaixo: Objeto cdc1, numero = 111111, dataDeValidade = " 01/01/2013 "; Objeto cdc2 , numero = 222222, dataDeValidade = " 01/01/2014 ";

Imprima o nmero e a data de validade de cada carto.

22 EXERCCIOS COMPLEMENTARES 1. Implemente uma classe chamada Aluno para definir os objetos que representaro os alunos de uma escola. Essa classe deve declarar trs atributos: o primeiro para o nome, o segundo para o RG e o terceiro para a data de nascimento dos alunos. Faa uma classe chamada TestaAluno e crie dois objetos da classe Aluno atribuindo valores a eles. A classe tambm deve mostrar na tela as informaes desses objetos. Em uma escola, alm dos alunos temos os funcionrios, que tambm precisam ser representados em nossa aplicao. Ento implemente outra classe chamada Funcionario que contenha dois atributos: o primeiro para o nome e o segundo para o cargo dos funcionrios. Faa uma classe chamada TestaFuncionario e crie dois objetos da classe Funcionario atribuindo valores a eles. Mostre na tela as informaes desses objetos. Em uma escola, os alunos precisam ser divididos por turmas, que devem ser representadas dentro da aplicao. Implemente uma classe chamada Turma que contenha quatro atributos: o primeiro para o perodo, o segundo para definir a srie, o terceiro para sigla e o quarto para o tipo de ensino. Faa uma classe chamada TestaTurma para criar dois objetos da classe Turma. Adicione informaes a eles e depois mostre essas informaes na tela.

2. 3.

4. 5.

6.

TRABALHO EM GRUPO DE 4 ALUNOS ENTREGA: NO DIA DA PROVA1 O QUE DEVE SER ENTREGUE: ARQUIVO(S)FONTE, ARQUIVO EXECUTVEL (NO SGA) VALOR: 5 PONTOS 1. Em relao classe cTempo, dada em sala de aula, faa: Mude o status dos atributos para private; Acrescente o atributo privado segundo; Crie uma classe derivada da classe cTempo, chamada cTrataDatas. Nesta nova classe, faa: 1.1. Crie o mtodo pblico verifica_hora. Funo: Este mtodo recebe uma hora completa (inclusive os segundos) e faz a consistncia da hora, ou seja, se a hora est entre 0-23, e se o minuto e segundo esto entre 0-59. Entrada: hora, minuto e segundo Sada: true, se a data for vlida false, se a data for invlida. 1.2. Crie o mtodo pblico verifica_data. Funo: Este mtodo recebe uma data completa (dia, ms e ano) e faz a consistncia da data, ou seja, se o dia est entre 0-31, se o ms est entre 0-12 e se o ano est entre 19702099. No precisa verificar se ano bissexto. Entrada: dia, ms e ano Sada: true, se a data for vlida false, se a data for invlida. 1.3. Crie o mtodo pblico compara_horas. Funo: Este mtodo recebe duas horas completas e verifica se a primeira maior, menor ou igual a segunda. Entrada: hora1, minuto1, segundo1e hora2, minuto2, segundo2.

23 Sadas: 1, se hora1 > hora2 -1, se hora1 < hora2 0, se hora1 = hora2 1.4. Crie o mtodo pblico imprime_hora. Funo: Este mtodo recebe uma unidade de tempo em segundos (valor mximo que poder ser recebido 86399) e determina o tempo em horas, minutos e segundos. A seguir o mtodo imprime a hora no formato padro e no formato americano. Entrada: tempo (em segundos) Sada: true, se a hora fornecida vlida (< 86399) False, se a hora fornecida invlida (> 86399). Exemplos: Entrada : 72300 Impresso: 20 horas : 05 minutos : 00 segundos 8 horas PM : 05 minutos : 00 segundos Entrada : 21015 Impresso: 05 horas : 50 minutos : 15 segundos 05 horas AM : 50 minutos : 15 segundos Entrada : 10000 Impresso: hora invlida Entrada : 43285 Impresso: 12 horas : 01 minutos : 26 segundos 12 horas PM : 01 minutos : 26 segundos Entrada : 3285 Impresso: 00 horas : 54 minutos : 45 segundos 12 horas AM : 54 minutos : 45 segundos Dica: No formato americano tem-se de 0 11:59 da manh ser sempre AM (ante meridium antes do meio dia) e de 12:00 23:59 ser sempre PM (post-meridium 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 contrrio 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). 2.1. Crie um objeto da classe cTempo chamado tempo_1. Atualize a data com a data de hoje. Mostre a data. 2.2. Crie um objeto da classe cTrataDatas chamado hora_1. Este objeto receber trs valores de horas, conforme abaixo e dever ser verificado se as horas esto corretas. Hora 1: 13:24:65 Hora 2: 17:07:12 Hora 3: 24:60:15 O resultado deve ser mostrado somente no main, de acordo com o retorno do mtodo verifica_hora e da seguinte forma: A hora 1 est certa/errada. A hora 2 est certa/correta. A hora 3 est certa/errada. 2.3. Crie um objeto da classe cTrataDatas chamado data_1. Este objeto receber trs valores de datas, conforme abaixo e dever ser verificado se as datas esto corretas. Data 1: 30/06/-2000 Data 2: 23/15/2012 Data 3: 17/072012

24

O resultado deve ser mostrado somente no main, de acordo com o retorno do mtodo verifica_data e da seguinte forma: A data 1 est certa/errada. A data 2 est certa/correta. A data 3 est certa/errada. 2.4. Crie um objeto da classe cTrataDatas chamado tst_data para testar todos os mtodos da classe. Este objeto dever: 2.4.1. Receber a data 16/13/2100 e verificar se est correta. 2.4.2. Receber a hora 17:45:54 e verificar se est correta. 2.4.3. Receber as horas hora1: 23:15:45 e hora2: 12:17:34 e imprimir se so iguais, se hora1 e maior que a hora2 ou se a hora2 maior que a hora1, de acordo com o mtodo compara_horas. 2.4.4. Receber as unidades de tempo em segundos do item 1.4 e imprimir os valores corretos no formato padro e no formato americano, conforme os exemplos do item 1.4. 2.5. O que dever ser entregue: Os aquivos .cs, .exe do programa, e um arquivo com telas de impresso de todos os resultados. 3. Arquivos de grupos diferentes idnticos ou parcialmente idnticos sero anulados.

25

2. TIPO ABSTRATO DE DADOS


2.1. LISTAS LINEARES
Uma das formas mais simples de interligar os elementos de um conjunto. Estruturas em que as operaes inserir retirar e localizar so definidas para qualquer posio. Podem crescer ou diminuir de tamanho durante a execuo de um programa, de acordo com a demanda. Duas listas podem ser concatenadas para formar uma lista nica, ou uma pode ser partida em duas ou mais listas Adequadas quando no possvel prever a demanda por memria, permitindo a manipulao de quantidades imprevisveis de dados, de formato tambm imprevisvel.

Uma lista uma seqncia de 0 ou mais itens x1, x2, . . . , xn onde o o xi de um determinado tipo n representa o tamanho da lista linear

Exemplos: Agenda telefnica Lista de alunos Relao de peas de um carro Lista de passageiros de um vo Lista de processos em um SO

TAD LISTA= Tipo abstrato de dados


o conjunto de operaes a ser definido e depende de cada aplicao. Um conjunto de operaes necessrio a maioria das aplicaes :
Criar uma lista linear vazia. Inserir um novo item imediatamente aps o i-simo item. Retirar o i-simo item. Localizar o i-simo item para examinar e/ou alterar o contedo de seus componentes. Combinar duas ou mais listas lineares em uma lista nica. Partir uma lista linear em duas ou mais listas. Fazer uma cpia da lista linear. Ordenar os itens da lista em ordem ascendente ou descendente, de acordo com alguns de seus componentes. Pesquisar a ocorrncia de um item com um valor particular em algum componente.

Vrias estruturas de dados podem ser usadas para representar listas lineares, cada uma comvantagens e desvantagens particulares _ As duas representaes mais utilizadas so as implementaes por meio de arranjos(vetores) e de estruturas auto-referenciadas (encadeadas na memria). Exemplo de Conjunto de Operaes: criaLista(): cria uma lista vazia. insere(x): insere x aps o ltimo item da lista. retira(x): remove o item x da lista. vazia(): esta funo retorna true se a lista est vazia e false caso contrrio. imprime(): imprime os itens da lista na ordem de ocorrncia

26

IMPLEMENTAO DE LISTAS LINEARES


A lista constituda de clulas. Cada item da lista contm a informao que necessria para alcanar o prximo item. Permite utilizar posies no contguas de memria. possvel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista. H uma clula cabea para simplificar as operaes sobre a lista. Cada clula contm um item da lista e uma referncia para a clula seguinte.

LISTAS SEQUENCIAIS
Uma lista seqencial se, para cada componente da lista, o seu sucessor estiver armazenado na posio fsica seguinte da lista. Pode ser implementada atravs de vetores. o Desvantagens: O tamanho mximo da lista precisa ser conhecido e alocado antecipadamente. No pode ser utilizada em aplicaes onde no existe previso sobre o crescimento da lista. Inseres e remoes podem exigir considervel movimentao de dados aumentando assim, o custo dessas operaes. Vantagens: Simplicidade na implementao. Economia de memria.

LISTAS ENCADEADAS
Uma lista encadeada se os seus itens estiverem em posies no contguas de memria. Uma lista encadeada uma coleo de registros, onde cada registro possui um item e um campo do tipo apontador responsvel em indicar o endereo do registro seguinte da lista.

27 Desvantagens: o Complexidade na implementao em relao lista seqencial. o Utilizao de memria extra para armazenar os apontadores. Vantagens: o O tamanho da lista no precisa ser conhecido antecipadamente; ou seja, a lista encadeada deve ser utilizada em aplicaes onde no existe previso sobre o crescimento da lista. o Inseres e remoes ocorrem a um custo constante.

Nodo Cabea

Para criar a lista, pode-se implementar com vetores ou ponteiros, e ento escrever todo o cdigo. Uma outra alternativa utilizar uma classe pronta. No C# existe uma classe para criao e manipulao dos elementos de uma lista. a classe List.

2.2. COLEES
Um das partes mais importantes do .NET Framework so colees, que so um grupo de objetos. framework .NET contm um grande nmero de colees. Colees simplificam muito a tarefa de programao, pois implementam a maioria das estruturas utilizadas, liberando o programador da tarefa rdua de codificar todas as funcionalidades de uma coleo, como a lista, por exemplo. Algumas colees disponveis na plataforma .NET: List (Lista) Array ArrayList Queue (Fila) Stack (Pilha) Hashtable SortedList

As colees no genricas do C# so declaradas em System.Collections. Colees genricas so declaradas em System.Collections.Generic. Abaixo uma descrio dos mtodos gerais destas colees.

28

A classe List derivada destas colees, e portanto herda os mtodos. Alm disso, possui seus prprios mtodos.

2.3. O loop foreach


O loop foreach usado para acessar os elementos de uma coleo ( collection) do C#. Uma coleo um grupo de objetos, como por exemplo, uma lista, pilha ou fila.. C# define vrios tipos de colees, das quais uma um array (vetor). A forma geral do foreach : foreach(type loopvar in collection) statement; O loop foreach trabalha da seguinte maneira: quando o loop comea, o primeiro elemento da coleo obtido e copiado em loopvar. Cada iterao subseqente obtm o prximo elemento da coleo e armazena em loopvar. O loop termina quando no existem mais elementos para se obter. Assim, foreach percorre todo da coleo, do incio ao fim. Um ponto importante que a varivel loopvar s pode ser lida. Isto significa que voc no pode mudar os contedos da coleo usando o foreach. Aqui temos um exemplo simples que usa foreach. Ele cria um vetor de inteiros com valores iniciais. O foreach usado para mostrar esses valores, computando a soma dos elementos.

29

using System; class ForeachDemo { static void Main() { int sum = 0; int[] nums = new int[10]; // preenchendo o vetor nums for(int i = 0; i < 10; i++) nums[i] = i; // Usando foreach para mostrar e somar os valores de nums: foreach(int x in nums) { Console.WriteLine("Valor e: " + x); sum += x; } Console.WriteLine("Soma: " + sum); } } Sada Valor Valor Valor Valor Valor Valor Valor Valor Valor Valor Soma: do Programa: e : 0 e : 1 e : 2 e : 3 e : 4 e : 5 e : 6 e : 7 e : 8 e : 9 45

O exemplo a seguir mostra o uso da classe List, onde o loop foreach usado.
// Demonstrao de List<T>. using System; using System.Collections.Generic; class ListDemo { static void Main() { // Cria uma lista de inteiros List<int> lst = new List<int>(); Console.WriteLine("Numero inicial de elementos: " + lst.Count); Console.WriteLine(); Console.WriteLine("Adicionando 5 elementos"); lst.Add(1); lst.Add(-2); lst.Add(14); lst.Add(9); lst.Add(88); Console.WriteLine("Numero de elementos: " + lst.Count); // Mostra a lista usando ndices. Console.Write("Conteudos: "); for(int i=0; i < lst.Count; i++) Console.Write(lst[i] + " "); Console.WriteLine("\n"); Console.WriteLine("Removendo 2 elementos"); lst.Remove(-2); lst.Remove(88); Console.WriteLine("Numero de elementos: " + lst.Count); //Percorrendo a lista usando foreach Console.Write("Conteudos: "); foreach(int i in lst) Console.Write(i + " "); Console.WriteLine("\n");

30

Console.WriteLine("Adicionando 10 elementos para forcar a lista a crescer."); for(int i=0; i < 10; i++) lst.Add(i); Console.WriteLine("Numero de elementos apos adicionar 10: " + lst.Count); Console.Write("Conteudos: "); foreach(int i in lst) // para cada inteiro i na lista lst faa Console.Write(i + " "); Console.WriteLine("\n"); Console.WriteLine("Mudando os 3 primeiros elementos"); lst[0] = -10; lst[1] = -lst[1]; lst[2] = 99; Console.Write("Conteudos: "); foreach(int i in lst) Console.Write(i + " "); Console.WriteLine(); } }

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

TAD LISTA EXEMPLO USANDO ESTRUTURAS


Em C# as estruturas (struct) so mais versteis do que em outras verses do C. Como sabemos, classes so tipos referncia, diferente dos tipos valor, que so acessados diretamente. Entretanto, pode ser til algumas vezes acessar um objeto diretamente, por valor, do mesmo modo os tipos valor so. Uma razo para isto a eficincia. Acessar um objeto atravs de referncia introduz uma sobrecarga em cada processo. Alm disso, espao de memria gasto. Para cada pequeno objeto, este espao extra pode ser significante. Para evitar estes inconvenientes, C# oferece a struct. Em C# uma struct semelhante a uma classe, mas um tipo valor, ao invs de um tipo referncia. Estruturas so declaradas usando a palavra reservada struct e so sintaticamente semelhantes s classes. Estruturas no podem herdar outras estruturas ou classes, ou ser base para outras estruturas ou classes. Como classes, os membros de uma struct podem ser mtodos e propriedades. Estruturas tambm podem definir construtores, mas no destrutores. Entretanto, no pode ser definido um construtor sem parmetros (default) para uma estrutura. Isto ocorre porque o C# define automaticamente um construtor default para todas as estruturas e este construtor default no 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 usado, o construtor chamado. Quando new no usado, o objeto ainda criado, mas no inicializado. Assim, qualquer inicializao dever ser feita manualmente. Por exemplo:

Entenda o cdigo abaixo:


// Demonstrando uma estrutura.
using System; // Define uma structura. struct 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", 1232.22); // construtor explicito Conta acc2 = new Conta(); // construtor default Conta acc3; // sem construtor Console.WriteLine(acc1.nome + " tem um saldo de " + acc1.saldo); Console.WriteLine(); if(acc2.nome == null) Console.WriteLine("acc2.nome e nullo."); Console.WriteLine("acc2.saldo e " + acc2.saldo); Console.WriteLine(); // acc3 deve ser inicializado antes do uso. acc3 = new Conta(); acc3.nome = "Maria"; acc3.saldo = 99.33; Console.WriteLine(acc3.nome + " tem um saldo de " + acc3.saldo); } }

A sada do programa ser: Tom tem um saldo de 1232.22 acc2.nome e null. acc2.saldo e 0 Maria tem um saldo de 99.33

Exerccio 1 Implementar em C# o cdigo de um aplicativo que faa o seguinte: 1. Crie uma classe cTurma 2. 3. Para guardar os dados de um aluno, crie uma propriedade do tipo struct chamada aluno (struct aluno), com os seguintes campos: matrcula, curso, CPF, nome, data do nascimento, endereo. Usando a Collection List, crie uma lista de alunos. Por exemplo, se a lista se chamar lstAlunos, teremos:
List<aluno> lstAlunos = new List<aluno>();

4.

Crie o atributo aln para guardar a estrutura aluno:


aluno aln = new aluno();

5.

Crie o mtodo cadastra: cadastra um aluno e insere em lstAlunos

32 6. Crie o mtodo imprime: imprime todos os alunos de lstAlunos a. b. c. Usando a classe cTurma, instancie um objeto chamado turmaAED e cadastre trs alunos (quaisquer dados) na turma. Imprima todos os alunos do objeto turmaAED. Aps testar o cdigo acima, crie o seguinte menu de opes (ele ser a base para o trabalho maior de laboratrio):
MENU DE OPCOES" [1] CADASTRA" [2] IMPRIME" [3] SAI" Opcao:

No main:

7. Teste o aplicativo inserindo um nmero aleatrio de alunos.

SOLUO PROPOSTA
using using using using System; System.Collections.Generic; System.Linq; System.Text;

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 uma lista onde cada elemento uma estrutura aluno List<aluno> lstAlunos = new List<aluno>(); // aln um atributo do tipo estrutura aluno usado para manipular os dados de um // aluno. uma variavel de uso geral, para cadastrar, imprimir, etc. aluno aln = new aluno(); public void cadastra() { Console.Clear(); Console.WriteLine("\n\t\t - CADASTRO DE ALUNO -"); Console.Write("\n Informe a matricula: "); aln.mat = int.Parse(Console.ReadLine()); Console.WriteLine("\n Informe o nome do passageiro: "); aln.nome = Console.ReadLine(); Console.Write("\n Informe o peso: "); aln.peso = double.Parse(Console.ReadLine()); // ao final do cadastro insere na turma lstAlunos.Add(aln);

33

public void imprime() { int i = 0; Console.Clear(); foreach (aluno al in lstAlunos) { i++; Console.WriteLine("\n\n\t\tALUNO [" + i + "]"); Console.Write("\n\t\tMATRICULA: "); Console.WriteLine(al.mat); Console.WriteLine("\t\tNOME: " + al.nome); Console.WriteLine("\t\tPESO: " + al.peso); } } // fim classe cAluno

class Program { static void Main(string[] args) { cTurma turmaAED = new cTurma(); // cadastrando trs alunos da turmaAED for(int i=0; i< 3; i++) turmaAED.cadastra(); // imprimindo a lista de alunos daturmaAED turmaAED.imprime(); } } Console.ReadKey();

34

2.4. TADA FILA


Uma fila um tipo especial de lista em que a operao de insero feita em uma extremidade da estrutura (conhecida como fim da fila) e a operao de remoo feita na outra extremidade da estrutura (conhecida como incio da fila). O modelo intuitivo de uma fila de espera em que as pessoas no incio da fila so servidas primeiro e as pessoas que chegam entram no fim da fila. Propriedade: O primeiro item inserido o primeiro item a ser retirado da fila. Assim, as filas so chamadas de Listas FIFO (first in, first out). Exemplos de operaes bsicas e necessrias sobre uma fila: Cria Fila(fila) Vazia (fila) : ver. se uma determinada fila est ou no vazia. Retorna um valor lgico indicando o estado da fila. Enfileira (x, fila) : insere um determinado item x em uma fila; a insero sempre feita no fim da fila. Desenfileira (fila, x) : retira o item do incio de uma fila; o item retirado retornado na varivel x. Tamanho (fila) : retorna a quantidade de itens teis de uma determinada fila. Mostra(): mostra (imprime) a fila

Filas Seqenciais
Uma fila seqencial se, para cada componente da fila, o seu sucessor estiver armazenado na posio fsica seguinte da fila. A implementao mais comum atravs de vetores.

Filas Encadeadas (usando Alocao Dinmica)


Uma fila encadeada se os seus itens estiverem em posies no contguas de memria. Assim, uma fila encadeada uma coleo de registros, onde cada registro possui um item e um campo do tipo apontador responsvel em indicar o endereo do registro seguinte da fila.

Nodo Cabea
Em C# para trabalharmos com filas usamos a classe embutida Queue. Queue<Tipo> uma coleo dinmica que cresce quando necessrio para acomodar os elementos que devem ser armazenados na fila (FIFO). Mtodos Principais: Para enfileirar objetos em uma fila: Enqueue( ) Para desenfileirar objetos de uma fila: Dequeue( ) Para retornar um objeto da fila sem remover: Peek( )

35
//Exemplo: Uso da classe Queue<T> para colocar elementos na fila. using System; using System.Collections.Generic; class QueueDemo { static void Main() { Queue<string> userQ = new Queue<string>(); Console.WriteLine(Colocando usuarios na fila.\n"); userQ.Enqueue("Eric"); userQ.Enqueue("Tom"); userQ.Enqueue("Ralph"); userQ.Enqueue("Ken"); Console.WriteLine(Retirando os usuarios da fila (FIFO).\n"); while(userQ.Count > 0) { Console.WriteLine(Elemento: " + userQ.Dequeue()); } Console.WriteLine("\A fila de usuarios esta vazia."); } } Sada 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.

2.5. TADA PILHA


Uma pilha um tipo especial de lista em que as operaes de insero e remoo so feitas apenas em uma nica extremidade da estrutura, conhecida como topo da pilha. Os itens de uma pilha esto 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. Propriedade: O ltimo item inserido o primeiro item a ser retirado da pilha. Assim, as pilhas so chamadas de Listas LIFO (last in, first out). Exemplos de operaes bsicas e necessrias sobre uma pilha: Cria Pilha Vazia(): verifica se uma determinada pilha est ou no vazia. Retorna um valor lgico indicando o estado da pilha. Empilha(x): insere um determinado item x em uma pilha; a insero sempre feita no topo da pilha. Desempilha(x): retira o item que est no topo de uma pilha; o item retirado retornado na varivel x. Tamanho(): retorna a quantidade de itens teis de uma determinada pilha. Mostra(): mostra (imprime) a pilha

Pilhas Seqenciais
Uma pilha seqencial se, para cada componente da pilha, o seu sucessor estiver armazenado na posio fsica seguinte da pilha. A implementao mais comum atravs de vetores.

36

Pilhas Encadeadas (usando Alocao Dinmica)


Uma pilha utilizando alocao dinmica utiliza ponteiros para encadear os elementos da pilha. Desta forma os elementos no precisam ficar em posies contguas de memria.

Devemos notar que no topo no empilhamos nenhum elemento. O topo utilizado somente para marcar o fim da pilha, e tambm chamado de nodo cabea (head node). O conceito de pilha pode ser utilizado em vrias situaes: No processamento de estruturas aninhadas de profundidade imprevisvel, pois a ordem de remoo da pilha garante que estruturas mais internas sero processadas antes das estruturas mais externas. Em editores de texto. Para anlise sinttica de expresses aritimticas. Para o controle de sequncia de chamadas de subrotinas (funces). Pode ser associado algoritmos recursivos. Em C# para trabalharmos com pilhas usamos a classe embutida Stack. Stack<Tipo> uma coleo dinmica que cresce quando necessrio para acomodar os elementos que devem ser armazenados na pilha (LIFO). Mtodos Principais: Para empilhar objetos em uma pilha: push( ) Para desempilhar objetos de uma pilha : pop( )
//Exemplo: Uso da classe Stack<T> para colocar elementos na pilha. using System; using System.Collections; public class SamplesStack { public static void Main() { Stack myStack = new Stack(); myStack.Push("Hello"); myStack.Push("World"); myStack.Push("!"); // Mostra as propriedades e valores da pilha criada.

37
Console.WriteLine( "myStack" ); Console.WriteLine( "\tCount: {0}", myStack.Count ); Console.Write( "\tValores na pilha:" ); PrintValues( myStack );

} Sada do programa: myStack Count: 3 Values: ! World

} public static void PrintValues( IEnumerable myCollection ) { foreach ( Object obj in myCollection ) Console.Write( " {0}", obj ); Console.WriteLine(); }

Hello

EXERCCIOS DE REVISO LISTA, FILA E PILHA


Exerccio 1 Qual a diferena entre as listas seqenciais e as listas encadeadas? Exerccio 2 Qual a diferena entre Pilhas, Filas e Listas em relao insero e remoo de elementos? Exerccio 3 Uma pilha implementa o mecanismo de insero/remoo: a) FIFO b) FIFA c) LIFO d) SIFO e) N.D.A.

Exerccio 4 Uma fila implementa o mecanismo de insero/remoo: a) FIFO b) FIFA c) LIFO d) SIFO e) N.D.A. Exerccio 5 No mtodo main de uma classe qualquer crie um objeto MyList representando uma lista encadeada de nmeros inteiros. Faa tambm as seguintes operaes: a) Iinserir os nmeros 10, 20, 30, 40, 50 b) Imprimir todos os nmeros da lista; c) Inserir o nmero 14 no fim da lista; d) Ler um nmero e inseri-lo no incio da lista. e) Ler um nmero e procur-lo na lista. Se o nmero estiver na lista, imprima: O nmero procurado est na lista; se no estiver na lista, imprimir O nmero procurado no est na lista. Exerccio 6 Utilizando o objeto MyList do exerccio 1, modifique o programa para se certificar que no pode ser adicionado elementos iguais a algum elemento j existente na lista. Exerccio 7 Implemente no mtodo main(...) de uma classe chamada TestaPilha, um programa que leia 15 nmeros e proceda, para cada um deles, como segue: se o nmero for par, insira-o na pilha; se o nmero lido for mpar, retire um nmero da pilha; Ao final, esvazie a pilha imprimindo os elementos.

38

Exerccio 8 No mtodo main(...) de uma classe chamada TestaPilha2, dadas duas pilhas (objetos N e P) respectivamente, ler diversos nmeros e, para cada um: se positivo, inserir na pilha P; se negativo, inserir na pilha N; se zero, retirar um elemento de cada pilha. Exerccio 9 Duas pilhas seqenciais numricas esto 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. Exerccio 10 O que ser impresso pelo programa abaixo: public static void main(String args[]) { Queue q = new Queue(); q.enqueue(1); q.enqueue(2); q.enqueue(3); q.enqueue(4); q.enqueue(5); Console.Writeline(q.dequeue()); Console.Writeline(q.dequeue()); Console.Writeline(q.dequeue()); Console.Writeline(q.dequeue()); q.enqueue(6); q.enqueue(7); q.enqueue(8); q.enqueue(9); q.print(); } Exerccio 11 Dado o estado inicial das pilhas p1, p2 e p3 na figura abaixo, mostre (desenhe as pilhas) o estado final dessas mesmas pilhas aps as operaes descritas no cdigo abaixo. Considere que p1, p2 e p3 sejam instncias da classe Stack (pilha com alocao seqencial) Caso no seja possvel realizar alguma operao, escreva que no foi possvel e ignore-a:

int temp = p1.pop(); p2.push(temp); p3.push(p1.pop()); p2.push(p1.pop()); temp = p1.pop(); p3.push(temp);

39

p1.push(p2.pop()); p3.push(p2.pop()); p3.push(p1.pop());


Exerccio 12 Suponha a existncia de uma pilha s de inteiros s e uma fila de inteiros q. Desenhe a ilustrao de s e q depois das seguintes operaes:
Stack s = new Stack (6); Queue q = new Queue (5); s.push (3); s.push(12); q.enqueue (5); q.enqueue (8); int x = s.pop(); s.push(2); q.enqueue (x); s.push(x);

Desenhe o resultado do que pedido, de acordo com o estado inicial das estruturas definidas no cdigo abaixo:
a) b) c) d) e) s.push(q.dequeue()); s.push(q.getFirst()); q.enqueue(q.dequeue()); s.push(s.pop()); q.enqueue(s.pop());

Stack s = new Stack (7); Queue q = new Queue (7); s.push(2); s.push(3); q.enqueue(1); q.enqueue(2); q.enqueue(4);

Exerccio 13 Utilizando o TAD fila, considere F uma fila no vazia e P uma pilha vazia. Usando apenas a varivel temporria x e as quatro operaes desempilha, empilha, desenfileira, enfileira e vazia, escreva um algoritmo para reverter a ordem dos elementos em F. Exerccio 14 Usando as classes LIST e STACK, e considerando que a fila abaixo j est preenchida, pedese: fila original = 24 8 13 2 40 1. Escreva um algoritmo para inverter a ordem dos elementos da fila. fila aps o algoritmo: 40 2 13 8 24 2. Implemente o algoritmo como chamadas de mtodos das classes LIST e STACK no main. Exerccio 15 Fazer um programa em C# para concatenar duas pilhas de inteiros e produzir uma terceira, mantendo a ordem. Por exemplo: P1 P2 P3 4 5 6 7 8 12 9 16 8 12 9 16 4 5 6

40 7 Exerccio 16 Fazer um programa para retirar todos os nmeros mpares de uma lista j preenchida e armazenar estes nmeros mpares em outra lista. Mostrar ambas as listas. Exerccio 17 Exerccio de Programao
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=0. b) Crie um mtodo inic_hora que recebe a hora, os minutos e os segundos e atualiza as propried. da classe. c) Crie um mtodo obtem_hora que retorna a hora, os minutos e os segundos. c) Crie um mtodo print que imprime a hora, os minutos e os segundos no formato HH:MM:SS. d) Crie um mtodo diff que receba dois valores de horas e retorna o nmero de segundos entre elas. e) Escreva um programa main correspondente que faa o seguinte (seguir a ordem indicada): 1. Instancia um objeto da classe cHora; 2. Imprime a hora completa armazenada na classe; 3. Solicita a hora completa do usurio e atualiza as propriedades da classe; 4. Imprime a hora completa armazenada na classe; 5. Solicita um valor de hora completa do usurio (diferente da hora armazenada no objeto) e retorna o nmero de segundos entre esta hora e a hora armazenada na classe. 2) Crie uma classe chamada math em C#. Voc dever fazer todo o projeto da classe. 3. Declarao da Classe 4. Implementao dos Mtodos 5. Teste da Classe. Especificao da Classe: 1. Sua classe dever conter a seguinte propriedade do tipo texto: mensagem;

2.

Sua classe dever conter os seguintes mtodos: 1. Mtodo construtor: atualiza a propriedade mensagem com um texto passado no main; imprime o texto. 2. area_quadrado:: recebe lado e devolve a rea do quadrado; 3. perimetro_quadrado:: recebe lado e devolve o permetro do quadrado 4. area_retangulo:: recebe base e altura e devolve a rea do retngulo; 5. perimetro_retngulo: recebe base e altura e devolve o permetro do retngulo; 6. area_crculo: recebe o raio e devolve a rea do crculo; 7. perimetro_crculo: recebe o raio e devolve o permetro.

Obs: estes 6 mtodos so 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 para: a. Instanciar trs objetos da classe math, chamados mathQuad, mathRet e mathCirc. Ao instanciar cada objeto, passar as mensagens Operaes com Quadrado, Operaes com Retngulo e Operaes com Crculo, respectivamente. b. Imprimir os seguintes resultados: i. rea do quadrado com lado=5.45 ii. Permetro do quadrado com lado=15.44 iii. rea do retngulo com base=3,67 e altura=5,67 iv. Permetro do retngulo especificado em iii v. rea do crculo com raio=7.7 vi. Permetro do crculo com raio=5,25

41
Obs: estas 6 operaes so muito simples, pois podem ser implementadas cada uma em apenas uma linha de cdigo, e alm disto, no existe entrada do usurio ou menu de opes. Portanto, se estiver ficando grande, pare e pense.

3) Utilizando o tipo abstrato de dados lista ( Classe List do C#), faa um programa para representar as peas de um automvel. Faa uma lista de estruturas. Cada elemento da lista deve ser do tipo da seguinte estrutura: 2. cdigo da pea (inteiro) 3. nome da pea (por exemplo, motor, volante, carburador, etc) 4. preo da pea 5. peso da pea 6. cor da pea a) Crie uma classe chamada CadastroDePeas. Esta classe dever ter os seguintes mtodos: I. CadastraPea II. PesquisaPea III. ImprimePea IV. ImprimeLista b) Seu programa deve exibir o seguinte menu de opes: 1 INSERIR PEA I. Solicitando todos os dados:cdigo, nome, preo, peso e cor e insere na lista 2 PESQUISAR PEA I. Pesquisar pelo cdigo. II. Se achou a pea, imprime o cadastro daquela pea; caso contrrio, mostra a mensagem: Pea Inexistente. 3 REMOVER PEA I. Solicita o cdigo da pea e remove a pea. Se a pea no estiver na lista, mostra a mensagem: Pea Inexistente. 4 IMPRIME LISTA I. Imprime toda a lista 5 Fazer um programa principal para testar sua classe, contendo o menu de opes acima. Crie duas listas. LstHonda e LstFiat. Insira 5 pelas em cada lista e mostre os resultados de todas as operaes do menu para cada lista. Mostrar as telas de testes.
Dica: coloque a estrutura que guarda os dados da pea fora da classe (antes de tudo). Desta maneira voc pode usar a estrutura tanto na classe quanto no main.

42

3. ALGORITMOS RECURSIVOS
Recurso uma tcnica fundamental no projeto de algoritimos eficientes: resolve-se um problema resolvendo verses menores do mesmo problema". (Sedgewick,1983) Na prtica, temos uma funo que chama ela mesma dentro do seu corpo, passando novos parmetros a cada chamada. Um programa recursivo deve ter uma condio de parada, ou seja, ele no pode chamar a si mesmo indefinidamente. Apesar de bvio, 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 recurso. Ex.: FORTRAN. A recurso pode levar a uma ineficincia inaceitvel. Algumas vezes necessrio retirar a recurso.

Recursividade Direta o Quando uma funo contm referncias explcitas a si mesmo. Recursividade Indireta o Quando uma segunda funo refere-se a um primeira, que o aciona. A cada chamada da funo uma nova rea de dados reservada para uso. Isto pode determinar o uso ou no da recursividade: o A quantidade de memria disponvel pode no ser suficiente para a profundidade da soluo recursiva.

3.1. Condies para aplicao da Recursividade


Quantidade de memria. O problema pode ser decomposto em subproblemas que representem instncias menores do que o original. O processo de decomposio deve ser finito e limitado, ou seja, a cada nova instncia o subproblema resultante menor, e o nmero de instncias no deve ser grande.

3.2. Problemas que Admitem Soluo Recursiva


Problemas que apresentem uma decomposio naturalmente recursiva em subproblemas da mesma classe, com o clculo do fatorial de um nmero. Problemas que tratam estruturas de dados naturalmente recursivas, como as listas encadeadas ou as rvores.

3.3. Problemas onde a Recurso no Indicada

43

Problemas que apresentam somente uma chamada recursiva no incio ou no final do conjunto de aes. o Uma soluo iterativa usando mais variveis pode resolver o problema. Problemas que apresentam crescimento exponencial no nmero de chamadas, com reclculo de valores: o Pode haver comprometimento de espao de memria.

Exemplo 1: Fatorial de um Nmero Natural


0! = 1 N! N*(N-1)!, para N >=1

Verso Iterativa
int fatorial(int N) { int i, F = 1; if(N == 0) F=1; else for(i=2; i <= N; i++) F= F*i; return(F); }

Verso Recursiva
int fatorial(int N) { int F; if(N==0) F=1; else F= N * fatorial(N-1); return(F); }

Observaes:
O algoritimo tem recursividade direta, pois chama diretamente a si prprio. Pelo menos para um valor (N=0), a funo definida em termos que no a envolvem. H uma sada da sequncia de chamadas recursivas (condio de parada).

Por exemplo, o fatorial de 5 pode ser acompanhado da seguinte maneira: 24 fat(5) => F1 = fat(4) => F2 = fat(3) => F3 = fat(2) => F4 = fat(1) => F5 = 5 * fat(4) = 120 6 4 * fat(3) = 24 2 3 * fat(2) = 6 1 2 * fat(1) = 2 1 1 * fat(0) = 1
// necessrio calcular o fatorial de 4. Assim // F1 fica aguardando o resultado de fat(4)

44

fat(0) => F6 = 1 (por definio)

Funcionamento:
Cada vez que feita uma chamada recursiva funo fatorial, uma cpia da varivel F criada na memria. So criadas 6 cpias de F (veja os subscritos). Cada cpia aguarda o resultado da sua chamada recursiva. Assim, F 1 est aguardando o resultado de F 2, F2 de F3, e assim sucessivamente. Aps o parmetro N atingir o valor zero, ocorre a condio de parada do algoritmo, e comea ento um processo de voltar com os resultados para as instncias anteriores da varivel F que esto aguardando os clculos. Somente quando todas as chamadas so resolvidas e o resultado de F 1 calculado, o valor 120 retornado para a funo que chamou o fatorial (por exemplo a funo main).

Exemplo 2: Srie de Fibonacci Termo: 0 1 2 3 4 5 6 7 Num. Fibonacci: 1 1 2 3 5 8 13 21 ...


Assim o termo de ndide 4 da srie tem o valor 5, o termo de ndice 7 tem o valor 21.
fibonacci(0) = fibonacci(1) = 1 fibonacci(N) fibonacci(N-1) + fibonacci(N-2), para N >= 2

Verso Iterativa
const int MAX = 25; int fibonacci(int N) { int i, F; int Fib[MAX]; Fib[i] = 1; Fib[2] = 1; for(i=2; i <= N; i++) Fib[i] = Fib[i-1] + Fib[i-2]; return(Fib[n]); }

Verso Recursiva
int fibonacci(int N) { int F; if(N == 0 || N == 1) F = 1; else F= fibonacci(N-1) + fibonacci(N-2); return(F); }

45

Exemplo: Fibonacci(4)
fibonacci(4)

5 2

3
fibonacci(3) +

fibonacci(2)

2
fibonacci(2) +

1
fibonacci(1) fibonacci(1)

1
+

1
fibonacci(0)

1
fibonacci(1)

1
+ fibonacci(0)

Observaes
O algoritmo tem recursividade direta, com duas chamadas recursivas. A recurso no bem empregada. Por exemplo, no acompanhamento do algoritmo acima, fibonacci de 2 calculado 2 vezes, fibonacci de 1 calculado 3 vezes e fibonacci de 0 calculado 2 vezes. O aumento da profundidade faz aparecer o reclculo do mesmo valor, o que leva a uma ineficincia do algoritimo. Assim, esta verso gasta muito tempo para valores de N acima de 40 e muita memria tambm.

3.4. Quando usar a Recursividade?


A resposta dever analisar as situaes em que: O problema estiver definido de forma recursiva; A profundidade da recurso for relativamente pequena; A converso para uma alternativa com iterao for complicada ou exigir o uso de memria auxiliar; A funo no constituir parte crtica do sistema, ou o tempo no for fator crtico para o desempenho.

EXERCCIOS 1. Determine o que faz a funo recursiva a seguir? Mostre o fluxo para n=5: int Recursiva(int n) { if(n <= 0) return 1; else return( Recursiva(n-1) + Recursiva(n-1) ); } 2. Qual o resultado da execuo do programa abaixo:

46

Exerccio 9 - Critique a seguinte funo recursiva: int XX (int n) { if (n == 0) return 0; else return XX((n/3)+1) + n; } Exerccio 1- - A srie de Fibonacci representada como 1 1 2 3 5 8 13 21 ... e definida como: fibonacci(0) = fibonacci(1) = 1 fibonacci(N) fibonacci(N-1) + fibonacci(N-2), para N >= 2 Onde N o n-simo elemento da srie. Assim para uma srie com 8 elementos (de 0 a 7), temos: elemento 0 1 elemento 1 1 elemento 2 2 elemento 3 3 elemento 4 5 elemento 5 8 elemento 6 13 elemento 7 21

Pede-se: Escreva a verso recursiva da Srie de Fibonacci. Faa o acompanhamento do algoritmo para o elemento 6 e comprove que seu valor 13.

47

4. ALGORITMOS DE ORDENAO
Devem rearranjar um conjunto de objetos em uma ordem ascendente ou descendente Ordenao de arquivos de registros que contm uma chave. Objetivo: Facilitar a posterior recuperao de itens no conjunto ordenado Ordenao Interna: o Todo o conjunto a ser ordenado pode ser alocado na memria interna do computador . Ordenao Externa: o Envolve arquivos compostos por um nmero de registros que maior do que a memria interna do computador pode armazenar

Fatores crticos nos mtodos de ordenao:


Eficincia o nmero de comparaes o nmero de trocas memria extra utilizada o nenhuma - ordenam na prpria estrutura o usam listas de ponteiros o usam cpia da estrutura a ser ordenada Mtodos Simples: o Seleo o Insero Mtodos Eficientes: o Shellsort o Quicksort o Heapsort

4.1. Ordenao Seleo Funcionamento:


o o o Selecione o menor item do vetor Troque-o com o item que est na primeira posio do vetor Repita a operao anterior para os n-1 itens restantes, depois para os n-2, at que reste apenas um elemento.

Implementao
void selecao (int A[], int n) { int i, j, min, aux; for (i=0 ; i < n-1; i++) { min = i; for (j= i+1; j < n; j++) { if (A[j] < A[min]) min = j; } aux = A[min]; A[min] = A[i]; A[i] = aux;

48
} }

Vantagens:
simples; Pequeno nmero de movimentao de registros Indicado para arquivos com registros grandes

Desvantagens:
Custo quadrtico No sensvel ordenao inicial Indicado para arquivos pequenos

4.2. Ordenao Insero Funcionamento


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

Implementao
void Insercao (int A[], int n) { int i, j, v; for (i= 1; i < n; i++) { v = A[i]; A[0]= v; {sentinela} j= i; while (A[j-1] > v) { A[j] = A[j-1]; j--; } A[j] = v; } }

Vantagens:
simples; O tempo linear qdo o arquivo j est ordenado Indicado qdo se deseja acrecentar poucos itens a um arquivo j ordenado

Desvantagens:
Custo quadrtico Grande nmero de movimentao de registros

4.2. Ordenao Quicksort


Proposto por Hoare em 1960 e publicado em 1962. o algoritmo de ordenao interna mais rpido que se conhece para uma ampla variedade de situaes. Provavelmente o mais utilizado. A idia bsica dividir o problema de ordenar um conjunto com n itens em dois sub-problemas menores.

49 Os problemas menores so ordenados independentemente. Os resultados so combinados para produzir a soluo final.

Funcionamento
A parte mais delicada do mtodo o processo de partio. O vetor v[esq..dir] rearranjado por meio da escolha arbitrria de um piv x. O vetor v particionado em duas partes: o Parte esquerda: chaves x. o Parte direita: chaves x.

Algoritmo para o particionamento:


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

Ao final, do algoritmo de partio:


1. 2. 3. Vetor v[esq..dir] est particionado de tal forma que: Os itens em v[esq], v[esq + 1], ..., v[j] so menores ou iguais a x; Os itens em v[i], v[i + 1], ..., v[dir] so maiores ou iguais a x.

Exemplo: vetor de inteiros

O piv x escolhido como sendo o elemento central: v[(i + j) / 2].

50

Implementao
void Particao(int a[],int esq, int dir, int &p, int &q) { int i, j, v, t; i = esq; j= dir; v = a[(i+j)/2]; //pivo do { while (v > a[i]) i++; while (v < a[j]) j--; if (i <= j) { t = a[i]; a[i] = a[j]; a[j] = t; i++; j--; } } while (i <= j); p = i; q = j; } void quicksort (int a[], int esq, int dir)

51
{ int i, j; Particao(a,esq,dir,&i,&j); if (esq < j) quicksort(a,esq,j); if (i < dir) quicksort(a,i,dir); }

Observaes
O anel interno da funo Partio extremamente simples.Razo pela qual o algoritmo QuickSort to rpido. Pior caso para o QuickSort O(n) = n2 O pior caso ocorre quando, sistematicamente, o piv escolhido como sendo um dos extremos de um arquivo j ordenado. Caso mdio de acordo com Sedgewick e Flajolet (1996, p. 17): O(n) 1,386n log n 0,846n Melhor caso para o QuickSort O(n) = n log n Ocorre quando o problema sempre divido em subproblemas de igual tamanho aps a partio.

Vantagens:
extremamente eficiente para ordenar arquivos de dados. Necessita de apenas uma pequena pilha como memria auxiliar. Requer O(n log n) comparaes em mdia (caso mdio) para ordenar n itens.

Desvantagens:
Tem um pior caso O(n2) comparaes. Sua implementao delicada e difcil: o Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados.

EXERCCIOS
1. Dada a sequncia de nmeros: 3 4 9 2 5 1 8 6 3 Ordene em ordem crescente utilizando o algoritmo de ordenao QuickSort, apresentado a sequncia dos nmeros a cada passo. Dada a funo abaixo, execute o algoritmo para o conjunto de seis chaves apresentadas a seguir. Voc deve mostrar passo a passo a evoluo do vetor at o algoritmo terminar. n o tamanho do vetor.

2.

void funcao(char A[], int n) { int i, j, min, aux; for (i=0 ; i < n-1; i++) { min = i; for (j= i+1; j < n; j++) if (A[j] < A[min]) min = j; } aux = A[min]; A[min] = A[i]; A[i] = aux;

Chaves iniciais: FUNCAO

52

3. Dada a funo ordena abaixo, pede-se:


Fazer o acompanhamento do algoritmo para a seguinte entrada de dados, mostrando a evoluo das variveis 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 funo ordena, justificando sua resposta.

void Ordena(int A[]) { int i,j,min,temp; 1 for (i=1; i<n; i++){ 2 min = i; 3 for (j=i+1; j<=n; j++) { 4 if (A[j] < A[min]) 5 min:=j; }; // Troca A[min] com A[i] 6 temp = A[min]; 7 A[min] = A[i]; 8 A[i] = temp; }; };

4. Para os algoritmos Seleo, Insero e Quicksort, responda:


Qual o comportamento (ordem de complexidade) de cada um em relao ao nmero de entradas (n)?

53

5. ALGORITMOS DE PESQUISA
Algoritmos de pesquisa tem por objetivo a eecuperao de informaes a partir de uma massa de dados armazenada. A informao dividida em registros, onde cada registro possui uma chave para ser usada na pesquisa. O objetivo da pesquisa encontrar uma ou mais ocorrncias de registros com chaves iguais chave de pesquisa Mtodos de pesquisa pesquisa seqencial pesquisa binria rvore binria hashing

5.1. PESQUISA SEQUENCIAL


o mtodo de pesquisa mais simples que existe. Funcionamento: a partir do primeiro elemento, pesquise seqencialmente at encontrar a chave procurada Indicado para tabelas com at 25 itens. Para pesquisar um conjunto de n elementos, temos: no melhor caso: 1 pesquisa (a chave procurada a primeira) no pior caso: n pesquisas (a chave procurada a ltima) no caso mdio: (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;

54
} Obs: este algoritmo utiliza a posio zero do vetor, que no deve ser usada.

5.2. PESQUISA BINRIA


Vantagem: Mtodo de pesquisa eficiente Indicado para tabelas mais estticas Desvantagem: A tabela deve estar ordenada Princpio: A idia iniciar a pesquisa pelo elemento que estiver no meio da tabela; se no for encontrado a, e a chave for menor, ento o elemento deve estar na primeira metade; se a chave for maior, ento a segunda metade deve cont-lo. O processo deve ser repetido at que a chave seja encontrada, ou reste apenas um registro cuja chave diferente da procurada.

Implementao:
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 > T[i]) esq = i + 1; else dir = i - 1; }while (x != T[i] && esq <= dir); if (x == T[i]) return i; else return 0; } }

EXERCCIOS
1. Considere a seguinte inicializao 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 seqencial com prottipo abaixo, e que use todas as posies do vetor elementos: int pesqSequencial(int v[ ], int numElem, int val) o algoritmo deve retornar o ndice onde se encontra o valor val, e caso no existir, devolve -1.

55

2. Utilizando o algoritmo de pesquisa binria, modifique este algoritmo e o algoritmo do exerccio 1 para que eles contabilizem o nmero de testes que efetuam. O que concluir em termos de complexidade algortmica? Analise os piores casos e trace grficos aproximados dos resultados para pesquisa dos seguintes vaores do vetor elementos: 14, 6, 27, 9, 7, 15, 7 3. Escreva uma verso recursiva do algoritmo de pesquisa binria. 4. - Utilizando o algoritmo de pesquisa binria 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 comparao if(x > T[i]) executada. 2. 3. Verificar se este valor corresponde ordem de complexidade (log n) Considere que o vetor comea em 1 e termina em n (no interfere no algoritmo)

5. Em um vetor com 25000 registros, quantos registros so comparados (aproximadamente) quando a chave que est sendo procurada no se encontra no vetor, considerando-se uma pesquisa binria? 6. Dada a seguinte seqncia de nomes (chaves): 0 1 2 3 4 5 6 7 8 ANA BIA CARLOS EDU JORGE MANOEL PAULO VALDIR ZLIA Faa uma anlise comparativa entre a eficincia da pesquisa seqencial e da pesquisa binria para este caso, considerando o nmero mdio de comparaes para cada caso.

Você também pode gostar