Agnor's HQ

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;
}

Exemplo 4.6 - Menu de um Jogo

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;

}

Exemplo 5.1 - Menu de um Jogo (Versão 2)

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;

}

Exemplo 5.2 - Número de dias de um mês

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;
}

Exemplo 5.3 - Programa Irritante

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;
}

Exemplo 5.4 - Programa Irritante (Versão 2)

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;
}

Exemplo 5.5 - Programa Irritante (Versão 3)

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;
}

Exemplo 5.6 - X é igual a ... (até 5)

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;
}

Exemplo 5.7 - X é igual a ... (até 5) (Versão 2)

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;
}

Exemplo 5.8 - Maior de dois números

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;
}

Exemplo 5.9 - Maior de dois números (versão 2)

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;
}

Exemplo 5.10 - Jogo - Adivinhar o Número 1.1

Deixo-vos novamente a tarefa de perceberem o que faz o programa para casa.

Final da aula 05 de C++:

Próxima aula -> C++ 06 - Funções

Fazer o download do código fonte dos exemplos da aula WinZip
Fazer o download da aula em PDF (Brevemente)

Ir para o topo da página

Aulas de C++

Anúncios