37
CES-10 INTRODUÇÃO À CES-10 INTRODUÇÃO À COMPUTAÇÃO COMPUTAÇÃO Aulas Práticas – 2013 Aulas Práticas – 2013 Capítulo X Capítulo X Subprogramação e Subprogramação e Recursividade Recursividade

CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

Embed Size (px)

Citation preview

Page 1: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

CES-10 INTRODUÇÃO CES-10 INTRODUÇÃO À COMPUTAÇÃOÀ COMPUTAÇÃO

Aulas Práticas – 2013Aulas Práticas – 2013

Capítulo X Capítulo X

Subprogramação e Subprogramação e RecursividadeRecursividade

Page 2: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

Programa 10.1: Subprograma bem simples Programa 10.1: Subprograma bem simples para somarpara somar

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

int soma (int x, int y)int soma (int x, int y)

{return x + y;}{return x + y;}

void main ( ) {void main ( ) {

int a, b, c;int a, b, c;

printf ("Digite a e b: ");printf ("Digite a e b: ");

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

c = soma (a, b);c = soma (a, b);

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

printf ("\n\nDigite algo para encerrar: "); getch();printf ("\n\nDigite algo para encerrar: "); getch();

}}

Copiar, salvar e executar

Page 3: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

Programa 10.2: Mesmo efeito, porém sem Programa 10.2: Mesmo efeito, porém sem retornar valorretornar valor

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

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

{*z = x + y;}{*z = x + y;}

void main ( ) {void main ( ) {

int a, b, c;int a, b, c;

printf ("Digite a e b: ");printf ("Digite a e b: ");

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

soma (&c, a, b);soma (&c, a, b);

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

printf ("\n\nDigite algo para encerrar: "); getch();printf ("\n\nDigite algo para encerrar: "); getch();

}}

Copiar, salvar e executar

Page 4: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

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

{ *z = x + y; }{ *z = x + y; }

void main ( ) {void main ( ) {

int a, b, c;int a, b, c;

printf ("Digite a e b: ");printf ("Digite a e b: ");

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

soma (&c, a, b);soma (&c, a, b);

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

printf ("\n\nDigite algo para encerrar: "); getch();printf ("\n\nDigite algo para encerrar: "); getch();

}}

Função main

a b c

Page 5: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

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

{ *z = x + y; }{ *z = x + y; }

void main ( ) {void main ( ) {

int a, b, c;int a, b, c;

printf ("Digite a e b: ");printf ("Digite a e b: ");

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

soma (&c, a, b);soma (&c, a, b);

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

printf ("\n\nDigite algo para encerrar: "); getch();printf ("\n\nDigite algo para encerrar: "); getch();

}}

Função main

a b c

Leitura de a e b: 151 346

Page 6: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

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

{ *z = x + y; }{ *z = x + y; }

void main ( ) {void main ( ) {

int a, b, c;int a, b, c;

printf ("Digite a e b: ");printf ("Digite a e b: ");

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

soma (&c, a, b);soma (&c, a, b);

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

printf ("\n\nDigite algo para encerrar: "); getch();printf ("\n\nDigite algo para encerrar: "); getch();

}}

Função main

151

a 346

b c

Leitura de a e b: 151 346

Page 7: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

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

{ *z = x + y; }{ *z = x + y; }

void main ( ) {void main ( ) {

int a, b, c;int a, b, c;

printf ("Digite a e b: ");printf ("Digite a e b: ");

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

soma (&c, a, b);soma (&c, a, b);

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

printf ("\n\nDigite algo para encerrar: "); getch();printf ("\n\nDigite algo para encerrar: "); getch();

}}

Função main

151

a 346

b c

Alocação das variáveis de soma

Função soma

x y z

Page 8: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

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

{ *z = x + y; }{ *z = x + y; }

void main ( ) {void main ( ) {

int a, b, c;int a, b, c;

printf ("Digite a e b: ");printf ("Digite a e b: ");

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

soma (&c, a, b);soma (&c, a, b);

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

printf ("\n\nDigite algo para encerrar: "); getch();printf ("\n\nDigite algo para encerrar: "); getch();

}}

