Capitulo 7 - Decisão Encadeada

[1]Copyright © 2026 Alyce Suza.

Condições complexas e casos práticos de aninhamento lógico

7.1 Decisões dentro de Decisões: Aninhamento

A construção de algoritmos robustos frequentemente exige que uma decisão só seja tomada se uma condição anterior já tiver sido validada e aceita pelo sistema. É perfeitamente possível colocar uma estrutura condicional inteira dentro do bloco de execução de outra estrutura condicional. Esta técnica é tecnicamente conhecida como aninhamento ou nesting. Neste modelo arquitetural, cada bloco condicional interno só é avaliado pelo processador se, e somente se, o bloco condicional externo for atestado como verdadeiro. Caso a condição externa seja falsa, o computador ignora completamente a existência do bloco interno, economizando processamento e evitando erros lógicos de execução prematura.

se (condicao_externa)
{
    se (condicao_interna)
    {
        // bloco executado apenas quando AMBAS as condicoes sao verdadeiras
    }
    senao
    {
        // bloco executado quando a externa e verdadeira, mas a interna e falsa
    }
}
senao
{
    // bloco executado quando a externa e falsa (a interna nunca chega a ser avaliada)
}

Um exemplo clássico desta aplicação ocorre na validação acadêmica que depende de dois fatores excludentes, como a frequência e a nota técnica. O problema define que um aluno é automaticamente reprovado se acumular mais de quinze faltas, tornando a verificação da sua nota um passo completamente inútil e desnecessário neste cenário. O sistema deve verificar a nota do aluno apenas se a barreira da frequência tiver sido ultrapassada com sucesso.

programa
{
    funcao inicio()
    {
        real nota
        inteiro faltas

        escreva("Nota: ") leia(nota)
        escreva("Faltas: ") leia(faltas)

        // Primeira verificacao restrita bloqueando pela frequencia
        se (faltas > 15)
        {
            escreva("REPROVADO por falta.\n")
            escreva("Voce teve ", faltas, " faltas (maximo permitido: 15).\n")
        }
        senao
        {
            // O sistema so verifica a nota se o aluno passou na avaliacao de frequencia
            se (nota >= 6.0)
            {
                escreva("APROVADO! Nota: ", nota, " | Faltas: ", faltas, "\n")
            }
            senao
            {
                escreva("REPROVADO por nota. Nota: ", nota, " (minimo exigido: 6.0)\n")
            }
        }
    }
}

7.2 Usando Operadores Lógicos para Simplificar

A complexidade visual de um código cresce exponencialmente a cada novo nível de aninhamento adicionado, dificultando a manutenção e a leitura lógica por parte do programador. Em muitos casos práticos, as decisões profundamente aninhadas podem ser reescritas e achatadas utilizando os operadores lógicos devidamente combinados. Esta refatoração torna o código infinitamente mais conciso, legível e direto ao ponto, eliminando a necessidade de ler múltiplas chaves de abertura e fechamento para compreender a regra de negócio.

// Versao construida com aninhamento estrutural (muito mais verbosa e profunda)
se (idade >= 18)
  se (possuiDocumento)
    escreva("Pode votar com seguranca!")
  senao
    escreva("Obrigatorio apresentar documento original.")

// Versao refatorada com o operador logico (substancialmente mais concisa)
se (idade >= 18 e possuiDocumento)
  escreva("Pode votar com seguranca!")

A validação matemática para a existência de um triângulo perfeito é um excelente cenário para aplicar esta simplificação. A geometria dita que, para formar um triângulo válido, cada lado isolado deve ser obrigatoriamente menor que a soma dos outros dois lados restantes. Podemos resolver este problema avaliando todas as premissas em uma única linha de comando unificada.

programa
{
    funcao inicio()
    {
        real a, b, c

        escreva("Insira o Lado A: ") leia(a)
        escreva("Insira o Lado B: ") leia(b)
        escreva("Insira o Lado C: ") leia(c)

        // A premissa basica exige que os tres lados fornecidos sejam positivos
        se (a <= 0 ou b <= 0 ou c <= 0)
        {
            escreva("Erro logico: Os lados de um poligono devem ser estritamente positivos!\n")
        }
        // Verificacao unificada atestando se as medidas formam um triangulo real
        senao se ((a + b > c) e (a + c > b) e (b + c > a))
        {
            escreva("Validacao: A figura geometrica e um triangulo valido!\n")

            // Subclassificacao do tipo de triangulo encontrado
            se (a == b e b == c)
            {
                escreva("Classificacao: EQUILATERO (contem os tres lados matematicamente iguais)\n")
            }
            senao se (a == b ou b == c ou a == c)
            {
                escreva("Classificacao: ISOSCELES (contem exatamente dois lados iguais)\n")
            }
            senao
            {
                escreva("Classificacao: ESCALENO (contem os tres lados completamente diferentes)\n")
            }
        }
        senao
        {
            escreva("Validacao: As proporcoes informadas nao formam um triangulo.\n")
        }
    }
}

