Capitulo 6 - Estruturas de Decisão

[1]Copyright © 2026 Alyce Suza.

Comandos se, senao e escolha-caso com exemplos completos aplicados

6.1 Por que Precisamos Tomar Decisões?

Até este momento, nossos programas executavam estritamente os mesmos passos em uma sequência linear, independente dos dados inseridos. É evidente para quem sente na pele o desenvolvimento de software que programas engessados não servem para o mundo real, pois precisamos que a máquina reaja de forma diferente diante de situações diferentes. Esta capacidade de adaptação vem inteiramente das estruturas de decisão, também conhecidas como desvios condicionais. Em 1966, o Teorema de Böhm-Jacopini comprovou matematicamente que qualquer algoritmo existente pode ser expresso usando apenas três estruturas fundamentais, sendo elas a sequência, a decisão e a repetição. As decisões são, portanto, imprescindíveis para a inteligência de qualquer código.

Böhm e Jacopini (1966) "Qualquer programa pode ser escrito usando apenas três estruturas de controle: sequência, seleção (decisão) e iteração (repetição). Esta é a base absoluta da programação estruturada."

Corrado Böhm e Giuseppe Jacopini. Flow Diagrams, Turing Machines and Languages with Only Two Formation Rules. Communications of the ACM, 1966.

6.2 Estrutura se: Decisão Simples

A estrutura simples executa um bloco de instruções isolado somente se uma condição específica for avaliada como verdadeira. Se a condição for falsa, o computador ignora completamente o bloco inteiro e o programa continua sua execução natural na instrução seguinte.

se (condicao)
{
    // instrucoes executadas SE a condicao for VERDADEIRA
}

// Exemplos praticos rapidos:
se (nota >= 6.0) { escreva("Aprovado") }

se (temperatura > 35)
{
    escreva("Calor intenso! Beba agua.\n")
}

Neste exemplo completo validando um número positivo, note como a mensagem final de encerramento é exibida sempre, pois ela reside fora da jurisdição do bloco condicional.

programa
{
    funcao inicio()
    {
        inteiro numero

        escreva("Digite um numero: ")
        leia(numero)

        // O bloco so executa se a condicao for estritamente verdadeira
        se (numero > 0)
        {
            escreva("O numero ", numero, " e positivo.\n")
        }

        // Este escreva executa SEMPRE pois esta fora do bloco se
        escreva("Programa encerrado.\n")
    }
}

6.3 Estrutura se-senao: Decisão Composta

A estrutura composta permite definir com precisão o que acontece tanto quando a condição é verdadeira utilizando o bloco do se, quanto quando ela é falsa utilizando o bloco do senao. O computador garante que sempre um dos dois blocos será executado obrigatoriamente, sendo impossível executar os dois ao mesmo tempo ou ignorar ambos.

se (condicao)
{
    // executado apenas quando a condicao e VERDADEIRA
}
senao
{
    // executado apenas quando a condicao e FALSA
}

O exemplo abaixo demonstra a verificação clássica de aprovação escolar. O fluxo de dados só possui dois caminhos lógicos possíveis baseados na nota informada pelo usuário.

programa
{
    funcao inicio()
    {
        real nota
        escreva("Nota do aluno: ")
        leia(nota)

        se (nota >= 6.0)
        {
            escreva("APROVADO! Parabens, sua nota foi ", nota, "\n")
        }
        senao
        {
            escreva("REPROVADO. Sua nota foi ", nota, ". Necessario >= 6.0\n")
        }
    }
}

A mesma lógica binária se aplica perfeitamente para validar uma idade legal, calculando inclusive o tempo faltante caso a condição principal não seja atendida.

programa
{
    funcao inicio()
    {
        inteiro idade
        escreva("Sua idade: ")
        leia(idade)

        se (idade >= 18)
        {
            escreva("Maior de idade. Pode votar!\n")
        }
        senao
        {
            escreva("Menor de idade. Faltam ", 18 - idade, " anos.\n")
        }
    }
}