Função main

151

a 346

b c

Passagem dos argumentos aos parâmetros

Função soma

x y z

Page 9: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

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

{ *z = x + y; }{ *z = x + y; }

void main ( ) {void main ( ) {

int a, b, c;int a, b, c;

printf ("Digite a e b: ");printf ("Digite a e b: ");

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

soma (&c, a, b);soma (&c, a, b);

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

printf ("\n\nDigite algo para encerrar: "); getch();printf ("\n\nDigite algo para encerrar: "); getch();

}}

Função main

151

a 346

b c

Passagem dos argumentos aos parâmetros

Função soma

151

x 346

y z

Page 10: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

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

{ *z = x + y; }{ *z = x + y; }

void main ( ) {void main ( ) {

int a, b, c;int a, b, c;

printf ("Digite a e b: ");printf ("Digite a e b: ");

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

soma (&c, a, b);soma (&c, a, b);

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

printf ("\n\nDigite algo para encerrar: "); getch();printf ("\n\nDigite algo para encerrar: "); getch();

}}

Função main

151

a 346

b c

z recebeu o endereço de c

z é um ponteiro (apontando para c)

Função soma

151

x 346

y z

Page 11: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

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

{ { *z = x + y;*z = x + y; } }

void main ( ) {void main ( ) {

int a, b, c;int a, b, c;

printf ("Digite a e b: ");printf ("Digite a e b: ");

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

soma (&c, a, b);soma (&c, a, b);

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

printf ("\n\nDigite algo para encerrar: "); getch();printf ("\n\nDigite algo para encerrar: "); getch();

}}

Função main

151

a 346

b c

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

Função soma

151

x 346

y z

497

c

Page 12: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

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

{ *z = x + y; }{ *z = x + y; }

void main ( ) {void main ( ) {

int a, b, c;int a, b, c;

printf ("Digite a e b: ");printf ("Digite a e b: ");

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

soma (&c, a, b);soma (&c, a, b);

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

printf ("\n\nDigite algo para encerrar: "); getch();printf ("\n\nDigite algo para encerrar: "); getch();

}}

Função main

151

a 346

b

Função soma

151

x 346

y z

497

c

Desalocação das variáveis de soma

Page 13: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

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

{ *z = x + y; }{ *z = x + y; }

void main ( ) {void main ( ) {

int a, b, c;int a, b, c;

printf ("Digite a e b: ");printf ("Digite a e b: ");

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

soma (&c, a, b);soma (&c, a, b);

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

printf ("\n\nDigite algo para encerrar: "); getch();printf ("\n\nDigite algo para encerrar: "); getch();

}}

Função main

151

a 346

b 497

c

Desalocação das variáveis de soma

Page 14: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

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

{ *z = x + y; }{ *z = x + y; }

void main ( ) {void main ( ) {

int a, b, c;int a, b, c;

printf ("Digite a e b: ");printf ("Digite a e b: ");

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

soma (&c, a, b);soma (&c, a, b);

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

printf ("\n\nDigite algo para encerrar: "); getch();printf ("\n\nDigite algo para encerrar: "); getch();

}}

Função main

151

a 346

b 497

c

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

Page 15: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

#include <stdio.h>#include <stdio.h>#include <conio.h>#include <conio.h>

int fat (int n) {int fat (int n) {int f;int f;if (n < 0) f = -1;if (n < 0) f = -1;else if (n <= 1) f = 1;else if (n <= 1) f = 1;else f = n * fat(n - 1);else f = n * fat(n - 1);return f;return f;

}}

void main() {void main() {int n;int n;

printf ("Calculo de fatorial de n");printf ("Calculo de fatorial de n"); printf ("\n\n\tDigite n: ");printf ("\n\n\tDigite n: ");

scanf ("%d", &n);scanf ("%d", &n); printf ("\n\tFat(%d) = %d", n, fat(n));printf ("\n\tFat(%d) = %d", n, fat(n)); printf("\n\nDigite algo para encerrar: ");printf("\n\nDigite algo para encerrar: "); getch();getch();}}

