Guia de Engenharia de Prompt: Economize Tokens com Comandos Precisos

Imagem
Foto: Google DeepMind / Pexels Resumo rápido Entenda o que são tokens e por que cada fragmento de texto impacta o custo e o processamento. Aprenda o método dos 4 pilares para criar instruções técnicas diretas e sem redundâncias. Descubra como o uso de delimitadores substitui frases explicativas longas e economiza recursos. Veja exemplos práticos de como reduzir o tamanho de um prompt em mais de 50% mantendo a precisão. Se você já sentiu que está gastando "munição" à toa ao interagir com uma IA, este guia é para você. No nosso dia a dia de desenvolvimento, tratar o prompt como uma conversa de bar é um erro comum que consome recursos preciosos. Cada palavra que enviamos para o modelo é processada e cobrada, e entender essa mecânica é a diferença entre um sobrevivente eficiente e alguém que fica sem suprimentos no meio da missão. Neste artigo, vamos mergulhar na Engenharia de Prompt com foco total em eficiência. Vamos aprender a cortar o que é irrelevante, estruturar o que é v...

Laço for em C# a fundo: contagem regressiva, passos e for aninhado

Mascote do Devs na Prática pulando ao lado do título Laço for em C# a fundo

Resumo rápido

  • O for tem três partes: início, condição e passo, separadas por ;.
  • O passo não precisa ser i++: pode ser i--, i += 2 ou o que você quiser.
  • Contagem regressiva: comece alto, use i >= 0 e i--.
  • Para percorrer um array do fim para o começo, comece em Length - 1.
  • Um for dentro de outro passa por todas as combinações.
  • O erro mais comum é o "um a mais": <= onde deveria ser <.

No post Laços de repetição em C# você viu while, do while, for e foreach lado a lado. Aqui o foco é só o for, o laço que você mais vai usar quando sabe quantas vezes repetir, e os truques que ele permite.

As três partes do for

Mascote explicando as três partes do laço for

C#

for (int bala = 1; bala <= 3; bala++)
{
    Console.WriteLine($"Disparo {bala}");
}
Console.WriteLine("Pente vazio.");

Saída esperada

Disparo 1
Disparo 2
Disparo 3
Pente vazio.
ParteNo exemploQuando roda
inícioint bala = 1uma vez, antes de tudo
condiçãobala <= 3antes de cada volta; se for false, o laço acaba
passobala++depois de cada volta

A ordem real é: início → condição → corpo → passo → condição → corpo → passo... até a condição dar false. Na quarta checagem, bala vale 4, a condição falha e o programa segue para "Pente vazio".

Contagem regressiva

Mascote correndo da contagem regressiva de uma bomba

Para contar para trás, inverta tudo: comece no maior número, mantenha o laço enquanto for maior ou igual ao menor, e use --:

C#

for (int segundos = 5; segundos >= 1; segundos--)
{
    Console.WriteLine($"Bomba em {segundos}...");
}
Console.WriteLine("BOOM! Ainda bem que você correu.");

Saída esperada

Bomba em 5...
Bomba em 4...
Bomba em 3...
Bomba em 2...
Bomba em 1...
BOOM! Ainda bem que você correu.

Passos diferentes de 1

O passo pode ser qualquer conta. Com += 2 você pula de dois em dois; com *= 2, dobra a cada volta:

C#

Console.Write("Patrulha nas salas pares: ");
for (int sala = 0; sala <= 8; sala += 2)
{
    Console.Write($"{sala} ");
}
Console.WriteLine();

Console.Write("Zumbis a cada noite: ");
for (int zumbis = 1; zumbis <= 32; zumbis *= 2)
{
    Console.Write($"{zumbis} ");
}
Console.WriteLine();

Saída esperada

Patrulha nas salas pares: 0 2 4 6 8
Zumbis a cada noite: 1 2 4 8 16 32

Percorrendo um array de trás para frente

O último índice de um array é Length - 1. Começando dali e descendo até 0, você lê a mochila do fim para o começo, como uma pilha:

C#

string[] mochila = { "lanterna", "erva", "pistola", "mapa" };

for (int i = mochila.Length - 1; i >= 0; i--)
{
    Console.WriteLine($"[{i}] {mochila[i]}");
}

Saída esperada

[3] mapa
[2] pistola
[1] erva
[0] lanterna

