UFLA

🎓 Mentorias do Projeto Prático

Acompanhamento semanal do desenvolvimento em C++

Prof. Paulo Rettore

Universidade Federal de Lavras

GAC124 — Introdução aos Algoritmos

UFLA

🧭 Como usar este guia

1. Antes da mentoria

Compile o projeto, teste o que já existe e anote dúvidas concretas. Cada grupo deve trazer uma versão executável ou um avanço verificável.

2. Durante a conversa

Mostre o código, explique as decisões e converse sobre erros, alternativas e prioridades. A mentoria é um espaço de diálogo.

3. Depois do encontro

Registre o próximo incremento, divida tarefas e implemente o conceito da aula no contexto do próprio projeto.

Regra de trabalho: conceitos anteriores podem ser reutilizados, combinados ou modificados quando isso melhorar a solução do grupo. Professores e alunos também podem usar o encontro para resolver dúvidas.
UFLA

🚀 Semana 5 — Começar com direção

08/09 · Primeira mentoria do Projeto

👥 Formar a equipe

Organizem duplas ou trios, combinem canais de comunicação e definam como as tarefas serão compartilhadas.

🎯 Definir tema e escopo

Escolham um problema possível de resolver em C++ e escrevam o objetivo da primeira versão em uma frase.

💬 Conversar e registrar

Apresentem verbalmente a ideia, escutem as orientações e saiam com um próximo passo claro para cada integrante.

Presença: está condicionada à entrega, no Campus Virtual, das implementações realizadas em sala de aula. Consulte o ambiente para formato e prazo oficial.
UFLA

📝 Semana 5 — Primeiro incremento

Transformar a ideia em um plano executável

1. Problema em uma frase

“Nosso programa ajudará quem a realizar qual tarefa?” Evitem objetivos amplos demais.

2. Três ações iniciais

Definam pelo menos três opções do menu, como cadastrar, listar e buscar. A primeira versão deve ser pequena e funcional.

3. Divisão de responsabilidades

Registrem quem ficará responsável por cada parte e combinem como o grupo revisará e integrará o trabalho.

Saída da mentoria: uma descrição curta do problema, um esboço do menu e as tarefas iniciais registradas no Campus Virtual. Na próxima mentoria, essas ações serão transformadas em funções.
UFLA

🧩 Semana 6 — Modularizar para crescer

15/09 · Mentoria do Projeto

Por que dividir o programa?

Uma main() muito grande é difícil de ler, testar e corrigir. Funções menores deixam cada responsabilidade mais clara.

  • Facilitam a manutenção.
  • Permitem testar uma tarefa isoladamente.
  • Evita repetir o mesmo trecho de código.

Quais tarefas separar?

Observe as ações do menu do grupo e transforme cada ação em uma possível função.

  • Cadastrar e validar dados.
  • Listar ou buscar registros.
  • Salvar e ler arquivos.
  • Calcular, ordenar ou exibir relatórios.
Roteiro: no slide seguinte, veja como um menu pode chamar funções específicas. Adapte os nomes e parâmetros ao tema do próprio grupo.
UFLA

💻 Semana 6 — Modularização em C++

Exemplo: dividir o menu em funções

Cada opção do menu pode chamar uma função específica do projeto.

void mostrarMenu() { cout << "1 - Cadastrar\n2 - Listar\n0 - Sair\n"; }
void cadastrarProduto() { /* ler e validar */ }
void listarProdutos() { /* percorrer e exibir */ }
int main() {
    int opcao;
    do { mostrarMenu(); cin >> opcao;
        if (opcao == 1) cadastrarProduto();
        else if (opcao == 2) listarProdutos();
    } while (opcao != 0);
}
Adapte:
troque as funções pelas ações do projeto.
Conecte:
chame uma função em cada opção.
Teste:
valide cada ação antes de integrar.
UFLA

📚 Semana 8 — Organizar dados

29/09 · Mentoria do Projeto

🧺 Vetor: uma coleção linear

Use vetor quando o sistema armazena vários itens do mesmo tipo e a posição pode ser percorrida em sequência.

  • Produtos ou alunos.
  • Filmes ou tarefas.
  • Registros do mesmo formato.

🔲 Matriz: duas dimensões

Use matriz quando o problema tem duas coordenadas importantes.

  • Assentos por fila e coluna.
  • Notas por aluno e atividade.
  • Horários por dia e período.