Copiar, salvar e executar

Formula recursiva

-1, para n < 0n! = 1, para 0 ≤ n ≤ 1

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

Programa 10.3: Cálculo recursivo de fatorial

Page 16: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

int fat (int n) {int fat (int n) {int f;int f;static int v = 0; int i;static int v = 0; int i;v++;v++;

printf ("\n");printf ("\n");for (i = 1; i <= v; i++) printf (" ");for (i = 1; i <= v; i++) printf (" ");printf ("Entrada em fat versao %d; n = %d; ", v, n);printf ("Entrada em fat versao %d; n = %d; ", v, n);printf ("Digite algo: "); getche (); printf ("\n");printf ("Digite algo: "); getche (); printf ("\n");if (n < 0) f = -1;if (n < 0) f = -1;else if (n <= 1) f = 1;else if (n <= 1) f = 1;else f = n * fat(n - 1);else f = n * fat(n - 1);

printf ("\n");printf ("\n");for (i = 1; i <= v; i++) printf (" ");for (i = 1; i <= v; i++) printf (" ");printf ("Saida de fat versao %d; n = %d; fat = %d; ", printf ("Saida de fat versao %d; n = %d; fat = %d; ",

v, n, f);v, n, f);printf ("Digite algo: "); getche (); printf ("\n");printf ("Digite algo: "); getche (); printf ("\n");v--;v--;

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

}}

Copiar, salvar e executar

Programa 10.4: Cálculo recursivo instrumentado de fatorial

Alterar a função fat do programa anterior

Page 17: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

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

AAnn (n inteiro e não negativo) (n inteiro e não negativo)

Escrever um programa para implementar a Escrever um programa para implementar a seguinte seguinte fórmula recursivafórmula recursiva::

A função A função main main pode ser parecida com a do pode ser parecida com a do programa do programa do fatorialfatorial

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

Page 18: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

Exercício 10.2: Raiz quadradaExercício 10.2: Raiz quadrada

Escrever um programa para implementar a Escrever um programa para implementar a seguinte seguinte fórmula recursivafórmula recursiva::

aa é uma é uma aproximaçãoaproximação para a raiz quadrada; para a raiz quadrada; ee é a é a precisãoprecisão desejada desejada

A A primeira aproximaçãoprimeira aproximação e a e a precisãoprecisão devem devem ser lidas na função ser lidas na função mainmain

a, p/ (|a2 - n| < e)RaizQuad (n, a, e) = RaizQuad (n, (a2+n)/(2*a), e), caso contrário

Page 19: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

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

Gerar a sequência de números de Gerar a sequência de números de FibonacciFibonacci para para um dado valor de um dado valor de nn, usando a seguinte , usando a seguinte fórmula fórmula recursivarecursiva::

O programa deve montar uma O programa deve montar uma tabelatabela com os com os números de números de FibonacciFibonacci e com o número de e com o número de chamadas recursivas para gerar cada um deleschamadas recursivas para gerar cada um deles

Para tanto, o programa deve ser devidamente Para tanto, o programa deve ser devidamente instrumentadoinstrumentado (ver como exemplo a tabela a (ver como exemplo a tabela a seguir)seguir)

-1, p/ n < 00, p/ n = 0

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

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

Page 20: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

Exemplo: tabela para n = 20Exemplo: tabela para n = 20

