Como Contar a Quantidade de Dígitos de um Número em PHP

Como Contar a Quantidade de Dígitos de um Número em PHP

Neste tutorial do nosso Curso de PHP, vamos resolver a Questão 13 da nossa famosa lista de exercícios de funções. O desafio parece simples, mas esconde vários conceitos importantes de manipulação de dados:

"Faça um programa e uma função que informe a quantidade de dígitos (algarismos) de um determinado número inteiro informado pelo usuário."

1. A Abordagem Web: A Função strlen()

No desenvolvimento Web, quando um usuário digita algo em um formulário HTML (um campo <input>) e envia para o PHP via $_GET ou $_POST, esse dado chega nativamente no formato de String (texto).

Ou seja, se o usuário digitar o ano 2026, o PHP vai enxergar isso como a string "2026". Sendo um texto, a forma mais fácil de contar quantos "caracteres" existem ali é usando a função nativa strlen() (String Length - Comprimento da String):

function tamanhoDigitos($numero){
    return strlen($numero);
}
// echo tamanhoDigitos("2026"); // Retorna 4

2. E se a variável for puramente um Inteiro (Int)?

Se o número não veio de um formulário, mas sim de um cálculo matemático interno do sistema (ex: $n = 150 * 3;), ele será do tipo Integer. A função strlen() espera receber strings. O que fazer?

A solução é forçar a conversão do número para string antes de contar. Chamamos isso de Type Casting. Você pode fazer isso de duas formas simples no PHP:

  • Usando o comando (string): $texto = (string) $numero;
  • Concatenando com aspas vazias: $texto = $numero . "";

🛡️ O Perigo dos Números Negativos!

Se o usuário digitar -350, a função strlen("-350") vai retornar 4, pois ela conta o sinal de menos como um caractere! Para corrigir isso, devemos passar o número pela função abs() (Valor Absoluto), que transforma qualquer número negativo em positivo, removendo o sinal.

3. Curiosidade: A Abordagem Lógica/Matemática

Se você estiver prestando um concurso público ou entrevista de emprego, o avaliador pode pedir para você contar os dígitos sem usar funções prontas de texto. Como fazer isso usando apenas a matemática pura?

Basta criar um laço while (enquanto) que divide o número por 10 sucessivamente até ele chegar a zero, contando quantas divisões foram feitas:

function contarComMatematica($n) {
    $n = abs($n); // Remove o sinal negativo
    if ($n == 0) return 1; // O zero tem 1 dígito
    
    $digitos = 0;
    while ($n >= 1) {
        $digitos++;
        $n = $n / 10; // "Corta" o último número
    }
    return $digitos;
}

Para os amantes da matemática avançada, o número de dígitos $d$ de um inteiro $n$ positivo pode ser descoberto instantaneamente usando logaritmos na base 10:

$$d = \lfloor \log_{10}(n) \rfloor + 1$$

No PHP, isso seria escrito como: floor(log10($n)) + 1. Incrível, não é?

O Código Completo (Script Web)