Decisão do grupo: qual estrutura representa melhor os dados do projeto? No slide seguinte, a busca em vetor será conectada a uma opção real do menu.
UFLA

🔎 Semana 8 — Vetor em uma operação real

Exemplo: localizar um código antes de mostrar ou alterar um registro

A função retorna a posição encontrada. O valor -1 indica que o item não está no vetor.

int buscarCodigo(const int codigos[], int total, int procurado) {
    for (int i = 0; i < total; i++) {
        if (codigos[i] == procurado) return i;
    }
    return -1;
}

// Uso:
int pos = buscarCodigo(codigos, quantidade, codigoDigitado);
if (pos == -1) cout << "Código não encontrado.\n";
else cout << "Registro na posição " << pos << "\n";
Adapte:
troque codigos pelo vetor do projeto.
Conecte:
chame a função em uma opção do menu.
Teste:
use um valor existente e outro inexistente.
UFLA

🧾 Semana 9 — Tratar strings corretamente

06/10 · Mentoria do Projeto

📏 Quando cin >> não basta

O operador de entrada interrompe a leitura no primeiro espaço. Isso é adequado para códigos e palavras simples, mas não para nomes completos ou descrições.

  • string nome pode conter espaços.
  • getline() lê a linha inteira.
  • Depois de ler um número, o buffer precisa ser limpo.

🧩 Campos do projeto

Identifiquem quais informações textuais aparecem no sistema.

  • Nome completo do usuário.
  • Título ou descrição do item.
  • Endereço, categoria ou observação.
  • Mensagens de busca e confirmação.
Próximo passo: no slide seguinte, observe a sequência cinignoregetline() e teste uma entrada com espaços.
UFLA

🧾 Semana 9 — Strings passo a passo

Exemplo: ler um campo de texto completo

A sequência abaixo evita que o \n deixado pelo cin seja lido como uma linha vazia.

#include <iostream>
#include <string>
#include <limits>
using namespace std;

int main() {
    int codigo; string nome;

    cout << "Código: "; cin >> codigo;
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    cout << "Nome completo: "; getline(cin, nome);
    cout << "Item " << codigo << ": " << nome << '\n';

    return 0;
}
1. Leia:
use cin para o código.
2. Limpe:
use ignore antes da linha.
3. Capture:
use getline() para espaços.
UFLA

🔎 Semana 10 — Buscar com eficiência

20/10 · Mentoria do Projeto

📈 Alocação dinâmica

Se a quantidade de registros varia, o vetor pode crescer durante a execução.

  • Guarde a quantidade atual.
  • Guarde a capacidade disponível.
  • Redimensione quando necessário.

🧭 Busca binária

Para descartar metade dos dados a cada etapa, o vetor precisa estar ordenado por uma chave.

  • Compare com o elemento do meio.
  • Escolha esquerda ou direita.
  • Repita com recursão até encontrar ou esgotar o intervalo.
Antes do código: escolham qual campo será usado na busca. O exemplo seguinte usa códigos, mas pode ser adaptado a registros do tema do grupo.
UFLA

🔎 Semana 10 — Busca binária passo a passo

Exemplo: localizar um código em vetor ordenado

Pré-condição: o vetor precisa estar ordenado pela chave escolhida.

int buscaBinaria(const int codigos[], int inicio, int fim, int procurado) {
    if (inicio > fim) return -1;
    int meio = (inicio + fim) / 2;
    if (codigos[meio] == procurado) return meio;
    if (procurado < codigos[meio]) return buscaBinaria(codigos, inicio, meio - 1, procurado);
    return buscaBinaria(codigos, meio + 1, fim, procurado);
}

// pos = buscaBinaria(codigos, 0, quantidade - 1, codigo);
Caso-base
intervalo vazio retorna -1.
Comparação
o meio pode ser a resposta.
Recursão
continue apenas em uma metade.
UFLA

📦 Semana 11 — Entrega parcial

A entrega parcial deve mostrar uma primeira versão que compile, execute e demonstre os conceitos já estudados.

🖥️ Um programa que funciona

O usuário deve conseguir abrir o sistema, escolher opções e perceber mensagens claras.

  • Menu com pelo menos três opções.
  • Entrada pelo teclado.
  • Condicionais e repetições.
  • Fluxos principais testados.

🧩 Código que evolui