n | Fib(n) | Chamadas recursivasn | Fib(n) | Chamadas recursivas---------------------------------------------------------------------------------------------------------------- 0 | 0 | 10 | 0 | 1 1 | 1 | 11 | 1 | 1 2 | 1 | 32 | 1 | 3 3 | 2 | 53 | 2 | 5 4 | 3 | 94 | 3 | 9 5 | 5 | 155 | 5 | 15 6 | 8 | 256 | 8 | 25 7 | 13 | 417 | 13 | 41 8 | 21 | 678 | 21 | 67 9 | 34 | 1099 | 34 | 109 10 | 55 | 17710 | 55 | 177 11 | 89 | 28711 | 89 | 287 12 | 144 | 46512 | 144 | 465 13 | 233 | 75313 | 233 | 753 14 | 377 | 121914 | 377 | 1219 15 | 610 | 197315 | 610 | 1973 16 | 987 | 319316 | 987 | 3193 17 | 1597 | 516717 | 1597 | 5167 18 | 2584 | 836118 | 2584 | 8361 19 | 4181 | 1352919 | 4181 | 13529 20 | 6765 | 2189120 | 6765 | 21891

Page 21: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

Exercício 10.4: Cálculo de matriz menor-Exercício 10.4: Cálculo de matriz menor-complementarcomplementar

Matriz menor-complementar: Matriz menor-complementar: usada para o usada para o cálculo recursivo de cálculo recursivo de determinantesdeterminantes pela regra de pela regra de LaplaceLaplace

O O Lab 10Lab 10 de CES-10 será uma instrumentação do de CES-10 será uma instrumentação do cálculo recursivo de cálculo recursivo de determinantesdeterminantes por por LaplaceLaplace

Seja uma matriz quadrada Seja uma matriz quadrada A(n x n)A(n x n)

Matriz Matriz menor-complementar (i, j)menor-complementar (i, j) de de AA é aquela é aquela obtida pela eliminação da obtida pela eliminação da linha ilinha i e da e da coluna jcoluna j de de AA

Simbolicamente, Simbolicamente, MenorComplementar (A, i, j)MenorComplementar (A, i, j)

Page 22: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

Exemplo: Exemplo: seja a seguinte matriz seja a seguinte matriz A(5 x 5):A(5 x 5):

MenorComplementar (A, 3, 1):MenorComplementar (A, 3, 1):

15 23 -18

87 8

-1 67 25 -62

40

7 32 -84

43 -9

87 14 -4 22 50-

3397 25 -6 77

15 -18

87 8

-1 25 -62

40

7 -84

43 -9

-33

25 -6 77

15 -18

87 8

-1 25 -62

40

7 -84

43 -9

-33

25 -6 77

Completar o programa a seguir para:

1) Ler uma matriz A;2) Ler i e j;3)Calcular MenorComplementar (A, i, j)

Page 23: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

struct matquadrada {struct matquadrada {

int n; float elem[10][10];int n; float elem[10][10];

};};

typedef struct matquadrada matquadrada;typedef struct matquadrada matquadrada;

void LerMatQuadrada (matquadrada *);void LerMatQuadrada (matquadrada *);

void EscreverMatQuadrada (matquadrada *);void EscreverMatQuadrada (matquadrada *);

matquadrada MenorComplementar (matquadrada *, int, int);matquadrada MenorComplementar (matquadrada *, int, int);

Matrizes serão guardadas em estruturas

A passagem dos argumentos struct’s será por referência para economia de memória

n

elem

O tipomatquadrada

Page 24: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

void main () {void main () {

matquadrada A, B; int i, j;matquadrada A, B; int i, j;

LerMatQuadrada (&A);LerMatQuadrada (&A);

printf ("\nMatriz A: \n\n");printf ("\nMatriz A: \n\n");

EscreverMatQuadrada (&A);EscreverMatQuadrada (&A);

printf ("\nMatriz Menor Complementar (i, j) de A:\n\n");printf ("\nMatriz Menor Complementar (i, j) de A:\n\n");

printf ("Digite i e j: ");printf ("Digite i e j: ");

scanf ("%d%d", &i, &j);scanf ("%d%d", &i, &j);

printf ("\n");printf ("\n");

B = MenorComplementar (&A, i, j);B = MenorComplementar (&A, i, j);

EscreverMatQuadrada (&B);EscreverMatQuadrada (&B);

printf("\n\nDigite algo para encerrar: ");printf("\n\nDigite algo para encerrar: ");

getch();getch();

}}

O endereço de A é o argumento, pois a função vai alterar A

