C++: Prática: Branching e Loops Abrangente
Última atualização: 2026-08-26
Aulas anteriores cobriram condicionais e loops separadamente, mas em programas reais eles são usados juntos.
Nesta aula, vamos praticar fazer branching e loops trabalharem juntos através de vários exemplos abrangentes.
1. Exemplo 1: Jogo de Adivinhação de Números (Versão Completa)
(1) 1.1 Análise de Requisitos
Vamos construir um jogo de adivinhação de números completo:
- O programa gera aleatoriamente um número de 1-100
- O usuário insere seu palpite
- Se o palpite for muito alto, mostrar "Muito alto"
- Se o palpite for muito baixo, mostrar "Muito baixo"
- Se o palpite estiver correto, parabenizar o usuário e mostrar quantas tentativas foram necessárias
- O usuário pode escolher jogar novamente
▶ Exemplo 1: Jogo de Adivinhação de Números Completo (Dificuldade ⭐⭐)
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
std::srand(static_cast<unsigned int>(std::time(nullptr)));
char playAgain;
do {
int secretNumber = std::rand() % 100 + 1;
int guess;
int attempts = 0;
std::cout << "========== Number Guessing Game ==========\n";
std::cout << "I'm thinking of a number from 1-100, guess it!\n\n";
do {
std::cout << "Enter your guess: ";
std::cin >> guess;
attempts++;
if (guess > secretNumber) {
std::cout << "Too high! Try again.\n";
} else if (guess < secretNumber) {
std::cout << "Too low! Try again.\n";
} else {
std::cout << "\n🎉 Congratulations! You got it!\n";
std::cout << "You guessed " << attempts << " times.\n";
if (attempts <= 5) {
std::cout << "You're amazing!\n";
} else if (attempts <= 10) {
std::cout << "Not bad!\n";
} else {
std::cout << "Keep trying, aim for fewer attempts next time!\n";
}
}
} while (guess != secretNumber);
std::cout << "\nWant to play again? (y/n): ";
std::cin >> playAgain;
std::cout << std::endl;
} while (playAgain == 'y' || playAgain == 'Y');
std::cout << "Thanks for playing, goodbye!" << std::endl;
return 0;
}
Saída:
========== Number Guessing Game ==========
I'm thinking of a number from 1-100, guess it!
Enter your guess:
Too high! Try again.
Too low! Try again.
🎉 Congratulations! You got it!
You guessed times.
You're amazing!
Not bad!
Keep trying, aim for fewer attempts next time!
Want to play again? (y/n):
Thanks for playing, goodbye!
Execução de exemplo:
========== Number Guessing Game ==========
I'm thinking of a number from 1-100, guess it!
Enter your guess: 50
Too high! Try again.
Enter your guess: 25
Too low! Try again.
Enter your guess: 37
Too high! Try again.
Enter your guess: 31
🎉 Congratulations! You got it!
You guessed 4 times.
You're amazing!
Want to play again? (y/n): n
Thanks for playing, goodbye!
Análise do código:
do-whileexterno: Controla "jogar novamente"do-whileinterno: Loop principal de adivinhaçãoif-else if-else: Verifica se o palpite é muito alto/muito baixo/corretoif-elseaninhado: Avalia desempenho com base no número de tentativas
2. Exemplo 2: Agenda Simples
(1) 2.1 Análise de Requisitos
Construir um programa de agenda simples:
- Exibir um menu (adicionar contato, mostrar contatos, sair)
- Usuário seleciona uma operação
- Usar um loop para permitir operações contínuas até o usuário escolher sair
▶ Exemplo 2: Agenda Simples (Dificuldade ⭐⭐⭐)
#include <iostream>
#include <string>
int main() {
const int MAX_CONTACTS = 100;
std::string names[MAX_CONTACTS];
std::string phones[MAX_CONTACTS];
int count = 0;
int choice;
do {
// Exibir menu
std::cout << "========== Simple Address Book ==========\n";
std::cout << "1. Add contact\n";
std::cout << "2. Show all contacts\n";
std::cout << "3. Exit\n";
std::cout << "Choose (1-3): ";
std::cin >> choice;
if (choice == 1) {
// Adicionar contato
if (count >= MAX_CONTACTS) {
std::cout << "Address book is full!" << std::endl;
} else {
std::cout << "Enter name: ";
std::cin.ignore(); // Descartar newline
std::getline(std::cin, names[count]);
std::cout << "Enter phone: ";
std::getline(std::cin, phones[count]);
count++;
std::cout << "Added successfully!" << std::endl;
}
} else if (choice == 2) {
// Mostrar contatos
if (count == 0) {
std::cout << "Address book is empty!" << std::endl;
} else {
std::cout << "\n========== Contact List ==========\n";
for (int i = 0; i < count; i++) {
std::cout << i + 1 << ". " << names[i] << " - " << phones[i] << std::endl;
}
std::cout << "================================\n\n";
}
} else if (choice == 3) {
std::cout << "Goodbye!" << std::endl;
} else {
std::cout << "Error: Please enter a number between 1-3!" << std::endl;
}
std::cout << std::endl;
} while (choice != 3);
return 0;
}
Saída:
========== Simple Address Book ==========
1. Add contact
2. Show all contacts
3. Exit
Choose (1-3):
Address book is full!
Enter name:
Enter phone:
Added successfully!
Address book is empty!
========== Contact List ==========
. -
================================
Goodbye!
Error: Please enter a number between 1-3!
💡 Dica: Este programa usa arrays (cobertos em detalhes na aula 09). Você pode copiá-lo por enquanto e entender a abordagem geral.
3. Exemplo 3: Calculadora Simples (Versão Estendida)
(1) 3.1 Análise de Requisitos
Construir uma calculadora que suporte múltiplos cálculos:
- Exibir um menu (adição, subtração, multiplicação, divisão, sair)
- Usuário seleciona uma operação
- Inserir dois números, exibir o resultado
- Usar um loop para permitir cálculos contínuos
▶ Exemplo 3: Calculadora Estendida (Dificuldade ⭐⭐)
#include <iostream>
#include <iomanip>
int main() {
int choice;
do {
// Exibir menu
std::cout << "========== Simple Calculator ==========\n";
std::cout << "1. Addition\n";
std::cout << "2. Subtraction\n";
std::cout << "3. Multiplication\n";
std::cout << "4. Division\n";
std::cout << "5. Exit\n";
std::cout << "Choose (1-5): ";
std::cin >> choice;
if (choice >= 1 && choice <= 4) {
double num1, num2;
std::cout << "Enter the first number: ";
std::cin >> num1;
std::cout << "Enter the second number: ";
std::cin >> num2;
double result;
bool valid = true;
switch (choice) {
case 1:
result = num1 + num2;
break;
case 2:
result = num1 - num2;
break;
case 3:
result = num1 * num2;
break;
case 4:
if (num2 != 0) {
result = num1 / num2;
} else {
std::cout << "Error: Divisor cannot be 0!" << std::endl;
valid = false;
}
break;
}
if (valid) {
std::cout << std::fixed << std::setprecision(2);
std::cout << "Result: " << result << std::endl;
}
} else if (choice == 5) {
std::cout << "Goodbye!" << std::endl;
} else {
std::cout << "Error: Please enter a number between 1-5!" << std::endl;
}
std::cout << std::endl;
} while (choice != 5);
return 0;
}
Saída:
========== Simple Calculator ==========
1. Addition
2. Subtraction
3. Multiplication
4. Division
5. Exit
Choose (1-5):
Enter the first number:
Enter the second number:
Error: Divisor cannot be 0!
Result:
Goodbye!
Error: Please enter a number between 1-5!
4. Erros Comuns e Depuração
(1) 4.1 Loops Infinitos
Exemplo de erro:
int i = 1;
while (i <= 10) {
std::cout << i << " ";
// ❌ Esqueceu i++, i é sempre 1, loop nunca termina
}
Dica de depuração: Adicione saída dentro do loop para verificar o valor da variável do loop:
int i = 1;
while (i <= 10) {
std::cout << "[DEBUG] i = " << i << std::endl;
std::cout << i << " ";
i++; // ✅ Lembre-se de atualizar a variável do loop
}
(2) 4.2 Condição de Loop Errada
Exemplo de erro:
// ❌ Quer exibir 1-10, mas a condição é i < 10, só exibe 1-9
for (int i = 1; i < 10; i++) {
std::cout << i << " ";
}
Dica de depuração: Antes do loop começar, exiba o valor inicial da variável e a condição:
int i = 1;
std::cout << "[DEBUG] Initial value i = " << i << ", condition i <= 10" << std::endl;
while (i <= 10) {
std::cout << i << " ";
i++;
}
5. Exercício Prático: Simulador de ATM
▶ Exemplo 4: Simulador de ATM Simples (Dificuldade ⭐⭐⭐)
#include <iostream>
#include <iomanip>
int main() {
double balance = 1000.00; // Saldo inicial
int choice;
do {
// Exibir menu
std::cout << "========== ATM Simulator ==========\n";
std::cout << "1. Check balance\n";
std::cout << "2. Deposit\n";
std::cout << "3. Withdraw\n";
std::cout << "4. Exit\n";
std::cout << "Choose (1-4): ";
std::cin >> choice;
if (choice == 1) {
// Verificar saldo
std::cout << std::fixed << std::setprecision(2);
std::cout << "Current balance: " << balance << std::endl;
} else if (choice == 2) {
// Depositar
double amount;
std::cout << "Enter deposit amount: ";
std::cin >> amount;
if (amount > 0) {
balance += amount;
std::cout << "Deposit successful!" << std::endl;
} else {
std::cout << "Error: Deposit amount must be greater than 0!" << std::endl;
}
} else if (choice == 3) {
// Sacar
double amount;
std::cout << "Enter withdrawal amount: ";
std::cin >> amount;
if (amount > 0 && amount <= balance) {
balance -= amount;
std::cout << "Withdrawal successful!" << std::endl;
} else if (amount <= 0) {
std::cout << "Error: Withdrawal amount must be greater than 0!" << std::endl;
} else {
std::cout << "Error: Insufficient balance!" << std::endl;
}
} else if (choice == 4) {
std::cout << "Thank you for using, goodbye!" << std::endl;
} else {
std::cout << "Error: Please enter a number between 1-4!" << std::endl;
}
std::cout << std::endl;
} while (choice != 4);
return 0;
}
Saída:
========== ATM Simulator ==========
1. Check balance
2. Deposit
3. Withdraw
4. Exit
Choose (1-4):
Current balance:
Enter deposit amount:
Deposit successful!
Error: Deposit amount must be greater than 0!
Enter withdrawal amount:
Withdrawal successful!
Error: Withdrawal amount must be greater than 0!
Error: Insufficient balance!
Thank you for using, goodbye!
Error: Please enter a number between 1-4!
Execução de exemplo:
========== ATM Simulator ==========
1. Check balance
2. Deposit
3. Withdraw
4. Exit
Choose (1-4): 1
Current balance: 1000.00
Choose (1-4): 2
Enter deposit amount: 500
Deposit successful!
Choose (1-4): 1
Current balance: 1500.00
Choose (1-4): 4
Thank you for using, goodbye!
❓ Perguntas Frequentes
P: Quando devo usar for vs while? R: Use
forquando você sabe o número de iterações (ex.: imprimir 100 vezes); usewhilequando não sabe a contagem mas sabe a condição (ex.: adivinhar até acertar); usedo-whilequando o corpo deve executar pelo menos uma vez. P: Como break e continue trabalham juntos em um loop? R:breaksai do loop inteiro,continuepula a iteração atual e vai para a próxima. Podem ser misturados, mas certifique-se de que a lógica esteja clara —breaktermina completamente,continueapenas pula a iteração atual. P: Por que meu programa tem problemas ao ler strings em um loop? R: Isso geralmente é causado por misturarcin >>egetline. Solução: adicionecin.ignore()apóscin >>para descartar o caractere de nova linha.
📖 Resumo
- Programas reais frequentemente misturam branching e loops
do-whilese adapta a cenários "deve executar pelo menos uma vez" (ex.: menus)switch-casese adapta a cenários "escolher um entre muitos" (ex.: seleções de menu)- Ao depurar loops, adicione saída dentro do loop (ex.:
[DEBUG] i = ...) - Tenha cuidado para evitar loops infinitos (lembre-se de atualizar variáveis de loop)
📝 Exercícios
-
Básico (Dificuldade ⭐): Escreva um programa que permita ao usuário inserir um inteiro positivo n, depois exiba todos os números pares de 1 a n.
-
Intermediário (Dificuldade ⭐⭐): Escreva um programa que implemente um jogo de "Pedra-Papel-Tesoura":
- Permita que o usuário insira 1 (pedra), 2 (tesoura), 3 (papel)
- O programa gera aleatoriamente uma escolha
- Determine o vencedor e exiba o resultado
- O usuário pode escolher "jogar novamente"
-
Desafio (Dificuldade ⭐⭐⭐): Escreva um programa que implemente um "Sistema Simples de Gerenciamento de Notas de Alunos": 5. Funcionalidades: adicionar alunos (nome, nota), mostrar todos os alunos, calcular média, sair 6. Use um loop de menu para operações contínuas 7. (Opcional) Adicione um recurso de "ordenar por nota"
- Programas reais misturam branching e loops
- do-while se adapta a cenários que executam pelo menos uma vez (ex.: menus)
- switch-case se adapta a cenários de escolher-um-entre-muitos
- Em loops aninhados, break só sai do nível atual
- Ao depurar loops, use cout para exibir valores de variáveis e rastrear a execução
6. 🚀 Próximos Passos
Parabéns! Você completou todas as aulas da Fase 1 (Básico). A seguir, entramos na Fase 2 (Funções), aprendendo como encapsular código em módulos reutilizáveis para programas mais organizados e maintaináveis!