Laços de Repetição em PHP: Resolvendo o Exercício de Crescimento Populacional

🎯 O que você vai aprender neste exercício:

  • Como usar formulários HTML para enviar dados dinâmicos via GET.
  • A aplicação prática de um Laço de Repetição (While) em cálculos matemáticos contínuos.
  • Prevenção de Bugs: Como validar dados para impedir que seu servidor trave com um Loop Infinito.

Fala, dev! Se você está estudando programação, com certeza já esbarrou em algum desafio de matemática aplicada. Hoje, vamos resolver o famoso Exercício 05 da nossa lista de Laços de Repetição.

A premissa é simples: temos duas cidades (A e B). A cidade A tem uma população menor, mas cresce mais rápido que a cidade B. O usuário vai informar a população e a taxa de crescimento de ambas. Nosso script em PHP precisa calcular em quantos anos a cidade A vai ultrapassar ou igualar a cidade B.

O que são Laços de Repetição no PHP?

Laços de repetição (como while, do...while e for) são estruturas no PHP que permitem executar um bloco de código repetidas vezes enquanto uma condição específica for verdadeira. Neste exercício, o código continuará calculando a nova população ano a ano "enquanto" (while) a população de A for menor que a de B.

Para entender profundamente a teoria antes da prática, recomendo revisar nossa aula sobre LAÇO WHILE E DO-WHILE.

A Lógica do Algoritmo (Evitando desastres)

Antes de sair digitando código, vamos pensar como um Desenvolvedor Sênior. O cálculo base para o fim do primeiro ano é:

  • $A = $A * (1 + $taxa_A_decimal);
  • $B = $B * (1 + $taxa_B_decimal);

Lembrando que o usuário digita a taxa em porcentagem (ex: 3%), então precisamos dividir esse valor por 100 para obter o decimal (0.03) antes de somar.

⚠️ Atenção ao Loop Infinito: Se o usuário disser que a Cidade A cresce a 1% e a Cidade B cresce a 5%, a cidade A nunca vai alcançar a B. Se não validarmos isso, o PHP vai rodar o laço para sempre até derrubar o seu servidor. Nós adicionamos uma trava de segurança no código moderno abaixo para evitar isso!

Apostila Completa PHP Progressivo

Chega de travar na hora de criar a lógica! 🧠

O segredo dos grandes programadores não é decorar comandos, é resolver problemas. Nossa Apostila PHP Progressivo contém dezenas de listas de exercícios resolvidos e explicados passo a passo, exatamente como este. Estude offline, no seu tempo, e construa uma base sólida de lógica.

Baixar a Apostila em PDF agora 📥

O Código Completo (Padrão PHP 8.x)

Abaixo temos a solução atualizada. Diferente de tutoriais antigos, aqui usamos o operador de coalescência nula (??) para capturar os dados do formulário com segurança, sem gerar avisos (warnings) na tela.


<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Cálculo Populacional - Programação Progressiva</title>
</head>
<body>

<h3>Calculadora de Crescimento Populacional</h3>
<form action="" method="get" style="margin-bottom: 20px;">
    <label>População da cidade A:</label><br>
    <input type="number" name="A" required /><br><br>
    
    <label>População da cidade B:</label><br>
    <input type="number" name="B" required /><br><br>
    
    <label>Taxa de crescimento da cidade A (em %):</label><br>
    <input type="number" step="0.01" name="tA" required /><br><br>
    
    <label>Taxa de crescimento da cidade B (em %):</label><br>
    <input type="number" step="0.01" name="tB" required /><br><br>
    
    <input type="submit" value="Calcular" style="padding: 8px 15px; cursor: pointer;" />
</form>

<?php
// Captura os dados com segurança (PHP 7+)
$A = $_GET['A'] ?? null;
$B = $_GET['B'] ?? null;
$tA = $_GET['tA'] ?? null;
$tB = $_GET['tB'] ?? null;

// Só executa se o formulário foi enviado
if ($A !== null && $B !== null && $tA !== null && $tB !== null) {
    
    // VALIDAÇÃO: Evitando o loop infinito e inconsistências
    if ($A >= $B) {
        echo "<p style='color: red;'>A população de A já é maior ou igual a B!</p>";
    } elseif ($tA <= $tB) {
        echo "<p style='color: red;'>Erro Lógico: A taxa de crescimento de A deve ser maior que a de B, senão nunca a alcançará!</p>";
    } elseif ($A < 0 || $B < 0) {
        echo "<p style='color: red;'>Não existem populações negativas!</p>";
    } else {
        $count = 0;
        
        // Converte a porcentagem para decimal
        $tA /= 100;
        $tB /= 100;
        
        echo "<div style='max-height: 200px; overflow-y: auto; background: #eee; padding: 10px; border: 1px solid #ccc;'>";
        
        // O Laço: Enquanto A for menor que B
        while ($A < $B) {
            $A += ($A * $tA);
            $B += ($B * $tB);
            $count++;
            
            // Usamos round() para exibir números inteiros de habitantes
            echo "Ano {$count} - Pop. A: " . round($A) . " | Pop. B: " . round($B) . "<br>";
        }
        
        echo "</div>";
        echo "<h3 style='color: green;'>✔️ Em {$count} anos a população de A ultrapassa/iguala a de B!</h3>";
    }
}
?>

</body>
</html>

Melhorias implementadas nesta versão:

  • Trocamos o do...while antigo por um while clássico, que é mais legível para este tipo de cálculo.
  • Adicionamos uma <div> com barra de rolagem (scroll) para exibir a evolução ano a ano sem quebrar o layout do seu site, caso a conta demore 150 anos.
  • A validação agora barra valores negativos e lógicas que travam o processador.

🔥 Quer mergulhar de cabeça em TODAS as linguagens?
Se você quer aprender não apenas PHP, mas dominar o front-end e back-end por completo, conheça o nosso Mega Pack com 7 Apostilas de Programação (HTML, JS, PHP, C, Java, Python). É o arsenal definitivo do desenvolvedor Full-Stack.

Nenhum comentário:

Veja também: