Resolução dos Exercícios da Aula 2


Exemplo

// Este programa lê dois números inteiros do teclado, multiplica-os, e escreve o resultado no ecrã.
#include <iostream>
using namespace std;

int main ()
{
    cout << "Introduza dois números inteiros: ";
    int primeiro_numero;
    int segundo_numero;
    cin >> primeiro_numero >> segundo_numero;

    int resultado = primeiro_numero * segundo_numero;
    cout << "O resultado da multiplicação dos dois números é "
         << resultado << endl;
}

Resoluções

1.  Passe para o editor o programa que se encontra acima (exemplo) e compile e execute o programa.

2.a)  Escreva um programa que peça ao utilizador para inserir dois números inteiros e os some.  Depois de terminar o programa, o seu ecrã deve ter o seguinte aspecto:

Insira dois números: 12 234
A soma dos dois números inseridos é: 246
R:
Por analogia com o exemplo acima, a solução é:
// Este programa lê dois números inteiros do teclado, soma-os, e escreve o resultado no ecrã.
#include <iostream>
using namespace std;

int main()
{
    cout << "Introduza dois números: ";
    int primeiro_numero;
    int segundo_numero;
    cin >> primeiro_numero >> segundo_numero;

    int resultado = primeiro_numero + segundo_numero;
    cout << "A soma dos dois números é " << resultado << endl;
}

2.b)  Altere o seu programa de modo a que possa inserir números decimais (com vírgula).

R:
Basta substituir int por double (ou float ou long double):

// Este programa lê dois números decimais do teclado, soma-os, e escreve o resultado no ecrã.
#include <iostream>
using namespace std;

int main()
{
    cout << "Introduza dois números: ";
    double primeiro_numero;
    double segundo_numero;
    cin >> primeiro_numero >> segundo_numero;

    double resultado = primeiro_numero + segundo_numero;
    cout << "A soma dos dois números é " << resultado << endl;
}

2.c)  Altere o seu programa para fazer a leitura de cinco números e somá-los.

R:
Solução ingénua:

// Este programa lê cinco números decimais do teclado, soma-os, e escreve o resultado no ecrã.
#include <iostream>
using namespace std;

int main()
{
    cout << "Introduza cinco números: ";
    double n1, n2, n3, n4, n5;
    cin >> n1 >> n2 >> n3 >> n4 >> n5;

    double resultado = n1 + n2 + n3 + n4 + n5;
    cout << "A soma dos cinco números é " << resultado << endl;
}

2.d)  Se usou mais do que duas variáveis para fazer a alínea anterior, reescreva o seu programa usando apenas duas variáveis.  Uma delas deve guardar o valor lido, enquanto a outra deve guardar o valor acumulado da soma dos números inseridos até ao momento.  Faça o traçado deste programa (usando o depurador) visualizando a evolução de ambas as variáveis.

Repare que as variáveis de tipos básicos contêm lixo se não foram inicializadas na sua definição e antes da primeira atribuição de um valor.

R:
Solução melhorada:

// Este programa lê cinco números decimais do teclado, soma-os, e escreve o resultado no ecrã.
#include <iostream>
using namespace std;

int main()
{
    cout << "Introduza cinco números: ";
    double n;
    double resultado = 0;
    cin >> n;
    resultado += n;
    cin >> n;
    resultado += n;
    cin >> n;
    resultado += n;
    cin >> n;
    resultado += n;
    cin >> n;
    resultado += n;

    cout << "A soma dos cinco números é " << resultado << endl;
}

3.a)  Escreva um programa que, dado um caractere, escreva no ecrã o seu código.  Exemplo: Por favor introduza um caractere: a
O código do caractere 'a' é: 97
R:
#include <iostream>
using namespace std;

int main()
{
    cout << "Por favor introduza um caractere: ";
    char c;
    cin.get(c);
    cout << "O código do caractere '" << c << "' é: " << int(c) << endl;
}

Note-se que int(c) devolve o código do caractere c como um inteiro.  Note-se ainda que cin.get(c) lê um caractere do teclado coloca o seu código em c.  A solução com cin >> c descarta todos os espaços, tabuladores e fins-de-linha que encontrar antes do caracter, e por isso o utilizador não conseguirá saber o código do caractere espaço ' '.

3.b)  Escreva um programa que, dado um caracter, escreva no ecrã o seu número de ordem no alfabeto (assuma que se utiliza o código ASCII, como em Linux).  Exemplo:

