Introdução à Programação em C++
Aula 7 - Tipos Abstratos de Dados I

Lucas S. Vieira


Universidade Federal dos Vales do Jequitinhonha e Mucuri
Dezembro de 2019

Introdução

Vimos, até agora, como associar dados do mesmo tipo.

Todavia, às vezes precisamos lidar com grupos de dados heterogêneos.

Exemplo: Cadastro de um Aluno

Campo Tipo esperado
Matrícula Numérico (int)
Nome String (char[])
Idade Numérico (int)
Endereço String (char[])

Tipos Abstratos de Dados

O tipo abstrato de dados (TAD), também conhecido como struct, possibilita criar um agrupamento de dados de vários tipos, criando um novo tipo que age como uma primitiva.

struct Aluno
{
    int  matricula;
    char nome[80];
    int  idade;
    char endereco[80];
};

IMPORTANTE: Veja o uso de ponto-e-vírgula!!!

Por que usar um TAD?

TADs são essenciais para a organização dos dados no programa.

Sem eles, seus dados ficariam "espalhados" e dependeriam de "convenções" para explicação.

Criando uma variável a partir de um TAD

struct Aluno
{
    int  matricula;
    char nome[80];
    int  idade;
    char endereco[80];
};

int main()
{
    Aluno a;
    return 0;
}

Normalmente, o TAD é declarado fora da função principal, e de preferência antes de ser usado.

Acessando elementos de um TAD

Cada elemento da declaração do TAD pode ser acessado usando a notação

variavel.nome_do_campo

Exemplo I: Escrevendo a idade de um aluno

Aluno aluno;
std::cin >> a.idade;

Exemplo II: Escrevendo o nome de um aluno

Aluno aluno;
std::cin >> std::ws;
std::cin.getline(aluno.nome, 80);

Exemplo III: Atribuição

struct Aluno
{
    int  matricula;
    char nome[80];
    int  idade;
    char endereco[80];
};

Aluno aluno;
aluno.idade = 25;
std::cout << "Sua proxima idade sera: "
          << aluno.idade + 1 << std::endl;
Sua proxima idade sera: 26

Exemplo IV: Inicialização

Podemos usar chaves, assim como em vetores.

A ordem das informações deve respeitar a ordem dos elementos.

struct Aluno
{
    int  matricula;
    char nome[80];
    int  idade;
    char endereco[80];
};

Aluno aluno = { 123, "Fulano", 25, "Rua Alguma, 0" };

std::cout << "Dados do aluno:" << std::endl
          << "Nome:      " << aluno.nome << std::endl
          << "Matricula: " << aluno.matricula << std::endl
          << "Idade:     " << aluno.idade << std::endl
          << "Endereco:  " << aluno.endereco << std::endl;
Dados do aluno:
Nome:      Fulano
Matricula: 123
Idade:     25
Endereco:  Rua Alguma, 0

Vetores de tipos abstratos

Estruturas abstratas de dados agem, sintaticamente, como se fossem tipos primitivos.

struct Aluno
{
    int  matricula;
    char nome[80];
    int  idade;
    char endereco[80];
};

Aluno alunos[3] = {
    { 123, "Fulano",   25, "Rua Alguma, 0" },
    { 456, "Ciclano",  28, "Rua Alguma, 1" },
    { 789, "Beltrano", 30, "Rua Alguma, 2" }
};

for(int i = 0; i < 3; i++) {
    std::cout << "Dados do aluno " << i << ":"
              << std::endl
              << "Nome:      " << alunos[i].nome
              << std::endl
              << "Matricula: " << alunos[i].matricula
              << std::endl
              << "Idade:     " << alunos[i].idade
              << std::endl
              << "Endereco:  " << alunos[i].endereco
              << std::endl << std::endl;
}
Dados do aluno 0:
Nome:      Fulano
Matricula: 123
Idade:     25
Endereco:  Rua Alguma, 0

Dados do aluno 1:
Nome:      Ciclano
Matricula: 456
Idade:     28
Endereco:  Rua Alguma, 1

Dados do aluno 2:
Nome:      Beltrano
Matricula: 789
Idade:     30
Endereco:  Rua Alguma, 2

Exercícios

Representando Frações

Frações são números racionais, definidos como números escritos na forma \(\frac{a}{b}\), onde \(a\) é um número inteiro, e \(b\) é um número inteiro diferente de zero. Ou, matematicamente:

\begin{equation*} \mathbb{Q} = \left\{\, \frac{a}{b} \,\vert\, (a \in \mathbb{Z}) \land (b \in \mathbb{Z}^{*})\, \right\} \end{equation*}

Construa um tipo abstrato de dados que representa uma fração.

Usando Frações

Utilizando o tipo abstrato criado no exercício anterior, crie uma variável com este tipo abstrato, receba do usuário seus respectivos valores para numerador e denominador, e em seguida, imprima a fração na tela, na forma num/denom.