Programar em C++/Decisão e controle de fluxo
Controle de fluxo em C++
editarAqui vamos criar funções que nos permitam alterar a leitura de execução do código. Ou seja, já dissemos que a leitura de execução do código é de cima para baixo (lê a primeira linha de código – executa, lê a 2ª linha --- executa,..e por aí adiante)
O que agora vamos fazer e criar mecanismos para alterar esse leitura sequencial e permitir:
- Execução de código de acordo com a condição
- Repetição de execução de código sujeito a condição
- Saltar linhas de código
Decisão em C++
editarEm C++ os métodos de tomada de decisão presentes na linguagem C estão disponíveis para as tarefas mais corriqueiras que o programa deve executar. Além desta forma de controle de decisões, C++ provê certas funcionalidades relacionadas a objetos que modificam a forma como o código é estruturado e, por consequência, decidem como o programa deve se comportar em determinadas situações. Examinemos os métodos básicos e analisemos de forma simples as estruturas de decisão presentes no modelo de programação orientado a objetos, para entender como isso poderá nos ajudar a tornar o código mais bem construído.
De modo geral, a maioria das linguagens de programação existentes utiliza-se das estruturas if-else
ou switch-case
.
if-else
editarif
editar
Se você quer que o software execute um determinado comando somente em certas situações, utilize if para determinar isto. O programa vai, então, executar a primeira linha de código após o if, se a declaração entre parênteses for verdadeira. Exemplo:
#include <iostream>
using namespace std;
int main(void) {
int variavel;
cout << "Escreva um numero: ";
cin >> variavel;
if(variavel == 5)
cout << "A variável é igual a 5";
return 0;
}
Pode-se usar valores booleanos:
bool variavel;
if(variavel) //if será executado se booleano for verdadeiro, como não lhe foi atribuído valor, é falso
cout << "variável é verdadeira!";
Ou, se booleano tiver que ser falso para ocorrer a execução:
if(!variavel) // O ! faz com que só haja execução da próxima linha se variável for falsa
cout << "variável é falsa!";
Mas se você quiser que o computador execute várias linhas após o if
se este for verdadeiro? Basta usar chaves:
if(variavel) {
cout << "A variável é verdadeira...\n";
cout << "E continua executando" <<
"até que seja fechado o if" <<
" com o }";
}
else
editar
É também possível usar o bloco else
para o computador executar várias linhas de código caso uma condição tenha o valor booleano falso. Por exemplo:
if(temperatura < 20) {
cout << "Está frio";
} else {
cout << "Está calor";
}
Assumindo que a variável temperatura
tem tipo inteiro (int), se esta contiver um valor, por exemplo, 20, será apresentada na tela a mensagem "Está calor", uma vez que 20 < 20 é uma expressão é contradição, logo tem o valor booleano falso.
Podemos ainda encadear vários else
, e obter ainda mais possibilidades:
if(deposito < 20) {
cout << "Depósito de gasóleo inferior a 20%";
} else if(deposito < 50) {
cout << "Tem menos de metade do depósito";
} else {
cout << "Ainda tem meio depósito ou mais";
}
Desta forma, conseguimos distinguir o nível de depósito de gasóleo de um carro em 3 níveis diferentes. Para distinguir por mais níveis, bastaria acrescentar mais } else if(...condição...) {
para distinguir os diferentes patamares.
De notar que, cada caso é avaliado individualmente, por ordem. Isto é, primeiro seria verificado se o depósito tem menos de 20% de gasóleo; apenas se esta condição for falsa é que o computador avalia a segunda condição, para verificar se o depósito tem menos de 50% de gasóleo, e por ainda adiante.
switch
editarO switch é muito parecido com o if-else. Apenas a sintaxe e construção é diferente
#include <iostream>
using namespace std;
int main(void)
{
char grade;
cout << "Enter your grade (A to F): ";
cin >> grade;
switch (grade)
{
case 'A':
cout << "Your average must be between 90 - 100"<< endl;
break;
case 'B':
cout << "Your average must be between 80 - 89"<< endl;
break;
case 'C':
cout << "Your average must be between 70 - 79"<< endl;
break;
case 'D':
cout << "Your average must be between 60 - 69"<< endl;
break;
default:
cout << "Your average must be below 60" << endl;
}
return 0;
}
- Cada um dos casos tem de ser uma constante (não pode alterar durante a vida do programa), neste exemplo A, B, …
- O defaut serve para a condição de todas as avaliações dos casos anteriores der falsa. (é tipo o else)
- O break serve para terminar o switch, caso contrário se num dado case fosse verdadeiro, iria executar todos os statementes mesmo de outros cases até terminar o switch.
- Aqui para cada caso não necessitamos de {} se tivermos mais do que 2 statements.
- o if-else é mais forte do que o switch por que permite fazer coisas como:
if (apples == oranges) do this; else if (sales >= 5000) do that;
- Para além do ponto já dito de os casos serem obrigatoriamente constantes, no switch
- Também posso utilizar operadores lógicos no switch
switch (age >= 18 && citizen == true)
{
case true:
cout << "You are eligible to vote";
break;
case false:
cout << "You are not eligible to vote";
}
Operador condicional "?"
editarA sintaxe é :
- [Relational expression] ? [statement if true] : [statement if false]
Ou seja, este operador testa a expressão relacional e se o resultado for verdadeiro executa logo a 1ª afirmação caso contrário executa a segunda.
ou seja isto não é mais do que um if-else.
Há quem goste de usar este operador porque poupa escrita, mas acho que não vale a pena!
#include <iostream>
using namespace std;
int main(void)
{
int num;
cout << "Enter a whole number: ";
cin >> num;
cout << "The number is " << (num % 2 == 0 ? "even" : "odd") << endl;
return 0;
}
Notar que o operador condicional exige 3 operandos.
vamos fazer uns exercícios:
- 7==5 ? 4 : 3 // returns 3, since 7 is not equal to 5.
- 7==5+2 ? 4 : 3 // returns 4, since 7 is equal to 5+2.
- 5>3 ? a : b // returns the value of a, since 5 is greater than 3.
- a>b ? a : b // returns whichever is greater, a or b.
O Comando goto
editarO goto realiza um salto para um local especificado. Este local é determinado por um rótulo. Portanto pode ser em qualquer parte do programa.
nome_do_rótulo: .... goto nome_do_rótulo; ....
// goto loop example
#include <iostream>
using namespace std;
int main ()
{
int n=10;
loop:
cout << n << ", ";
n--;
if (n>0)
goto loop;
cout << "FIRE!";
return 0;
}
Repare no rótulo.
Nota: Evite o uso de goto quando for possível usar estruturas principais, porque pode tornar o código ilegível. Esse comando deve ser usado em último caso, como sair de loops aninhados.
Terminando o programa
editarEsta função é definida com a biblioteca cstdlib (c+std+lib) O propósito da função é terminar com o programa com um específico código de saída O protótipo é:
- int exit (int exitcode);
Esta função é usada por alguns sistemas operativos e podem ser usadas para chamar programas. Por convenção o código 0 se saída significa que o programa terminou normalmente, como previsto, se vier com outro número significa que houve um erro e algo de inesperado sucedeu.