Aula 05 - Mais operadores condicionais
Conceitos-Chave:
- switch, analisa a variável
- case, caso a variável analisada pelo switch seja...
- break, sai do switch, impedindo que as outras instruções fossem executadas
- while, enquanto...
- do...while, diferente do operador while na ordem de execução
- for, como alternativa ao while
- operador ternário, como alternativa ao if...else
O operador switch
Neste ponto das aulas, vocês já sabem fazer o menu de um jogo (como viram na aula anterior). Vamos relembrar:
#include <iostream>
using namespace std;
int main()
{
int escolha;
cout << "MENU DE UM JOGO" << endl;
cout << "\n\n1 - Novo Jogo" << endl;
cout << "2 - Carregar Jogo" << endl;
cout << "3 - Opcoes" << endl;
cout << "4 - Sair" << endl;
cin >> escolha;
if (escolha == 1)
cout << "Escolheu comecar um novo jogo" << endl;
else if (escolha == 2)
cout << "Escolheu carregar um jogo antigo" << endl;
else if (escolha == 3)
cout << "Opcoes:" << endl;
else if (escolha == 4)
cout << "Deseja mesmo sair?" << endl;
else // Caso contrário...
cout << "Escolha errada" << endl;
cin.get();
cin.get();
return 0;
}
O switch simplifica esta tarefa. Vejamos como ficaria o programa com switch:
#include <iostream>
using namespace std;
int main()
{
int escolha;
cout << "MENU DE UM JOGO" << endl;
cout << "\n\n1 - Novo Jogo" << endl;
cout << "2 - Carregar Jogo" << endl;
cout << "3 - Opcoes" << endl;
cout << "4 - Sair" << endl;
cin >> escolha;
switch (escolha)
{
case 1: // caso a escolha seja 1
cout << "Escolheu comecar um novo jogo" << endl;
break;
case 2: // caso a escolha seja 2
cout << "Escolheu continuar um jogo antigo" << endl;
break;
case 3: // caso a escolha seja 3
cout << "Opcoes:" << endl;
break;
case 4: // caso a escolha seja 4
cout << "Tem a certeza que quer sair?" << endl;
break;
default: // caso não seja nenhuma das escolhas
cout << "Escolha errada, tente novamente" << endl;
}
cin.get();
cin.get();
return 0;
}
A estrutura do switch poderá ser explicada desta forma:
switch (variavel) //verifica o valor da variável
{
case n: //caso o seu valor seja n (um valor qualquer)...
//...
default: //caso contrário...
//...
O único comando que deverá ser estranho é o comando break.
O break diz-nos para ir para sair imediatamente do switch, se não o puséssemos o programa executava todas as instruções que estão no switch (aparecia-nos os 5 textos em vez de aparecer só aquele que o utilizador queria). Experimentem retirar o break e executar o programa.
Podemos também agrupar vários case, desta forma:
#include <iostream>
using namespace std;
int main()
{
int escolha;
cout << "Quer saber o numero de dias de que mes? 1 - 12" << endl;
cin >> escolha;
switch (escolha)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: //caso seja 1 ou 3 ou 5 ou 7 ou...
cout << "Esse mes tem 31 dias" << endl;
break;
case 4:
case 6:
case 9:
case 11: //caso seja 4 ou 6 ou 9 ou 11...
cout << "Esse mes tem 30 dias" << endl;
break;
case 2: //caso seja 2 (Fevereiro)
cout << "Esse mes tem 28 ou 29 dias" << endl;
break;
default: // caso não seja nenhuma das escolhas
cout << "Numero errado" << endl;
break;
}
cin.get();
cin.get();
return 0;
}
Como podem ver, agrupar cases é muito útil. Caso contrário teríamos de repetir bastantes vezes a mesma instrução.
Operador while
O operador while, cria um ciclo, que vem a ser muito útil na programação de jogos. Por exemplo, dentro de um jogo há um ciclo que termina quando o jogador quiser desligar o jogo. Um exemplo:
#include <iostream>
using namespace std;
int main()
{
int escolha;
bool done = false; /* variável booleana (verdadeiro ou falso) caso seja
falsa continua a executar o ciclo principal, se for
verdadeira sai do ciclo */
while (done == false) //enquanto o done for igual a falso....
{
cout << "\n\nBem vindo a este programa irritante, quer ve-lo outra vez?" << endl;
cout << "1 - Sim\n2- Nao" << endl;
cin >> escolha;
switch(escolha)
{
case 1:
break; // sai do switch
case 2:
done = true; //done vai ser igual a true, logo sai do while
break;
default:
break;
}
//volta ao princípio do while....
}
return 0;
}
Isto vai ser muito útil para, por exemplo, criar uma janela de Loading Game(Carregar Jogo), o ciclo do jogo, etc.
Dica:
Em vez de utilizarmos
while (done == false)
poderíamos utilizar
while (!done)
A estrutura do while pode ser vista desta forma:
while (condicao) //enquanto a condicao for verdadeira...
{
//executa estas instruções
}
Aviso:
Tenham cuidado com os ciclos infinitos! Estes ciclos são criados quando é impossível ao utilizador sair do programa. Por exemplo, se retirarem o segundo case ao programa, o utilizador não conseguirá sair do programa (ciclo infinito)
O operador do...while
Há uma pequena diferença entre While e Do...While. Senão vejamos este exemplo:
#include <iostream>
using namespace std;
int main()
{
while (cin.get() != '*') //enquanto o cin.get() for diferente de * (asteristico)
{
cout << "\n\nBem vindo a este programa irritante (versao 2)." << endl;
cout << "Se quiser sair pressione * seguido de ENTER" << endl;
//volta ao princípio do while....
}
return 0;
}
Se experimentarem o programa, verão que primeiro tem que se pressionar ENTER para aparecer a mensagem. Porquê? Porque a condição while primeiro testa a condição. Se for verdadeira executa as instruções.
Neste exemplo, para testar a condição primeiro temos que pressionar ENTER (experimentem no início escreverem * e depois dar ENTER).
O do...while faz com que a instrução seja executada primeiro, e só depois a testa:
#include <iostream>
using namespace std;
int main()
{
do
{
cout << "\n\nBem vindo a este programa irritante (versao 3)." << endl;
cout << "Se quiser sair pressione * seguido de ENTER" << endl;
}
while (cin.get() != '*'); //não se esqueçam do ;
return 0;
}
Esta versão é muito melhor! Só mesmo experimentando é que percebem melhor a diferença entra as duas.
A condição for
A condição for também é muito usada. Vejamos este exemplo com o while:
#include <iostream>
using namespace std;
int main()
{
int x = 0;
while (x < 5) // enquanto x menor que 5 ....
{
cout << "X e igual a " << x << endl;
x++; //incrementa o x ( x = x + 1 )
}
cin.get();
return 0;
}
Com o for este tipo de código fica muito melhor:
#include <iostream>
using namespace std;
int main()
{
for (int x = 0; x < 5; x++)
{
cout << "X e igual a " << x << endl;
}
cin.get();
return 0;
}
Isto pode parecer um bocado complicado. Mas não é!
Analisemos o for:
for (int x = 0; x < 5; x++)
Temos a primeira instrução, que é a iniciação do for (só vai ser executada uma única vez). Normalmente declara-se variáveis aqui.
Depois temos a segunda, que é o teste à condição. Se for true sai do
for, se for false executa o bloco.
A última instrução a ser realizada é, normalmente, um incremento (x++).
O operador for torna-se muito útil quando queremos realizar algo repetível um determinado número de vezes.
O operador ternário
Para acabar, vou-vos mostrar o operador ternário. Vejamos um exemplo usando if e else:
#include <iostream>
using namespace std;
int main()
{
int a;
int b = 10;
bool maior;
cout << "Insira um numero: ";
cin >> a;
if (a <= b)
{
maior = false;
}
else
{
maior = true;
}
cin.get();
cin.get();
return 0;
}
E usando o operador ternário:
#include <iostream>
using namespace std;
int main()
{
int a;
int b = 10;
bool maior;
cout << "Insira um numero: ";
cin >> a;
a > b ? maior = true : maior = false;
//lê-se a é maior que b ? Se sim maior é igual a true, se não maior é igual a false.
cin.get();
cin.get();
return 0;
}
Jogo de Adivinhar o Número (Versão 1.1)
Esta versão tem novas funcionalidades: só sai do programa quando o utilizador adivinhar o número e mostra o número de tentativas efectuadas. O código abaixo:
#include <iostream>
using namespace std;
int main()
{
int numero = 21; //o numero a ser adivinhado
int valor; //o numero a ser inserido pelo utilizador
int tentativa = 0; //o numero de tentativas que o utilizador precisou
bool done = false;
cout << "Bem Vindo a versao 1.1 do jogo de ADIVINHAR O NUMERO" << endl;
while (!done)
{
cout << "\nInsira a sua tentativa: ";
cin >> valor;
tentativa++; //incrementa o numero de tentativas
if (numero == valor)
{
cout << "\nBoa, acertou na " << tentativa << " tentativa!" << endl;
cout << "Tera que deixar o jogo, uma vez que ja sabe o numero :)" << endl;
done = true; //sai do while
}
if (valor < numero)
{
cout << "\nO numero e demasiado baixo. Tente um mais alto" << endl;
}
if (valor > numero)
{
cout << "\nO numero e demasiado alto. Tente um mais baixo" << endl;
}
}
cin.get();
cin.get();
return 0;
}
Deixo-vos novamente a tarefa de perceberem o que faz o programa para casa.
Próxima aula -> C++ 06 - Funções
Fazer o download do código fonte dos exemplos da aula
Fazer o download da aula em PDF (Brevemente)
Ir para o topo da página