A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação."— Transcrição da apresentação:

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

2 Capítulo VIII – Subprogramação 8.1 – Introdução 8.2 – Escopo de validade de declarações 8.3 – Parâmetros e passagem de argumentos 8.4 – Prototipação de subprogramas 8.5 – Classes de alocação 8.6 – Recursividade

3 8.1 – Introdução 8.1.1 – Conceito de subprograma Como já foi visto em capítulos anteriores, um programa pode ser organizado em um ou mais módulos Como já foi visto em capítulos anteriores, um programa pode ser organizado em um ou mais módulos Um deles, o módulo ou programa principal, obrigatório em todos os programas, é aquele pelo qual começa a execução Um deles, o módulo ou programa principal, obrigatório em todos os programas, é aquele pelo qual começa a execução Os outros eventuais módulos são auxiliares do mesmo e são chamados de subprogramas. Os outros eventuais módulos são auxiliares do mesmo e são chamados de subprogramas. Durante sua execução, o programa principal poderá fazer chamadas a esses subprogramas Durante sua execução, o programa principal poderá fazer chamadas a esses subprogramas

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

5 As funções da biblioteca são subprogramas supridos pela linguagem As funções da biblioteca são subprogramas supridos pela linguagem Quando o programador deseja usar algum subprograma que não pertença à biblioteca, ele deve programá-lo Quando o programador deseja usar algum subprograma que não pertença à biblioteca, ele deve programá-lo

6 8.1.2 – Argumentos e parâmetros de subprogramas Numa chamada de subprograma, pode-se especificar os valores ou variáveis sobre os quais essa chamada deve atuar Numa chamada de subprograma, pode-se especificar os valores ou variáveis sobre os quais essa chamada deve atuar Esses valores e/ou variáveis são denominados argumentos de chamada Esses valores e/ou variáveis são denominados argumentos 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); há 4 chamadas do subprograma sin pertencente à biblioteca, para calcular respectivamente os senos dos argumentos a, b, a+b e a-b

7 Um argumento de chamada pode ser uma expressão, mas pode ser também um endereço Um argumento de chamada pode ser uma expressão, mas pode ser também um endereço Por exemplo, quando se deseja ler um valor para uma variável escalar a, pode-se usar a função scanf da biblioteca de C Por exemplo, quando se deseja ler um valor para uma variável escalar a, pode-se usar a função scanf da biblioteca de C Fornece-lhe como argumento o endereço de a, ou seja, &a: Fornece-lhe como argumento o endereço de a, ou seja, &a: scanf (“%d”, &a) Uma chamada de subprograma pode ter zero ou mais argumentos Uma chamada de subprograma pode ter zero ou mais argumentos

8 O primeiro ato da execução de uma chamada de subprograma é a passagem de seus eventuais argumentos O primeiro ato da execução de uma chamada de subprograma é a passagem de seus eventuais argumentos Nesse ato, os valores dos argumentos são calculados e, em seguida, são armazenados cada um numa variável especial local do subprograma denominada parâmetro Nesse ato, os valores dos argumentos são calculados e, em seguida, são armazenados cada um numa variável especial local do subprograma denominada parâmetro Em seguida, o subprograma realiza sua tarefa, usando e eventualmente alterando os valores de seus parâmetros Em seguida, o subprograma realiza sua tarefa, usando e eventualmente alterando os valores de seus parâmetros Então, se for o caso, resultados são produzidos e entregues (retornados) ao módulo que o chamou Então, se for o caso, resultados são produzidos e entregues (retornados) ao módulo que o chamou

9 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; } int main () { int a, b, c; printf ("Digite dois inteiros: "); printf ("Digite dois inteiros: "); 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\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

10 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; } int main () { int a, b, c; printf ("Digite dois inteiros: "); printf ("Digite dois inteiros: "); 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\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;} a b c

11 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; } int main () { int a, b, c; printf ("Digite dois inteiros: "); printf ("Digite dois inteiros: "); 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\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;} a b c Leitura p/ a e b: 5 e 2

12 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; } int main () { int a, b, c; printf ("Digite dois inteiros: "); printf ("Digite dois inteiros: "); 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\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;} 5 a 2 b c Leitura p/ a e b: 5 e 2

13 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; } int main () { int a, b, c; printf ("Digite dois inteiros: "); printf ("Digite dois inteiros: "); 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\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;} 5 a 2 b c Chamada de fat (a+b)

