Estruturas (structs)

Uma struct (estrutura) em C++ é um tipo de dado personalizado que permite agrupar variáveis de diferentes tipos sob um mesmo nome, facilitando a organização e a manipulação de dados relacionados. Structs são muito úteis para representar entidades do mundo real, como alunos, carros, produtos, etc.

Como declarar uma estrutura

A declaração de uma struct segue a seguinte sintaxe:

struct NomeDaStruct {
tipo membro1;
tipo membro2;
// ...
};

Exemplo prático:

struct Aluno {
char nome[50];
float matematica;
float fisica;
float ciencias;
};

Neste exemplo, a struct Aluno possui três notas (matemática, física, ciências) e um nome.

Como criar variáveis do tipo struct

Após declarar a struct, você pode criar variáveis desse tipo:

Aluno aluno1, aluno2;

Ou ainda:

struct Aluno aluno3;

Como aceder e atribuir valores aos membros

Use o operador ponto (.) para aceder os membros:

strcpy(aluno1.nome, "Maria");
aluno1.matematica = 8.5;
aluno1.fisica = 7.0;
aluno1.ciencias = 9.2;

Para exibir os valores:

cout << "Nome: " << aluno1.nome << endl;
cout << "Matemática: " << aluno1.matematica << endl;
cout << "Física: " << aluno1.fisica << endl;
cout << "Ciências: " << aluno1.ciencias << endl;

Exemplo completo

#include <iostream>
#include <cstring>
using namespace std;

struct Aluno {
char nome[50];
float matematica;
float fisica;
float ciencias;
};

int main() {
Aluno aluno1;

cout << "Digite o nome do aluno: ";
cin.getline(aluno1.nome, 50);

cout << "Nota de Matemática: ";
cin >> aluno1.matematica;

cout << "Nota de Física: ";
cin >> aluno1.fisica;

cout << "Nota de Ciências: ";
cin >> aluno1.ciencias;

cout << "\nDados do Aluno:" << endl;
cout << "Nome: " << aluno1.nome << endl;
cout << "Matemática: " << aluno1.matematica << endl;
cout << "Física: " << aluno1.fisica << endl;
cout << "Ciências: " << aluno1.ciencias << endl;

return 0;
}

Neste exemplo, o programa lê os dados de um aluno e exibe as informações no ecran.

Structs e funções

Podemos passar structs como parâmetros para funções, facilitando a modularização do código:

void mostrarAluno(Aluno a) {
cout << "Nome: " << a.nome << endl;
cout << "Matemática: " << a.matematica << endl;
cout << "Física: " << a.fisica << endl;
cout << "Ciências: " << a.ciencias << endl;
}

E chamar dentro do main:

mostrarAluno(aluno1);

Structs e typedef

typedef serve para criar um nome alternativo para um tipo de dado, facilitando a declaração e tornando o código mais legível.

Sintaxe:

typedef struct {
    tipo membro1;
    tipo membro2;
} NomeTipo;

Exemplo:

typedef struct {
char nome[50];
int idade;
} Aluno;

Agora, para criar variáveis do tipo Aluno, basta:

cppAluno a1, a2;

Podemos também usar typedef para simplificar nomes de structs já nomeadas:

struct Produto {
char nome[30];
float preco;
};
typedef struct Produto Produto_t;

Agora, Produto_t é um apelido para struct Produto.

Exemplo completo: struct + typedef

c#include <iostream>
#include <cstring>
using namespace std;

typedef struct {
char nome[50];
int idade;
} Pessoa;

int main() {
Pessoa p;
strcpy(p.nome, "Lucas");
p.idade = 22;

cout << "Nome: " << p.nome << endl;
cout << "Idade: " << p.idade << endl;
return 0;
}

Structs e ponteiros

Um dos recursos mais poderosos em C++ é a combinação de structs (estruturas) com ponteiros. Essa abordagem permite manipular dados de forma flexível, criar estruturas dinâmicas e facilitar a passagem de dados entre funções.

Definir uma struct

Uma struct agrupa variáveis de diferentes tipos sob um mesmo nome:

struct Aluno {
char nome[50];
float matematica;
float fisica;
float ciencias;
};

Declarar ponteiros para structs

Podemos criar um ponteiro para uma struct da mesma forma que para outros tipos:

Aluno a1;
Aluno* ptrAluno = &a1; // ptrAluno aponta para a1

Aceder membros via ponteiro

Para acessar membros de uma struct via ponteiro, use o operador ->:

ptrAluno->matematica = 8.5;
strcpy(ptrAluno->nome, "Maria");

O operador -> é equivalente a (*ptrAluno).matematica, mas é mais prático e legível516.

Exemplo prático: leitura e exibição com ponteiros

cpp#include <iostream>
#include <cstring>
using namespace std;

struct Aluno {
    char nome[50];
    float matematica;
    float fisica;
    float ciencias;
};

int main() {
    Aluno a1;
    Aluno* ptr = &a1;

    cout << "Digite o nome do aluno: ";
    cin.getline(ptr->nome, 50);

    cout << "Nota de Matemática: ";
    cin >> ptr->matematica;

    cout << "Nota de Física: ";
    cin >> ptr->fisica;

    cout << "Nota de Ciências: ";
    cin >> ptr->ciencias;

    cout << "\nResumo do Aluno:" << endl;
    cout << "Nome: " << ptr->nome << endl;
    cout << "Matemática: " << ptr->matematica << endl;
    cout << "Física: " << ptr->fisica << endl;
    cout << "Ciências: " << ptr->ciencias << endl;

    return 0;
}
  • O ponteiro ptr permite aceder e modificar os membros da struct usando ->.

Arrays de structs e ponteiros

Você pode criar arrays de structs e usar ponteiros para percorrê-los:

Aluno turma[3];
Aluno* ptr;

for (int i = 0; i < 3; i++) {
ptr = &turma[i];
cout << "Nome do aluno " << i+1 << ": ";
cin.getline(ptr->nome, 50);
cout << "Nota de Matemática: ";
cin >> ptr->matematica;
cout << "Nota de Física: ";
cin >> ptr->fisica;
cout << "Nota de Ciências: ";
cin >> ptr->ciencias;
cin.ignore();
}
  • O ponteiro ptr aponta para cada elemento do array, facilitando a manipulação.

Dicas importantes

  • Use sempre -> para aceder membros via ponteiro.
  • Ponteiros para structs são úteis para passagem por referência em funções e para manipulação dinâmica de dados.
  • Com structs e ponteiros, é possível criar listas, árvores e outras estruturas dinâmicas avançadas.