C Sobre os Projetos
Nas aulas, cada página ensina um assunto. Nos projetos, você junta vários para construir um programa de verdade, do arquivo vazio até a versão final. É aqui que o que você estudou se encaixa: o scanf da aula de entrada conversa com um switch, que chama uma função, que guarda os dados numa struct e grava tudo num arquivo. Esta página explica como os sete projetos do guia estão organizados e como fazê-los.
- Como os sete projetos estão montados (em etapas pequenas, cada uma com um Experimente).
- Que aulas cada projeto pratica e em que ordem fazê-los.
- Como rodar cada etapa: no editor do guia ou no terminal com o
gcc. - Como o editor "digita" a entrada dos programas que leem o teclado.
- O que fazer quando o seu código não bate com o da etapa.
A ideia: construir como um pedreiro, não como um mágico
Ninguém escreve um programa inteiro de uma vez. Um pedreiro não levanta a casa num dia: primeiro a fundação, depois uma parede, confere o prumo, depois a outra. Programar é igual. Cada projeto é dividido em etapas, e cada etapa acrescenta uma coisa nova à anterior. No fim de toda etapa, o programa compila e roda. Você nunca fica com um monte de código "que ainda não funciona".
Toda página de projeto segue o mesmo roteiro:
- O que vamos construir. Uma sessão real do programa pronto, para você ver aonde vai chegar.
- Antes de começar. As aulas que você precisa ter visto (com links) e a pasta do projeto.
- As versões. Cada uma mostra o código novo, explica o que mudou, mostra a compilação e a saída reais (com o gcc 15 na máquina da Ana) e termina com um Experimente em que você faz a etapa.
- Quando dá errado. Os erros que aparecem de verdade naquele projeto, com a mensagem completa e a correção.
- O código completo e os desafios. A versão final, inteira, e ideias para continuar sozinho.
Os sete projetos
Estão em ordem de dificuldade. Os três primeiros usam o Nível 1 e o começo dos arrays, structs e funções; os três do meio leem e gravam arquivos; o último usa memória dinâmica e uma lista ligada.
| Projeto | O que é | Aulas que ele pratica | Faça depois de |
|---|---|---|---|
| Calculadora | Calculadora de terminal: lê dois números e a operação, recusa a divisão por zero e o texto no lugar de número, repete até você sair. | scanf, switch, double, do while, Validar a Entrada, Funções | Nível 1 + Funções |
| Jogo de Adivinhação | O computador sorteia um número de 1 a 100 e você tenta adivinhar, com dicas, contagem de tentativas, "jogar de novo" e recorde. | if/else if, while, ++, Números Aleatórios, Funções, Passar por Ponteiro | Nível 1 + Aleatórios |
| Boletim de Notas | Lê os nomes e as notas da turma num array de structs, calcula a média, acha a maior e a menor nota, conta os aprovados e imprime uma tabela alinhada. | Arrays, for, Structs, scanf, Formatos do printf, Funções | Structs |
| Agenda de Contatos (arquivo) | Adiciona, lista, busca (sem diferenciar maiúsculas) e remove contatos, e guarda tudo num arquivo de texto que sobrevive ao fechar o programa. | Structs, fgets, Funções de String, Passar por Ponteiro, Arquivos, Ler e Escrever Arquivos | Structs e Arquivos |
| Estoque da Lojinha (binário) | Os produtos da lojinha da Ana: entradas e saídas, alerta de estoque baixo, relatório ordenado por valor e um arquivo binário (fread/fwrite). | Structs, Arquivos Binários, fseek, Ordenação (qsort), Funções | Arquivos Binários |
| Contador de Palavras | Lê um arquivo e conta linhas, palavras e caracteres (com acentos!), a palavra mais longa e as mais frequentes, comparando com o wc do Linux. | Ler Arquivos, ctype.h, Acentos e UTF-8, Argumentos da Linha de Comando, Funções | Ler Arquivos e Acentos |
| Lista de Tarefas (lista ligada) | Adiciona, marca como feita e remove tarefas de uma lista que cresce e encolhe na heap, com malloc e free para cada tarefa. | Structs e Ponteiros, malloc e free, Listas Ligadas, Ponteiro para Ponteiro | Listas Ligadas |
A coluna "Faça depois de" é o mínimo. Se alguma etapa usar algo que você ainda não viu, o texto tem o link para a aula. Abra numa aba nova, leia e volte. E não é preciso seguir a ordem da tabela: se você gosta de jogos, comece pela adivinhação.
Onde rodar: duas formas
1. No editor do guia (mais fácil)
Toda etapa tem um Experimente com o código da etapa anterior. Você edita, clica em Rodar e vê os avisos do compilador e a saída. Se travar, o botão de solução mostra a resposta. Veja como o editor funciona em O Editor do Guia.
Quase todos os projetos leem o teclado. Nas missões, o guia já preenche o que "a pessoa digitaria": é a entrada da missão, descrita no enunciado (por exemplo, "a entrada é 10, /, 4"). Há uma diferença em relação ao terminal: lá, o que você digita aparece na tela depois de cada pergunta. No editor, a entrada já vem pronta e aparece no ponto em que o programa a lê, como se você tivesse digitado ali.
Projetos que usam arquivos (Agenda, Estoque, Contador de Palavras) funcionam no editor também: os arquivos de dados (.txt, .csv) entram como abas na caixa e ficam na pasta do programa, que começa limpa a cada Rodar.
Experimente agora. Este programa lê um nome, como os projetos fazem o tempo todo. A entrada Ana já vem preenchida:
Missão: depois de ler o nome, mostre Olá, Ana! Vamos programar. usando a variável nome (não escreva "Ana" no código). Use printf com %s. Se precisar, revise scanf e printf.
#include <stdio.h>
int main(void) {
char nome[50];
printf("Seu nome: ");
if (scanf("%49s", nome) != 1) {
return 1;
}
// escreva aqui a saudação, usando a variável nome
return 0;
}
#include <stdio.h>
int main(void) {
char nome[50];
printf("Seu nome: ");
if (scanf("%49s", nome) != 1) {
return 1;
}
printf("Olá, %s! Vamos programar.\n", nome);
return 0;
}
Repare no %49s: lê o nome com limite, nunca estourando o array (veja Segurança). Esse cuidado vai aparecer em todos os projetos.
2. No terminal do seu computador (o jeito "de verdade")
Para guardar o seu trabalho, crie uma pasta para cada projeto dentro de ~/c, escreva o arquivo num editor (Editores e IDEs mostra as opções) e compile com o comando padrão do guia (veja Compilar com gcc). Esta é a máquina da Ana fazendo a primeira etapa da calculadora:
$ mkdir -p c/calculadora « cria a pasta do projeto (e a c, se não existir) $ cd c/calculadora $ ls « vazia, por enquanto $ ls « a Ana escreveu o arquivo no editor calculadora.c $ gcc -std=c23 -Wall -Wextra calculadora.c -o calculadora $ ls calculadora calculadora.c « o gcc criou o programa "calculadora" $ ./calculadora === Calculadora da Ana === Primeiro número: 7 « 7 e 3 foram digitados pela Ana Segundo número: 3 7 + 3 = 10
- gcc -std=c23 -Wall -Wextra
- Compila em C23, com os avisos ligados (veja Avisos). É o comando padrão do guia, do começo ao fim.
- calculadora.c
- O código-fonte.
- -o calculadora
- O nome do programa a criar (
-ode output, "saída"). - ./calculadora
- Roda o programa que está nesta pasta (
./= "aqui").
Toda vez que mudar o código, compile de novo antes de rodar: o programa calculadora é uma "foto" do código no momento da compilação. Para não esquecer, junte os dois comandos com && ("e, se deu certo, então"): gcc -std=c23 -Wall -Wextra calculadora.c -o calculadora && ./calculadora.
Os projetos de arquivo gravam no seu disco: a Agenda cria um agenda.txt, o Estoque um arquivo binário, e o Contador de Palavras lê um arquivo que você passa como argumento. Projetos maiores costumam usar Makefile para automatizar a compilação.
| Forma | Como | Quando usar |
|---|---|---|
| Editor do guia | botão Rodar | Para fazer as etapas rapidamente, em qualquer computador ou celular. A entrada vem pronta. |
| Terminal | gcc -std=c23 -Wall -Wextra arquivo.c -o programa e ./programa | Para guardar o projeto, digitar a entrada de verdade e usar arquivos que ficam no seu disco (agenda, estoque, texto). |
Como estudar um projeto
- Leia a etapa inteira antes de digitar. Entenda o que muda e por quê.
- Digite o código, não copie e cole. Parece mais lento, mas é digitando que você erra, lê a mensagem do compilador e aprende a consertar. Os erros mais comuns estão em Erros Comuns.
- Compile com os avisos ligados e rode depois de cada etapa. Compare com a saída mostrada. Se for diferente, procure a diferença antes de seguir.
- Mude alguma coisa. Troque uma mensagem, um número, uma condição. Rode de novo. Prever o que vai acontecer e conferir é o melhor exercício que existe.
- Só então vá para a próxima etapa. No fim, tente os desafios sem olhar a solução.
Quase sempre é um destes: um ; esquecido, uma chave } a mais ou a menos, um #include que faltou, aspas duplas onde deviam ser simples ("+" em vez de '+'), ou o programa antigo rodando porque você não compilou de novo. Leia a primeira linha com error: ela diz o arquivo, a linha e a coluna (calculadora.c:12:5: error: …). Veja como ler essas mensagens em Lendo Erros do Compilador. E não ignore os warning: em vários projetos, o aviso é a única pista de um erro de lógica (veja Boas Práticas).
Um laço que lê do teclado e não confere se a leitura deu certo vira um laço infinito quando alguém digita texto no lugar de número (o scanf não consome o texto e tenta de novo). Aperte Ctrl+C para parar o programa, e confira o retorno do scanf (veja Validar a Entrada).
Missão: o esqueleto de todo menu
A calculadora, a agenda, o estoque e a lista de tarefas têm a mesma estrutura: um menu que se repete até a pessoa escolher sair. Monte esse esqueleto agora, e você vai reconhecê-lo em todos eles.
Missão: o menu funciona, mas só uma vez. Coloque o trecho que mostra o menu, lê a opção e executa o switch dentro de um while (opcao != 0). A entrada escolhe 1, 2, 7 (inválida) e 0. Veja while e switch se precisar.
#include <stdio.h>
int main(void) {
int opcao = -1;
printf("\n1. Dizer oi 2. Dizer tchau 0. Sair\n");
printf("Opção: ");
if (scanf("%d", &opcao) != 1) {
opcao = 0; // a entrada acabou ou não era número: sai
}
switch (opcao) {
case 1: printf("Oi!\n"); break;
case 2: printf("Tchau!\n"); break;
case 0: break;
default: printf("Opção inválida.\n");
}
printf("Fim do programa.\n");
return 0;
}
#include <stdio.h>
int main(void) {
int opcao = -1;
while (opcao != 0) {
printf("\n1. Dizer oi 2. Dizer tchau 0. Sair\n");
printf("Opção: ");
if (scanf("%d", &opcao) != 1) {
opcao = 0; // a entrada acabou ou não era número: sai
}
switch (opcao) {
case 1: printf("Oi!\n"); break;
case 2: printf("Tchau!\n"); break;
case 0: break;
default: printf("Opção inválida.\n");
}
}
printf("Fim do programa.\n");
return 0;
}
No terminal da Ana, a solução fica assim:
$ gcc -std=c23 -Wall -Wextra menu.c -o menu $ ./menu 1. Dizer oi 2. Dizer tchau 0. Sair Opção: 1 Oi! 1. Dizer oi 2. Dizer tchau 0. Sair Opção: 2 Tchau! 1. Dizer oi 2. Dizer tchau 0. Sair Opção: 7 Opção inválida. 1. Dizer oi 2. Dizer tchau 0. Sair Opção: 0 Fim do programa.
Exercícios
1. A Ana terminou uma etapa, mas o programa não compila. O que ela deve fazer?
2. Qual projeto pratica listas ligadas, malloc e free?
3. A Ana mudou o código, rodou ./agenda e nada mudou. Qual a causa mais provável?
4. Qual é o primeiro projeto recomendado para quem acabou o Nível 1?
5. Complete o comando que compila agenda.c no padrão do guia e, se deu certo, roda o programa:
Resumo
- Cada projeto é construído em etapas; no fim de cada etapa, o programa compila e roda.
- Sete projetos, em ordem de dificuldade: Calculadora, Adivinhação, Boletim de Notas, Agenda, Estoque, Contador de Palavras e Lista de Tarefas.
- No editor do guia, a entrada da missão vem pronta e aparece no ponto em que o programa a lê; no terminal, você digita.
- No terminal:
gcc -std=c23 -Wall -Wextra arquivo.c -o programa && ./programa, e compile de novo a cada mudança. - Leia a etapa, digite, compile, compare a saída, mude algo, e só então siga.
Comece pelo primeiro: Calculadora.