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

Tipo Abstrato de Dados

David Menotti
Algoritmos e Estruturas de Dados II
DInf - UFPR

David Menotti Algoritmos e Estruturas de Dados II


Qual a diferena entre um
algoritmo e um programa?

David Menotti Algoritmos e Estruturas de Dados II


Algoritmos e Estruturas de Dados
Algoritmo:
Sequncia de aes executveis para a soluo
de um determinado tipo de problema
Exemplo: Receita de Bolo
Em geral, algoritmos trabalham sobre
Estruturas de Dados
Conjunto de dados que representa uma
situao real
Abstrao da realidade
Estruturas de Dados e Algoritmos esto
intimamente ligados
David Menotti Algoritmos e Estruturas de Dados II
Representao dos Dados
Os dados podem estar representados
(estruturados) de diferentes maneiras
Normalmente, a escolha da representao

determinada pelas operaes que sero


utilizadas sobre eles
Exemplo: nmeros inteiros
Representao por palitinhos: II + IIII = IIIIII
Boa para pequenos nmeros (operao simples)
Representao decimal: 1278 + 321 = 1599
Boa para nmeros maiores (operao complexa)

David Menotti Algoritmos e Estruturas de Dados II


Programas
Um programa uma formulao concreta de
um algoritmo abstrato, baseado em
representaes de dados especficas
Os programas so feitos em alguma
linguagem que pode ser entendida e seguida
pelo computador
Linguagem de mquina
Linguagem de alto nvel (uso de compilador)
Aqui vamos utilizar a Linguagem C

David Menotti Algoritmos e Estruturas de Dados II


Linguagem C

Criada no incio da dcada de 70 para a


programao do sistema operacional Unix
Uma das linguagens mais utilizadas no
mundo, e serviu como base para outras
como C++, C#, etc.

David Menotti Algoritmos e Estruturas de Dados II


Exemplo
#include<stdio.h> int main() {
#define MAX 10 int v[10], cont, aux, i, soma;
int LeInteiro() { double media;
int num; cont = 0;
printf(Digite um numero: "); aux = LeInteiro();
scanf("%d", &num); while(aux >= 0) {
printf("\n"); v[cont] = aux;
return num; aux = LeInteiro();
} cont++;
}
soma = 0;
for(i=0;i<cont;i++)
soma += v[i];
media = soma / (double) cont;
printf("resultado: %lf\n",media);
}

David Menotti Algoritmos e Estruturas de Dados II


Tipos Abstratos de Dados (TADs)
Agrupa a estrutura de dados juntamente com
as operaes que podem ser feitas sobre
esses dados
O TAD encapsula a estrutura de dados. Os
usurios do TAD s tem acesso a algumas
operaes disponibilizadas sobre esses dados
Usurio do TAD x Programador do TAD
Usurio s enxerga a interface, no a
implementao

David Menotti Algoritmos e Estruturas de Dados II


Tipos Abstratos de Dados (TADs)
Dessa forma, o usurio pode abstrair da
implementao especfica.

Qualquer modificao nessa implementao


fica restrita ao TAD

A escolha de uma representao especfica


fortemente influenciada pelas operaes a
serem executadas

David Menotti Algoritmos e Estruturas de Dados II


Exemplo: Lista de nmeros inteiros
Operaes
Faz Lista Vazia
Insere nmero no comeo da lista
Remove de uma posio i

Implementao por Vetores: 20 13 02 30 Programa usurio do TAD:

void Insere(int x, Lista L) { int main() {


for(i=0;...) {...} Lista L;
L[0] = x; int x;
}
x = 20;
Implementao por Listas Encadeadas FazListaVazia(L);
Insere(x,L);
20 13 02 30
...
}
void Insere(int x, Lista L) {
p = CriaNovaCelula(x);
L.primeiro = p;
...
}
David Menotti Algoritmos e Estruturas de Dados II
Implementao de TADs
Em linguagens orientadas a objeto (C++, Java) a
implementao feita atravs de classes
Em linguagens estruturadas (C, pascal) a
implementao feita pela definio de tipos
juntamente com a implementao de funes
Como vocs no viram o conceito de orientao a
objetos*, vamos utilizar os conceitos de C
(typedef e structs)
Orientao a objetos (classes, etc) vai ser vista em
outras disciplinas (POO)

David Menotti Algoritmos e Estruturas de Dados II


