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
O 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
ptrpermite 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
ptraponta 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.
