Вы находитесь на странице: 1из 61

AED Algoritmos e Estruturas de Dados

Estruturas de dados em C++


(atualizado em 25/9/2007) Renato Fabiano Matheus, PUC Minas, 2007/2 Sistemas de Informao

Agenda
Viso geral Programao em C++ - C++ Programao orientada a objetos - POO Estruturas de dados AED
Pilhas Filas Listas Listas circulares Tabelas
AED / PUC Minas / 2007-2 25/9/2007 / 2

Agenda
Viso geral Programao em C++ - C++ Programao orientada a objetos - POO Estruturas de dados AED
Pilhas Filas Listas Listas circulares Tabelas
AED / PUC Minas / 2007-2 25/9/2007 / 3

Viso geral do mdulo


C++ POO AED
C++ AED

POO

AED / PUC Minas / 2007-2

25/9/2007 / 4

Agenda
Viso geral Programao em C++ Programao orientada a objetos - POO Estruturas de dados AED
Pilhas Filas Listas Listas circulares Tabelas
AED / PUC Minas / 2007-2 25/9/2007 / 5

C++ / Conceitos
Algoritmo = descrio de um padro de comportamento representado por um conjunto finito de aes. = representao abstrata da informao que pode ser tratada computacionalmente. = formulaes concretas de algoritmos abstratos, baseados em representao e estruturas especficas de dados. Representam classes especiais de algoritmos capazes de serem seguidos por computadores. Dado

Programa

PROGRAMA = ALGORITMO + ESTRUTURA DE DADOS

AED / PUC Minas / 2007-2

25/9/2007 / 6

C++ / Conceitos
Tipo de dado = especificao da classe de valores que podem ser associados a um dado, bem como das operaes que podem ser usadas para criar, acessar e modificar estes valores.
Tipos simples ou primitivos
Ex: inteiro, real, lgico, caractere
int contador = 0;

Tipos compostos ou estruturados = coleo de valores simples


Ex.: registros, arranjos, arquivos
struct _Cubo { int tamanhoAresta_cm; int calculaVolume(); }

Tipos definidos pelo usurio = tipos compostos definidos pelo usurio


Ex.: estruturas, classes

AED / PUC Minas / 2007-2

25/9/2007 / 7

C++ / Ambiente de desenvolvimento


Ambiente de desenvolvimento Bloodshed Dev-C++ http://www.bloodshed.net/devcpp.html

AED / PUC Minas / 2007-2

25/9/2007 / 8

C++ / A linguagem
A linguagem C um subconjunto da linguagem C++ C++ uma linguagem OO (Orientada a Objeto) Foi proposta por Bjarne Stroustrup (1997, p. 10) a partir da linguagem C (KERNIGHAN; RITCHIE, 1978)
http://www.research.att.com/~bs/homepage.html

AED / PUC Minas / 2007-2

25/9/2007 / 9

C++ / Programa mnimo


Inclui namespace std no namespace global. Evitando necessidade de prefixar: (e.g. std::cout) (STROUSTRUP, 1997, p. 117) Entrada e sada padro Incluso de arquivos de cabealhos de bibliotecas padro (STL) Assinatura da funo main Varivel nome do tipo string, definido na STL

Incio e fim de bloco


AED / PUC Minas / 2007-2 25/9/2007 / 10

C++ / namespace std


#include <iostream> int main (int argc, char* argv[]) { std::cout << "H e l l o , n e w w o r l d !\ n "; }

AED / PUC Minas / 2007-2

25/9/2007 / 11

C++ / Sintaxe
Sintaxe da linguagem C/C++ http://www.cprogramming.com/reference/ Referncia de library http://www.cplusplus.com/reference

AED / PUC Minas / 2007-2

25/9/2007 / 12

C++ / Sintaxe
Sensvel a maisculas e minsculas
A diferente de a INT no um tipo de dado vlido

