| | | |

Minicurso de C++ para Matemática

Minicurso de C++ para Matemática

Ajude a manter o site livre, gratuito e sem propagandas. Colabore!

2 Elementos da linguagem

2.1 Tipos de dados básicos

Na linguagem C++, dados são alocados em variáveis com tipos declarados. Por exemplo, estudemos o seguinte código.

Código 2: dados.cpp
1#include <iostream>
2#include <string>
3
4int main()
5{
6    // var inteira
7    int i = 1;
8
9    // var pto flutuante
10    double x;
11    x = 2.5;
12
13    // var string
14    std::string s = "i + x";
15
16    double y = i + x;
17
18    std::cout << "i = " << i << std::endl
19        << "x = " << x << std::endl
20        << "s = " << s << std::endl;
21    std::cout << std::scientific
22        << "y = " << y << std::endl;
23
24    return 0;
25}

Na linha 7, é declarada uma variável do tipo int (número inteiro) com identificador i e inicializada com valor 1. Na linha 10, é declarada uma variável do tipo double (número decimal em ponto flutuante de 64 bits) com identificador x. Na linha 14, é declarada e inicializada uma string222string é um arranjo de caracteres..

2.1.1 Notação científica

Podemos usar notação científica em C++. Por exemplo 5.2×10-2 é digitado da seguinte forma 5.2e-2.

Código 3: notacaoCientifica.cpp
1#include <iostream>
2#include <iomanip>
3
4int main()
5{
6    int i = -51;
7    double x = 5.2e-2;
8
9    // imprime inteiro i
10    std::cout << "i = "
11        << i << std::endl;
12    // imprime x com notação decimal fixada
13    std::cout << "x = "
14        << std::fixed << x << std::endl;
15    // imprime x com notação científica
16    std::cout << "x = "
17        << std::scientific
18        << std::setprecision(2)
19        << x << std::endl;
20
21    return 0;
22}
Exercício 2.1.1.

Antes de implementar, diga qual o valor de x após as seguintes instruções.

1int x = 1;
2int y = x;
3y = 0;

Justifique e verifique sua resposta.

Resposta 0.

x == 1.

Exercício 2.1.2.

Implemente um código em que a/o usuária/o entra com valores para as variáveis x e y. Então, os valores das variáveis são permutados entre si. Dica: a entrada de dados por usuária/o pode ser feita com a instrução std::cin. Por exemplo, para a variável x, usamos std::cin >> x.

Resposta 0.
1#include <iostream>
2
3int main()
4{
5    double x, y;
6
7    // leitura
8    std::cout << "Digite um valor para x: ";
9    std::cin >> x;
10    std::cout << "Digite um valor para y: ";
11    std::cin >> y;
12
13    // permutação de valores
14    double tmp = x;
15    x = y;
16    y = tmp;
17
18    // imprime novos valores
19    std::cout << "x = " << x << std::endl
20        << "y = " << y << std::endl;
21
22    return 0;
23}

2.2 Operações aritméticas elementares

Os operadores aritméticos elementares são

  • *, /, % multiplicação, divisão, módulo

  • +, - adição, subtração

em ordem de precedência333Consulte mais informações sobre a precedência de operadores em C++ Operator Precedence.. O operador módulo % computa o resto da divisão inteira, por exemplo, 5\%2 é igual a 1.

Por exemplo, a computação

12+17%9/2*2-1

resulta no valor 9. De fato, nesta instrução as operações são computadas na seguinte ordem %, /, *, + e -.

As operações *, / e % têm precedência maior que as operações + e -. Operações de mesma precedência seguem a ordem da esquerda para direita, conforme escritas na linha de comando. Usa-se parênteses para alterar a precedência entre as operações, por exemplo

1(2+17)%9/2*2-1

computa o resultado -1. De fato, a divisão inteira está sendo usada. Para computar a divisão em ponto flutuante, um dos operandos deve ser double. Podemos fazer um casting

1double((2+17)%9)/2*2-1

ou, simplesmente, entrar com um número decimal

1(2+17)%9/2.0*2-1
Exercício 2.2.1.

Escreva um programa para computar o vértice da parábola

p(x)=ax2+bx+c, (1)

para a=2, b=-2 e c=4.

Resposta 0.

(12,72)

Exercício 2.2.2.

Use C++ para computar os inteiros não negativos q e r tais que

25=q3+r, (2)

sendo r o menor possível.

Resposta 0.
1int q = 25/3;
2int r = 25%3;

2.3 Funções e constantes elementares

A biblioteca C++ cmath.h disponibiliza várias funções e constantes elementares. Por exemplo, o seguinte código imprime os valores de π, 2 e lne.

Código 4: math.cpp
1#include <iostream>
2#include <cmath>
3
4int main()
5{
6    std::cout << "pi = "
7        << M_PI << std::endl;
8    std::cout << "2^(1/2) = "
9        << sqrt(2) << std::endl;
10    std::cout << "log(e) = "
11        << log(M_E) << std::endl;
12
13    return 0;
14}

