ces-10 introduÇÃo À computaÇÃo capítulo viii subprogramação

83
CES-10 INTRODUÇÃO À CES-10 INTRODUÇÃO À COMPUTAÇÃO COMPUTAÇÃO Capítulo VIII Capítulo VIII Subprogramação Subprogramação

Upload: eric-pedroso-bandeira

Post on 07-Apr-2016

215 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

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

Capítulo VIII Capítulo VIII SubprogramaçãoSubprogramação

Page 2: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Capítulo VIII – Capítulo VIII – SubprogramaçãoSubprogramação

8.1 – Introdução8.1 – Introdução8.2 – Escopo de validade de declarações8.2 – Escopo de validade de declarações8.3 – Parâmetros e passagem de 8.3 – Parâmetros e passagem de

argumentosargumentos8.4 – Prototipação de subprogramas8.4 – Prototipação de subprogramas8.5 – Classes de alocação8.5 – Classes de alocação8.6 – Recursividade8.6 – Recursividade

Page 3: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

8.1 – Introdução8.1 – Introdução8.1.1 – Conceito de subprograma8.1.1 – Conceito de subprograma Como já foi visto em capítulos anteriores, um Como já foi visto em capítulos anteriores, um

programaprograma pode ser pode ser organizadoorganizado em em um ou mais um ou mais módulosmódulos

Um deles, o Um deles, o módulo oumódulo ou programa principalprograma principal, , obrigatório em todos os programas, é aquele pelo obrigatório em todos os programas, é aquele pelo qual qual começacomeça a execução a execução

Os outros eventuais módulos são Os outros eventuais módulos são auxiliaresauxiliares do do mesmo e são chamados de mesmo e são chamados de subprogramassubprogramas. .

Durante sua execução, o Durante sua execução, o programa principalprograma principal poderá fazer poderá fazer chamadaschamadas a esses subprogramasa esses subprogramas

Page 4: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Fluxo de controle de um programa com Fluxo de controle de um programa com subprogramas:subprogramas:

Page 5: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

As As funções da bibliotecafunções da biblioteca são subprogramas são subprogramas supridos pela linguagemsupridos pela linguagem

Quando o Quando o programadorprogramador deseja usar algum deseja usar algum subprograma que não pertençasubprograma que não pertença à biblioteca, à biblioteca, ele deve ele deve programá-loprogramá-lo

Page 6: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

8.1.2 – Argumentos e parâmetros de 8.1.2 – Argumentos e parâmetros de subprogramassubprogramas

Numa Numa chamadachamada de subprograma, pode-se de subprograma, pode-se especificar os especificar os valoresvalores ou ou variáveisvariáveis sobre os quais sobre os quais essa chamada deve essa chamada deve atuaratuar

Esses valores e/ou variáveis são denominados Esses valores e/ou variáveis são denominados argumentos de chamadaargumentos de chamada

Por exemplo, na atribuição Por exemplo, na atribuição

x = b*sin(a) - a*sin(b) + (a+b)*sin(a+b) – (a-b)*sin(a-b);x = b*sin(a) - a*sin(b) + (a+b)*sin(a+b) – (a-b)*sin(a-b);

há há 4 chamadas4 chamadas do subprograma do subprograma sinsin pertencente à pertencente à biblioteca, para calcular respectivamente os senos biblioteca, para calcular respectivamente os senos dos argumentos dos argumentos

aa, , bb, , a+ba+b e e a-ba-b

Page 7: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Um Um argumentoargumento de chamada pode ser uma de chamada pode ser uma expressãoexpressão, mas pode ser também um , mas pode ser também um endereçoendereço

Por exemplo, quando se deseja Por exemplo, quando se deseja ler um valorler um valor para uma variável escalar para uma variável escalar aa, pode-se usar a , pode-se usar a função função scanf scanf da biblioteca de C da biblioteca de C

Fornece-lhe como argumento o endereço de Fornece-lhe como argumento o endereço de aa, , ou seja, ou seja, &a&a::

scanf (“%d”, &a)scanf (“%d”, &a)

Uma chamada de subprograma pode ter Uma chamada de subprograma pode ter zero zero ou maisou mais argumentos argumentos

Page 8: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

O O primeiro atoprimeiro ato da execução de uma da execução de uma chamadachamada de de subprograma é a subprograma é a passagempassagem de seus eventuais de seus eventuais argumentosargumentos

Nesse ato, os Nesse ato, os valoresvalores dos argumentos são dos argumentos são calculadoscalculados e, em seguida, são e, em seguida, são armazenadosarmazenados cada cada um numa um numa variávelvariável especial local do subprograma especial local do subprograma denominada denominada parâmetroparâmetro

Em seguida, o subprograma Em seguida, o subprograma realiza sua tarefarealiza sua tarefa, , usando e eventualmente alterando os usando e eventualmente alterando os valoresvalores de de seus seus parâmetrosparâmetros

Então, se for o caso, Então, se for o caso, resultadosresultados são produzidos e são produzidos e entregues (retornados)entregues (retornados) ao módulo que o chamou ao módulo que o chamou