O endereço de A é o argumento, por economia, mas poderia se o valor de A

O endereço de A é um dos argumentos, mas poderia se o valor de A

O valor retornado é uma estrutura matquadrada, que é atribuída a B

Page 25: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

void LerMatQuadrada (matquadrada *Mat) {void LerMatQuadrada (matquadrada *Mat) {

int i, j;int i, j;

FILE *ff;FILE *ff;

ff = fopen ("MatrizDet.txt", "r");ff = fopen ("MatrizDet.txt", "r");

printf ("Digite a dimensao n da matriz (1 <= n <= 10): printf ("Digite a dimensao n da matriz (1 <= n <= 10): ");");

scanf ("%d", &scanf ("%d", &Mat->nMat->n););

for (i = 0; i <= Mat->n-1; i++)for (i = 0; i <= Mat->n-1; i++)

for (j = 0; j <= Mat->n-1; j++)for (j = 0; j <= Mat->n-1; j++)

fscanf (ff, "%f", &fscanf (ff, "%f", &Mat->elem[i][j]Mat->elem[i][j]););

}}

Na função main:

LerMatQuadrada (&A);

A matriz vai ser lida de um arquivo

A dimensão da matriz será digitada

O local cujo endereço está em Mat é que vai receber os valores lidos

Mat->n equivale a (*Mat).n

Ambos significam: campo n da estrutura cujo endereço está em Mat, ou, da estrutura apontada por Mat

Page 26: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

main: main: LerMatQuadrada (&A);LerMatQuadrada (&A);

void LerMatQuadrada (matquadrada *Mat) {void LerMatQuadrada (matquadrada *Mat) {

int i, j;int i, j;

FILE *ff;FILE *ff;

ff = fopen ("MatrizDet.txt", "r");ff = fopen ("MatrizDet.txt", "r");

printf ("Digite a dimensao n da matriz (1 <= n <= 10): printf ("Digite a dimensao n da matriz (1 <= n <= 10): ");");

scanf ("%d", &scanf ("%d", &Mat->nMat->n););

for (i = 0; i <= Mat->n-1; i++)for (i = 0; i <= Mat->n-1; i++)

for (j = 0; j <= Mat->n-1; j++)for (j = 0; j <= Mat->n-1; j++)

fscanf (ff, "%f", &fscanf (ff, "%f", &Mat->elem[i][j]Mat->elem[i][j]););

}}

n

elem

A

Mat

Chamada de LerMatQuadradaPassagem do argumento &A

Page 27: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

void EscreverMatQuadrada (matquadrada *Mat) {void EscreverMatQuadrada (matquadrada *Mat) {

- - - - -- - - - -

}}

matquadrada MenorComplementar (matquadrada *C, matquadrada MenorComplementar (matquadrada *C,

int i, int j) {int i, int j) {

matquadrada D;matquadrada D;

- - - - -- - - - -

return D;return D;

}}

Na função main:

EscreverMatQuadrada (&A); EscreverMatQuadrada (&B);

Na função main:

B = MenorComplementar (&A, i, j);

Em ambas as funções, a passagem da estrutura matquadrada poderia ser por valor, mas, para evitar transporte de estruturas da main para elas, essa passagem é por referência (endereço)

Page 28: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

Exercício 10.5: Cálculo recursivo de Exercício 10.5: Cálculo recursivo de determinantes por Laplacedeterminantes por Laplace

O cálculo do O cálculo do determinantedeterminante de uma matriz de uma matriz quadrada quadrada AA de dimensão de dimensão nn pode ter a seguinte pode ter a seguinte formulação formulação recursivarecursiva::

Page 29: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

Escrever uma função recursiva que:Escrever uma função recursiva que:

Tenha como parâmetros uma matriz quadrada Tenha como parâmetros uma matriz quadrada A A e outra e outra n n do tipo inteirodo tipo inteiro e que calcule e e que calcule e retorne o valor de retorne o valor de Det (A, n)Det (A, n), utilizando a , utilizando a definição acimadefinição acima

