Material organizado para estudo progressivo, com leitura confortável, recursos complementares e navegação para a próxima etapa da disciplina.
Resumo
Em C, uma struct é um tipo de dado composto que permite agrupar campos de tipos diferentes sob um único nome, resolvendo o problema de representar entidades do mundo real — como um aluno com nome, matrícula, nota e idade — sem recorrer a dezenas de variáveis soltas e desconexas. A declaração segue o padrão struct NomeTipo { campos... };, sempre com ponto-e-vírgula ao final, e deve ser feita fora do main para que o tipo fique disponível em todo o programa. O acesso a cada campo é feito pelo operador ponto (variavel.campo), tanto para leitura quanto para escrita; quando se trabalha com um ponteiro para struct, usa-se o operador seta (p->campo) no lugar do ponto. Para simplificar o código e eliminar a necessidade de escrever struct a cada declaração de variável, usa-se o typedef struct { ... } NomeTipo, que é o padrão adotado em praticamente todo código C profissional. Um array de structs — como Aluno turma[30] — representa uma tabela completa de registros e é percorrido normalmente com for, acessando turma[i].campo a cada iteração. Structs também podem ser aninhadas, ou seja, um campo pode ter o tipo de outra struct, com acesso encadeado por dois pontos consecutivos (a.end.cidade). Entre os erros mais comuns estão: tentar copiar uma string para um campo char[] com = em vez de strcpy, comparar duas structs com == — o que causa erro de compilação, pois C não suporta comparação direta de structs — e esquecer o ponto-e-vírgula após o fechamento das chaves da definição. Uma vantagem importante é que a cópia direta entre structs do mesmo tipo é permitida (Aluno b = a copia todos os campos), ao contrário dos arrays comuns.
Algoritmos e Programação08/06/2026Aula interativa importada
Leitura pensada para estudo, consulta e revisão. Use a navegação lateral para alternar entre etapas da aula.
Estudo
Conteúdo interativo — HTML importado
Aula 07 - Structs em C: Agrupando Dados
Abra o material em tela cheia para estudar com conforto, sem sair da disciplina.
Aula 07 - Structs em C: Agrupando Dados
100%
Carregando conteúdo interativo...
Aula — Structs em C ◀ ▶ 1 / 0 ⛶ Tela cheia {} struct Aluno char nome[50] 50 bytes int matricula 4 bytes float nota 4 bytes int idade 4 bytes ▶ Algoritmo e Programação · Linguagem C Engenharia da Computação · 2025 · Prof. Evandro Júnior Structs em C: Agrupando Dados Aprenda a criar seus próprios tipos de dados em C — agrupe campos de tipos diferentes em uma única estrutura com struct. struct typedef array de structs ~2 horas Pré-req: arrays · strings Interativo 🎮 01 01· Motivação Por que precisamos de struct? 🎓 Problema real Represente os dados de um aluno: nome, matrícula, nota e idade. Com variáveis soltas, fica impossível de organizar — imagine 30 alunos! ✗ Sem struct — variáveis soltas, sem coesão sem_struct.cC char nome1[50] = "Ana"; int mat1 = 1001; float nota1 = 8.5; int idade1 = 20; char nome2[50] = "Bruno"; int mat2 = 1002; // ... para 30 alunos: 120 variáveis 😵 ✓ Com struct — dados agrupados e organizados com_struct.cC struct Aluno { char nome[50]; int matricula; float nota; int idade; }; struct Aluno a1, a2, turma[30]; // ✅ 💡 Definição Uma struct é um tipo de dado composto que agrupa campos de tipos diferentes sob um único nome. É a base da programação orientada a dados em C. O que vamos aprender Declarar e usar Definir a struct, criar variáveis e acessar campos com o operador . typedef Criar um alias para não repetir struct toda hora. Array de structs Uma turma inteira de alunos em um único array — o poder real da struct. Struct aninhada Um campo da struct pode ser outra struct — como um endereço dentro de um cadastro. 02 02· Declaração Declarando e Inicializando 📐 Sintaxe Primeiro define-se o molde (fora do main), depois cria-se variáveis desse tipo. Os campos são acessados com o operador ponto . aluno.cC📋 #include <stdio.h> #include <string.h> // 1. Define o "molde" — fora do main struct Aluno { char nome[50]; int matricula; float nota; int idade; }; int main() { // 2. Cria uma variável do tipo struct Aluno a1; // 3. Atribui campos com operador "." strcpy(a1.nome, "Ana Lima"); a1.matricula = 1001; a1.nota = 8.5; a1.idade = 20; printf("%s | Mat:%d | Nota:%.1f\n", a1.nome, a1.matricula, a1.nota); return 0; } Inicialização direta (literal) init_literal.cC📋 // Inicialização na ordem dos campos struct Aluno a2 = {"Bruno", 1002, 9.0, 21}; // Inicialização por nome (C99) — mais clara struct Aluno a3 = { .nome = "Carla", .matricula = 1003, .nota = 7.5, .idade = 19 }; // Zerar todos os campos struct Aluno vazio = {0}; Visualização na memória struct Aluno a1 — em memória char[50] nome "Ana Lima" 50 B int matricula 1001 4 B float nota 8.5 4 B int idade 20 4 B sizeof(struct Aluno) ≈ 62 bytes (+ padding) 03 03· typedef Simplificando com typedef ✏️ O que é typedef? typedef cria um apelido para um tipo existente. Com structs, elimina a necessidade de escrever struct toda vez que declarar uma variável. Sem typedef — verboso struct Ponto { float x; float y; }; // precisa escrever "struct" sempre struct Ponto p1; struct Ponto p2; struct Ponto pts[10]; Com typedef — limpo typedef struct { float x; float y; } Ponto; // só o nome do tipo Ponto p1; Ponto p2; Ponto pts[10]; typedef_aluno.cC📋 typedef struct { char nome[50]; int matricula; float nota; int idade; } Aluno; // ← o "apelido" // Agora basta usar "Aluno" Aluno a1 = {"Ana", 1001, 8.5, 20}; printf("Aluno: %s\n", a1.nome); Outros usos do typedef outros_typedef.cC📋 // Alias para tipos primitivos typedef unsigned int uint; typedef unsigned char byte; uint largura = 1920; byte cor = 255; // typedef com structs aninhadas typedef struct { float x, y; } Ponto; typedef struct { Ponto origem; Ponto destino; } Linha; 📌 Convenção de nomenclatura Por convenção, nomes de tipos (typedef) começam com letra maiúscula: Aluno, Ponto, Produto. Variáveis usam minúscula: a1, p. ✅ Boa prática Prefira sempre typedef struct em projetos reais — é o padrão do mercado e torna o código muito mais legível. 04 04· Acesso aos Campos Acessando com o Operador Ponto 🎯 Operador ponto ( . ) Use variavel.campo para ler ou escrever qualquer campo da struct. Funciona para leitura, escrita, cálculos e comparações. operador_ponto.cC📋 #include <stdio.h> #include <string.h> typedef struct { char nome[50]; int matricula; float nota; } Aluno; int main() { Aluno a = {"Ana", 1001, 5.0}; // LEITURA printf("Nome: %s\n", a.nome); printf("Nota: %.1f\n", a.nota); // ESCRITA — modificar um campo a.nota = 8.5; printf("Nova nota: %.1f\n", a.nota); // CÁLCULO com campo if (a.nota >= 6.0) printf("%s: APROVADO\n", a.nome); return 0; } 🎮 Simulador — cadastro de aluno .nome .matricula .nota .idade ▶ Criar struct 🖨️ printf ↺ Reset Aluno a $ preencha os campos e clique Criar struct... 05 05· Array de Structs Vetores de Structs 🏆 O poder real da struct Um array de structs representa uma tabela completa de registros. Uma turma, um estoque, uma lista de contatos — tudo com uma única declaração. turma.cC📋 #include <stdio.h> typedef struct { char nome[50]; float nota; } Aluno; int main() { Aluno turma[3] = { {"Ana", 8.5}, {"Bruno", 6.0}, {"Carla", 9.5} }; // Percorrer com for for (int i = 0; i < 3; i++) { printf("%s: %.1f — %s\n", turma[i].nome, turma[i].nota, turma[i].nota >= 6 ? "APROVADO" : "REPROVADO"); } return 0; } 🎮 Simulador — turma com 4 alunos TURMA[4] — clique para expandir 📋 Listar ✓ Aprovados Σ Média ↑ Maior nota ↺ $ escolha uma operação sobre a turma... 06 06· Struct Aninhada Structs dentro de Structs 📦 Aninhamento Um campo de uma struct pode ter o tipo de outra struct. Isso permite modelar dados complexos de forma hierárquica — como um aluno que tem um endereço. aninhada.cC📋 typedef struct { char rua[80]; char cidade[50]; int cep; } Endereco; typedef struct { char nome[50]; int matricula; float nota; Endereco end; // ← struct dentro de struct } Aluno; int main() { Aluno a = { "Ana", 1001, 8.5, {"Rua das Flores, 10", "Montes Claros", 39400000} }; // Acesso: dois pontos printf("%s\n", a.nome); printf("%s\n", a.end.cidade); // dois "." printf("%d\n", a.end.cep); return 0; } Visualização hierárquica Aluno a chara.nome"Ana" inta.matricula1001 floata.nota8.5 Endereco a.end chara.end.rua"Rua das Flores" chara.end.cidade"Montes Claros" inta.end.cep39400000 🔗 Acesso em cadeia Para campos de structs aninhadas, encadeie os pontos: a.end.cidade. Cada ponto desce um nível na hierarquia. 07 07· Cuidados Erros Comuns ✗ ERRO 1 — Copiar string com = Aluno a; a.nome = "Ana"; // ❌ campo char[] não aceita = // ✅ correto: strcpy(a.nome, "Ana"); ✗ ERRO 2 — Comparar structs com == Aluno a1, a2; if (a1 == a2) // ❌ erro de compilação! // ✅ compare campo a campo: if (a1.matricula == a2.matricula) printf("Mesmo aluno\n"); ✗ ERRO 3 — Ponto em vez de seta com ponteiro Aluno *p = &a1; p.nota = 9.0; // ❌ p é ponteiro! // ✅ use -> com ponteiros: p->nota = 9.0; // ou: (*p).nota = 9.0 ✗ ERRO 4 — Ponto-e-vírgula faltando struct Aluno { int matricula; } // ❌ falta ; aqui! // ✅ correto: struct Aluno { int matricula; }; // ← obrigatório Boas práticas ✅ Defina structs antes do main Declare globalmente para que toda função possa usar o tipo. ✅ Use typedef struct sempre Evita repetir struct e deixa o código mais limpo. ✅ Inicialize com {0} Aluno a = {0}; // zera todos os campos 💡 Cópia direta é permitida entre structs do mesmo tipo Aluno b = a; // ✅ copia todos os campos! ➡️ Operador seta (->) Quando você tiver um ponteiro para struct, use p->campo em vez de (*p).campo. As duas formas são equivalentes, mas -> é muito mais comum. 08 08· Prática Exercícios Práticos 1 Declare uma struct Produto com nome, preço e quantidade. Crie uma variável, preencha e imprima. fácil ▼ solucao1.cC #include <stdio.h> #include <string.h> typedef struct { char nome[50]; float preco; int qtd; } Produto; int main() { Produto p; strcpy(p.nome, "Caderno"); p.preco = 12.50; p.qtd = 5; printf("%s: R$%.2f x%d\n", p.nome, p.preco, p.qtd); return 0; } 2 Crie um array de 3 Alunos, percorra com for e imprima quem foi aprovado (nota ≥ 6). fácil ▼ solucao2.cC typedef struct { char nome[50]; float nota; } Aluno; int main() { Aluno t[3] = { {"Ana", 8.0}, {"Bruno", 4.5}, {"Carla", 7.0} }; for (int i=0; i<3; i++) if (t[i].nota >= 6) printf("%s APROVADO\n", t[i].nome); return 0; } 3 Crie uma struct Ponto com x e y (float). Calcule e imprima a distância entre dois pontos. médio ▼ Use a fórmula: √((x2-x1)² + (y2-y1)²) com sqrt() de math.h: distancia.cC #include <stdio.h> #include <math.h> typedef struct { float x, y; } Ponto; int main() { Ponto p1 = {0, 0}; Ponto p2 = {3, 4}; float dx = p2.x - p1.x; float dy = p2.y - p1.y; printf("Distância: %.2f\n", sqrt(dx*dx + dy*dy)); // 5.00 return 0; } 4 Dado um array de 5 Produtos (nome e preço), encontre e imprima o produto mais caro. difícil ▼ mais_caro.cC typedef struct { char nome[30]; float preco; } Produto; int main() { Produto v[5] = { {"Caneta", 2.50}, {"Livro", 45.00}, {"Mochila", 89.90}, {"Régua", 1.80}, {"Calculadora", 35.00} }; int idx = 0; for (int i=1; i<5; i++) if (v[i].preco > v[idx].preco) idx = i; printf("Mais caro: %s (R$%.2f)\n", v[idx].nome, v[idx].preco); // Mochila return 0; } Resumo da aula 📦 struct = tipo composto Agrupa campos de tipos diferentes sob um único nome 🎯 Acesso com operador ponto ( . ) variavel.campo para ler e escrever ✏️ typedef elimina o "struct" Cria apelido — use sempre em projetos reais 📋 Array de structs = tabela Turma inteira em um Aluno turma[N] 🔗 Aninhamento com dois pontos a.end.cidade acessa struct dentro de struct 🚫 Não compare structs com == Compare campo a campo. Use -> com ponteiros