| | | |

Minicurso de C++ para Matemática

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

3 Elementos da programação estruturada

C++ contém instruções de programação estruturada, em que as computações são organizadas em sequências de blocos computacionais e, um bloco inicia sua computação somente após o bloco anterior tiver terminado (sequência). Conta com estruturas de ramificação (seleção de blocos), repetição de blocos e definição de funções/métodos (subprogramas).

3.1 Métodos e funções

Um método (ou função) é um subprograma (ou sub-bloco computacional) que pode ser chamado/executado em qualquer parte do programa principal. Todo código C++ inicia-se na função main(). A sintaxe de definição de uma função é

1typeOut foo(typeIn0 x0, typeIn1 x1, ..., typeInN xN)
2{
3 typeOut out;
4 statement0;
5 statement1;
6 ...;
7 statementN;
8 return out;
9}

Aqui, typeOut denota o tipo da saída, foo denota o identificador/nome do método, typeIn0 x1, typeIn1 x2, …, typeInN xN são os tipos e identificadores dos parâmetros de entrada66endnote: 6Parâmetros de entrada são opcionais. O escopo do método é delimitado entre chaves e pode conter qualquer instrução (statement) C++. O método é encerrado77endnote: 7No encerramento do método o código retorna ao programa principal. quando terminado seu escopo ou ao encontrar a instrução return. Esta instrução,também, permite o retorno de um dado do mesmo tipo da saída do método.

Por exemplo, o seguinte código define a função

f(x)=2x3, (5)

computa e imprime os valores de f(1.0) e f(2.5).

Código 7: exFun.cpp
1#include <iostream>
2
3// define f
4double f(double x);
5
6int main()
7{
8 std::cout << "f(1.0) = "
9 << f(1.0) << std::endl;
10
11 double y = 2.5;
12 std::cout << "f(2.5) = "
13 << f(y) << std::endl;
14
15 return 0;
16}
17
18// implementa f
19double f(double x)
20{
21 double y = 2.0*x - 3.0;
22 return y;
23}
Observação 3.1.1.(void)

Um função pode ser um método (subprograma) que não retorna valor. Neste caso, o tipo de saída é +void+.

Exercício 3.1.1.

Implemente uma função para computar as raízes de um polinômio de grau 1 p(x)=ax+b. Assuma que a0.

Resposta 0.
1#include <iostream>
2
3double raizP1(double a, double b);
4
5int main()
6{
7 double a = 2.0;
8 double b = -1.0;
9
10 std::cout << a << "x"
11 << " + (" << b << ") = 0" << std::endl
12 << "x = " << raizP1(a, b) << std::endl;
13
14 return 0;
15}
16
17double raizP1(double a, double b)
18{
19 return -b / a;
20}
Exercício 3.1.2.

Implemente uma função para computar as raízes reais de um polinômio de grau 2 p(x)=ax2+bx+c. Assuma que p tenha raízes reais.

Resposta 0.
1#include <iostream>
2#include <cmath>
3
4void raizP2(double a, double b, double c,
5 double &x1, double &x2)
6{
7 // discriminante
8 double d = b * b - 4 * a * c;
9 x1 = (-b + sqrt(d)) / (2 * a);
10 x2 = (-b - sqrt(d)) / (2 * a);
11
12}
13
14int main()
15{
16 double a = 2.0;
17 double b = -6.0;
18 double c = 4.0;
19
20 double x1, x2;
21 raizP2(a, b, c, x1, x2);
22
23 std::cout << "x1 = " << x1 << std::endl
24 << "x2 = " << x2 << std::endl;
25
26 return 0;
27}
Exercício 3.1.3.

(Recursividade) Implemente uma função recursiva para computar o fatorial de um número natural n, i.e. n!.