O programa já deve mostrar a organização que será ampliada nas próximas mentorias.

  • Funções além da main().
  • Vetor ou vetor de registros.
  • getline() em campos textuais.
  • Arquivos CSV, busca e memória.
Próximo passo: use o slide seguinte como checklist. O Campus Virtual é a referência oficial para prazo, formato e detalhes da submissão.
UFLA

✅ Semana 11 — Revisar antes de enviar

Checklist da entrega parcial no Campus Virtual

🖥️ Operações e estrutura

  • Menu com, no mínimo, 3 opções.
  • Leitura pelo teclado e mensagens claras.
  • Pelo menos 2 funções além da main().
  • Condicionais e estruturas de repetição.
  • Vetor ou vetor de registros para armazenar dados.
  • getline() nos campos com espaços.

📁 Arquivos, busca e integridade

  • Leitura e escrita em arquivo texto no formato CSV.
  • Busca binária recursiva em vetor ordenado.
  • Noções de alocação dinâmica.
  • Compilação e execução sem erros.
  • Teste dos fluxos principais e de entradas inválidas.
  • Arquivos do grupo conferidos antes do envio.
Conferência final: execute o sistema do início ao fim e consulte o Campus Virtual para prazo, formato do ZIP e demais orientações oficiais.
UFLA

📈 Semana 12 — Redimensionar dados

03/11 · Mentoria do Projeto

📊 Quando o vetor ficou pequeno?

A capacidade é o número de posições reservadas. A quantidade é o número de registros usados.

  1. Compare quantidade e capacidade.
  2. Se estiver cheio, reserve espaço novo.
  3. Escolha uma capacidade maior, como o dobro.

🔁 Preserve os dados

Redimensionar não é apagar o conteúdo. É criar espaço maior e transferir os registros.

  1. Crie um vetor maior.
  2. Copie os registros válidos.
  3. Libere o vetor antigo.
  4. Atualize ponteiro e capacidade.
Aplicação: use registros para representar entidades do tema, como produtos, alunos, livros ou tarefas. O slide seguinte mostra a função de crescimento.
UFLA

📈 Semana 12 — Redimensionar sem perder dados

Exemplo: crescer um vetor dinâmico de registros

A função é chamada quando quantidade == capacidade. O vetor maior preserva os registros válidos.

struct Item { int codigo; string nome; };

void redimensionar(Item*& itens, int quantidade, int& capacidade) {
    int novaCapacidade = capacidade * 2;
    Item* maior = new Item[novaCapacidade];
    for (int i = 0; i < quantidade; i++) maior[i] = itens[i];
    delete[] itens; itens = maior; capacidade = novaCapacidade;
}

// Antes de inserir:
if (quantidade == capacidade) redimensionar(itens, quantidade, capacidade);
Preserve:
copie somente os registros válidos.
Libere:
use delete[] no vetor antigo.
Teste:
comece com capacidade pequena.
UFLA

↕️ Semana 14 — Ordenar com métodos básicos

17/11 · Mentoria do Projeto

Insertion sort

Insere cada elemento na posição correta da parte que já está ordenada.

  • Fácil de acompanhar passo a passo.
  • Funciona bem com poucos dados.
  • É interessante quando o vetor já está quase ordenado.

Selection sort

Procura o menor elemento da parte restante e o coloca na próxima posição.

  • Ajuda a visualizar comparações e trocas.
  • Usa um critério claro de seleção.
  • Pode ordenar registros pelo campo escolhido.
No projeto: definam se a ordenação será por código, nome, data, preço ou prioridade. O slide seguinte mostra uma função que pode ser adaptada aos registros do grupo.
UFLA

↕️ Semana 14 — Ordenação básica em função

Exemplo: insertion sort por código

A função organiza o vetor e pode ser adaptada para comparar nome, data, preco ou outro campo do projeto.

void insertionSort(int codigos[], int total) {
    for (int i = 1; i < total; i++) {
        int atual = codigos[i];
        int j = i - 1;
        while (j >= 0 && codigos[j] > atual) {
            codigos[j + 1] = codigos[j];
            j--;
        }
        codigos[j + 1] = atual;
    }
}
Guarde:
preserve o valor atual.
Desloque:
avance os maiores elementos.
Insira:
coloque o valor na posição correta.
UFLA

⚙️ Semana 15 — Ordenar com métodos avançados

24/11 · Mentoria do Projeto