Operadores
Lgicos: AND && OR || NOT EQUAL != EQUAL == Atribuio: = += -=

Comentrios
de linha: // de bloco: /* */
AED / PUC Minas / 2007-2 25/9/2007 / 13

C++ / Sintaxe
Ps e pr-incremento
++i--

Vetores e matrizes (ndices comeam pelo elemento 0)


int matriz[10][9]
Primeiro elemento matriz[0][0] ltimo elemento matriz[9][8]

AED / PUC Minas / 2007-2

25/9/2007 / 14

C++ / Sintaxe
Loops
// como no h blocos, s prximo comando est no loop for (cont = 0; cont < 100, sequencia[cont] != 0; cont++) soma += sequencia[cont]; cont = 0; do { sprintf( mensagem, "Qual o numero de ordem %d? ", cont + 1 ); sequencia[cont] = leNumero(mensagem); // Na primeira execuo da primeira comparao, cont // tem valor 0 e na segunda conta tem valor 1, devido // ao operador de ps-incremento ++ } while( cont++ < 100 && sequencia[cont] != 0 );
AED / PUC Minas / 2007-2

25/9/2007 / 15

C++ / Escopo de variveis


Declarao
pode acontecer em qualquer lugar onde um comando qualquer pode (STROUSTRUP, 1997, p. 14)

Escopo
Globais Locais

Modificadores de tipo
const static
AED / PUC Minas / 2007-2 25/9/2007 / 16

C++ / Tipos de variveis


Tipos de dados simples: string, int Tipos de dados estruturados, definidos pelo usurio

AED / PUC Minas / 2007-2

25/9/2007 / 17

C++ / Passagem de parmetros


Por valor
Dados simples so passados normalmente por valor Cria na pilha de parmetros da funo uma cpia da varivel original, que permanecer inalterada caso sejam feitas modificaes localmente.

Por ponteiros: modificador *


Passa o endereo para o mtodo.

Por referncia: modificador &


Cria na pilha de parmetros da funo uma varivel que na verdade aponta para mesmo endereo do parmetro original. Vetores so sempre passadas por referncia

Exemplos: projeto aed.dev


AED / PUC Minas / 2007-2 25/9/2007 / 18

C++ / Exemplos de parmetros


// Passagem por valor void imprimePontoPorValor( Ponto p1 ) { cout << "Por valor"; cout << "X = " << dec << p1.x << " Y = " << dec << p1.y << endl; p1.x += p1.x; p1.y += p1.y; } // Referncia altera void imprimePontoPorReferencia( Ponto& p1 ) { cout << "Por referncia"; cout << "X = " << dec << p1.x << " Y = " << dec << p1.y << endl; p1.x += p1.x; p1.y += p1.y; }
AED / PUC Minas / 2007-2 25/9/2007 / 19

C++ / Funes e mtodos versus procedimentos


Funes retornam valor Procedimentos no retornam (void) Assinatura de um mtodo/procedimento
Nome do mtodo Tipos e nomes dos parmetros Tipo de dado retornado

AED / PUC Minas / 2007-2

25/9/2007 / 20

C++ / Alocao de memria


Alocao esttica
Variveis Estruturas Vetores (arrays) e matrizes

Alocao dinmica
Ponteiros Endereo um valor, logo pode ser guardado na memria Apontador = varivel cujo valor um endereo da memria
Vantagens: otimiza o gerenciamento da memria, podendo tornar uma implementao mais eficiente Desvantagens: difcil de aprender a gerenciar sem erros a memria

AED / PUC Minas / 2007-2

25/9/2007 / 21

C++ / Exemplo de alocao


#include <cstdio> int x = 10; int *ptr = &x; void mostrar(){ cout << \nVariavel cout << \nEndereco cout << \nVariavel cout << \nConteudo *ptr; cout << \nEndereco &ptr; } void main(){ mostrar(); *ptr = 830; mostrar(); }