Resposta 0.
1#include <iostream>
2#include <eigen3/Eigen/Eigen>
3
4double fatorial(int n);
5
6int main()
7{
8 std::cout << "Fatorial de 5: "
9 << fatorial(5) << std::endl;
10
11 return 0;
12}
13
14double fatorial(int n)
15{
16 // Fatorial de n
17 if (n == 0 || n == 1) return 1;
18 return n * fatorial(n - 1);
19}

3.2 Ramificação

Uma estrutura de ramificação é uma instrução para a tomada de decisões durante a execução de um programa. Na linguagem C++, usa-se a sintaxe

1if (condition0) {
2 block0;
3} else if (condition1) {
4 block1;
5} else {
6 block2;
7}

A instrução if permite a execução do bloco computacional block0 somente no caso de a condition0 seja true (verdadeira). A instrução else if somente é verificada quando condition0 == false. Neste caso, o block1 é executado somente se condition1 == true. Senão, block2 é executado.

Por exemplo, o seguinte código computa os zeros da função

f(x)=ax+b, (6)

para parâmetros informados por usuária(o). Verifique!

Código 8: ZeroP1.cpp
1#include <iostream>
2
3int main() {
4
5 double a,b;
6 std::cout << "Valor de a: ";
7 std::cin >> a;
8 std::cout << "Valor de b: ";
9 std::cin >> b;
10
11 if (a != 0.0) {
12 double raiz = -b/a;
13 std::cout << "Raíz: "
14 << raiz << std::endl;
15 } else if (b == 0.0) {
16 std::cout << "Todo x real é raíz."
17 << std::endl;
18 } else {
19 std::cout << "Não há raíz."
20 << std::endl;
21 }
22
23 return 0;
24}
Exercício 3.2.1.

Implemente um código que contenha uma função que recebe dois números n e m e imprime o maior deles.

Resposta 0.
1double max(double m, double n) {
2 double maior = m;
3 if (maior < n)
4 maior = n;
5 return maior;
6}
Exercício 3.2.2.

Implemente um código que contenha um método que recebe os coeficientes de um polinômio

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

e imprime se p têm ou não raízes reais.

Resposta 0.
1bool TemRaizesReais(double a, double b, double c) {
2 bool resp;
3
4 if (b*b - 4*a*c >= 0) {
5 std::cout << "Raízes reais."
6 << std::endl;
7 resp = true;
8 } else {
9 std::cout << "Não tem raízes reais."
10 << std::endl;
11 resp = false;
12 }
13
14 return resp;
15}
Exercício 3.2.3.

Implemente um código que contenha um método para a computação das raízes de um polinômio de segundo grau.

Resposta 0.
1int RaizesP2(double a, double b, double c,
2 double &x1, double &x2) {
3 // raízes reais flag == 0
4 // raízes complexas flag == 1
5 int flag = 0;
6
7 double disc = b*b - 4*a*c;
8
9 if (disc == 0.) {
10 x1 = (-b - sqrt(disc)) / (2*a);
11 x2 = (-b + sqrt(disc)) / (2*a);
12 } else if (disc == 0.0)
13 x1 = x2 = -b / (2*a);
14 else {
15 x1 = -b / (2*a);
16 x2 = sqrt(-disc) / (2*a);
17 flag = 1;
18 }
19
20 return flag;
21}

3.3 Repetição

Estruturas de repetição são instruções que permitem a execução repetida de um bloco computacional. São três instruções disponíveis while, do ... while e for.

3.3.1 while

A sintaxe da instrução while é

1while (condition) {
2 block
3}

Isto é, enquanto (while) a expressão condition == true, o bloco computacional block é repetidamente executado. Ao final de cada execução, a condição é novamente verificada. Quando condition == false, block não é executado e o código segue para a primeira instrução após o escopo do while.

Como aplicação, o seguinte código computa o fatorial de um número n.

Código 9: While.cpp
1int fatorial(int n) {
2 int i = 0;
3 int fat = 1;
4
5 while (i+1 <= n) {
6 fat *= i+1;
7 i += 1;
8 }
9
10 return fat;
11}
Observação 3.3.1.