Podemos utilizar a mesma arquitetura lógica escalonada para construir um sistema completo de classificação de Índice de Massa Corporal. A primeira barreira impede que valores negativos absurdos corrompam o sistema, e a sequência encadeada garante que o paciente seja classificado na categoria médica correta sem risco de sobreposição de diagnósticos.

programa
{
    funcao inicio()
    {
        real peso, altura, imc

        escreva("Massa corporal em kg: ") leia(peso)
        escreva("Altura vertical em metros: ") leia(altura)

        se (peso <= 0 ou altura <= 0)
        {
            escreva("Alerta: Os valores parametricos inseridos sao invalidos!\n")
        }
        senao
        {
            imc = peso / (altura * altura)
            escreva("Registro de IMC calculado: ", imc, "\n")

            se (imc < 18.5)       { escreva("Diagnostico: Abaixo do peso basal\n") }
            senao se (imc < 25.0) { escreva("Diagnostico: Peso considerado normal\n") }
            senao se (imc < 30.0) { escreva("Diagnostico: Categoria de Sobrepeso\n") }
            senao se (imc < 35.0) { escreva("Diagnostico: Nivel de Obesidade Grau I\n") }
            senao se (imc < 40.0) { escreva("Diagnostico: Nivel de Obesidade Grau II\n") }
            senao                 { escreva("Diagnostico: Nivel de Obesidade Grau III\n") }
        }
    }
}

7.3 Exercícios do Capítulo 7

Exercício 7.1: Aprovação condicionada à frequência Leia a nota decimal e o número inteiro de faltas acumuladas de um aluno em um semestre letivo.

Aplique rigorosamente as regras da instituição estabelecendo que um registro maior que quinze faltas gera reprovação automática por ausência, tornando a nota irrelevante para o cálculo final. Apenas para os casos em que a frequência estiver dentro do aceitável, o sistema deve validar a nota exigindo uma marca igual ou superior a seis pontos para consolidar a aprovação definitiva. Exiba a situação final do aluno acompanhada do respectivo motivo limitante.

Dica técnica: O algoritmo deve sempre verificar as faltas no primeiro estágio, visto que a reprovação por limite de faltas é o critério mais grave e excludente deste cenário de negócio.

Exercício 7.2: Sistema de desconto escalonado por faixa Leia o valor financeiro bruto de uma compra comercial no balcão.

Aplique uma política de benefícios distribuindo os descontos da seguinte forma. Valores estritamente superiores a dois mil reais recebem um corte de trinta por cento. Valores acima de mil reais ganham vinte por cento. Valores passando da marca de quinhentos reais garantem dez por cento. O restante das transações não recebe qualquer tipo de subsídio.

Exiba no console de forma formatada o percentual exato alcançado, o valor monetário do desconto calculado e o montante final líquido a pagar no caixa. Construa os testes validando sempre da maior barreira para a menor, evitando que o fluxo caia prematuramente em faixas mais permissivas.

Exercício 7.3: Verificação de ano bissexto Leia um ano em formato inteiro e verifique com precisão matemática se ele se enquadra na regra do ano bissexto do nosso calendário.

A regra oficial determina que um ano é bissexto caso seja perfeitamente divisível por quatro, e simultaneamente não seja divisível por cem, a menos que consiga ser divisível por quatrocentos.

Exiba na tela a confirmação lógica da validação e informe automaticamente quantos dias o mês de fevereiro tem especificamente no ano consultado. Utilize uma variável lógica para unificar toda a expressão em uma única avaliação limpa e eficiente.

Gabarito do Capítulo 7

Gabarito do Exercício 7.1 A resolução correta posiciona a restrição de assiduidade como o primeiro escudo estrutural do sistema. Ao isolar a checagem de faltas logo no topo, evitamos que um aluno reprovado por abandono acabe recebendo uma mensagem conflitante elogiando a sua nota teórica na prova final.

