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.

Você vai aprender
  • 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:

  1. O que vamos construir. Uma sessão real do programa pronto, para você ver aonde vai chegar.
  2. Antes de começar. As aulas que você precisa ter visto (com links) e a pasta do projeto.
  3. 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.
  4. Quando dá errado. Os erros que aparecem de verdade naquele projeto, com a mensagem completa e a correção.
  5. 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.

ProjetoO que éAulas que ele praticaFaça depois de
CalculadoraCalculadora 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çõesNível 1 + Funções
Jogo de AdivinhaçãoO 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 PonteiroNível 1 + Aleatórios
Boletim de NotasLê 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çõesStructs
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 ArquivosStructs 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çõesArquivos Binários
Contador de PalavrasLê 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çõesLer 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 PonteiroListas Ligadas
Não precisa ter terminado o nível inteiro

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 (-o de 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.

FormaComoQuando usar
Editor do guiabotão RodarPara fazer as etapas rapidamente, em qualquer computador ou celular. A entrada vem pronta.
Terminalgcc -std=c23 -Wall -Wextra arquivo.c -o programa e ./programaPara guardar o projeto, digitar a entrada de verdade e usar arquivos que ficam no seu disco (agenda, estoque, texto).

Como estudar um projeto

  1. Leia a etapa inteira antes de digitar. Entenda o que muda e por quê.
  2. 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.
  3. 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.
  4. 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.
  5. Só então vá para a próxima etapa. No fim, tente os desafios sem olhar a solução.
"O meu não funciona e o da página funciona"

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).

O programa ficou repetindo a mesma linha sem parar

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:

gcc -std=c23 -Wall -Wextra agenda.c -o agenda

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.