O que é um algoritmo? Aula 1 – Tipo Abstrato de Dados

Luiz Chaimowicz e Raquel O. Prates O que é um programa? Livro “Projeto de Algoritmos” Capítulo 1

© R. O. Prates – 2009-1 © R. O. Prates DCC/UFMG DCC/UFMG

Algoritmos Programas • Sequência de ações executáveis para a • Um programa é uma formulação concreta solução de um determinado tipo de de um algoritmo abstrato, baseado em problema representações de dados específicas • Exemplo: “Receita de Bolo” • Os programas são feitos em alguma linguagem que pode ser entendida e seguida pelo computador – Linguagem de máquina – Linguagem de alto nível (uso de compilador) • Aqui vamos utilizar a Linguagem

© R. O. Prates © R. O. Prates DCC/UFMG DCC/UFMG Representação de Dados Representação dados

• Dados podem estar representados Seleção do que representar (estruturados) de diferentes maneiras • Normalmente, a escolha da representação é determinada pelas operações que serão Seleção de como representar utilizadas sobre eles Definição da estrutura de dados • Exemplo: números inteiros – Representação por palitinhos: II + IIII = IIIIII Limitação de representação • Boa para pequenos números (operação simples) – Representação decimal: 1278 + 321 = 1599 • Boa para números maiores (operação complexa)

© R. O. Prates © R. O. Prates DCC/UFMG DCC/UFMG

Estrutura de Dados Tipos Abstratos de Dados (TADs) • Estruturas de Dados • Agrupa a estrutura de dados juntamente com as – Conjunto de dados que representa uma operações que podem ser feitas sobre esses situação real dados – Abstração da realidade • O TAD encapsula a estrutura de dados. Os • Estruturas de Dados e Algoritmos usuários do TAD só tem acesso a algumas operações disponibilizadas sobre esses dados estão intimamente ligados • Usuário do TAD x Programador do TAD – Usuário só “enxerga” a interface, não a implementação

© R. O. Prates © R. O. Prates DCC/UFMG DCC/UFMG Exemplo: Lista de números inteiros Tipos Abstratos de Dados (TADs) • Dessa forma, o usuário pode abstrair da • Operações do TAD – Faz Lista Vazia implementação específica. – Insere número no começo da lista – Remove de uma posição i

Implementação por Vetores: 20 13 02 30 • Qualquer modificação nessa Programa usuário do TAD: implementação fica restrita ao TAD int main() { void Insere(int x, Lista L) { Lista L; for(i=0;...) {...} int x; L[0] = x; } x = 20; Implementação por Listas Encadeadas • A escolha de uma representação específica FazListaVazia(L); Insere(x,L); 20 13 02 30 é fortemente influenciada pelas operações ... } void Insere(int x, Lista L) { a serem executadas p = CriaNovaCelula(x); L->primeiro = p; © R. O. Prates © R. O. Prates ... DCC/UFMG DCC/UFMG }

Implementação de TADs Estruturas (Structs) em C / C++

• Em linguagens orientadas por objeto (C++, Java) a • Uma estrutura é uma coleção de uma ou mais variáveis, implementação é feita através de classes possivelmente de tipos diferentes, colocadas juntas sob um • Em linguagens estruturadas (C, pascal) a único nome para manipulação conveniente implementação é feita pela definição de tipos juntamente • Por exemplo, para representar um aluno são necessárias com a implementação de funções as informações nome, matrícula, conceito • Como, apesar de “ter aprendido C++”, vocês não viram • Ao invés de criar três variáveis, é possível criar uma única o conceito de orientação por objetos, vamos utilizar os variável contendo três campos. conceitos de C ( Typedef e Structs ) • Em C, usa-se a construção struct para representar esse • Orientação por objetos (classes, etc) vai ser vista em tipo de dado disciplinas posteriores (POO, Prog. Modular)

© R. O. Prates © R. O. Prates DCC/UFMG DCC/UFMG Estruturas (Structs) em C / C++ Declaração de Tipos

#include #include using namespace std; • Para simplificar, uma estrutura ou mesmo outros tipos de dados podem ser definidos como um struct Aluno { char nome[50]; nome novo tipo int matricula; mat conc char conceito; • Uso da construção typedef };

