Aula 2.18 - Registros em C e typedef
Na aula de hoje aprenderemos sobre estruturas, os famosos registros. Registros são um conjunto de dados logicamente relacionados mas de tipos diferentes. Por exemplo, os dados que representam uma pessoa pode incluir:
int idade; //guardar a idade atual da pessoa
char sexo; //guardar o sexo M ou F
char nome[100]; //guardar o nome
int ano_nascimento; //guardar o ano de nascimento
Como pode notar existem variáveis de tipos diferentes que estruturam um indivíduo. Com isso em mente, podemos fazer a definição de registros para formar essa estrutura única. A definição de registros utiliza a seguinte sintaxe:
struct nome_da_sua_estrutura{
tipo nome_variavel;
tipo nome_variavel2;
};
Você pode inserir quantas variáveis achar necessário dentro de um registro. Exemplo:
struct Conta{
int numero;
char cliente[100];
char endereco[100];
float saldo;
};
O registro acima se refere a uma estrutura de conta bancária. Com a definição pronta, é necessário fazer a declaração.
Você pode fazer a declaração separada da definição:
struct Conta conta1;
Ou juntamente com a definição do registro:
struct Conta{
int numero;
char cliente[100];
char endereco[100];
float saldo;
}conta1;
Nos dois exemplos acima conta1 é uma variável do tipo struct Conta. Mas como acessar então um membro dessa estrutura? Simples, utilizamos do operador . (ponto).
Seguindo o exemplo da struct Conta, para acessar o membro saldo escrevemos da seguinte forma: conta1.saldo
Confira o exemplo na prática abaixo:
Como pode observar na imagem acima, a definição da estrutura Conta foi feita fora da função principal e sua declaração dentro da função principal. Assim, conta1 é uma variável do tipo struct que possui membros (outras variáveis) como numero, cliente, endereco e saldo. Fácil de entender correto? Aquele getchar na linha 13 é apenas para corrigir um bug ao ler uma string após ler um inteiro, sem ele, no compilador que estou utilizando o fgets pega o enter dado pelo usuário após o usuário digitar o numero da conta.
Você deve estar se perguntando porque a estrutura foi definida fora da função principal. Isso deve ser feito pois se for declarada apenas dentro de uma função, apenas essa função conhecerá essa definição, assim definida fora de qualquer função, a estrutura pode ser utilizada em várias funções.
A declaração de estruturas pode ser feita de uma forma mais simples utilizando definição de tipos, ou seja o comando typedef. Com ele é possível declarar uma estrutura unicamente através de uma palavra. Exemplo:
Repare nas alterações feita nas linhas 2, 7 e 9.
Você pode utilizar o typedef para outras definições. Exemplos:
typedef double real; //define real como double
typedef unsigned char uchar; //define uchar como unsigned char
A passagem de registros para funções é simples, entre os parênteses coloca-se declaração da estrutura. Exemplo:
void imprime(struct Conta contax);
ou
void imprime(CONTA contax); //caso utilize typedef
Confira na imagem abaixo:
Note que na linha 26 foi declarado uma variáveis denominada conta2, logo após preencher o registro em conta1, na linha 29, o que tem contido em conta1 é copiado para conta2. Assim foi demonstrado que é possível realizar atribuições em registros.
A passagem de registros em funções talvez seja necessário ser feita como em ponteiros (aula 2.17), caso deseja fazer alterações no registro ou preencher um registro, isso foi feito na função preenche() da imagem acima, enquanto que na função imprime() a passagem do registro para a função foi feita por valor ou seja o que foi recebido foi uma cópia do registro.
Na linha 10 você deve ter notado a utilização de um operador diferente -> (sinal de menos seguido do sinal de maior), pois o operador . (ponto) possui maior precedência que o operador & e *, portanto para evitar erros de compilação utiliza-se o operador -> em determinadas situações como da imagem acima.
É possível criar registro dentro de registro, isso se denomina registros aninhados. Confira um exemplo, a estrutura abaixo representa um registro de data:
typedef struct DATA{
int Dia;
char Mes[10];
int Ano;
} Data;
Logo em seguida definimos outra estrutura que representa um registro de pessoa:
typedef struct PESSOA{
int idade;
char telefone[12];
Data nascimento;
} Pessoa;
Como pode notar acima, foi criado uma variável chamada nascimento do tipo Data, logo a variável nascimento armazenará os seguintes dados: Dia, Mes e Ano da estrutura DATA. Mas como acessar esses dados? Simples, supondo que tenha declarado na função principal da seguinte forma:
int main(){
Pessoa Maria;
Para acessar as informações contida na variável nascimento basta fazer da seguinte forma por exemplo para imprimir:
printf("Nascimento: %d/%s\n",Maria.nascimento.Dia,Maria.nascimento.Mes);
No exemplo acima imprimirá o dia e mês de nascimento, caso deseja imprimir o ano utiliza-se: Maria.nascimento.Ano .
Para finalizar essa aula, vamos aprender como criar um vetor de registros. É bastante simples, confira o exemplo abaixo:
O código acima realiza cadastro de 20 funcionários e depois exibe os funcionários cadastrados na tela. Como pode notar na linha 15 foi declarado um vetor de 20 posições (M vale 20 como informado na linha 4), caso não fosse utilizado typedef, sua declaração seria da seguinte forma: struct funcionario funcionario[M];
Para acessar uma posição de um vetor de registros, basta fazer como na linha 29 informando a posição que deseja acessar entre os colchetes [ ] antes do . (ponto).
Bom, essa aula foi longa! Aguarde pelos exercícios e qualquer dúvida comente abaixo.
>> Próxima aula, clique aqui.
COMENTÁRIOS