| | | | |

4 Elementos da Programação Estruturada

C/C++ são linguagens procedurais1010endnote: 10C++ também é orientada-a-objetos. e contém instruções para a programação estruturada. Neste paradigma de programação, 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. Contam com estruturas de ramificação (seleção de blocos), repetição de blocos e definição de funções/métodos (sub-blocos computacionais).

4.1 Métodos/Funções

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

1typeOut foo(typeIn0 x0, typeIn1 x1, ..., typeInN x2)
2{
3  typeOut out;
4  statment0;
5  statment1;
6  ...;
7  statmentN;
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 x3 são os tipos e identificadores dos parâmetros de entrada1111endnote: 11Parâmetros de entrada são opcionais. O escopo do método é delimitado entre chaves e pode conter qualquer instrução (statment) C/C++. O método é encerrado1212endnote: 12No 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.

Exemplo 4.1.

Vamos considerar a função

f(x)=2x3. (8)
  1. a)

    No código abaixo, o método f computa a função e imprime seu valor1313endnote: 13void é a instrução para “no type”..

    Código 6: method.cc
    1#include <stdio.h>
    2
    3void f(double x)
    4{
    5  double y = 2.*x - 3.;
    6  printf("f(%lf) = %lf\n", x, y);
    7}
    8
    9int main()
    10{
    11  f(0.);
    12  double x = -1.;
    13  f(x);
    14  double y = 2.;
    15  f(y);
    16  return 0;
    17}
  2. b)

    Nesta versão do código, o método f retorna o valor computado da função f e é o método principal main que imprime o resultado.

    1#include <stdio.h>
    2
    3double f(double x)
    4{
    5  return 2.*x - 3.;
    6}
    7
    8int main()
    9{
    10  double y = f(0.);
    11  printf("f(%lf) = %lf\n", 0., y);
    12  printf("f(%lf) = %lf\n", -1., f(-1.));
    13  double z = 2.;
    14  printf("f(%lf) = %lf\n", z, f(z));
    15  return 0;
    16}
Exercício 4.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.

Exercício 4.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.

Exercício 4.1.3.

Considerando vetores em 3

x=(x1,x2,x3), (9)
y=(y1,y2,y3), (10)

implemente um código que contenha:

  1. a)

    função para computação do vetor soma 𝒙+𝒚.

  2. b)

    função para computação do produto escalar 𝒙𝒚.

Exercício 4.1.4.

Implemente uma função que computa o determinante de matrizes reais 2×2.

Exercício 4.1.5.

Implemente uma função que computa a multiplicação matrix-vetor Ax, com A 2×2 e x um vetor coluna de dois elementos.

Exercício 4.1.6.

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

4.2 Ramificação

Uma estrutura de ramificação é uma instrução para a tomada de decisões durante a execução de um programa. Nas linguagens C/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.

Exemplo 4.2.

Os seguintes códigos computam os zeros da função

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

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

  1. a)

    Caso restrito a raiz real única.

    1#include <stdio.h>
    2
    3int main()
    4{
    5  double a,b;
    6  printf("a = ");
    7  scanf("%lf", &a);
    8  printf("b = ");
    9  scanf("%lf", &b);
    10
    11  if (a != 0.) {
    12    double x = -b/a;
    13    printf("x = %lf\n", x);
    14  }
    15
    16  return 0;
    17}
  2. b)

    Caso de raiz real única ou múltiplas.

    1#include <stdio.h>
    2
    3int main()
    4{
    5  double a,b;
    6  printf("a = ");
    7  scanf("%lf", &a);
    8  printf("b = ");
    9  scanf("%lf", &b);
    10
    11  if (a != 0.) {
    12    double x = -b/a;
    13    printf("x = %lf\n", x);
    14  } else if ((a == 0.) && (b == 0.)) {
    15    printf("Todo x real é zero da função.\n");
    16  }
    17
    18  return 0;
    19}
  3. c)

    Caso de raiz real única, ou múltiplas ou nenhuma.

    1#include <stdio.h>
    2
    3int main()
    4{
    5  double a,b;
    6  printf("a = ");
    7  scanf("%lf", &a);
    8  printf("b = ");
    9  scanf("%lf", &b);
    10
    11  if (a != 0.) {
    12    double x = -b/a;
    13    printf("x = %lf\n", x);
    14  }
    15
    16  return 0;
    17}