int main() { typedef struct Aluno{ int main() { struct Aluno al, aux; Pedro al: string nome; TipoAluno al; 200712 A strcpy(al.nome, "Pedro"); int matricula; Vetor v; al.matricula = 200712; char conceito; al.conceito = 'A'; Pedro } TipoAluno ; ... aux = al; aux: } printf("%s", aux.nome); 200712 A return(0); } typedef int[10] Vetor; © R. O. Prates © R. O. Prates DCC/UFMG DCC/UFMG

TADs em C TADs em C

• Uma boa técnica de programação é implementar • Para implementar um Tipo Abstrato de Dados em C, usa-se a definição de tipos juntamente os TADs em arquivos separados do programa com a implementação de funções que agem principal sobre aquele tipo • Para isso geralmente separa-se a declaração e a implementação do TAD em dois arquivos: • Como boa regra de programação, evita-se – NomeDoTAD.h : com a declaração acessar o dado diretamente, fazendo o acesso – NomeDoTAD.c : com a implementação só através das funções • O programa ou outros TADs que utilizam o seu – Mas, diferentemente de C++ e Java, não há uma TAD devem dar um #include no arquivo .h forma de proibir o acesso.

© R. O. Prates © R. O. Prates DCC/UFMG DCC/UFMG Exemplo ContaBancaria.h

// definição do tipo • Implemente um TAD ContaBancaria, com os typedef struct { campos número e saldo onde os clientes podem int numero; double saldo; fazer as seguintes operações: } ContaBancaria; – Iniciar uma conta com um número e saldo inicial // cabeçalho das funções – Depositar um valor void Inicializa (ContaBancaria *, int, double); – Sacar um valor void Deposito (ContaBancaria *, double); void Saque (ContaBancaria *, double); – Imprimir o saldo void Imprime (ContaBancaria);

• Faça um pequeno programa para testar o seu TAD

© R. O. Prates © R. O. Prates DCC/UFMG DCC/UFMG

ContaBancaria.c Main.c

#include #include #include"Contabancaria.h" #include #include "ContaBancaria.h" void Inicializa(ContaBancaria *conta, int numero, double saldo) { conta->numero = numero; int main (void) conta->saldo = saldo; { } ContaBancaria conta1; Inicializa(&conta1, 918556, 300.00); void Deposito (ContaBancaria *conta, double valor) { conta->saldo += valor; printf("\nAntes da movimentacao:\n "); } Imprime(conta1); Deposito(&conta1, 50.00); void Saque (ContaBancaria *conta, double valor) { Saque(&conta1, 70.00); conta->saldo -= valor; printf("\nDepois da movimentacao:\n "); } Imprime (conta1);

void Imprime (ContaBancaria conta) { system("PAUSE"); printf("Numero: %d\n", conta.numero); return(0); printf("Saldo: %f\n", conta.saldo); } }

© R. O. Prates © R. O. Prates DCC/UFMG DCC/UFMG Exercício 2 Exercício 3

• Implemente um novo TAD Banco que faça uso do TAD Conta Bancária para criar um conjunto de contas bancárias. O tipo do conjunto deve se chamar Contas e deve conter • Implemente um TAD Número Complexo o número de contas existentes e um vetor de contas. • As operações devem ser: – cada número possui os campos real e imaginário – InicializaContas(Contas *cnt) /* Define o número de contas existentes como sendo 0.*/ – Implemente as operações: – CriarNovasContas(Contas *cnt, int n); /* Cria n novas contas no conjunto de contas – solicitando ao usuário o saldo e definindo automaticamente o número da conta. */ • Atribui: atribui valores para os campos – ImprimirContas(Contas *cnt); • Imprime: imprime o número da forma “R + Ci” /* Imprime todas as contas existentes. */ – ZerarSaldoConta(Contas *cnt, int num); • Copia: Copia o valor de um número para outro /* Dado o número num de uma conta, zera seu saldo. */ • Observe que para criar o ZerarSaldoConta você deverá buscar a conta que tem um • Soma: Soma dois números complexos determinado número e retirar todo seu saldo. Para isso você deverá criar no TAD Conta Bancárias duas novas funções: • EhReal: testa se um número é real – VerificaNum (ContaBancaria conta, int num) /* Retorna 1 se a conta tiver o número num, e 0 se não tiver */ – ConsultaSaldo (ContaBancaria conta) /* Retorna o saldo da ContaBancaria Conta */ • Faça um pequeno programa para testar o seu • Explique por que estas funções devem estar no TAD Conta Bancária e não no TAD Banco. TAD

© R. O. Prates © R. O. Prates DCC/UFMG DCC/UFMG