Programar em C++/Decisão e controle de fluxo

Origem: Wikilivros, livros abertos por um mundo aberto.

Controle de fluxo em C++[editar | editar código-fonte]

Aqui 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++[editar | editar código-fonte]

Em 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[editar | editar código-fonte]

if[editar | editar código-fonte]

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 | editar código-fonte]

É 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[editar | editar código-fonte]

O 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 "?"[editar | editar código-fonte]

A 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[editar | editar código-fonte]

O 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[editar | editar código-fonte]

Esta 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.