14 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; } int main () { int a, b, c; printf ("Digite dois inteiros: "); printf ("Digite dois inteiros: "); 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\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;} 5 a 2 b c Cálculo do argumento de fat Argumento: a+b = 5+2 = 7

15 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; } int main () { int a, b, c; printf ("Digite dois inteiros: "); printf ("Digite dois inteiros: "); 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\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;} 5 a 2 b c Alocação das variáveis de fat na memória ifat n(parâmetro) Argumento: a+b = 5+2 = 7

16 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; } int main () { int a, b, c; printf ("Digite dois inteiros: "); printf ("Digite dois inteiros: "); 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\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;} 5 a 2 b c Passagem do argumento 7 para o parâmetro n ifat n(parâmetro) Argumento: a+b = 5+2 = 7

17 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; } int main () { int a, b, c; printf ("Digite dois inteiros: "); printf ("Digite dois inteiros: "); 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\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;} 5 a 2 b c Passagem do argumento 7 para o parâmetro n ifat 7 n(parâmetro) Argumento: a+b = 5+2 = 7

18 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; } int main () { int a, b, c; printf ("Digite dois inteiros: "); printf ("Digite dois inteiros: "); 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\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;} 5 a 2 b c Execução dos comandos de fat ifat 7 n(parâmetro)

19 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; } int main () { int a, b, c; printf ("Digite dois inteiros: "); printf ("Digite dois inteiros: "); 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\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;} 5 a 2 b c Execução dos comandos de fat 8 i 5040 fat 7 n(parâmetro)

20 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; } int main () { int a, b, c; printf ("Digite dois inteiros: "); printf ("Digite dois inteiros: "); 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\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;} 5 a 2 b c Execução do comando return 8 i 5040 fat 7 n(parâmetro)

21 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; } int main () { int a, b, c; printf ("Digite dois inteiros: "); printf ("Digite dois inteiros: "); 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\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;} 5 a 2 b c Cálculo do valor a retornar 8 i 5040 fat 7 n(parâmetro) Valor a retornar: fat = 5040

22 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; } int main () { int a, b, c; printf ("Digite dois inteiros: "); printf ("Digite dois inteiros: "); 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\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;} 5 a 2 b c Recepção do valor retornado 8 i 5040 fat 7 n(parâmetro) Valor a retornar: fat = 5040 Valor retornado: 5040

23 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; } int main () { int a, b, c; printf ("Digite dois inteiros: "); printf ("Digite dois inteiros: "); 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\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;} 5 a 2 b c Desalocação das variáveis de fat 8 i 5040 fat 7 n(parâmetro) Valor a retornar: fat = 5040 Valor retornado: 5040

24 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; } int main () { int a, b, c; printf ("Digite dois inteiros: "); printf ("Digite dois inteiros: "); 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\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;} 5 a 2 b c Cálculo de c = 5 + fat (a+b) Valor retornado: 5040 5 + fat (a+b) = 5 + 5040 = 5045

25 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; } int main () { int a, b, c; printf ("Digite dois inteiros: "); printf ("Digite dois inteiros: "); 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\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;} 5 a 2 b 5045 c Cálculo de c = 5 + fat (a+b) Valor retornado: 5040 5 + fat (a+b) = 5 + 5040 = 5045

26 8.1.3 – Natureza dos subprogramas Na literatura, subprogramas costumam receber os seguintes nomes: Na literatura, subprogramas costumam receber os seguintes nomes: função, procedimento, sub-rotina, rotina, 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ódulo

27 Na literatura, um subprograma é considerado uma função, quando produzir um valor, retornando-o ao módulo que o tiver chamado Na literatura, um subprograma é considerado uma função, quando produzir um valor, retornando-o ao módulo que o tiver chamado Essa emissão é realizada através do comando return, a ser visto com mais detalhes logo adiante Essa emissão é realizada através do comando return, a ser visto com mais detalhes logo adiante Normalmente uma chamada de função aparece em expressões Normalmente uma chamada de função aparece em expressões Por exemplo: Por exemplo: x = pow(c, d) / (a + fat(b));

