Skip to content

Latest commit

 

History

History
166 lines (124 loc) · 6.2 KB

#27 Structs: Definição e Exemplos.md

File metadata and controls

166 lines (124 loc) · 6.2 KB

27 Structs: Definição e Exemplos

  • Struct ou registro é um "pacote" de variáveis que pode conter tipos diferentes, tem como objetivo agrupar um conjunto de dados que represente algo mais concreto

  • Em última análise a struct é um novo tipo de dados que nós mesmos criamos, um tipo de dados personalizado, que ao invés de receber apenas um valor como int x = 10;, pode receber N valores.

    • Ex: Uma pessoa tem diversos atributos como nome, idade, peso, cada um desses atributos se representados no código deveria ser armazenado em uma variável de tipo diferente.

      • nome: char[]
      • idade: int
      • peso: double
    • para apenas um dado fazer dessa maneira não teria maiores problemas, mas se tivermos duas pessoas, teríamos que declarar novas variáveis e como elas não poderiam ter o mesmo nome, teriam que ser criadas abordagem de nomenclatura para não se perder nos nomes das variáveis:

        char nome_pessoa1[];
        int idade_pessoa1;
        double peso_pessoa1;
      
        char nome_pessoa2[];
        int idade_pessoa2;
        double peso_pessoa2;
      
    • Como pode ser observado, quando mais dados temos que representar, mais teríamos que criar novas variáveis e é para que isso não ocorra que usamos as structs

  • A criação de uma struct segue o seguinte padrão


struct ?nome_struct {
  tipo_atributo1 nome_atributo1;
  ?tipo_atributo2 nome_atributo2;
} ?variavel_1, ?variavel_2;

  • O criação da struct é feito da seguinte maneira struct nome_struct nome_variavel;

  • O uso da struct é feito utilizando ponto (.)

    struct nome_struct nome_variavel;
    nome_variavel.atributo;
    
    • ⚠️: o uso do ponto é feito quando a struct é declarada de maneira estática, quando declaramos uma struct dinâmica, usamos seta (->)
  • Atribuição de valores durante a alocação estática

    struct nome_struct nome_variavel = {.atributo1 = "valor", .atributo2 = 10};
    
    • entre chaves, usamos o ponto seguido do nome do atributo
    • a separação dos atributos é feita utilziando vírgula
    • atributos do tipo char[] podem ser atribuídos diretamente
  • Note que alguns nomes começam com o ponto de interrogação (?), eles são campos opcionais

    • ?nome_struct: uma struct não necessariamente precisa ter um nome, ela pode ser uma struct anônima, neste caso é necessário criar ao menos uma variável, ela até pode ser útil em algumas situações, mas não e muito utilizada pelo fato de que você não consegue reutilizá-la, a única variável que terá seu tipo será a variável ou as variáveis definida em sua criação.

      struct {
        int quantidade;
        double valor;
      } produto_x;
      
      produto_x.quantidade = 10;
      produto_x.valor = 50.5;
      
      • Note que produto_x não é o nome da struct, mas sim a variável de uma struct anônima, logo seu uso é direto.
    • ?tipo_atributo2 nome_atributo2: apesar de uma struct ser criada para agrupar atributos comuns de algo, ela também pode ser criada com apenas uma atributo.

      struct Money {
        double valor;
      } dimdim;
    
      struct Money bufunfa;
    
      dimdim.valor = 23.2;
      bufunfa.valor = 10.5;
    
    • Note que neste exemplo a struct foi nomeada como Money, logo ela pode ser usada como tipo de outras variáveis que não foram declaradas no momento de criação da struct
    • ?variavel_1, ?variavel_2: o uso da declaração de variáveis no momento da criação da struct é muito útil em alguns caso, entretanto isso não é obrigatório, além disso, se necessário podem ser declaradas N variáveis no momento da criação de uma struct
    struct Aluno {
      char nome[50];
      double nota;
      int idade;
    }
    
    struct Animal {
      int idade;
      double peso;
    } cao, gato;
    
    struct Aluno pedrinho = {.nome = "Pedro", .nota = 4.5, .idade = 12};
    
    cao.idade = 2;
    cao.peso = 12.5;
    
    gato.idade = 3;
    gato.peso = 5.6;
    
    struct Animal vaca;
    vaca.idade = 15;
    vaca.peso = 400.8;
    
    • Note que cao e gato são variáveis declaradas na criação da struct e além delas a struct também pode ser usada para criar novas variáveis
  • A struct nos dá muita liberdade para trabalhar com diversos dados de um mesmo tipo e reduz bastante o código e variáveis criadas, porém ela ainda pode ser melhorada, perceba que em toda declaração de variável estamos usando a palavra reservada struct antes do nome da struct, isso pode ser contornado definindo a struct como um tipo de dados e dando um apelido (alias) à struct.

      typedef struct _aluno {
        double nota;
        int idade;
      } Aluno;
    
    • typedef: define a struct como um tipo de dados
    • _aluno: nome da struct, o underline (_) não é obrigatório, mas é uma convenção para desentimular o uso da struct da maneira padrão struct nome_struct
    • Aluno: alias ou apelido da struct, é ele que iremos querer usar na declaração das variáveis
      • ⚠️: Quando usamos o typedef todos os nomes que colocamos após a última chave da struct (}), não são variáveis, mas sim alias da struct, sendo que podemos declarar N alias diferentes para uma mesma struct
          typedef struct _aluno {
            double nota;
            int idade;
          } Aluno, Formando, Graduando;
        
    • Uso: Agora que a struct foi definida como um tipo de dado, podemos declarar novas variáveis utilizando apenas seus Alias
      • É possível usar também a maneira convencional, porém isso deve ser desestimulado para que o projeto siga o mesmo padrão
      typedef struct _aluno {
        char nome[50];
        double nota;
        int idade;
      } Aluno, Formando, Graduando;
    
      Aluno pedro;
      Aluno paulo = {.nome = "Paulo", .nota = 10, .idade = 18};
      Formando Maria;
      Graduando jose;
    
      struct _aluno zezinho; // Desestimulado: O ideal é seguir o padrão e usar somente os alias
    
  • Outra maneira de utlizar o typedef é para tornar struct anônimas em structs que podem ser reutilizadas, além de eliminar o uso de convenções para informar que algo é opcional ou que não deve ser usado.

      typedef struct {
        char nome[50];
        double nota;
        int idade;
      } Aluno;
    
      Aluno pedro;
      Aluno paulo = {.nome = "Paulo", .nota = 10, .idade = 18};