O processamento matemático para descobrir se um número é par ou ímpar depende inteiramente da análise do resto da divisão. O operador de módulo resolve o dilema criando as duas vias de execução exatas.

programa
{
    funcao inicio()
    {
        inteiro numero
        escreva("Digite um numero inteiro: ")
        leia(numero)

        // O operador % retorna o RESTO absoluto da divisao
        // Se o resto de numero/2 for zero o numero e par
        se (numero % 2 == 0)
        {
            escreva(numero, " e PAR.\n")
        }
        senao
        {
            escreva(numero, " e IMPAR.\n")
        }
    }
}

6.4 Estrutura se-senao se: Múltiplas Condições

Quando lidamos com cenários complexos que possuem mais de duas alternativas, nós encadeamos vários blocos senao se. O programa verifica pacientemente as condições na ordem exata em que foram escritas e executa apenas o primeiro bloco cuja condição seja verdadeira, ignorando sumariamente todos os demais blocos subsequentes daquela mesma cadeia estrutural.

Eu vejo muitos iniciantes caindo na armadilha de ignorar a ordem lógica dessa ferramenta. A ordem importa profundamente. Você deve sempre começar estruturando a condição mais restritiva e exigente no topo. Se você tentar verificar uma nota maior que seis antes de verificar uma nota maior que nove, o aluno que gabaritou a prova cairá prematuramente na regra do seis e será classificado com conceito regular, gerando um erro silencioso na sua aplicação. O raciocínio correto exige compreender que ao chegar na terceira verificação de uma cascata, o compilador já sabe previamente que as duas condições anteriores falharam.

programa
{
    funcao inicio()
    {
        real nota
        escreva("Nota (0 a 10): ")
        leia(nota)

        // A condicao mais restritiva (>=9) deve vir primeiro obrigatoriamente!
        se (nota >= 9.0)
        {
            escreva("Conceito: EXCELENTE\n")
        }
        senao se (nota >= 7.0)
        {
            escreva("Conceito: BOM\n")
        }
        senao se (nota >= 6.0)
        {
            escreva("Conceito: REGULAR\n")
        }
        senao se (nota >= 0.0)
        {
            escreva("Conceito: INSUFICIENTE\n")
        }
        senao
        {
            escreva("Nota invalida inserida no sistema!\n")
        }
    }
}

Essa estrutura resolve facilmente conflitos matemáticos de múltiplas vias, como comparar dois números distintos tratando todas as possibilidades numéricas de forma independente, incluindo a eventualidade lógica de um empate técnico.

programa
{
    funcao inicio()
    {
        real a, b
        escreva("Primeiro numero: ") leia(a)
        escreva("Segundo numero: ")  leia(b)

        se (a > b)
        {
            escreva("O primeiro numero e maior.\n")
        }
        senao se (b > a)
        {
            escreva("O segundo numero e maior.\n")
        }
        senao
        {
            escreva("Os dois numeros sao matematicamente iguais.\n")
        }
    }
}

O processamento comercial de faixas de desconto opera sob o mesmo princípio. As faixas de maior valor aquisitivo exigem os maiores descontos e precisam interceptar a execução antes das faixas inferiores agirem.

programa
{
    funcao inicio()
    {
        real compra, percentual, desconto, total
        escreva("Valor da compra: R$ ") leia(compra)

        se (compra > 2000)
        {
            percentual = 0.30
            escreva("Desconto maximo de 30% garantido!\n")
        }
        senao se (compra > 1000)
        {
            percentual = 0.20
            escreva("Desconto otimo de 20% aplicado!\n")
        }
        senao se (compra > 500)
        {
            percentual = 0.10
            escreva("Desconto basico de 10% inserido!\n")
        }
        senao
        {
            percentual = 0
            escreva("Nenhum desconto disponivel nesta faixa.\n")
        }

        desconto = compra * percentual
        total = compra - desconto
        escreva("Desconto total: R$ ", desconto, "\n")
        escreva("Total a pagar no caixa: R$ ", total, "\n")
    }
}

6.5 Estrutura escolha-caso: Múltiplos Valores Específicos

