C++: Estruturas (struct)

Conceitos Fundamentais para Engenharia

Tópicos

  • Definição e uso de estruturas
  • Aninhamento de estruturas
  • Arrays de estruturas
  • Passagem de estruturas para funções
  • Inicialização de estruturas
  • Boas práticas
  • Estruturas e Programação Orientada a Objetos

Definição e Uso de Estruturas


struct Ponto {
    int x; // Coordenada x
    int y; // Coordenada y
};

int main() {
    Ponto p1;          // Declaração de uma estrutura Ponto
    p1.x = 10;        // Atribuição do valor 10 ao membro x
    p1.y = 20;        // Atribuição do valor 20 ao membro y
    
    Ponto p2 = {30, 40}; // Inicialização usando lista de inicialização
    
    return 0;
}
                

Membros da Estrutura

  • Os elementos dentro de uma estrutura são chamados de membros
  • Cada membro pode ter um tipo de dado diferente
  • Os membros são acessados usando o operador ponto (.)
  • Os membros definem as características da estrutura
struct Carro {
  string marca;    // membro marca
  string modelo;   // membro modelo
  int ano;         // membro ano
  float preco;     // membro preco
};

Vantagens das Estruturas

  • Agrupamento de dados relacionados
  • Melhora a organização do código
  • Facilita a passagem de dados complexos

Aninhamento de Estruturas


struct Endereco {
    string rua;   // Nome da rua
    int numero;    // Número do endereço
};

struct Pessoa {
    string nome;       // Nome da pessoa
    int idade;         // Idade da pessoa
    Endereco endereco; // Endereço aninhado
};

int main() {
    Pessoa p;
    p.nome = "Ana";
    p.idade = 30;
    p.endereco.rua = "Rua Principal";
    p.endereco.numero = 123;
    
    return 0;
}
                

Benefícios do Aninhamento

  • Hierarquia de dados
  • Representação de relações complexas
  • Modularidade e reusabilidade

Arrays de Estruturas


struct Aluno {
    string nome;      // Nome do aluno
    int matricula;    // Número de matrícula
    float nota;       // Nota do aluno
};

int main() {
    Aluno turma[3] = {
        {"Carlos", 1001, 8.5},
        {"Maria", 1002, 9.0},
        {"João", 1003, 7.5}
    };
    
    for (int i = 0; i < 3; i++) {
        cout << turma[i].nome << ": " << turma[i].nota << endl;
    }
    
    return 0;
}
                

Passagem de Estruturas para Funções


struct Aluno {
    string nome;
    int matricula;
    float nota;
};

// Função que imprime um aluno (passagem por valor)
void imprimirAluno(Aluno a) {
    cout << a.nome << " - " << a.nota << endl;
}

// Função que atualiza a nota do aluno (passagem por referência)
void atualizarNota(Aluno &a, float novaNota) {
    a.nota = novaNota;
}

int main() {
    Aluno aluno = {"Carlos", 1001, 8.5};
    imprimirAluno(aluno); // Saída: Carlos - 8.5
    atualizarNota(aluno, 9.0);
    imprimirAluno(aluno); // Saída: Carlos - 9.0
    return 0;
}
                

Inicialização de Estruturas


struct Produto {
    string nome;
    double preco;
    int quantidade = 0; // Valor padrão
};

int main() {
    // Inicialização direta
    Produto p1;
    p1.nome = "Caneta";
    p1.preco = 1.50;
    
    // Inicialização com lista
    Produto p2 = {"Caderno", 5.00, 10};
    
    // Inicialização com lista omitindo o valor padrão
    Produto p3 = {"Borracha", 0.50};
    
    return 0;
}
                

Ponteiros para Estruturas

struct Pessoa {
    string nome;
    int idade;
};

int main() {
    Pessoa* ptr = new Pessoa;    // Criação de ponteiro para estrutura

    // Acesso aos membros usando operador seta (->)
    ptr->nome = "Maria";         // Equivalente a (*ptr).nome
    ptr->idade = 25;            // Equivalente a (*ptr).idade

    cout << ptr->nome << ": " << ptr->idade << " anos" << endl;

                         delete ptr;    // Liberação da memória
                         return 0;
                         }
  • O operador seta (->) é usado para acessar membros através de ponteiros
  • ptr->membro é equivalente a (*ptr).membro
  • Simplifica a sintaxe e torna o código mais legível

Boas Práticas no Uso de Estruturas

  • Mantenha Estruturas Simples: Agrupe apenas dados relacionados sem lógica complexa.
  • Nomenclatura Clara: Use nomes descritivos para estruturas e seus membros.
  • Consistência: Mantenha um padrão consistente na definição e uso das estruturas.
  • Comentários: Documente a finalidade de cada estrutura e seus membros.

Estruturas e Programação Orientada a Objetos

  • Estruturas dão origem à programação orientada a objetos (POO)
  • Classes em POO são evoluções das estruturas
  • Conceitos como encapsulamento, herança e polimorfismo derivam dessa evolução
  • Esses conceitos avançados estão além do escopo desta disciplina
  • Estruturas fornecem uma base sólida para entender organização de dados

Conclusão

  • Estruturas são fundamentais em C++
  • Permitem organização eficiente de dados
  • Essenciais para problemas de engenharia complexos
  • Base para conceitos avançados de programação