Você está na página 1de 32

Prof.

Protásio
Estruturas
▪ É uma coleção de um ou mais tipos de
elementos denominados de membros,
cada um dos quais pode ser um tipo de
dado diferente.
▪ Diferença entre Array e Estrutura
Array ... Mesmo tipo
de dado

Exemplo: int int int int int int int int

Estrutura ... Podem ter


tipos de dado
diferentes
Exemplo: char int float long array int

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 2


Estruturas
▪ Uma estrutura é um tipo de dado definido
pelo usuário
▪ Declaração de um estrutura

struct nome_da_estrutura
{
tipo_de_dado membro1;
tipo_de_dado membro2;
:
tipo_de_dado membro_n;
};

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 3


Estruturas
▪ Exemplo de declaração

struct aluno
{
char nome_completo[100];
char curso[50];
int matricula;
float CRE;
};

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 4


Estruturas
▪ Definição de variáveis de estruturas
▪ Método 1

struct aluno
{
char nome_completo[100];
char curso[50];
int matricula;
float CRE;
} joao, maria, jose;

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 5


Estruturas
▪ Definição de variáveis de estruturas
▪ Método 2

struct aluno
{
char nome_completo[100];
char curso[50];
int matricula;
float CRE;
};

aluno joao, maria, jose;

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 6


Inicialização de uma variável de estrutura

struct aluno
{
char nome_completo[100];
char curso[50];
int matricula;
float CRE;
};

aluno joao = {“Joao de Jesus”, “Engenharia”, 10020, 7.4};

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 7


Acesso
▪ Pode-se acessar uma estrutura por duas
maneiras:
▪ Utilizando o operador ponto “.”

nome_variavel_da estrutura.nome_membro = dados;

▪ Utilizando o operador ponteiro “->”

ponteiro_para_variavel_da estrutura->nome_membro = dados;

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 8


Acesso com operador “.”
#include<iostream>
#include<cstring>
using namespace std;

struct aluno{
char nome_completo[100];
char curso[50];
int matricula;
float CRE;
};

int main(){
aluno joao = {"Joao de Jesus", "Engenharia", 10020, 7.4};
aluno maria, jose;

strcpy(maria.nome_completo, "Maria do Nascimento");


strcpy(maria.curso, "Matematica");
maria.matricula = 10021;
maria.CRE = 5.0;

cout << maria.nome_completo << endl;


cout << maria.curso << endl;
cout << maria.matricula << endl;
cout << maria.CRE << endl;
}

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 9


Acesso com operador “.”
▪ Tarefa
▪ Considerando a estrutura aluno, armazene os
dados abaixo para o objeto jose
▪ Nome: Jose da paixao
▪ Curso: Computacao
▪ Matrícula: 10023
▪ CRE: 9.4

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 10


Acesso com operador “->”
#include<iostream>
#include<cstring>
using namespace std;

struct aluno{
char nome_completo[100];
char curso[50];
int matricula;
float CRE;
};

int main()
{
aluno joao = {"Joao de Jesus", "Engenharia", 10020, 7.4};
aluno maria, jose;
aluno *joaoponteiro;

joaoponteiro = &joao;

cout << joaoponteiro->nome_completo << endl;


cout << joaoponteiro->curso << endl;
cout << joaoponteiro->matricula << endl;
cout << joaoponteiro->CRE << endl;
}

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 11


Acesso com operador “->”
▪ Tarefa
▪ Considerando a estrutura aluno, modifique o
nome de Joao para Joao da Misericordia e
mostre na tela seus dados, utilizando o
operador seta.

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 12


Operador de atribuição com estruturas
▪ O exemplo abaixo copia os valores dos membros de uma variável de
estrutura a outra variável.
#include<iostream>
using namespace std;

struct TESTE{
int num;
char ch;
};

int main(){
TESTE v1, v2;
v1.num = 2;
v1.ch = 'a';

v2.num = v1.num;
v2.ch = v1.ch;

cout << v1.num << " " << v1.ch << endl;
cout << v2.num << " " << v2.ch << endl;
}

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 13


Operador de atribuição com estruturas
▪ O exemplo abaixo copia os valores dos membros de uma variável de
estrutura a outra variável.
#include<iostream>
using namespace std;

struct TESTE{
int num;
char ch;
};

int main(){
TESTE v1, v2;
Todos os valores v1.num = 2;
dos membros de v1 v1.ch = 'a';
são atribuídos aos v2 = v1;
membros de v2,
respectivamente cout << v1.num << " " << v1.ch << endl;
cout << v2.num << " " << v2.ch << endl;
}

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 14


Estruturas aninhadas
▪ Considere as duas estruturas abaixo:
struct aluno{ struct professor{
char nome_completo[100]; char nome_completo[100];
char curso[50]; char curso[50];
int matricula; int matricula;
float CRE; int departamento;
}; };