Page 9: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int fat (int n) {int fat (int n) {

int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}int main () {int main () {

int a, b, c;int a, b, c; printf ("Digite dois inteiros: ");printf ("Digite dois inteiros: ");

scanf ("%d%d", &a, &b);scanf ("%d%d", &a, &b); c = 5 + fat (a+b);c = 5 + fat (a+b);

printf ("\n\t5 + fat (%d + %d) = %d", a, b, c);printf ("\n\t5 + fat (%d + %d) = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;}}

Exemplo: calculo do fatorial de a+b

Subprograma fat:

Calculador de fatoriais

Chamada do subprograma fat:

Para calcular o fatorial de a+b

Page 10: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int fat (int n) {int fat (int n) {

int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}int main () {int main () {

int a, b, c;int a, b, c; printf ("Digite dois inteiros: ");printf ("Digite dois inteiros: ");

scanf ("%d%d", &a, &b);scanf ("%d%d", &a, &b); c = 5 + fat (a+b);c = 5 + fat (a+b);

printf ("\n\t5 + fat (%d + %d) = %d", a, b, c);printf ("\n\t5 + fat (%d + %d) = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;}}

a

b

c

Page 11: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int fat (int n) {int fat (int n) {

int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}int main () {int main () {

int a, b, c;int a, b, c; printf ("Digite dois inteiros: ");printf ("Digite dois inteiros: ");

scanf ("%d%d", &a, &b);scanf ("%d%d", &a, &b); c = 5 + fat (a+b);c = 5 + fat (a+b);

printf ("\n\t5 + fat (%d + %d) = %d", a, b, c);printf ("\n\t5 + fat (%d + %d) = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;}}

a

b

c

Leitura p/ a e b: 5 e 2

Page 12: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int fat (int n) {int fat (int n) {

int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}int main () {int main () {

int a, b, c;int a, b, c; printf ("Digite dois inteiros: ");printf ("Digite dois inteiros: ");

scanf ("%d%d", &a, &b);scanf ("%d%d", &a, &b); c = 5 + fat (a+b);c = 5 + fat (a+b);

printf ("\n\t5 + fat (%d + %d) = %d", a, b, c);printf ("\n\t5 + fat (%d + %d) = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;}}

5a

2b

c

Leitura p/ a e b: 5 e 2

Page 13: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int fat (int n) {int fat (int n) {

int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}int main () {int main () {

int a, b, c;int a, b, c; printf ("Digite dois inteiros: ");printf ("Digite dois inteiros: ");

scanf ("%d%d", &a, &b);scanf ("%d%d", &a, &b); c = 5 + fat (a+b);c = 5 + fat (a+b);

printf ("\n\t5 + fat (%d + %d) = %d", a, b, c);printf ("\n\t5 + fat (%d + %d) = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;}}

5a

2b

c

Chamada de fat (a+b)

Page 14: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int fat (int n) {int fat (int n) {

int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}int main () {int main () {

int a, b, c;int a, b, c; printf ("Digite dois inteiros: ");printf ("Digite dois inteiros: ");

scanf ("%d%d", &a, &b);scanf ("%d%d", &a, &b); c = 5 + fat (a+b);c = 5 + fat (a+b);

printf ("\n\t5 + fat (%d + %d) = %d", a, b, c);printf ("\n\t5 + fat (%d + %d) = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;}}

5a

2b

c

Cálculo do argumento de fat

Argumento:a+b = 5+2 =

7

Page 15: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int fat (int n) {int fat (int n) {

int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}int main () {int main () {

int a, b, c;int a, b, c; printf ("Digite dois inteiros: ");printf ("Digite dois inteiros: ");

scanf ("%d%d", &a, &b);scanf ("%d%d", &a, &b); c = 5 + fat (a+b);c = 5 + fat (a+b);

printf ("\n\t5 + fat (%d + %d) = %d", a, b, c);printf ("\n\t5 + fat (%d + %d) = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;}}

5a

2b

c

Alocação das variáveis de fat na memória

i fat

n (parâmetro)

Argumento:a+b = 5+2 =

7

Page 16: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int fat (int n) {int fat (int n) {

int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}int main () {int main () {

int a, b, c;int a, b, c; printf ("Digite dois inteiros: ");printf ("Digite dois inteiros: ");

scanf ("%d%d", &a, &b);scanf ("%d%d", &a, &b); c = 5 + fat (a+b);c = 5 + fat (a+b);

printf ("\n\t5 + fat (%d + %d) = %d", a, b, c);printf ("\n\t5 + fat (%d + %d) = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;}}

5a

2b

c

Passagem do argumento 7 para o parâmetro n

i fat

n (parâmetro)

Argumento:a+b = 5+2 =

7

Page 17: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int fat (int n) {int fat (int n) {

int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}int main () {int main () {

int a, b, c;int a, b, c; printf ("Digite dois inteiros: ");printf ("Digite dois inteiros: ");

scanf ("%d%d", &a, &b);scanf ("%d%d", &a, &b); c = 5 + fat (a+b);c = 5 + fat (a+b);

printf ("\n\t5 + fat (%d + %d) = %d", a, b, c);printf ("\n\t5 + fat (%d + %d) = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;}}

5a

2b

c

Passagem do argumento 7 para o parâmetro n

i fat

7n (parâmetro)

Argumento:a+b = 5+2 =

7

Page 18: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int fat (int n) {int fat (int n) {

int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}int main () {int main () {

int a, b, c;int a, b, c; printf ("Digite dois inteiros: ");printf ("Digite dois inteiros: ");

scanf ("%d%d", &a, &b);scanf ("%d%d", &a, &b); c = 5 + fat (a+b);c = 5 + fat (a+b);

printf ("\n\t5 + fat (%d + %d) = %d", a, b, c);printf ("\n\t5 + fat (%d + %d) = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;}}

5a

2b

c

Execução dos comandos de fat

i fat

7n (parâmetro)

Page 19: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int fat (int n) {int fat (int n) {

int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}int main () {int main () {

int a, b, c;int a, b, c; printf ("Digite dois inteiros: ");printf ("Digite dois inteiros: ");

scanf ("%d%d", &a, &b);scanf ("%d%d", &a, &b); c = 5 + fat (a+b);c = 5 + fat (a+b);

printf ("\n\t5 + fat (%d + %d) = %d", a, b, c);printf ("\n\t5 + fat (%d + %d) = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;}}

5a

2b

c

Execução dos comandos de fat

8i 5040

fat

7n (parâmetro)

Page 20: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int fat (int n) {int fat (int n) {

int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}int main () {int main () {

int a, b, c;int a, b, c; printf ("Digite dois inteiros: ");printf ("Digite dois inteiros: ");

scanf ("%d%d", &a, &b);scanf ("%d%d", &a, &b); c = 5 + fat (a+b);c = 5 + fat (a+b);

printf ("\n\t5 + fat (%d + %d) = %d", a, b, c);printf ("\n\t5 + fat (%d + %d) = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;}}

5a

2b

c

Execução do comando return

8i 5040

fat

7n (parâmetro)

Page 21: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int fat (int n) {int fat (int n) {

int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}int main () {int main () {

int a, b, c;int a, b, c; printf ("Digite dois inteiros: ");printf ("Digite dois inteiros: ");

scanf ("%d%d", &a, &b);scanf ("%d%d", &a, &b); c = 5 + fat (a+b);c = 5 + fat (a+b);

printf ("\n\t5 + fat (%d + %d) = %d", a, b, c);printf ("\n\t5 + fat (%d + %d) = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;}}

5a

2b

c

Cálculo do valor a retornar

8i 5040

fat

7n (parâmetro)

Valor a retornar:

fat = 5040

Page 22: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int fat (int n) {int fat (int n) {

int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}int main () {int main () {

int a, b, c;int a, b, c; printf ("Digite dois inteiros: ");printf ("Digite dois inteiros: ");

scanf ("%d%d", &a, &b);scanf ("%d%d", &a, &b); c = 5 + fat (a+b);c = 5 + fat (a+b);

printf ("\n\t5 + fat (%d + %d) = %d", a, b, c);printf ("\n\t5 + fat (%d + %d) = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;}}

5a

2b

c

Recepção do valor retornado

8i 5040

fat

7n (parâmetro)

Valor a retornar:

fat = 5040Valor

retornado:5040

Page 23: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int fat (int n) {int fat (int n) {

int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}int main () {int main () {

int a, b, c;int a, b, c; printf ("Digite dois inteiros: ");printf ("Digite dois inteiros: ");

scanf ("%d%d", &a, &b);scanf ("%d%d", &a, &b); c = 5 + fat (a+b);c = 5 + fat (a+b);

printf ("\n\t5 + fat (%d + %d) = %d", a, b, c);printf ("\n\t5 + fat (%d + %d) = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;}}

5a

2b

c

Desalocação das variáveis de fat

8i 5040

fat

7n (parâmetro)

Valor a retornar:

fat = 5040Valor

retornado:5040

Page 24: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int fat (int n) {int fat (int n) {

int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}int main () {int main () {

int a, b, c;int a, b, c; printf ("Digite dois inteiros: ");printf ("Digite dois inteiros: ");

scanf ("%d%d", &a, &b);scanf ("%d%d", &a, &b); c = 5 + fat (a+b);c = 5 + fat (a+b);

printf ("\n\t5 + fat (%d + %d) = %d", a, b, c);printf ("\n\t5 + fat (%d + %d) = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;}}

5a

2b

c

Cálculo de c = 5 + fat (a+b)

Valor retornado:

5040

5 + fat (a+b) = 5 + 5040 = 5045

Page 25: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int fat (int n) {int fat (int n) {

int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}int main () {int main () {

int a, b, c;int a, b, c; printf ("Digite dois inteiros: ");printf ("Digite dois inteiros: ");

scanf ("%d%d", &a, &b);scanf ("%d%d", &a, &b); c = 5 + fat (a+b);c = 5 + fat (a+b);

printf ("\n\t5 + fat (%d + %d) = %d", a, b, c);printf ("\n\t5 + fat (%d + %d) = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;}}

5a

2b

5045

c

Cálculo de c = 5 + fat (a+b)

Valor retornado:

5040

5 + fat (a+b) = 5 + 5040 = 5045

Page 26: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

8.1.3 – Natureza dos subprogramas8.1.3 – Natureza dos subprogramas

Na literatura, subprogramas costumam Na literatura, subprogramas costumam receber os seguintes nomes:receber os seguintes nomes:

função, procedimento, sub-rotina, rotina, função, procedimento, sub-rotina, rotina, segmento, módulo, etc.segmento, módulo, etc.

Nesta disciplina, os nomes mais usados serão:Nesta disciplina, os nomes mais usados serão:

função, procedimento e módulofunção, procedimento e módulo

Page 27: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Na literatura, um Na literatura, um subprogramasubprograma é considerado é considerado uma uma funçãofunção, quando , quando produzir um valorproduzir um valor, , retornandoretornando-o ao módulo que o tiver chamado-o ao módulo que o tiver chamado

Essa Essa emissãoemissão é realizada através do comando é realizada através do comando returnreturn, a ser visto com mais detalhes logo , a ser visto com mais detalhes logo adianteadiante

Normalmente uma Normalmente uma chamada de funçãochamada de função aparece em aparece em expressõesexpressões

Por exemplo:Por exemplo:x = pow(c, d) / (a + fat(b));x = pow(c, d) / (a + fat(b));

Page 28: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

x = pow(c, d) / (a + fat(b));x = pow(c, d) / (a + fat(b));

A A expressãoexpressão do lado direito tem chamadas para do lado direito tem chamadas para as funções as funções pow pow e e fatfat

A A primeiraprimeira pertence ao arquivo pertence ao arquivo math.hmath.h da da biblioteca da linguagem e a biblioteca da linguagem e a segundasegunda deve ser deve ser construída pelo programadorconstruída pelo programador

Ao serem executadas, elas Ao serem executadas, elas produzemproduzem cada qual cada qual um um valorvalor que é usado no que é usado no cálculocálculo da expressão da expressão

Neste mesmo comando, Neste mesmo comando, cc e e dd são os são os argumentosargumentos de chamada de de chamada de powpow e e b b é o é o argumentoargumento de de chamada de chamada de fatfat

Page 29: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Na literatura, um Na literatura, um subprogramasubprograma é considerado é considerado um um procedimentoprocedimento, quando , quando executar uma executar uma tarefatarefa relacionada com seus eventuais relacionada com seus eventuais argumentos, argumentos, não retornandonão retornando nenhum valor ao nenhum valor ao módulo que o tiver chamado módulo que o tiver chamado

Normalmente uma Normalmente uma chamada de procedimentochamada de procedimento é por si só um é por si só um comandocomando de uma linguagem de uma linguagem

Existem Existem procedimentosprocedimentos supridos pelas supridos pelas linguagenslinguagens e também aqueles a serem e também aqueles a serem programadosprogramados

Por exemplo:Por exemplo:printf (“a = %d, b = %d”, a, b); printf (“a = %d, b = %d”, a, b); Ordenar (V, n);Ordenar (V, n);

Page 30: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

printf (“a = %d, b = %d”, a, b); printf (“a = %d, b = %d”, a, b); Ordenar (V, n);Ordenar (V, n);

A chamada do subprograma A chamada do subprograma printfprintf, , pertencente à biblioteca da linguagem, tem pertencente à biblioteca da linguagem, tem 3 3 argumentosargumentos: : “a = %d, b = %d”“a = %d, b = %d”, , aa, , bb

Sua principal finalidade é Sua principal finalidade é escrever na telaescrever na tela os os valores de valores de aa e e bb

A chamada do subprograma A chamada do subprograma OrdenarOrdenar, , construído pelo programador, tem o objetivo construído pelo programador, tem o objetivo de de ordenarordenar os elementos do vetor argumento os elementos do vetor argumento VV, cujo número de elementos é igual ao valor , cujo número de elementos é igual ao valor do argumento do argumento nn

Page 31: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

printf (“a = %d, b = %d”, a, b); printf (“a = %d, b = %d”, a, b); Ordenar (V, n);Ordenar (V, n);

O subprograma O subprograma Ordenar Ordenar não retorna nenhum valornão retorna nenhum valor

Mas Mas printfprintf, como foi visto no Capítulo V, retorna o , como foi visto no Capítulo V, retorna o número de caracteresnúmero de caracteres escritos escritos

printfprintf, além de executar a tarefa de escrever, , além de executar a tarefa de escrever, retorna retorna um valorum valor

Sua natureza é Sua natureza é hibridahibrida, ou seja, é um , ou seja, é um procedimentoprocedimento e uma e uma função (scanf função (scanf também é híbridatambém é híbrida))

É uma função com É uma função com efeitos colateraisefeitos colaterais (escrever (escrever textos)textos)

Recomenda-seRecomenda-se fazer subprogramas fazer subprogramas híbridoshíbridos só em só em circunstâncias muito circunstâncias muito favoráveisfavoráveis

Page 32: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

8.1.4 – Subprogramas em C8.1.4 – Subprogramas em C

Programa

Diretivas de pré-

processamentoDeclarações

globaisFunções

auxiliaresFunçãomain

Na Linguagem C, conforme já foi visto, todos os módulos de um programa são denominados funções

A função correspondente ao programa principal tem o nome de main

A função main tem presença obrigatória em qualquer programa

As declarações globais estão fora do escopo de qualquer função

Page 33: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Nas linguagens tradicionais de programação, um Nas linguagens tradicionais de programação, um subprogramasubprograma costuma ser dividido em 2 partes: costuma ser dividido em 2 partes: cabeçalhocabeçalho e e corpocorpo

Cabeçalho:Cabeçalho: tem informações sobre o tem informações sobre o nomenome do do subprograma, o subprograma, o tipotipo do valor por ele do valor por ele retornadoretornado e e o tipo de seus eventuais o tipo de seus eventuais parâmetrosparâmetros

Corpo:Corpo: contém as contém as declaraçõesdeclarações e os e os comandoscomandos do do subprograma subprograma

Há linguagens que permitem que no Há linguagens que permitem que no corpocorpo dos dos subprogramas sejam colocados subprogramas sejam colocados outros outros subprogramassubprogramas, considerados como que , considerados como que embutidosembutidos nos primeiros nos primeiros

Forma-se assim um Forma-se assim um aninhamentoaninhamento de de subprogramassubprogramas

Page 34: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Exemplo: esqueleto de um programa em Pascal

Cabeçalho do programa principal Declarações

BeginComandos do programa principal

End

Cabeçalho do subprograma S1DeclaraçõesBegin comandos de S1 End

Cabeçalho do subprograma S2Declarações

Begin comandos de S2 End

Cabeçalho do subprograma S3DeclaraçõesBegin comandos de S3 End

Cabeçalho do subprograma S4DeclaraçõesBegin comandos de S4 End

Page 35: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

A Linguagem C A Linguagem C não admite aninhamentosnão admite aninhamentos de de subprogramas subprogramas

Forma geral de uma função em C:Forma geral de uma função em C:

Tipo Nome (Lista de Parâmetros)Tipo Nome (Lista de Parâmetros){ Declarações Comandos }{ Declarações Comandos }

O O corpocorpo fica entre as chaves fica entre as chaves “{“{ e e }”}” e o e o cabeçalhocabeçalho fora delasfora delas

TipoTipo é o tipo do valor retornado, opcional (default: é o tipo do valor retornado, opcional (default: intint))

NomeNome é o nome da função, obrigatório é o nome da função, obrigatório

Lista de ParâmetrosLista de Parâmetros é uma lista de declarações de é uma lista de declarações de seus eventuais parâmetrosseus eventuais parâmetros

Page 36: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Tipo Nome (Lista de Parâmetros)Tipo Nome (Lista de Parâmetros){ Declarações Comandos }{ Declarações Comandos }

Uma função pode não ter Uma função pode não ter nenhum parâmetronenhum parâmetro, mas a , mas a colocação dos parêntesis colocação dos parêntesis “(”“(” e e “)”“)” é obrigatória é obrigatória

Subprogramas com natureza de Subprogramas com natureza de procedimentoprocedimento devem devem ser declaradas como funções do tipo ser declaradas como funções do tipo voidvoid, ou seja, , ou seja, como funções que como funções que não retornamnão retornam nenhum resultado nenhum resultado

Em outras linguagens, usa-se Em outras linguagens, usa-se palavras reservadaspalavras reservadas antes dos nomes dos subprogramas, para especificar antes dos nomes dos subprogramas, para especificar sua sua naturezanatureza

Em Em PascalPascal, usam-se as palavras , usam-se as palavras functionfunction e e procedureprocedureEm Fortran, Em Fortran, functionfunction e e subroutinesubroutine

Page 37: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

8.1.5 – Retorno de uma função em C8.1.5 – Retorno de uma função em C

O fluxo de execução O fluxo de execução retorna de uma funçãoretorna de uma função ao módulo que a chamou, por 2 maneiras ao módulo que a chamou, por 2 maneiras distintas: distintas:

retorno natural retorno natural ee retorno explícito retorno explícito

No No retorno naturalretorno natural, isso ocorre após a , isso ocorre após a execução do execução do último comandoúltimo comando do corpo da do corpo da função, desde que ele não seja um comando função, desde que ele não seja um comando gotogoto

No No retorno explícitoretorno explícito, ele acontece através da , ele acontece através da execução do comando execução do comando returnreturn

Page 38: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

O comando O comando returnreturn pode vir ou não pode vir ou não acompanhadoacompanhado de uma de uma expressãoexpressão ou de uma ou de uma variávelvariável

Quando Quando acompanhadoacompanhado de uma de uma expressãoexpressão, , seu valor é calculado e enviado ao módulo que seu valor é calculado e enviado ao módulo que chamou a funçãochamou a função

Quando Quando acompanhadoacompanhado de uma de uma variávelvariável, seu , seu valor é enviado ao módulo que chamou a valor é enviado ao módulo que chamou a funçãofunção

Quando Quando não acompanhadonão acompanhado, há apenas , há apenas transferênciatransferência do fluxo de do fluxo de execuçãoexecução

Page 39: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Exemplos de instâncias do comando Exemplos de instâncias do comando returnreturn::

return; return a; return ++a; return (a+b);return; return a; return ++a; return (a+b);

Numa função em C destinada a Numa função em C destinada a retornar retornar valorvalor, os comandos , os comandos returnreturn devem ser devem ser acompanhados de acompanhados de expressõesexpressões ou de ou de variáveisvariáveis

Numa função Numa função voidvoid, não deve haver esse , não deve haver esse acompanhamentoacompanhamento

Page 40: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

8.1.6 – Utilidades da subprogramação8.1.6 – Utilidades da subprogramação

São várias as São várias as utilidades da subprogramaçãoutilidades da subprogramação, , dentre as quais podem ser citadas:dentre as quais podem ser citadas:

EliminaçãoEliminação da necessidade de da necessidade de repetição de repetição de códigocódigo

Auxilio na Auxilio na metodologiametodologia top-downtop-down para o para o desenvolvimento de programasdesenvolvimento de programas

ModularizaçãoModularização de programas de programas

Reaproveitamento do códigoReaproveitamento do código de outros programas de outros programas

Implementação de Implementação de definições matemáticas definições matemáticas recursivasrecursivas

Page 41: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Eliminação da necessidade de repetição de Eliminação da necessidade de repetição de códigocódigo

Programas que executam as Programas que executam as mesmas operaçõesmesmas operações para diferentes para diferentes conjuntos de valoresconjuntos de valores podem ter podem ter um um subprogramasubprograma que as executa para um que as executa para um conjunto genéricoconjunto genérico

Exemplo: Exemplo: no programa da soma e multiplicação de no programa da soma e multiplicação de polinômiospolinômios

Há 2 trechos muito semelhantes para Há 2 trechos muito semelhantes para lerler os dados os dados dos polinômios dos polinômios P1P1 e e P2P2 e 4 para e 4 para escrever escrever os os polinômios polinômios P1P1, , P2P2, , PSPS e e PMPM

Pode-se fazer um só Pode-se fazer um só subprogramasubprograma para para lerler e e outro para outro para escreverescrever o conteúdo de um o conteúdo de um polinômio polinômio genéricogenérico

Page 42: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Exemplo: Exemplo: combinações de combinações de m m elementos tomados elementos tomados n n a a nn

Fórmula: Fórmula:

Exige-se o cálculo do Exige-se o cálculo do fatorialfatorial de 3 expressões: de 3 expressões: mm, , m-nm-n e e nn

Assim o programa pode ter uma função Assim o programa pode ter uma função fatfat para o para o cálculo do cálculo do fatorialfatorial de seu de seu parâmetroparâmetro

A função A função mainmain chama chama fatfat três vezes, passando três vezes, passando como como argumentoargumento, em cada chamada, cada uma , em cada chamada, cada uma das das 3 expressões 3 expressões citadascitadasA seguir, um programa

completo

Page 43: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

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

int fat (int n) {int fat (int n) {int i; int fat;int i; int fat;if (n < 0 || n > 12) fat = -1;if (n < 0 || n > 12) fat = -1;elseelse

for (i=2, fat=1; i<=n; i++)for (i=2, fat=1; i<=n; i++)fat *= i;fat *= i;

return fat;return fat;}}

Page 44: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

int main () {int main () {char c; int m, n, comb;char c; int m, n, comb;do {do {printf ("Combinacao de m elementos tomados n a n? (s/n): ");printf ("Combinacao de m elementos tomados n a n? (s/n): ");do c = getche(); while (c!='s' && c!='n');do c = getche(); while (c!='s' && c!='n');if (c == 's') {if (c == 's') {printf ("\n\n\tm: "); scanf ("%d", &m);printf ("\n\n\tm: "); scanf ("%d", &m);printf ("\tn: "); scanf ("%d", &n);printf ("\tn: "); scanf ("%d", &n);if (m <= 0 || m > 12 || n <= 0 || m < n)if (m <= 0 || m > 12 || n <= 0 || m < n)printf ("\n\tDados incompativeis\n\n");printf ("\n\tDados incompativeis\n\n");else {else {

comb = fat(m) / (fat(m-n) * fat(n));comb = fat(m) / (fat(m-n) * fat(n));printf ("\n\tNum. de combinacoes: %d\n\n", comb);printf ("\n\tNum. de combinacoes: %d\n\n", comb);} } }}} while (c == 's');} while (c == 's');printf ("\n\n"); system ("pause"); printf ("\n\n"); system ("pause"); return 0;return 0; } }

Obs.: as funções main e fat têm variáveis de mesmo nome: n

Tratam-se de 2 variáveis distintas

Page 45: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Auxilio na metodologia top-down para o Auxilio na metodologia top-down para o desenvolvimento de programasdesenvolvimento de programas

Conforme visto anteriormente, a programação Conforme visto anteriormente, a programação de uma de uma tarefa complexatarefa complexa pode ser pode ser decompostadecomposta num conjunto de num conjunto de tarefas menorestarefas menores

Aquelas que apresentarem certo grau de Aquelas que apresentarem certo grau de complexidadecomplexidade também podem ser também podem ser decompostasdecompostas da mesma maneira, até que se da mesma maneira, até que se obtenha um conjunto de tarefas triviaisobtenha um conjunto de tarefas triviais

Essa é a idéia básica da Essa é a idéia básica da metodologiametodologia top-top-downdown para o desenvolvimento de programas para o desenvolvimento de programas

Page 46: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Nessa idéia, cada Nessa idéia, cada tarefatarefa suficientemente suficientemente complexacomplexa pode ser realizada por um pode ser realizada por um subprograma específicosubprograma específico

Os Os comandoscomandos desse subprograma se desse subprograma se constituem na constituem na decomposiçãodecomposição da mesma tarefa da mesma tarefa em tarefas menoresem tarefas menores

O O Capítulo XCapítulo X desta disciplina apresenta o desta disciplina apresenta o desenvolvimento top-downdesenvolvimento top-down de programas de programas auxiliado por auxiliado por subprogramassubprogramas

Page 47: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Modularização de programasModularização de programas

É o É o isolamentoisolamento de trabalhos bem de trabalhos bem específicosespecíficos em em módulosmódulos ou ou subprogramassubprogramas destinados destinados exclusivamente para esse fim; Exemplos:exclusivamente para esse fim; Exemplos:

Programas bem modularizados proporcionam ao Programas bem modularizados proporcionam ao projetista de software código mais fácil de ser projetista de software código mais fácil de ser compreendido e corrigidocompreendido e corrigido

Cálculo de fatorial

Cálculo de uma integral

Resolução de sistemas de equações

Ordenação de um vetor

Procura de um elemento em um vetor

Inserção de um elemento em um vetor

Multiplicação de matrizes

Inversão de matrizes

Page 48: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Reaproveitamento do código de outros programasReaproveitamento do código de outros programas

FunçõesFunções desenvolvidas para elaborar um desenvolvidas para elaborar um determinado determinado programaprograma podem ser podem ser utilizadas em outros utilizadas em outros programasprogramas

Por exemplo, num programa para resolver Por exemplo, num programa para resolver vários vários sistemas de equações linearessistemas de equações lineares pode-se elaborar uma pode-se elaborar uma função que resolva um função que resolva um sistema genérico de equações sistema genérico de equações lineareslineares

Essa função pode ser usada por programas para Essa função pode ser usada por programas para resolver sistemas de resolver sistemas de equações não-linearesequações não-lineares, para , para fazer fazer ajuste de curvasajuste de curvas e para auxiliar a resolução de e para auxiliar a resolução de equações diferenciais parciaisequações diferenciais parciais

Assim, pode-se organizar uma Assim, pode-se organizar uma bibliotecabiblioteca de de subprogramas, e usá-los em subprogramas, e usá-los em novos projetosnovos projetos, conforme , conforme a necessidadea necessidade

Page 49: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

IImplementação de definições matemáticas mplementação de definições matemáticas recursivasrecursivas

RecursividadeRecursividade é um expediente muito usado é um expediente muito usado para se estabelecer certas para se estabelecer certas definições definições matemáticasmatemáticas

Por exemplo, Por exemplo, potenciaçãopotenciação, cálculo de , cálculo de fatoriaisfatoriais e de e de mdcmdc podem ser expressos podem ser expressos usando respectivamente as seguintes usando respectivamente as seguintes definições recursivasdefinições recursivas::

Page 50: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

As atuais linguagens de programação admitem As atuais linguagens de programação admitem que um que um subprograma chame a si própriosubprograma chame a si próprio, o que , o que possibilita a implementação de possibilita a implementação de definições definições recursivasrecursivas

Exemplo: Exemplo: cálculo cálculo recursivo de fatorialrecursivo de fatorial

É claro que, É claro que, sem subprogramaçãosem subprogramação isso seria isso seria impossívelimpossível

Devido a sua grande Devido a sua grande importânciaimportância, , recursividaderecursividade é vista num dos tópicos deste capítuloé vista num dos tópicos deste capítulo

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

}

Page 51: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Capítulo VIII – Capítulo VIII – SubprogramaçãoSubprogramação

8.1 – Introdução8.1 – Introdução8.2 – Escopo de validade de declarações8.2 – Escopo de validade de declarações8.3 – Parâmetros e passagem de 8.3 – Parâmetros e passagem de

argumentosargumentos8.4 – Prototipação de subprogramas8.4 – Prototipação de subprogramas8.5 – Classes de alocação8.5 – Classes de alocação8.6 – Recursividade8.6 – Recursividade

Page 52: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

8.2 – Escopo de Validade de 8.2 – Escopo de Validade de DeclaraçõesDeclarações

8.2.1 – Declarações locais e globais8.2.1 – Declarações locais e globais

Módulo XDeclaração de V

Módulo W

Módulo Y

Declaração local a um módulo ou subprograma é aquela feita no corpo desse módulo

Exemplo: a declaração de V é local ao módulo X

Uma referência à variável V só é reconhecida pelo compilador, se for feita no corpo do módulo X

O corpo de X é o escopo de validade de V

Módulo XDeclaração de V

Page 53: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Em Pascal, o escopo de validade de um identificador declarado localmente a um módulo abrange todos os subprogramas nele embutidos

Exemplo: o escopo de validade de V abrange os módulos W e Y

A Linguagem C não tem aninhamentos de módulos mas tem aninhamentos de blocos

Blocos serão vistos logo a seguir

Módulo XDeclaração de V

Módulo W

Módulo Y

Page 54: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Módulo W

Módulo Y

Declaração global é aquela feita fora do corpo de qualquer módulo ou subprograma

O escopo de validade de um identificador declarado globalmente abrange todo o trecho de programa após sua declaração

Exemplos:

1)O escopo de validade de V abrange os módulos W, X e Y

2)O escopo de validade de A abrange os módulos X e Y

Módulo X

Declaração de V

Declaração de A

Page 55: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Em Pascal, as declarações do programa principal são globais

Cabeçalho do programa principal Declarações

BeginComandos do programa

principalEnd

Cabeçalho do subprograma S1DeclaraçõesBegin comandos de S1 EndCabeçalho do subprograma S2Declarações

Begin comandos de S2 End

Cabeçalho do subprograma S3DeclaraçõesBegin comandos de S3 EndCabeçalho do subprograma S4DeclaraçõesBegin comandos de S4 End

Page 56: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Um Um identificadoridentificador pode ser pode ser declarado mais declarado mais de uma vezde uma vez, desde que seus , desde que seus escopos de escopos de validadevalidade sejam sejam diferentesdiferentes

Exemplo: Exemplo: variáveis de mesmo nome:variáveis de mesmo nome:#include <stdio.h>#include <stdlib.h>int a = 33;void sss () { int b = 88; printf ("sss : a = %d; b = %d;\n", a, b);}int main () { int a = 77, b = 55; printf ("main 1: a = %d; b = %d;\n", a, b); sss (); printf ("main 2: a = %d; b = %d;\n", a, b); printf ("\n\n"); system ("pause"); return 0;}

Page 57: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdlib.h>int a = 33;void sss () { int b = 88; printf ("sss : a = %d; b = %d;\n", a, b);}int main () { int a = 77, b = 55; printf ("main 1: a = %d; b = %d;\n", a, b); sss (); printf ("main 2: a = %d; b = %d;\n", a, b); printf ("\n\n"); system ("pause"); return 0;}

main 1: a = 77; b = 55;sss : a = 33; b = 88;main 2: a = 77; b = 55;

Digite algo para encerrar:

ResultadoEm sss, b é a local de sss e a é a globalEm main, b é a local de main e a é a local de main

Em main, a variável global a não pode ser referenciada Ela fica ofuscada pela variável local a

Page 58: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

8.2.2 – Blocos8.2.2 – Blocos

Em C, Em C, blocobloco é um é um comando compostocomando composto contendo contendo declaraçõesdeclarações em seu início em seu início

Exemplo: {int a, b = 5; a = 4*b + 2;}Exemplo: {int a, b = 5; a = 4*b + 2;}

Então o Então o corpo de uma função é um blococorpo de uma função é um bloco

BlocosBlocos podem aparecer podem aparecer embutidos embutidos no corpo de no corpo de uma funçãouma função

Blocos Blocos podem aparecer podem aparecer embutidos em outros embutidos em outros blocosblocos

A A Linguagem CLinguagem C não permite aninhamentos de não permite aninhamentos de funções mas permite funções mas permite aninhamentos de blocosaninhamentos de blocos

O escopo de validade de um identificador declarado num bloco é o próprio bloco

Page 59: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int main ()int main () { {

int a = 1; printf ("main 1 : a = %4d;\n", a);int a = 1; printf ("main 1 : a = %4d;\n", a);{{ //// bloco1bloco1int a = 10; printf ("bloco1 1: a = %4d;\n", a);int a = 10; printf ("bloco1 1: a = %4d;\n", a);{{ //// bloco2bloco2int a = 200; printf ("bloco2 : a = %4d;\n", a);int a = 200; printf ("bloco2 : a = %4d;\n", a);}}a++; printf ("bloco1 2: a = %4d;\n", a);a++; printf ("bloco1 2: a = %4d;\n", a);}}a++; printf ("main 2 : a = %4d;\n", a);a++; printf ("main 2 : a = %4d;\n", a);{{ //// bloco3bloco3int a = 30; printf ("bloco3 1: a = %4d;\n", a);int a = 30; printf ("bloco3 1: a = %4d;\n", a);{{ //// bloco4bloco4int a = 400; printf ("bloco4 : a = %4d;\n", a);int a = 400; printf ("bloco4 : a = %4d;\n", a);}}a++; printf ("bloco3 2: a = %4d;\n", a);a++; printf ("bloco3 2: a = %4d;\n", a);}}a++; printf ("main 3 : a = %4d;\n", a);a++; printf ("main 3 : a = %4d;\n", a);

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

Exemplo: aninhamento de blocos

main 1 : a = 1;bloco1 1: a = 10;bloco2 : a = 200;bloco1 2: a = 11;main 2 : a = 2;bloco3 1: a = 30;bloco4 : a = 400;bloco3 2: a = 31;main 3 : a = 3;

Pressione ...

Resultado

Page 60: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Dois blocos são paralelos Dois blocos são paralelos quando embutidos num quando embutidos num terceiro, não sendo terceiro, não sendo nenhum deles embutido nenhum deles embutido em nenhum outro bloco em nenhum outro bloco a não ser nesse terceiro a não ser nesse terceiro e naqueles blocos onde e naqueles blocos onde esse terceiro estiver esse terceiro estiver embutidoembutido

Blocos paralelos: B1 || Blocos paralelos: B1 || B2, B3 || B4B2, B3 || B4

B1 e B3 não são B1 e B3 não são paralelos; B1 e B4 paralelos; B1 e B4 também nãotambém não

Em C, funções são Em C, funções são escritas em paralelo, escritas em paralelo, pois estão embutidas pois estão embutidas somente no corpo do somente no corpo do programa.programa.

Função main DeclaraçõesComandos

Comandos

Bloco B1DeclaraçõesComandos

Bloco B2Declarações Comandos

Comandos

Comandos

Bloco B3DeclaraçõesComandos

Bloco B4DeclaraçõesComandos

Page 61: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

8.2.3 – Variáveis automáticas8.2.3 – Variáveis automáticas

Variável automática:Variável automática: variável local que só é variável local que só é alocadaalocada na memória quando seu na memória quando seu bloco de bloco de declaraçãodeclaração começa a ser começa a ser executadoexecutado

Ela é Ela é desalocada no finaldesalocada no final da execução desse da execução desse bloco bloco

Caso tal bloco Caso tal bloco volte a ser executadovolte a ser executado, nova , nova alocação para ela é feita, mas seu alocação para ela é feita, mas seu valorvalor no final no final da execução da execução anterioranterior é é perdidoperdido

Todas as Todas as variáveis locaisvariáveis locais dos programas dos programas apresentados até aqui são apresentados até aqui são automáticasautomáticas

Page 62: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Variáveis Variáveis locais não-automáticaslocais não-automáticas são estudadas são estudadas mais adiante neste capítulomais adiante neste capítulo

Uma Uma variável global não é automáticavariável global não é automática pois fica pois fica alocada durante alocada durante toda execuçãotoda execução do programa do programa

Em C, pode-se usar a palavra reservada Em C, pode-se usar a palavra reservada autoauto para tornar para tornar explícitoexplícito que uma ou várias variáveis que uma ou várias variáveis são são automáticasautomáticas

Se a seguinte declaração for localSe a seguinte declaração for localint a, b;int a, b;

então ela equivale a então ela equivale a auto int a, b;auto int a, b;

A seguir, um programa com várias variáveis automáticas

Page 63: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

b

main

c a

bb

c

ff

xa

global

1

Iniciar a execução

Page 64: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

b

main

c a

bb

c

ff

xa

global

1

Page 65: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

a

bb

c

ff

x

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

???b

main

c

???a

global

1

Page 66: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

a

bb

c

ff

x

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

???b

main

c

???a

global

1

Page 67: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

a

bb

c

ff

x

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

7b

main

9ca

global

1

Page 68: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

a

bb

c

ff

x

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

7b

main

9ca

global

1

Page 69: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

c

ff

x

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

7b

main

9c

???a

bb

a

global

1

Page 70: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

c

ff

x

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

7b

main

9c

???a

bb

a

global

1

Page 71: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

c

ff

x

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

7b

main

9c

5a

bb

a

global

1

Page 72: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

c

ff

x

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

7b

main

9c

5a

bb

a

global

1

Page 73: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

c

ff

x

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

7b

main

9c

5a

bb

a

global

1

Page 74: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

???c

ff

???x

7b

main

9c

5a

bb

a

global

1

Page 75: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

???c

ff

???x

7b

main

9c

5a

bb

a

global

1

Page 76: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

11c

ff

22x

7b

main

9c

5a

bb

a

global

33

Page 77: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

11c

ff

22x

7b

main

9c

5a

bb

a

global

33

Page 78: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

c

ff

x

7b

main

9c

5a

bb

a

global

33

Page 79: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

c

ff

x

7b

main

9c

5a

bb

a

global

33

Page 80: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int a = 1;int a = 1;void ff ( ) {void ff ( ) {

int c, x;int c, x;printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x);c = 11; x = 22; a = 33;c = 11; x = 22; a = 33;printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x);

}}int main ( ) {int main ( ) {

int b, c;int b, c;printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c);b = 7; c = 9;b = 7; c = 9;printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c);{{ /* Bloco bb *//* Bloco bb */

int a;int a;printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c);a = 5;a = 5;printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c);ff ( );ff ( );

}}printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);printf ("Ponto 6: a = %5d; b = %13d; c = %13d;\n", a, b, c);

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

a

bb

c

ff

x

7b

main

9ca

global

33

Ponto 0: a = 1; b = 0; c = 4239532;Ponto 1: a = 1; b = 7; c = 9;Ponto 2: a = 0; b = 7; c = 9;Ponto 3: a = 5; b = 7; c = 9;Ponto 4: a = 1; c = 58; x = 582600;Ponto 5: a = 33; c = 11; x = 22;Ponto 6: a = 33; b = 7; c = 9;

No vídeo

Page 81: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

O uso de O uso de blocosblocos e de e de variáveis automáticasvariáveis automáticas torna possível torna possível reservar espaçoreservar espaço para variáveis para variáveis só quando só quando necessárionecessário

Seja por exemplo, o seguinte esquema de Seja por exemplo, o seguinte esquema de programa:programa:--- Declarações globais ---

 int main () { { /* Bloco 1 */ --- Declarações ocupando grande espaço de memória --- --- Comandos } { /* Bloco 2 */ --- Declarações ocupando grande espaço de memória --- --- Comandos } { /* Bloco 3 */ --- Declarações ocupando grande espaço de memória --- --- Comandos }}

Page 82: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

As As variáveis automáticasvariáveis automáticas declaradas em declaradas em cada cada blocobloco só ocupam espaço de memória só ocupam espaço de memória durante a durante a execuçãoexecução do mesmo do mesmo

Não o ocupam durante Não o ocupam durante toda a execuçãotoda a execução da da função função mainmain

--- Declarações globais --- int main () { { /* Bloco 1 */ --- Declarações ocupando grande espaço de memória --- --- Comandos } { /* Bloco 2 */ --- Declarações ocupando grande espaço de memória --- --- Comandos } { /* Bloco 3 */ --- Declarações ocupando grande espaço de memória --- --- Comandos }}

Page 83: CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação

Caso Caso não houvesse blocosnão houvesse blocos, todas essas , todas essas variáveis deveriam ser variáveis deveriam ser declaradasdeclaradas na função na função mainmain, ocupando espaço durante a execução de , ocupando espaço durante a execução de todo o programatodo o programa

Esse espaço poderia Esse espaço poderia não ser suficientenão ser suficiente

--- Declarações globais --- int main () { { /* Bloco 1 */ --- Declarações ocupando grande espaço de memória --- --- Comandos } { /* Bloco 2 */ --- Declarações ocupando grande espaço de memória --- --- Comandos } { /* Bloco 3 */ --- Declarações ocupando grande espaço de memória --- --- Comandos }}