28 A expressão do lado direito tem chamadas para as funções pow e fat A expressão do lado direito tem chamadas para as funções pow e fat A primeira pertence ao arquivo math.h da biblioteca da linguagem e a segunda deve ser construída pelo programador A primeira pertence ao arquivo math.h da biblioteca da linguagem e a segunda deve ser construída pelo programador Ao serem executadas, elas produzem cada qual um valor que é usado no cálculo da expressão Ao serem executadas, elas produzem cada qual um valor que é usado no cálculo da expressão Neste mesmo comando, c e d são os argumentos de chamada de pow e b é o argumento de chamada de fat Neste mesmo comando, c e d são os argumentos de chamada de pow e b é o argumento de chamada de fat

29 Na literatura, um subprograma é considerado um procedimento, quando executar uma tarefa relacionada com seus eventuais argumentos, não retornando nenhum valor ao módulo que o tiver chamado Na literatura, um subprograma é considerado um procedimento, quando executar uma tarefa relacionada com seus eventuais argumentos, não retornando nenhum valor ao módulo que o tiver chamado Normalmente uma chamada de procedimento é por si só um comando de uma linguagem Normalmente uma chamada de procedimento é por si só um comando de uma linguagem Existem procedimentos supridos pelas linguagens e também aqueles a serem programados Existem procedimentos supridos pelas linguagens e também aqueles a serem programados Por exemplo: Por exemplo: printf (“a = %d, b = %d”, a, b); Ordenar (V, n);

30 printf (“a = %d, b = %d”, a, b); Ordenar (V, n); A chamada do subprograma printf, pertencente à biblioteca da linguagem, tem 3 argumentos: “a = %d, b = %d”, a, b A chamada do subprograma printf, pertencente à biblioteca da linguagem, tem 3 argumentos: “a = %d, b = %d”, a, b Sua principal finalidade é escrever na tela os valores de a e b Sua principal finalidade é escrever na tela os valores de a e b A chamada do subprograma Ordenar, construído pelo programador, tem o objetivo de ordenar os elementos do vetor argumento V, cujo número de elementos é igual ao valor do argumento n A chamada do subprograma Ordenar, construído pelo programador, tem o objetivo de ordenar os elementos do vetor argumento V, cujo número de elementos é igual ao valor do argumento n

31 printf (“a = %d, b = %d”, a, b); Ordenar (V, n); O subprograma Ordenar não retorna nenhum valor O subprograma Ordenar não retorna nenhum valor Mas printf, como foi visto no Capítulo V, retorna o número de caracteres escritos Mas printf, como foi visto no Capítulo V, retorna o número de caracteres escritos printf, além de executar a tarefa de escrever, retorna um valor printf, além de executar a tarefa de escrever, retorna um valor  Sua natureza é hibrida, ou seja, é um procedimento e uma função (scanf também é híbrida)  É uma função com efeitos colaterais (escrever textos) Recomenda-se fazer subprogramas híbridos só em circunstâncias muito favoráveis Recomenda-se fazer subprogramas híbridos só em circunstâncias muito favoráveis

32 8.1.4 – Subprogramas em C Programa Diretivas de pré- processamento Declarações globais Funções auxiliares Função main 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

33 Nas linguagens tradicionais de programação, um subprograma costuma ser dividido em 2 partes: cabeçalho e corpo Nas linguagens tradicionais de programação, um subprograma costuma ser dividido em 2 partes: cabeçalho e corpo Cabeçalho: tem informações sobre o nome do subprograma, o tipo do valor por ele retornado e o tipo de seus eventuais parâmetros Cabeçalho: tem informações sobre o nome do subprograma, o tipo do valor por ele retornado e o tipo de seus eventuais parâmetros Corpo: contém as declarações e os comandos do subprograma Corpo: contém as declarações e os comandos do subprograma Há linguagens que permitem que no corpo dos subprogramas sejam colocados outros subprogramas, considerados como que embutidos nos primeiros Há linguagens que permitem que no corpo dos subprogramas sejam colocados outros subprogramas, considerados como que embutidos nos primeiros Forma-se assim um aninhamento de subprogramas Forma-se assim um aninhamento de subprogramas

34 Exemplo: esqueleto de um programa em Pascal Cabeçalho do programa principal Declarações Begin Comandos do programa principal End Cabeçalho do subprograma S1 Declarações Begin comandos de S1 End Cabeçalho do subprograma S2 Declarações Begin comandos de S2 End Cabeçalho do subprograma S3 Declarações Begin comandos de S3 End Cabeçalho do subprograma S4 Declarações Begin comandos de S4 End

