CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014

1 / 26

# CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014 - PowerPoint PPT Presentation

CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014. Capítulo IX Subprogramação e Recursividade. Programa 9.1: Subprograma bem simples para somar #include &lt; stdio .h&gt; #include &lt;stdlib.h&gt; int soma (int x, int y) {return x + y;} int main ( ) { int a, b, c; printf (&quot;Digite a e b: &quot;);

I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.

## PowerPoint Slideshow about ' CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014' - iain

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

### CES-10 INTRODUÇÃO À COMPUTAÇÃOAulas Práticas – 2014

Capítulo IX

Programa 9.1: Subprograma bem simples para somar

#include <stdio.h>

#include <stdlib.h>

int soma (int x, int y)

{return x + y;}

int main ( ) {

int a, b, c;

printf ("Digite a e b: ");

scanf ("%d%d", &a, &b);

c = soma (a, b);

printf ("\nc = a + b = %d + %d = %d", a, b, c);

printf ("\n\n"); system ("pause"); return 0;

}

Copiar, salvar e executar

Programa 9.2: Mesmo efeito, porém sem retornar valor

#include <stdio.h>

#include <stdlib.h>

void soma (int *z, int x, int y)

{*z = x + y;}

int main ( ) {

int a, b, c;

printf ("Digite a e b: ");

scanf ("%d%d", &a, &b);

soma (&c, a, b);

printf ("\nc = a + b = %d + %d = %d", a, b, c);

printf ("\n\n"); system ("pause"); return 0;

}

Copiar, salvar e executar

#include <stdio.h>

#include <stdlib.h>

void soma (int *z, int x, int y)

{*z = x + y;}

int main ( ) {

int a, b, c;

printf ("Digite a e b: ");

scanf ("%d%d", &a, &b);

soma (&c, a, b);

printf ("\nc = a + b = %d + %d = %d", a, b, c);

printf ("\n\n"); system ("pause"); return 0;

}

Função main

a

b

c

#include <stdio.h>

#include <stdlib.h>

void soma (int *z, int x, int y)

{*z = x + y;}

int main ( ) {

int a, b, c;

printf ("Digite a e b: ");

scanf ("%d%d", &a, &b);

soma (&c, a, b);

printf ("\nc = a + b = %d + %d = %d", a, b, c);

printf ("\n\n"); system ("pause"); return 0;

}

Função main

a

b

c

Leitura de a e b: 151 346

#include <stdio.h>

#include <stdlib.h>

void soma (int *z, int x, int y)

{*z = x + y;}

int main ( ) {

int a, b, c;

printf ("Digite a e b: ");

scanf ("%d%d", &a, &b);

soma (&c, a, b);

printf ("\nc = a + b = %d + %d = %d", a, b, c);

printf ("\n\n"); system ("pause"); return 0;

}

Função main

a

b

c

151

346

Leitura de a e b: 151 346

Função soma

#include <stdio.h>

#include <stdlib.h>

void soma (int *z, int x, int y)

{*z = x + y;}

int main ( ) {

int a, b, c;

printf ("Digite a e b: ");

scanf ("%d%d", &a, &b);

soma (&c, a, b);

printf ("\nc = a + b = %d + %d = %d", a, b, c);

printf ("\n\n"); system ("pause"); return 0;

}

Função main

a

b

c

x

y

z

151

346

Alocação das variáveis de soma

Função soma

#include <stdio.h>

#include <stdlib.h>

void soma (int *z, int x, int y)

{*z = x + y;}

int main ( ) {

int a, b, c;

printf ("Digite a e b: ");

scanf ("%d%d", &a, &b);

soma (&c, a, b);

printf ("\nc = a + b = %d + %d = %d", a, b, c);

printf ("\n\n"); system ("pause"); return 0;

}

Função main

a

b

c

x

y

z

151

346

Passagem dos argumentos aos parâmetros

Função soma

#include <stdio.h>

#include <stdlib.h>

void soma (int *z, int x, int y)

{*z = x + y;}

int main ( ) {

int a, b, c;

printf ("Digite a e b: ");

scanf ("%d%d", &a, &b);

soma (&c, a, b);

printf ("\nc = a + b = %d + %d = %d", a, b, c);

printf ("\n\n"); system ("pause"); return 0;

}

Função main

a

b

c

x

y

z

151

346

151

346

Passagem dos argumentos aos parâmetros

Função soma

#include <stdio.h>

#include <stdlib.h>

void soma (int *z, int x, int y)

{*z = x + y;}

int main ( ) {

int a, b, c;

printf ("Digite a e b: ");

scanf ("%d%d", &a, &b);

soma (&c, a, b);

printf ("\nc = a + b = %d + %d = %d", a, b, c);

printf ("\n\n"); system ("pause"); return 0;

}

