Table of Contents
Programação em C – Fundamentos ao Projeto Prático 💻
Desenvolva uma base sólida em programação utilizando a linguagem C. Aprenda desde a lógica fundamental até a manipulação de memória e organização de projetos profissionais.
Foco do Curso
Metodologia: Aprendizado prático baseado em terminal, compilação manual e construção de algoritmos eficientes, preparando você para sistemas de baixo nível e alto desempenho.
🎯 O Que Você Vai Aprender
-
Lógica e Memória --- Compreenda como o computador armazena dados, o uso de ponteiros e a gestão eficiente de memória. Ver Módulo 3
-
Terminal e Compilação --- Domine o uso do GCC e MinGW, entenda o processo de pré-processamento, compilação e linkedição. Ver Compilação
-
Estruturação de Projetos --- Aprenda a organizar códigos complexos usando headers, múltiplos arquivos fonte e automatização com Makefile. Ver Organização
-
Persistência de Dados --- Saiba como salvar e carregar informações de arquivos, criando sistemas que mantêm os dados após o fechamento. Ver Projetos
📚 Jornada de Aprendizado (16 Aulas)
O curso é estruturado em quatro fases de evolução técnica.
🧱 Fase 1: Fundamentos (Aulas 01-04)
- Aula 01 - Intro & Hello World 🐍
- Aula 02 - Estrutura & Compilação 🏗️
- Aula 03 - Variáveis & Tipos 📊
- Aula 04 - Operadores ➗
🏗️ Fase 2: Controle e Dados (Aulas 05-08)
- Aula 05 - Estruturas Condicionais 🔀
- Aula 06 - Laços de Repetição 🔁
- Aula 07 - Vetores (Arrays) 📏
- Aula 08 - Manipulação de Strings 🔡
🧠 Fase 3: Modularização e Memória (Aulas 09-12)
- Aula 09 - Funções e Modularização 📦
- Aula 10 - Introdução a Ponteiros 📍
- Aula 11 - Ponteiros e Arrays 🔗
- Aula 12 - Estruturas (Structs) 🗳️
🚀 Fase 4: Especialização (Aulas 13-16)
- Aula 13 - Manipulação de Arquivos 📂
- Aula 14 - Organização Profissional 🏛️
- Aula 15 - Projeto Integrador 🎓
- Aula 16 - Boas Práticas e Encerramento ✨
Plano de Ensino 📅
Curso: Programação em C – Fundamentos ao Projeto Prático
Ementa
- Módulo 1: Fundamentos e Lógica: Introdução à lógica de programação, sintaxe básica de C, tipos de dados e operadores.
- Módulo 2: Estruturas de Controle e Dados: Controle de fluxo, laços de repetição, vetores e manipulação de cadeias de caracteres (strings).
- Módulo 3: Modularização e Memória: Criação de funções, entendimento de endereçamento de memória através de ponteiros e estruturas de dados personalizadas (structs).
- Módulo 4: Persistência e Projetos Profissionais: Manipulação de arquivos, organização de múltiplos arquivos, compilação automatizada e desenvolvimento de um sistema completo.
Cronograma (16 Aulas)
Módulo 1: Fundamentos e Lógica
- Aula 01: Introdução à Programação e Hello World
- Aula 02: Estrutura de um Programa e Compilação (GCC/MinGW)
- Aula 03: Variáveis, Tipos de Dados e IO (
printf/scanf) - Aula 04: Operadores Aritméticos, Relacionais e Lógicos
Módulo 2: Estruturas de Controle e Dados
- Aula 05: Estruturas Condicionais (
if,else,switch) - Aula 06: Estruturas de Repetição (
while,for,do-while) - Aula 07: Vetores (Arrays Unidimensionais)
- Aula 08: Strings (Arrays de caracteres e
string.h)
Módulo 3: Modularização e Memória
- Aula 09: Funções, Parâmetros e Escopo
- Aula 10: Ponteiros (Conceito de Memória e Operadores
&e*) - Aula 11: Ponteiros, Vetores e Passagem por Referência
- Aula 12: Structs (Estruturas de Dados Personalizadas)
Módulo 4: Persistência e Projetos Profissionais
- Aula 13: Manipulação de Arquivos (Leitura e Escritria)
- Aula 14: Organização Profissional de Projetos (
src,include,Makefile) - Aula 15: Projeto Prático Integrador (Sistema de Cadastro)
- Aula 16: Boas Práticas, Debug e Encerramento
Avaliação
- Exercícios: 16 listas de exercícios (5 por aula).
- Projetos: 16 mini-projetos práticos de fixação.
- Quizzes: 16 testes de conhecimento (10 perguntas por aula).
- Projeto Integrador: Desenvolvimento de um sistema de cadastro modularizado com persistência em arquivos.
Aulas
Aula 01 – Introdução à Programação e à Linguagem C 🚀
Bem-vindo ao início da sua jornada na programação! Nesta aula, vamos entender o "porquê" da linguagem C ser tão fundamental e daremos nossos primeiros passos no terminal.
🧐 O que é Programação?
Programar é o ato de dar instruções precisas para um computador resolver um problema ou executar uma tarefa. O computador é extremamente rápido, mas "burro": ele só faz exatamente o que mandamos através de uma Linguagem de Programação.
📜 História e Importância da Linguagem C
Criada na década de 70 por Dennis Ritchie nos laboratórios Bell, a linguagem C revolucionou a computação. Ela foi usada para escrever o sistema operacional Unix, que é a base para o Linux, macOS e Android que usamos hoje.
[!NOTE] Conceito: C é considerada uma linguagem de "médio nível" porque une a facilidade de leitura humana com o poder de manipular o hardware diretamente.
🌍 Onde C é Utilizada Hoje?
Apesar de ser uma linguagem veterana, C está em todo lugar: - Sistemas Operacionais: Windows, Linux, macOS. - Sistemas Embarcados: Micro-ondas, carros, satélites, Arduinos. - Motores de Jogos: A base de muitos motores gráficos de alto desempenho. - Bancos de Dados: MySQL, PostgreSQL e muitos outros.
🏗️ Fluxo de Funcionamento de um Programa
Abaixo, veja como transformamos texto em algo que o processador entende:
graph LR
A["Código Fonte (.c)"] --> B["Compilador (GCC/MinGW)"]
B --> C["Binário Executável (.exe)"]
C --> D["Processador"]
style A fill:#f9f,stroke:#333,stroke-width:2px
style C fill:#00ff00,stroke:#333,stroke-width:2px
💻 Primeiro Programa: Hello, World!
Vamos criar nosso primeiro código. Abra seu editor e digite:
#include <stdio.h> // Biblioteca padrão de entrada e saída
int main() {
// A função main é o ponto de partida de todo programa C
printf("Olá, Mundo! Bem-vindo ao curso de C.\n");
return 0; // Indica que o programa terminou com sucesso
}
🛠️ Compilando no Terminal
Para transformar esse código em um programa real, usamos o terminal:
[!CAUTION] Atenção: Se você ainda não instalou o compilador, siga o Guia de Instalação.
🚀 Mini-Projeto da Aula: "Cartão de Visitas"
Objetivo: Criar um programa que imprima seu nome, idade e sua principal motivação para aprender C, formatado em um quadro de caracteres.
Exemplo de Saída:
******************************
* Nome: Ricardo *
* Idade: 25 anos *
* Foco: Sistemas Embarcados *
******************************
📝 Exercícios de Fixação
- Explique com suas palavras por que a linguagem C é importante para entender o hardware.
- O que acontece se você esquecer o
;no final doprintf? Teste e observe o erro no terminal. - Modifique o "Hello World" para imprimir duas mensagens em linhas diferentes usando
\n.
Aula 02 – Estrutura de um Programa em C 🏗️
Na aula anterior, rodamos nosso primeiro código. Hoje, vamos desmontar um programa C para entender cada uma de suas peças e como elas se encaixam durante o processo de compilação.
🧩 Anatomia de um Código C
Todo programa em C possui elementos fundamentais que garantem seu funcionamento. Observe o exemplo abaixo:
#include <stdio.h> // 1. Diretiva do Pré-processador
/*
2. Comentário de múltiplas linhas:
Este programa imprime uma saudação.
*/
int main() { // 3. Ponto de Entrada (Função Principal)
// 4. Instrução ou Comando (Statement)
printf("Entendendo a estrutura do C!\n");
return 0; // 5. Valor de Retorno
}
Explicação dos Componentes:
#include <stdio.h>: Avisa ao compilador que usaremos funções de entrada e saída (como oprintf).- Comentários: Texto ignorado pelo compilador, usado para explicar o código (
//para uma linha ou/* ... */para blocos). int main(): A "chave de ignição". Todo código C começa a ser executado aqui.- Chaves
{ }: Delimitam o início e o fim de um bloco de código. - Ponto e vírgula
;: Indica o final de uma instrução. Omiti-lo é o erro mais comum de iniciantes!
⚙️ O Ciclo de Vida do Código (Compilação)
Não escrevemos algo que o processador entende diretamente. O código passa por 3 etapas principais:
graph TD
A["Código Fonte (.c)"] --> B["Pré-processador"]
B -- "Código Expandido" --> C["Compilador"]
C -- "Código de Máquina (.o / .obj)" --> D["Linker"]
D -- "Bibliotecas Externas" --> E["Executável (.exe / .out)"]
style A fill:#e1f5fe
style E fill:#c8e6c9
- Pré-processador: Trata as linhas que começam com
#(inclui arquivos e substitui macros). - Compilador: Traduz o código C para linguagem de montagem (assembly) e depois para código de objeto.
- Linker: Une seu código com as bibliotecas do sistema (como a
stdio) para criar o executável final.
💻 Prática: Compilando com Nome Personalizado
No terminal, podemos dar qualquer nome ao nosso programa usando a flag -o (output).
⚠️ Erros Comuns e Como Corrigi-los
[!WARNING] Syntax Error: Geralmente causado por falta de
;ou fechar chaves}incorretamente. O compilador indicará a linha aproximada do erro.[!TIP] Dica: Sempre indente seu código (use espaços/tabs no início das linhas). Isso ajuda a visualizar onde começam e terminam as funções.
🚀 Mini-Projeto da Aula: "O Calculador de Área"
Objetivo: Criar um arquivo chamado area.c que use múltiplos printf para exibir a fórmula de cálculo da área de um quadrado (\(A = L^2\)) acompanhado de um desenho do quadrado feito com caracteres.
Exemplo de Saída:
📝 Exercícios de Fixação
- Qual a função das bibliotecas (headers) terminadas em
.h? - Crie um programa com um erro proposital (tire o
;) e observe a mensagem do GCC. O que ela diz? - Escreva um programa que use comentários para explicar o que cada linha do seu código faz.
Aula 03 – Variáveis e Tipos de Dados 📊
Computadores servem para processar informações. No entanto, para processar algo, primeiro precisamos guardá-lo. É aqui que entram as Variáveis.
📦 O que é uma Variável?
Pense na variável como uma caixa na memória RAM do seu computador. Cada caixa tem: 1. Tipo: O que ela pode guardar (números, letras, etc). 2. Nome: Como chamamos essa caixa (identificador). 3. Valor: O que está dentro da caixa.
🔢 Tipos de Dados Primitivos em C
Em C, precisamos dizer exatamente que tipo de dado vamos guardar:
| Tipo | Descrição | Espaço (Bytes) | Formatador |
|---|---|---|---|
int |
Números inteiros (ex: 10, -5) | 4 | %d ou %i |
float |
Números decimais (ex: 3.14) | 4 | %f |
double |
Decimais de alta precisão | 8 | %lf |
char |
Um único caractere (ex: 'A') | 1 | %c |
✍️ Declaração e Inicialização
#include <stdio.h>
int main() {
int idade = 25; // Declara e atribui valor
float altura = 1.75; // Note o uso de ponto, não vírgula!
char inicial = 'R'; // Caractere usa aspas simples
printf("Eu tenho %d anos e meço %.2f de altura.\n", idade, altura);
return 0;
}
[!IMPORTANT] Ponto Flutuante: Em programação, usamos o padrão americano. Logo, decimais usam ponto (
1.75) e não vírgula.
📥 Lendo Dados com scanf
Para interagir com o usuário, usamos o scanf. Ele "escaneia" o que foi digitado no teclado.
Exemplo de Código:
int idade;
printf("Digite sua idade: ");
scanf("%d", &idade); // O & (ampersand) é obrigatório aqui!
[!CAUTION] Atenção: O símbolo
&indica o endereço da variável. Sem ele, oscanfnão sabe onde guardar o valor e seu programa vai travar.
🚀 Mini-Projeto da Aula: "Conversor de Idade"
Objetivo: Criar um programa que peça a idade do usuário e calcule quantos dias ele já viveu aproximadamente (Idade * 365).
📝 Exercícios de Fixação
- Crie variáveis para guardar seu peso, altura e a primeira letra do seu nome. Imprima-as formatadas.
- O que acontece se você tentar guardar um número com vírgula (ex: 3.9) em uma variável do tipo
int? Teste e descubra. - Pesquise: O que é o tipo
unsigned inte quando devemos usá-lo?
Aula 04 – Operadores e Expressões ➗
Agora que sabemos como guardar dados, precisamos aprender a manipulá-los. Os Operadores são símbolos que dizem ao C para realizar cálculos ou comparações.
➕ 1. Operadores Aritméticos
Usados para cálculos matemáticos básicos:
| Operador | Operação | Exemplo (a=10, b=3) |
Resultado |
|---|---|---|---|
+ |
Adição | a + b |
13 |
- |
Subtração | a - b |
7 |
* |
Multiplicação | a * b |
30 |
/ |
Divisão | a / b |
3 (se for int) |
% |
Resto (Módulo) | a % b |
1 |
[!WARNING] Divisão Inteira: Se você dividir dois números inteiros (
10 / 3), o C vai ignorar o resto e dar o resultado3. Para ter3.33, pelo menos um dos números deve serfloat.
⚖️ 2. Operadores Relacionais
Usados para comparar dois valores. O resultado é sempre 1 (Verdadeiro) ou 0 (Falso).
| Operador | Significado | Exemplo |
|---|---|---|
== |
Igual a | 5 == 5 (1) |
!= |
Diferente de | 5 != 3 (1) |
> |
Maior que | 10 > 20 (0) |
< |
Menor que | 7 < 10 (1) |
>= |
Maior ou igual | 5 >= 5 (1) |
<= |
Menor ou igual | 3 <= 2 (0) |
🧠 3. Operadores Lógicos
Usados para combinar várias comparações:
&&(E / AND): Verdadeiro apenas se ambos forem verdadeiros.||(OU / OR): Verdadeiro se pelo menos um for verdadeiro.!(NÃO / NOT): Inverte o valor (se era 1 vira 0, e vice-versa).
⬆️ 4. Incremento e Decremento
Atalhos muito usados em contagens:
- x++ é o mesmo que x = x + 1.
- x-- é o mesmo que x = x - 1.
💻 Exemplo Prático: Validação de Nota
#include <stdio.h>
int main() {
float nota;
printf("Digite sua nota: ");
scanf("%f", ¬a);
// Verifica se a nota é válida (entre 0 e 10)
int valida = (nota >= 0) && (nota <= 10);
printf("A nota inserida é válida? %d (1=Sim, 0=Não)\n", valida);
return 0;
}
🏗️ Precedência de Operadores
Assim como na matemática, o C segue uma ordem:
1. Parênteses ( )
2. Multiplicação e Divisão *, /, %
3. Adição e Subtração +, -
🚀 Mini-Projeto da Aula: "Calculadora de Médias"
Objetivo: Criar um programa que peça 3 notas de um aluno, calcule a média aritmética e mostre se ele foi aprovado (média >= 7.0).
📝 Exercícios de Fixação
- Qual o resultado da expressão
10 % 3? Explique por quê. - Escreva um programa que peça um número e informe se ele é par ou ímpar (Dica: use o operador
%). - Crie uma expressão lógica que verifique se uma idade está entre 18 e 65 anos.
Aula 05 – Estruturas Condicionais 🚦
Até agora, nossos programas eram lidos como uma linha reta, do topo até o fim. Porém, na vida real, precisamos tomar decisões. As Estruturas Condicionais permitem que o programa escolha caminhos diferentes.
🛣️ 1. O Desvio Simples: if e else
O if (se) testa uma condição. Se ela for verdadeira, o bloco de código dentro dele é executado. Caso contrário, o else (senão) assume o controle.
#include <stdio.h>
int main() {
int idade;
printf("Digite sua idade: ");
scanf("%d", &id);
if (idade >= 18) {
printf("Você é maior de idade. Acesso liberado!\n");
} else {
printf("Acesso negado. Você é menor de idade.\n");
}
return 0;
}
🚦 2. Múltiplas Condições: else if
Quando temos mais de dois caminhos possíveis, usamos o else if.
if (nota >= 7.0) {
printf("Aprovado!\n");
} else if (nota >= 5.0) {
printf("Recuperação!\n");
} else {
printf("Reprovado!\n");
}
🎚️ 3. A Escolha Múltipla: switch
O switch (chaveador) é ideal para quando temos uma variável que pode assumir vários valores discretos (como um menu).
int opcao;
printf("1. Café\n2. Chá\nEscolha: ");
scanf("%d", &opcao);
switch (opcao) {
case 1:
printf("Saindo um café quentinho...\n");
break; // Omitir o break faz o código continuar para o próximo caso!
case 2:
printf("Preparando seu chá...\n");
break;
default:
printf("Opção inválida!\n");
}
[!CAUTION] Atenção: O comando
breaké essencial noswitch. Sem ele, o C executará todos os casos abaixo do escolhido!
⚡ 4. Operador Ternário (Atalho)
Uma forma rápida de escrever um if-else simples em uma única linha:
condicao ? valor_se_verdade : valor_se_falso;
Exemplo:
int maior = (a > b) ? a : b;
💻 Exemplo Prático: Par ou Ímpar
int num;
scanf("%d", &num);
if (num % 2 == 0) {
printf("É PAR!\n");
} else {
printf("É ÍMPAR!\n");
}
🚀 Mini-Projeto da Aula: "O Jogo de Adivinhação"
Objetivo: Criar um programa que defina um "número secreto" (ex: 42) e peça para o usuário tentar adivinhar. O programa deve dizer se ele acertou, se o chute foi alto demais ou baixo demais.
📝 Exercícios de Fixação
- Escreva um programa que receba dois números e imprima o maior deles.
- Crie uma calculadora simples: Peça dois números e um símbolo de operação (
+,-,*,/). Useswitchpara realizar o cálculo. - O que acontece se você usar
if (x = 10)em vez deif (x == 10)? Teste e explique o comportamento bizarro que ocorrerá.
Aula 06 – Estruturas de Repetição 🔁
Imagine ter que imprimir "Olá Mundo" 1.000 vezes. Escrever o código manualmente seria impossível. As Estruturas de Repetição (ou laços/loops) permitem que o computador execute a mesma tarefa várias vezes automaticamente.
🔄 1. O Laço while (Enquanto)
O while repete um bloco de código enquanto uma condição for verdadeira.
#include <stdio.h>
int main() {
int contador = 1;
while (contador <= 5) {
printf("Número: %d\n", contador);
contador++; // Importante: Incrementa para a condição um dia ser falsa!
}
return 0;
}
🔁 2. O Laço for (Para)
O for é ideal quando sabemos exatamente quantas vezes queremos repetir algo. Ele agrupa a inicialização, a condição e o incremento em uma única linha.
🔄 3. O Laço do-while (Faça-Enquanto)
Diferente dos outros, o do-while garante que o código será executado pelo menos uma vez, pois a condição só é checada no final.
int num;
do {
printf("Digite um número positivo (ou 0 para parar): ");
scanf("%d", &num);
} while (num > 0);
🛑 4. break e continue
break: Sai imediatamente do laço, interrompendo a repetição.continue: Pula o resto do código dentro do laço e volta para o início da próxima repetição.
💻 Exemplo Prático: Tabuada
int tab;
scanf("%d", &tab);
for (int i = 1; i <= 10; i++) {
printf("%d x %d = %d\n", tab, i, tab * i);
}
🚀 Mini-Projeto da Aula: "Contagem Regressiva"
Objetivo: Criar um programa que peça um número ao usuário e faça uma contagem regressiva até zero, com um intervalo visual (use vários prints ou apenas a lógica).
📝 Exercícios de Fixação
- Escreva um programa que imprima todos os números pares de 1 a 20 usando um laço
for. - Crie um programa que peça 5 números ao usuário e, ao final, exiba a soma de todos eles.
- O que é um "Loop Infinito"? Crie um propositalmente (ex:
while(1)) e aprenda a pará-lo no terminal usandoCtrl + C.
Aula 07 – Vetores (Arrays) 📏
Até agora, cada variável guardava apenas um valor. Mas e se quisermos guardar as 10 notas de um aluno ou os nomes de 50 produtos? Criar 50 variáveis seria um caos. Para isso, usamos os Vetores (ou Arrays).
📦 O que é um Vetor?
Um vetor é uma coleção de variáveis do mesmo tipo, colocadas lado a lado na memória. Imagine um prédio onde cada apartamento tem o mesmo tamanho, mas um endereço (índice) diferente.
📐 Declaração e Acesso
#include <stdio.h>
int main() {
// Declara um vetor de inteiros com 5 posições
int notas[5] = {8, 7, 10, 6, 9};
// Acessando valores (O índice começa sempre em 0!)
printf("A primeira nota é: %d\n", notas[0]);
printf("A última nota é: %d\n", notas[4]);
return 0;
}
[!IMPORTANT] Índice Zero: No C, o primeiro elemento está na posição
0. Se um vetor tem tamanho 5, os índices válidos são de0a4.
🔁 Percorrendo um Vetor com for
A maior vantagem dos vetores é que podemos usar laços de repetição para processar todos os dados de uma vez.
int valores[5];
// Lendo 5 valores do teclado
for (int i = 0; i < 5; i++) {
printf("Digite o valor %d: ", i + 1);
scanf("%d", &valores[i]);
}
// Imprimindo os valores
for (int i = 0; i < 5; i++) {
printf("Vetor[%d] = %d\n", i, valores[i]);
}
📊 Aplicações Reais
Vetores são a base para: - Listas de Compras: Armazenar preços. - Sensores: Guardar as últimas 100 leituras de temperatura. - Imagens: Uma imagem digital é, na verdade, um grande vetor de pixels. - Sons: Ondas sonoras digitalizadas em pequenos pedaços.
🚫 Perigos: Acesso Fora do Limite
C não avisa se você tentar acessar uma posição que não existe.
🚀 Mini-Projeto da Aula: "Média de Turma"
Objetivo: Criar um programa que peça a nota de 5 alunos, guarde-as em um vetor, calcule a média da turma e diga quantos alunos ficaram acima da média.
📝 Exercícios de Fixação
- Crie um vetor que armazene os 10 primeiros números pares e os imprima na ordem inversa.
- Escreva um programa que encontre o maior valor dentro de um vetor de 5 números digitados pelo usuário.
- Tente criar um vetor de
floatpara armazenar preços de produtos e faça a soma total do "carrinho".
Aula 08 – Strings em C 🔡
Diferente de linguagens como Python ou Java, o C não possui um tipo "String" nativo. Em C, um texto é simplesmente um Vetor de Caracteres (char).
🧵 1. O que é uma String em C?
É um array de char que termina obrigatoriamente com o caractere especial \0 (null terminator). Esse caractere avisa ao computador: "O texto acaba aqui!".
Declaração e Inicialização
#include <stdio.h>
int main() {
// Declaração de string com 20 posições
char nome[20] = "Ricardo";
// O C adiciona o '\0' automaticamente no final de strings entre aspas duplas
printf("Olá, %s!\n", nome); // %s é o formatador de String
return 0;
}
📥 2. Lendo Strings com Espaços
O scanf("%s", ...) para de ler assim que encontra um espaço. Para ler um nome completo ou uma frase, usamos o comando fgets.
Exemplo de Código:
char nomeCompleto[50];
printf("Digite seu nome: ");
fgets(nomeCompleto, 50, stdin); // Nome, tamanho, entrada padrão (teclado)
📚 3. A Biblioteca <string.h>
Para manipular textos, usamos funções prontas desta biblioteca:
strlen(): Retorna o tamanho da string (quantidade de letras).strcpy(): Copia uma string para outra.strcat(): Junta (concatena) duas strings.strcmp(): Compara se duas strings são iguais (retorna 0 se forem iguais).
💻 Exemplo Prático: Comparação de Senha
#include <stdio.h>
#include <string.h>
int main() {
char senha[20] = "segredo123";
char tentativa[20];
printf("Digite a senha: ");
scanf("%s", tentativa);
if (strcmp(senha, tentativa) == 0) {
printf("Acesso Garantido!\n");
} else {
printf("Senha Incorreta.\n");
}
return 0;
}
🚀 Mini-Projeto da Aula: "Criptografia Simples"
Objetivo: Criar um programa que receba uma palavra e a "criptografe" somando 1 ao valor ASCII de cada caractere (ex: 'A' vira 'B', 'B' vira 'C').
📝 Exercícios de Fixação
- Crie um programa que peça o nome do usuário e imprima quantas letras esse nome tem.
- Escreva um programa que receba duas palavras e as junte em uma única variável usando
strcat. - Desafio: Como você faria para imprimir uma string de trás para frente usando um laço
fore ostrlen?
Aula 09 – Funções e Modularização 📦
Até agora, escrevemos todo o nosso código dentro da função main. Para programas pequenos, isso funciona. Mas para sistemas grandes, o código se tornaria impossível de ler. As Funções permitem dividir o programa em pequenas peças reutilizáveis.
🧩 1. O que é uma Função?
Uma função é um bloco de código que realiza uma tarefa específica e pode ser "chamado" a qualquer momento. Elas funcionam como pequenos programas dentro do programa principal.
Estrutura Base:
- Tipo de Retorno: O tipo de dado que a função envia de volta (ex:
int,float,voidse não enviar nada). - Parâmetros: Dados que a função recebe para trabalhar.
🛠️ 2. Exemplo Prático: Função de Soma
#include <stdio.h>
// 1. Protótipo da Função (Avisa ao C que a função existe)
int somar(int a, int b);
int main() {
int resultado = somar(10, 5); // Chamada da função
printf("A soma é: %d\n", resultado);
return 0;
}
// 2. Definição da Função
int somar(int a, int b) {
return a + b;
}
🌐 3. Escopo de Variáveis
Onde uma variável "vive"? - Variáveis Locais: Criadas dentro de uma função. Elas só existem lá dentro e "morrem" quando a função termina. - Variáveis Globais: Criadas fora de todas as funções. Elas podem ser vistas e alteradas por qualquer parte do programa (use com muito cuidado!).
🔘 4. Funções sem Retorno (void)
Muitas vezes queremos apenas que a função execute algo, como imprimir um menu, sem devolver nenhum cálculo.
void imprimirCabecalho() {
printf("====================\n");
printf(" SISTEMA C-STORE \n");
printf("====================\n");
}
💻 Modularização: Por que usar?
- Reutilização: Escreva uma vez, use mil vezes.
- Organização: O
mainfica limpo e fácil de entender. - Manutenção: Se houver um erro no cálculo, você só precisa consertar em um lugar.
🚀 Mini-Projeto da Aula: "Biblioteca de Desenhos"
Objetivo: Criar funções para desenhar diferentes formas geométricas (quadrado, linha, triângulo) usando caracteres, e chamá-las no main conforme a escolha do usuário.
📝 Exercícios de Fixação
- Crie uma função chamada
ehParque receba um inteiro e retorne 1 se for par e 0 se for ímpar. - Escreva uma função que receba a temperatura em Celsius e retorne o valor em Fahrenheit.
- Crie uma função
voidque receba um número e imprima a tabuada dele de 1 a 10.
Aula 10 – Ponteiros (Introdução) 🧠
Ponteiros são considerados o "terror" de muitos estudantes de C, mas na verdade eles são ferramentas extremamente simples e poderosas. Um Ponteiro é apenas uma variável que guarda o Endereço de Memória de outra variável.
📍 1. Endereço de Memória vs Valor
Toda variável que você cria ocupa um lugar físico na memória RAM do computador. Esse lugar tem um número de identificação, chamado de Endereço.
- Valor: O que está dentro da "caixa" (ex: 42).
- Endereço: Onde a "caixa" está na prateleira (ex: 0xFF01).
🏗️ 2. Operadores de Ponteiro
Existem dois símbolos fundamentais que você deve decorar:
&(E comercial / Ampersand): Significa "Endereço de". Usado para descobrir onde a variável mora.*(Asterisco): Quando usado na declaração, indica um ponteiro. Quando usado no código, significa "Conteúdo de" (aponta para o valor dentro do endereço).
Exemplo Base:
#include <stdio.h>
int main() {
int v = 10;
int *p; // Declarando um ponteiro para inteiro
p = &v; // p agora guarda o ENDEREÇO de v
printf("Valor de v: %d\n", v);
printf("Endereço de v: %p\n", &v); // %p para endereços
printf("Valor apontado por p: %d\n", *p);
return 0;
}
🛠️ 3. Por que usar Ponteiros?
Você pode se perguntar: "Por que não usar a variável direto?". Ponteiros são essenciais para: - Passagem por Referência: Permitir que uma função mude o valor de uma variável que está fora dela. - Alocação Dinâmica: Criar vetores que crescem ou diminuem durante o programa. - Estruturas Complexas: Como listas encadeadas e árvores (base de grandes softwares).
💻 Exemplo Prático: Trocando Valores
Lembram do exercício de trocar A por B? Com funções e ponteiros, podemos fazer isso de forma elegante:
void trocar(int *a, int *b) {
int aux = *a;
*a = *b;
*b = aux;
}
int main() {
int x = 5, y = 10;
trocar(&x, &y); // Enviamos o endereço!
printf("x=%d, y=%d", x, y); // Saída: x=10, y=5
return 0;
}
🚀 Mini-Projeto da Aula: "Inspetor de Memória"
Objetivo: Criar um programa que peça para o usuário digitar um valor, e o programa mostre um relatório completo: o valor, o endereço de memória e o tamanho em bytes que aquela variável ocupa (use sizeof).
📝 Exercícios de Fixação
- Crie um ponteiro para um
float, atribua um valor a uma variável e use o ponteiro para dobrar esse valor original. - O que acontece se você tentar imprimir
pem vez de*pnoprintf? Teste e observe o resultado. - Desafio: Tente criar um "Ponteiro para Ponteiro" (
int **pp) e veja se consegue acessar o valor original através dele.
Aula 11 – Ponteiros e Arrays 🎭
Você sabia que, em C, um vetor é na verdade apenas um ponteiro disfarçado? Entender essa relação é a chave para escrever códigos extremamente rápidos e eficientes.
🎭 1. O Nome do Vetor é um Ponteiro
Quando você declara int v[5], o nome v funciona como um ponteiro constante para o primeiro elemento do array (&v[0]).
#include <stdio.h>
int main() {
int v[3] = {10, 20, 30};
printf("Endereço de v[0]: %p\n", &v[0]);
printf("Valor de v (como ponteiro): %p\n", v); // São o mesmo endereço!
return 0;
}
➕ 2. Aritmética de Ponteiros
Diferente de números comuns, somar 1 a um ponteiro não pula 1 byte, mas sim 1 elemento. O C sabe o tamanho do tipo de dado e pula a quantidade exata de bytes.
p + 1: Aponta para o próximo elemento do vetor.*(p + 1): É exatamente o mesmo quev[1].
int v[3] = {10, 20, 30};
int *p = v;
printf("Primeiro: %d\n", *p); // v[0]
printf("Segundo: %d\n", *(p + 1)); // v[1]
printf("Terceiro: %d\n", *(p + 2)); // v[2]
🔁 3. Percorrendo Arrays sem Colchetes
Podemos usar a aritmética de ponteiros para varrer um vetor de forma muito performática.
int v[5] = {1, 2, 3, 4, 5};
int *p = v;
for (int i = 0; i < 5; i++) {
printf("Elemento %d: %d\n", i, *(p + i));
}
🏗️ 4. Por que isso importa?
Em sistemas embarcados, drivers de hardware e motores de jogos, acessar a memória via aritmética de ponteiros costuma ser levemente mais rápido que usar a notação de colchetes [], pois evita cálculos extras do compilador.
🚀 Mini-Projeto da Aula: "O Varredor de Memória"
Objetivo: Criar um programa que peça 5 números para um vetor, mas que realize a leitura e a impressão de todos os valores sem usar colchetes [], utilizando apenas ponteiros e aritmética.
📝 Exercícios de Fixação
- Crie um vetor de 5
doublee use um ponteiro para percorrê-lo e calcular a média. - Tente somar
2a um ponteiro paraint. Quantos bytes o endereço mudou? (Use%ppara verificar). - Desafio: Escreva uma função que receba um ponteiro para o início de uma string e conte quantos caracteres ela tem sem usar a função
strlen.
Aula 12 – Estruturas (Structs) 🏗️
Até agora, aprendemos a agrupar dados do mesmo tipo em Vetores. Mas e se quisermos agrupar dados de tipos diferentes relacionados ao mesmo objeto? Por exemplo, um Aluno tem Nome (string), Idade (int) e Nota (float). Para isso, usamos as Structs (Estruturas).
🏛️ 1. O que é uma Struct?
Uma Struct é um tipo de dado personalizado que funciona como uma "ficha" ou "formulário". Ela agrupa várias variáveis (chamadas de membros) sob um único nome.
Definição e Uso:
#include <stdio.h>
#include <string.h>
// Definindo a estrutura
struct Aluno {
char nome[50];
int idade;
float nota;
};
int main() {
struct Aluno a1; // Criando uma variável do tipo Aluno
// Acessando membros com o ponto (.)
strcpy(a1.nome, "Ricardo");
a1.idade = 20;
a1.nota = 9.5;
printf("Aluno: %s | Idade: %d | Nota: %.1f\n", a1.nome, a1.idade, a1.nota);
return 0;
}
📑 2. O comando typedef
Para não ter que escrever struct Aluno toda vez, podemos dar um "apelido" ao tipo usando typedef.
typedef struct {
char marca[20];
float preco;
} Carro;
int main() {
Carro c1 = {"Fiat", 45000.00};
printf("Carro: %s\n", c1.marca);
}
📚 3. Vetores de Structs
Podemos criar um array onde cada posição é uma ficha completa. Isso é a base para pequenos bancos de dados em memória.
Carro estoque[10]; // Um vetor capaz de guardar 10 fichas de carros!
for (int i = 0; i < 2; i++) {
printf("Marca do carro %d: ", i + 1);
scanf("%s", estoque[i].marca);
}
🏹 4. Ponteiros para Structs e o Operador ->
Quando usamos ponteiros para manipular estruturas, usamos o operador de seta (->) para acessar os membros.
struct Aluno a1 = {"Joao", 18, 7.0};
struct Aluno *p = &a1;
printf("Nome: %s", p->nome); // O mesmo que (*p).nome
🚀 Mini-Projeto da Aula: "Cadastro de Produtos"
Objetivo: Criar um sistema que cadastre 3 produtos (Nome, Preço e Quantidade) usando um vetor de structs, e ao final exiba o valor total do inventário (Preço * Quantidade de todos os itens).
📝 Exercícios de Fixação
- Defina uma struct
Pontocom coordenadasxey(float). Peça ao usuário os dados de dois pontos e calcule a distância entre eles. - Crie uma struct
Livrocom título, autor e número de páginas. Peça ao usuário para cadastrar um livro e exiba os dados formatados. - Desafio: Crie um vetor de 5 structs
Funcionario(Nome, Salário). Encontre e imprima o nome do funcionário que tem o maior salário.
Aula 13 – Arquivos (Gerenciamento de Dados) 💾
Até agora, todos os dados que digitamos sumiam assim que o programa era fechado. Para criar sistemas reais, precisamos salvar as informações no disco rígido. Em C, fazemos isso usando o ponteiro especial FILE.
📂 1. Abrindo e Fechando Arquivos
Para trabalhar com um arquivo, primeiro devemos "abri-lo" e, ao terminar, "fechá-lo" obrigatoriamente para garantir que os dados sejam salvos.
#include <stdio.h>
int main() {
FILE *arquivo;
// fopen(nome_do_arquivo, modo)
arquivo = fopen("dados.txt", "w"); // "w" = write (escrever)
if (arquivo == NULL) {
printf("Erro ao abrir o arquivo!\n");
return 1;
}
// ... realizar operações ...
fclose(arquivo); // SEMPRE feche o arquivo!
return 0;
}
🚦 2. Modos de Abertura
| Modo | Descrição |
|---|---|
"r" |
Read: Abre para leitura (o arquivo deve existir). |
"w" |
Write: Abre para escrita (cria novo ou sobrescreve o existente). |
"a" |
Append: Abre para adicionar ao final (não apaga o que já existe). |
✍️ 3. Escrevendo no Arquivo (fprintf)
É quase igual ao printf, mas o primeiro parâmetro é o ponteiro do arquivo.
📖 4. Lendo do Arquivo (fscanf e fgets)
fscanf: Lê dados formatados (para no espaço).fgets: Lê uma linha inteira do arquivo.
💻 Exemplo Prático: Diário Simples
FILE *arq = fopen("notas.txt", "a");
char texto[50];
printf("Escreva algo para o arquivo: ");
fgets(texto, 50, stdin);
fprintf(arq, "%s", texto);
fclose(arq);
🚀 Mini-Projeto da Aula: "Gerador de Log"
Objetivo: Criar um programa que peça o nome do usuário e registre em um arquivo chamado acessos.log o nome dele seguido da frase "Acessou o sistema". O programa deve usar o modo "a" para não apagar os acessos anteriores.
📝 Exercícios de Fixação
- Crie um programa que abra um arquivo de texto, leia o conteúdo e o imprima em letras maiúsculas no terminal.
- Escreva um programa que peça 5 números ao usuário e os salve em um arquivo chamado
numeros.txt, um por linha. - Desafio: Crie uma função que conte quantas linhas existem em um arquivo de texto específico.
Aula 14 – Organização de Projetos 📂
Até agora, todos os nossos programas tinham apenas um arquivo .c. Em projetos profissionais, o código é dividido em dezenas ou centenas de arquivos para facilitar a organização. Em C, usamos arquivos de Cabeçalho (.h) e arquivos de Implementação (.c).
🏗️ 1. A Divisão do Trabalho
- Arquivo de Cabeçalho (.h): Contém as "promessas" (protótipos das funções, definições de structs e constantes). É o manual de instruções.
- Arquivo de Implementação (.c): Contém o código real das funções.
🛡️ 2. Header Guards
Para evitar que o compilador inclua o mesmo arquivo várias vezes (causando erros), usamos os "Guardiões de Cabeçalho":
🛠️ 3. Exemplo Prático: Projeto Modular
Imagine um projeto com 3 arquivos:
calculos.h(Protótipos)calculos.c(Lógica das funções)main.c(Ponto de entrada que usa as funções)
No main.c:
#include <stdio.h>
#include "calculos.h" // Aspas "" indicam arquivos locais ao projeto
int main() {
printf("Resultado: %d", somar(10, 20));
return 0;
}
⚙️ 4. Compilando Múltiplos Arquivos
Para gerar o programa final, precisamos compilar todos os arquivos .c juntos:
📜 5. Introdução ao Makefile (Básico)
O Makefile é um script que automatiza o processo de compilação. Em vez de digitar um comando gigante no terminal, você apenas digita make.
🚀 Mini-Projeto da Aula: "Calculadora Modular"
Objetivo: Criar um projeto onde as funções matemáticas (somar, subtrair, multiplicar) fiquem em arquivos separados do main.c. O desafio é compilar tudo junto e garantir que os headers funcionem.
📝 Exercícios de Fixação
- Crie um header
geometria.hcom constantes para PI e protótipos para área de círculo. Implemente nogeometria.ce use nomain.c. - O que acontece se você esquecer as aspas
""e usar< >para um arquivo que você criou? Teste e observe o erro do compilador. - Desafio: Tente criar um Makefile que compile seu projeto e também tenha um comando
cleanpara apagar o executável.
Aula 15 – Projeto Prático Integrador 🚀
Chegamos ao ponto alto do nosso curso! Nesta aula, não aprenderemos um conceito novo, mas sim como Integrar tudo o que vimos até aqui: Variáveis, Condicionais, Laços, Vetores, Funções, Structs e Arquivos.
🏗️ 1. O Desafio: Sistema de Gestão de Biblioteca
Vamos construir um sistema que permita:
1. Cadastrar Livros em uma struct.
2. Salvar os livros em um arquivo .txt para não perdê-los.
3. Listar os livros cadastrados lendo diretamente do disco.
4. Organizar o código em funções para manter o main limpo.
🗂️ 2. A Estrutura do Dado
🛠️ 3. A Lógica de Persistência
Nosso programa terá uma função void salvarLivro(Livro l) que abre o arquivo em modo "a" (append) e grava os dados, e uma função void listarLivros() que lê o arquivo até o fim (feof).
void salvarLivro(Livro l) {
FILE *f = fopen("biblioteca.db", "a");
if (f == NULL) return;
fprintf(f, "%s;%s;%d\n", l.titulo, l.autor, l.ano);
fclose(f);
}
🖥️ 4. O Menu Principal
O main funcionará como um maestro, apenas direcionando o usuário para as funções corretas.
int main() {
int opcao;
do {
printf("1. Cadastrar | 2. Listar | 0. Sair: ");
scanf("%d", &opcao);
// ... switch case chamando as funções ...
} while (opcao != 0);
return 0;
}
💻 Desenvolvimento Passo a Passo
- Criação da Struct: Definir quais dados são necessários.
- Interface CLI: Criar o loop principal com o menu.
- Implementação das Funções: Começar pela escrita e depois a leitura.
- Testes: Cadastrar, fechar o programa, abrir de novo e listar.
🚀 O que vem a seguir?
Este projeto é o protótipo do que você encontrará no mercado: sistemas que recebem dados, processam regras de negócio e salvam em algum lugar.
📝 Atividade da Aula
Siga o roteiro acima e construa o seu MinosSGB (Sistema de Gestão de Biblioteca). Sinta-se livre para adicionar novos campos, como "Preço" ou "Gênero".
Aula 16 – Boas Práticas e Encerramento 🎓
Parabéns! Você chegou ao final da nossa jornada pelos fundamentos da linguagem C. Nesta aula, vamos aprender como elevar o nível do seu código, tornando-o profissional, e quais são os próximos passos na sua carreira de programador.
💎 1. Convenções de Nomenclatura
Código limpo é código fácil de ler. Use nomes que expliquem o que a variável ou função faz.
- Variáveis: Use
camelCase(ex:notaFinal) ousnake_case(ex:nota_final). Evite nomes comox,y,a1. - Constantes: Siga o padrão
UPPER_CASE(ex:PI,MAX_BUFFER). - Funções: Devem ser verbos no infinitivo (ex:
calcularMedia,salvarDados).
📝 2. Comentários Úteis (≠ Óbvios)
Ruim (Comenta o óbvio):
Bom (Explica o porquê):
🌐 3. Portabilidade (Linux vs Windows)
O C é uma linguagem que roda em tudo, mas certas bibliotecas são específicas:
- conio.h (uso de getch() ou system("pause")) é comum no Windows, mas não existe nativamente no Linux.
- Tente usar sempre bibliotecas padrão (stdio.h, stdlib.h, string.h) para que seu código rode em qualquer lugar do mundo.
🚀 4. Próximos Passos na Programação
O que estudar agora?
1. Estruturas de Dados Avançadas: Listas Encadeadas, Pilhas, Filas e Árvores.
2. Alocação Dinâmica (malloc/free): Gerenciar a memória manualmente em tempo de execução.
3. C++: Uma evolução do C que traz a Programação Orientada a Objetos.
4. Sistemas Embarcados: Programar microcontroladores (Arduino, ESP32) usando C.
🏁 5. Mensagem Final
A linguagem C é a "mãe" das linguagens modernas. Dominá-la deu a você um entendimento profundo de como o computador funciona por baixo de todas as camadas de abstração. O caminho é longo, mas você já deu o passo mais difícil.
🚀 Desafio de Formatura
Crie um programa final (pode ser o SGB da Aula 15) mas aplique todas as boas práticas: use nomes claros, modularize em arquivos .h e .c, adicione um Makefile e documente suas funções com comentários explicativos.
Parabéns, Programador C! ✨
Exercícios
Índice de Exercícios 📝
Pratique seus conhecimentos com atividades divididas por níveis de dificuldade para cada aula.
🚀 Módulo 01: Fundamentos
- Aula 01: Introdução e Hello World - Primeiro contato e compilação.
- Aula 02: Estrutura e Compilação - Anatomia do código e erros comuns.
- Aula 03: Variáveis e Tipos - Manipulação de dados e I/O.
- Aula 04: Operadores - Cálculos e lógica.
🔀 Módulo 02: Estruturas de Controle
- Aula 05: Condicionais - Tomada de decisão.
- Aula 06: Repetição - Loops e automação.
- Aula 07: Vetores - Coleções de dados.
- Aula 08: Strings - Manipulação de textos.
📦 Módulo 03: Modularização e Memória
- Aula 09: Funções - Divisão em blocos reutilizáveis.
- Aula 10: Ponteiros (Introdução) - Endereços de memória.
- Aula 11: Ponteiros e Arrays - Aritmética de ponteiros.
- Aula 12: Structs - Tipos personalizados.
🏗️ Módulo 04: Sistemas e Persistência
- Aula 13: Arquivos - Salvando dados no disco.
- Aula 14: Organização de Projetos - Múltiplos arquivos e Headers.
- Aula 15: Projeto Integrador - Desenvolvimento de sistemas.
- Aula 16: Boas Práticas - Refatoração e Portabilidade.
[!TIP] Dica: Tente resolver os exercícios sem olhar a solução primeiro. O erro é parte fundamental do aprendizado em C!
Exercícios: Aula 01 – Introdução à Programação em C 📝
Pratique os conceitos iniciais de instalação, compilação e saída de dados.
🟢 Nível: Básico
1. Mensagem Personalizada
Crie um programa que imprima três frases diferentes, cada uma em uma linha, sobre suas expectativas para este curso. Use a biblioteca <stdio.h> e o comando printf.
2. Linhas em Branco
Modifique o programa anterior para que haja uma linha em branco entre cada frase, utilizando apenas um único comando printf (dica: use \n\n).
🟡 Nível: Intermediário
3. Desenho de Personagem
Crie um programa que utilize caracteres (como #, *, |, -) para "desenhar" um boneco palito ou uma casa simples no terminal usando vários comandos printf.
4. Compilação Manual
Abra o seu terminal e compile o programa do exercício 3 manualmente usando o comando gcc arquivo.c -o executavel. Em seguida, execute-o e tire um print do terminal. (Documente os comandos usados em um comentário no topo do seu código).
🔴 Nível: Desafio
5. O Menu de Opções (Visual)
Crie um programa que imprima um menu de sistema fictício. O menu deve ser centralizado e usar bordas feitas de caracteres especiais.
Exemplo de Saída Esperada:
=================================
| SISTEMA DE GESTÃO |
=================================
| 1. Cadastrar Aluno |
| 2. Listar Notas |
| 3. Configurações |
| 0. Sair |
=================================
[!TIP] Dica: Lembre-se sempre de incluir o
#include <stdio.h>e a funçãoint main() { ... }com oreturn 0;no final.
Exercícios: Aula 02 – Estrutura e Compilação 📝
Aprofunde seus conhecimentos sobre como um programa C é organizado e como o processo de compilação funciona.
🟢 Nível: Básico
1. Identificando Erros
Abaixo está um código com 3 erros de sintaxe. Identifique-os e escreva a versão corrigida:
2. Comentários Didáticos
Crie um programa que imprima o seu nome e, acima de cada linha de código, coloque um comentário explicando o que aquela linha está fazendo (ex: "Incluindo biblioteca de entrada e saída").
🟡 Nível: Intermediário
3. Compilação via Terminal
Crie um programa simples chamado test.c. Use o terminal para compilá-lo gerando um executável com o nome meu_teste. Teste a execução e descreva o comando exato que você usou.
4. Várias Funções de Saída
Crie um programa que utilize 5 comandos printf para contar uma história curta (uma frase por comando). Use \n para organizar as linhas.
🔴 Nível: Desafio
5. O Fluxograma Visual
Crie um programa que, ao ser executado, imprima no terminal um "mapa" visual do processo de compilação (Pré-processador -> Compilador -> Linker). Use setas feitas de caracteres (-->) e caixas feitas de hifens e barras (|, -).
Exemplo de Saída Esperada:
[ FONTE.C ] --(Pré-processador)--> [ EXPANDIDO ]
[ EXPANDIDO ] --(Compilador)-----> [ OBJETO.O ]
[ OBJETO.O ] --(Linker)----------> [ EXECUTÁVEL ]
[!IMPORTANT] Lembrete: A indentação não é obrigatória para o compilador, mas é ESSENCIAL para você e outros programadores entenderem o código!
Exercícios: Aula 03 – Variáveis e Tipos de Dados 📝
Pratique a declaração de variáveis e a interação com o usuário através do teclado.
🟢 Nível: Básico
1. Ficha Cadastral
Crie um programa que declare variáveis para armazenar seu nome (apenas a primeira letra), sua idade, sua altura e se você gosta de café (use 1 para Sim e 0 para Não). Imprima tudo formatado em uma frase.
2. Leitura Simples
Escreva um programa que peça ao usuário para digitar um número inteiro e, em seguida, imprima o dobro desse número.
🟡 Nível: Intermediário
3. Calculadora de IMC (Simplificada)
Crie um programa que peça o peso (float) e a altura (float) do usuário. Calcule o IMC básico usando a fórmula \(IMC = peso / (altura \times altura)\) e exiba o resultado com 2 casas decimais.
4. Troca de Valores
Declare duas variáveis inteiras, A e B, e peça valores para elas. Em seguida, faça com que o valor de A vá para B e o de B vá para A. Imprima os valores antes e depois da troca. (Dica: você precisará de uma terceira variável "auxiliar").
🔴 Nível: Desafio
5. O Pequeno Inventário
Crie um programa que simule o cadastro de um produto em uma loja. O programa deve pedir: - A letra inicial do produto (char). - A quantidade em estoque (int). - O preço unitário (float). - O código identificador do corredor (int).
Ao final, exiba um relatório formatado em colunas mostrando todos os dados capturados.
[!IMPORTANT] Lembrete: Sempre use o símbolo
&noscanfpara variáveis numéricas! Ex:scanf("%d", &variavel);
Exercícios: Aula 04 – Operadores e Expressões 📝
Coloque em prática o uso de cálculos matemáticos e lógica booleana em C.
🟢 Nível: Básico
1. As 4 Operações
Crie um programa que peça dois números inteiros ao usuário e exiba a soma, a subtração, a multiplicação e a divisão entre eles.
2. Resto da Divisão
Escreva um programa que peça um número inteiro e exiba o resto da divisão desse número por 2. (Dica: se o resto for 0, o número é par).
🟡 Nível: Intermediário
3. Calculadora de Desconto
Crie um programa que peça o valor de um produto (float). Calcule e exiba o "Valor com Desconto (10%)" e o "Valor Parcelado (3x sem juros)".
4. Verificador de Triângulo
Peça três números que representam os lados de um triângulo. Use operadores lógicos para verificar se eles podem formar um triângulo válido (a soma de dois lados deve ser sempre maior que o terceiro lado). Imprima 1 para Válido e 0 para Inválido.
🔴 Nível: Desafio
5. O Conversor de Tempo
Crie um programa que peça ao usuário um valor em segundos (int). O programa deve decompor esse valor em: Horas, Minutos e Segundos restantes.
Exemplo: 3665 segundos = 1 Hora, 1 Minuto e 5 Segundos.
(Dica: Use os operadores / e % sucessivamente).
[!TIP] Dica: No exercício do triângulo, a lógica é:
(a + b > c) && (a + c > b) && (b + c > a).
Exercícios: Aula 05 – Estruturas Condicionais 📝
Domine o controle de fluxo do seu programa usando decisões lógicas.
🟢 Nível: Básico
1. Maior de Dois
Escreva um programa que peça dois números inteiros e imprima qual deles é o maior. Se forem iguais, imprima "Os números são iguais".
2. Positivo ou Negativo
Crie um programa que receba um número e diga se ele é Positivo, Negativo ou Zero.
🟡 Nível: Intermediário
3. Classificação de Idade
Peça a idade de uma pessoa e classifique-a: - 0 a 12: Criança - 13 a 17: Adolescente - 18 a 59: Adulto - 60ou mais: Idoso
4. Mini Calculadora (switch)
Crie um programa que peça dois números reais e uma opção de operação (1-Soma, 2-Subtração, 3-Multiplicação, 4-Divisão). Use o switch para exibir o resultado. Não esqueça de tratar a divisão por zero!
🔴 Nível: Desafio
5. O Verificador de Ano Bissexto
Um ano é bissexto se ele for divisível por 4, mas não por 100, exceto se for divisível por 400. Crie um programa que peça um ano e diga se ele é bissexto ou não usando apenas estruturas if e else.
[!TIP] Dica: No exercício do ano bissexto, use o operador
%para verificar a divisibilidade. Ex:ano % 4 == 0.
Exercícios: Aula 06 – Estruturas de Repetição 📝
Automatize tarefas repetitivas e aprenda a controlar fluxos cíclicos.
🟢 Nível: Básico
1. Contador de 1 a 10
Escreva um programa que utilize um laço while para imprimir os números de 1 a 10, um em cada linha.
2. Tabuada Fixa
Crie um programa que utilize um laço for para imprimir a tabuada do número 7 (de 1 a 10).
🟡 Nível: Intermediário
3. Soma de Intervalo
Peça ao usuário dois números inteiros (início e fim). O programa deve somar todos os números entre esse intervalo (inclusive) e exibir o resultado final.
4. Média de N Números
Crie um programa que pergunte quantos números o usuário deseja digitar. Em seguida, use um laço para ler esses números e, ao final, exiba a média aritmética deles.
🔴 Nível: Desafio
5. O Gerador de Triângulos
Peça ao usuário um número inteiro N. O programa deve imprimir um triângulo de asteriscos com N linhas.
Exemplo para N=4:
(Dica: você precisará usar um laço dentro de outro laço - laços aninhados).[!IMPORTANT] Cuidado: Sempre verifique se sua condição de parada será atingida. Loops infinitos podem travar seu computador se não forem interrompidos!
Exercícios: Aula 07 – Vetores (Arrays) 📝
Aprenda a manipular coleções de dados de forma eficiente usando índices e laços.
🟢 Nível: Básico
1. Preenchendo o Vetor
Escreva um programa que declare um vetor de inteiros de 5 posições. Peça ao usuário para preencher o vetor e, em seguida, imprima todos os valores na tela.
2. Soma de Vetor
Crie um programa que tenha um vetor de 5 números reais (float) pré-definido. Calcule e exiba a soma de todos os elementos desse vetor.
🟡 Nível: Intermediário
3. Ordem Inversa
Peça ao usuário para digitar 6 números inteiros e guarde-os em um vetor. Em seguida, imprima esses números na ordem inversa (do último para o primeiro).
4. Busca no Vetor
Crie um vetor com 10 números inteiros aleatórios (ou fixos). Peça ao usuário um número e informe se esse número está presente no vetor ou não.
🔴 Nível: Desafio
5. O Maior e a Posição
Escreva um programa que leia 10 números e armazene-os em um vetor. Ao final, o programa deve informar qual foi o maior número digitado e em qual posição (índice) do vetor ele se encontra.
[!IMPORTANT] Dica: Lembre-se que o índice do vetor sempre vai de
0atétamanho - 1. Acessarvetor[tamanho]causará erros de memória!
Exercícios: Aula 08 – Strings em C 📝
Pratique a manipulação de textos e o uso da biblioteca string.h.
🟢 Nível: Básico
1. Boas-Vindas Personalizada
Escreva um programa que peça o primeiro nome do usuário e imprima uma mensagem personalizada como: "Olá [Nome], você está na aula 08!".
2. Contador de Caracteres
Crie um programa que peça uma palavra ao usuário e, usando a função strlen(), informe quantas letras a palavra possui.
🟡 Nível: Intermediário
3. Comparador de Nomes
Peça para o usuário digitar dois nomes. O programa deve dizer se os nomes são exatamente iguais ou se são diferentes (dica: use strcmp()).
4. Nome em Maiúsculas (Lógica)
Crie um programa que receba uma palavra em minúsculas e a transforme em maiúsculas. (Dica: Na tabela ASCII, a diferença entre 'a' e 'A' é de 32 valores. Tente subtrair 32 de cada caractere).
🔴 Nível: Desafio
5. Inversor de Textos
Escreva um programa que peça uma string ao usuário e a imprima de trás para frente.
Exemplo:
Entrada: Roma
Saída: amoR
(Dica: Use um laço for começando do índice strlen(string) - 1 e decresça até 0).
[!IMPORTANT] Aviso: Ao usar
fgets, o C pode incluir o caractere de "Enter" (\n) no final da string. Fique atento a isso ao comparar textos!
Exercícios: Aula 09 – Funções e Modularização 📝
Pratique a criação de blocos de código independentes e reutilizáveis.
🟢 Nível: Básico
1. Mensagem de Boas-Vindas
Crie uma função void saudar(char nome[]) que receba um nome e imprima "Olá, [nome]! Bem-vindo ao sistema de funções.". Chame essa função 3 vezes no main com nomes diferentes.
2. O Dobro do Número
Escreva uma função int dobro(int n) que receba um número inteiro e retorne o seu valor multiplicado por 2. Imprima o resultado no main.
🟡 Nível: Intermediário
3. Calculadora de Áreas
Crie funções separadas para calcular a área de um Quadrado, um Retângulo e um Triângulo. No main, peça ao usuário para escolher uma forma e informe as medidas necessárias para o cálculo.
4. Verificador de Notas
Escreva uma função que receba a média de um aluno e retorne um caractere:
- 'A' para média >= 9
- 'B' para média >= 7
- 'C' para média < 7
Exiba o caractere retornado no main.
🔴 Nível: Desafio
5. O Validador de Primos
Crie uma função chamada ehPrimo(int n) que retorne 1 se o número for primo e 0 caso contrário. Use essa função dentro de um laço no main para imprimir todos os números primos entre 1 e 50.
[!IMPORTANT] Dica: No desafio do número primo, lembre-se que um número primo só é divisível por 1 e por ele mesmo. Você terá que testar divisões de 2 até
n-1.
Exercícios: Aula 10 – Ponteiros (Introdução) 📝
Explore a manipulação direta da memória e entenda como as variáveis são armazenadas.
🟢 Nível: Básico
1. O Apontador
Crie um programa que declare uma variável inteira e um ponteiro para ela. Imprima o valor da variável acessando-a diretamente e, em seguida, acessando-a através do ponteiro.
2. Endereço Físico
Escreva um programa que peça um número ao usuário e imprima qual o endereço de memória (em hexadecimal) onde esse número foi guardado pelo sistema.
🟡 Nível: Intermediário
3. Alteração Indireta
Crie um programa com uma variável float preco = 100.00;. Declare um ponteiro para essa variável e use o ponteiro para aplicar um desconto de 15% direto na memória. Imprima o preço final acessando a variável original.
4. Tamanho dos Tipos
Use o operador sizeof() para descobrir e imprimir quantos bytes ocupam na memória um int, um float, um double e um char. Mostre também o endereço inicial de cada um deles após declará-los.
🔴 Nível: Desafio
5. Função com Referência
Escreva uma função void atualizarValores(int *a, int *b) que receba dois endereços. A função deve substituir o valor de A pela soma de A+B e o valor de B pela subtração de A-B. Teste a função no main imprimindo os resultados.
Exemplo: Entrada: A=10, B=5 Saída: A=15, B=5 (15-10=-5 ou conforme sua lógica de fluxo).
[!IMPORTANT] Aviso: Trabalhar com ponteiros exige atenção! Tentar acessar um endereço inválido (ponteiro NULL ou não inicializado) resultará no erro
Segmentation Fault(Faslha de Segmentação).
Exercícios: Aula 11 – Ponteiros e Arrays 📝
Aprofunde-se na relação entre vetores e aritmética de memória.
🟢 Nível: Básico
1. Acesso Indireto
Crie um vetor de 5 inteiros. Declare um ponteiro para esse vetor e imprima o terceiro elemento usando a notação *(p + 2).
2. Varredura com Ponteiro
Escreva um programa que peça 5 números ao usuário, armazene em um vetor e os imprima usando apenas um ponteiro e um laço for (sem usar colchetes []).
🟡 Nível: Intermediário
3. Soma via Aritmética
Crie um programa que declare um vetor de 10 números inteiros. Use um ponteiro para percorrer o vetor e calcular a soma total dos elementos.
4. Pulando Bytes
Crie um vetor de 4 elementos do tipo double. Imprima o endereço de cada elemento usando aritmética de ponteiros (e.g., p, p+1, p+2). Observe a diferença numérica entre os endereços e explique por que é maior que no caso de int.
🔴 Nível: Desafio
5. Inversão com Ponteiros
Escreva um programa que receba 10 números em um vetor. Use dois ponteiros (um apontando para o início e outro para o final do vetor) para inverter a ordem dos elementos dentro do próprio vetor, sem usar um vetor auxiliar.
[!TIP] Dica: No exercício de inversão, você pode fazer os ponteiros "caminharem" um em direção ao outro (
p1++ep2--) enquanto trocam os valores apontados.
Exercícios: Aula 12 – Estruturas (Structs) 📝
Aprenda a modelar dados do mundo real agrupando diferentes tipos de informações.
🟢 Nível: Básico
1. Ficha de Cadastro
Defina uma estrutura chamada Pessoa que contenha: Nome (string), Idade (int) e Altura (float). No main, peça ao usuário para preencher uma variável dessa estrutura e imprima os dados de forma organizada.
2. Geometria de Pontos
Crie uma struct Ponto com x e y (inteiros). Peça ao usuário as coordenadas de um ponto e diga em qual quadrante do plano cartesiano ele se encontra (ou se está sobre um eixo).
🟡 Nível: Intermediário
3. Gerenciamento de Estoque
Defina uma struct Produto com: Nome, Código (int) e Preço. Crie um vetor de 3 produtos. Peça ao usuário para cadastrá-los e, ao final, aplique um aumento de 10% no preço de todos e exiba a tabela atualizada.
4. Cadastro de Livros
Crie uma estrutura Livro com Título, Autor e Ano. Peça ao usuário para cadastrar um livro. Em seguida, crie uma função void imprimirLivro(struct Livro l) que receba a struct e exiba seus dados.
🔴 Nível: Desafio
5. O Melhor Aluno
Crie um programa que cadastre 5 alunos (Nome, Matrícula e Nota). Ao final do cadastro, o programa deve percorrer o vetor e imprimir o nome e a nota apenas do aluno que obteve a maior nota da turma.
[!TIP] Dica: No exercício 5, use uma variável
maiorNotainiciada com zero e uma variávelindiceMelhorpara guardar a posição do aluno vencedor durante a varredura do laço.
Exercícios: Aula 13 – Gerenciamento de Arquivos 📝
Aprenda a persistir dados no disco e a ler informações externas ao seu programa.
🟢 Nível: Básico
1. Olá Arquivo
Escreva um programa que crie um arquivo chamado ola.txt e escreva dentro dele a frase: "Este é meu primeiro arquivo em C!". Verifique se o arquivo foi criado na pasta do seu projeto.
2. Leitor de Texto
Crie um programa que abra o arquivo ola.txt criado no exercício anterior e exiba o conteúdo dele no terminal.
🟡 Nível: Intermediário
3. Cadastro Persistente
Peça ao usuário seu nome, idade e cidade. Salve essas informações em um arquivo chamado usuario.txt de forma organizada (um dado por linha ou separado por vírgulas).
4. Somador de Arquivo
Crie manualmente um arquivo chamado valores.txt com 5 números inteiros (um por linha). Escreva um programa em C que abra este arquivo, leia os números, calcule a soma e exiba o resultado no terminal.
🔴 Nível: Desafio
5. O Backup de Texto
Escreva um programa que leia um arquivo de texto chamado origem.txt e copie todo o seu conteúdo para um novo arquivo chamado destino.txt.
Dica: Você precisará abrir dois arquivos simultaneamente: um para leitura ("r") e outro para escrita ("w"). Use um laço com fgetc ou fgets para transferir os dados caractere por caractere ou linha por linha.
[!IMPORTANT] Aviso: Sempre verifique se o ponteiro
FILEé diferente deNULLapós abrir o arquivo. Se forNULL, o arquivo pode estar sendo usado por outro programa ou você não tem permissão de escrita.
Exercícios: Aula 14 – Organização de Projetos 📝
Aprenda a estruturar projetos de larga escala dividindo o código de forma lógica e modular.
🟢 Nível: Básico
1. Meu Primeiro Header
Crie um arquivo chamado saudacao.h com o protótipo de uma função void imprimirOla(). Em seguida, crie saudacao.c com a implementação dessa função. Por fim, crie um main.c que inclua o header e chame a função. Compile ambos os arquivos .c juntos.
2. Header Guards
Adicione os "Header Guards" (#ifndef, #define, #endif) ao arquivo saudacao.h que você criou no exercício anterior.
🟡 Nível: Intermediário
3. Biblioteca Matemática
Crie uma "mini-biblioteca" chamada math_util.
- math_util.h: Protótipos para dobro(int), triplo(int) e quadrado(int).
- math_util.c: Implementação das funções.
- main.c: Peça um número ao usuário e exiba os três resultados usando sua biblioteca.
4. Compilação Manual
Descreva, em um comentário no topo do seu main.c, qual o comando exato que você deve digitar no terminal do VS Code para compilar um projeto que tenha 3 arquivos .c chamados main.c, player.c e enemy.c.
🔴 Nível: Desafio
5. O Pequeno Makefile
Crie um arquivo chamado Makefile (sem extensão) na pasta do seu projeto. Escreva as regras para compilar sua "Biblioteca Matemática" do exercício 3. O comando make no terminal deve gerar um executável chamado app_matematica.
[!IMPORTANT] Dica: No
Makefile, a indentação DEVE ser feita com a teclaTAB, não com espaços, caso contrário o comando falhará.
Exercícios: Aula 15 – Projeto Prático Integrador 📝
Este é o momento de consolidar seu aprendizado. Não há novos comandos, apenas a aplicação da sua lógica de engenharia de software.
🟡 Nível: Integrador
1. Robustez no Cadastro
No sistema de biblioteca que estamos criando na aula, adicione uma validação: se o usuário tentar cadastrar um livro com o campo Ano negativo ou maior que o ano atual, o sistema deve exibir um erro e pedir para digitar novamente.
2. Pesquisa por Título
Adicione uma terceira opção ao menu: 3. Pesquisar Livro. O usuário digita o nome de um livro e o programa varre o arquivo (usando strcmp) para informar se o livro está ou não na biblioteca.
🔴 Nível: Desafio de Engenharia
3. O Contador de Acervo
Crie uma função que leia o arquivo da biblioteca e exiba um resumo estatístico: - Total de livros cadastrados. - Qual o livro mais antigo. - Qual o livro mais novo.
4. Remoção de Dados (Lógica)
Pense em como você faria para "deletar" um livro do arquivo. (Dica: como não podemos deletar linhas no meio de um arquivo de texto facilmente, a técnica comum é copiar todos os livros para um arquivo temporário, EXCETO o que você quer deletar, e depois renomear o temporário para o nome original).
[!IMPORTANT] Dica Final: Use funções para tudo! O seu
maindeve ter apenas a lógica de navegação do menu. Isso tornará seu projeto muito mais profissional.
Exercícios: Aula 16 – Boas Práticas e Refatoração 📝
O objetivo aqui não é criar algo novo, mas sim melhorar o que já existe. Refatorar é a arte de reescrever o código sem mudar o que ele faz, apenas tornando-o "melhor".
🟢 Nível: Analista
1. Detetive de Código
Analise o código abaixo e liste 3 problemas de "Boas Práticas" que ele possui:
2. Comentários Estratégicos
Pegue um dos seus projetos anteriores (ex: Projeto 13 ou 14) e adicione um cabeçalho de comentário padrão no topo de cada função explicando: - O que a função faz. - O que ela recebe como parâmetro. - O que ela retorna.
🟡 Nível: Refatorador
3. De Snake para Camel
Pegue um programa que você escreveu usando snake_case (ex: minha_variavel) e reescreva-o inteiramente usando camelCase (ex: minhaVariavel), seguindo as convenções profissionais.
4. Limpeza de Globais
Se você usou alguma variável global em seus projetos, tente refatorar o código para que essa variável seja passada como parâmetro para as funções, eliminando a dependência global.
🔴 Nível: Arquiteto
5. O Manual do Desenvolvedor
Escreva um pequeno arquivo README.txt para o seu Projeto Integrador (Aula 15) que explique:
- Como compilar o projeto.
- Quais arquivos compõem o sistema.
- Como o usuário deve interagir com o programa.
[!TIP] Dica: No desenvolvimento profissional, o README é tão importante quanto o código, pois ele é a porta de entrada para outros programadores entenderem seu trabalho.
Projetos
Índice de Mini-Projetos 🚀
Aplique o que aprendeu em cenários reais com estes desafios práticos de final de aula.
🛠️ Lista de Projetos
- Projeto 01: Cartão de Visitas Digital - Saída formatada.
- Projeto 02: Calculadora de Área CLI - Entrada e processamento.
- Projeto 03: Conversor de Unidades - Cálculos matemáticos.
- Projeto 04: Validador de Notas - Lógica de operadores.
- Projeto 05: Jogo de Adivinhação - Estruturas condicionais.
- Projeto 06: Tabuada Programável - Laços de repetição.
- Projeto 07: Gerenciador de Notas de Turma - Vetores e cálculos.
- Projeto 08: Criptografia de César - Manipulação de Strings.
- Projeto 09: Biblioteca de Geometria - Modularização com Funções.
- Projeto 10: Inspetor de Memória - Manipulação de Ponteiros.
- Projeto 11: Varredor de Memória - Aritmética de Ponteiros.
- Projeto 12: Sistema de Inventário - Uso de Structs.
- Projeto 13: Diário de Bordo C - Persistência em Arquivos.
- Projeto 14: Calculadora Modular - Múltiplos Arquivos e Headers.
- Projeto 15: Gestão de Biblioteca (SGB) - Projeto Integrador.
- Projeto 16: Portfólio Final - Boas Práticas e Refatoração.
[!IMPORTANT] Aviso: Recomenda-se realizar os projetos sequencialmente, pois cada um utiliza conhecimentos das aulas anteriores.
Projeto 01: Cartão de Visitas Digital 📇
Neste primeiro projeto, você aplicará os conceitos de saída de dados (printf) para criar um cartão de visitas formatado no terminal.
🎯 Objetivo
Desenvolver um programa em C que exiba suas informações básicas de forma organizada, utilizando caracteres especiais para criar uma moldura visual.
🛠️ Requisitos
- Utilizar o cabeçalho
#include <stdio.h>. - Utilizar a função
int main(). - Exibir pelo menos as seguintes informações:
- Nome Completo
- Idade
- Ocupação/Interesse Principal (ex: Estudante de Engenharia)
- GitHub ou LinkedIn
- O texto deve estar contido dentro de uma moldura feita de asteriscos (
*) ou hifens (-).
💻 Exemplo de Saída
****************************************
* *
* CARTÃO DE VISITAS *
* *
* Nome: Fulano de Tal *
* Idade: 20 anos *
* Foco: Desenvolvimento de Sistemas *
* GitHub: github.com/usuarioteste *
* *
****************************************
🚀 Passo a Passo
- Crie um arquivo chamado
projeto01.c. - Escreva a estrutura básica do programa.
- Use vários comandos
printfpara montar a moldura. - Compile no terminal usando:
gcc projeto01.c -o projeto01. - Execute e valide se a moldura está alinhada.
[!TIP] Dica: Tente usar espaços em branco dentro do
printfpara garantir que as bordas laterais fiquem perfeitamente alinhadas!
Projeto 02: Calculadora de Área via CLI 📐
Neste projeto, você colocará em prática o uso de múltiplos printf e a organização de código para criar uma ferramenta de cálculo visual.
🎯 Objetivo
Desenvolver um programa que exiba a fórmula de cálculo da área de um quadrado e um retângulo, utilizando formatação de texto para criar um layout limpo no terminal.
🛠️ Requisitos
- Utilizar comentários para separar as seções do código (cabeçalho, corpo e rodapé).
- Utilizar a flag de compilação
-opara gerar um executável chamadogeometria. - Exibir:
- Um título centralizado.
- O desenho de um quadrado e um retângulo (usando caracteres como
|,-,#). - As fórmulas matemáticas correspondentes (\(A = L \times L\) e \(A = b \times h\)).
💻 Exemplo de Saída
=================================
SISTEMA GEOMÉTRICO
=================================
1. QUADRADO:
+-------+
| | Lado = 4
| |
+-------+
Fórmula: Area = L * L
2. RETÂNGULO:
+-----------+
| | Base = 6
| | Altura = 3
+-----------+
Fórmula: Area = b * h
=================================
🚀 Passo a Passo
- Crie um arquivo chamado
geometria.c. - Organize o código com comentários explicativos.
- Experimente alinhar os textos usando espaços dentro do
printf. - Compile no terminal:
gcc geometria.c -o geometria. - Execute e verifique se o layout está agradável visualmente.
[!IMPORTANT] Desafio Extra: Tente adicionar uma cor ao título usando códigos de escape ANSI (pesquise por "C ANSI colors") se estiver no Linux ou Windows 10+.
Projeto 03: Conversor de Unidades (Idade em Dias) 🗓️
Neste projeto, você aprenderá a capturar dados do usuário, realizar um cálculo matemático simples e exibir o resultado formatado.
🎯 Objetivo
Criar um programa em C que solicite a idade do usuário em anos e exiba o equivalente aproximado em dias, horas e minutos vividos.
🛠️ Requisitos
- Utilizar variáveis do tipo
int. - Utilizar
printfpara solicitar os dados escanfpara capturá-los. - Utilizar as seguintes constantes para o cálculo:
- 1 ano = 365 dias.
- 1 dia = 24 horas.
- 1 hora = 60 minutos.
- Exibir o resultado de forma organizada.
💻 Exemplo de Saída
=================================
CONVERSOR DE EXISTÊNCIA
=================================
Digite sua idade em anos: 20
Sua jornada até agora:
> Dias: 7.300
> Horas: 175.200
> Minutos: 10.512.000
=================================
🚀 Passo a Passo
- Crie um arquivo chamado
conversor.c. - Declare as variáveis
idade,dias,horaseminutos. - Peça para o usuário digitar a idade.
- Realize as multiplicações.
- Exiba os resultados usando os formatadores
%d. - Compile e execute!
[!TIP] Dica: No
printf, você pode usar pontos para separar os milhares manualmente no texto ou apenas imprimir o número direto. Para números muito grandes (como minutos), considere usar o tipolong intse o resultado ultrapassar 2 bilhões!
Projeto 04: Calculadora de Médias e Validação 🎓
Neste projeto, você utilizará operadores aritméticos para calcular a média de um aluno e operadores lógicos para validar se os dados inseridos são consistentes.
🎯 Objetivo
Desenvolver um programa que receba as notas de dois bimestres, calcule a média e informe se o aluno está aprovado, além de verificar se as notas inseridas são válidas.
🛠️ Requisitos
- Solicitar duas notas (tipo
float). - Calcular a média aritmética simples.
- Utilizar operadores relacionais e lógicos para:
- Verificar se a
Nota 1está entre 0 e 10. - Verificar se a
Nota 2está entre 0 e 10. - Verificar se a
Médiaé maior ou igual a 7.0.
- Verificar se a
- Exibir os resultados (0 ou 1) para cada uma dessas validações.
💻 Exemplo de Saída
=================================
SISTEMA DE APROVAÇÃO
=================================
Digite a nota do 1º Bimestre: 8.5
Digite a nota do 2º Bimestre: 6.0
Relatório de Processamento:
> Média Final: 7.25
> Notas válidas (0-10)? 1 (Sim)
> Aluno aprovado (Média >= 7)? 1 (Sim)
=================================
🚀 Passo a Passo
- Crie um arquivo chamado
media.c. - Peça as notas ao usuário.
- Crie variáveis inteiras (
int) para armazenar os resultados das comparações lógicas. - Use expressões como
(nota1 >= 0 && nota1 <= 10)para validação. - Imprima a média com duas casas decimais (
%.2f). - Compile:
gcc media.c -o mediae execute.
[!IMPORTANT] Desafio: Tente criar uma única variável chamada
tudo_certoque só seja 1 se ambas as notas forem válidas E o aluno estiver aprovado.
Projeto 05: O Jogo de Adivinhação 🎲
Neste projeto, você aplicará os conceitos de estruturas condicionais (if, else if, else) para criar um jogo interativo simples no terminal.
🎯 Objetivo
Desenvolver um programa que armazene um "Número Secreto" e peça para o usuário tentar adivinhá-lo. O programa deve fornecer dicas se o número digitado foi maior ou menor que o segredo.
🛠️ Requisitos
- Definir uma variável constante (ou inicializada) chamada
numeroSecreto(ex: 42). - Solicitar um valor inteiro do usuário.
- Comparar o chute com o segredo e exibir:
- "PARABÉNS! Você acertou!" se os números forem iguais.
- "DICA: O número secreto é MAIOR." caso o chute seja baixo.
- "DICA: O número secreto é MENOR." caso o chute seja alto.
💻 Exemplo de Saída
=================================
JOGO DE ADIVINHAÇÃO
=================================
Tente adivinhar o número (1 a 100): 30
DICA: O número secreto é MAIOR.
=================================
🚀 Passo a Passo
- Crie um arquivo chamado
adivinha.c. - Declare as variáveis
numeroSecretoechute. - Use o
scanfpara ler o palpite do usuário. - Crie uma estrutura
ifencadeada para as três situações possíveis. - Compile com
gcc adivinha.c -o adivinhae execute.
[!IMPORTANT] Aviso: Por enquanto, o jogo roda apenas uma vez. Na próxima aula (Repetição), aprenderemos como fazer o jogo continuar até o usuário acertar!
Projeto 06: Tabuada Programável ➗
Neste projeto, você aplicará o comando for para automatizar a geração de uma tabuada completa com base na escolha do usuário.
🎯 Objetivo
Desenvolver um programa que peça ao usuário um número e gere a tabuada desse número de 1 a 10 de forma automática e organizada.
🛠️ Requisitos
- Solicitar um número inteiro do usuário.
- Utilizar um laço
forpara iterar de 1 a 10. - Calcular o resultado da multiplicação dentro (ou durante) o laço.
- Exibir cada linha da tabuada formatada como
N x i = Resultado.
💻 Exemplo de Saída
=================================
GERADOR DE TABUADA
=================================
Deseja a tabuada de qual número? 8
8 x 1 = 8
8 x 2 = 16
8 x 3 = 24
...
8 x 10 = 80
=================================
🚀 Passo a Passo
- Crie um arquivo chamado
tabuada.c. - Declare as variáveis
numeroei. - Use o
scanfpara ler o número desejado. - Escreva a estrutura do
for. - Imprima os resultados linha a linha.
- Compile com
gcc tabuada.c -o tabuadae execute.
[!TIP] Dica: Tente adicionar um cabeçalho visual e um rodapé para deixar o programa com cara de sistema profissional!
Projeto 07: Gerenciador de Médias de Turma 📈
Neste projeto, você utilizará vetores para armazenar as notas de vários alunos e laços de repetição para processar esses dados coletivamente.
🎯 Objetivo
Desenvolver um programa que receba a nota de 5 alunos, armazene-as em um vetor, calcule a média da turma e informe quantos alunos obtiveram nota igual ou superior à média calculada.
🛠️ Requisitos
- Declarar um vetor de
floatcom tamanho 5. - Utilizar um laço
forpara ler as 5 notas. - Utilizar um laço
forseparado para somar as notas e calcular a média. - Utilizar um terceiro laço (ou integrar no anterior) para contar quantos alunos estão acima da média.
- Exibir a média da turma e a contagem de aprovados.
💻 Exemplo de Saída
=================================
CONTROLE DE NOTAS 1.0
=================================
Digite a nota do Aluno 1: 8.0
Digite a nota do Aluno 2: 6.5
Digite a nota do Aluno 3: 10.0
Digite a nota do Aluno 4: 7.0
Digite a nota do Aluno 5: 9.0
Relatório Final:
> Média da Turma: 8.10
> Alunos acima da média: 2
=================================
🚀 Passo a Passo
- Crie um arquivo chamado
notas_turma.c. - Declare o vetor
notas[5], a variávelsomaecontAcima. - Preencha o vetor usando um laço
for. - Calcule a média total.
- Faça uma nova varredura no vetor comparando cada nota com a média.
- Imprima os resultados formatados.
[!IMPORTANT] Dica: Ao calcular a média, certifique-se de dividir a soma total por 5.0 (float) para manter a precisão das casas decimais.
Projeto 08: Criptografia de César Simples 🔐
Neste projeto, você aplicará o conceito de strings como vetores de números (Tabela ASCII) para criar um sistema de criptografia básico.
🎯 Objetivo
Desenvolver um programa que receba uma palavra do usuário e gere uma versão "criptografada" onde cada letra é substituída pela próxima letra do alfabeto (ex: 'A' vira 'B', 'c' vira 'd').
🛠️ Requisitos
- Solicitar uma palavra ou frase curta (use
fgets). - Utilizar um laço
forque percorra a string até encontrar o\0. - Dentro do laço, somar 1 ao valor de cada caractere (exceto o
\0e espaços). - Exibir a string original e a string criptografada.
💻 Exemplo de Saída
=================================
CRIPTOGRAFADOR C-STORE
=================================
Digite a mensagem: Olá Mundo
Original: Olá Mundo
Protegida: Pmc!Nvndo
=================================
🚀 Passo a Passo
- Crie um arquivo chamado
cripto.c. - Inclua
stdio.hestring.h. - Declare um vetor
char mensagem[100]. - Use
fgets(mensagem, 100, stdin)para ler a entrada. - Crie o loop:
for(int i = 0; mensagem[i] != '\0'; i++). - Verifique se o caractere não é um espaço antes de somar 1.
- Imprima o resultado.
[!TIP] Desafio: Crie a função de "Descriptografar", que faz o caminho inverso (subtrai 1) para recuperar a mensagem original!
Projeto 09: Biblioteca de Geometria Modularizada 📐
Neste projeto, você aplicará o conceito de funções para criar um sistema de desenho e cálculo geométrico organizado e fácil de manter.
🎯 Objetivo
Desenvolver um programa que utilize funções separadas para realizar cálculos e exibir formas geométricas no terminal, modularizando a lógica do sistema.
🛠️ Requisitos
- Criar uma função
void desenharLinha(int tamanho)que imprima uma linha de hifens (-). - Criar uma função
float areaQuadrado(float lado)que retorne a área. - Criar uma função
float areaTriangulo(float base, float altura)que retorne a área. - No
main, apresentar um menu de opções para o usuário. - Utilizar as funções criadas para exibir os resultados.
💻 Exemplo de Saída
=================================
GEOMETRIA MODULAR 1.0
=================================
1. Área do Quadrado
2. Área do Triângulo
Escolha: 1
Digite o lado: 5
---------------------------------
Resultado: 25.00
---------------------------------
=================================
🚀 Passo a Passo
- Crie um arquivo chamado
geo_modular.c. - Escreva os protótipos das funções no topo.
- Implemente o
maincom umswitchpara o menu. - Escreva a definição de cada função abaixo do
main. - Compile com
gcc geo_modular.c -o geoe execute.
[!TIP] Dica: A função
desenharLinhapode ser usada para criar separadores visuais elegantes em todo o seu programa, evitando repetir váriosprintf("------\n").
Projeto 10: Inspetor de Memória Interativo 🔍
Neste projeto, você colocará em prática o uso de ponteiros para investigar como o computador armazena os dados que o usuário digita.
🎯 Objetivo
Desenvolver um programa que peça um valor ao usuário, use um ponteiro para alterá-lo e exiba um "Raio-X" da variável na memória RAM.
🛠️ Requisitos
- Solicitar um número inteiro do usuário.
- Declarar um ponteiro que aponte para essa variável.
- Exibir:
- O valor original.
- O endereço de memória (em hexadecimal usando
%p). - O tamanho da variável em bytes (usando
sizeof).
- Alterar o valor da variável usando apenas o ponteiro (ex:
*p = 500;). - Exibir o novo valor da variável original.
💻 Exemplo de Saída
=================================
INSPETOR DE MEMÓRIA
=================================
Digite um número: 42
RELATÓRIO:
> Valor: 42
> Endereço: 0061FF1C
> Tamanho: 4 bytes
Alterando valor via ponteiro...
> Novo Valor: 500
=================================
🚀 Passo a Passo
- Crie um arquivo chamado
inspetor.c. - Declare as variáveis
numeint *p. - Peça o número ao usuário.
- Aponte o ponteiro:
p = #. - Use
printfcom os formatadores%d,%pe%zu(parasizeof). - Mude o valor com
*p = 500;. - Compile com
gcc inspetor.c -o inspetore execute.
[!IMPORTANT] Explicação: Note que mesmo mudando o valor através do ponteiro
p, a variávelnumoriginal foi alterada. Isso acontece porqueptem a "chave" (o endereço) do apartamento ondenumvive.
Projeto 11: O Varredor de Memória 🧹
Neste projeto, você desafiará sua lógica ao manipular um vetor inteiro sem usar os colchetes [], utilizando apenas aritmética de ponteiros para ler e processar os dados.
🎯 Objetivo
Desenvolver um programa que capture 5 valores inteiros do usuário, guarde-os em um vetor e, em seguida, encontre o maior valor e a soma total de todos eles usando apenas ponteiros.
🛠️ Requisitos
- Declarar um vetor de
intcom tamanho 5. - Declarar um ponteiro
int *pque aponte para o início do vetor. - Utilizar um laço
forpara a leitura dos dados usando a notação*(p + i). - Utilizar outro laço para percorrer o vetor via ponteiro e realizar os cálculos (soma e maior valor).
- Proibição: O uso de
v[i]em qualquer parte do código é proibido para este projeto.
💻 Exemplo de Saída
=================================
VARREDOR DE MEMÓRIA
=================================
Digite o 1º valor: 10
Digite o 2º valor: 25
Digite o 3º valor: 15
Digite o 4º valor: 30
Digite o 5º valor: 5
RESULTADOS (Via Ponteiros):
> Soma Total: 85
> Maior Valor: 30
=================================
🚀 Passo a Passo
- Crie um arquivo chamado
varredor.c. - Declare as variáveis necessárias.
- Preencha o vetor usando
scanf("%d", (p + i));. - Implemente a lógica de soma e comparação usando
*(p + i). - Imprima os resultados.
- Compile e execute!
[!IMPORTANT] Reflexão: Observe como o código funciona exatamente da mesma forma. A notação de colchetes é apenas uma facilidade que o C nos dá, mas por baixo dos panos, o computador sempre faz aritmética de ponteiros.
Projeto 12: Sistema de Inventário de Loja 🛒
Neste projeto, você modelará um sistema de controle de produtos utilizando structs e vetores para gerenciar o estoque de uma pequena loja.
🎯 Objetivo
Desenvolver um programa que cadastre 3 produtos, cada um contendo Nome, Preço e Quantidade em Estoque. O sistema deve calcular o valor total investido em cada item e o valor total geral do estoque.
🛠️ Requisitos
- Definir uma
struct Produtousandotypedef. - Declarar um vetor de 3 produtos.
- Utilizar um laço
forpara preencher os dados (Nome, Preço e Qtd). - Utilizar outro laço para exibir um relatório formatado em colunas (tabela).
- Calcular e exibir o valor total (Preço * Quantidade) de todo o estoque.
💻 Exemplo de Saída
=================================
CONTROLE DE ESTOQUE
=================================
Produto 1: Teclado
Preço: 150.00
Quantidade: 10
... (Repete para 3 produtos) ...
RELATÓRIO FINAL:
ID NOME PREÇO QTD TOTAL
---------------------------------------
01 Teclado 150.00 10 1500.00
02 Mouse 80.00 20 1600.00
03 Monitor 900.00 5 4500.00
---------------------------------------
VALOR TOTAL EM ESTOQUE: R$ 7600.00
=================================
🚀 Passo a Passo
- Crie um arquivo chamado
estoque.c. - Defina a struct
Produtofora domain. - No
main, declare o vetorProduto lista[3];. - Combine
printfescanfpara coletar os dados. - Use formatadores como
%10sou%-15snoprintfpara alinhar as colunas da tabela. - Compile e execute!
[!IMPORTANT] Dica: Ao ler strings com
scanf, lembre-se que ele para no espaço. Se quiser nomes compostos, usefgets(e tenha cuidado com o\nextra!).
Projeto 13: Diário de Bordo Persistente 📓
Neste projeto, você criará um programa que funciona como um diário, permitindo salvar anotações no disco rígido para que elas sejam mantidas mesmo após fechar o programa.
🎯 Objetivo
Desenvolver um programa que peça uma mensagem ao usuário e a grave em um arquivo de texto chamado diario.txt. O programa deve ser capaz de ler e exibir todas as mensagens salvas anteriormente.
🛠️ Requisitos
- Apresentar um menu com duas opções:
1. Escrever no Diárioe2. Ler Diário. - Na opção 1, usar o modo
"a"(append) para adicionar o novo texto ao final do arquivo sem apagar os registros antigos. - Na opção 2, abrir o arquivo no modo
"r"(read), ler linha por linha e imprimir no terminal. - Garantir que o arquivo seja fechado corretamente em ambas as operações.
💻 Exemplo de Saída
=================================
DIÁRIO DE BORDO C
=================================
1. Escrever nova nota
2. Ver notas anteriores
Escolha: 1
Digite sua nota: Hoje aprendi a manipular arquivos!
Nota salva com sucesso!
=================================
🚀 Passo a Passo
- Crie um arquivo chamado
diario.c. - Implemente o menu usando
switch. - Crie as funções de escrita e leitura separadamente para manter o código limpo.
- No
main, chame a função correspondente à escolha do usuário. - Compile com
gcc diario.c -o diarioe execute.
[!TIP] Dica: Adicione uma data ou um separador como
--------------------entre as notas gravadas para facilitar a leitura no modo 2.
Projeto 14: Calculadora Modular (Multi-arquivo) 🛠️
Neste projeto, você aprenderá a estruturar um programa profissional dividindo o código em diferentes arquivos e usando o compilador para uni-los.
🎯 Objetivo
Desenvolver uma calculadora que realize as 4 operações básicas, onde as funções de cálculo residem em arquivos separados do arquivo principal (main.c).
🛠️ Requisitos
operacoes.h: Contém os protótipos das funçõessomar,subtrair,multiplicaredividir, protegidos por Header Guards.operacoes.c: Contém a implementação real de cada função.main.c: Contém o menu de interação com o usuário e faz o#include "operacoes.h".- Realizar a compilação manual via terminal unindo os dois arquivos
.c.
💻 Exemplo de Estrutura
🚀 Passo a Passo
- Crie a pasta do projeto.
- Escreva o arquivo
operacoes.hcom as defesas#ifndef. - Escreva o arquivo
operacoes.ccom a lógica matemática. - Escreva o
main.csolicitando os números e chamando as funções da sua biblioteca. - No terminal, digite:
gcc main.c operacoes.c -o calc. - Execute:
./calc(no Windows) ou./calc.exe.
[!IMPORTANT] Desafio: Tente criar um arquivo chamado
Makefilesimples para compilar esse projeto com apenas um comandomake.
Projeto 15: Sistema de Gestão de Biblioteca (SGB) 📚
Este é o seu projeto final integrador! Aqui você aplicará quase tudo o que aprendeu ao longo do curso para criar um software de utilidade real.
🎯 Objetivo
Desenvolver um sistema completo de cadastro de livros que salve as informações em um arquivo no disco, permitindo que os dados sejam consultados mesmo após reiniciar o programa.
🛠️ Requisitos
- Estrutura: Criar uma
struct Livrocom: Título (string), Autor (string) e Ano (int). - Persistência: Criar uma função para salvar um novo livro no arquivo
biblioteca.dat(use o modo"a"). - Leitura: Criar uma função para listar todos os livros lendo o arquivo do início ao fim.
- Interface: Criar um menu robusto usando
do-whileeswitch-case. - Modularização: Separar a lógica do menu das funções de manipulação de dados.
💻 Exemplo de Funcionamento
SISTEMA DE BIBLIOTECA 1.0
--------------------------
1. Adicionar Livro
2. Listar Acervo
0. Sair
Escolha: 1
Título: Dom Casmurro
Autor: Machado de Assis
Ano: 1899
Livro salvo com sucesso!
🚀 Passo a Passo
- Crie o arquivo
sgb.c. - Defina a
structe os protótipos das funções. - Implemente o loop principal no
main. - Escreva a função de salvar usando
FILE *efprintf. - Escreva a função de listar usando
fgetsoufscanfdentro de umwhile. - Teste cadastrando 3 livros e verificando se a listagem exibe todos corretamente.
[!IMPORTANT] Desafio Extra: Adicione uma função de "Contagem" que mostre quantos livros existem no acervo sem precisar listá-los um por um.
Projeto 16: Portfólio Final do Aluno 🏆
Chegamos ao fim! Este não é apenas um projeto, mas a consolidação de tudo o que você construiu. O objetivo aqui é aplicar o "Polimento Profissional" em sua obra.
🎯 Objetivo
Refatorar o seu melhor projeto do curso (pode ser o SGB da Aula 15) aplicando TODAS as boas práticas de engenharia de software aprendidas na Aula 16.
🛠️ Requisitos de Excelência
- Nomenclatura: Substituir qualquer variável obscura (ex:
x,aux) por nomes descritivos. - Identação: Garantir que o código esteja perfeitamente alinhado e legível.
- Modularização: O projeto deve estar dividido em pelo menos dois arquivos
.ce um.h. - Makefile: Criar um script Makefile funcional para compilar o sistema.
- Documentação: Adicionar um arquivo
README.mdexplicando o que o projeto faz e como executá-lo.
💻 Checklist de Verificação
- [ ] O código compila sem
warningscom o comando-Wall. - [ ] Não existem variáveis globais desnecessárias.
- [ ] Todas as funções têm comentários explicando sua utilidade.
- [ ] O sistema de arquivos trata o erro de "arquivo não encontrado".
- [ ] As strings são lidas de forma segura (usando
fgetsem vez descanf).
🚀 Próximos Passos
Após concluir esta refatoração, salve seu código em um repositório no GitHub. Este será o seu primeiro grande marco como desenvolvedor de software de baixo nível.
[!IMPORTANT] Parabéns! Você não apenas aprendeu a programar, você aprendeu a arte de escrever código de qualidade. O mercado de trabalho valoriza profissionais que se preocupam com os detalhes que você aplicou hoje.
Quizzes
Índice de Quizzes ❓
Teste seu conhecimento teórico com perguntas rápidas sobre cada tópico do curso.
📝 Módulo 1: Introdução
- Quiz 01: Primeiros Passos
- Quiz 02: Estrutura e Compilação
- Quiz 03: Variáveis e Dados
- Quiz 04: Operadores e Expressões
🔄 Módulo 2: Fluxo e Controle
- Quiz 05: Estruturas Condicionais
- Quiz 06: Laços de Repetição
- Quiz 07: Vetores e Coleções
- Quiz 08: Strings e Caracteres
📍 Módulo 3: Avançado
- Quiz 09: Funções e Modularização
- Quiz 10: Introdução aos Ponteiros
- Quiz 11: Ponteiros e Arrays
- Quiz 12: Estruturas (Structs)
💾 Módulo 4: Especialização
- Quiz 13: Manipulação de Arquivos
- Quiz 14: Organização e Headers
- Quiz 15: Projeto Integrador
- Quiz 16: Boas Práticas
[!NOTE] Como usar: Clique em um dos links acima para abrir o quiz interativo da aula correspondente. Cada quiz contém 10 perguntas.
Quiz 01 - Introdução a Microsserviços 🌐
Quiz 02 - Arquitetura e Gateway 🏗️
Quiz 03 - Modelagem de APIs RESTful 📡
Quiz 04 - Documentação e Mocks 📝
Quiz 05 - Implementação de APIs ⚙️
Quiz 06 - Services e Regras de Negócio 🧠
Quiz 07 - Repositories e Banco de Dados 🗄️
Quiz 08 - Boas Práticas e Validação de Dados ✅
Quiz 09 - Segurança e Autenticação com JWT 🔐
Quiz 10 - Controle de Acesso (RBAC) 🛡️
Quiz 11 - Refresh Token e Segurança Avançada 🏗️
Quiz 12 - Introdução ao React ⚛️
Quiz 13 - Estado e Reatividade (useState) 🎣
Quiz 14 - Efeitos e APIs (useEffect) 🌐
Quiz 15 - Navegação com React Router 🚦
Quiz 16 - Projeto Final e Carreira 🎓
Slides
Índice de Slides 🎞️
Acesse os slides interativos de cada aula.
-
Slide 01 --- Introdução à Linguagem C.
-
Slide 02 --- Estrutura e Compilação.
-
Slide 03 --- Variáveis e Tipos de Dados.
-
Slide 04 --- Operadores e Expressões.
-
Slide 05 --- Estruturas Condicionais.
-
Slide 06 --- Estruturas de Repetição.
-
Slide 07 --- Vetores (Arrays).
-
Slide 08 --- Strings em C.
-
Slide 09 --- Funções e Modularização.
-
Slide 10 --- Introdução a Ponteiros.
-
Slide 11 --- Ponteiros e Vetores.
-
Slide 12 --- Estruturas (Structs).
-
Slide 13 --- Arquivos em C.
-
Slide 14 --- Organização de Projetos.
-
Slide 15 --- Projeto Integrador.
-
Slide 16 --- Boas Práticas.
Aula 01 - Introdução a Microsserviços 🌐
De Monólitos a Sistemas Distribuídos
Agenda de Hoje 📅
- Panorama do Software Moderno
- Monólitos vs Microsserviços
- A Economia das APIs
- Escalabilidade Vertical vs Horizontal
- Cinto de Utilidades (Ferramentas)
- Setup do Ambiente
1. O Mundo Cloud-Native ☁️
- Sistemas globais exigem disponibilidade 24/7.
- Milhões de requisições por segundo.
- Deploy contínuo (várias vezes ao dia).
2. A Evolução da Arquitetura 🏛️➡️🏗️
2.1 O Monólito 🏛️
- Um único projeto, um único deploy.
- Tudo ou nada: erro em um lugar afeta tudo.
- Difícil de escalar partes específicas.
- Ideal para: Projetos pequenos, MVPs rápidos.
2.2 Microsserviços 🏗️
- Conjunto de serviços independentes.
- Comunicação via rede (APIs).
- Cada um com seu banco de dados.
- Ideal para: Sistemas complexos e escaláveis.
3. O Papel das APIs 📡
- Contract-First: Acordo de comunicação.
- REST como padrão dominante.
- JSON: A língua universal.
Escalabilidade: Vertical vs Horizontal
| Vertical (Scale Up) | Horizontal (Scale Out) |
|---|---|
| Aumenta CPU/RAM | Adiciona mais servidores |
| Tem limite físico | Virtualmente ilimitada |
| Causa downtime no upgrade | Zero downtime (Redundância) |
Arquitetura de Microsserviços
graph LR
User[Cliente] --> AGW[API Gateway]
AGW --> S1[Usuários]
AGW --> S2[Pedidos]
AGW --> S3[Pagamentos]
S1 --> DB1[(DB)]
S2 --> DB2[(DB)]
S3 --> DB3[(DB)]
4. Ferramentas Indispensáveis 🛠️
Client HTTP: Postman & Insomnia
- Testar rotas sem Frontend.
- Analisar Headers e Status Codes.
- Simular diferentes cenários de erro.
Containerização: Docker 🐋
- "Roda na minha máquina, roda em qualquer lugar".
- Isola dependências e versões.
- Facilita a subida de múltiplos serviços locais.
5. Estrutura de Projeto Backend 📂
- Divisão clara de responsabilidades.
- Controllers, Services e Repositories.
- Tratamento global de exceções.
6. Setup do Ambiente 🚀
Requisitos:
- IDE: VS Code ou IntelliJ.
- Postman (Desktop ou Extensão).
- Docker Desktop.
- Git & GitHub.
Resumo da Aula ✅
- Microsserviços trazem resiliência e escala.
- APIs são o coração da comunicação moderna.
- Ferramentas como Docker mudaram o jogo.
- Começamos nossa jornada Fullstack!
Próxima Aula: Arquitetura e Gateway 🏗️
- Como os serviços conversam?
- O que é Service Discovery?
- Protegendo a porta de entrada.
Dúvidas? 🤔
"A arquitetura de hoje é o legado de amanhã. Escolha com sabedoria."
Aula 02 - Arquitetura e Gateway 🏗️
Orquestrando Microsserviços
Agenda 📅
- Comunicação entre Serviços
- Síncrono vs Assíncrono
- O Papel do API Gateway
- Service Discovery
- Load Balancing
- Padrões de Resiliência
1. Como os Serviços Conversam? 💬
- Microsserviços são ilhas que precisam de pontes.
- Dois mundos: Sync e Async.
1.1 Comunicação Síncrona 🔄
- Cliente bloqueia até a resposta.
- Uso de HTTP/REST ou gRPC.
- Risco: Acoplamento temporal e gargalos.
1.2 Comunicação Assíncrona 📬
- Envia e esquece (Eventos).
- Uso de Filas e Tópicos (Broker).
- Vantagem: Escalabilidade e desacoplamento.
2. API Gateway: O Porteiro 🚪
- Única entrada para o mundo exterior.
- Esconde a complexidade interna.
Gateway Responsibilities
- Roteamento:
/p-> Pagamento,/e-> Estoque. - Segurança: Autenticação centralizada.
- Rate Limit: Proteção contra flood.
- Logs & Monitoramento.
3. Service Discovery 🔎
- Onde está o servidor de pagamentos?
- Agenda dinâmica de IPs e Portas.
- Ferramentas: Netflix Eureka, Consul.
4. Load Balancing ⚖️
- Distribuição inteligente da carga.
- Evita que um container "morra" de trabalho.
graph TD
GW[Gateway] --> LB[Load Balancer]
LB --> S1[Serviço A]
LB --> S2[Serviço B]
LB --> S3[Serviço C]
5. Resiliência: Circuit Breaker 🔌
- Detecta serviços lentos ou falhos.
- Abre o circuito para proteger o resto do sistema.
- Evita o cascateamento de erros.
Comparativo: Sync vs Async
| Característica | Síncrono 🔄 | Assíncrono 📬 |
|---|---|---|
| Resposta | Imediata | Eventual |
| Desempenho | Limitado pelo destino | Alto débito |
| Uso comum | Cadastro/Login | Geração de Relatórios |
6. Prática: O "Dashboard" Agregador 💻
- Como o Gateway une dados de 3 serviços?
- Agregação de respostas (Aggregation Pattern).
Desafio Relâmpago ⚡
O que acontece se o seu API Gateway cair? Ele é um ponto único de falha?
Resumo ✅
- Sync é fácil, Async é escalável.
- API Gateway protege e organiza.
- Service Discovery é essencial em containers.
- Resiliência não é opcional!
Próxima Aula: Modelagem REST 📡
- Verbos HTTP.
- Status Codes.
- O contrato ideal.
Dúvidas? 🏗️
Aula 03 - Modelagem de APIs RESTful 📡
Recursos, Verbos e Contratos
Agenda 📅
- O que é REST?
- Recursos e URIs
- Verbos HTTP (GET, POST, PUT...)
- Status Codes
- JSON: A Linguagem das APIs
- Boas Práticas de Design
1. REST: A "Língua" da Web 🌐
- Style arquitetural para sistemas distribuídos.
- Baseado no protocolo HTTP.
- Independência entre Client e Server.
Princípios REST
- Stateless: Cada requisição é única.
- Uniform Interface: Padrões compartilhados.
- Cacheable: Melhore a performance.
2. Identificando Recursos 📍
- Um recurso é qualquer coisa que expomos.
- URI: O endereço do recurso.
O que NÃO fazer:
GET /obterUsuarios ❌
O que fazer:
GET /usuarios ✅ (Sempre substantivos no plural!)
3. Os Verbos HTTP 🛠️
Eles definem a intenção da chamada:
- GET: Buscar dados.
- POST: Criar novo dado.
- PUT: Atualizar (Trocar tudo).
- PATCH: Atualizar (Apenas um pedaço).
- DELETE: Remover dado.
Idempotência e Segurança
| Verbo | Seguro? | Idempotente? |
|---|---|---|
| GET | Sim ✅ | Sim ✅ |
| POST | Não ❌ | Não ❌ |
| PUT | Não ❌ | Sim ✅ |
| DELETE | Não ❌ | Sim ✅ |
4. Status Codes: A Resposta 🚦
- 2xx: Deu certo! (200, 201, 204).
- 4xx: Você (cliente) errou algo (400, 401, 404).
- 5xx: Eu (servidor) quebrei (500, 503).
5. O Formato JSON 🏗️
- Leve, legível e universal.
6. Design de URIs Complexas
Como buscar os pedidos de um usuário específico?
GET /usuarios/123/pedidos ✅
- Hierarquia lógica e limpa.
7. Prática: Postman em Ação 💻
- Testando verbos em APIs reais.
- Analisando Headers e Body.
Desafio REST ⚡
Se você quer mudar apenas o e-mail de um usuário, qual verbo deve usar: PUT ou PATCH?
Resumo ✅
- REST é sobre recursos e padrões.
- URIs usam substantivos no plural.
- Status codes guiam o frontend.
- JSON é o padrão de facto.
Próxima Aula: Swagger e Mocks 📝
- Documentação automática.
- Como trabalhar sem o backend pronto?
Dúvidas? 📡
Aula 04 - Documentação e Mocks 📝
Developer Experience e Contratos
Agenda 📅
- Por que documentar?
- OpenAPI vs Swagger
- Swagger UI e Editor
- O Poder dos Mocks
- Developer Experience (DX)
- Ferramentas de Simulação
1. Documentação é DX 🚀
- Sua API é seu produto.
- Documentar economiza tempo de suporte.
- Facilita a integração com Front/Mobile.
2. OpenAPI (OAS) 📜
- O padrão mundial.
- Arquivo YAML ou JSON descritivo.
- Agnóstico de linguagem.
3. Swagger: O Canivete Suíço 🛠️
- Editor: Escreva e valide o contrato.
- UI: Gere a página visual de testes.
- Codegen: Gere código (client/server) automaticamente.
Swagger UI em Ação
- Permite testar endpoints no próprio navegador.
- Mostra exemplos de JSON de entrada e saída.
- Exibe todos os Status Codes possíveis.
4. O Poder dos Mocks 🎭
- Development in Parallel: Front não espera pelo Back.
- Servidor "Fake" que retorna dados reais.
- Valide a experiência antes da implementação complexa.
5. Developer Experience (DX) 👨💻
Como ser amado por outros devs:
- Nomes de rotas claros.
- Erros descritivos no Body.
- Exemplos de requisição.
- Documentação atualizada (ou gerada pelo código).
6. Ferramentas Recomendadas 🧰
- Swagger Editor: Online ou Local.
- Mockoon: Mock local amigável.
- Prism: Mock via CLI.
- Postman: Collections documentadas.
7. Prática: Editando um YAML 💻
- Desenhando um endpoint
GET /tarefas. - Definindo parâmetros de entrada.
- Criando esquemas de dados.
Desafio: Mock vs Stubs ⚡
Qual a principal vantagem de um Mock Server online (como Postman) em relação a um Mock rodando apenas no computador do desenvolvedor?
Resumo ✅
- OpenAPI é o contrato.
- Swagger UI é a vitrine da sua API.
- Mocks destravam o desenvolvimento da equipe.
- DX é o diferencial de uma boa API.
Próxima Aula: Implementação Backend! 💻
Módulo 2: Manipulação de Dados
- Controllers e Services.
- Repositories e Banco de Dados.
- Mão na massa com código real!
Dúvidas? 📝
Aula 05 - Implementação de APIs ⚙️
Controllers e Rotas
Agenda 📅
- Camadas do Backend
- O Papel do Controller
- Rotas e Handlers
- Capturando Dados (Params/Body)
- Status Codes na Prática
- Injeção de Dependência
1. Organização em Camadas 🧱
- Controller: Trata a entrada (HTTP).
- Service: Regras de negócio.
- Repository: Acesso ao banco.
2. O Papel do Controller 🎮
- Ele é o ponto de entrada.
- Não deve ter lógica complexa!
- Deve apenas orquestrar a execução.
Controller = Garçom 🤵 Service = Cozinheiro 👨🍳
3. Rotas e Handlers 📍
- Rota: Verbo HTTP + Path.
- Handler: Função executada.
4. Capturando Dados 📥
- Path Params:
/id/123(Identificação). - Query Params:
?q=busca(Filtro). - Body: Enviando JSON (Criação/Update).
5. Respostas de Qualidade 📤
- Nunca esqueça o Status Code!
- Sucesso: 200, 201, 204.
- Erro: 400, 401, 404, 500.
6. Injeção de Dependência 💉
- Receber serviços prontos.
- Facilita testar o Controller "isolado".
7. Prática: O Primeiro Endpoint 💻
- Mapeando um
GET /ping. - Retornando um
pongem JSON. - Testando no Insomnia/Postman.
Desafio: Params vs Query ⚡
Se você quer listar todos os alunos de uma sala com o nome "Pedro", qual tipo de parâmetro você usaria para o nome?
Resumo ✅
- Controllers são a porta de entrada.
- Devem ser leves e objetivos.
- Capturam dados e retornam status/JSON.
- Seguem as rotas definidas.
Próxima Aula: Regras de Negócio! 🧠
Services e Validações
- Onde o cálculo acontece.
- Isolando o código do "mundo externo".
Dúvidas? ⚙️
Aula 06 - Services e Regras de Negócio 🧠
O Cérebro da Aplicação
Agenda 📅
- Por que separar as coisas?
- Responsabilidades do Service
- O Fluxo: Controller -> Service
- Tratamento de Erros Profissional
- DTOs: Protegendo os Dados
- Service vs ViewModel (Mobile)
1. O Problema: "Controller Gordo" 🍔
- Lógica de negócio misturada com HTTP.
- Código impossível de reutilizar.
- Difícil de testar.
2. A Solução: Layered Architecture 🧱
- Controller: Trata o transporte (HTTP).
- Service: Trata a regra (O QUE fazer).
3. O que vai no Service? ⚖️
- Validações complexas.
- Cálculos de valores.
- Envio de e-mails/notificações.
- Integração com repositórios.
4. Tratamento de Erros ⚠️
- O Service Lança (Throws).
- O Controller Captura (Catches).
// Service
if (!saldo) throw new Error("Saldo Insuficiente");
// Controller
try { ... } catch (e) { res.status(400)... }
5. DTOs: Filtrando a Saída 📦
- Nunca envie "tudo" do banco para o cliente.
- Proteja campos sensíveis (Ex:
senha_hash). - Melhore a performance (menos dados trafegados).
6. Service vs ViewModel 🆚
- No Backend: Service é o cérebro.
- No Mobile/Front: ViewModel é o cérebro.
- Ambos servem para "limpar" a camada de visualização.
7. Prática: Validando um Cadastro 💻
- Verificando se o e-mail é válido.
- Verificando se o usuário já existe.
- Lançando erros específicos.
Desafio: Onde colocar? ⚡
Se uma regra diz: "Usuários VIP ganham 20% de desconto", essa regra deve ficar no Controller ou no Service?
Resumo ✅
- Controllers recebem, Services processam.
- Mantenha seus Controllers "finos" (Slim Controllers).
- Centralize as regras para facilitar a manutenção.
- DTOs são as fronteiras dos dados.
Próxima Aula: Onde os dados vivem! 🗄️
Repositories e Banco de Dados
- PostgreSQL e SQL básico.
- Camada de persistência.
Dúvidas? 🧠
Aula 07 - Repositories e Banco de Dados 🗄️
Onde a informação descansa
Agenda 📅
- Por que Bancos de Dados?
- PostgreSQL: O Robusto
- SQL Básico (SELECT, INSERT...)
- Relacionamentos (1:N, N:N)
- Camada de Persistence
- O Padrão Repository
1. Persistência de Dados 💾
- Sem banco, o servidor esquece tudo ao reiniciar.
- Precisamos de segurança e integridade.
- Estritamente Tipado: O banco garante o formato.
2. Por que PostgreSQL? 🐘
- Código Aberto (Open Source).
- Extremamente confiável (ACID).
- Suporta dados complexos (JSONB).
3. SQL: A Linguagem Universal 🗣️
- DDL: Define a estrutura (Tabelas).
- DML: Manipula os dados (Linhas).
4. O Coração: Relacionamentos 🔗
- 1:N: Um cliente, muitos pedidos.
- N:N: Muitos alunos, muitos cursos.
- Foreign Key: A âncora que liga tudo.
5. Camada de Persistence 🧱
- O código que conversa com o driver do banco.
- Onde as queries são traduzidas para o código.
6. Padrão Repository 📥
- "Não me diga como, diga O QUE você quer".
- Isola o SQL da regra de negócio.
7. Migrations 📜
- Controle de versão para o Banco.
- Permite "voltar no tempo" se algo quebrar.
- Mantém o time em sincronia.
Desafio SQL ⚡
Qual comando você usaria para mudar o preço de todos os produtos da categoria 'Games' para 99.90?
Resumo ✅
- Bancos de dados dão memória ao sistema.
- PostgreSQL é o padrão da indústria.
- SQL é habilidade obrigatória para backend.
- Repository Pattern traz flexibilidade.
Próxima Aula: Integridade! ✅
Validação e Boas Práticas
- Garantindo que dados "sujos" não entrem no banco.
- Tratamento de exceções de banco.
Dúvidas? 🗄️
Aula 08 - Boas Práticas e Validação ✅
Qualidade e Segurança no Backend
Agenda 📅
- Por que Validar Tudo?
- Validação vs Sanitização
- Schema Validation (Ex: Zod)
- Clean Code (Código Limpo)
- Tratamento de Erros Profissional
- Middlewares Globais
1. Regra de Ouro: Desconfiança 🛡️
- O cliente é o "lado perigoso" da aplicação.
- Validações evitam dados corrompidos.
- Defesa em Profundidade: Garanta a regra no banco E no código.
2. Validar vs Sanitizar 🧼
- Validar: Checar (Idade > 18?).
- Sanitizar: Limpar (Remover
<script>).
3. Schema Validation 📐
- Crie "moldes" para seus dados.
- Validação centralizada e reutilizável.
4. O Backend Elegante (Clean Code) ✨
- DRY: Don't Repeat Yourself (Não repita lógica).
- KISS: Keep It Simple, Stupid (Mantenha o simples).
- Nomes de funções que explicam o que está acontecendo.
5. Tratamento de Erros 🚨
- Controller trata o fluxo, não o detalhe técnico.
- Try/Catch Global: Evite crashes.
- Mensagens amigáveis para o cliente.
6. Logs vs Mensagens 📜
- Terminal/Log: Detalhe técnico completo.
- Cliente (JSON): Apenas o que ele precisa saber.
"Ocorreu um erro interno" (Cliente) ✅ "Query failed at line 42 due to NULL constraint" (Logs) ✅
7. Prática: O Schema Perfeito 💻
- Validando um produto complexo.
- Tratando erros de tipo (String no lugar de Number).
Desafio: Limpeza ⚡
Se você recebe um texto de um post com muitos espaços em branco no final, você deve Validar ou Sanitizar?
Resumo ✅
- Backend robusto exige validação rigorosa.
- Limpe os dados antes de salvar (Sanitize).
- Middleware Global centraliza a gestão de falhas.
- Código limpo economiza meses de manutenção.
Próxima Aula: Módulo 3! 🔐
Segurança e Autenticação
- Quem é você? (Authentication).
- O que você pode fazer? (Authorization).
Dúvidas? ✅
Aula 09 - Segurança e Autenticação com JWT 🔐
Portas trancadas e Crachás Digitais
Agenda 📅
- Autenticação vs Autorização
- O Fim das Sessões (Stateful)
- O que é JWT?
- Estrutura: Header, Payload, Signature
- Fluxo de Login completo
- Melhores Práticas de Segurança
1. Quem é Você? (Autenticação) 🚦
- Validar a identidade do usuário.
- Login e Senha.
- Autorização: O que você PODE fazer? (Níveis de acesso).
2. Por que JWT? 🤔
- Abordagem Stateless (Sem estado).
- O servidor não guarda sessão na memória (escalável!).
- Perfeito para Microserviços e Mobile.
3. Estrutura do Token 🎫
- Header: Algoritmo (ex: HS256).
- Payload: Os dados (id, role, nome).
- Signature: O lacre de segurança.
4. O Coração do JWT: A Assinatura 🖋️
- Usa uma
SECRET_KEYno servidor. - Garante que o token não foi "hackeado" ou alterado.
5. Fluxo de Login 🌊
- Envia credenciais -> 2. Servidor valida -> 3. Gera JWT -> 4. Frontend guarda o Token -> 5. Envia no Header em cada requisição.
6. Segurança em Mobile 📱
- Nunca guarde em arquivos de texto!
- Use EncryptedSharedPreferences (Android) ou Keychain (iOS).
7. Melhores Práticas 🏆
- Use chaves secretas longas e seguras.
- Defina tempo de expiração (
expiresIn). - Protocolo HTTPS é obrigatório!
Desafio de Segurança ⚡
O Payload do JWT é criptografado ou apenas codificado? Posso guardar a senha do usuário lá?
Resumo ✅
- JWT permite autenticação rápida e escalável.
- Header + Payload + Signature.
- Stateless = Servidor mais leve.
Próxima Aula: Controle de Acesso 🛡️
Quem manda aqui? (RBAC)
- Middlewares de autorização.
- Protegendo rotas por nível de usuário.
Dúvidas? 🔐
Aula 10 - Controle de Acesso (RBAC) 🛡️
Hierarquia e Segurança em Camadas
Agenda 📅
- O que é RBAC? (Roles)
- Autenticação vs Autorização
- O Fluxo do Middleware
- Erros 401 vs 403
- Protegendo rotas na prática
- Hierarquia de Perfis
1. Role-Based Access Control 👑
- Permissões ligadas a Perfis (Roles).
- Ex: ADMIN, EDITOR, VIEWER.
- Facilita a gestão de milhares de usuários.
2. A Cancela (Middleware) 🚧
- O middleware checa se o usuário tem a "chave" certa.
- Se não tiver -> 403 Forbidden.
- Se tiver ->
next().
3. O Fluxo de Segurança 🌊
graph LR
Req[Request] --> Auth[Autenticação]
Auth --> |OK| Role[Autorização]
Role --> |OK| Controller[Recurso Final]
4. 401 vs 403: Não confunda! ❌
- 401 (Unauthorized): "Quem é você?". Token inválido ou ausente.
- 403 (Forbidden): "Eu sei quem você é, mas não deixo entrar". Falta de permissão.
5. Implementação Dinâmica 🔒
// Middleware genérico
router.delete('/usuario/:id',
autenticar,
autorizar(['ADMIN']),
userController.remover
);
6. Hierarquia de Acesso 🏛️
- Um Admin deve poder acessar rotas de User?
- Design de sistema: Roles "Pai" e "Filho".
7. Melhores Práticas 🏆
- Centralize a lógica em Middlewares.
- Nunca exponha permissões sensíveis no frontend (segurança do lado do servidor).
Desafio: Segurança ⚡
Em um sistema escolar, o Diretor e o Professor podem ver notas. O Aluno só vê as dele. Como você configuraria a Role da rota GET /notas?
Resumo ✅
- RBAC organiza permissões por grupos.
- Middlewares são os guardiões das rotas.
- Diferenciar 401 de 403 é vital para Debug.
Próxima Aula: Segurança Avançada 🏗️
Session vs Token e Refresh Tokens
- O que fazer quando o token expira?
- Protegendo contra ataques comuns (XSS, CSRF).
Dúvidas? 🛡️
Aula 11 - Refresh Token e Segurança Avançada 🏗️
Blindando sua API contra o mundo
Agenda 📅
- O Problema do Token Curto ⏰
- Refresh Tokens (O que são?)
- CORS: Origens e Destinos
- Helmet: Headers de Aço
- Rate Limit: Contra Brute Force
- Ataques Comuns (XSS, Injection)
1. Por que Tokens Expiram? ⏰
- Segurança! Se roubarem o token, ele dura pouco.
- Problema: O usuário odeia fazer login toda hora.
2. Refresh Token 🔁
- Um token de longa duração (7 dias+).
- Serve apenas para trocar por um novo Access Token.
- Deve ser invalidado se o usuário deslogar.
3. CORS: Cross-Origin Resource Sharing 🌍
- "Quem pode me chamar?".
- Resolvido via Headers no Servidor.
- Nunca use
origin: '*'em ambientes reais!
4. Helmet: Proteção de Headers 🪖
- Remove o
X-Powered-By(não diz que é Express). - Adiciona proteção contra Clickjacking e XSS.
5. Rate Limiting 🔨
- 5 tentativas de login por minuto? Sim.
- Evita que robôs tentem descobrir senhas via "força bruta".
6. Onde salvar os Tokens? 🛡️
- Frontend: LocalStorage? Seguro?
- Melhor Prática: Cookies
HttpOnly+Secure.
7. Melhores Práticas de Segurança 🏆
- Use HTTPS sempre.
- Valide TODAS as entradas do usuário.
- Mantenha as bibliotecas atualizadas.
Desafio de Segurança ⚡
Qual a diferença entre 401 e 403 no contexto de Refresh Tokens? Se eu recebo 401, eu tento o refresh ou deslogo o usuário?
Resumo ✅
- Refresh Token equilibra UX e Segurança.
- CORS e Helmet são as portas do seu castelo.
- Proteja-se contra robôs com Rate Limit.
Próximo Módulo: Front-End Moderno 🎨
Saindo das APIs e indo para a Web!
- Introdução ao React/Vite.
- Consumindo nossas APIs no navegador.
Dúvidas? 🏗️
Aula 12 - Introdução ao React ⚛️
O Poder dos Componentes Modernos
Agenda 📅
- O que são SPAs?
- Por que React?
- Vite: A Ferramenta Rápida
- JSX: JS + HTML
- Componentes e LEGO
- Props: O Coração Dinâmico
1. Single Page Applications (SPA) 📄
- O site que nunca recarrega.
- Navegação fluida e instantânea.
- Ex: Gmail, Facebook, Spotify Web.
2. Por que o React venceu? ⚔️
- Componentização (Foco no Reuso).
- Virtual DOM (Foco na Performance).
- Gigantesco Ecossistema (Foco no Emprego).
3. Vite: O Novo Padrão ⚡
- Inicia o projeto em segundos.
- Feedback instantâneo durante o código.
4. JSX: A Mistura Perfeita 🧪
- Parece HTML, mas tem o poder do Javascript.
5. Componentes = LEGO 🧩
- Pequenas partes isoladas.
- Facilita testes e trabalho em equipe.
6. Props: Passando o Bastão 🎁
- Permite que componentes recebam dados do "pai".
- Torna componentes genéricos e reutilizáveis.
Resumo ✅
- SPA torna a Web parecida com Apps.
- React organiza sua UI em componentes.
- Vite é seu melhor amigo no desenvolvimento.
Próxima Aula: Dinâmica e Estado 🎣
O que acontece quando o usuário clica?
- Hooks:
useState. - Reatividade na prática.
Dúvidas? ⚛️
Aula 13 - Estado e Hooks 🎣
Tornando seu App Interativo
Agenda 📅
- O que é o Estado (State)?
- Hook
useState - Lidando com Cliques e Eventos
- Inputs Controlados
- Imutabilidade e Arrays
1. O Problema da Estática 🧱
- Variáveis comuns mudam nos bastidores...
- ...mas a tela continua a mesma!
- O React precisa de um sinal para re-desenhar.
2. useState: O Motor de Mudança 🚀
- cont: O valor atual.
- setCont: A função que atualiza.
- 0: O ponto de partida.
3. Eventos no React ⚡
onClick={funcao}onChange={(e) => ...}- Sempre em CamelCase!
4. Inputs Controlados ⌨️
- O React é quem manda no valor do input.
value={estado}+onChange.- Facilita validação e limpeza de campos.
5. Imutabilidade (Muito Importante!) 💎
- Nunca altere o estado original:
lista.push(x)❌ - Sempre crie uma cópia nova:
setLista([...lista, x])✅
6. Fluxo de Dados 🌊
- O estado flui do Pai para o Filho via Props.
- Se o estado do Pai muda, todo mundo abaixo dele atualiza.
Desafio de Estado ⚡
Se eu tenho um botão que soma +1 ao contador, o que acontece com a interface se eu esquecer de importar o useState e usar uma variável global let contador = 0?
Resumo ✅
useStatetraz vida aos componentes.- Mudança de estado = Re-renderização.
- Use sempre funções disparadoras (
set...).
Próxima Aula: Efeitos e APIs 🌐
Buscando dados no mundo real!
- Hook:
useEffect. - Consumindo nossa API Backend.
Dúvidas? 🎣
Aula 14 - Efeitos e APIs 🌐
Conectando seu App ao Mundo Real
Agenda 📅
- O que são Side Effects?
- Hook
useEffect - O Array de Dependências
- Buscando dados com
fetch - Estados de Carregamento e Erro
1. Além da Interface 🧪
- Efeitos colaterais são ações que tocam o mundo externo ao componente.
- Ex: Buscar usuários, mudar o título da aba, iniciar um cronômetro.
2. useState vs useEffect 🥊
- useState: Para dados que o usuário vê mudando.
- useEffect: Para ações que o componente faz "sozinho".
3. Os 3 Momentos do useEffect 🕒
- Montagem: Quando o componente nasce.
- Atualização: Quando um dado monitorado muda.
- Desmontagem: Quando o componente morre (Cleanup).
4. O Array de Dependências [] 🗃️
[]-> Roda só uma vez.[cont]-> Roda sempre quecontmudar.Sem array-> Roda em toda atualização (Perigo!).
5. Chamadas de API (Fetch) 📨
useEffect(() => {
fetch("https://api...")
.then(res => res.json())
.then(data => setData(data));
}, []);
6. UX: Estados de Rede 🛡️
- Loading: Mostre um Spinner enquanto espera.
- Error: Avise se a internet caiu ou o usuário não existe.
- Empty: Diga se não há resultados.
Desafio de Efeito ⚡
Se você colocar um alert("Olá") dentro de um useEffect sem o array [], quantas vezes o alerta vai aparecer se o usuário ficar digitando em um campo de texto que atualiza o estado?
Resumo ✅
useEffectorganiza as ações assíncronas.- Controle quando rodar via array de dependências.
- Trate sempre o carregamento e erros para uma boa UX.
Próxima Aula: Navegação 🚦
Multi-páginas com React Router!
/home,/perfil,/contato.- Links e Navegação Programática.
Dúvidas? 🌐
Aula 15 - React Router 🚦
Criando Apps Multi-Página
Agenda 📅
- O que são SPAs?
- Multi-páginas (Simuladas)
- Componentes de Rota
- Navegação (
LinkeuseNavigate) - Parâmetros dinâmicos (
:id)
1. O Mundo do SPA ⚛️
- O site é uma única página HTML.
- O Javascript "troca" a tela sem recarregar.
- UX rápida e fluida.
2. React Router Dom ⚙️
- A biblioteca padrão para web.
- Permite que a URL combine com o que aparece na tela.
3. A Estrutura Básica 🏗️
- BrowserRouter: O container principal.
- Routes: O seletor de rotas.
- Route: Define o caminho (
path) e o componente (element).
4. Navegando sem Recarregar! 🏃♂️
- Use
<Link to="/contato"> - NUNCA use
<a href="...">para rotas internas.
5. Navegação Programática 🚀
- Ideal para redirecionar após ações (Login, Clique em Card).
6. Rotas Dinâmicas (URL Params) 🆔
path="/perfil/:username"- Hook
useParams()captura o valor. - Uma única página que se adapta a mil perfis.
7. Página 404 (Not Found) 👻
path="*"- Garante que o usuário nunca caia em uma tela em branco.
Desafio de Roteamento ⚡
Se eu digitar www.meusite.com/asdfg e não tiver uma rota configurada para isso, o que o usuário vai ver se eu NÃO colocar uma rota com o path="*"?
Resumo ✅
- Roteamento traz a sensação de um site real.
- Hooks
useNavigateeuseParamssão essenciais. - SPAs são o padrão da indústria moderna.
Próxima Aula: O Grande Final 🏆
Projeto Integrado: Backend + Frontend!
- Conectando nossa API Node ao site React.
- O Projeto Final do Curso!
Dúvidas? 🚦
Aula 16 - Projeto Final e Conclusão �
De aluno a Desenvolvedor Full-Stack
Agenda 📅
- O Desafio Final 🔗
- Requisitos Técnicos
- Portfólio no GitHub
- Onde continuar estudando?
- Mensagem de Encerramento
1. O Desafio Final 🚀
Você deve entregar um projeto integrado contendo: - Frontend: SPA em React com rotas. - Backend: API segura em Node.js. - Integração: Conexão real entre os dois. - Design: CSS moderno e responsivo.
2. Sugestões de Temas 💡
- Gerenciador de Tarefas �
- Mini E-commerce 🛒
- Rede Social Simplificada 💬
- Dashboard de Monitoramento 📊
3. O README de Elite ✨
- Prints ou Vídeos do site funcionando.
- Lista detalhada de tecnologias.
- Guia: "Como rodar o Projeto".
4. Onde ir agora? 📚
- TypeScript: Segurança de tipos.
- Bancos SQL: Postgres e MySQL.
- Next.js: O rei do mercado React.
- Docker: Infraestrutura moderna.
5. Soft Skills 🤝
- Não é só saber programar!
- Trabalho em equipe.
- Resolução de problemas reais.
6. O Mercado Full-Stack 📈
- Demanda altíssima por devs completos.
- Salários excelentes.
- Dashboards e Sistemas Web movem o mundo!
7. Mensagem Final 🌟
"Programar é a arte de criar soluções onde antes só havia problemas."
- Você construiu a base sólida.
- O código é sua ferramenta de transformação.
Parabéns pela Jornada! 🎓🚀
Vá e construa o futuro da Web.
Dúvidas Finais? 🤔
Configuração
Ambientes de Desenvolvimento 🛠️
Guias para configurar seu computador para o desenvolvimento mobile.
-
Android --- Instalação do Android Studio, SDK e emuladores.
-
iOS (Opcional/Referência) --- Configuração básica de Xcode e ferramentas Mac.
-
Ferramentas de Apoio --- Git, Terminais e Postman/Insomnia para testes de API.
Guia de Instalação: Compilador C (GCC/MinGW) 🛠️
Para programar em C, precisamos de um Compilador. Ele é o tradutor que transforma seu código em um programa que o computador entende.
🪟 No Windows (MinGW-w64)
Recomendamos o uso do MSYS2 para instalar o MinGW, que é a versão mais moderna do GCC para Windows.
- Download: Acesse msys2.org e baixe o instalador.
- Instalação: Siga os passos do instalador padrão.
- Terminal MSYS2: Após instalar, abra o terminal "MSYS2 UCRT64" e digite:
- Variáveis de Ambiente:
- Adicione o caminho
C:\msys64\ucrt64\binao seu PATH do sistema.
- Adicione o caminho
- Verificação: Abra um novo terminal (CMD ou PowerShell) e digite:
🐧 No Linux (Ubuntu/Debian)
No Linux, a instalação é muito simples e direta pelo terminal.
- Atualize os repositórios:
- Instale o build-essential:
- Verificação:
🍎 No macOS
No Mac, o compilador vem junto com as ferramentas de linha de comando do Xcode.
- Abra o Terminal e digite:
- Verificação:
[!TIP] Dica: No macOS, o comando
gccmuitas vezes aponta para oclang, que é um compilador compatível e excelente.
Configuração do VS Code para C 💻
O Visual Studio Code é o editor de código mais popular do mundo. Com as extensões certas, ele se torna uma ferramenta poderosa para programar em C.
1. Instalação do VS Code
Se ainda não tem, baixe em: code.visualstudio.com.
2. Extensões Essenciais
Abra o menu de extensões (Ctrl+Shift+X) e instale:
- C/C++ (Microsoft): Oferece IntelliSense (autocompletar) e suporte a depuração (debug).
- Code Runner: Permite rodar o código com apenas um clique ou um atalho (
Ctrl+Alt+N). - C/C++ Compile Run: Alternativa excelente para compilar e rodar no terminal interno automaticamente.
3. Configurando o Code Runner (Opcional)
Para que o Code Runner use o terminal e aceite entradas do teclado (scanf), faça o seguinte:
- Vá em File -> Preferences -> Settings.
- Procure por
Run In Terminal. - Marque a opção
Code-runner: Run In Terminal.
4. Testando sua Configuração
- Crie um novo arquivo chamado
teste.c. - Cole o código do "Hello World":
- Clique no botão de "Play" no canto superior direito ou use o atalho do Code Runner.
[!IMPORTANT] Atenção: O VS Code não vem com um compilador embutido. Você deve ter seguido o primeiro passo do Guia de Instalação do GCC.
Sobre
Sobre o Curso
🎓 Programação em C – Fundamentos ao Projeto Prático
Este curso foi desenhado para jovens e adultos que desejam construir uma base sólida na computação. A linguagem C é a "mãe" das linguagens modernas e o melhor caminho para entender como o computador realmente funciona.
🎯 Objetivos do Curso
-
Lógica de Programação --- Desenvolver o pensamento algorítmico, resolvendo problemas complexos com soluções simples e eficientes.
-
Gestão de Memória --- Entender endereçamento de memória, ponteiros e como os dados são organizados no nível do hardware.
-
Domínio de Terminal --- Aprender a compilar, debugar e executar programas diretamente pelo terminal no Windows e Linux.
-
Engenharia de Software --- Aprender boas práticas de organização, modularização de código e estruturação profissional de projetos.
📚 O Que Você Vai Aprender
Módulo 1 – Fundamentos e Lógica
- Introdução à Linguagem C e História
- Estrutura básica de um programa e compilação
- Variáveis, Tipos de Dados e IO
- Operadores Aritméticos e Lógicos
Módulo 2 – Estruturas de Controle e Dados
- Condicionais (
if,else,switch) - Laços de Repetição (
for,while) - Vetores (Arrays Unidimensionais)
- Strings e Manipulação de Texto
Módulo 3 – Modularização e Memória
- Funções, Parâmetros e Retornos
- Introdução a Ponteiros e Endereços
- Ponteiros e Vetores (Passagem por Referência)
- Estruturas de Dados Personalizadas (
struct)
Módulo 4 – Projeto e Persistência
- Manipulação de Arquivos (Leitura/Escrita)
- Organização Profissional e Makefiles
- Projeto Prático Integrador
- Boas Práticas e Próximos Passos (Sistemas Embarcados/C++)
🛠️ Metodologia
O curso foca na prática constante. Cada aula é acompanhada de exercícios progressivos, um quiz para fixação e um mini-projeto. Ao final, o aluno desenvolve um sistema modularizado completo que demonstra domínio dos fundamentos da linguagem.
Pronto para entender a base da computação? Começar Agora
Roadmap do Projeto: Programação em C 🚀
Este documento rastreia a evolução da migração para o novo curso de C.
✅ Fase 1: Planejamento (Concluído)
- [x] Definição Syllabus (16 Aulas)
- [x] Escolha de Temas (Teal/Amber)
- [x] Estrutura de Diretórios Adaptada
✅ Fase 2: Infraestrutura e Base (Concluído)
- [x] Atualização
mkdocs.ymlepyproject.toml - [x] Configuração CI/CD (GitHub Actions)
- [x] Atualização de
README.mdeindex.md - [x] Atualização de documentos pedagógicos (
plano-ensino.md)
✅ Fase 3: Desenvolvimento de Conteúdo (Concluído)
- [x] Criação das 16 Aulas (Markdown)
- [x] Criação dos 16 Quizzes (10 perguntas/aula)
- [x] Criação dos 16 Exercícios (5 exercícios/aula)
- [x] Criação dos 16 Slides (RevealJS v11 interface)
- [x] Criação dos 16 Mini-projetos práticos
🚀 Fase 4: Validação e Finalização (Em Progresso)
- [/] Build Strict sem erros
- [ ] Validação de Mermaid e MathJax
- [ ] Testes de Navegação e UX
- [ ] Lançamento Oficial
Status Atual: Validação Final ✅ Última Atualização: 21/02/2026
Materiais Complementares 📚
Bem-vindo à seção de materiais complementares do curso de Programação em C. Aqui você encontra recursos adicionais para apoiar seus estudos e aprofundar seu conhecimento técnico.
-
- Acesse os slides interativos em Reveal.js de cada aula.
-
- Lista de 16 conjuntos de exercícios (Básico ao Desafio).
-
- Teste seus conhecimentos com 10 questões por tópico.
-
- Guia para os 16 mini-projetos práticos do curso.
-
- Aprenda a instalar o Compilador (GCC/MinGW) e o VS Code.
-
- Guia de indentação e documentação de código.
Versão para Impressão
Esta página foi gerada automaticamente para impressão.