35 A Linguagem C não admite aninhamentos de subprogramas A Linguagem C não admite aninhamentos de subprogramas Forma geral de uma função em C: Forma geral de uma função em C: Tipo Nome (Lista de Parâmetros) { Declarações Comandos } O corpo fica entre as chaves “{ e }” e o cabeçalho fora delas O corpo fica entre as chaves “{ e }” e o cabeçalho fora delas Tipo é o tipo do valor retornado, opcional (default: int) Tipo é o tipo do valor retornado, opcional (default: int) Nome é o nome da função, obrigatório Nome é o nome da função, obrigatório Lista de Parâmetros é uma lista de declarações de seus eventuais parâmetros Lista de Parâmetros é uma lista de declarações de seus eventuais parâmetros

36 Tipo Nome (Lista de Parâmetros) { Declarações Comandos } Uma função pode não ter nenhum parâmetro, mas a colocação dos parêntesis “(” e “)” é obrigatória Uma função pode não ter nenhum parâmetro, mas a colocação dos parêntesis “(” e “)” é obrigatória Subprogramas com natureza de procedimento devem ser declaradas como funções do tipo void, ou seja, como funções que não retornam nenhum resultado Subprogramas com natureza de procedimento devem ser declaradas como funções do tipo void, ou seja, como funções que não retornam nenhum resultado Em outras linguagens, usa-se palavras reservadas antes dos nomes dos subprogramas, para especificar sua natureza Em outras linguagens, usa-se palavras reservadas antes dos nomes dos subprogramas, para especificar sua natureza Em Pascal, usam-se as palavras function e procedure Em Pascal, usam-se as palavras function e procedure Em Fortran, function e subroutine

37 8.1.5 – Retorno de uma função em C O fluxo de execução retorna de uma função ao módulo que a chamou, por 2 maneiras distintas: O fluxo de execução retorna de uma função ao módulo que a chamou, por 2 maneiras distintas: retorno natural e retorno explícito No retorno natural, isso ocorre após a execução do último comando do corpo da função, desde que ele não seja um comando goto No retorno natural, isso ocorre após a execução do último comando do corpo da função, desde que ele não seja um comando goto No retorno explícito, ele acontece através da execução do comando return No retorno explícito, ele acontece através da execução do comando return

38 O comando return pode vir ou não acompanhado de uma expressão ou de uma variável O comando return pode vir ou não acompanhado de uma expressão ou de uma variável Quando acompanhado de uma expressão, seu valor é calculado e enviado ao módulo que chamou a função Quando acompanhado de uma expressão, seu valor é calculado e enviado ao módulo que chamou a função Quando acompanhado de uma variável, seu valor é enviado ao módulo que chamou a função Quando acompanhado de uma variável, seu valor é enviado ao módulo que chamou a função Quando não acompanhado, há apenas transferência do fluxo de execução Quando não acompanhado, há apenas transferência do fluxo de execução

39 Exemplos de instâncias do comando return: Exemplos de instâncias do comando return: return; return a; return ++a; return (a+b); Numa função em C destinada a retornar valor, os comandos return devem ser acompanhados de expressões ou de variáveis Numa função em C destinada a retornar valor, os comandos return devem ser acompanhados de expressões ou de variáveis Numa função void, não deve haver esse acompanhamento Numa função void, não deve haver esse acompanhamento

40 8.1.6 – Utilidades da subprogramação São várias as utilidades da subprogramação, dentre as quais podem ser citadas: Eliminação da necessidade de repetição de código Eliminação da necessidade de repetição de código Auxilio na metodologia top-down para o desenvolvimento de programas Auxilio na metodologia top-down para o desenvolvimento de programas Modularização de programas Modularização de programas Reaproveitamento do código de outros programas Reaproveitamento do código de outros programas Implementação de definições matemáticas recursivas Implementação de definições matemáticas recursivas

41 Eliminação da necessidade de repetição de código Programas que executam as mesmas operações para diferentes conjuntos de valores podem ter um subprograma que as executa para um conjunto genérico Programas que executam as mesmas operações para diferentes conjuntos de valores podem ter um subprograma que as executa para um conjunto genérico Exemplo: no programa da soma e multiplicação de polinômios Exemplo: no programa da soma e multiplicação de polinômios  Há 2 trechos muito semelhantes para ler os dados dos polinômios P1 e P2 e 4 para escrever os polinômios P1, P2, PS e PM  Pode-se fazer um só subprograma para ler e outro para escrever o conteúdo de um polinômio genérico