Quando você precisa comparar uma mesma variável repetidamente contra vários valores fixos e específicos, a estrutura escolha-caso se prova muito mais limpa e eficiente do que construir um paredão infinito de condições encadeadas. Me impressiona como o uso incorreto dessa estrutura gera dores de cabeça gigantescas. A ausência do comando pare ao final de cada caso gera um bug clássico de vazamento de fluxo, onde o programa ignora os limites do bloco e continua executando os casos abaixo de forma indesejada. A única exceção profissional para omitir a parada é quando você intencionalmente deseja que múltiplos casos executem exatamente a mesma porção de código.

programa
{
    funcao inicio()
    {
        real a, b
        inteiro op

        escreva("=== CALCULADORA DE SISTEMA ===\n")
        escreva("1-Soma  2-Sub  3-Mult  4-Div\n")
        escreva("Opcao desejada: ") leia(op)
        escreva("Variavel A: ") leia(a)
        escreva("Variavel B: ") leia(b)

        escolha (op)
        {
            caso 1:
                escreva("Resultado processado: ", a + b, "\n")
                pare
            caso 2:
                escreva("Resultado processado: ", a - b, "\n")
                pare
            caso 3:
                escreva("Resultado processado: ", a * b, "\n")
                pare
            caso 4:
                se (b != 0) { escreva("Resultado processado: ", a / b, "\n") }
                senao { escreva("Erro critico: tentativa de divisao por zero!\n") }
                pare
            caso contrario:
                escreva("A opcao selecionada e invalida!\n")
        }
    }
}

A conversão rápida de numerais em textos padronizados é o cenário perfeito para aplicar esse mecanismo de forma visualmente limpa e direta.

programa
{
    funcao inicio()
    {
        inteiro dia
        escreva("Numero do dia comecando 1 no Domingo: ") leia(dia)

        escolha (dia)
        {
            caso 1: escreva("Domingo")   pare
            caso 2: escreva("Segunda")   pare
            caso 3: escreva("Terca")     pare
            caso 4: escreva("Quarta")    pare
            caso 5: escreva("Quinta")    pare
            caso 6: escreva("Sexta")     pare
            caso 7: escreva("Sabado")    pare
            caso contrario: escreva("O dia informado nao existe!")
        }
    }
}

6.6 Exercícios do Capítulo 6

Exercício 6.1: Verificar sinal do número Leia um número real inserido pelo usuário no console.

Informe processando os dados se o número é classificado como positivo, negativo ou exatamente zero.

Utilize uma estrutura encadeada de múltipla escolha para cobrir os três casos matemáticos sem deixar brechas lógicas.

Exercício 6.2: Verificar maioridade civil Leia a idade exata de uma pessoa no sistema.

Informe no console se a pessoa é maior de idade verificando a marca de dezoito anos.

Construa um bônus que informe dinamicamente quantos anos faltam para a maioridade caso a pessoa seja identificada como menor.

Exercício 6.3: Verificar número par ou ímpar Leia um número do tipo inteiro no formato padrão.

Processe os dados utilizando rigorosamente o operador de módulo matemático para separar o resto da divisão. Informe com precisão se o número inserido é par ou ímpar baseado exclusivamente nesse resto numérico.

Exercício 6.4: Sistema de aprovação básico Leia a nota técnica de um aluno variando de zero a dez.

Utilize o tipo real para permitir frações decimais justas como um sete e meio. Informe através de uma validação condicional se o status acadêmico do aluno resulta em aprovado para notas iguais ou superiores a seis, ou reprovado no cenário inverso.

Exercício 6.5: Sistema de desconto simples Leia o valor final de uma compra comercial no caixa.

Avalie com o operador relacional se o montante supera a marca de cem reais. Caso afirmativo, exiba a mensagem informando que o cliente ganhou um desconto, e na situação contrária afirme claramente que a compra ocorreu sem benefícios adicionais.

Exercício 6.6: Verificação de senha isolada Defina uma senha de segurança estritamente fixa e rígida no topo do código, armazenando o valor numérico em formato de cadeia de texto.