Função main

a

b

c

x

y

z

151

346

151

346

z recebeu o endereço de c

z é um ponteiro (apontando para c)

Função soma

#include <stdio.h>

#include <stdlib.h>

void soma (int *z, int x, int y)

{*z = x + y;}

int main ( ) {

int a, b, c;

printf ("Digite a e b: ");

scanf ("%d%d", &a, &b);

soma (&c, a, b);

printf ("\nc = a + b = %d + %d = %d", a, b, c);

printf ("\n\n"); system ("pause"); return 0;

}

Função main

a

b

c

x

y

z

c

151

346

151

346

497

O local cujo endereço está em z (*z) recebeo valor de x+y

Função soma

#include <stdio.h>

#include <stdlib.h>

void soma (int *z, int x, int y)

{*z = x + y;}

int main ( ) {

int a, b, c;

printf ("Digite a e b: ");

scanf ("%d%d", &a, &b);

soma (&c, a, b);

printf ("\nc = a + b = %d + %d = %d", a, b, c);

printf ("\n\n"); system ("pause"); return 0;

}

Função main

a

b

x

y

z

c

151

346

151

346

497

Desalocação das variáveis de soma

#include <stdio.h>

#include <stdlib.h>

void soma (int *z, int x, int y)

{*z = x + y;}

int main ( ) {

int a, b, c;

printf ("Digite a e b: ");

scanf ("%d%d", &a, &b);

soma (&c, a, b);

printf ("\nc = a + b = %d + %d = %d", a, b, c);

printf ("\n\n"); system ("pause"); return 0;

}

Função main

a

b

c

151

346

497

Desalocação das variáveis de soma

#include <stdio.h>

#include <stdlib.h>

void soma (int *z, int x, int y)

{*z = x + y;}

int main ( ) {

int a, b, c;

printf ("Digite a e b: ");

scanf ("%d%d", &a, &b);

soma (&c, a, b);

printf ("\nc = a + b = %d + %d = %d", a, b, c);

printf ("\n\n"); system ("pause"); return 0;

}

Função main

a

b

c

151

346

497

Será escrito: c = a + b = 151 + 346 = 497

Programa 9.3: Cálculo recursivo de fatorial

Formula recursiva

-1, para n < 0

n! = 1, para 0 ≤ n ≤ 1

n * (n-1)!, para n > 1

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

int fat (int n) {

int f;

if (n < 0) f = -1;

elseif (n <= 1) f = 1;

else f = n * fat(n - 1);

return f;

}

int main() {

int n;

printf ("Calculo de fatorial de n");

printf ("\n\n\tDigite n: ");

scanf ("%d", &n);

printf ("\n\tFat(%d) = %d", n, fat(n));

printf ("\n\n"); system ("pause"); return 0;

}

Copiar, salvar e executar

Programa 9.4: Cálculo recursivo instrumentado de fatorial

int v = 0; //Numero da versao de fat: global

int fat (int n) {

int f;

int i;

v++;

printf ("\n");

for (i = 1; i <= v; i++) printf (" ");

printf ("Entrada em fatversao %d; n = %d; ", v, n);

printf ("Digite algo: "); getche (); printf ("\n");

if (n < 0) f = -1;

elseif (n <= 1) f = 1;

else f = n * fat(n - 1);

printf ("\n");

for (i = 1; i <= v; i++) printf (" ");

printf ("Saida de fat versao %d; n = %d; fat = %d; ",

v, n, f);

printf ("Digite algo: "); getche (); printf ("\n");

v--;

if (v == 0) printf ("\n");

return f;

}

Alterar a função fat do programa anterior

Copiar, salvar e executar

1, para n = 0

An = A * An-1, para n > 0

Exercício 9.1: Potência de expoentes inteiros e não negativos

An (n inteiro e não negativo)

• Escrever um programa para implementar a seguinte fórmula recursiva:
• A função main pode ser parecida com a do programa do fatorial

a, p/ (|a2 - n| < e)

• Escrever um programa para implementar a seguinte fórmula recursiva:
• A primeira aproximação e a precisão devem ser lidas na função main

-1, p/ n < 0

0, p/ n = 0

Fib (n) = 1, p/ n = 1

Fib (n-2) + Fib (n-1), p/ n > 1

Exercício 9.3: Números de Fibonacci (procriação de coelhos)

• Gerar a sequência de números de Fibonacci para um dado valor de n, usando a seguinte fórmula recursiva:
• O programa deve montar uma tabela com os números de Fibonacci e com o número de chamadas recursivas para gerar cada um deles
• Para tanto, o programa deve ser devidamente instrumentado (ver como exemplo a tabela a seguir)
Exemplo: tabela para n = 20

