{joseana, rangel}@dsc.ufcg.edu.br
DSC/CCT/UFCG
Prof.: José Eustáquio Rangel de Queiroz
[email protected]
[email protected]
Carga Horária: 60 horas
DSC/CCT/UFCG
{joseana, rangel}@dsc.ufcg.edu.br
Tópicos
Structs
Unions
Enums
2
Structs I
DSC/CCT/UFCG
Arrays Exigência de todos
elementos do mesmo tipo de dados
Fatos
os
Necessidade
de
agrupamento
de
informações envolvendo diferentes tipos
de dados
{joseana, rangel}@dsc.ufcg.edu.br
Exemplo Lista de materiais de um
almoxarifado
Inclusão do nome,
especificação,
quantidade disponível e datas de
entrada e de saída de cada item
3
Structs II
DSC/CCT/UFCG
Fatos
Possibilidade de estruturação de dados
em C and C++ de modo a armazenar
combinações de caracteres, inteiros,
variáveis de ponto flutuante and e dados
do tipo enumerado (enum)
{joseana, rangel}@dsc.ufcg.edu.br
Uso de structs
4
Structs III
DSC/CCT/UFCG
Struct
Tipo derivado de dados composto de
membros associados a tipos de dados
elementares ou derivados
Struct Única
{joseana, rangel}@dsc.ufcg.edu.br
Armazenamento dos dados associados a
um objeto
Array de structs
Armazenamento dos dados associados a
vários objetos
5
Structs IV
DSC/CCT/UFCG
Declaração de Structs
{joseana, rangel}@dsc.ufcg.edu.br
Sem Alocação de Espaço
struct Exemplo01
{
char nome[40];
char espec[80];
int quant;
};
Com Alocação de Espaço
struct Exemplo01
{
char nome[40];
char espec[80];
int quant;
} Almoxarifado;
6
Structs IV
DSC/CCT/UFCG
Tipos de Dados definidos pelo Usuário
(Typedef)
Typedef
Facilidade de criação de sinônimos para
nomes de tipos de dados predefinidos
{joseana, rangel}@dsc.ufcg.edu.br
typedef int Quantidade;
(Quantidade torna-se sinônimo do tipo
int)
Quantidade q1, q2;
Quantidade quant[20];
7
Structs V
DSC/CCT/UFCG
Typedef e Struct
Uso combinado Declaração de um
{joseana, rangel}@dsc.ufcg.edu.br
sinônimo (ou codinome) para uma struct
typedef struct /* Definicao de uma estrutura */
{
int num_item;
char nome_item[30];
char espec_item[60] ;
} Estrutura;/* Codinome da struct */
Estrutura est1; /* Criação de uma variavel do
tipo Estrutura */
8
Structs VI
DSC/CCT/UFCG
Acesso a membros de uma Struct
Uso do operador ponto (.)
Estrutura.num_item;
Uso do operador seta (->)
{joseana, rangel}@dsc.ufcg.edu.br
struct Estrutura *Apont = &num_item;
Apont -> num_item;
(Equivalente a (*Apont).num_item;)
9
DSC/CCT/UFCG
{joseana, rangel}@dsc.ufcg.edu.br
Structs VII
Exemplo 01 (1/2)
#include <stdio.h>
struct TecProg /* Criacao de uma struct sem alocacao de espaco */
{ long mat;
float nota;
};
struct identidade /* Criacao de uma segunda struct que inclui a
primeira */
{ char nome[40];
struct TecProg aluno;
};
10
Structs VIII
DSC/CCT/UFCG
Exemplo 01 (2/2)
{joseana, rangel}@dsc.ufcg.edu.br
void main ( )
{
struct identidade aluno1 = {“Alberto Pontes"},
*apont = &aluno1 ;
}
aluno1.aluno.mat = 20411032;
aluno1.aluno.nota = 7.8 ;
printf ("%s %ld %f\n", aluno1.nome, aluno1.TecProg.id,
aluno1.TecProg.nota) ;
printf ("%s %ld %f\n", apont->nome, apont->aluno.id,
apont->TecProg.nota) ;
return 0;
11
Unions I
DSC/CCT/UFCG
Union I
Declaração de um tipo de união e/ou de
uma variável de um tipo de união
{joseana, rangel}@dsc.ufcg.edu.br
Sintaxe
union [etiqueta]
{
lista_de_membros
} [declaradores];
12
Unions II
DSC/CCT/UFCG
Union II
{joseana, rangel}@dsc.ufcg.edu.br
Definição do tipo de dados pelo usuário
Possibilidade de armazenamento de
valores de diferentes tipos em diferentes
instantes do processamento
Similaridade com uma struct, exceto
pelo fato de todos os membros
ocuparem a mesma locação de memória
Possibilidade de contenção de apenas
um dos membros de cada vez
Tamanho Função do maior membro
13
Unions III
DSC/CCT/UFCG
Exemplo 02
{joseana, rangel}@dsc.ufcg.edu.br
union Exemplo02 /* Declaracao de um tipo union */
{
char caractere;
int inteiro;
long int_longo;
float pto_flut;
double dupla_prec;
} TipoUniao; /* Declaracao opcional da variavel union */
14
DSC/CCT/UFCG
Unions IV
Exemplo 03
{joseana, rangel}@dsc.ufcg.edu.br
typedef union {
int intval;
float realval;
} inteiro_ou_real;
inteiro_ou_real num;
num.intval = 3; /* x como variavel int */
num.realval = 3.1416; /* x como variavel float sobrescreve
o valor int */
15
Unions V
DSC/CCT/UFCG
Exemplo 04 - Combinação de union e
struct (1/3)
{joseana, rangel}@dsc.ufcg.edu.br
union situacao
{
int col;
char grau[4];
};
struct selecao
{
long inscr;
float nota;
union situacao nivel;
};
struct identidade
{
char nome[40];
struct selecao candidato;
};
16
DSC/CCT/UFCG
Unions VI
Exemplo 04 - Combinação de union e
struct (2/3)
{joseana, rangel}@dsc.ufcg.edu.br
int main( )
{
struct identidade cand2 = {“Álvaro Guedes"},
*apont = &cand2 ;
cand2. candidato.inscr = 20411038;
cand2. candidato.nota = 5.7;
printf (“Digite status do candidato (A ou R)\n");
scanf ("%c", &A_R);
if (A_R == ‘A')
{
printf (“Digite colocacao (inteiro de 1 a 40)\n");
scanf ("%d", &cand2.candidato.nivel.col);
printf ("%s eh nivel %d\n”, cand2.nome,
cand2.candidato.nivel.col);
} /* Fim do if */
17
DSC/CCT/UFCG
{joseana, rangel}@dsc.ufcg.edu.br
Unions VII
Exemplo 04 - Combinação de union e
struct (3/3)
else
{ printf (“Digite o grau (Ms ou Gr\n");
scanf ("%s", &cand2.candidato.nivel.grau);
printf ("%s eh um %s candidato\n”,
cand2.nome , cand2.candidato.nivel.grau);
} /* Fim do else */
printf ("%s %ld %f\n” , cand2.nome , cand2.candidato.id,
cand2.candidato.inscr);
printf ("%s%ld %f\n” , apont->nome , apont->candidato.id ,
apont->candidato.inscr);
} /* Fim do programa */
18
Enums I
DSC/CCT/UFCG
Enumeração I
Tipo de dado definido pelo usuário a partir
da palavra-chave enum
{joseana, rangel}@dsc.ufcg.edu.br
Sintaxe
enum [etiqueta]
{
lista_de_enumeradores
} [declarador];
19
Enums II
DSC/CCT/UFCG
Enumeração II
Etiqueta Uso indireto
Lista_de_enumeradores
Constantes
simbólicas
Valores inteiros de 0 a n
Exemplo 05
{joseana, rangel}@dsc.ufcg.edu.br
enum dias {Segunda, Terca, Quarta};
Criação de 3 constantes
Segunda é associada ao valor 0
Terca é associada a 1
Quarta é associada a 2
20
Enums III
DSC/CCT/UFCG
Enumeração III
{joseana, rangel}@dsc.ufcg.edu.br
Lista_de_enumeradores
Primeiro enumerador Atribuição do
valor 0
Cada
enumerador
sucessivo
Atribuição de um valor maior do que o
de seu predecessor
Possibilidade de especificação explícita
de um valor para um enumerador
particular
21
Enums IV
DSC/CCT/UFCG
Enumeração IV
{joseana, rangel}@dsc.ufcg.edu.br
Lista_de_enumeradores
Enumeradores não precisam
associados a valores únicos
O nome de cada enumerador deve ser
único no escopo de definição da enum
A conversão de um inteiro para um
enumerador requer um cast explícito
estar
Os resultados não são definidos
22
DSC/CCT/UFCG
{joseana, rangel}@dsc.ufcg.edu.br
Enums V
Exemplo 06 - Uso de tipos de dados
enumerados para acesso aos itens de um
array
#include <stdio.h>
int main( )
{
int Novembro[5][7]={{0,0,1,2,3,4,5},{6,7,8,9,10,11,12},
{13,14,15,16,17,18,19},{20,21,22,23,24,25,26},
{27,28,29,30,0,0,0}};
enum dias {Domingo, Segunda, Terca, Quarta, Quinta, Sexta,
Sabado}
enum semana {semana01, semana02, semana03, semana04,
semana05};
printf (“Quinta da primeira semana de Novembro eh dia %d\n",
Novembro [semana01][Quinta]);
}
23
Structs em C/ C++ I
{joseana, rangel}@dsc.ufcg.edu.br
DSC/CCT/UFCG
C
C++
Uso
explícito
da
palavra-chave
struct
para
a
declaração/
definição da estrutura
Similaridade com uma
classe
(class)
com
membros
públicos
(public) por definição
Uso desnecessário da
palavra-chave
struct
após
a
declaração/
definição do tipo
24
DSC/CCT/UFCG
Structs em C/ C++ II
Exemplo 07
struct INDIVIDUO // Declaracao do tipo struct INDIVIDUO
{
int idade; // Declaracao dos tipos dos membros
char nome[40];
float altura;
float peso;
} membro_da_familia; // Definicao da variavel do tipo INDIVIDUO
{joseana, rangel}@dsc.ufcg.edu.br
struct INDIVIDUO pai; // Declaracao da estrutura em C
INDIVIDUO mae, tio, prima; // Declaracao da estrutura em C++
mae.altura = 1.69; // Atribuicao de valores aos membros
pai.idade = 76;
prima.nome = {“Julia Lemos de Andrade”};
tio.peso = 87;
25
DSC/CCT/UFCG
Structs em C/ C++ III
Exemplo 08 (Inicialização)
struct PONTO // Declaracao da estrutura PONTO
{
int x;
// Definicao de membros da estrutura PONTO
int y;
} alvo = {20, 40}; // Atribuicao dos valores x = 20,
// y = 40 ah variavel alvo
{joseana, rangel}@dsc.ufcg.edu.br
struct PONTO ponto1; // Declaracao de variavel do tipo PONTO
struct FOCO // Declaracao do campo de bits FOCO
{
unsigned caractere: 8; // 00000000 ????????
unsigned foreground: 3; // 00000??? 00000000
unsigned intensidade: 1; // 0000?000 00000000
unsigned background: 3; // 0???0000 00000000
unsigned pisca: 1; // ?0000000 00000000
} tela[25][80]; // Array de campos de bits
26
Unions em C/ C++ I
{joseana, rangel}@dsc.ufcg.edu.br
DSC/CCT/UFCG
C
C++
Uso
explícito
da
palavra-chave
union
para
a
declaração/
definição da união
Uso desnecessário da
palavra-chave
union
após
a
declaração/
definição do tipo
27
Unions em C/ C++ II
DSC/CCT/UFCG
Exemplo 09
union JUNCAO
{
int a, b, c;
float d, e, f;
double g, h, i;
};
{joseana, rangel}@dsc.ufcg.edu.br
union JUNCAO v1; // Declaracao da estrutura em C
JUNCAO v2; // Declaracao da estrutura em C++
v1.b = 5; // Uso da variavel como int
v2.d = 5.13; // Uso da variavel como float
v1.h = 7.256; // Uso da variavel como double
28
Enums em C/ C++ I
{joseana, rangel}@dsc.ufcg.edu.br
DSC/CCT/UFCG
C
C++
Uso
explícito
da
palavra-chave
enum
para a declaração da
união
Uso apenas da etiqueta
(tag) da enumeração
29
DSC/CCT/UFCG
Enums em C/ C++ II
Exemplo 10
enum Dias // Declaracao do tipo enum Dias
{
Sabado, // Sabado = 0 (por definicao)
Domingo = 0, // Domingo = 0 (por atribuicao do usuario)
Segunda, // Segunda = 1
Terca, // Terca = 2
Quarta, // Quarta = 3
Quinta, // Quinta = 4
Sexta // Sexta = 5
} Hoje; // Criacao da variavel Hoje do tipo Dias
{joseana, rangel}@dsc.ufcg.edu.br
int Sexta; // Definicao incorreta (redefinicao de Sexta)
enum Dias Ontem; // Correta em C e C++
Dias Amanha; // Correta apenas em C++
Ontem = Quinta;
int d = Quinta; // Correta (atribuicao de 2 a d)
Ontem = 0; // Incorreta (sem conversao de tipo)
Ontem = (Dias)0; // Correta, mas com resultados indefinidos
30
DSC/CCT/UFCG
José Eustáquio Rangel de Queiroz
[email protected], [email protected]
{joseana, rangel}@dsc.ufcg.edu.br
UNIVERSIDADE FEDERAL DE CAMPINA GRANDE
CENTRO DE CIÊNCIAS E TECNOLOGIA
DEPARTAMENTO DE SISTEMAS E
COMPUTAÇÃO