Leia a tentativa de senha digitada pelo usuário e compare os valores, negando duramente o acesso em caso de divergência ou liberando a entrada com sucesso mediante o acerto exato da chave de segurança inserida.

Exercício 6.7: Comparação entre dois números inteiros Leia isoladamente dois números preenchidos no console.

Informe processando os valores quem detém a superioridade numérica, e trate de forma absolutamente explícita o caso estatístico de um empate técnico total entre os dois elementos cadastrados pelo sistema, fechando todas as pontas do desvio lógico.

Exercício 6.8: Média acadêmica blindada Leia rigorosamente duas notas fornecidas por um aluno.

Calcule a média aritmética blindando com parênteses a operação de soma no numerador antes de ordenar a execução da divisão pelo número de provas. Informe de forma concisa o valor da média final e o respectivo status de aprovação ou reprovação atrelado à barreira acadêmica de nota seis.

Exercício 6.9: Classificação de notas estruturada Leia a nota oficial de um estudante no sistema da secretaria.

Classifique os conceitos operando a mecânica de restrição exata, indo da excelência absoluta com notas superiores a nove até a insuficiência abaixo de seis. Exiba formatado na tela não apenas o conceito alfabético obtido, mas a tradução direta do status de aprovação ou fracasso naquele período avaliado.

Exercício 6.10: Calculadora completa flexível Leia simultaneamente dois números reais e armazene um caractere indicando o operador matemático desejado, operando com adição, subtração, multiplicação e divisão.

Calcule o resultado final direcionando o fluxo com a estrutura de escolha de múltiplos valores. Trate de forma cirúrgica e isolada o erro fatal de divisão por zero antes de acionar a equação, protegendo a integridade sistêmica da execução.

Gabarito do Capítulo 6

Gabarito do Exercício 6.1 A resolução exige três casos muito bem delineados envolvendo números maiores que zero, números menores que zero, e a âncora fixada de zero absoluto. O encadeamento de desvios cobre de forma majestosa todas as hipóteses matemáticas.

programa
{
    funcao inicio()
    {
        real numero
        escreva("Digite um Numero real: ") leia(numero)
        
        se (numero > 0) { escreva("Resultado logico: Numero classificado como positivo\n") }
        senao se (numero < 0) { escreva("Resultado logico: Numero classificado como negativo\n") }
        senao { escreva("Resultado logico: O numero cravou o zero absoluto\n") }
    }
}

O terceiro e último caso não precisa de uma verificação explícita do valor, pois ele captura exatamente o que sobrou matematicamente pelo descarte das condições anteriores, servindo de rede de contenção perfeita.

Gabarito do Exercício 6.2 A condição de maioridade no ordenamento se resume de forma simples a uma comparação inclusiva baseada em dezoito anos. Usar uma decisão composta simples resolve o dilema de forma elegante e ainda permite realizar o cálculo regressivo de idade tranquilamente.

programa
{
    funcao inicio()
    {
        inteiro idade
        escreva("Insira sua idade cronologica exata: ") leia(idade)
        
        se (idade >= 18)
        {
            escreva("Validacao: Usuario caracterizado como Maior de idade\n")
        }
        senao
        {
            escreva("Validacao: Usuario caracterizado como Menor de idade\n")
            escreva("Estimativa: Faltam rigorosamente ", 18 - idade, " anos matematicos para atingir a maioridade.\n")
        }
    }
}

Um teste validando dezenove anos ignora o fluxo falso perfeitamente, e inserindo dezesseis anos o código acusa corretamente a barreira faltante de dois anos para atingir a idade legal definida na regra de negócio da aplicação.

Gabarito do Exercício 6.3 O uso cirúrgico do operador de resto de divisão funciona perfeitamente separando a natureza das engrenagens numéricas, testando ativamente o resto residual e validando a classificação entre números com metades inteiras e os números ímpares não absolutos.

