{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