As instruções de controle break, continue são bastante úteis em várias situações. A primeira, encerra as repetições e, a segunda, pula para uma nova repetição.

Exercício 3.3.1.

Use while para imprimir os dez primeiros números ímpares.

Resposta 0.
1int n = 1;
2int i = 1;
3while (i <= 10) {
4 std::cout << n
5 << std::endl;
6 n += 2;
7 i += 1;
8}
Exercício 3.3.2.

Use a instrução while para criar um método que retorne o n-ésimo termo da função de Fibonacci88endnote: 8Leonardo Fibonacci, 1170 - 1250, matemático italiano. Fonte: Wikipédia: Leonardo Fibonacci., n1.

Resposta 0.
1int fibonacci(int n) {
2 if ((n == 1) or (n == 2))
3 return 1;
4 else {
5 int i = 2;
6 int f0 = 1;
7 int f1 = 1;
8 int fa;
9 while (i+1 <= n) {
10 fa = f0 + f1;
11 f0 = f1;
12 f1 = fa;
13 i += 1;
14 }
15 return fa;
16 }
17}

3.3.2 do ... while

Diferentemente da instrução while, a do ... while verifica a condição de repetição ao final do escopo do seu bloco computacional.

Como aplicação, o seguinte método usa desta instrução para computar o fatorial de um número natual n. Compare com o Código 9.

Código 10: DoWhile.cpp
1int fatorial(int n) {
2 int i = 0;
3 int fat = 1;
4
5 do {
6 fat *= i+1;
7 i += 1;
8 } while (i < n);
9
10 return fat;
11}
Exercício 3.3.3.

Use do..while para imprimir os dez primeiros números ímpares.

Resposta 0.
1int n = 1;
2int i = 1;
3do {
4 std::cout << n
5 << std::endl;
6 n += 2;
7 i += 1;
8} while (i-1 < 10);
Exercício 3.3.4.

Use a instrução while para criar um método que retorne o n-ésimo termo da função de Fibonacci99endnote: 9Leonardo Fibonacci, 1170 - 1250, matemático italiano. Fonte: Wikipédia: Leonardo Fibonacci., n1.

Resposta 0.
1int fibonacci(int n) {
2 if ((n == 1) or (n == 2))
3 return 1;
4 else {
5 int i = 2;
6 int f0 = 1;
7 int f1 = 1;
8 int fa;
9 do {
10 fa = f0 + f1;
11 f0 = f1;
12 f1 = fa;
13 i += 1;
14 } while (i < n);
15 return fa;
16 }
17}

3.3.3 for

A estrutura for tem a sintaxe

1for (init; condition; iter) {
2 block;
3}

onde, init é a instrução de inicialização, condition é o critério de parada, iter é a instrução do iterador.

Como aplicação, o seguinte método usa desta instrução para computar o fatorial de um número natual n. Compare com as versões anteriores Códigos 9 e 10.

Código 11: For.cpp
1int fatorial(int n) {
2 int fat = 1;
3
4 for (int i=1; i<=n; i++)
5 fat *= i;
6
7 return fat;
8}
Exercício 3.3.5.

Use for para imprimir os dez primeiros números ímpares.

Resposta 0.
1int n = 1;
2for (int i=0; i<10; i++) {
3 std::cout << n << std::endl;
4 n += 2;
5}
Exercício 3.3.6.

Use a instrução for para criar um método que retorne o n-ésimo termo da função de Fibonacci1010endnote: 10Leonardo Fibonacci, 1170 - 1250, matemático italiano. Fonte: Wikipédia: Leonardo Fibonacci., n1.

Resposta 0.
1int fibonacci(int n) {
2
3 if ((n == 1) or (n == 2))
4 return 1;
5 else {
6 int f0 = 1;
7 int f1 = 1;
8 int fa;
9 for (int i=2; i<n; ++i) {
10 fa = f0 + f1;
11 f0 = f1;
12 f1 = fa;
13 }
14 return fa;
15 }
16}

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.