A ordenação deve apoiar uma função real: listar melhor, localizar dados ou preparar uma busca binária.

Quick Sort

Escolhe um pivô e divide o vetor em partes menores. Pode usar recursão e é uma opção eficiente para muitos casos.

Shell Sort

Compara elementos por intervalos que diminuem. É uma evolução da ideia de inserção para vetores maiores.

Merge Sort

Divide o problema, ordena as partes e intercala os resultados. Representa a estratégia dividir para conquistar.

Escolha consciente: compare os métodos pelo tipo e quantidade de dados do projeto. No slide seguinte, acompanhe uma estrutura de Quick Sort e adapte o campo de comparação.
UFLA

⚙️ Semana 15 — Ordenação avançada em função

Exemplo: Quick Sort com pivô e recursão

O exemplo usa inteiros. Em registros, substitua a comparação pelo campo escolhido.

void quickSort(int v[], int l, int r) {
    if (l >= r) return;
    int p = v[(l + r) / 2], i = l, j = r;
    while (i <= j) {
        while (v[i] < p) i++;
        while (v[j] > p) j--;
        if (i <= j) { swap(v[i], v[j]); i++; j--; }
    }
    quickSort(v, l, j);
    quickSort(v, i, r);
}
Pivô:
separa os valores menores e maiores.
Partição:
move os índices até encontrar trocas.
Recursão:
ordena as duas partes restantes.
UFLA

📦 Semana 16 — Entrega final

01/12 · Concluir e submeter o Projeto

🖥️ Programa pronto

  • Compile do início ao fim.
  • Execute as funções principais.
  • Trate entradas inválidas de forma clara.

📁 Pacote organizado

  • Código-fonte completo.
  • Dados de teste, quando necessários.
  • README com integrantes, compilação e uso.

🗣️ Grupo preparado

  • Todos conhecem o sistema.
  • Todos conseguem explicar decisões.
  • O grupo registra o que ainda pode melhorar.
Importante: confira no Campus Virtual o formato oficial da entrega, o nome da atividade e o prazo de submissão.
UFLA

✅ Semana 16 — Conferência do pacote

Antes de enviar a entrega final

📁 Arquivos

  • O código-fonte está completo?
  • Os dados de teste estão incluídos?
  • O README identifica integrantes e compilação?
  • Os arquivos abrem em uma pasta organizada?

🧪 Testes

  • O programa compila sem erros?
  • O menu percorre os fluxos principais?
  • As buscas e ordenações foram verificadas?
  • Cada integrante consegue executar e explicar?
Último passo: compacte somente o que for necessário, abra o pacote em uma pasta limpa e faça uma execução final antes de submeter no Campus Virtual.
UFLA

🖥️ Semana 17 — Demonstrar o projeto

08/12 e 10/12 · Avaliação do Projeto

1. Explique o problema

Comece dizendo quem usa o sistema, qual necessidade foi escolhida e qual solução o grupo construiu.

2. Mostre o fluxo

Execute o menu com dados coerentes. Mostre cadastro, listagem, busca, ordenação ou outra função central.

3. Evidencie o resultado

Apresente mensagens claras, arquivos gerados e testes que comprovem o comportamento do programa.

Dica: ensaiem a demonstração com tempo controlado. Cada integrante deve saber explicar a parte que implementou e como ela se conecta ao todo.
UFLA

🗣️ Semana 17 — Explicar individualmente

Preparação para a avaliação do projeto

🎯 Sobre o problema

Você consegue explicar o objetivo do sistema, os usuários e as principais decisões do grupo?

🧩 Sobre o código

Você consegue localizar suas funções e explicar como elas usam condicionais, laços, vetores, strings, arquivos ou ordenação?

🧪 Sobre as escolhas

Você consegue justificar os testes, reconhecer limitações e sugerir uma melhoria possível?

Responsabilidade individual: dividir tarefas não significa dividir o conhecimento. Cada integrante deve compreender o funcionamento do próprio código e a integração com o sistema completo.
UFLA

🏁 Projeto em evolução

Da ideia à solução que o grupo consegue explicar
1. Entregaruma versão organizada e executável
2. Demonstraro problema, o fluxo e os resultados
3. Explicaras decisões e o próprio código
Continue aprendendo: consulte o Campus Virtual para regras, prazos e materiais oficiais. As mentorias são um espaço de construção, diálogo e resolução de dúvidas.