Exercício 4.2.1.

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

Exercício 4.2.2.

Implemente um código que contenha uma função que recebe os coeficientes de um polinômio

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

e classifique-o como um polinômio de grau 0, 1 ou 2.

Exercício 4.2.3.

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

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

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

Exemplo 4.3.

O seguinte código computa a soma dos 10 primeiros termos da progressão geométrica

ai=2i, (13)

para i=0,1,2,.

Código 7: while.cc
1#include <stdio.h>
2#include <math.h>
3
4int main()
5{
6  int i = 0;
7  double s = 0.;
8  while (i < 10) {
9    s = s + pow(0.5, double(i));
10    i += 1;
11  }
12  printf("s = %lf\n", s);
13  return 0;
14}
Observação 4.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 4.3.1.

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

Exercício 4.3.2.

Crie uma função para a computação da soma de dois vetores 𝒙,𝒚n, com dado n0.

Exercício 4.3.3.

Use a instrução while para escreva uma função que retorne o n-ésimo termo da função de Fibonacci1414endnote: 14Leonardo Fibonacci, 1170 - 1250, matemático italiano. Fonte: Wikipédia: Leonardo Fibonacci., n1.

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

Exemplo 4.4.

O seguinte código computa a soma dos 10 primeiros termos da progressão geométrica

ai=2i, (14)

para i=0,1,2,.

Código 8: doWhile.cc
1#include <stdio.h>
2#include <math.h>
3
4int main()
5{
6  int i = 0;
7  double s;
8  do {
9    s += pow(0.5, double(i));
10    i += 1;
11  } while (i < 10);
12  printf("s = %lf\n", s);
13  return 0;
14}
Exercício 4.4.1.

Uma aplicação do Método Babilônico1515endnote: 15Matemática Babilônica, matemática desenvolvida na Mesopotâmia, desde os Sumérios até a queda da Babilônia em 539 a.C.. Fonte: Wikipédia. para a aproximação da solução da equação x22=0, consiste na iteração

x0=1, (15)
xi+1=xi2+1xi,i=0,1,2, (16)

Faça um código com while para computar aproximação xi, tal que |xixi1|<105.

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

Exemplo 4.5.

O seguinte código computa a soma dos 10 primeiros termos da progressão geométrica

ai=2i, (17)

para i=0,1,2,.

1#include <stdio.h>
2#include <math.h>
3
4int main()
5{
6  double s = 0;
7  for (int i=0; i<10; ++i) {
8    s += pow(2., double(-i));
9  }
10  printf("s = %lf\n", s);
11  return 0;
12}
Exercício 4.4.2.

Use a instrução for para escreva uma função que retorne o n-ésimo termo da função de Fibonacci1616endnote: 16Leonardo Fibonacci, 1170 - 1250, matemático italiano. Fonte: Wikipédia: Leonardo Fibonacci., n1.

Exercício 4.4.3.

Implemente uma função para computar o produto escalar de dois vetores de n elementos. Use a instrução de repetição for e assuma que os vetores estão alocados como um arranjo double.

Exercício 4.4.4.

Implemente uma função para computar a multiplicação de uma matriz A n×n por um vetor coluna x de n elementos. Use a instrução for e assuma que o vetor e a matriz estejam alocadas como arranjos double.

Exercício 4.4.5.

Implemente uma função para computar a multiplicação de uma matriz A n×m por uma matriz B de m×n. Use a instrução for e assuma que as matrizes estão alocadas como arranjos double.


Envie seu comentário

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 Use de Dados para mais informações. Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!