programa
{
    funcao inicio()
    {
        real nota
        inteiro faltas
        escreva("Digite a Nota registrada: ") leia(nota)
        escreva("Digite as Faltas contadas: ") leia(faltas)
        
        se (faltas > 15)
        {
            escreva("Decisao: REPROVADO sumariamente por falta excessiva. Faltas totais: ", faltas, "\n")
        }
        senao
        {
            se (nota >= 6.0) { escreva("Decisao: APROVADO com louvor! Nota alcancada: ", nota, "\n") }
            senao { escreva("Decisao: REPROVADO por baixo desempenho teorico. Nota final: ", nota, "\n") }
        }
    }
}

Esta arquitetura comprova o valor prático do aninhamento funcional. Se as faltas passam de quinze unidades, o computador crava a reprovação imediata e abandona o fluxo de análise de notas sem desperdiçar recursos preciosos.

Gabarito do Exercício 7.2 A leitura do código flui invariavelmente da condição mais restritiva para a mais genérica. Se o programador inverte a ordem e tenta testar o corte de quinhentos reais no primeiro bloco, uma compra monumental de dez mil reais passaria nesse teste primário recebendo reles dez por cento de desconto de forma totalmente injusta e falha.

programa
{
    funcao inicio()
    {
        real compra, perc = 0, desc, final
        escreva("Insira o Valor total do pedido: R$ ") leia(compra)
        
        se (compra > 2000) { perc = 0.30 escreva("Faixa de Desconto Master de 30% liberada\n") }
        senao se (compra > 1000) { perc = 0.20 escreva("Faixa de Desconto Premium de 20% liberada\n") }
        senao se (compra > 500) { perc = 0.10 escreva("Faixa de Desconto Basico de 10% liberada\n") }
        senao { escreva("Sem enquadramento para politicas de desconto no momento\n") }
        
        desc = compra * perc
        final = compra - desc
        escreva("Apuracao do Desconto gerado: R$ ", desc, "\nApuracao do Valor Final devido: R$ ", final, "\n")
    }
}

Ao preencher variáveis intermediárias em vez de calcular diretamente as saídas dentro de cada bloco condicional, o código alcança um grau altíssimo de limpeza, permitindo que as equações de decréscimo e a rotina de exibição ocorram centralizadas apenas uma vez na cauda final do programa principal.

Gabarito do Exercício 7.3 A conversão de leis complexas do mundo real para sentenças matemáticas diretas requer atenção estrita à precedência lógica ditada pelo uso de parênteses. Agrupar as restrições que envolvem conectivos de disjunção assegura que a checagem secular de anos fechados, como o ano de 1900, funcione de maneira inquestionável.

programa
{
    funcao inicio()
    {
        inteiro ano
        escreva("Forneca o Ano civil para analise tecnica: ") leia(ano)
        
        logico bis = (ano % 4 == 0) e (nao (ano % 100 == 0) ou (ano % 400 == 0))
        
        se (bis) { escreva(ano, " e validado como ano bissexto real. O mes de Fevereiro tem exatos 29 dias.\n") }
        senao { escreva(ano, " nao e um ano bissexto. O mes de Fevereiro tem os tradicionais 28 dias.\n") }
    }
}

Testando limites conhecidos, o ano 2024 passa livremente no filtro como ano bissexto. O ano 1900 fracassa pois esbarra na divisão por cem sem compensar com a divisão por quatrocentos, enquanto o icônico ano 2000 valida o status superando todas as exigências deste algoritmo cronológico clássico.


  1. Copyright © 2026 Alyce Suza. Todos os direitos reservados nos termos da Lei 9.610/98. O conteúdo publicado no site https://wiki.suzacybersecurity.com/ é protegido pelas diretrizes brasileiras de propriedade intelectual e a sua autoria é reconhecida desde o momento da criação técnica. O compartilhamento, a reprodução e a distribuição deste material são permitidos e incentivados apenas para finalidades educacionais, acadêmicas ou de consulta técnica, sendo estritamente vedado qualquer tipo de uso comercial. Para que a replicação seja validada e legal, você deve obrigatoriamente atribuir os devidos créditos a Alyce Suza e fornecer um link direto e acessível para a publicação original. A utilização deste material para obter lucro, monetização, venda de materiais ou qualquer vantagem financeira constitui violação de direitos autorais e está sujeita às sanções legais cabíveis, assim como alterações que modifiquem o sentido original das explicações sobre segurança da informação. Para eventuais dúvidas sobre permissões de uso, parcerias ou para reportar replicações indevidas, envie um e-mail para alycesuza@gmail.com. ↩︎