programa
{
    funcao inicio()
    {
        inteiro numero
        escreva("Informe um Numero inteiro simples: ") leia(numero)
        
        se (numero % 2 == 0)
        {
            escreva("O valor computado ", numero, " atende aos requisitos de numero par\n")
        }
        senao
        {
            escreva("O valor computado ", numero, " atende aos requisitos de numero impar\n")
        }
    }
}

Testar o comportamento matemático do zero comprova que o resto da divisão de zero é logicamente zero, confirmando estruturalmente que ele entra no bloco par com extrema solidez lógica em sua execução nativa.

Gabarito do Exercício 6.4 A decisão é absurdamente simples lidando com o ponto de corte do seis absoluto. A declaração do formato real salva os professores de engessar o sistema quando precisam pontuar um excelente e muito bem-vindo sete e meio na prancheta escolar de um candidato de mérito.

programa
{
    funcao inicio()
    {
        real nota
        escreva("Digite a Nota geral do aluno variando de 0 a 10: ") leia(nota)
        
        se (nota >= 6.0)
        {
            escreva("Status Academico do semestre: Plenamente Aprovado\n")
        }
        senao
        {
            escreva("Status Academico do semestre: Duramente Reprovado\n")
        }
    }
}

Ao processar um número com marcação estrita de seis pontos, o sistema entra invariavelmente no bloco de aprovação pois o sinal relacional abraça a igualdade em seu núcleo de forma explícita e irrevogável perante o compilador executivo.

Gabarito do Exercício 6.5 O mecanismo compara ativamente o valor injetado no sistema com a baliza de cem reais líquidos, sendo o símbolo direcional de maior focado estritamente na ultrapassagem, ignorando clientes que compraram exatamente cem reais sem exceder a meta financeira proposta nas regras da promoção lojista vigente.

programa
{
    funcao inicio()
    {
        real valorCompra
        escreva("Informe o Valor total computado na compra: R$ ") leia(valorCompra)
        
        se (valorCompra > 100)
        {
            escreva("Notificacao oficial: Este cliente conquistou um beneficio de desconto util\n")
        }
        senao
        {
            escreva("Notificacao oficial: Esta transacao de compra prossegue sem beneficios atrelados\n")
        }
    }
}

Com cem reais exatos, o algoritmo desvia e nega sumariamente o desconto pois não houve a superação formal da casa monetária estabelecida como piso regulatório comercial exigido na checagem estrita da condição de entrada.

Gabarito do Exercício 6.6 Estruturar a senha engessada no tipo cadeia e compará-la isoladamente resolve o desafio base de verificação condicional binária. Isso cria a proteção essencial bloqueando todas as investidas inconsistentes.

programa
{
    funcao inicio()
    {
        const cadeia SENHA_MATRIZ = "1234"
        cadeia digitada
        escreva("Insira sua Senha de autorizacao: ") leia(digitada)
        
        se (digitada == SENHA_MATRIZ)
        {
            escreva("Confirmacao de seguranca: Acesso livre e irrestrito permitido\n")
        }
        senao
        {
            escreva("Confirmacao de seguranca: Senha corrompida indicando tentativa invalida\n")
        }
    }
}

Para garantir uma cultura sadia nas rotinas de programação prática de alto calibre, não se deve de forma alguma armazenar senhas sensíveis expostas em código plano e visível em ambientes corporativos reais sob nenhuma justificativa trivial de conforto pontual de leitura.

Gabarito do Exercício 6.7 Uma malha dividida categoricamente em três vias exatas protege todos os caminhos concebíveis onde uma variável A tenta se sobrepor a B ou vice-versa, enquanto segura a onda blindando o caso frequente em que dois dados idênticos trombam no sistema interno causando confusões operacionais severas em cenários mal modelados.

programa
{
    funcao inicio()
    {
        real a, b
        escreva("Informe o Primeiro numero: ") leia(a)
        escreva("Informe o Segundo numero: ") leia(b)
        
        se (a > b) { escreva("Validacao: O bloco atesta que o primeiro numero retem o valor maior\n") }
        senao se (b > a) { escreva("Validacao: O bloco atesta que o segundo numero assume a lideranca maior\n") }
        senao { escreva("Validacao: Os dois algoritmos coincidem garantindo que ambos sao valores iguais\n") }
    }
}