42 Exemplo: combinações de m elementos tomados n a n Exemplo: combinações de m elementos tomados n a nFórmula: Exige-se o cálculo do fatorial de 3 expressões: m, m-n e n Assim o programa pode ter uma função fat para o cálculo do fatorial de seu parâmetro A função main chama fat três vezes, passando como argumento, em cada chamada, cada uma das 3 expressões citadas A seguir, um programa completo

43 #include #include int fat (int n) { int i; int fat; if (n 12) fat = -1; else for (i=2, fat=1; i<=n; i++) fat *= i; return fat; }

44 int main () { char c; int m, n, comb; do { printf ("Combinacao de m elementos tomados n a n? (s/n): "); do c = getche(); while (c!='s' && c!='n'); if (c == 's') { printf ("\n\n\tm: "); scanf ("%d", &m); printf ("\tn: "); scanf ("%d", &n); if (m 12 || n 12 || n <= 0 || m < n) printf ("\n\tDados incompativeis\n\n"); else { comb = fat(m) / (fat(m-n) * fat(n)); printf ("\n\tNum. de combinacoes: %d\n\n", comb); }} } while (c == 's'); printf ("\n\n"); system ("pause"); return 0; } Obs.: as funções main e fat têm variáveis de mesmo nome: n Tratam-se de 2 variáveis distintas

45 Auxilio na metodologia top-down para o desenvolvimento de programas Conforme visto anteriormente, a programação de uma tarefa complexa pode ser decomposta num conjunto de tarefas menores Conforme visto anteriormente, a programação de uma tarefa complexa pode ser decomposta num conjunto de tarefas menores Aquelas que apresentarem certo grau de complexidade também podem ser decompostas da mesma maneira, até que se obtenha um conjunto de tarefas triviais Aquelas que apresentarem certo grau de complexidade também podem ser decompostas da mesma maneira, até que se obtenha um conjunto de tarefas triviais Essa é a idéia básica da metodologia top-down para o desenvolvimento de programas Essa é a idéia básica da metodologia top-down para o desenvolvimento de programas

46 Nessa idéia, cada tarefa suficientemente complexa pode ser realizada por um subprograma específico Nessa idéia, cada tarefa suficientemente complexa pode ser realizada por um subprograma específico Os comandos desse subprograma se constituem na decomposição da mesma tarefa em tarefas menores Os comandos desse subprograma se constituem na decomposição da mesma tarefa em tarefas menores O Capítulo X desta disciplina apresenta o desenvolvimento top-down de programas auxiliado por subprogramas O Capítulo X desta disciplina apresenta o desenvolvimento top-down de programas auxiliado por subprogramas

47 Modularização de programas É o isolamento de trabalhos bem específicos em módulos ou subprogramas destinados exclusivamente para esse fim; Exemplos: É o isolamento de trabalhos bem específicos em módulos ou subprogramas destinados exclusivamente para esse fim; Exemplos: Programas bem modularizados proporcionam ao projetista de software código mais fácil de ser compreendido e corrigido Programas bem modularizados proporcionam ao projetista de software código mais fácil de ser compreendido 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

48 Reaproveitamento do código de outros programas Funções desenvolvidas para elaborar um determinado programa podem ser utilizadas em outros programas Funções desenvolvidas para elaborar um determinado programa podem ser utilizadas em outros programas Por exemplo, num programa para resolver vários sistemas de equações lineares pode-se elaborar uma função que resolva um sistema genérico de equações lineares Por exemplo, num programa para resolver vários sistemas de equações lineares pode-se elaborar uma função que resolva um sistema genérico de equações lineares Essa função pode ser usada por programas para resolver sistemas de equações não-lineares, para fazer ajuste de curvas e para auxiliar a resolução de equações diferenciais parciais Essa função pode ser usada por programas para resolver sistemas de equações não-lineares, para fazer ajuste de curvas e para auxiliar a resolução de equações diferenciais parciais Assim, pode-se organizar uma biblioteca de subprogramas, e usá-los em novos projetos, conforme a necessidade Assim, pode-se organizar uma biblioteca de subprogramas, e usá-los em novos projetos, conforme a necessidade

