aula 169

Posso usar uma STRUCT dentro de outra STRUCT?

Já vimos em nosso curso de programação C como criar nosso tipo de dado com typedef struct e preenche-lo com informações lidas do teclado. Nesta aula veremos que é possível ter uma STRUCT dentro de outra STRUCT, deixando as informações ainda mais organizadas.

Imagine que agora queremos também salvar a data de nascimento do usuário. Poderíamos incluir mais três inteiros dentro do nosso tipo Pessoa, um para o dia, um para o mês e outro para o ano. Contudo, quanto mais organizados os dados estiverem melhor. Então, uma outra opção é criar um novo tipo para data, assim:

// tipo data de nascimento
typedef struct{
    int dia, mes, ano;
}DataNas;

Tendo agora um tipo data, podemos incluir esse tipo dentro do nosso tipo Pessoa, assim:

// tipo pessoa agora com uma data de nascimento
typedef struct{
    DataNas dataNas;
    int idade;
    char sexo;
    char nome[100];
}Pessoa;

Um ponto importante a ser observado é que apenas podemos usar um tipo depois dele ser criado. Isso significa que, se colocarmos o tipo data abaixo do tipo pessoa nós teremos um erro ao tentar compilar nosso código.

Código de exemplo em C para struct de struct

#include <stdio.h>
#include <stdlib.h>

/*
      Aula 169: Posso ter struct de struct?

      Escrito por Wagner Gaspar
      Abril de 2021
*/

typedef struct{
    int dia, mes, ano;
}DataNas;

typedef struct{
    DataNas dataNas;
    int idade;
    char sexo;
    char nome[100];
}Pessoa;

int main() {
    Pessoa pessoa;

    printf("Digite se nome: ");
    fgets(pessoa.nome, 100, stdin);
    printf("Digite sua idade: ");
    scanf("%d", &pessoa.idade);
    scanf("%c");
    printf("Digite f ou m para o sexo:");
    scanf("%c", &pessoa.sexo);

    // leitura do novo campo data de nascimento
    printf("Digite sua data de nascimento no formato dd mm aaaa:");
    scanf("%d%d%d", &pessoa.dataNas.dia, &pessoa.dataNas.mes, &pessoa.dataNas.ano);

    printf("Nome: %s\nIdade: %d\nSexo: %c\n", pessoa.nome, pessoa.idade, pessoa.sexo);
    printf("Data de nas.: %d/%d/%d\n", pessoa.dataNas.dia, pessoa.dataNas.mes, pessoa.dataNas.ano);

    return 0;
}

Deixe um comentário

5 × 5 =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.