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