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

SIF120 ESTRUTURAS DE DADOS II

Professora Edna R. da Silva


Universidade Federal de Itajub

AULA 05
Estruturas Dinmicas oferecem suporte adequado para a insero e a remoo de elementos, as quais no so arbitrrias. Introduziremos agora a tcnica de programao baseada no conceito de TDA, a qual procura encapsular (esconder) de quem usa um determinado tipo a forma concreta com que o tipo foi implementado.

TDA -Tipo Abstrato de Dados

Modularizao em C
Programa em C pode ser dividido em vrios arquivos Arquivos fontes com extenso .c Denominados de mdulos

Cada mdulo deve ser compilado separadamente Para tanto, usa-se um compilador Resultado: arquivos objeto no executveis Arquivos em linguagem de mquina com extenso .o ou .obj
Arquivos objeto devem ser juntados em um executvel Para tanto, usa-se um ligador ou link-editor Resultado: um nico arquivo em linguagem de mquina Usualmente com extenso .exe

Modularizao em C
Mdulos so muito teis para construir bibliotecas de funes interelacionadas. Por exemplo: Mdulos de funes matemticas Mdulos de funes para manipulao de strings etc. Em C, preciso listar no incio de cada mdulo aquelas funes de outros mdulos que sero utilizadas: Isso feito atravs de uma lista denominada cabealho Exemplo: considere um arquivo STR.c contendo funes para manipulao de strings, dentre elas: int comprimento (char* strg); void copia (char* dest, char* orig); void concatena (char* dest, char* orig);

Modularizao em C
Exemplo: Considere tambm que temos um arquivo exemplo.c como o seguinte cdigo:

/* Programa Exemplo.c */ #include<stdio.h> int comprimento (char *str); void copia (char *dest, char *orig); void concatena (char *dest, char *orig); int main(void) { char str[101], str1[51], str2[51]; printf ("Entre com uma sequencia de caracteres: "); scanf (" %50s[^\n]", str1); printf("Entre com outra sequencia de caracteres: "); scanf(" %50s[^\n]", str2); copia(str, str1); concatena(str, str2); printf("Comprimento total: %d\n",comprimento(str)); return 0; }

Modularizao em C
A partir desses dois fontes (Exemplo.c e STR.c), podemos gerar um executvel compilando cada um separadamente e depois ligando-os. Soluo
Arquivo de cabealhos so associados a cada mdulo, com: cabealhos das funes oferecidas pelo mdulo e, eventualmente, os tipos de dados que ele exporta
typedefs, structs, etc.

Segue o mesmo nome do mdulo ao qual est associado porm com a extenso .h

Exemplo:
Arquivo STR.h para o mdulo STR.c do exemplo anterior

Modularizao em C
/* Arquivo STR.h */ /* Funo comprimento: Retorna o no. de caracteres da string str */ int comprimento (char *str);

/* Funo copia: Copia a string orig para a string dest */


void copia (char *dest, char *orig); /* Funo concatena: Concatena a string orig na string dest */ void concatena (char *dest, char *orig);

Modularizao em C
O programa Exemplo.c pode ento ser reescrito como:

/* Programa Exemplo.c */ #include <stdio.h> /* Mdulo da Biblioteca C Padro */ #include"STR.h" /* Mdulo Prprio */ int main (void) { char str[101], str1[51], str2[51]; printf ("Entre com uma seqncia de caracteres: "); scanf (" %50s[^\n]", str1); printf ("Entre com outra seqncia de caracteres: "); scanf (" %50s[^\n]", str2); copia(str, str1); concatena(str, str2); printf ("Comprimento total: %d\n",comprimento(str)); return 0; }

INTRODUO A TDA
Mdulos podem ser usados para definir um novo tipo de dado e o conjunto de operaes para manipular dados desse tipo:
Tipo Abstrato de Dados(TAD)

Definindo um tipo abstrato, pode-se esconder a implementao


Quem usa o tipo abstrato precisa apenas conhecer a funcionalidade que ele implementa, no a forma como ele implementado Facilita manuteno e re-uso de cdigos, entre outras vantagens

Tipos de Dados Abstratos


Um TAD formado por um conjunto de valores e por uma srie de funes que podem ser aplicadas sobre estes valores. Funes e valores, em conjunto, constituem um modelo matemtico que pode ser empregado para modelar e solucionar problemas do mundo real; servindo para especificar as caractersticas relevantes dos objetos envolvidos no problema, de que forma eles se relacionam e como podem ser manipulados.

Tipos de Dados Abstratos


Tipo de Dados Abstrato

Tipo de Dados Concreto implementao

(Modelo matemtico)

(padro de bits/rotinas)

Estudando um Problema
Considere o seguinte problema: voc precisa desenvolver uma aplicao que manipula um conjunto de dados sobre seu cliente. Os dados so: nome, idade e identidade.

Voc vai precisar:


Incluir; Excluir; Alterar e Consultar as informaes considerando sua identidade.

de

um

determinado

cliente,

Analisando as informaes, possvel perceber que os dados disponveis esto relacionados. Ser que no podemos criar um tipo para representar estes dados?

Estudando um Problema
Este tipo poderia se chamar tCliente e deveria ter as seguintes informaes: Tipo tCliente { Nome Idade Identidade } Operaes { incluirCliente (nome, idade, identidade) excluirCliente (identidade) consultarCliente (identidade) alterarCliente (identidade) }

Estudando um Problema
Repare que, na definio do tipo (dados e operaes), no foi considerada a implementao de cada operao.
Voltando a pergunta: Ser que no podemos criar um tipo para representar estes dados?

Estudando um Problema
sim, podemos criar um tipo para representar um cliente. Este tipo o que chamamos de tipo abstrato de dados (TAD).
Para isto, a implementao de cada operao de um TAD deve ser realizada separada da sua especificao.

Mas o que a especificao de um TAD?

Estudando um Problema
Basicamente, a especificao deve conter:
o nome do TAD, os dados que ele representa e suas operaes.

No que se refere s operaes, basta definir sua assinatura, ou seja, o nome de cada operao e os dados necessrios a sua execuo.
Mas como usar este conceito na prtica?

Estudando um Problema
Na fase de projeto do algoritmo,
voc define a especificao do TAD (dados e as operaes).

Na fase de codificao,
voc implementa as operaes.

A implementao depende da linguagem de programao. A ideia bsica que, uma aplicao que usa um TAD um cliente do TAD (ou usurio). O cliente no precisa conhecer a implementao das operaes.

Estudando um Problema
Em C, existe o conceito de bibliotecas.
arquivo.h

e, dependendo do ambiente, contm apenas as assinaturas das operaes que so criadas para um determinado tipo de dados abstrato.

Quando incluir um arquivo.h, pode-se usar todas as operaes especificados na biblioteca.

Estudando um Problema
Aqui temos o cdigo do programa principal (cliente do TAD matemtica que possui duas operaes somaNum e difNum).

/* Programa Exemplo2.c */ #include<stdio.h> #include <stdlib.h> #include "matematica.h" int main(void) { int a, b, soma; scanf("%d", &a); printf("\n"); scanf("%d", &b); soma = somaNum(a,b); printf("A soma e %d \n", soma); return 0;}

Estudando um Problema
No arquivo matemtica.h que foi includo no programa principal, colocamos as assinaturas das operaes.
/* assinaturas da operaes */
int somaNum (int x, int y); int difNum (int x, int y);

Estudando um Problema
E finalmente, em outro arquivo, colocamos a implementao das operaes. Podemos chamar este arquivo de matemtica.c /* Programa matematica.c */ #include<stdio.h> #include <stdlib.h> #include "matematica.h

int somaNum (int x, int y) { int soma = 0; soma = x + y ; return soma; }


int difNum (int x, int y) { int dif = 0; dif = x - y; return dif; }

Estudando um Problema
Quando um TAD usa um struct ou um tipo definido, a estrutura do struct (ou do tipo) deve ser descrita dentro do arquivo .h. Veja o exemplo do tipo abstrato ponto.
- Dois campos inteiros que representam as coordenadas do ponto (x e y).

/* struct para representar um ponto*/ typedef struct { int x; int y; } tponto;

cria um tipo definido chamado tponto:

Estudando um Problema
O cabealho da operao (funo em C) fica:
tponto criaPonto(int x, inty);

Portanto, nosso arquivo ponto.h fica:


/* arquivo ponto.h*/
typedef struct { int x; int y; } tponto; tponto criaPonto(int x, int y);

Estudando um Problema
Agora, temos que elaborar a implementao das operaes do novo tipo. Isto deve ser feito separado da interface do tipo. Lembre-se que a interface contm apenas a assinatura das operaes (cabealho das funes). Vamos criar um novo arquivo com nome ponto.c.

Estudando um Problema
Logo, nosso arquivo ponto.c fica assim:

/* arquivo ponto.c*/ #include ponto.h tponto criaPonto (int x, int y) { tponto p; p.x = x; p.y = y; return p; }

Concluindo
Portanto, a grande vantagem de usar um TAD a reusabilidade e facilidade de manuteno e portabilidade que esta estratgia pode proporcionar.

Linkando com o Linux