Esse é um dos motivos para escolher for em vez de foreach: o foreach só anda para frente, e o for te dá o índice e a direção.

for aninhado: todas as combinações

Um for dentro de outro roda o de dentro inteiro para cada volta do de fora. Serve para grades, tabelas e combinações:

C#

string[] armas = { "Faca", "Pistola" };
string[] alvos = { "Zumbi", "Cão" };

for (int a = 0; a < armas.Length; a++)
{
    for (int b = 0; b < alvos.Length; b++)
    {
        Console.WriteLine($"{armas[a]} contra {alvos[b]}");
    }
}

Saída esperada

Faca contra Zumbi
Faca contra Cão
Pistola contra Zumbi
Pistola contra Cão

São 2 armas × 2 alvos = 4 linhas. Cuidado com o tamanho: 1.000 × 1.000 já dá um milhão de voltas. Para desenhar mapas em grade, veja o post de matrizes em C#.

break e continue dentro do for

C#

int[] portas = { 0, 0, 2, 0, 1, 0 };   // 0 = vazia, 2 = zumbi, 1 = saída

for (int i = 0; i < portas.Length; i++)
{
    if (portas[i] == 2)
    {
        Console.WriteLine($"Porta {i}: zumbi! Pulando esta.");
        continue;   // vai direto para a próxima volta
    }
    if (portas[i] == 1)
    {
        Console.WriteLine($"Porta {i}: SAÍDA encontrada!");
        break;      // encerra o laço
    }
    Console.WriteLine($"Porta {i}: vazia.");
}

Saída esperada

Porta 0: vazia.
Porta 1: vazia.
Porta 2: zumbi! Pulando esta.
Porta 3: vazia.
Porta 4: SAÍDA encontrada!

A porta 5 nem é visitada: o break acabou com o laço ao achar a saída.

Erros comuns

Mascote surpreso com o erro de um a mais no laço for

1. O erro do "um a mais" (off-by-one). É o bug mais famoso do for. Com <=, o laço tenta acessar um índice que não existe:

C#

string[] mochila = { "lanterna", "erva", "pistola" };
for (int i = 0; i <= mochila.Length; i++)   // i chega a 3
    Console.WriteLine(mochila[i]);           // IndexOutOfRangeException

Para arrays, a regra é sempre i = 0 e i < Length.

2. Laço infinito. for (int i = 10; i > 0; i++) nunca termina: o i sobe, e a condição continua verdadeira. O passo precisa andar na direção que faz a condição ficar falsa.

3. Ponto e vírgula depois do for. for (int i = 0; i < 3; i++); com ; no fim roda um laço vazio, e o bloco abaixo executa uma vez só.

4. Mudar o contador dentro do corpo. Mexer em i dentro do laço deixa o comportamento difícil de prever. Se precisa disso, um while costuma ser mais claro.

DESAFIO

Tente resolver antes de abrir a resposta. Sobreviveu? Vá para o próximo.

  1. Escreva um for que mostre 10, 20, 30, 40 e 50.

    Ver resposta

    for (int i = 10; i <= 50; i += 10) Console.WriteLine(i);

  2. Quantas vezes roda o corpo de for (int i = 0; i < 12; i += 3)?

    Ver resposta

    4 vezes: com i valendo 0, 3, 6 e 9. No 12 a condição falha.

  3. Num for aninhado com 3 voltas no de fora e 5 no de dentro, quantas vezes roda o corpo de dentro?

    Ver resposta

    15 vezes (3 × 5).

  4. Corrija: for (int i = 1; i <= mochila.Length; i++) Console.WriteLine(mochila[i]);

    Ver resposta

    for (int i = 0; i < mochila.Length; i++). Começa em 0 e para antes do Length, senão pula o primeiro item e estoura no último.

Conclusão

Com as três partes do for sob controle, você conta para frente, para trás, de dois em dois, percorre arrays do fim para o começo e combina listas com laços aninhados. E sabendo do "um a mais", já escapa do bug que derruba muito iniciante.

📖 Volte ao panorama: Laços de repetição em C#: while, do while, for e foreach.

Comentários

Postagens mais visitadas deste blog

Classes e objetos em C#: criando o seu personagem do jeito certo

Console.WriteLine e Console.ReadLine em C#: conversando com o jogador

Modificadores de acesso em C#: public, private, protected e internal