Vamos juntar tudo em uma interface bonita onde o usuário pode testar livremente:

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Contador de Dígitos - PHP</title>
    <style>
        .box { max-width: 400px; margin: 30px auto; text-align: center; font-family: sans-serif; border: 2px solid #94a3b8; border-radius: 8px; padding: 25px; background-color: #f8fafc; }
        input[type="number"] { padding: 12px; width: 80%; margin-bottom: 20px; border: 1px solid #cbd5e1; border-radius: 4px; font-size: 18px; text-align: center; }
        .btn { background-color: #0f172a; color: white; border: none; padding: 12px 25px; border-radius: 4px; cursor: pointer; font-size: 16px; font-weight: bold; width: 88%; }
        .btn:hover { background-color: #334155; }
        .result { margin-top: 20px; padding: 15px; background: #dbeafe; color: #1e3a8a; border-radius: 4px; font-weight: bold; font-size: 1.2em; }
    </style>
</head>
<body>

    <div class="box">
        <h2>🔢 Contador de Algarismos</h2>
        
        <form action="" method="get">
            <input type="number" name="numero" required placeholder="Digite um número longo..." />
            <button type="submit" class="btn">Contar Dígitos</button>
        </form>

        <?php
        // A nossa função otimizada
        function contarDigitos($n) {
            // 1. O abs() remove o sinal de negativo caso exista
            $numeroLimpo = abs($n);
            
            // 2. O strlen() conta os caracteres
            return strlen((string) $numeroLimpo);
        }

        // Verifica se o formulário foi enviado
        if(isset($_GET['numero'])) {
            $num_digitado = $_GET['numero'];
            $quantidade = contarDigitos($num_digitado);
            
            echo "<div class='result'>";
            echo "O número $num_digitado possui <br> <span style='font-size:1.5em; color:#1d4ed8;'>$quantidade dígitos</span>";
            echo "</div>";
        }
        ?>
    </div>

</body>
</html>

Eleve sua Lógica de Programação! 🧠

Entender os bastidores das funções e conseguir resolver problemas de várias maneiras diferentes é o que separa os amadores dos programadores profissionais. Baixe a nossa Apostila Completa de PHP e tenha acesso a centenas de algoritmos e exercícios detalhados!

Baixar Apostila Completa de PHP

Números Perfeitos em PHP: Como Descobrir e Gerar (Exercício Resolvido)

Números Perfeitos em PHP: Lógica e Funções na Prática 

Neste tutorial do nosso Curso de PHP, vamos resolver a incrível Questão 7 da nossa lista de exercícios sobre funções.

"Um número é dito perfeito quando ele é igual à soma de todos os seus divisores próprios (excluindo ele mesmo). Escreva um programa em PHP com funções que receba um número, diga se ele é perfeito e, em seguida, liste todos os números perfeitos até esse limite."

1. A Matemática: O que é um Número Perfeito?

Antes de programar, precisamos entender a regra do jogo. Pegue o número 6. Por quais números podemos dividir o 6 de forma exata (sem sobrar resto)? Podemos dividi-lo por 1, por 2 e por 3.

Agora, some esses divisores:

$$6 = 1 + 2 + 3$$

Como a soma dos divisores resulta exatamente no próprio número, o 6 é um Número Perfeito! Veja outro exemplo famoso, o número 28. Seus divisores são 1, 2, 4, 7 e 14. Se somarmos:

$$28 = 1 + 2 + 4 + 7 + 14$$

Temos outro número perfeito! Os próximos são 496 e 8128. Acredite se quiser, eles são muito raros. Até hoje, os matemáticos não sabem se existe algum número perfeito ímpar ou se eles são infinitos!

2. A Lógica de Programação

Como transformar isso em código PHP? Vamos criar uma função chamada somaDivisores($n). Dentro dela:

  1. Criamos uma variável $soma = 0 para acumular os valores.
  2. Usamos um laço for que começa no 1 e vai até $n - 1.
  3. Dentro do laço, usamos o Operador Módulo (%). Se $n % $i == 0, significa que a divisão é exata. Se for exata, nós adicionamos esse $i na nossa variável $soma.
  4. No final, retornamos a soma. Se o retorno for igual ao número original, EUREKA! É perfeito.

3. O Código PHP Completo e Funcional

Preparamos um código visualmente atraente onde o usuário digita um número. O sistema dirá se aquele número é perfeito e, de bônus, vai varrer e imprimir todos os números perfeitos que existem do 1 até o número que você digitou!

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Detector de Números Perfeitos - PHP</title>
    <style>
        .container { max-width: 500px; margin: 30px auto; font-family: sans-serif; text-align: center; border: 2px solid #cbd5e1; padding: 30px; border-radius: 10px; background: #f8fafc; }
        input[type="number"] { padding: 10px; font-size: 16px; width: 80%; margin-bottom: 15px; border-radius: 5px; border: 1px solid #94a3b8; text-align: center;}
        .btn { background: #10b981; color: white; border: none; padding: 10px 20px; font-size: 16px; border-radius: 5px; cursor: pointer; font-weight: bold; width: 85%; }
        .btn:hover { background: #059669; }
        .resultado { margin-top: 20px; padding: 15px; border-radius: 5px; background: #e0f2fe; color: #0369a1; border: 1px solid #7dd3fc; text-align: left; }
    </style>
</head>
<body>

<div class="container">
    <h2>✨ É um Número Perfeito?</h2>
    <form action="" method="get">
        <input type="number" name="numero" min="1" max="10000" placeholder="Digite um número (ex: 28)" required>
        <button type="submit" class="btn">Verificar e Buscar</button>
    </form>

    <?php
    // FUNÇÃO: Calcula a soma dos divisores de um número
    function somaDivisores($n) {
        $soma = 0;
        // Divide o número por todos os anteriores a ele
        for($i = 1; $i < $n; $i++) {
            if($n % $i == 0) { // Se o resto for 0, é divisor!
                $soma += $i;
            }
        }
        return $soma;
    }

    // Verifica se o usuário enviou o formulário
    if(isset($_GET['numero'])) {
        $num_usuario = intval($_GET['numero']);
        
        echo "<div class='resultado'>";
        
        // 1. Testa se o número digitado é perfeito
        if($num_usuario == somaDivisores($num_usuario)) {
            echo "<strong style='color: green; font-size: 1.2em;'>✔ O número $num_usuario É PERFEITO!</strong><br><br>";
        } else {
            echo "<strong style='color: red;'>❌ O número $num_usuario NÃO é perfeito.</strong><br><br>";
        }

        // 2. Busca todos os números perfeitos de 1 até o número digitado
        echo "<b>Números perfeitos encontrados entre 1 e $num_usuario:</b><br>";
        $encontrou_algum = false;
        
        for($j = 1; $j <= $num_usuario; $j++) {
            if($j == somaDivisores($j)) {
                echo "➔ $j <br>";
                $encontrou_algum = true;
            }
        }
        
        if(!$encontrou_algum) {
            echo "<i>Nenhum número perfeito encontrado nesse intervalo.</i>";
        }
        
        echo "</div>";
    }
    ?>
</div>

</body>
</html>

⚠️ Cuidado com o Processamento!

Como os números perfeitos são calculados dividindo um por um até o infinito, testar números maiores que 10.000 pode travar ou deixar o seu navegador muito lento! Por isso, no nosso formulário HTML, colocamos uma trava de segurança max="10000".

Gostou da Lógica? Aprimore-se! 💡

Exercícios como o dos Números Perfeitos são o segredo para treinar o seu cérebro de programador. Na nossa Apostila Completa de PHP, você encontra dezenas de exercícios resolvidos e comentados como esse, prontos para você estudar.

Baixar Apostila Completa de PHP

Rolando Dados em PHP: Simulador de Probabilidade e Estatística

Rolando Dados em PHP: O Teste de 1 Milhão de Lançamentos

Sabe o que é mais legal na programação? Ela nos permite provar a matemática na prática! Hoje, vamos resolver o famoso Exercício 4 da nossa lista de funções, misturando probabilidade, arrays e laços de repetição no PHP.

"A probabilidade de dar um valor específico em um dado de 6 lados é de 1/6. Faça um script em PHP que simule 1 milhão de lançamentos e mostre a frequência que deu para cada número."

A Teoria: A Lei dos Grandes Números

A matemática diz que um dado comum tem 6 lados (faces). Se ele não for viciado, a chance de cair qualquer um dos lados é exatamente igual.

Podemos expressar essa probabilidade matematicamente assim:

$$P(face) = \frac{1}{6} \approx 16,66\%$$

Porém, se você jogar um dado apenas 6 vezes na vida real, ele quase nunca vai cair um de cada. Vai repetir números, vai faltar outros... isso é o caos da aleatoriedade de curto prazo! Mas a Lei dos Grandes Números afirma que, quanto mais vezes você jogar, mais o resultado se aproximará dos 16,66% exatos para cada lado.

E como não temos tempo de jogar um dado na mesa 1 milhão de vezes, vamos mandar o nosso servidor PHP fazer isso em milissegundos!

Deixando o script interativo

O exercício original pede 1 milhão de jogadas. Mas nós do PHP Progressivo gostamos de ir além! Vamos criar um formulário HTML onde o próprio usuário escolhe a quantidade de vezes que deseja rolar os dados. Assim, você pode testar com 10 jogadas, mil, ou até milhões!

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Simulador de Dados - PHP Progressivo</title>
    <style>
        .container { font-family: Arial, sans-serif; max-width: 600px; margin: 20px auto; padding: 20px; border: 1px solid #ccc; border-radius: 10px; background: #f9f9f9; }
        .input-box { width: 100%; padding: 10px; font-size: 16px; margin-bottom: 10px; box-sizing: border-box; }
        .btn { background: #2563eb; color: white; padding: 10px 20px; font-size: 16px; border: none; border-radius: 5px; cursor: pointer; width: 100%; }
        .btn:hover { background: #1d4ed8; }
        .bar-container { width: 100%; background-color: #e2e8f0; border-radius: 4px; margin-bottom: 15px; overflow: hidden; }
        .bar { height: 24px; background-color: #10b981; text-align: right; padding-right: 10px; color: white; font-weight: bold; line-height: 24px; white-space: nowrap; }
    </style>
</head>
<body>

<div class="container">
    <h2 style="text-align: center;">🎲 Simulador de Dados em PHP</h2>
    <form action="" method="get">
        <label>Quantas vezes deseja lançar o dado?</label>
        <input type="number" name="jogadas" class="input-box" min="1" max="10000000" placeholder="Ex: 1000000" required>
        <button type="submit" class="btn">Rolar Dados!</button>
    </form>

    <?php
    if (isset($_GET['jogadas'])) {
        // Recebe o valor e garante que é um número inteiro válido
        $n_jogadas = intval($_GET['jogadas']);

        // Limite de segurança para não travar o servidor
        if ($n_jogadas > 0 && $n_jogadas <= 10000000) {
            
            echo "<h3>Resultados para " . number_format($n_jogadas, 0, ',', '.') . " lançamentos:</h3>";

            // Inicializamos o Array para contar quantas vezes cada face caiu
            $faces = array(
                1 => 0, 
                2 => 0, 
                3 => 0, 
                4 => 0, 
                5 => 0, 
                6 => 0
            );

            // O Laço FOR vai rodar a quantidade de vezes que o usuário pediu
            for ($i = 0; $i < $n_jogadas; $i++) {
                $sorteio = rand(1, 6); // Rola o dado
                $faces[$sorteio]++;    // Adiciona +1 na face sorteada
            }

            // Exibindo os resultados de forma visual
            foreach ($faces as $lado => $quantidade) {
                // Calcula a porcentagem
                $porcentagem = ($quantidade / $n_jogadas) * 100;
                $porcentagem_formatada = number_format($porcentagem, 2, ',', '');

                echo "<strong>Face $lado:</strong> " . number_format($quantidade, 0, ',', '.') . " vezes";
                echo "<div class='bar-container'>";
                echo "<div class='bar' style='width: " . $porcentagem . "%;'>$porcentagem_formatada%</div>";
                echo "</div>";
            }

        } else {
            echo "<p style='color: red;'>Por favor, digite um número entre 1 e 10.000.000.</p>";
        }
    }
    ?>
</div>

</body>
</html>

Entendendo o Código (Passo a Passo)

  • 🚀 Array de Frequência: Criamos um $faces = array(...) com 6 posições (1 a 6) iniciando com o valor zero. Esse será o nosso "contador" oficial.
  • 🚀 O Laço For: Ele começa no 0 e vai até o limite que o usuário digitou ($n_jogadas). Se você digitar 1 milhão, esse laço vai girar 1 milhão de vezes na velocidade da luz.
  • 🚀 A Contagem: A linha $faces[$sorteio]++ é genial. Se o dado cair 4, ele vai lá na chave 4 do Array e soma mais um.
  • 🚀 As Barras Visuais: Usamos um foreach para ler os resultados, calculamos a porcentagem com regra de 3 básica e usamos esse valor para definir o width (largura) do CSS.

Faça o teste no seu servidor local! Digite 10 jogadas e veja como as barras ficam irregulares. Depois, digite 1000000 e repare na mágica: todas as barras vão cravar em 16,6%, provando que a matemática da probabilidade é perfeita!

Domine os Arrays e Laços no PHP! 🚀

Se você achou esse exercício incrível, precisa ver os outros desafios que preparamos para você! Na nossa apostila completa de PHP, você aprende do zero ao avançado com centenas de exemplos práticos como este.

Baixar Apostila Completa de PHP

Como Criar um Jogo de Adivinhação em PHP (Passo a Passo)

Como Criar um Jogo de Adivinhação em PHP

Você sabia que a melhor forma de fixar o que aprendeu em programação é criando jogos? Quando juntamos a lógica condicional (o famoso if/else) com a capacidade de gerar números aleatórios, as possibilidades são infinitas!

Neste tutorial do nosso Curso de PHP, vamos criar um clássico Jogo da Adivinhação. O objetivo é simples e muito divertido:

"O PHP vai gerar e esconder um número aleatório entre 1 e 10. Você, através de um formulário, vai dar o seu palpite tentando adivinhar que número foi esse. Se acertar, comemore! Se errar, o sistema revelará o número sorteado."

A Lógica por trás do Game

Antes de sairmos digitando código, vamos entender o passo a passo do que o nosso script precisa fazer:

  1. Capturar a Jogada: Primeiro, recebemos o número que o jogador digitou no formulário (vamos armazená-lo na variável $palpite).
  2. A Mágica do PHP: No mesmo instante, usamos a função rand(1, 10) para o servidor "pensar" em um número secreto. Vamos guardar isso na variável $resposta.
  3. A Hora da Verdade: Comparamos o $palpite com a $resposta usando um if (Se). Se forem exatamente iguais, mostramos a mensagem de vitória. Caso contrário (else), anunciamos a derrota.

O Código Completo e Bonito

Preparamos um código especial para você. Além de ter a lógica perfeita do PHP, adicionamos um pouco de CSS (estilização) para que o seu jogo não fique parecendo um formulário chato de prefeitura, mas sim um minigame moderno!

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Jogo de Adivinhação - PHP Progressivo</title>
    <style>
        /* Estilos para deixar nosso jogo com cara de jogo! */
        .game-box { max-width: 400px; margin: 30px auto; text-align: center; font-family: sans-serif; border: 3px solid #3b82f6; border-radius: 12px; padding: 25px; background-color: #f8fafc; box-shadow: 0 4px 8px rgba(0,0,0,0.1); }
        .btn-jogar { background-color: #3b82f6; color: white; border: none; padding: 12px 25px; border-radius: 6px; cursor: pointer; font-size: 16px; font-weight: bold; width: 100%; transition: background 0.3s; }
        .btn-jogar:hover { background-color: #2563eb; }
        input[type="number"] { padding: 12px; width: 90%; margin-bottom: 20px; border: 2px solid #cbd5e1; border-radius: 6px; font-size: 18px; text-align: center; }
        .resultado { margin-top: 20px; padding: 15px; border-radius: 6px; font-weight: bold; font-size: 1.1em; }
        .acertou { background-color: #d1fae5; color: #065f46; border: 1px solid #10b981; }
        .errou { background-color: #fee2e2; color: #991b1b; border: 1px solid #ef4444; }
    </style>
</head>
<body>

    <div class="game-box">
        <h2>🎮 Tente a Sorte!</h2>
        <p>O PHP pensou em um número de <strong>1 a 10</strong>. Qual é o seu palpite?</p>
        
        <form action="" method="get">
            <input type="number" name="palpite" min="1" max="10" required placeholder="Digite um número..." />
            <button type="submit" class="btn-jogar">Verificar Palpite</button>
        </form>

        <?php
        /* * A função isset() verifica se o jogador já enviou um palpite.
         * Se não colocarmos isso, o PHP vai dar erro na primeira vez que a página abrir!
         */
        if(isset($_GET['palpite'])) {
            
            // 1. Recebe o palpite do usuário
            $palpite = $_GET['palpite'];
            
            // 2. O servidor escolhe um número aleatório de 1 a 10
            $resposta = rand(1, 10);

            // 3. Compara os resultados e exibe a div colorida correspondente
            if($palpite == $resposta) {
                echo "<div class='resultado acertou'>";
                echo "🎉 Acertou miserávi! O número era exatamente $resposta!";
                echo "</div>";
            } else {
                echo "<div class='resultado errou'>";
                echo "❌ Errou feio! Você jogou $palpite, mas o número sorteado era $resposta.";
                echo "</div>";
            }
        }
        ?>
    </div>

</body>
</html>

💡 Entendendo o isset()

Notou o if(isset($_GET['palpite'])) no código? Isso é uma boa prática essencial. Ele diz ao PHP: "Só execute a lógica do sorteio SE o formulário tiver sido preenchido e enviado". Sem isso, assim que o usuário entra no site, o PHP tentaria ler uma variável vazia e geraria um alerta de erro na tela.

Pronto! Agora é só você colocar esse minigame no ar em uma hospedagem real e mandar o link no grupo do WhatsApp dos seus amigos para ver quem é o mestre da adivinhação e acerta de primeira!

Gostou do Joguinho? Tem muito mais! 🚀

Na nossa Apostila de PHP Oficial, nós ensinamos passo a passo como criar sistemas complexos, jogos avançados, e tudo o que você precisa para se tornar um desenvolvedor Web Profissional.

Baixar Apostila Completa de PHP

Como Gerar Números Aleatórios em PHP com a Função rand()

Função rand() no PHP: Gerando Números Aleatórios e Jogos

Você já viu aqueles captchas malucos na internet? Ou sistemas que geram códigos de confirmação (tokens) por SMS? E aquelas senhas temporárias automáticas?

Gerar valores aleatórios é uma habilidade fundamental no mundo da programação. E para a nossa alegria, o lindo e maravilhoso PHP já possui uma função nativa que faz tudo isso por nós de maneira muito simples e automática: a função rand().

1. O Básico: A Função rand() e getrandmax()

Para testar o poder dessa função, abra o seu ambiente PHP e simplesmente digite:

<?php
    echo rand();
?>

Agora, fique atualizando a página. Várias e várias vezes. Você vai notar que a cada refresh, um número inteiro diferente aparece na sua tela.

Mas até onde esse número pode ir? Por padrão, se você não disser nada, a função rand() vai gerar um número que vai de 0 até o valor máximo suportado pelo sistema, que pode ser descoberto usando a função getrandmax(). Em muitos sistemas Windows, por exemplo, esse limite é 2147483647!

2. Definindo os seus próprios Intervalos (Min e Max)

A função rand() é extremamente versátil. Na maioria das vezes, não queremos um número gigantesco de bilhões, queremos um número dentro de uma regra específica. Para isso, basta passar dois parâmetros: valor mínimo e valor máximo.

  • 🪙 Cara ou Coroa (Par ou Ímpar):
    rand(0, 1) vai retornar estritamente ou 0, ou 1.
  • 🎲 Lançamento de um Dado comum:
    rand(1, 6) vai retornar 1, 2, 3, 4, 5 ou 6.
  • 💯 Sorteio de 1 a 100:
    rand(1, 100).

3. E se eu quiser números quebrados (Decimais)?

A função rand() retorna sempre números inteiros. Mas e se você estiver programando a inteligência artificial de um jogo e precisar de um número flutuante (decimal) entre 0.0 e 1.0?

A lógica é usar a matemática a seu favor! Basta pedir um número aleatório inteiro maior e dividi-lo:

<?php
    // Gera um número entre 0 e 10 (ex: 7) e divide por 10. Resultado = 0.7
    $decimal = rand(0, 10) / 10;
    
    // Quer duas casas decimais? (Ex: 0.45)
    $decimal_preciso = rand(0, 100) / 100;
?>

🛡️ Dica Pro: rand() vs random_int()

A função rand() é excelente para jogos, sorteios simples e brincadeiras. Porém, se você estiver gerando senhas reais, tokens financeiros ou criptografia, utilize a função random_int(min, max). Ela é criptograficamente segura e impede que hackers prevejam qual será o próximo número gerado!

4. Exercício Prático: O Jogo da Adivinhação

Agora que você já domina a geração de dados, que tal criar o seu primeiro jogo em PHP?

🎮 O Desafio:

Crie um script web simples. O PHP vai gerar um número secreto entre 1 e 10 usando a função rand(1, 10), e você terá um formulário onde o usuário tentará adivinhar que número foi esse.

  • Se o usuário acertar: Mostre uma mensagem de vitória (ex: "Você acertou! O número era X!").
  • Se o usuário errar: Mostre uma mensagem de derrota (ex: "Você errou! O número sorteado foi Y!").

Consegue fazer sozinho? Tente primeiro!
→ Clique aqui para ver o Gabarito e como fazer esse jogo passo a passo

Para aprofundar seus estudos técnicos, consulte o manual oficial em: php.net/manual/pt_BR/function.rand.php

Gabarito Completo na Apostila 📚

Esse jogo e dezenas de outros projetos práticos, exercícios resolvidos e códigos fonte estão disponíveis para download imediato na nossa apostila oficial de PHP.

Baixar Apostila Completa de PHP

Conversão de Celsius e Fahrenheit em PHP: Script com Funções

 

Conversão de Celsius e Fahrenheit em PHP usando Funções

Neste tutorial da nossa Apostila de PHP, vamos resolver de forma prática e elegante um dos clássicos da programação mundial: o conversor de temperaturas. Vamos aplicar nossos conhecimentos de funções para converter graus Celsius para Fahrenheit e vice-versa.

Este é o momento de colocar a mão na massa resolvendo o Exercício 01 da nossa Lista de Exercícios sobre Funções:

"Escreva um script que pergunta ao usuário se ele deseja converter uma temperatura de grau Celsius para Fahrenheit ou vice-versa. Para cada conversão, chame a função correspondente."

A Matemática da Conversão

Antes de codificar, precisamos entender as fórmulas matemáticas. Existem escalas diferentes para medir temperatura no mundo (o Brasil usa Celsius, enquanto os Estados Unidos usam Fahrenheit, por exemplo).

As fórmulas matemáticas universais de conversão são:

  • 🌡️ De Celsius para Fahrenheit: $$F=(C \times \frac{9}{5})+32$$
  • 🌡️ De Fahrenheit para Celsius: $$C=(F-32) \times \frac{5}{9}$$

A Lógica do nosso Script PHP

Nós vamos construir um pequeno formulário HTML onde o usuário digita a temperatura. Em vez de pedir para ele digitar "1" ou "2", vamos fazer um código de alto nível usando um elemento <select> para ele escolher o tipo de conversão.

No backend, o nosso PHP fará o seguinte:

  1. Verifica se o formulário foi enviado (usando isset).
  2. Captura a opção escolhida.
  3. Se escolheu "CtoF", chama a nossa função CtoF() e exibe o resultado.
  4. Se escolheu "FtoC", chama a função FtoC().

O Código Completo (HTML + PHP)

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Conversor de Temperaturas - PHP Progressivo</title>
</head>
<body style="font-family: Arial; padding: 20px;">

    <h2>Conversor de Temperatura</h2>
    
    <!-- Formulário Inteligente -->
    <form action="" method="get">
        <label>Temperatura:</label>
        <input type="number" step="0.01" name="temperatura" required />
        
        <select name="conversao">
            <option value="CtoF">Graus Celsius para Fahrenheit</option>
            <option value="FtoC">Fahrenheit para Graus Celsius</option>
        </select>
        
        <input type="submit" value="Calcular" />
    </form>

    <?php
    // Verifica se os dados foram enviados para evitar erros
    if (isset($_GET['temperatura']) && isset($_GET['conversao'])) {
        
        // Pega a temperatura e converte para decimal
        $temp = floatval($_GET['temperatura']);
        $opt = $_GET['conversao'];

        echo "<br>"; // Pula uma linha
        
        // Tratamento da Opção
        if ($opt == "CtoF") {
            $resultado = CtoF($temp);
            echo "Resultado: <strong>{$temp}°C</strong> equivalem a <strong>" . number_format($resultado, 2) . "°F</strong>.";
        } elseif ($opt == "FtoC") {
            $resultado = FtoC($temp);
            echo "Resultado: <strong>{$temp}°F</strong> equivalem a <strong>" . number_format($resultado, 2) . "°C</strong>.";
        } else {
            echo "Opção inválida.";
        }
    }

    // ==========================================
    // MINHAS FUNÇÕES (A Mágica acontece aqui!)
    // ==========================================

    function CtoF($celsius) {
        return ($celsius * 9 / 5) + 32;
    }

    function FtoC($fahrenheit) {
        return ($fahrenheit - 32) * 5 / 9;
    }
    ?>

</body>
</html>

Por que isso é tão poderoso?

Prontinho! Veja que bacana, limpo e organizado ficou o nosso script. Agora você pode, inclusive, hospedar seu site na web, pois esse sistema está funcionando perfeitamente.

A maior vantagem de ter criado Funções para isso é a reutilização de código. Imagine que você consiga um emprego de desenvolvedor em um portal de notícias meteorológicas. Você nunca mais precisará escrever essa matemática do zero!

Você pode simplesmente pegar as funções CtoF() e FtoC(), salvá-las em um arquivo chamado conversao.php, e sempre que precisar usá-las no seu sistema, basta incluir a linha require_once "conversao.php"; no topo da sua página.

Isso é o PHP em sua melhor forma! Sensacional, não acha?

Quer mais Códigos Prontos? 🚀

Esse script faz parte da nossa coleção de exercícios de lógica. Na nossa apostila oficial, você encontra centenas de scripts como esse comentados linha a linha para acelerar seu aprendizado.

Baixar Apostila Completa de PHP

13 Exercícios de Funções em PHP: Pratique sua Lógica de Programação

Lista de Exercícios Resolvidos de Funções em PHP

Programação não se aprende apenas lendo, mas sim quebrando a cabeça e escrevendo código! Chegou o momento de testarmos tudo o que você aprendeu sobre criação, invocação e retorno de Funções no PHP.

Abaixo, preparamos uma lista com 13 desafios práticos que vão desde lógicas simples até o uso de funções recursivas avançadas. Tente resolver todos no seu ambiente local antes de olhar as respostas!

💡 Dica de Ouro

Crie um arquivo chamado funcoes.php e coloque todas as funções que você criar lá dentro. Nos arquivos dos exercícios, use o comando include 'funcoes.php';. Isso já te treina para a modularização de sistemas reais!


Lista de Exercícios:

Exercício 01

Escreva um script que pergunta ao usuário se ele deseja converter uma temperatura de grau Celsius para Fahrenheit ou vice-versa. Se ele digitar 1, é de Celsius para Fahrenheit; se digitar 2, é de Fahrenheit para Celsius; se for outro valor, mostre uma mensagem de erro. Para cada conversão, chame a função correta correspondente.

→ Ver Resolução: Conversão Celsius-Fahrenheit

Exercício 02

Faça um programa que contenha uma função que receba três argumentos inteiros e retorne a soma desses três valores. Em seguida, o seu script deve fornecer a média dos três números, através de uma segunda função que invoca a primeira (função chamando função).

Exercício 03

Faça um programa que receba três números do usuário e identifique o maior número através de uma função, e o menor número através de uma outra função separada.

Exercício 04

A probabilidade de dar um valor em um dado comum é de 1/6 (uma em seis). Faça um script em PHP que simule 1 milhão de lançamentos de dados e mostre a frequência que cada número (de 1 a 6) apareceu no final da simulação.

→ Ver Resolução: Lançamento de dados 

Exercício 05

A série de Fibonacci é uma sequência de números onde os dois primeiros são 0 e 1, e o termo seguinte é sempre obtido somando os dois anteriores. Faça um script em PHP que solicite um inteiro positivo ao usuário, que chamaremos de n. Crie uma função recursiva que exiba todos os termos da sequência até o n-ésimo termo.

Exercício 06

Crie uma função que receba um inteiro positivo e teste para saber se ele é primo ou não. Faça um script que recebe um inteiro n do usuário e mostra todos os números primos existentes no intervalo de 1 até n.

Exercício 07

Um número é dito perfeito quando ele é igual à soma de seus fatores divisores. Por exemplo, os fatores de 6 são 1, 2 e 3. Como a soma (1 + 2 + 3) é igual a 6, ele é um número perfeito. Escreva uma função que receba um inteiro e diga se é perfeito ou não. Em outra parte do script, peça um inteiro n e mostre todos os números perfeitos de 1 até n.

→ Ver Resolução: Números perfeitos em PHP

Exercício 08

Use uma função que receba um valor n inteiro e imprima o seguinte padrão numérico na tela (até a n-ésima linha):

1
2   2
3   3   3
.....
n   n   n   n   n   n  ... n
Exercício 09

Use uma função que receba um valor n inteiro e imprima um padrão semelhante ao exercício anterior, mas em formato de escada sequencial:

1
1   2
1   2   3
.....
1   2   3   ...  n
Exercício 10

Faça um programa com uma função que necessite de um argumento. A função deve retornar o caractere 'P' se o seu argumento for positivo, e 'N' se o seu argumento for zero ou negativo.

Exercício 11

Faça um programa com uma função chamada somaImposto(). A função possui dois parâmetros formais: taxaImposto (que é a quantia de imposto sobre vendas expressa em porcentagem) e custo (que é o valor de um item antes do imposto). A função deve alterar e retornar o valor de custo atualizado para incluir o imposto sobre a venda.

Exercício 12

Faça um programa que converta da notação de 24 horas para a notação de 12 horas. Por exemplo, o programa deve converter 14:25 em 2:25 P.M. A entrada é dada em dois inteiros. Deve haver pelo menos duas funções: uma para fazer a conversão e uma para a saída do texto formatado. Registre a informação de período como 'A' para A.M. e 'P' para P.M. Inclua um loop (formulário contínuo) que permita que o usuário repita esse cálculo para novos valores sempre que desejar.

Exercício 13

Faça uma função matemática que informe a quantidade de dígitos de um determinado número inteiro inserido pelo usuário.

→ Ver Resolução: Quantos dígitos tem um número

Gabarito Completo na Apostila 📚

Travou em algum exercício? Não se preocupe! A resolução comentada passo a passo de TODOS esses algoritmos (e dezenas de outros) está disponível na nossa apostila oficial.

Baixar Apostila Completa de PHP

Funções Recursivas no PHP: O Guia Definitivo da Recursividade

Recursividade em PHP: Entenda Funções Recursivas Passo a Passo

Existe uma velha piada entre os programadores que diz: "Para entender a recursividade, você primeiro precisa entender a recursividade". Ao final deste tutorial do nosso Curso de PHP, você vai entender exatamente o que isso significa (e vai rir junto!).

Uma função recursiva é, nada mais, nada menos, do que uma função que invoca (chama) a si mesma de dentro do seu próprio bloco de código. É um conceito lindo, matemático e extremamente poderoso na programação.

⚠️ Cuidado com o Loop Infinito (Stack Overflow)

Obviamente, se você apenas escrever o código da função chamando a si mesma, a função de dentro chamará a si mesma, que chamará a si mesma de novo, infinitamente... até esgotar toda a memória RAM do computador ou do servidor.

Para evitar que isso aconteça, toda função recursiva deve, obrigatoriamente, ter um ponto de parada (Base Case). Isso é feito com um simples if/else. Se a condição de parada for atingida, a função para de se invocar; caso contrário, ela continua.

1. Somatório com Recursão

Seja $F(n)$ uma função matemática que representa o somatório de um número $n$. Ou seja, é a soma de todos os números até ele:

$$F(n) = 1 + 2 + 3 + 4 + \dots + (n-1) + n$$

Por exemplo:
$F(4) = 1 + 2 + 3 + 4 = 10$
$F(5) = 1 + 2 + 3 + 4 + 5 = 15$

Porém, note um padrão interessante na matemática. A soma de 5 é exatamente a soma de 4, mais 5:
$F(5) = (1 + 2 + 3 + 4) + 5 = F(4) + 5$

Isso nos dá a nossa fórmula recursiva universal: $F(n) = n + F(n-1)$

A Lógica: Vamos criar uma função somatorio(). Se o argumento for 1 (nosso ponto de parada), ela retorna 1 e o programa acaba. Se não for 1, ela retorna $n$ mais a chamada da própria função para $n-1$.

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Somatório Recursivo - PHP</title>
</head>
<body style="font-family: Arial; padding: 20px;">

    <form action="" method="get">
        Somatório de: <input type="number" name="numero" required />
        <input type="submit" value="Calcular" />
    </form>

    <?php
    if (isset($_GET['numero'])) {
        $numero = intval($_GET['numero']);
        echo "<br><strong>O somatório de {$numero} é:</strong> " . somatorio($numero);
    }

    // Função Recursiva
    function somatorio($numero) {
        // Ponto de Parada
        if ($numero == 1) {
            return 1;
        } else {
            // Chamada Recursiva
            return $numero + somatorio($numero - 1);
        }
    }
    ?>

</body>
</html>

2. Fatorial com Recursão ($n!$)

O Fatorial segue uma lógica absurdamente parecida com a do somatório, mas multiplicando. (Nós já o calculamos usando Laços de Repetição no passado).

Observe:
$5! = 5 \times 4 \times 3 \times 2 \times 1$
$6! = 6 \times (5 \times 4 \times 3 \times 2 \times 1) = 6 \times 5!$

A nossa fórmula recursiva é: $n! = n \times (n-1)!$

O nosso ponto de parada baseia-se na regra matemática universal de que $0! = 1$. Veja o código:

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Fatorial Recursivo - PHP</title>
</head>
<body style="font-family: Arial; padding: 20px;">

    <form action="" method="get">
        Fatorial de: <input type="number" name="numero" min="0" required />
        <input type="submit" value="Calcular Fatorial" />
    </form>

    <?php
    if (isset($_GET['numero'])) {
        $numero = intval($_GET['numero']);
        echo "<br><strong>O fatorial de {$numero} é:</strong> " . fat($numero);
    }

    // Função Recursiva
    function fat($numero) {
        // Ponto de Parada
        if ($numero == 0) {
            return 1;
        } else {
            // Chamada Recursiva
            return $numero * fat($numero - 1);
        }
    }
    ?>

</body>
</html>

3. Sequência de Fibonacci com Recursão

A famosa série de Fibonacci é um dos exemplos mais clássicos ensinados nas universidades para treinar recursividade. Na matemática da natureza, os primeiros termos são definidos como:

$F(0) = 0$
$F(1) = 1$

A partir daí, cada novo número é a soma dos dois anteriores. A fórmula recursiva é:
$F(n) = F(n-1) + F(n-2)$

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Fibonacci Recursivo - PHP</title>
</head>
<body style="font-family: Arial; padding: 20px;">

    <form action="" method="get">
        Exibir o Termo Fibonacci (N): <input type="number" name="numero" min="0" required />
        <input type="submit" value="Descobrir" />
    </form>

    <?php
    if (isset($_GET['numero'])) {
        $numero = intval($_GET['numero']);
        echo "<br><strong>O termo {$numero} de Fibonacci é:</strong> " . fibo($numero);
    }

    // Função Recursiva
    function fibo($numero) {
        // Pontos de Parada
        if ($numero == 0 || $numero == 1) {
            return $numero;
        } else {
            // Chamada Recursiva Dupla
            return fibo($numero - 1) + fibo($numero - 2);
        }
    }
    ?>

</body>
</html>

Domine Algoritmos no PHP 🧠

Recursividade é apenas o começo! O verdadeiro poder de um desenvolvedor está em conhecer todas as ferramentas da linguagem. Estude com centenas de exercícios práticos, gabaritados e organizados do zero ao avançado.

Baixar Apostila Completa de PHP

Funções Chamando Funções no PHP: Como Invocar e Modularizar Lógicas

Funções no PHP: Como Uma Função Pode Invocar Outra

Em nossa jornada pelo Curso de PHP, já aprendemos a criar funções isoladas para realizar tarefas específicas. Mas você sabia que as funções podem trabalhar em equipe? Uma das técnicas mais poderosas e comuns na programação é uma função invocar (chamar) outra função dentro dela.

Isso permite que você quebre problemas complexos em pedacinhos minúsculos e fáceis de resolver, criando um código muito mais limpo e profissional.

1. Invocando Funções Nativas do PHP

Antes de criarmos nossas próprias interações complexas, vamos ver como invocar funções que já vêm embutidas no PHP. Vamos criar um script que recebe o raio de um círculo via formulário e calcula sua área.

A fórmula da área é: Área = PI * Raio². Para isso, nossa função area() vai invocar duas funções matemáticas nativas do PHP: pi() e pow() (potenciação).

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Área do Círculo - PHP Progressivo</title>
</head>
<body style="font-family: Arial; padding: 20px;">

    <form action="" method="get">
        Raio: <input type="number" step="any" name="raio" required />
        <input type="submit" value="Calcular" />
    </form>

    <?php
    if (isset($_GET['raio'])) {
        $raioUsuario = floatval($_GET['raio']);
        
        echo "<br><strong>A área é:</strong> " . number_format(area($raioUsuario), 2);
    }

    // Nossa função personalizada invocando duas nativas
    function area($raio) {
        // pi() retorna 3.14159...
        // pow($raio, 2) eleva o raio ao quadrado
        return pi() * pow($raio, 2);
    }
    ?>

</body>
</html>

2. Função Customizada invocando Função Customizada

Agora vamos ao mundo real. Crie um script que receba os 3 coeficientes (a, b, c) de uma Equação do 2º Grau e classifique as raízes dela.

Para isso ficar organizado, usaremos duas funções feitas por nós:

  • delta(): Recebe os coeficientes e faz o cálculo puro do Delta (b² - 4ac).
  • equacao(): Recebe os coeficientes, invoca a função delta(), recebe a resposta dela e usa o resultado para classificar a equação com if/else.
<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Calculadora de Equações</title>
</head>
<body style="font-family: Arial; padding: 20px;">

    <form action="" method="get">
        A: <input type="number" name="a" required /><br><br>
        B: <input type="number" name="b" required /><br><br>
        C: <input type="number" name="c" required /><br><br>
        <input type="submit" value="Analisar Equação" />
    </form>

    <?php
    if (isset($_GET['a']) && isset($_GET['b']) && isset($_GET['c'])) {
        $a = floatval($_GET['a']);
        $b = floatval($_GET['b']);
        $c = floatval($_GET['c']);
        
        echo "<br><strong>Resultado:</strong> " . equacao($a, $b, $c);
    }

    // Função Principal
    function equacao($a, $b, $c) {
        
        // Verificação Básica
        if ($a == 0) {
            return "Não é uma equação do 2º grau (A não pode ser zero).";
        }
        
        // A função invoca a função delta() aqui e guarda o valor!
        $valorDelta = delta($a, $b, $c);
        
        if ($valorDelta == 0) {
            return "A equação possui duas raízes reais e IGUAIS.";
        } elseif ($valorDelta > 0) {
            return "A equação possui duas raízes reais e DISTINTAS.";
        } else {
            return "A equação possui raízes IMAGINÁRIAS (Delta negativo).";
        }
    }

    // Função Auxiliar que foi chamada lá em cima
    function delta($a, $b, $c) {
        return ($b * $b) - (4 * $a * $c);
    }
    ?>

</body>
</html>

🛠️ Como o PHP sabe onde está a função delta()?

Note que a função delta() foi escrita depois da função equacao(). Em algumas linguagens antigas, isso daria erro. Mas o interpretador do PHP é inteligente: ele faz uma "varredura" lendo todas as funções do arquivo antes de começar a executá-las de fato. Portanto, a ordem em que você escreve suas funções não importa!

⚠️ Atenção Sênior: Cuidado com a Performance!

É possível usar a função diretamente dentro do if sem criar uma variável, fazendo algo como:

elseif(delta($a,$b,$c) > 0)

Porém, evite fazer isso! Se você chamar delta() em cada linha de if/elseif, o servidor terá que refazer a conta matemática várias vezes. Ao salvar a resposta numa variável $valorDelta = delta(...), o cálculo é feito apenas uma vez, economizando processamento da sua máquina. Essa é a marca de um programador profissional.

Destrave sua Lógica de Programação 🧠

Entender o fluxo de funções chamando funções é o que separa os amadores dos desenvolvedores plenos. Quer dominar isso com dezenas de exercícios práticos, gabaritados e organizados do zero ao avançado?

Baixar Apostila Completa de PHP

📚 Consolide seu Conhecimento

A técnica que aprendemos hoje é o aquecimento perfeito para um dos conceitos mais fascinantes e temidos da computação: a recursão. Continue estudando: