Sei sulla pagina 1di 33

Profa. Simone Aires - Prof.

Saulo Queiroz 1

TAD: TIPO ABSTRATO DE


DADO
Simone Aires - Saulo Queiroz, UTFPR-PG
TAD: Introdução
2

 Frequentemente precisamos representar entidades do


mundo real bem como procedimentos a ela
relacionadas em sistemas computacionais
 Ex.: pessoas, processos do SO, pacotes da Internet, etc.
 A fim de evitar perdas de recursos, somente as
características essenciais ao sistema devem ser
representadas, os demais detalhes são ignorados
 A essa atividade denominados abstração.
Profa. Simone Aires - Prof. Saulo Queiroz
Abstração computacional
3

 Um conjunto de variáveis declaradas isoladamente


podem ser utilizadas para abstrair uma entidade
 Ex.: possível abstração de Pessoa
◼ int idade; char nome[200];
 Ex.: possível abstração de Processo
◼ Ex.: char status; int mem; float cpu;
 Ex.: possível abstração de um pacote da Internet
◼ int endereco_destino, endereco_origem, num_seq;

Profa. Simone Aires - Prof. Saulo Queiroz


Múltiplas Variáveis: Desvantagens
4

 Abstração por variáveis isoladas apresentam várias desvantagens:


 Desorganização do código para gerenciar muitas entidades. Ex.:
◼ int idade1; char nome1[200]; // Pessoa 1
◼ int idade2; char nome2[200]; // Pessoa 2
◼ int idade3; char nome3[200]; // Pessoa 1
 Procedimentos que envolvam ler/escrever sobre todas as variáveis de
uma única entidade tornam-se mais prolixos
◼ Recebem muitos parâmetros
◼ O protótipo da função muda sempre que a abstração é atualizada
◼ Ou, são quebrados em vários procedimentos

Profa. Simone Aires - Prof. Saulo Queiroz


TAD
5

 Possibilita a especificação de tipos personalizados (pelo programador)


juntamente com procedimentos a ela relacionados
 i.e. permite-nos criar novos tipos para um programa
◼ Ex.: TipoPessoa p1, p2, p3; //3 variáveis do TAD “TipoPessoa”
 Consequentemente possibilita novas entradas/saídas para
procedimentos/funções
 TAD são compostos por outras variáveis chamadas campos
 Campos podem ser de tipos primitivos ou outros TADs
 Em linguagem C novos tipos são definidos pela palavra reservada struct

Profa. Simone Aires - Prof. Saulo Queiroz


Novos Tipos em C - Definição
6

struct novo_tipo {
tipo1 campo1;
tipo2 campo2;
tipon campon;
};
/* deste ponto em diante “struct novo_tipo” está
disponível para novas variáveis serem declaradas*/
 A declaração de variáveis juntamente com o tipo criado é opcional
 Pode ser declarado depois com struct novo_tipo var1;

Profa. Simone Aires - Prof. Saulo Queiroz


Novos Tipos em C – Declaração de
variáveis
7

/*após a definição do tipo*/


struct aluno{
char nome[50];
int ra;
int idade;
};
int main(){
struct aluno a1, a2;
}
Profa. Simone Aires - Prof. Saulo Queiroz
Variável: Ilustração na RAM
8

 Como ficaria alocada na RAM a variável abaixo?


/* após a definição do tipo */
struct aluno {
int ra;
char idade; //no máximo 255 anos.
}; NOTA: Na prática, o espaço ocupado por uma
int main(){ variável do tipo struct pode ser maior do
struct aluno x; que a soma de seus campos. Motivo:
} o alinhamento dos bytes resultantes melhora
o tempo de acesso.
Profa. Simone Aires - Prof. Saulo Queiroz
Novo Tipo em C – Declaração de
variáveis
9

/*durante a definição do tipo*/


struct aluno{
char nome[50];
int ra;
int idade;
} a1, a2;
int main(){
/*a1 e a2 são globais nesse programa*/
}
Profa. Simone Aires - Prof. Saulo Queiroz
Acessando campos: O operador “.”
10

 Declare a variável do tipo criado


 Ex.: struct aluno formularioAluno;
 Forma geral: variavel_tipo_struct.campo
 Ex2:
◼ printf(“%d”, formularioAluno.idade);
◼ scanf(“%s”,&(formularioAluno.nome));

Profa. Simone Aires - Prof. Saulo Queiroz


Vetor de struct
11

 Segue mesmo princípio que variáveis primitivas


 E.g. struct aluno Alunos[100],a1;
 Acesso: Alunos[indice].campo
 Ex. Alunos[indice].ra=980001;

Profa. Simone Aires - Prof. Saulo Queiroz


O operador typedef
12

 Permite dar rótulos a tipos existentes no C


 typedef <tipo_existente> <novo_nome>;
 O novo rótulo não invalida o anterior, ambos podem
ser usados para declaração de novas variáveis
◼ Ex.: typedef int inteiro; inteiro a; int b;
◼ Ex.: typedef struct aluno TipoAluno;

Profa. Simone Aires - Prof. Saulo Queiroz


O operador typedef
13

 O typedef pode ser empregado durante a definição de uma struct


typedef struct aluno {
char nome[50];
int ra;
int idade;
} TipoAluno;
/*são válidas as declarações*/
TipoAluno a;
struct aluno b;

Profa. Simone Aires - Prof. Saulo Queiroz