Minicurso de C++ para Matemática

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

3 Elementos da programação estruturada

C++ contém instruções de programação estruturada, em que as computações são organizadas em sequências de blocos computacionais e, um bloco inicia sua computação somente após o bloco anterior tiver terminado (sequência). Conta com estruturas de ramificação (seleção de blocos), repetição de blocos e definição de funções/métodos (subprogramas).

3.1 Métodos e funções

Um método (ou função) é um subprograma (ou sub-bloco computacional) que pode ser chamado/executado em qualquer parte do programa principal. Todo código C++ inicia-se na função main(). A sintaxe de definição de uma função é

1typeOut foo(typeIn0 x0, typeIn1 x1, ..., typeInN xN)
2{
3 typeOut out;
4 statement0;
5 statement1;
6 ...;
7 statementN;
8 return out;
9}

Aqui, typeOut denota o tipo da saída, foo denota o identificador/nome do método, typeIn0 x1, typeIn1 x2, …, typeInN xN são os tipos e identificadores dos parâmetros de entrada66endnote: 6Parâmetros de entrada são opcionais. O escopo do método é delimitado entre chaves e pode conter qualquer instrução (statement) C++. O método é encerrado77endnote: 7No encerramento do método o código retorna ao programa principal. quando terminado seu escopo ou ao encontrar a instrução return. Esta instrução,também, permite o retorno de um dado do mesmo tipo da saída do método.

Por exemplo, o seguinte código define a função

f(x)=2x3, (5)

computa e imprime os valores de f(1.0) e f(2.5).

Código 7: exFun.cpp
1#include <iostream>
2
3// define f
4double f(double x);
5
6int main()
7{
8 std::cout << "f(1.0) = "
9 << f(1.0) << std::endl;
10
11 double y = 2.5;
12 std::cout << "f(2.5) = "
13 << f(y) << std::endl;
14
15 return 0;
16}
17
18// implementa f
19double f(double x)
20{
21 double y = 2.0*x - 3.0;
22 return y;
23}
Observação 3.1.1.(void)

Um função pode ser um método (subprograma) que não retorna valor. Neste caso, o tipo de saída é +void+.

Exercício 3.1.1.

Implemente uma função para computar as raízes de um polinômio de grau 1 p(x)=ax+b. Assuma que a0.

Resposta 0.
1#include <iostream>
2
3double raizP1(double a, double b);
4
5int main()
6{
7 double a = 2.0;
8 double b = -1.0;
9
10 std::cout << a << "x"
11 << " + (" << b << ") = 0" << std::endl
12 << "x = " << raizP1(a, b) << std::endl;
13
14 return 0;
15}
16
17double raizP1(double a, double b)
18{
19 return -b / a;
20}
Exercício 3.1.2.

Implemente uma função para computar as raízes reais de um polinômio de grau 2 p(x)=ax2+bx+c. Assuma que p tenha raízes reais.

Resposta 0.
1#include <iostream>
2#include <cmath>
3
4void raizP2(double a, double b, double c,
5 double &x1, double &x2)
6{
7 // discriminante
8 double d = b * b - 4 * a * c;
9 x1 = (-b + sqrt(d)) / (2 * a);
10 x2 = (-b - sqrt(d)) / (2 * a);
11
12}
13
14int main()
15{
16 double a = 2.0;
17 double b = -6.0;
18 double c = 4.0;
19
20 double x1, x2;
21 raizP2(a, b, c, x1, x2);
22
23 std::cout << "x1 = " << x1 << std::endl
24 << "x2 = " << x2 << std::endl;
25
26 return 0;
27}
Exercício 3.1.3.

(Recursividade) Implemente uma função recursiva para computar o fatorial de um número natural n, i.e. n!.