▪ Percebe-se que tem vários membros


iguais.
▪ Pode-se então aproveitar essa
característica e aninhar as estruturas.

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 15


#include<iostream>
#include<cstring>

Estruturas using namespace std;

struct pessoal{
aninhadas char nome_completo[100];
char curso[50];
Estrutura geral
int matricula;

▪ Exemplo
};

struct aluno{ Uma estrutura


pessoal dados; dentro da outra
float CRE;
};

struct professor{
pessoal dados;
int departamento;
};

int main(){
aluno joao;
professor jose;

strcpy(joao.dados.nome_completo, "Joao do Nascimento");


strcpy(joao.dados.curso, "Engenharia");
joao.dados.matricula = 10031;
joao.CRE = 8.0;

strcpy(jose.dados.nome_completo, "Jose Maria");


strcpy(jose.dados.curso, "Engenharia");
jose.dados.matricula = 34;
jose.departamento = 1;

cout << joao.dados.nome_completo << endl;


cout << jose.dados.nome_completo << endl;
}

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 16


#include<iostream>
Arrays de using namespace std;

estruturas struct ALUNO{


char nome[100];
int matricula;
float CRE;
};

int main()
{
ALUNO alunos[3];

for (int i = 0; i < 3; i++){


cout << "Nome do aluno: " << endl;
cin >> alunos[i].nome;
cout << "Matricula: " << endl;
cin >> alunos[i].matricula;
cout << "CRE: " << endl;
cin >> alunos[i].CRE;
cout << "Cadastro " << i << endl;
}

cout << "Qual cadastro quer recuperar?" << endl;


int i;
cin >> i;
cout << "Nome do aluno: " << endl;
cout << alunos[i].nome << endl;
cout << "Matricula: " << endl;
cout << alunos[i].matricula << endl;
cout << "CRE: " << endl << endl;
cout << alunos[i].CRE;
}

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 17


Passando estrutura para funções
#include<iostream>
#include<cstring>
using namespace std;

struct ALUNO{
char nome_completo[100];
char curso[50];
int matricula;
float CRE;
};
Funções cujo
argumento é uma float obtemCRE(ALUNO x);
void incrementaCRE(ALUNO &x);
estrutura
int main(){
ALUNO joao = {"Joao de Jesus", "Engenharia", 10020, 7.4};
ALUNO maria = {"Maria Aparecida", "Fisica", 10031, 2.6};

cout << obtemCRE(joao) << endl;


incrementaCRE(joao);
cout << obtemCRE(joao) << endl;
cout << obtemCRE(maria) << endl;
}

float obtemCRE(ALUNO x){


return x.CRE;
}

void incrementaCRE(ALUNO &x){


x.CRE+=1;
}

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 18


Funções membros de uma estrutura
▪ As estruturas podem conter membros e
funções.
struct nome_da_estrutura
{
tipo_de_dado membro1;
tipo_de_dado membro2;
:
tipo_de_dado membro_n;

tipo_de_retorno função1(parâmetros formais);


tipo_de_retorno função2(parâmetros formais);
:
tipo_de_retorno função_m(parâmetros formais);
};
Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 19
Funções membros de uma estrutura
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;

struct VETOR{
Dados membros float x,y,z;

float modulo(){
Função membro return sqrt(pow(x,2)+pow(z,2)+pow(z,2));
}
};

int main(){
VETOR a = {2.1, 3, 5.6};
a é uma variável da estrutura
VETOR. cout << a.modulo() << endl;
a também é chamado de }
um OBJETO do tipo VETOR.

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 20


Visibilidade dos membros de um estrutura
▪ Por padrão, os membros de uma estrutura
são públicas, ou seja, eles são acessíveis
através do uso do objeto.
struct VETOR{
float x,y,z;
x, y e z são públicas.
float modulo(){
return sqrt(pow(x,2)+pow(z,2)+pow(z,2));
}
};

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 21


Visibilidade dos membros de um estrutura
▪ Para torna um membro privado, usa-se a
palavra-chave private.
▪ Dessa forma, o acesso ao membro só
pode ser feito por funções membro da
estrutura.

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 22


Acesso a membro privados de uma estrutura
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;

struct VETOR{
float modulo(){
return sqrt(pow(x,2)+pow(z,2)+pow(z,2));
}

void set(float temp1, float temp2, float temp3){


x = temp1;
y = temp2;
z = temp3;
}

private:
Membros privados float x,y,z;
};

int main(){
VETOR a;

//a.x = 2.1; y = 3; z = 5.6; ERRO, pois x,y e z são privadas

a.set(2.1, 3, 5.6);

cout << a.modulo() << endl;


}

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 23


Tamanho de uma estrutura
▪ Para obter o tamanho de uma estrutura em
bytes, pode-se usar o operador sizeof
struct ALUNO{
char nome_completo[100];
char curso[50];
int matricula;
float CRE;
};