n | Fib(n) | Chamadas recursivas

--------------------------------------------------------

0 | 0 | 1

1 | 1 | 1

2 | 1 | 3

3 | 2 | 5

4 | 3 | 9

5 | 5 | 15

6 | 8 | 25

7 | 13 | 41

8 | 21 | 67

9 | 34 | 109

10 | 55 | 177

11 | 89 | 287

12 | 144 | 465

13 | 233 | 753

14 | 377 | 1219

15 | 610 | 1973

16 | 987 | 3193

17 | 1597 | 5167

18 | 2584 | 8361

19 | 4181 | 13529

20 | 6765 | 21891

Tarefa 1 do Lab 9: Função binomial
• Em Análise Combinatória, o coeficiente binomial tem a seguinte formulação recursiva:
• Usando esta formulação, escrever um programa para ler um inteiro positivo m e montar duas matrizes quadradas:
• A primeira de nome A(m x m), onde A[i][j] = Binom (i, j), para 0  i  m-1 e 0  j  m-1
• A segunda de nome B(m x m), onde B[i][j] deverá conter o número de chamadas recursivas para calcular A[i][j], para 0  i  m-1 e 0  j  m-1

-1, p/ n < 0, k < 0 ou k >n

Binom (n, k) = 1, p/ k = 0 ou k = n

Binom (n-1, k-1) + Binom (n-1, k), p/ outros casos

Exemplo: matrizes para m = 8

Digite a dimensao das matrizes: 8

Matriz A com os valores da funcao binomial:

1 -1 -1 -1 -1 -1 -1 -1

1 1 -1 -1 -1 -1 -1 -1

1 2 1 -1 -1 -1 -1 -1

1 3 3 1 -1 -1 -1 -1

1 4 6 4 1 -1 -1 -1

1 5 10 10 5 1 -1 -1

1 6 15 20 15 6 1 -1

1 7 21 35 35 21 7 1

Matriz B com os numeros de chamadas recursivas da funcao binomial:

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1

1 3 1 1 1 1 1 1

1 5 5 1 1 1 1 1

1 7 11 7 1 1 1 1

1 9 19 19 9 1 1 1

1 11 29 39 29 11 1 1

1 13 41 69 69 41 13 1

i

j

i

j

Tarefa 2 do Lab 9: Função com aninhamento de recursividade
• Uma função h(n) tem a seguinte formulação recursiva aninhada:
• Usando esta formulação, escrever um programa para ler um inteiro positivo m e montar uma tabela de h(n) e do número de chamadas recursivas para o cálculo de h(n), para 0  n  m

-1, p/ n < 0

0, p/ n = 0

h (n) = n, p/ n > 4

h (2 + h (2*n)), p/ 1 ≤ n ≤ 4

Exemplo: tabela para m = 8

n | h(n) | Chamadas recursivas

--------------------------------------------------------

0 | 0 | 1

1 | 14 | 7

2 | 12 | 5

3 | 8 | 3

4 | 10 | 3

5 | 5 | 1

6 | 6 | 1

7 | 7 | 1

8 | 8 | 1

Tarefa 3 do Lab 9: Função Ackermann
• Uma importante função teórica conhecida como função de Ackermann tem a seguinte formulação recursiva:
• Usando esta formulação, escrever um programa para ler dois inteiros positivos p e q e montar duas matrizes:
• A primeira de nome A(p x q), onde

A[i][j] = Acker (i, j), para 0  i  p-1 e 0  j  q-1

• A segunda de nome B(p x q), onde B[i][j] deverá conter o número de chamadas recursivas para calcular A[i][j], para 0  i  p-1 e 0  j  q-1

-1, p/ m < 0 ou n < 0

Acker (m, n) = n+1, p/ m = 0 e n ≥ 0

Acker (m-1, 1) p/ n = 0 e m > 0

Acker (m-1, Acker (m, n-1), p/ outros casos

Exemplo: matrizes para p = 4 e q = 8

Matrizes com valores e chamadas recursivas da funcaoackermann

Digite as dimensoes das matrizes: 4 8

Matriz A com os valores da funcaoacker:

1 2 3 4 5 6 7 8

2 3 4 5 6 7 8 9

3 5 7 9 11 13 15 17

5 13 29 61 125 253 509 1021

Matriz B com os numeros de chamadas recursivas da funcaoacker:

1 1 1 1 1 1 1 1

2 4 6 8 10 12 14 16

5 14 27 44 65 90 119 152

15 106 541 2432 10307 42438 172233 693964

i

j

i

j