Spec Sistemas Com C • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 16.1 — Declaração de struct com typedef e Operador Seta (->)

Contexto: Declaração de struct com typedef e Operador Seta (->) no contexto de Structs, Struct Padding, Unions e Enumerações.

Requisitos de Execução:

  1. Criar struct Produto contendo id, nome e preco e acessar campos via ponteiro com ->.

Resultado Esperado

Struct instanciada e manipulada através de ponteiro com operador seta.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_16_1_SeuNome
  2. Envie na tarefa: Atividade Cap 16 - Structs, Struct Padding, Unions e Enumerações
🔑 Gabarito de Código & Solução Comentada
#include <stdio.h>

typedef struct {
    int id;
    char nome[30];
    double preco;
} Produto;

void exibir_produto(const Produto *p) {
    printf("ID: %d | Nome: %s | Preco: R$ %.2f\n", p->id, p->nome, p->preco);
}

int main(void) {
    Produto prod = {101, "Teclado", 250.00};
    exibir_produto(&prod);
    return 0;
}

🔍 Nível 2: Prática

Problema 16.2 — Struct Padding, Alinhamento de Memória e Atributo packed

Contexto: Struct Padding, Alinhamento de Memória e Atributo packed no contexto de Structs, Struct Padding, Unions e Enumerações.

Requisitos de Execução:

  1. Demonstrar o impacto do alinhamento de bytes na memória medindo sizeof(struct) antes e depois da reordenação dos campos.

Resultado Esperado

Tamanho da struct otimizado reduzindo bytes de padding inativos.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_16_2_SeuNome
  2. Envie na tarefa: Atividade Cap 16 - Structs, Struct Padding, Unions e Enumerações
🔑 Gabarito de Código & Solução Comentada
#include <stdio.h>

typedef struct {
    char c1;    // 1 byte (+ 7 padding)
    double d;   // 8 bytes
    char c2;    // 1 byte (+ 7 padding)
} NaoOtimizada;

typedef struct {
    double d;   // 8 bytes
    char c1;    // 1 byte
    char c2;    // 1 byte (+ 6 padding)
} Otimizada;

int main(void) {
    printf("Nao otimizada: %zu bytes\n", sizeof(NaoOtimizada));
    printf("Otimizada: %zu bytes\n", sizeof(Otimizada));
    return 0;
}

⚡ Nível 3: Integração

Problema 16.3 — Unions e Estruturas com Tag (Tagged Unions)

Contexto: Unions e Estruturas com Tag (Tagged Unions) no contexto de Structs, Struct Padding, Unions e Enumerações.

Requisitos de Execução:

  1. Modelar união que compartilhe o mesmo espaço de memória para representar inteiro, float ou string.

Resultado Esperado

Tagged union manipulando diferentes tipos com consumo mínimo de memória.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_16_3_SeuNome
  2. Envie na tarefa: Atividade Cap 16 - Structs, Struct Padding, Unions e Enumerações
🔑 Gabarito de Código & Solução Comentada
#include <stdio.h>

typedef enum { TIPO_INT, TIPO_FLOAT } TipoDado;

typedef struct {
    TipoDado tipo;
    union {
        int valor_int;
        float valor_float;
    } dado;
} ValorFlexivel;

int main(void) {
    ValorFlexivel v;
    v.tipo = TIPO_INT;
    v.dado.valor_int = 42;
    printf("Union Inteiro: %d\n", v.dado.valor_int);
    return 0;
}

🏆 Nível 4: Desafio Corporativo

Problema 16.4 — Campos de Bits (Bit-fields) para Compactação de Flags

Contexto: Campos de Bits (Bit-fields) para Compactação de Flags no contexto de Structs, Struct Padding, Unions e Enumerações.

Requisitos de Execução:

  1. Compactar 8 flags booleanas de permissão em um único byte utilizando bit-fields unsigned int flag : 1.

Resultado Esperado

8 flags armazenadas em apenas 1 byte de memória.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_16_4_SeuNome
  2. Envie na tarefa: Atividade Cap 16 - Structs, Struct Padding, Unions e Enumerações
🔑 Gabarito de Código & Solução Comentada
#include <stdio.h>

typedef struct {
    unsigned int read : 1;
    unsigned int write : 1;
    unsigned int exec : 1;
    unsigned int admin : 1;
    unsigned int : 4; // Padding
} Permissoes;

int main(void) {
    Permissoes p = {1, 1, 0, 1};
    printf("Tamanho das permissoes: %zu byte | Admin=%u\n", sizeof(Permissoes), p.admin);
    return 0;
}