⚖️ Estrutura Condicional em Programação
Após entendermos como os programas executam comandos em sequência, vamos explorar a estrutura condicional. Ela permite que um programa tome decisões, alterando seu fluxo de execução com base em condições específicas. É o que torna os programas “inteligentes” e dinâmicos.
🔍 Expressões Lógicas e Comparativas
Para que uma estrutura condicional funcione, ela precisa avaliar uma condição. Em C, o resultado dessa avaliação é sempre um número: 0 (falso) ou qualquer valor diferente de zero, tipicamente 1 (verdadeiro). Essas condições são construídas com expressões comparativas e lógicas.
Expressões Comparativas
Comparam dois valores e o resultado é sempre um valor lógico (0 ou 1).
Operadores Comparativos em C:
| Operador VisualG | Operador C | Significado |
|---|---|---|
> |
> |
Maior que |
< |
< |
Menor que |
>= |
>= |
Maior ou igual a |
<= |
<= |
Menor ou igual a |
= |
== |
Igual a (Note a diferença!) |
<> |
!= |
Diferente de |
Exemplos (supondo int x = 10;):
x > 0→ Resultado:1(verdadeiro)x == 10→ Resultado:1(verdadeiro)x != 10→ Resultado:0(falso)20 <= 15→ Resultado:0(falso)
Expressões Lógicas
Combinam duas ou mais expressões comparativas, permitindo criar condições mais complexas.
Operadores Lógicos em C:
| Operador VisualG | Operador C | Descrição |
|---|---|---|
E |
&& |
E (AND): Verdadeiro somente se todas as condições forem verdadeiras. |
OU |
|| |
OU (OR): Verdadeiro se pelo menos uma condição for verdadeira. |
NAO |
! |
NÃO (NOT): Inverte o valor da condição (de verdadeiro para falso e vice-versa). |
Operador && (E)
Pense na regra para obter uma habilitação de motorista: você precisa ser aprovado no exame psicotécnico E no exame de legislação E no exame de direção. Se falhar em qualquer um deles, o resultado final é “reprovado”. Todas as condições devem ser verdadeiras.
Tabela Verdade (E):
| A | B | A && B |
|---|---|---|
| Falso | Falso | Falso |
| Falso | Verdadeiro | Falso |
| Verdadeiro | Falso | Falso |
| Verdadeiro | Verdadeiro | Verdadeiro |
Operador || (OU)
Pense nas vagas de estacionamento preferenciais: você pode usá-las se for idoso(a), OU pessoa com deficiência, OU gestante. Basta atender a uma das condições para ter o direito.
Tabela Verdade (OU):
| A | B | A || B |
|---|---|---|
| Falso | Falso | Falso |
| Falso | Verdadeiro | Verdadeiro |
| Verdadeiro | Falso | Verdadeiro |
| Verdadeiro | Verdadeiro | Verdadeiro |
Operador ! (NÃO)
Pense na regra para uma bolsa de estudos: você tem direito se NÃO possuir renda maior que R$ 3.000,00. Este operador inverte o resultado da condição. Se a condição renda > 3000 for verdadeira, !(renda > 3000) será falsa.
Tabela Verdade (NÃO):
| A | !A |
|---|---|
| Falso | Verdadeiro |
| Verdadeiro | Falso |
🔀 A Estrutura if-else
É a principal estrutura de controle condicional. Ela permite que um bloco de comandos seja executado somente se uma determinada condição for atendida.
if Simples
Executa um bloco de código se a condição for verdadeira. Se for falsa, o bloco é simplesmente ignorado.
Sintaxe em C:
if (condicao) {
// Bloco de comandos a ser executado
// se a condição for verdadeira.
}
if-else Composta
Oferece um caminho alternativo. Se a condição for verdadeira, o bloco if é executado. Caso contrário (else), o bloco else é executado.
Sintaxe em C:
if (condicao) {
// Bloco de comandos a ser executado
// se a condição for verdadeira.
} else {
// Bloco de comandos a ser executado
// se a condição for falsa.
}
Encadeamento com else if
Para cenários com múltiplas condições (mais de duas possibilidades), podemos encadear várias estruturas if-else.
Exemplo: Saudação baseada na hora do dia
#include <stdio.h>
int main() {
int hora;
printf("Digite a hora atual (0-23): ");
scanf("%d", &hora);
if (hora < 12) { // se a hora for menor que 12
printf("Bom dia!\n"); // imprime Bom dia!
} else if (hora < 18) { // senao, se a hora for menor que 18
printf("Boa tarde!\n"); // imprime Boa tarde!
} else { // senao (para qualquer outra hora >= 18)
printf("Boa noite!\n"); // imprime Boa noite!
}
return 0;
}
Boa Prática: Repare na indentação (o recuo dos blocos de código). Ela não afeta o funcionamento em C, mas é fundamental para a legibilidade do código!
🔢 A Estrutura switch-case
Quando temos várias opções de fluxo que dependem do valor de uma única variável, podemos usar a estrutura switch-case como uma alternativa mais limpa e organizada a um longo encadeamento de if-else if.
Problema Exemplo: Ler um número inteiro de 1 a 7 e escrever o dia da semana correspondente.
Solução com switch-case em C:
#include <stdio.h>
int main() {
int x;
const char *dia;
printf("Digite um numero para o dia da semana (1-7): ");
scanf("%d", &x);
switch (x) { // A variável a ser avaliada
case 1: // Se o valor for 1
dia = "Domingo";
break; // Interrompe a execução do switch
case 2: // Se o valor for 2
dia = "Segunda-feira";
break;
case 3:
dia = "Terca-feira";
break;
case 4:
dia = "Quarta-feira";
break;
case 5:
dia = "Quinta-feira";
break;
case 6:
dia = "Sexta-feira";
break;
case 7:
dia = "Sabado";
break;
default: // Equivalente ao "outrocaso", se nenhum caso corresponder
dia = "Valor invalido";
break;
}
printf("Dia da semana: %s\n", dia);
return 0;
}
Importante: O comando
breaké essencial. Sem ele, o código continuaria a executar oscaseseguintes (“fall-through”), o que geralmente não é o comportamento desejado. O blocodefaulté opcional e lida com todos os valores não cobertos peloscase.Particularidade do C: diferente de outras linguagens, C não permite usar texto (
String) como valor avaliado peloswitch— sóint,charouenum. Isso não é um problema aqui: quem é avaliado éx(umint); a variáveldia(declarada comoconst char *, um “ponteiro para texto”) só é atribuída dentro de cadacase, o que é perfeitamente válido.
✍️ Exercícios Práticos Resolvidos em C
Exercício 1: Fórmula de Bhaskara com Validação
Problema: Relembrando a fórmula de Bhaskara (\(ax^2 + bx + c = 0\)), precisamos criar um programa que calcule as raízes, mas com duas validações importantes:
- O coeficiente
anão pode ser zero, pois senão não é uma equação do segundo grau. - O valor de delta (\(\Delta = b^2 - 4ac\)) não pode ser negativo, pois não existe raiz quadrada real de número negativo.
O programa deve tratar essas condições antes de tentar calcular as raízes.
Solução em C:
#include <stdio.h>
#include <math.h>
int main() {
double a, b, c;
printf("Coeficiente a: ");
scanf("%lf", &a);
printf("Coeficiente b: ");
scanf("%lf", &b);
printf("Coeficiente c: ");
scanf("%lf", &c);
if (a == 0) {
printf("Esta nao e uma equacao de segundo grau!\n");
} else {
double delta = pow(b, 2.0) - 4.0 * a * c;
if (delta < 0) {
printf("Esta equacao nao possui raizes reais.\n");
} else {
double x1 = (-b + sqrt(delta)) / (2.0 * a);
double x2 = (-b - sqrt(delta)) / (2.0 * a);
printf("X1 = %.4f\n", x1);
printf("X2 = %.4f\n", x2);
}
}
return 0;
}
Exemplos de Execução:
- Entrada:
a=1,b=0,c=-9→ Saída:X1 = 3.0000,X2 = -3.0000 - Entrada:
a=2,b=9,c=10→ Saída:X1 = -2.0000,X2 = -2.5000 - Entrada:
a=5,b=2,c=3→ Saída:Esta equacao nao possui raizes reais. - Entrada:
a=0,b=4,c=2→ Saída:Esta nao e uma equacao de segundo grau!