TADs: Passagem de parâmetro
14

 Como passar uma variável de um TAD como


parâmetro para um procedimento/função?

Profa. Simone Aires - Prof. Saulo Queiroz


TADs: Passagem por valor
15

 A passagem por valor funciona exatamente como


em variáveis de tipos primitivos
 Precisamos declarar o parâmetro de entrada do
mesmo tipo TAD que passaremos à função

Profa. Simone Aires - Prof. Saulo Queiroz


TADs: Passagem por referência
16

 A passagem por referência funciona exatamente


como em variáveis de tipos primitivos
 Precisamos declarar o parâmetro de entrada da
função do tipo ponteiro para struct
 A manipulação dos campos de uma variável
struct tem um operador especial o ->

Profa. Simone Aires - Prof. Saulo Queiroz


Ponteiro para struct com “->”
17

 O operador “->” pode ser usado para acessar campos de


variáveis struct a partir de seus ponteiros. Ex.:
struct aluno a1, *pa;
pa = &a1;
pa->idade = 2; //altera campo de a1.idade
 Forma geral: variavel_tipo_struct->campo
 Ex2:
◼ printf(“%d”, pa->idade);
◼ scanf(“%d”,&(pa->idade));

Profa. Simone Aires - Prof. Saulo Queiroz


Passagem de campos por referência
18

 Podemos passar apenas um campo de variável


struct por referência
struct aluno a1, *pa;
funcao(&(a1.idade)); //forma 1
funcao(&(pa->idade)); //forma 2
//funcao recebe um ponteiro para inteiro

Profa. Simone Aires - Prof. Saulo Queiroz


struct auto-referenciada
19

 Uma struct pode conter um campo do tipo


ponteiro para ela própria
struct novo_tipo {
tipo1 campo1;
tipo2 campo2;
struct novo_tipo *nomePonteiro;
};
Profa. Simone Aires - Prof. Saulo Queiroz
Exemplo 1
20

typedef struct aluno {


char nome[50];
int ra;
int idade;
} TipoAluno;
TipoAluno *aloca(); //protótipo 1
void alterar(TipoAluno *paluno); //protótipo 2
Profa. Simone Aires - Prof. Saulo Queiroz
Exemplo 1
21

void main()
{
TipoAluno *p;
p=aloca();
alterar(p);
printf("\nAluno %s inserido!", p->nome);
}
Profa. Simone Aires - Prof. Saulo Queiroz
Exemplo 1
22

TipoAluno *aloca()
{
TipoAluno *pa;
pa = (TipoAluno *) malloc(sizeof(TipoAluno));
if(pa == NULL) return NULL;
return pa;
}
Profa. Simone Aires - Prof. Saulo Queiroz
Exemplo 1
23

void alterar(TipoAluno *paluno)


{
printf("Informe nome:");
fgets(paluno->nome,50,stdin);
printf("Informe ra:");
scanf("%d",&(paluno->ra));
printf("Informe idade:");
scanf("%d",&(paluno->idade));
}
Profa. Simone Aires - Prof. Saulo Queiroz
Exemplo 2
24

#include<stdio.h>
#include<stdlib.h>
typedef struct aluno {
char nome[50];
int ra;
int idade;
} TipoAluno;
TipoAluno *aloca(int n);
void alterar(TipoAluno *paluno, int n);
Profa. Simone Aires - Prof. Saulo Queiroz
Exemplo 2
25

void main() {
TipoAluno *p;
int n,i;
printf("Informe numero de resgitros:");
scanf("%d",&n);
p=aloca(n);
alterar(p,n);
for(i=0;i<n;i++)
{
printf("\nAluno %s inserido!", (p+i)->nome);
}} Profa. Simone Aires - Prof. Saulo Queiroz
Exemplo 2
26

TipoAluno *aloca(int n)
{
TipoAluno *pa;
pa = (TipoAluno *) malloc(n*sizeof(TipoAluno));
if (pa==NULL) return NULL;
return pa;
}

Profa. Simone Aires - Prof. Saulo Queiroz


Exemplo 2
27

void alterar(TipoAluno *paluno, int n) {


int i;
for(i=0;i<n;i++)
{
fflush(stdin);
printf("Informe nome:");
fgets((paluno+i)->nome,50,stdin);
printf("Informe ra:");
scanf("%d",&((paluno+i)->ra));
printf("Informe idade:");
scanf("%d",&((paluno+i)->idade));
}} Profa. Simone Aires - Prof. Saulo Queiroz
Exemplo 3
 Implemente um TAD ContaBancaria, com os campos
número e saldo onde os clientes podem fazer as
seguintes operações:
 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


ContaBancaria.h
// definição do tipo
typedef struct {
int numero;
double saldo;
} ContaBancaria;

// cabeçalho das funções


void Inicializa (ContaBancaria*, int, double);
void Deposito (ContaBancaria*, double);
void Saque (ContaBancaria*, double);
void Imprime (ContaBancaria);
ContaBancaria.cpp
#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; // pconta->saldo= 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);
}
Main.cpp
#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);
return(0);}
Exercício

 Implemente um TAD Número Complexo


 cada número possui os campos real e imaginário
 Implemente as operações:
◼ 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
◼ EhReal: testa se um número é real

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


33

Lista de Exercícios 04

Profa. Simone Aires - Prof. Saulo Queiroz

Potrebbero piacerti anche