O argumento para a matriz O argumento para a matriz AA deve ser passado deve ser passado por referência e aquele para por referência e aquele para nn deve ser deve ser passado por valorpassado por valor

Tal função deve retornar um valor atípico (por Tal função deve retornar um valor atípico (por exemplo, -999999999) se o valor de exemplo, -999999999) se o valor de nn for for negativonegativo

Page 30: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

Fazer uma função Fazer uma função main main para: para:

Ler a dimensão e os elementos de uma matriz Ler a dimensão e os elementos de uma matriz quadrada quadrada

Escrever no vídeo esses elementos Escrever no vídeo esses elementos

Calcular e escrever o valor do determinante Calcular e escrever o valor do determinante dessa matriz, chamando para isso a função dessa matriz, chamando para isso a função descrita anteriormente descrita anteriormente

Page 31: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

A função A função mainmain deve aproveitar a declaração de deve aproveitar a declaração de matquadradamatquadrada e as funções e as funções LerMatQuadradaLerMatQuadrada, , EscreverMatQuadradaEscreverMatQuadrada e e MenorComplementarMenorComplementar, elaboradas no , elaboradas no exercício anterior exercício anterior

A A matriz de entrada matriz de entrada para o cálculo do para o cálculo do determinante deverá ser determinante deverá ser lida de um arquivolida de um arquivo

A A dimensãodimensão da matriz deve ser da matriz deve ser digitadadigitada pelo pelo operador e operador e lidalida pelo programa, para que ela pelo programa, para que ela possa possa variarvariar entre execuções entre execuções

Page 32: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

Exemplo de conteúdo para o arquivo Exemplo de conteúdo para o arquivo MatrizDet.txtMatrizDet.txt::

2 5 -4 -9 -3 5 -7 5 2 52 5 -4 -9 -3 5 -7 5 2 5

0 3 5 0 4 4 -6 8 -3 -80 3 5 0 4 4 -6 8 -3 -8

7 2 1 -6 5 9 2 -7 4 -37 2 1 -6 5 9 2 -7 4 -3

-1 6 0 8 3 -4 7 -2 9 5-1 6 0 8 3 -4 7 -2 9 5

8 -3 9 0 5 9 -2 5 2 38 -3 9 0 5 9 -2 5 2 3

7 3 -4 -3 1 9 -3 3 -5 -27 3 -4 -3 1 9 -3 3 -5 -2

9 3 -2 1 0 4 2 -5 3 19 3 -2 1 0 4 2 -5 3 1

3 -1 0 7 2 -3 7 8 -2 73 -1 0 7 2 -3 7 8 -2 7

-5 9 2 -4 -3 0 9 2 5 2-5 9 2 -4 -3 0 9 2 5 2

5 -4 1 8 6 -2 9 -9 -1 95 -4 1 8 6 -2 9 -9 -1 9

Para dimensões diferentes de 10, as linhas do Para dimensões diferentes de 10, as linhas do arquivo arquivo nãonão mais mais correspondemcorrespondem às linhas da às linhas da matrizmatriz

Page 33: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

Exercício 10.6: Instrumentação do programa Exercício 10.6: Instrumentação do programa dos determinantesdos determinantes

Fazer alterações e inclusões no programa do Fazer alterações e inclusões no programa do exercício anterior para montar uma exercício anterior para montar uma tabelatabela com: com:

– o número de (o número de (somas e subtraçõessomas e subtrações) de ) de números reais números reais

– e com o número de e com o número de multiplicaçõesmultiplicações de de números reaisnúmeros reais

realizadas pelo programa, em função da realizadas pelo programa, em função da dimensãodimensão da matriz de entradada matriz de entrada

Numa só execução, variar a dimensão de Numa só execução, variar a dimensão de 11 a a 1010

Só contabilizar uma operação se os Só contabilizar uma operação se os doisdois operandos operandos forem forem reaisreaisA seguir, um exemplo de saída para o programa

instrumentado

Page 34: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

Calculo de determinante com instrumentacaoCalculo de determinante com instrumentacao

