💻 Exemplos: Capítulo 03: Estruturas de Controle e Laços de Repetição

Especialização em Sistemas com Rust • Demonstrações Práticas Compiláveis


🎯 Objetivo dos Exemplos

Demonstrar que estruturas de controle em Rust são expressões avaliadas que produzem valores, utilização do loop com retorno de valor via break valor, laços rotulados (labeled loops) e laços for idiomáticos com ranges e coleções.


1. Código Fonte Completo (src/main.rs)

//! Demonstração de Estruturas de Decisão e Loops Idiomáticos em Rust

fn main() {
    println!("=== CONTROLE DE FLUXO DETERMINÍSTICO ===");

    // 1. if/else como Expressão (Ternário Nativo do Rust)
    let carga_cpu = 78.5;
    let nivel_alerta = if carga_cpu > 85.0 {
        "CRÍTICO"
    } else if carga_cpu > 70.0 {
        "ALERTA"
    } else {
        "NORMAL"
    };
    println!("Status da CPU ({:.1}%): [{}]", carga_cpu, nivel_alerta);

    // 2. Loop Infinito com Retorno de Valor pelo break
    let mut tentativas = 0;
    let token_acesso = loop {
        tentativas += 1;
        if tentativas == 3 {
            // break com valor produz o resultado da expressão loop
            break format!("AUTH_TOKEN_0x{:04X}", tentativas * 4096);
        }
    };
    println!("Token gerado após {} tentativas: {}", tentativas, token_acesso);

    // 3. Laços Rotulados (Loop Labels) para quebra de múltiplos níveis
    let mut matriz_varrida = 0;
    'varredura_externa: for x in 0..4 {
        for y in 0..4 {
            matriz_varrida += 1;
            if x == 2 && y == 1 {
                println!("Condição de parada encontrada nas coordenadas ({}, {}). Encerrando laço externo!", x, y);
                break 'varredura_externa; // Interrompe o loop externo identificado pelo rótulo
            }
        }
    }
    println!("Total de iterações executadas antes da quebra: {}", matriz_varrida);

    // 4. Laço While Condicional
    let mut pressao_bar = 5;
    println!("\nDespressurizando câmara:");
    while pressao_bar > 0 {
        print!("{} bar... ", pressao_bar);
        pressao_bar -= 1;
    }
    println!("Vácuo estabelecido!");

    // 5. Laço For Idiomático com Ranges e Iteradores Reversos
    println!("\nContagem regressiva de ignição com range reverso:");
    for segundo in (1..=3).rev() {
        println!("T-minus {}s", segundo);
    }
    println!("🚀 Decolagem!");

    // 6. Iteração segura sobre elementos de coleção
    let sensores = ["TEMP_01", "PRESS_02", "FLOW_03"];
    println!("\nLeitura de sensores com índice e valor:");
    for (indice, sensor) in sensores.iter().enumerate() {
        println!("Canal [{}] -> Sensor ativo: {}", indice, sensor);
    }
}

2. Saída Esperada no Terminal

=== CONTROLE DE FLUXO DETERMINÍSTICO ===
Status da CPU (78.5%): [ALERTA]
Token gerado após 3 tentativas: AUTH_TOKEN_0x3000
Condição de parada encontrada nas coordenadas (2, 1). Encerrando laço externo!
Total de iterações executadas antes da quebra: 10

Despressurizando câmara:
5 bar... 4 bar... 3 bar... 2 bar... 1 bar... Vácuo estabelecido!

Contagem regressiva de ignição com range reverso:
T-minus 3s
T-minus 2s
T-minus 1s
🚀 Decolagem!

Leitura de sensores com índice e valor:
Canal [0] -> Sensor ativo: TEMP_01
Canal [1] -> Sensor ativo: PRESS_02
Canal [2] -> Sensor ativo: FLOW_03