Sempre modelar o tratamento ostensivo para cenários paralelos de igualdade no fluxo consolida boas práticas e forma programadores aptos que preveem comportamentos e constroem barreiras robustas sem remendos fracos no sistema original elaborado.

Gabarito do Exercício 6.8 O uso compulsório da barreira de parênteses altera a regra orgânica da prioridade nativa exigindo a fusão prévia das variáveis antes que a navalha da divisão encerre a computação, evitando falhas cruéis de cálculo acadêmico no boletim final emitido a um pobre candidato em fase de exames decisivos escolares rigorosos.

programa
{
    funcao inicio()
    {
        real nota1, nota2, media
        escreva("Registre a Nota 1 exata: ") leia(nota1)
        escreva("Registre a Nota 2 exata: ") leia(nota2)
        
        media = (nota1 + nota2) / 2
        escreva("Media calculada global: ", media, "\n")
        
        se (media >= 6.0)
        {
            escreva("Conclusao formal: Candidato plenamente Aprovado\n")
        }
        senao
        {
            escreva("Conclusao formal: Candidato categoricamente Reprovado\n")
        }
    }
}

Omitir intencionalmente o parêntese faria uma conta como nota um somada com a fatia cortada pela metade da nota dois, ferindo a lei da média aritmética regular gerando revolta e caos no departamento letivo inteiro da instituição envolvida diretamente nos trâmites de avaliação.

Gabarito do Exercício 6.9 A validação exige começar filtrando do topo magnético que puxa a excelência máxima da nota nove superior e seguir pacientemente afunilando os níveis decadentes em escala hierárquica severa até o fundo reprovativo, salvando a consistência lógica.

programa
{
    funcao inicio()
    {
        real nota
        escreva("Insira no banco a Nota especifica: ") leia(nota)
        
        se (nota >= 9.0)      { escreva("Classificacao: Excelente vinculada ao status de Aprovado\n") }
        senao se (nota >= 7.0) { escreva("Classificacao: Bom vinculado ao status de Aprovado\n") }
        senao se (nota >= 6.0) { escreva("Classificacao: Regular vinculado ao status fragil de Aprovado\n") }
        senao                   { escreva("Classificacao: Insuficiente tracionando dolorosamente para Reprovado\n") }
    }
}

Se o programa subvertesse a ordem validando o piso de seis pontos na largada ignorando o teto numérico, um majestoso conceito superior como nove seria sugado prematuramente na rampa regular destruindo o prestígio alcançado genuinamente nas provas escolares submetidas e avaliadas.

Gabarito do Exercício 6.10 Isolar a chave primária baseada na entrada minuciosa de um caracter permite moldar caminhos rápidos que executam as contas requisitadas sem atritos condicionados absurdos, barrando preventivamente divisores nulos para não rasgar a base algorítmica.

programa
{
    funcao inicio()
    {
        real a, b
        caracter op
        escreva("Alvo A numerico: ") leia(a)
        escreva("Opcao matematica designada pelo simbolo (+,-,*,/): ") leia(op)
        escreva("Alvo B numerico: ") leia(b)
        
        escolha (op)
        {
            caso '+': escreva("Soma exata: ", a+b, "\n") pare
            caso '-': escreva("Subtracao exata: ", a-b, "\n") pare
            caso '*': escreva("Multiplicacao exata: ", a*b, "\n") pare
            caso '/': 
                se(b != 0) { escreva("Divisao exata: ", a/b, "\n") }
                senao { escreva("Aviso fatal: Fracasso eminente ao exigir divisao insensata por zero\n") } 
                pare
            caso contrario: escreva("Sinal operador rejeitado por total irregularidade de padrao inserido\n")
        }
    }
}

O bloco estruturado enquadrando cada via em chaves isoladas usando o parêntese simplificado ampara todo o fluxo complexo, enquanto a parada compulsória tranca o caso bloqueando um derretimento no compilador processando chaves alheias ao contexto solicitado na chamada primordial matemática.


  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. ↩︎