Aula 1 Tipo Abstrato de Dados David Menotti
Aula 1 Tipo Abstrato de Dados David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Qual a diferença entre um algoritmo e um programa? © David Menotti Algoritmos e Estrutura de Dados I
Algoritmos e Estruturas de Dados n Algoritmo: q q q n Sequência de ações executáveis para a solução de um determinado tipo de problema Exemplo: “Receita de Bolo” Em geral, algoritmos trabalham sobre Estruturas de Dados Conjunto de dados que representa uma situação real q q Abstração da realidade Estruturas de Dados e Algoritmos estão intimamente ligados © David Menotti Algoritmos e Estrutura de Dados I
Representação dos Dados Os dados podem estar representados (estruturados) de diferentes maneiras n Normalmente, a escolha da representação é determinada pelas operações que serão utilizadas sobre eles n Exemplo: números inteiros n q Representação por palitinhos: II + IIII = IIIIII q q Boa para pequenos números (operação simples) Representação decimal: 1278 + 321 = 1599 q © David Menotti Boa para números maiores (operação complexa) Algoritmos e Estrutura de Dados I
Programas n n Um programa é uma formulação concreta de um algoritmo abstrato, baseado em representações de dados específicas Os programas são feitos em alguma linguagem que pode ser entendida e seguida pelo computador q q Linguagem de máquina Linguagem de alto nível (uso de compilador) q © David Menotti Aqui vamos utilizar a Linguagem C Algoritmos e Estrutura de Dados I
Linguagem C Criada no início da década de 70 para a programação do sistema operacional Unix n Uma das linguagens mais utilizadas no mundo, e serviu como base para outras como C++, C#, etc. n © David Menotti Algoritmos e Estrutura de Dados I
Exemplo #include<stdio. h> #define MAX 10 int Le. Inteiro() { int num; printf(“Digite um numero: "); scanf("%d", &num); printf("n"); return num; } © David Menotti int main() { int v[10], cont, aux, i, soma; float media; cont = 0; aux = Le. Inteiro(); while(aux >= 0) { v[cont] = aux; aux = Le. Inteiro(); cont++; } soma = 0; for(i=0; i<cont; i++) soma += v[i]; media = soma / (float) cont; printf("resultado: %fn", media); } Algoritmos e Estrutura de Dados I
Tipos Abstratos de Dados (TADs) n Agrupa a estrutura de dados juntamente com as operações que podem ser feitas sobre esses dados n O TAD encapsula a estrutura de dados. Os usuários do TAD só tem acesso a algumas operações disponibilizadas sobre esses dados n Usuário do TAD x Programador do TAD q Usuário só “enxerga” a interface, não a implementação © David Menotti Algoritmos e Estrutura de Dados I
Tipos Abstratos de Dados (TADs) n Dessa forma, o usuário pode abstrair da implementação específica. n Qualquer modificação nessa implementação fica restrita ao TAD n A escolha de uma representação específica é fortemente influenciada pelas operações a serem executadas © David Menotti Algoritmos e Estrutura de Dados I
Exemplo: Lista de números inteiros n Operações q q q Faz Lista Vazia Insere número no começo da lista Remove de uma posição i 20 13 02 30 Implementação por Vetores: void Insere(int x, Lista L) { for(i=0; . . . ) {. . . } L[0] = x; } Programa usuário do TAD: int main() { Lista L; int x; x = 20; Faz. Lista. Vazia(L); Insere(x, L); . . . Implementação por Listas Encadeadas 20 13 02 30 void Insere(int x, Lista L) { p = Cria. Nova. Celula(x); L^. primeiro = p; . . . } © David Menotti } Algoritmos e Estrutura de Dados I
Implementação de TADs n Em linguagens orientadas por objeto (C++, Java) a implementação é feita através de classes n Em linguagens estruturadas (C, pascal) a implementação é feita pela definição de tipos juntamente com a implementação de funções n Como vocês não viram o conceito de orientação por objetos*, vamos utilizar os conceitos de C (Typedef e Structs) n Orientação por objetos (classes, etc) vai ser vista em outras disciplinas (POO) © David Menotti Algoritmos e Estrutura de Dados I
Estruturas (Structs) em C / C++ n Uma estrutura é uma coleção de uma ou mais variáveis, possivelmente de tipos diferentes, colocadas juntas sob um único nome para manipulação conveniente n Por exemplo, para representar um aluno são necessárias as informações nome, matrícula, conceito n Ao invés de criar três variáveis, é possível criar uma única variável contendo três campos. n Em C, usa-se a construção struct para representar esse tipo de dado © David Menotti Algoritmos e Estrutura de Dados I
Estruturas (Structs) em C / C++ #include<iostream> #include<string> using namespace std; struct Aluno { string nome; int matricula; char conceito; }; main() { struct Aluno al, aux; al: Pedro 200712 A aux: Pedro 200712 A al. nome = “Pedro” al. matricula = 200712; al. conceito = ‘A’; aux = al; cout << aux. nome } © David Menotti Algoritmos e Estrutura de Dados I
Declaração de Tipos n n Para simplificar, uma estrutura ou mesmo outros tipos de dados podem ser definidos como um novo tipo Uso da construção typedef struct { string nome; int matricula; char conceito; } Tipo. Aluno; int main() { Tipo. Aluno al; Vetor v; . . . } typedef int[10] Vetor; © David Menotti Algoritmos e Estrutura de Dados I
TADs em C n Para implementar um Tipo Abstrato de Dados em C, usa-se a definição de tipos juntamente com a implementação de funções que agem sobre aquele tipo n Como boa regra de programação, evita-se acessar o dado diretamente, fazendo o acesso só através das funções q Mas, diferentemente de C++ e Java, não há uma forma de proibir o acesso. © David Menotti Algoritmos e Estrutura de Dados I
TADs em C n Uma boa técnica de programação é implementar os TADs em arquivos separados do programa principal n Para isso geralmente separa-se a declaração e a implementação do TAD em dois arquivos: n q Nome. Do. TAD. h : com a declaração q Nome. Do. TAD. cpp : com a implementação O programa ou outros TADs que utilizam o seu TAD devem dar um #include no arquivo. h © David Menotti Algoritmos e Estrutura de Dados I
Exemplo n Implemente um TAD Conta. Bancaria, com os campos número e saldo onde os clientes podem fazer as seguintes operações: q q n Iniciar uma conta com um número e saldo inicial Depositar um valor Sacar um valor Imprimir o saldo Faça um pequeno programa para testar o seu TAD © David Menotti Algoritmos e Estrutura de Dados I
Conta. Bancaria. h // definição do tipo typedef struct { int numero; double saldo; } Conta. Bancaria; // cabeçalho das funções void Inicializa (Conta. Bancaria&, int, double); void Deposito (Conta. Bancaria&, double); void Saque (Conta. Bancaria&, double); void Imprime (Conta. Bancaria); // obs: A passagem por referencia (&) só existe em // c++. Em breve vamos ver como fazer em c © David Menotti Algoritmos e Estrutura de Dados I
Conta. Bancaria. cpp #include<stdio. h> #include"Contabancaria. h" void Inicializa(Conta. Bancaria &conta, int numero, double saldo) { conta. numero = numero; conta. saldo = saldo; } void Deposito (Conta. Bancaria &conta, double valor) { conta. saldo += valor; } void Saque (Conta. Bancaria &conta, double valor) { conta. saldo -= valor; } void Imprime (Conta. Bancaria conta) { printf("Numero: %dn", conta. numero); printf("Saldo: %fn", conta. saldo); } © David Menotti Algoritmos e Estrutura de Dados I
Main. cpp #include<stdio. h> #include<stdlib. h> #include "Conta. Bancaria. h" int main (void) { Conta. Bancaria conta 1; Inicializa(conta 1, 918556, 300. 00); printf("n. Antes da movimentacao: n "); Imprime(conta 1); Deposito(conta 1, 50. 00); Saque(conta 1, 70. 00); printf("n. Depois da movimentacao: n "); Imprime (conta 1); system("PAUSE"); return(0); } © David Menotti Algoritmos e Estrutura de Dados I
Exercício n Implemente um TAD Número Complexo q q cada número possui os campos real e imaginário Implemente as operações: q q q n Atribui: atribui valores para os campos Imprime: imprime o número da forma “R + Ci” Copia: Copia o valor de um número para outro Soma: Soma dois números complexos Eh. Real: testa se um número é real Faça um pequeno programa para testar o seu TAD © David Menotti Algoritmos e Estrutura de Dados I
- Slides: 21