Para compilar e lincar a biblioteca <cmath>, usamos o seguinte comando

1    $ g++ math.cpp -lm
Observação 2.3.1.(Logaritmo Natural)

Notemos que log é a função logaritmo natural, i.e. ln(x)=loge(x). A implementação C++ para o logaritmo de base 10 é log10.

Exercício 2.3.1.

Compute

  1. a)

    sen(π4)

  2. b)

    log3(π)

  3. c)

    elog2(π)

  4. d)

    -273

Exercício 2.3.2.

Faça um código para computar as raízes reais de um polinômio quadrático

p(x)=ax2+bx+c (3)

usando a fórmula de Bhaskara444Bhaskara Akaria, 1114 - 1185, matemático e astrônomo indiano. Fonte: Wikipédia: Bhaskara II.. Teste-o para diferentes conjuntos de coeficientes.

Resposta 0.
1#include <iostream>
2#include <cmath>
3
4int main()
5{
6    // coeficientes
7    double a = 2.0;
8    double b = -2.0;
9    double c = -4.0;
10
11    // discriminante
12    double d = b*b - 4*a*c;
13
14    // raízes
15    double x1 = (-b + sqrt(d)) / (2*a);
16    double x2 = (-b - sqrt(d)) / (2*a);
17
18    // imprime
19    std::cout << "Raízes: " << std::endl
20        << "    x1 = " << x1 << std::endl
21        << "    x2 = " << x2 << std::endl;
22    return 0;
23}

2.4 Operadores de comparação elementares

Os operadores de comparação elementares são

  • == igual a

  • != diferente de

  • > maior que

  • < menor que

  • >= maior ou igual que

  • <= menor ou igual que

Estes operadores retornam os valores lógicos true (verdadeiro, 1) ou false (falso, 0). Variáveis do tipo bool (variáveis booleanas555George Boole, 1815 - 1864, matemático britânico. Fonte: Wikipédia: George Boole.) são usadas para armazenar valores lógicos.

Por exemplo, estudemos o seguinte código.

Código 5: opComp.cpp
1#include <iostream>
2#include <iomanip>
3
4int main()
5{
6    int x = 2;
7
8    bool res = x + x == 5;
9
10    std::cout << "2 + 2 == 5? "
11        << std::boolalpha
12        << res << std::endl;
13
14    return 0;
15}
Exercício 2.4.1.

Considere a circunferência de equação

c:(x-1)2+(y+1)2=1. (4)

Escreva um código em que a(o) usuária(o) entra com as coordenadas de um ponto P=(x,y) e seja verificado se:

  1. a)

    P pertence ao interior de c.

  2. b)

    P pertence à fronteira de c.

  3. c)

    P não pertence à circunferência c.

Resposta 0.
1#include <iostream>
2#include <iomanip>
3
4int main()
5{
6    double x;
7    std::cout << "x: ";
8    std::cin >> x;
9    double y;
10    std::cout << "y: ";
11    std::cin >> y;
12
13    double rhs = (x-1.0)*(x-1.0) + (y+1.0)*(y+1.0);
14    bool interior =  rhs < 1.0;
15    bool borda = rhs == 1.0;
16    bool exterior = rhs > 1.0;
17
18    std::cout << "Interior: " << interior << std::endl
19            << "Borda: " << borda << std::endl
20            << "Exterior: " << exterior << std::endl;
21
22    return 0;
23}
Exercício 2.4.2.

Antes de implementar, diga qual é o valor lógico da instrução pow(sqrt(3), 2.0) == 3.0. Justifique sua resposta e verifique!

Resposta 0.

false

2.5 Operadores lógicos elementares

Os operadores lógicos elementares são:

  • and e lógico

  • or ou lógico

  • not não lógico

Por exemplo, a tabela booleana do and é

A B A and B
true true true
true false false
false true false
false false false

O seguinte código, monta essa tabela booleana, verifique!

Código 6: and.cpp
1#include <iostream>
2#include <iomanip>
3
4int main()
5{
6    bool T = true;
7    bool F = false;
8
9    std::cout << "A    | B    | A and B"
10        << std::endl;
11    std::cout << std::boolalpha
12        << T << " | " << T << " | "
13        << (T and T) << std::endl
14        << T << " | " << F << "| "
15        << (T and F) << std::endl
16        << F << "| " << T << " | "
17        << (F and T) << std::endl
18        << F << "| " << F << "| "
19        << (F and F) << std::endl;
20
21    return 0;
22}
Exercício 2.5.1.

Construa as tabelas booleanas do operador or e do not.

Resposta 0.
A B A or B
true true true
true false true
false true true
false false false
A not(A)
true false
false true
Exercício 2.5.2.

Escreva um código para verificar as seguintes comparações

  1. a)

    1.4<=2<1.5.

  2. b)

    |x|<1, x=sen(π/3).

  3. c)

    |x|>12, x=cos(π**2).