Resposta 0.
1#include <iostream>
2#include <eigen3/Eigen/Eigen>
3
4double fatorial(int n);
5
6int main()
7{
8 std::cout << "Fatorial de 5: "
9 << fatorial(5) << std::endl;
10
11 return 0;
12}
13
14double fatorial(int n)
15{
16 // Fatorial de n
17 if (n == 0 || n == 1) return 1;
18 return n * fatorial(n - 1);
19}

3.2 Ramificação

Uma estrutura de ramificação é uma instrução para a tomada de decisões durante a execução de um programa. Na linguagem C++, usa-se a sintaxe

1if (condition0) {
2 block0;
3} else if (condition1) {
4 block1;
5} else {
6 block2;
7}

A instrução if permite a execução do bloco computacional block0 somente no caso de a condition0 seja true (verdadeira). A instrução else if somente é verificada quando condition0 == false. Neste caso, o block1 é executado somente se condition1 == true. Senão, block2 é executado.

Por exemplo, o seguinte código computa os zeros da função

f(x)=ax+b, (6)

para parâmetros informados por usuária(o). Verifique!

Código 8: ZeroP1.cpp
1#include <iostream>
2
3int main() {
4
5 double a,b;
6 std::cout << "Valor de a: ";
7 std::cin >> a;
8 std::cout << "Valor de b: ";
9 std::cin >> b;
10
11 if (a != 0.0) {
12 double raiz = -b/a;
13 std::cout << "Raíz: "
14 << raiz << std::endl;
15 } else if (b == 0.0) {
16 std::cout << "Todo x real é raíz."
17 << std::endl;
18 } else {
19 std::cout << "Não há raíz."
20 << std::endl;
21 }
22
23 return 0;
24}
Exercício 3.2.1.

Implemente um código que contenha uma função que recebe dois números n e m e imprime o maior deles.

Resposta 0.
1double max(double m, double n) {
2 double maior = m;
3 if (maior < n)
4 maior = n;
5 return maior;
6}
Exercício 3.2.2.

Implemente um código que contenha um método que recebe os coeficientes de um polinômio

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

e imprime se p têm ou não raízes reais.

Resposta 0.
1bool TemRaizesReais(double a, double b, double c) {
2 bool resp;
3
4 if (b*b - 4*a*c >= 0) {
5 std::cout << "Raízes reais."
6 << std::endl;
7 resp = true;
8 } else {
9 std::cout << "Não tem raízes reais."
10 << std::endl;
11 resp = false;
12 }
13
14 return resp;
15}
Exercício 3.2.3.

Implemente um código que contenha um método para a computação das raízes de um polinômio de segundo grau.

Resposta 0.
1int RaizesP2(double a, double b, double c,
2 double &x1, double &x2) {
3 // raízes reais flag == 0
4 // raízes complexas flag == 1
5 int flag = 0;
6
7 double disc = b*b - 4*a*c;
8
9 if (disc == 0.) {
10 x1 = (-b - sqrt(disc)) / (2*a);
11 x2 = (-b + sqrt(disc)) / (2*a);
12 } else if (disc == 0.0)
13 x1 = x2 = -b / (2*a);
14 else {
15 x1 = -b / (2*a);
16 x2 = sqrt(-disc) / (2*a);
17 flag = 1;
18 }
19
20 return flag;
21}

3.3 Repetição

Estruturas de repetição são instruções que permitem a execução repetida de um bloco computacional. São três instruções disponíveis while, do ... while e for.

3.3.1 while

A sintaxe da instrução while é

1while (condition) {
2 block
3}

Isto é, enquanto (while) a expressão condition == true, o bloco computacional block é repetidamente executado. Ao final de cada execução, a condição é novamente verificada. Quando condition == false, block não é executado e o código segue para a primeira instrução após o escopo do while.

Como aplicação, o seguinte código computa o fatorial de um número n.

Código 9: While.cpp
1int fatorial(int n) {
2 int i = 0;
3 int fat = 1;
4
5 while (i+1 <= n) {
6 fat *= i+1;
7 i += 1;
8 }
9
10 return fat;
11}
Observação 3.3.1.

