Universidade Federal de Uberlândia Faculdade de Computação Linguagem C: tipos de dados definidos pelo programador: struct union enum typedef Prof. Renato Pimentel 1 Introdução Tipos de variáveis vistos até agora: Tipos básicos: char, int, float, double; Tipos compostos homogêneos (arrays). 2 Prof. Renato Pimentel 1
Introdução Tipos de variáveis vistos até agora: Tipos básicos: char, int, float, double; Tipos compostos homogêneos (arrays). Linguagem C permite que o programador defina novos tipos de dados a partir dos tipos básicos: 1.Estruturas ou registros (comando struct); 2.Uniões (comando union); 3.Enumerações (comando enum); 4.Renomear tipos existentes (comando typedef). 3 4 Prof. Renato Pimentel 2
Arrays são estruturas de dados homogêneas: armazenam dados de um único tipo. Podem ocorrer situações em que precisamos agrupar dados de tipos diferentes: Exemplo: cadastro de folha de pagamento: nome (string) CPF (int) remuneração (float) etc. Solução: criar um novo tipo de dado para acomodar o conjunto destas informações struct (estrutura ou registro). 5 Cada estrutura ou registro representa uma variável que contém variáveis; Tais variáveis são chamadas de campos da estrutura; Esses campos representam informações que, dentro de um determinado contexto, fazem sentido se agrupadas. É possível comparar uma estrutura com uma ficha cadastral, que possui todos os dados sobre uma determinada entidade: Registro de alunos (nome, matrícula, idade, aproveitamento, etc.) Registro de pacientes (nome, endereço, histórico de doenças, etc.) 6 Prof. Renato Pimentel 3
Forma geral da declaração de uma estrutura: struct nome_do_tipo_da_estrutura { tipo1 campo1; tipo2 campo2;... tipon campon; }; 7 Prof. Renato Pimentel 4
Exemplo: struct cadastro { int numero; char nome[40]; int idade; char endereco[80]; }; Campos da estrutura são definidos como visto para variáveis: Cada nome deve ser diferente de outro; Porém, estruturas diferentes podem ter o mesmo nome! 9 2 estruturas diferentes: struct cadastro { int numero; char nome[40]; int idade; char endereco[80]; }; struct aluno { int matricula; char nome[40]; float nota1, nota2, nota3; }; Campos da estrutura são definidos como visto para variáveis: Cada nome deve ser diferente de outro; Porém, estruturas diferentes podem ter o mesmo nome! 10 Prof. Renato Pimentel 5
Declarando uma variável do tipo da estrutura: struct cadastro { }; int numero; char nome[40]; int idade; char endereco[80]; struct cadastro c; Também poderíamos ter declarado a variável c diretamente na criação da struct: struct cadastro { } c; int numero; char nome[40]; int idade; char endereco[80]; Note o uso do ; após o comando struct em ambos os casos!!! 11 Acesso aos campos da estrutura:. Exemplo: Comandos de atribuição para os campos 12 Prof. Renato Pimentel 6
Acesso aos campos da estrutura:. Exemplo: Comandos de leitura para os campos 13 Inicialização de estruturas Similar ao visto para arrays Ex.: struct cadastro c = { Carlos, 18, Av. Brasil, 451}; Array de estruturas Ex.: cadastro de 100 clientes: struct cadastro c[100]; Exemplos de utilização: gets(c[i].nome); c[10].rua = c[20].rua; //. depois de []!!! etc. 14 Prof. Renato Pimentel 7
Atribuição: = Copia dados dos campos de uma variável struct para outra; Atenção: Ambas devem ser do mesmo tipo! struct cadastro c[100], d; struct cadastro2 e; //outro tipo c[50]=c[51]; // copia dados de c[51] p/ c[50] d=c[0]; // copia dados de c[0] para d e=d; // ERRO!!! Estruturas de tipos diferentes 15 Aninhamento de estruturas: campos dentro de uma estrutura podem ser de tipos diferentes dos básicos: por exemplo, outra estrutura!! Exemplo: struct endereco { }; char rua[50]; int numero; struct cadastro{ } c; char nome[50]; int idade; struct endereco ender; // ender é do tipo endereco gets(c.ender.rua); // exemplo de uso 16 Prof. Renato Pimentel 8
Uniões: comando union 17 Uniões: comando union Como estrutura, representa uma variável que contém variáveis; Declarada da mesma maneira que uma estrutura. Porém, na união, apenas é alocado espaço para o campo que ocupa mais memória! Essa memória é compartilhada com os demais! Economia! Apenas um campo pode ser acessado de cada vez; Em structs, memória suficiente para todos os campos é reservada para uso dos mesmos! union: usar quando houver variáveis que não serão usadas simultaneamente! 18 Prof. Renato Pimentel 9
Uniões: comando union Forma geral da declaração de uma união: union nome_do_tipo_da_uniao { tipo1 campo1; tipo2 campo2;... tipon campon; }; 19 Uniões: comando union Como em uma união, a memória é compartilhada entre os campos, a alteração de um afeta os demais: Saída: x = 1545 c = 9 c = 69 x = 1605 20 Prof. Renato Pimentel 10
Enumerações: comando enum 21 Enumerações: comando enum Ideia: criar um tipo de dado que contenha várias constantes. Cada variável enum somente poderá assumir um dos valores criados na declaração do tipo. 22 Prof. Renato Pimentel 11
Enumerações: comando enum Forma geral da declaração de uma enumeração: enum nome_enum { lista_de_identificadores}; A lista_de_identificadores é uma lista de palavras separadas por vírgulas, onde cada identificador deve ser criado seguindo as regras vistas para nomes de variáveis. Exemplo: enum semana {Domingo, Segunda, Terca, Quarta, Quinta, Sexta, Sabado}; 23 Enumerações: comando enum Exemplo: Neste exemplo, a saída será: Domingo = 0 s1 = 1 s2 = 2 s3 = 6 Isto porque, numa enumeração, é atribuído o valor inteiro 0 à primeira palavra, o valor 1 à segunda e assim por diante. 24 Prof. Renato Pimentel 12
Enumerações: comando enum É possível alterar uma constante, igualando-a a um dado valor. A subsequente, caso exista, terá o valor da constante, acrescido de 1, e assim por diante. Exemplo: enum semana {Domingo = 1, Segunda, Terca, Quarta = 7, Quinta, Sexta, Sabado}; Neste caso, temos que: Domingo = 1 Quinta = 8 Segunda = 2 Sexta = 9 Terca = 3 Sabado = 10 Quarta = 7 25 Renomeando tipos existentes: comando typedef 26 Prof. Renato Pimentel 13
Renomeando tipos existentes: comando typedef Ideia: programador pode definir seus próprios tipos com base em tipos existentes. Na verdade, são criados apelidos ou sinônimos para os tipos de dados básicos ou definidos pelo usuário (ex.: via struct) 27 Renomeando tipos existentes: comando typedef Forma geral do comando typedef: typedef tipo_existente novo_nome; Exemplo: typedef int inteiro; int x = 10; inteiro y = 20; y = y + x; // y = 30 28 Prof. Renato Pimentel 14
Renomeando tipos existentes: comando typedef Exemplo: struct cadastro { }; int numero; char nome[40]; int idade; char endereco[80]; typedef struct cadastro cad; cad c; // mais prático que escrever struct cadastro c; 29 Renomeando tipos existentes: comando typedef Podemos ainda combinar o comando typedef com a declaração de um tipo definido pelo usuário. Retomando o exemplo anterior: typedef struct cadastro { } cad; int numero; char nome[40]; int idade; char endereco[80]; cad c; // mais prático que escrever struct cadastro c; 30 Prof. Renato Pimentel 15
Renomeando tipos existentes: comando typedef Note que estamos associando um novo nome à estrutura, portanto podemos omitir o nome da mesma: typedef struct { } cad; int numero; char nome[40]; int idade; char endereco[80]; cad c; // mais prático que escrever struct cadastro c; 31 Exercícios 1. Crie uma estrutura para representar as coordenadas de um ponto qualquer (x,y) no espaço cartesiano bidimensional. A seguir, leia do teclado as coordenadas x e y de dois pontos, e calcule a distância entre ambos. 2. Crie uma estrutura para um retângulo, que contenha as coordenadas superior esquerda e inferior direita do mesmo, dadas pela estrutura de ponto do exercício anterior. A seguir, leia as coordenadas de ambos os pontos que definem um retângulo, e calcule a área e o perímetro do mesmo. 32 Prof. Renato Pimentel 16
Exercícios 3. Crie uma enumeração que represente os meses do ano. A seguir, leia um valor inteiro e exiba o nome do mês correspondente e quantos dias o mesmo possui. 4. Crie uma união contendo dois tipos básicos diferentes. Crie um programa que inicialize um dos campos desta união e exiba o dado do outro campo. 33 Referências BACKES, A. Linguagem C: completa e descomplicada. Rio de Janeiro: Elsevier, 2013. PAIVA, J. G. S. Notas de aula de algoritmos e programação de computadores. 34 Prof. Renato Pimentel 17