310 likes | 445 Views
Structs, Unions e. Enums em C e C++. Técnicas de Programação. Prof.: José Eustáquio Rangel de Queiroz rangel@dsc.ufcg.edu.br rangeldequeiroz@gmail.com. Carga Horária: 60 horas. Tópicos. Structs Unions Enums. Structs I.
E N D
Structs, Unions e Enums em C e C++ Técnicas de Programação Prof.:José Eustáquio Rangel de Queiroz rangel@dsc.ufcg.edu.br rangeldequeiroz@gmail.com Carga Horária:60 horas
Tópicos • Structs • Unions • Enums
Structs I • Arrays Exigência de todos os elementos do mesmo tipo de dados • Fatos • Necessidade de agrupamento de informações envolvendo diferentes tipos de dados • 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
Structs II • 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) • Uso de structs
Structs III • Struct • Tipo derivado de dados composto de membros associados a tipos de dados elementares ou derivados • Struct Única • Armazenamento dos dados associados a um objeto • Array de structs • Armazenamento dos dados associados a vários objetos
Structs IV • Declaração de Structs
Structs IV • Tipos de Dados definidos pelo Usuário (Typedef) • Typedef • Facilidade de criação de sinônimos para nomes de tipos de dados predefinidos typedef int Quantidade; (Quantidadetorna-se sinônimo do tipoint) Quantidade q1, q2; Quantidade quant[20];
Structs V • Typedef e Struct • Uso combinado Declaração de um 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 */
Structs VI • Acesso a membros de uma Struct • Uso do operador ponto (.) Estrutura.num_item; • Uso do operador seta (->) struct Estrutura *Apont = &num_item; Apont -> num_item; (Equivalente a (*Apont).num_item;)
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; } ;
Structs VIII • Exemplo 01 (2/2) 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; }
Unions I • Union I • Declaração de um tipo de união e/ou de uma variável de um tipo de união • Sintaxe union [etiqueta] { lista_de_membros } [declaradores];
Unions II • Union II • 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
Unions III • Exemplo 02 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 */
Unions IV • Exemplo 03 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 */
Unions V • Exemplo 04 - Combinação de union e struct (1/3) union situacao { int col; char grau[4]; }; struct selecao { long inscr; float nota; union situacao nivel; }; struct identidade { char nome[40]; struct selecao candidato; };
Unions VI • Exemplo 04 - Combinação de union e struct (2/3) 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 */
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 */
Enums I • Enumeração I • Tipo de dado definido pelo usuário a partir da palavra-chaveenum • Sintaxe enum [etiqueta] { lista_de_enumeradores } [declarador];
Enums II • Enumeração II • Etiqueta Uso indireto • Lista_de_enumeradores Constantes simbólicas • Valores inteiros de 0 a n • Exemplo 05 enum dias {Segunda, Terca, Quarta}; • Criação de 3 constantes • Segunda é associada ao valor 0 • Terca é associada a 1 • Quarta é associada a 2
Enums III • Enumeração III • 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
Enums IV • Enumeração IV • Lista_de_enumeradores • Enumeradores não precisam estar 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 • Os resultados não são definidos
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]); }
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 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;
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 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
Unions em C/ C++ II • Exemplo 09 union JUNCAO { int a, b, c; float d, e, f; double g, h, i; }; 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
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 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
José Eustáquio Rangel de Queiroz UNIVERSIDADE FEDERAL DE CAMPINA GRANDE CENTRO DE CIÊNCIAS E TECNOLOGIA DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO rangel@dsc.ufcg.edu.br, rangeldequeiroz@gmail.com