Matriz com dimensao 1:Matriz com dimensao 1:

| 2|| 2|

Valor do determinante: 2Valor do determinante: 2

Matriz com dimensao 2:Matriz com dimensao 2:

| 2 5|| 2 5|| -4 -9|| -4 -9|

Valor do determinante: 2Valor do determinante: 2

Matriz com dimensao 3:Matriz com dimensao 3:

| 2 5 -4|| 2 5 -4|| -9 -3 5|| -9 -3 5|| -7 5 2|| -7 5 2|

Valor do determinante: 117Valor do determinante: 117

Matriz com dimensao 4:Matriz com dimensao 4:

| 2 5 -4 -9|| 2 5 -4 -9|| -3 5 -7 5|| -3 5 -7 5|| 2 5 0 3|| 2 5 0 3|| 5 0 4 4|| 5 0 4 4|

Valor do determinante: 1500Valor do determinante: 1500

Page 35: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

Matriz com dimensao 5:Matriz com dimensao 5:

| 2 5 -4 -9 -3|| 2 5 -4 -9 -3|| 5 -7 5 2 5|| 5 -7 5 2 5|| 0 3 5 0 4|| 0 3 5 0 4|| 4 -6 8 -3 -8|| 4 -6 8 -3 -8|| 7 2 1 -6 5|| 7 2 1 -6 5|

Valor do determinante: -13159Valor do determinante: -13159

Matriz com dimensao 6:Matriz com dimensao 6:

| 2 5 -4 -9 -3 5|| 2 5 -4 -9 -3 5|| -7 5 2 5 0 3|| -7 5 2 5 0 3|| 5 0 4 4 -6 8|| 5 0 4 4 -6 8|| -3 -8 7 2 1 -6|| -3 -8 7 2 1 -6|| 5 9 2 -7 4 -3|| 5 9 2 -7 4 -3|| -1 6 0 8 3 -4|| -1 6 0 8 3 -4|

Valor do determinante: 350952Valor do determinante: 350952

Matriz com dimensao 7:Matriz com dimensao 7:

| 2 5 -4 -9 -3 5 -7|| 2 5 -4 -9 -3 5 -7|| 5 2 5 0 3 5 0|| 5 2 5 0 3 5 0|| 4 4 -6 8 -3 -8 7|| 4 4 -6 8 -3 -8 7|| 2 1 -6 5 9 2 -7|| 2 1 -6 5 9 2 -7|| 4 -3 -1 6 0 8 3|| 4 -3 -1 6 0 8 3|| -4 7 -2 9 5 8 -3|| -4 7 -2 9 5 8 -3|| 9 0 5 9 -2 5 2|| 9 0 5 9 -2 5 2|

Valor do determinante: -16384052Valor do determinante: -16384052

Page 36: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

Matriz com dimensao 8:Matriz com dimensao 8:

| 2 5 -4 -9 -3 5 -7 5|| 2 5 -4 -9 -3 5 -7 5|

| 2 5 0 3 5 0 4 4|| 2 5 0 3 5 0 4 4|

| -6 8 -3 -8 7 2 1 -6|| -6 8 -3 -8 7 2 1 -6|

| 5 9 2 -7 4 -3 -1 6|| 5 9 2 -7 4 -3 -1 6|

| 0 8 3 -4 7 -2 9 5|| 0 8 3 -4 7 -2 9 5|

| 8 -3 9 0 5 9 -2 5|| 8 -3 9 0 5 9 -2 5|

| 2 3 7 3 -4 -3 1 9|| 2 3 7 3 -4 -3 1 9|

| -3 3 -5 -2 9 3 -2 1|| -3 3 -5 -2 9 3 -2 1|

Valor do determinante: 69763296Valor do determinante: 69763296

Matriz com dimensao 9:Matriz com dimensao 9:

| 2 5 -4 -9 -3 5 -7 5 2|| 2 5 -4 -9 -3 5 -7 5 2|

| 5 0 3 5 0 4 4 -6 8|| 5 0 3 5 0 4 4 -6 8|