x: << x; de x: << &x; ptr: << ptr; de ptr: << de ptr: <<

Variavel Endereco Variavel Conteudo Endereco Variavel Endereco Variavel Conteudo Endereco

x:10 de x: F81A ptr: F81A de ptr: 10 de ptr: F84A x:830 de x: F81A ptr: F81A de ptr: 830 de ptr: F84A

AED / PUC Minas / 2007-2

25/9/2007 / 22

C++ / Exemplo de alocao


Suponha que cada caractere ocupe 1 byte. Se o valor atribudo a u armazenado no endereo F8C e o valor atribudo a v armazenado no endereo F8D, ento: Qual o valor representado por &v? Qual valor atribudo a pv? Qual valor representado por *pv? Qual valor atribudo a u? Qual valor representado por &u? Qual valor atribudo a pu? Qual valor representado por *pu?

#include<stdio.h> void main(){ char u, v = S; char *pu, *pv = &v; *pv = v + 1; u = *pv + 1; pu = &u; }

AED / PUC Minas / 2007-2

25/9/2007 / 23

C++ / versus C
Alocao dinmica de memria
C: malloc / free / realloc
Realocao de espaos

C++: new / delete


Coleta de lixo automtica em C++ (garbage collection) Uso de classe vector() da STL (Standard Template Library) para realocao dinmica

Otimizao
Evitar uso de macros, usar const (STROUSTRUP, 1997, p. 14)

Programao genrica em C++ (STROUSTRUP, 1997, p. 40)


Mtodos virtuais STL
String versus char[]

Sobreposio de mtodos

POO
Interfaces de classes e encapsulamento Construtores e destrutores
AED / PUC Minas / 2007-2 25/9/2007 / 24

C++ / Gerenciamento de memria


Sistema Operacional Cdigo do programa Dados Heap Pilha
Variveis automticas (funes e procedimentos)

Variveis globais e estticas Memria gerenciada dinamicamente

AED / PUC Minas / 2007-2

25/9/2007 / 25

POO / structures com mtodos e acesso a membros da estrutura