Por favor introduza um caractere: a
A ordem do caractere 'a' é: 1
Outro exemplo: Por favor introduza um caractere: c
A ordem do caractere 'c' é: 3
R:
#include <iostream>
using namespace std;

int main()
{
    cout << "Por favor introduza um caractere: ";
    char c;
    cin.get(c);
    cout << "A ordem do caractere '" << c << "' é: "
         << int(c) - int('a') << endl;
}

Nota: que acontece se o caractere introduzido for uma letra maiúscula?  E se não for uma letra de todo?  Experimente...

3.c)  Escreva um programa que, dado um caracter, escreva no ecrã o caractere seguinte no alfabeto (assuma de novo o código ASCII).

R:

#include <iostream>
using namespace std;

int main()
{
    cout << "Por favor introduza um caractere: ";
    char c;
    cin.get(c);
    cout << char(int(c) + 1) << endl;
}

Nota: que acontece se o caractere introduzido for 'z' ou 'Z'?  E se não for uma letra de todo?  Experimente...  Tente fazer surgir a letra 'a'.

4.a)  Use o seu programa de soma (a versão feita para inteiros, na alínea 2.a)) para tentar somar os números 2147483647 e 2.  Faça um traçado do programa e tente perceber porque não funciona.

R:
Não funciona porque 2147483647 é o maior dos int numa máquina Linux de arquitectura Intel.

4.b)  Experimente "corrigir" o programa mencionado na alínea anterior usando variáveis do tipo float.  Funcionou?  Porquê?

Nota: para visualizar os float com presisão adequada, faça cout << setprecision(20); antes de os escrever (e faça #include <iomanip> no início do programa).

R:

// Este programa lê dois números decimais do teclado, soma-os, e escreve o resultado no ecrã.
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    cout << "Introduza dois números: ";
    float primeiro_numero;
    float segundo_numero;
    cin >> primeiro_numero >> segundo_numero;

    float resultado = primeiro_numero + segundo_numero;
    cout << setprecision(20);
    cout << "A soma dos dois números é " << resultado << endl;
}

Não funciona como espectável porque os float não têm precisão suficiente para guardar o inteiro 2147483647.

5.  Escreva o seguinte programa:

#include <iostream>
using namespace std;

int main ()
{
    cout << "Insira o valor de x: ";

    const int x = 10;
    cin >> x;

    cout << "O valor actual de x é: " << x << endl;
}

Tente compilar e executar este programa.  Funcionou?  Então corrija o programa de modo a que o valor de x seja de facto alterado e passe a conter o valor introduzido.

R:
A constante x tem de passar a variável.  Além disso é escusado inicializá-la:

#include <iostream>
using namespace std;

int main()
{
    cout << "Insira o valor de x: ";
    int x;
    cin >> x;

    cout << "O valor actual de x é: " << x << endl;
}

6.  Escreva o seguinte código:
#include <iostream>
using namespace std;

int main ()
{
    cout << "Insira os valores de x e y (inteiros): ";
    int x, y;
    cin >> x >> y;

    cout << "Insira os valores de f e g (decimais): ";
    double f, g;
    cin >> f >> g;

    cout << "A soma de x e y é: " << x + y << endl;
    cout << "A soma de f e g é: " << f + g << endl;
}

Compile, execute e faça o traçado (com o depurador) deste programa examinando os valores que tomam as variáveis.  Acrescente novas linhas ao fim do programa, semelhantes às duas últimas linhas, de modo a testar o efeito de cada um dos operadores listados no resumo acima.

Repare que ao mostrar o valor de uma expressão booleana (e.g. cout << (x > y) << endl;)  o que aparece no ecrã é 0 caso a expressão seja falsa e 1 caso contrário.  A norma do C++ inclui o manipulador boolalpha para mostrar true e false em vez de 1 e 0.  O manipulador boolalpha pode utilizar-se da seguinte forma:

cout << boolalpha << (x > y) << endl;
Infelizmente a versão das bibliotecas de C++ que estamos a utilizar ainda não suporta este tipo de operação.

Atenção:  As precedências dos operadores são importantes.  Tente fazer:

cout << x > y << endl;
e depois
cout << (x > y) << endl;
e procure explicar porque uma destas instruções funciona e a outra não.

R:
A primeira versão é interpretada pelo compilador como

(cout << x) > (y << endl);
pois o operador << tem maior precedência que o operador >.

 ( ... outros exercícios)