Prática de Programação Prof. Tiago A. E. Ferreira Aula 9 Estruturas, Uniões, Enumerações e Tipos Definidos pelo Usuário
Introdução A linguagem C/C++ permite criar tipos de dados definidos pelo usuário de cinco formas distintas: Estrutura Campo de Bits União Enumeração Tipo Genérico (typedef)
Estruturas Uma Estrutura é uma coleção de variáveis referenciadas por um único identificador As variáveis que formam uma estrutura são chamadas de membros da estrutura, elementos ou campos. A palavra chave struct informa ao compilador a criação de uma estrutura: Definição da estrutura addr addr é um especificador de tipo } Ponto Membros, elementos ou campos da estrutura e vírgula no final!
Declarando Estruturas No último slide foi mostrado uma definição de estrutura Nenhuma variável foi declarada! Para que uma variável do tipo addr seja declarada: struct addr addr_info; Este último comando defini uma variável addr_info como sendo do tipo addr que é uma estrutura.
Declarando Estruturas Também é possível se declarar estruturas logo após a sua definição:
Declarando Estruturas Caso só haja a necessidade de declaração de apenas uma única estrutura, é possível escrever: Desta forma a estrutura é definida e addr_info é declarada.
Declarando Estruturas Resumindo, a forma geral para a definição e declaração de estrutura é dada por:
Referenciando Elementos de uma Estrutura Os elementos de uma estrutura são referenciados através do operador ponto O nome da variável estrutura seguido de um ponto e o nome do campo referencia o elemento da estrutura
Matriz de Estruturas Dada uma definição de uma estrutura, pode-se declarar um variável matriz do tipo estrutura Ex: struct addr addr_info[100] É declarado uma matriz de 100 elementos, onde cada um dos elementos é uma estrutura do tipo addr. Para se acessar o campo zip do terceiro elemento devese ter: addr_info[2].zip
Passando Elementos de Estruturas para Funções Declaração da variável mike do tipo estrutura fred Passagem dos elementos de mike
Passando Estruturas Inteiras para Funções Quando uma variável do tipo estrutura é passada para uma função, toda a estrutura é passada como valor para função Qualquer alteração na estrutura no interior da função não irá alterar a estrutura! (Passagem por VALOR)
Exemplo Definição da Estrutura deve ser global para que seja vista por todo programa Declaração da Estrutura Passagem da Estrutura Passagem por valor da estrutura
Ponteiros para Estruturas C/C++ permite ponteiros para estruturas assim com permite ponteiros para qualquer outro tipo de variáveis Contudo alguns cuidados devem ser tomados!
Declarando um Ponteiro para Estrutura Da mesma forma que se declara um ponteiro para uma variável, também é possível se declarar um ponteiro para uma estrutura Basta colocar o operador * antes do identificador da variável
Usando Ponteiros para Estruturas Há duas formas básicas de usos de ponteiros para estruturas: Gerar uma chamada por referência Criação de Estruturas de Dados Com por exemplo listas encadeadas.
Usando Ponteiro para Estruturas Já foi visto que é possível passar uma estrutura para uma função! Entretanto ao se passar uma estrutura para uma função está se realizando uma passagem por valor Toda a estrutura deverá ser copiada para a pilha da função! Esta operação é muito custosa, e para evitá-la deve-se utilizar uma passagem por referência. Com a passagem por referência apenas um ponteiro é passado para a pilha da função.
Exemplo Define e declara a estrutura Atribui ao ponteiro p o endereço da estrutura person com a utilização do operador &
Acessando Elementos da Estrutura através de Ponteiros Para acessar os elementos da estrutura person através do ponteiro p é necessário a utilização do operado seta (->) Exemplo: deseja-se acessa o elemento balance
Exemplo
Introdução Já estudamos as estruturas em C/C++, onde variáveis são agrupadas sob um mesmo identificador Um dada estrutura irá ocupar uma certa quantidade de bytes em memória que são acessados todas as vezes que a estrutura é acessada Problema: Se é desejado acessar apenas um bit desses bytes...
Campo de Bit A linguagem C/C++ tem um método intrínseco para acessar um bit dentro de um byte: Campo de Bit Utilidades: Se o armazenamento é limitado: pode-se armazamar várias variáveis booleanas em um byte Transmissão codificada em bits dentro de um byte Criptografia.
Campo de Bit O campo de bit é uma estrutura que defini o tamanho dos seus elementos em bits Definição:
Campo de Bit Os elementos de um campo de bit pode ser declarado com: int unsigned signed Os elementos de comprimento de 1 bit devem ser declarados com unsigned, pois um único bit não pode ter sinal.
Exemplo Os campos de bits são comumente utilizados quando se analise a entrada de um dispositivo de hardware Por exemplo, uma porta serial poderia retornar o seguinte:
Exemplo É possível representar a informação em um byte de estado usando um campo de bit:
Exemplo É possível escrever uma rotina para trabalhar com a porta de comunicação: Para atribuir valor a um elemento basta:
Efeitos Colaterais Os Campos de Bits têm algumas restrições: Não é possível se obter o endereço de uma variável do tipo Campo de Bit; Variáveis do tipo Campo de Bit não podem ser organizadas em Matrizes; Não se pode ultrapassar os limites dos inteiros; Os Campos de Bits podem ter dependências sobre a máquina Podem funcionam de forma diferentes em máquinas diferentes.
Uniões Uma União é uma posição de memória que é compartilhada por duas ou mais variáveis diferentes, geralmente de tipos diferentes, em momentos distintos. Definição:
Exemplo Definição: Declaração: Posição na Memória:
Acesso as Uniões Deve-se utilizar tampo os operadores ponto com seta: Se a união é operada diretamente: Se a união é passada como um ponteiro:
Utilidade das Uniões As Uniões são utilizadas para conversões não comuns de tipo. Por Exemplo: Imagine que queremos trabalhar com inteiros em máquinas diferentes, onde em uma máquina um inteiro tenha 2 bytes e na outra este tenha 3 bytes.
Utilidade das Uniões Construa a União: Imagine que uma máquina (int de 2 bytes) escreve um arquivo para a outra máquina (int de 3 byte) ler, pode-se criar a função putw(union pw word, FILE *fp){ } putc( 0, fp); // escreve o primeiro byte putc(word->ch[0], fp); // escreve o segundo byte putc(word->ch[1], fp); // escreve o terceiro byte
Enumerações Um enumeração é um conjunto de constantes inteiras que especifica todos os valores legais de uma variável desse tipo pode ter Exemplo: A moeda americana
Exemplo Dada a definição e declaração do slide passado é possível ter os comandos: Em uma enumeração cada célula é um valor inteiro. Logo para: printf( %d %d, penny, dime); Saída na tela: 0 2
Enumerações Modificadas É possível atribuir valores inteiros as células de uma enumeração: Agora os valores dos símbolos são:
Typedef C/C++ permite que seja definido novos nomes aos tipos de dados já existentes utilizando a palavra chave typedef Exemplos: Balance agora significa um tipo float Agora overdraf significa um tipo balance que por sua vez é um tipo float
Typedef e Estruturas Para estruturas temos: Definição Declaração Com o uso do typedef: Definição Declaração
Exercício 1 Monte um Estrutura que seja capaz de armazenar as informações sobre um aluno Matricula Nome Idade Sexo Dada esta estrutura, faça um programa que seja capaz de criar uma matriz dessa estrutura com quantos elementos o usuário deseje, e que possa cadastrar alunos e visualizar na tela a matriz cadastrada
Exercício 2 Crie dois tipo: real e dolar. Cria um programa que realize a conversão entre as duas moedas.