struct Ponto { int x; int y; // Funes void display(); }; Ponto p; p.x; p.y; p.display; Ponto *p = new Ponto; P->x; p->y; p->display.
AED / PUC Minas / 2007-2

Acesso a membros de estruturas estticas

Acesso a membros de estruturas dinmicas (ponteiros)


25/9/2007 / 26

POO / STL / strings


Classe string
#include <string> using std::string;
Mtodos
empty(), size(), length(), substr(), replace(), erase(), finde c_str()
converso de string para array de caracteres

Exemplos (projeto aed.dev)


string s = "abc def abc"; string s2 = "abcde uvwxyz"; char c; char ch[] = "aba daba do"; char *cp = ch; unsigned int i;

Fonte: http://www.bgsu.edu/departments/compsci/docs/string.html
AED / PUC Minas / 2007-2 25/9/2007 / 27

POO / STL / strings: exemplo


L at o separador espao cin >> s; L at o caractere ENTER getline(cin, s); Envia para sada padro cout << s; s = s2; s = "abc"; Um array, literal ou varivel podem ser atribudos diretamente a um string. ch ou cp tm mesmo efeito. s = ch; s = cp; s[1] = 'c'; Muda s para "acc def abc". Operador subscript retorna um char e no string. c = s[1]; i = s.length(); Ambos retornam tamanho de s i = s.size(); if(s.empty()) i++; Ambos adicionam 1 a i caso s esteja vazio. if(s == "") i++; Campara cdigo ASCII dos strings. If (s < s2) i++; s = s + "x"; Exemplos adicionam x ao fim de s s += "x"; S = s.substr(1,4); Retorna substring bc d.

s.replace(4,3,"x"); x abc". s.erase(4,5); s.erase(4); s = ch; cp = s.c_str();

Substitui 3 caracteres de s, a partir da posio 4, por x. Retorno "abc Apaga 5 caracteres da string a partir da posio 4. Converte array de caracteres para string Ponteiro cp passa a apontar um array de caracteres com o contedo equivalente a s.

i = s.find("ab",4); Retorna a posio do substring ab, comeando a busca na posio 4. if(s.rfind("ab",4) Se no encontrar, retorna unsigned int string::npos. != string::npos)
AED / PUC Minas / 2007-2 25/9/2007 / 28

POO / STL / math


Classe math
#include <cmath>

Funes
trigonomtricas (cos, sin, tan, aos, asin, atan, atan2); hiperblicas (cosh, sinh, tanh); exponencial e logartmicas (exp, frexp, ldexp, log, log10, modf); potencia (pow, sqrt); arredondamento e valor absoluto (ceil, fabs, floor, fmod)
Fonte: http://www.cplusplus.com/reference/clibrary/cmath/
AED / PUC Minas / 2007-2 25/9/2007 / 29

POO / STL / math


Distncia entre dois pontos
( x1 x 2 ) 2 + ( y1 y 2 ) 2

Distncia entre dois pontos em C++


sqrt(pow(x1 x2, 2) + pow(y1 y2, 2));

Exemplos: projeto aed-poo.dev

AED / PUC Minas / 2007-2

25/9/2007 / 30

C++ / Qualidade de cdigo


Legibilidade (clareza no cdigo)
Comentrios Nomes de mtodos e variveis Identao

Controle de fluxo
No usar goto (desvio incondicional) return s no final das funes Usar CONSTANTES e no nmeros mgicos

Exemplo: programa aed-qualidadecodigo

AED / PUC Minas / 2007-2

25/9/2007 / 31

C++ / Qualidade de cdigo


Acoplamento e coeso
Diviso em mdulos e funes, bem como classes, com uma nica funo
Permite concentrar a ateno em mdulos especficos em diferentes momentos Facilita a manuteno do programa Facilita a reutilizao do programa

Fatores externos
Eficincia Robustez Escalabilidade Interface

Documentao
AED / PUC Minas / 2007-2 25/9/2007 / 32

Agenda
Viso geral Programao em C++ - C++ Programao orientada a objetos - POO Estruturas de dados AED
Pilhas Filas Listas Listas circulares Tabelas
AED / PUC Minas / 2007-2 25/9/2007 / 33

POO / Princpios
Encapsulamento Herana
Permite definio de uma classe a partir de outro, facilitando a reutilizao de cdigo

Polimorfismo
Mtodos com mesmo nome mas cuja assinatura diferente, sendo qual ser usado de acordo com os tipos de parmetros e valor de retorno

AED / PUC Minas / 2007-2

25/9/2007 / 34

POO / Elementos
Classes
modelos para a criao de objetos
Animais so seres vivos:
O que podem fazer: Nascem, vivem, crescem e morrem Podem se movimentar Tm pai e me Quais caractersticas tm: Idade Peso

Atributos ou propriedades (caractersticas)


caractersticas dos objetos

Mtodos (o que podem fazer)


comportamento (aes) dos objetos da classe

Objetos
instncias de uma classe
AED / PUC Minas / 2007-2 25/9/2007 / 35

POO / Implementao em C++


Classes
Interfaces
Arquivo de cabealho contendo nome, propriedades e mtodos da classe, bem como suas assinaturas
Ex.: #include animal.h

Implementao
Arquivo contendo a implementao dos mtodos cuja assinatura definida na interface da classe Ex.:
animal.cpp

Construtores
Inicializao de objetos

Destrutores
Liberao de espao e controles
AED / PUC Minas / 2007-2 25/9/2007 / 36

POO / Implementao em C++


Visibilidade de mtodos e propriedades
public: private: protect:

Mtodos e propriedades de classe


static
Propriedades e mtodos da classe

AED / PUC Minas / 2007-2

25/9/2007 / 37

POO / Implementao em C++


Herana
Classe filho herda estrutura e comportamento da classe pai Tipos
Herana simples: uma classe pai Herana mltipla: mais de uma classe pai

Ex.:
class cachorro:animal { }

A classe derivada pode acessar os membros public e protected do pai Declarao da nova classe / herana
class <nova classe> : [private|public] <pai>

private: default public: tudo o que pblico aos utilizadores da classe pai, ser pblico para os utilizadores da classe filho, a no ser que seja sobrecarregado na funo filho.
AED / PUC Minas / 2007-2 25/9/2007 / 38

POO / Implementao em C++


Implementao de mtodos de classe
Mtodos virtual
virtual void movimentaAnimal();

Apontador this-> para propriedades do objeto


this->tamanho++; // usado dentro dos mtodos da classe

Exemplo: aed-Cubo.dev

AED / PUC Minas / 2007-2

25/9/2007 / 39

POO / Estruturas versus classes


Abstrao Variveis / propriedades Estrutura Sim Classe Sim Funes / mtodos Sim Sim Herana No Sim Escopo protect No Sim

Interface da classe
Nome da classe Propriedades da classe Assinatura dos mtodos e procedimentos da classe

AED / PUC Minas / 2007-2

25/9/2007 / 40

POO / Interface da classe (#include cubo. h)


class Cubo { private: int altura, largura, profundidade; public: Cubo( int, int, int ); ~Cubo(); int volume( void ); };

AED / PUC Minas / 2007-2

25/9/2007 / 41

POO / Implementao (Cubo.cpp)


#include cubo.h // Funo construtora Cubo::Cubo( int ht, int wd, int dp ) { altura = ht; largura = wd; profundidade = dp; } // Funo Destruidora Cubo::~Cubo() { // no faz nada } int Cubo::volume() { return altura * largura * profundidade; }
AED / PUC Minas / 2007-2 25/9/2007 / 42

Agenda
Viso geral Programao em C++ - C++ Programao orientada a objetos - POO Estruturas de dados AED
Pilhas Filas Listas Listas circulares Tabelas
AED / PUC Minas / 2007-2 25/9/2007 / 43

AED / Listas
Lista linear
Definio
Lista uma estrutura em que as operaes inserir, retirar e localizar so definidas. [...] Uma lista linear uma seqncia de zero ou mais itens x1, x2, ... Xn, na qual xi de um determinado tipo e n representa o tamanho da lista linear. (ZIVIANI, 2004, p. 63)

Operaes
Para se implementar uma lista linear necessrio um conjunto bsico de operaes
Lista.FazListaVazia() Lista.EstaVazia() Lista.Insere( x ) Lista.Retira( p, x ) Lista.Imprime()
AED / PUC Minas / 2007-2 25/9/2007 / 44

AED / Listas e Filas


Fila
Definio
Uma fila uma lista linear em que todas as inseres so realizadas em um extremo da lista, e todas as retiradas e, geralmente, os acessos so realizados no outro extremo da lista (ZIVIANI, 2004, p. 81)

Comportamento
FIFO First In First Out = Fila Primeiro a entrar, primeiro a sair (CORMEM et al., 2002, p. 163)
AED / PUC Minas / 2007-2 25/9/2007 / 45

AED / Listas e Pilhas


Pilha
Definio
Uma pilha uma lista linear em que todas as inseres, retiradas e, geralmente, todos os acessos so feitos em apenas um extremo da lista. (ZIVIANO, 2004, p. 72)

Comportamento
LIFO Last In Last Out = Pilha ltimo a entrar, primeiro a sair (CORMEM et al., 2002, p. 163)

AED / PUC Minas / 2007-2

25/9/2007 / 46

AED / Filas

AED / PUC Minas / 2007-2

25/9/2007 / 47

AED / Operaes simples


Operaes simples (sobre elementos)
Inserir Excluir Proximo Anterior Minimo Mximo

AED / PUC Minas / 2007-2

25/9/2007 / 48

AED / Operaes sobre a lista


Procurar elemento Inverter
Vetor Lista encadeada Lista duplamente encadeada

Ordenar (mtodo da bolha)


Vetor Matriz Lista encadeada / lista duplamente encadeada
AED / PUC Minas / 2007-2 25/9/2007 / 49

AED / Pilha
Implementao com vetor esttico Implementao com vetor dinmico Implementao com STL vector Implementao com alocao dinmica de clulas / lista encadeada linear

AED / PUC Minas / 2007-2

25/9/2007 / 50

AED / Pilha / Classe vector (STL)


Classe vector da Standard Template Library
#include <vector>

Declarao
vector<int> vec_one;

Desempilha
void pop(vector<int>& v) { v.erase( v.end()-1, v.end() ) ; }

Empilha
vec_one.push_back(9);
AED / PUC Minas / 2007-2 25/9/2007 / 51

AED / Lista duplamente encadeada (ou lista ligada)


Fonte: (CORMEM et al., 2002, p. 166)

AED / PUC Minas / 2007-2

25/9/2007 / 52

AED / Lista encadeada.h


// Tipo de dados de cada elemento individual da Pilha class ElementoLista { public: int codigo; ElementoLista* proximo; ElementoLista* anterior; }; //class ElementoLista

AED / PUC Minas / 2007-2

25/9/2007 / 53

AED / Lista encadeada.h


/* * No description */ class ListaEncadeada { private: int tamanho; ElementoLista* primeiro; ElementoLista* ultimo; public: // class constructor ListaEncadeada(); // class destructor ~ListaEncadeada(); int insereElemento( int codigo ); int obtemTamanho( int &tam ); int excluiElemento( int codigo ); ElementoLista* encontraElemento( int codigo ); // Mtodos de entrada e sada void ListaEncadeada::imprimeTamanho(); void ListaEncadeada::imprimeElementos(); void ListaEncadeada::imprimeMenu(); }; AED / PUC Minas / 2007-2

25/9/2007 / 54

AED / Lista circular


Sentinelas (CORMEM et al., 2002, p. 163) Lista circular implementada com lista encadeada

AED / PUC Minas / 2007-2

25/9/2007 / 55

AED / Lista circular com vetor


(ZIVIANI, 2004, p. 82)

AED / PUC Minas / 2007-2

25/9/2007 / 56

Resumo
O entendimento da linguagem (C++) e dos princpios da orientao a objetos, bem como das estruturas de dados bsicas, fundamental para a modelagem de problemas computacionais mais complexos.

AED / PUC Minas / 2007-2

25/9/2007 / 57

Glossrio
Variveis
Escopo Passagem de parmetros

Funes, procedimentos e mtodos TAD - tipo abstrato de dados AED - algoritmo e estrutura de dados
Programa + TADs

POO - programao orientada a objetos STL Standard Template Library


AED / PUC Minas / 2007-2 25/9/2007 / 58

Glossrio
OO: Orientada a Objeto

AED / PUC Minas / 2007-2

25/9/2007 / 59

Referncias
CORMEM; LEISERSON; RIVEST; STEIN. Algoritmos: teoria e prtica. Campus, 2002. STROUSTRUP, Bjarne. C++ Programming Language. 3ed. AddisonWesley, 1997. KERNIGHAN, Brian W.; RITCHIE, Dennis M. The C Programming Language. PrenticeHall.Englewood Cliffs, New Jersey. 1978.
AED / PUC Minas / 2007-2 25/9/2007 / 60

Onde obter mais informaes


Email
rfmatheus@yahoo.com.br

Homepage
http://rfmatheus.com.br/content/blogcategory/16/28/

LearnLoop
http://ww.inf.pucminas.br/learnloop

AED / PUC Minas / 2007-2

25/9/2007 / 61