cout << “tamanho em bytes = ” << sizeof(ALUNO);

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 24


União
▪ É um coleção de dados cuja memória
ocupada que é compartilhada por suas
variáveis membros.
▪ Exemplo
union teste{
int i;
char cr;
} exemplo;

▪ Disposição na memória
i

Byte 0 Byte 1
cr

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 25


Uniões
▪ Uma das razões para usar uniões é
economizar memória.
▪ É possível ter várias variáveis usando a mesma
memória, mas uma de cada vez.
▪ Exemplo:
union frases{
char linha_ordem[80];
char mensagem_de_erro[80];
char mensagem_de_ajuda[80];
} texto;

▪ Todas essas cadeias ocupação somente 80


caracteres.

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 26


Uniões
▪ Exemplo
▪ Como acessar os bytes de um inteiro (2 bytes)
▪ Declaração
union teste{
int i;
char cr[2];
} exemplo1;
▪ Lendo o byte superior de i
exemplo1.cr[0]
▪ Lendo o byte inferior de i
exemplo1.cr[1]
Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 27
União
▪ Exemplos
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
union Data { union Data {
int i; int i;
float f; float f;
char str[20]; char str[20];
}; };

int main( ) { int main( ) {


union Data data; union Data data;
data.i = 10; data.i = 10;
data.f = 220.5; printf( "data.i : %d\n", data.i);
strcpy( data.str, "C Programming"); data.f = 220.5;
printf( "data.i : %d\n", data.i); printf( "data.f : %f\n", data.f);
printf( "data.f : %f\n", data.f); strcpy( data.str, "C Programming");
printf( "data.str : %s\n", data.str); printf( "data.str : %s\n", data.str);
return 0; return 0;
} }

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 28


Enumeração
▪ É um tipo definido pelo usuário com
constantes de nomes de tipo inteiro.
▪ Sintaxe:
▪ enun {enumerado1, enumerador2,...};

0 1 ...

▪ Exemplo
▪ enun {VERMELHO, VERDE, AZUL};

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 29


Enumeração
▪ Exemplo
#include<iostream>
using namespace std;

enum {VERMELHO, VERDE, AZUL};

int main(){
int temp;
cout << "Digite 0, 1 ou 2: " << endl;
cin >> temp;

if (temp == VERMELHO) cout << "\n Voce digitou 0";


if (temp == VERDE) cout << "\n Voce digitou 1";
if (temp == AZUL) cout << "\n Voce digitou 2";
}

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 30


Typedef
▪ Permite que se crie sinônimos de um tipo
de dado já existente.
▪ typedef double duplo;
▪ typedef float flutuante;
▪ Exemplo
#include<iostream>
using namespace std;

typedef float flutuante;

int main(){
flutuante temp = 1.2;
cout << temp << endl;
}

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 31


Lista de exercícios
1. Escreva um código em C++ que cadastre o nome, a matrícula e três notas de alunos
representado por uma struct. Em seguida, imprima a matrícula, o nome e a média de cada um
deles.
2. Escreva um código em C++ que cadastre o nome e o CEP de uma pessoa, representada por
uma struct, e que, por meio de funções privadas, valide os nomes e CEPs digitados pelo
usuário. Crie uma opção de mostrar todos os cadastros efetivados.
3. Escreva um código em C++ que cadastre (armazene) o nome, o curso, a matrícula e da data de
nascimento de até 10 alunos. Cada aluno deve ser representado por uma struct dentro de uma
array. A data de nascimento também deve ser uma struct. O programa deve, na tela de
abertura, apresentar opções para: (I) inserir aluno; (II) listar todos os dados dos alunos e listar
os alunos que nasceram antes de uma certa data fornecida.
4. Escreva um código em C++ que cadastre o nome, o sexo, a altura, o peso e o CPF de algumas
pessoas. O programa deve, na tela de abertura, apresentar opções para: cadastrar pessoa,
localizar uma pessoas pelo CPF e imprimir o seu IMC.
5. Escreva um código em C++ que cadastre o código, preço e nome de produtos representados
por uma struct. O programa deve, na tela de abertura, apresentar opções para: cadastrar
produto, imprimir lista de códigos/produto e consultar o preço de um produto através de seu
código.
6. Escreva um código em C++ que cria contas bancárias em que cada conta, representada por
uma struct, contenha o nome e o CPF do cliente e depósito inicial. Após as contas serem
criadas, o sistema deverá possibilitar realizações de saques ou depósitos nas contas e sempre
que uma operação de saque ou depósito seja realizada, o sistema deverá imprimir o nome do
titular e o saldo final da conta.
7. Escreva um código em C++, utilizando union, em que imprima o código binário completo de um
valor em ponto flutuante dado pelo usuário.

Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 32

Você também pode gostar