Estruturas (Structs) em C / C++
Uma estrutura uma coleo de uma ou mais
variveis, possivelmente de tipos diferentes,
colocadas juntas sob um nico nome para
manipulao conveniente
Por exemplo, para representar um aluno so
necessrias as informaes nome, matrcula, conceito
Ao invs de criar trs variveis, possvel criar uma
nica varivel contendo trs campos.
Em C, usa-se a construo struct para representar
esse tipo de dado

David Menotti Algoritmos e Estruturas de Dados II


Estruturas (Structs) em C
#include <stdio.h>
#include <string.h>

struct Aluno {
char nome[20];
int matricula;
char conceito; Pedro
al:
}; 200712 A

main() {
struct Aluno al, aux; Pedro
aux:
200712 A
strcpy(al.nome,Pedro);
al.matricula = 200712;
al.conceito = A;
aux = al;
printf(%s,aux.nome);
}

David Menotti Algoritmos e Estruturas de Dados II


Declarao de Tipos
Para simplificar, uma estrutura ou mesmo
outros tipos de dados podem ser definidos
como um novo tipo
Uso da construo typedef
typedef struct { int main() {
string nome; TipoAluno al;
int matricula; Vetor v;
char conceito;
} TipoAluno; ...
}

typedef int[10] Vetor;

David Menotti Algoritmos e Estruturas de Dados II


TADs em C
Para implementar um Tipo Abstrato de Dados
em C, usa-se a definio de tipos juntamente
com a implementao de funes que agem
sobre aquele tipo

Como boa regra de programao, evita-se


acessar o dado diretamente, fazendo o
acesso s atravs das funes
Mas, diferentemente de C++ e Java, no h uma
forma de proibir o acesso.
David Menotti Algoritmos e Estruturas de Dados II
TADs em C
Uma boa tcnica de programao
implementar os TADs em arquivos separados
do programa principal
Para isso geralmente separa-se a declarao
e a implementao do TAD em dois arquivos:
NomeDoTAD.h : com a declarao
NomeDoTAD.c : com a implementao
O programa ou outros TADs que utilizam o seu
TAD devem dar um #include no arquivo .h
David Menotti Algoritmos e Estruturas de Dados II
Exemplo
Implemente um TAD ContaBancaria, com os
campos nmero e saldo onde os clientes
podem fazer as seguintes operaes:
Iniciar uma conta com um nmero e saldo inicial
Depositar um valor
Sacar um valor
Imprimir o saldo

Faa um pequeno programa para testar o


seu TAD
David Menotti Algoritmos e Estruturas de Dados II
ContaBancaria.h
// definio do tipo
typedef struct {
int numero;
double saldo;
} ContaBancaria;

// cabealho das funes


void Inicializa (ContaBancaria*, int, double);
void Deposito (ContaBancaria*, double);
void Saque (ContaBancaria*, double);
void Imprime (ContaBancaria);

David Menotti Algoritmos e Estruturas de Dados II


ContaBancaria.c
#include <stdio.h>
#include "Contabancaria.h"

void Inicializa(ContaBancaria* pconta, int numero, double saldo)


{
pconta->numero = numero;
pconta->saldo = saldo;
}

void Deposito (ContaBancaria* pconta, double valor) {


pconta->saldo += valor;
}

void Saque (ContaBancaria* pconta, double valor) {


pconta->saldo -= valor;
}

void Imprime (ContaBancaria conta) {


printf("Numero: %d\n", conta.numero);
printf("Saldo: %f\n", conta.saldo);
}
David Menotti Algoritmos e Estruturas de Dados II
Main.c
#include<stdio.h>
#include<stdlib.h>
#include "ContaBancaria.h"

int main (void)


{
ContaBancaria conta1;
Inicializa(&conta1, 918556, 300.00);
printf("\nAntes da movimentacao:\n ");
Imprime(conta1);
Deposito(&conta1, 50.00);
Saque(&conta1, 70.00);
printf("\nDepois da movimentacao:\n ");
Imprime (conta1);

system("PAUSE");
return(0);
}

David Menotti Algoritmos e Estruturas de Dados II


Exerccio
Implemente um TAD Nmero Complexo
cada nmero possui os campos real e imaginrio
Implemente as operaes:
Atribui: atribui valores para os campos
Imprime: imprime o nmero da forma R + Ci
Copia: Copia o valor de um nmero para outro
Soma: Soma dois nmeros complexos
EhReal: testa se um nmero real

Faa um pequeno programa para testar o


seu TAD
David Menotti Algoritmos e Estruturas de Dados II