Resposta 0.
1#include <iostream>
2#include <iomanip>
3#include <cmath>
4
5int main()
6{
7    std::cout << std::boolalpha;
8
9    // a)
10    std::cout << "a) "
11        << (1.4 <= sqrt(2)) and \
12           (sqrt(2) < 1.5) << std::endl;
13
14    // b)
15    double x = sin(M_PI/3.0);
16    std::cout << "b) "
17        << (fabs(x) < 1.0) << std::endl;
18
19    // c)
20    x = cos(M_PI*M_PI);
21    std::cout << "c) "
22        << (fabs(x) > 0.5) << std::endl;
23
24    return 0;
25}
Exercício 2.5.3.

Considere um retângulo r:ABDC de vértices A=(1,1) e D=(2,3). Crie um código em que a/o usuária/o informa as coordenadas de um ponto P=(x,y) e o código verifica cada um dos seguintes itens:

  1. 1.

    Pr.

  2. 2.

    Pr.

  3. 3.

    Pr¯.

Resposta 0.
1#include <iostream>
2#include <iomanip>
3
4int main()
5{
6    // vértices
7    double Ax = 1.0;
8    double Ay = 1.0;
9
10    double Dx = 2.0;
11    double Dy = 3.0;
12
13    // ponto
14    double x, y;
15    std::cout << "x: ";
16    std::cin >> x;
17    std::cout << "y: ";
18    std::cin >> y;
19
20    // localização
21    bool interior = (Ax < x and x < Dx) and \
22                    (Ay < y and y < Dy);
23    bool borda = (Ax == x or Dx == x) and \
24                    (Ay <= y and y <= Dy) or \
25                    (Ay == y or Dy == y) and \
26                    (Ax <= x and x <= Dx);
27    bool exterior = not interior and not borda;
28
29    std::cout << std::boolalpha
30        <<  "P in r: "
31        << interior << std::endl
32        <<  "P on \\partial r: "
33        << borda << std::endl
34        <<  "P not in \\hat r: "
35        << exterior << std::endl;
36
37    return 0;
38}
Exercício 2.5.4.

Implemente uma instrução para computar o operador xor (ou exclusivo). Dadas duas afirmações A e B, A xor B é true no caso de uma, e somente uma, das afirmações ser true, caso contrário é false.

Resposta 0.

(A or B) and not(A and B)

2.6 Ponteiros

Um ponteiro é uma variável que armazena o endereço de outra variável. Podemos declarar um ponteiro para qualquer tipo de variável em C++. Por exemplo, vamos estudemos o seguinte código.

1#include <iostream>
2
3int main()
4{
5    // ponteiro
6    int *ptr;
7
8    // variáveis
9    int x = 10;
10    int y = 20;
11
12    // endereço de x
13    ptr = &x;
14    std::cout << "&x = " << ptr << std::endl;
15
16    // altera o valor de x
17    *ptr = 30;
18    std::cout << "x = " << x << std::endl;
19
20    // endereço de y
21    ptr = &y;
22    std::cout << "&y = " << ptr << std::endl;
23
24    //altera o valor de y
25    y = 40;
26    std::cout << "y = " << *ptr << std::endl;
27
28    return 0;
29}

Na linha 6, declaramos um ponteiro para um inteiro. Na linha 13, atribuímos o endereço da variável x ao ponteiro ptr. O operador & retorna o endereço de uma variável. Na linha 17, alteramos o valor da variável x através do ponteiro ptr. O operador * retorna o valor armazenado no endereço apontado pelo ponteiro. Na linha 21, atribuímos o endereço da variável y ao ponteiro ptr. Na linha 19, alteramos o valor da variável y. Por fim na linha 26, imprimimos o valor da variável y através do ponteiro ptr.

Exercício 2.6.1.

Após as seguintes instruções serem executadas, os endereços das variáveis x e y são iguais? Justifique e verifique sua resposta.

1double x = 2.5;
2double y = -1.41;
3x = y;
Resposta 0.

Não. Ao serem declaradas as variáveis x e y são alocadas em endereços diferentes. A instrução x = y copia o valor de y (alocado no endereço &y) para x (alocada em outro endereço &x).

Exercício 2.6.2.

Sem executar, diga qual é o valor da variável y ao final da execução das seguintes instruções. Justifique e verifique sua resposta.

1double x = 2.5;
2double y = -1.25;
3double *ptr = &x;
4y += x**ptr;
Resposta 0.

y == 5.0.


Envie seu comentário

Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!

Opcional. Preencha seu nome para que eu possa lhe contatar.
Opcional. Preencha seu e-mail para que eu possa lhe contatar.
As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a política de uso de dados para mais informações.

Licença Creative Commons
Este texto é disponibilizado nos termos da Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional. Ícones e elementos gráficos podem estar sujeitos a condições adicionais.

Pedro H A Konzen
| | | |