As instruções de controle break, continue são bastante úteis em várias situações. A primeira, encerra as repetições e, a segunda, pula para uma nova repetição.

Exercício 3.3.1.

Use while para imprimir os dez primeiros números ímpares.

Resposta 0.
1int n = 1;
2int i = 1;
3while (i <= 10) {
4 std::cout << n
5 << std::endl;
6 n += 2;
7 i += 1;
8}
Exercício 3.3.2.

Use a instrução while para criar um método que retorne o n-ésimo termo da função de Fibonacci88endnote: 8Leonardo Fibonacci, 1170 - 1250, matemático italiano. Fonte: Wikipédia: Leonardo Fibonacci., n1.

Resposta 0.
1int fibonacci(int n) {
2 if ((n == 1) or (n == 2))
3 return 1;
4 else {
5 int i = 2;
6 int f0 = 1;
7 int f1 = 1;
8 int fa;
9 while (i+1 <= n) {
10 fa = f0 + f1;
11 f0 = f1;
12 f1 = fa;
13 i += 1;
14 }
15 return fa;
16 }
17}

3.3.2 do ... while

Diferentemente da instrução while, a do ... while verifica a condição de repetição ao final do escopo do seu bloco computacional.

Como aplicação, o seguinte método usa desta instrução para computar o fatorial de um número natual n. Compare com o Código 9.

Código 10: DoWhile.cpp
1int fatorial(int n) {
2 int i = 0;
3 int fat = 1;
4
5 do {
6 fat *= i+1;
7 i += 1;
8 } while (i < n);
9
10 return fat;
11}
Exercício 3.3.3.

Use do..while para imprimir os dez primeiros números ímpares.

Resposta 0.
1int n = 1;
2int i = 1;
3do {
4 std::cout << n
5 << std::endl;
6 n += 2;
7 i += 1;
8} while (i-1 < 10);
Exercício 3.3.4.

Use a instrução while para criar um método que retorne o n-ésimo termo da função de Fibonacci99endnote: 9Leonardo Fibonacci, 1170 - 1250, matemático italiano. Fonte: Wikipédia: Leonardo Fibonacci., n1.

Resposta 0.
1int fibonacci(int n) {
2 if ((n == 1) or (n == 2))
3 return 1;
4 else {
5 int i = 2;
6 int f0 = 1;
7 int f1 = 1;
8 int fa;
9 do {
10 fa = f0 + f1;
11 f0 = f1;
12 f1 = fa;
13 i += 1;
14 } while (i < n);
15 return fa;
16 }
17}

3.3.3 for

A estrutura for tem a sintaxe

1for (init; condition; iter) {
2 block;
3}

onde, init é a instrução de inicialização, condition é o critério de parada, iter é a instrução do iterador.

Como aplicação, o seguinte método usa desta instrução para computar o fatorial de um número natual n. Compare com as versões anteriores Códigos 9 e 10.

Código 11: For.cpp
1int fatorial(int n) {
2 int fat = 1;
3
4 for (int i=1; i<=n; i++)
5 fat *= i;
6
7 return fat;
8}
Exercício 3.3.5.

Use for para imprimir os dez primeiros números ímpares.

Resposta 0.
1int n = 1;
2for (int i=0; i<10; i++) {
3 std::cout << n << std::endl;
4 n += 2;
5}
Exercício 3.3.6.

Use a instrução for para criar um método que retorne o n-ésimo termo da função de Fibonacci1010endnote: 10Leonardo Fibonacci, 1170 - 1250, matemático italiano. Fonte: Wikipédia: Leonardo Fibonacci., n1.

Resposta 0.
1int fibonacci(int n) {
2
3 if ((n == 1) or (n == 2))
4 return 1;
5 else {
6 int f0 = 1;
7 int f1 = 1;
8 int fa;
9 for (int i=2; i<n; ++i) {
10 fa = f0 + f1;
11 f0 = f1;
12 f1 = fa;
13 }
14 return fa;
15 }
16}

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