
Prof. Paulo Rettore
Universidade Federal de Lavras
GAC124 — Introdução aos Algoritmos

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.
Mostre o código, explique as decisões e converse sobre erros, alternativas e prioridades. A mentoria é um espaço de diálogo.
Registre o próximo incremento, divida tarefas e implemente o conceito da aula no contexto do próprio projeto.

08/09 · Primeira mentoria do Projeto
Organizem duplas ou trios, combinem canais de comunicação e definam como as tarefas serão compartilhadas.
Escolham um problema possível de resolver em C++ e escrevam o objetivo da primeira versão em uma frase.
Apresentem verbalmente a ideia, escutem as orientações e saiam com um próximo passo claro para cada integrante.

Transformar a ideia em um plano executável
“Nosso programa ajudará quem a realizar qual tarefa?” Evitem objetivos amplos demais.
Definam pelo menos três opções do menu, como cadastrar, listar e buscar. A primeira versão deve ser pequena e funcional.
Registrem quem ficará responsável por cada parte e combinem como o grupo revisará e integrará o trabalho.

15/09 · Mentoria do Projeto
Uma main() muito grande é difícil de ler, testar e corrigir. Funções menores deixam cada responsabilidade mais clara.
Observe as ações do menu do grupo e transforme cada ação em uma possível função.

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);
}
29/09 · Mentoria do Projeto
Use vetor quando o sistema armazena vários itens do mesmo tipo e a posição pode ser percorrida em sequência.
Use matriz quando o problema tem duas coordenadas importantes.

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";codigos pelo vetor do projeto.
06/10 · Mentoria do Projeto
cin >> não bastaO 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.Identifiquem quais informações textuais aparecem no sistema.
cin → ignore → getline() e teste uma entrada com espaços.
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;
}
cin para o código.ignore antes da linha.getline() para espaços.
20/10 · Mentoria do Projeto
Se a quantidade de registros varia, o vetor pode crescer durante a execução.
Para descartar metade dos dados a cada etapa, o vetor precisa estar ordenado por uma chave.

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);
-1.
A entrega parcial deve mostrar uma primeira versão que compile, execute e demonstre os conceitos já estudados.
O usuário deve conseguir abrir o sistema, escolher opções e perceber mensagens claras.
O programa já deve mostrar a organização que será ampliada nas próximas mentorias.
main().getline() em campos textuais.
Checklist da entrega parcial no Campus Virtual
main().getline() nos campos com espaços.
03/11 · Mentoria do Projeto
A capacidade é o número de posições reservadas. A quantidade é o número de registros usados.
Redimensionar não é apagar o conteúdo. É criar espaço maior e transferir os registros.

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);
delete[] no vetor antigo.
17/11 · Mentoria do Projeto
Insere cada elemento na posição correta da parte que já está ordenada.
Procura o menor elemento da parte restante e o coloca na próxima posiçã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;
}
}
24/11 · Mentoria do Projeto
A ordenação deve apoiar uma função real: listar melhor, localizar dados ou preparar uma busca binária.
Escolhe um pivô e divide o vetor em partes menores. Pode usar recursão e é uma opção eficiente para muitos casos.
Compara elementos por intervalos que diminuem. É uma evolução da ideia de inserção para vetores maiores.
Divide o problema, ordena as partes e intercala os resultados. Representa a estratégia dividir para conquistar.

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);
}
01/12 · Concluir e submeter o Projeto

Antes de enviar a entrega final

08/12 e 10/12 · Avaliação do Projeto
Comece dizendo quem usa o sistema, qual necessidade foi escolhida e qual solução o grupo construiu.
Execute o menu com dados coerentes. Mostre cadastro, listagem, busca, ordenação ou outra função central.
Apresente mensagens claras, arquivos gerados e testes que comprovem o comportamento do programa.

Preparação para a avaliação do projeto
Você consegue explicar o objetivo do sistema, os usuários e as principais decisões do grupo?
Você consegue localizar suas funções e explicar como elas usam condicionais, laços, vetores, strings, arquivos ou ordenação?
Você consegue justificar os testes, reconhecer limitações e sugerir uma melhoria possível?