49 Implementação de definições matemáticas recursivas Recursividade é um expediente muito usado para se estabelecer certas definições matemáticas Recursividade é um expediente muito usado para se estabelecer certas definições matemáticas Por exemplo, potenciação, cálculo de fatoriais e de mdc podem ser expressos usando respectivamente as seguintes definições recursivas: Por exemplo, potenciação, cálculo de fatoriais e de mdc podem ser expressos usando respectivamente as seguintes definições recursivas:

50 As atuais linguagens de programação admitem que um subprograma chame a si próprio, o que possibilita a implementação de definições recursivas As atuais linguagens de programação admitem que um subprograma chame a si próprio, o que possibilita a implementação de definições recursivas Exemplo: cálculo Exemplo: cálculo recursivo de fatorial É claro que, sem subprogramação isso seria impossível É claro que, sem subprogramação isso seria impossível Devido a sua grande importância, recursividade é vista num dos tópicos deste capítulo Devido a sua grande importância, recursividade é 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; }

51 Capítulo VIII – Subprogramação 8.1 – Introdução 8.2 – Escopo de validade de declarações 8.3 – Parâmetros e passagem de argumentos 8.4 – Prototipação de subprogramas 8.5 – Classes de alocação 8.6 – Recursividade

52 8.2 – Escopo de Validade de Declarações 8.2.1 – Declarações locais e globais Módulo X Declaraçã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 X Declaração de V

53 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 X Declaração de V Módulo W Módulo Y

54 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

55 Em Pascal, as declarações do programa principal são globais Cabeçalho do programa principal Declarações Begin Comandos do programa principal End Cabeçalho do subprograma S1 Declarações Begin comandos de S1 End Cabeçalho do subprograma S2 Declarações Begin comandos de S2 End Cabeçalho do subprograma S3 Declarações Begin comandos de S3 End Cabeçalho do subprograma S4 Declarações Begin comandos de S4 End

56 Um identificador pode ser declarado mais de uma vez, desde que seus escopos de validade sejam diferentes Um identificador pode ser declarado mais de uma vez, desde que seus escopos de validade sejam diferentes Exemplo: variáveis de mesmo nome: Exemplo: variáveis de mesmo nome: #include 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; }

57 #include 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: Resultado Em sss, b é a local de sss e a é a global Em 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

58 8.2.2 – Blocos Em C, bloco é um comando composto contendo declarações em seu início Em C, bloco é um comando composto contendo declarações 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 corpo de uma função é um bloco Então o corpo de uma função é um bloco Blocos podem aparecer embutidos no corpo de uma função Blocos podem aparecer embutidos no corpo de uma função Blocos podem aparecer embutidos em outros blocos Blocos podem aparecer embutidos em outros blocos A Linguagem C não permite aninhamentos de funções mas permite aninhamentos de blocos A Linguagem C não permite aninhamentos de funções mas permite aninhamentos de blocos O escopo de validade de um identificador declarado num bloco é o próprio bloco

59 #include #include int main () { int a = 1; printf ("main 1 : a = %4d;\n", a); {//bloco1 int a = 10; printf ("bloco1 1: a = %4d;\n", a); {//bloco2 int a = 200; printf ("bloco2 : a = %4d;\n", a); } a++; printf ("bloco1 2: a = %4d;\n", a); } a++; printf ("main 2 : a = %4d;\n", a); {//bloco3 int a = 30; printf ("bloco3 1: a = %4d;\n", a); {//bloco4 int a = 400; printf ("bloco4 : a = %4d;\n", a); } a++; printf ("bloco3 2: 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

60 Dois blocos são paralelos quando embutidos num terceiro, não sendo nenhum deles embutido em nenhum outro bloco a não ser nesse terceiro e naqueles blocos onde esse terceiro estiver embutido Dois blocos são paralelos quando embutidos num terceiro, não sendo nenhum deles embutido em nenhum outro bloco a não ser nesse terceiro e naqueles blocos onde esse terceiro estiver embutido Blocos paralelos: B1 || B2, B3 || B4 Blocos paralelos: B1 || B2, B3 || B4 B1 e B3 não são paralelos; B1 e B4 também não B1 e B3 não são paralelos; B1 e B4 também não Em C, funções são escritas em paralelo, pois estão embutidas somente no corpo do programa. Em C, funções são escritas em paralelo, pois estão embutidas somente no corpo do programa. Função main Declarações Comandos Bloco B1 Declarações Comandos Bloco B2 Declarações Comandos Comandos Bloco B3 Declarações Comandos Bloco B4 Declarações Comandos