| -3 -8 7 2 1 -6 5 9 2|| -3 -8 7 2 1 -6 5 9 2|

| -7 4 -3 -1 6 0 8 3 -4|| -7 4 -3 -1 6 0 8 3 -4|

| 7 -2 9 5 8 -3 9 0 5|| 7 -2 9 5 8 -3 9 0 5|

| 9 -2 5 2 3 7 3 -4 -3|| 9 -2 5 2 3 7 3 -4 -3|

| 1 9 -3 3 -5 -2 9 3 -2|| 1 9 -3 3 -5 -2 9 3 -2|

| 1 0 4 2 -5 3 1 3 -1|| 1 0 4 2 -5 3 1 3 -1|

| 0 7 2 -3 7 8 -2 7 -5|| 0 7 2 -3 7 8 -2 7 -5|

Valor do determinante: -561120064Valor do determinante: -561120064

Page 37: CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo X Subprogramação e Recursividade

Matriz com dimensao 10:Matriz com dimensao 10:

| 2 5 -4 -9 -3 5 -7 5 2 5|| 2 5 -4 -9 -3 5 -7 5 2 5|

| 0 3 5 0 4 4 -6 8 -3 -8|| 0 3 5 0 4 4 -6 8 -3 -8|

| 7 2 1 -6 5 9 2 -7 4 -3|| 7 2 1 -6 5 9 2 -7 4 -3|

| -1 6 0 8 3 -4 7 -2 9 5|| -1 6 0 8 3 -4 7 -2 9 5|

| 8 -3 9 0 5 9 -2 5 2 3|| 8 -3 9 0 5 9 -2 5 2 3|

| 7 3 -4 -3 1 9 -3 3 -5 -2|| 7 3 -4 -3 1 9 -3 3 -5 -2|

| 9 3 -2 1 0 4 2 -5 3 1|| 9 3 -2 1 0 4 2 -5 3 1|

| 3 -1 0 7 2 -3 7 8 -2 7|| 3 -1 0 7 2 -3 7 8 -2 7|

| -5 9 2 -4 -3 0 9 2 5 2|| -5 9 2 -4 -3 0 9 2 5 2|

| 5 -4 1 8 6 -2 9 -9 -1 9|| 5 -4 1 8 6 -2 9 -9 -1 9|

Valor do determinante: -9804412928Valor do determinante: -9804412928

Numeros de somas+subtracoes e multiplicacoes:Numeros de somas+subtracoes e multiplicacoes:

Dimensao: 1 0 somas+subtracoes 0 multiplicacoesDimensao: 1 0 somas+subtracoes 0 multiplicacoes

Dimensao: 2 1 somas+subtracoes 2 multiplicacoesDimensao: 2 1 somas+subtracoes 2 multiplicacoes

Dimensao: 3 5 somas+subtracoes 12 multiplicacoesDimensao: 3 5 somas+subtracoes 12 multiplicacoes

Dimensao: 4 24 somas+subtracoes 52 multiplicacoesDimensao: 4 24 somas+subtracoes 52 multiplicacoes

Dimensao: 5 125 somas+subtracoes 265 multiplicacoesDimensao: 5 125 somas+subtracoes 265 multiplicacoes

Dimensao: 6 756 somas+subtracoes 1596 multiplicacoesDimensao: 6 756 somas+subtracoes 1596 multiplicacoes

Dimensao: 7 5299 somas+subtracoes 11179 multiplicacoesDimensao: 7 5299 somas+subtracoes 11179 multiplicacoes

Dimensao: 8 42400 somas+subtracoes 89440 multiplicacoesDimensao: 8 42400 somas+subtracoes 89440 multiplicacoes

Dimensao: 9 381609 somas+subtracoes 804969 multiplicacoesDimensao: 9 381609 somas+subtracoes 804969 multiplicacoes

Dimensao: 10 3816100 somas+subtracoes 8049700 multiplicacoesDimensao: 10 3816100 somas+subtracoes 8049700 multiplicacoes