61 8.2.3 – Variáveis automáticas Variável automática: variável local que só é alocada na memória quando seu bloco de declaração começa a ser executado Variável automática: variável local que só é alocada na memória quando seu bloco de declaração começa a ser executado Ela é desalocada no final da execução desse bloco Ela é desalocada no final da execução desse bloco Caso tal bloco volte a ser executado, nova alocação para ela é feita, mas seu valor no final da execução anterior é perdido Caso tal bloco volte a ser executado, nova alocação para ela é feita, mas seu valor no final da execução anterior é perdido Todas as variáveis locais dos programas apresentados até aqui são automáticas Todas as variáveis locais dos programas apresentados até aqui são automáticas

62 Variáveis locais não-automáticas são estudadas mais adiante neste capítulo Variáveis locais não-automáticas são estudadas mais adiante neste capítulo Uma variável global não é automática pois fica alocada durante toda execução do programa Uma variável global não é automática pois fica alocada durante toda execução do programa Em C, pode-se usar a palavra reservada auto para tornar explícito que uma ou várias variáveis são automáticas Em C, pode-se usar a palavra reservada auto para tornar explícito que uma ou várias variáveis são automáticas Se a seguinte declaração for local Se a seguinte declaração for local int a, b; então ela equivale a auto int a, b; A seguir, um programa com várias variáveis automáticas

63 #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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 ca bb c ff xa global 1 Iniciar a execução

64 #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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 ca bb c ff xa global 1

65 a bb c ff x #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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

66 a bb c ff x #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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

67 a bb c ff x #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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;} 7 b main 9 ca global 1

68 a bb c ff x #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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;} 7 b main 9 ca global 1

69 c ff x #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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;} 7 b main 9 c ??? a bb a global 1

70 c ff x #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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;} 7 b main 9 c ??? a bb a global 1

71 c ff x #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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;} 7 b main 9 c 5 a bb a global 1

72 c ff x #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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;} 7 b main 9 c 5 a bb a global 1

73 c ff x #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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;} 7 b main 9 c 5 a bb a global 1

74 #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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 7 b main 9 c 5 a bb a global 1

75 #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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 7 b main 9 c 5 a bb a global 1

76 #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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;} 11 c ff 22 x 7 b main 9 c 5 a bb a global 33

77 #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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;} 11 c ff 22 x 7 b main 9 c 5 a bb a global 33

78 #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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 7 b main 9 c 5 a bb a global 33

79 #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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 7 b main 9 c 5 a bb a global 33

80 #include #include int a = 1; void ff ( ) { int c, x; printf ("Ponto 4: a = %5d; c = %13d; x = %13d;\n", a, c, x); c = 11; x = 22; a = 33; printf ("Ponto 5: a = %5d; c = %13d; x = %13d;\n", a, c, x); } int main ( ) { int b, c; printf ("Ponto 0: a = %5d; b = %13d; c = %13d;\n", a, b, c); b = 7; c = 9; printf ("Ponto 1: a = %5d; b = %13d; c = %13d;\n", a, b, c); {/* Bloco bb */ int a; printf ("Ponto 2: a = %5d; b = %13d; c = %13d;\n", a, b, c); a = 5; printf ("Ponto 3: a = %5d; b = %13d; c = %13d;\n", a, b, c); ff ( ); } 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 7 b main 9 ca 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

81 O uso de blocos e de variáveis automáticas torna possível reservar espaço para variáveis só quando necessário O uso de blocos e de variáveis automáticas torna possível reservar espaço para variáveis só quando necessário Seja por exemplo, o seguinte esquema de programa: Seja por exemplo, o seguinte esquema de 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 }

82 As variáveis automáticas declaradas em cada bloco só ocupam espaço de memória durante a execução do mesmo As variáveis automáticas declaradas em cada bloco só ocupam espaço de memória durante a execução do mesmo Não o ocupam durante toda a execução da função main Não o ocupam durante toda a execução da função main --- 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 }

83 Caso não houvesse blocos, todas essas variáveis deveriam ser declaradas na função main, ocupando espaço durante a execução de todo o programa Caso não houvesse blocos, todas essas variáveis deveriam ser declaradas na função main, ocupando espaço durante a execução de todo o programa Esse espaço poderia não ser suficiente Esse espaço poderia nã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 }


Carregar ppt "CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação."

Apresentações semelhantes


Anúncios Google