View
215
Download
0
Category
Preview:
Citation preview
CES-10 INTRODUÇÃO CES-10 INTRODUÇÃO À COMPUTAÇÃOÀ COMPUTAÇÃO
Capítulo VIII Capítulo VIII SubprogramaçãoSubprogramaçã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
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
Fluxo de controle de um programa com Fluxo de controle de um programa com subprogramas:subprogramas:
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
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
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
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
#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
#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
#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
#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
#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)
#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
#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
#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
#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
#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)
#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)
#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)
#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
#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
#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
#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
#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
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
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));
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
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);
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
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
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
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
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
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
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
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
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
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
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
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
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
#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;}}
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
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
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
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
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
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::
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;
}
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
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
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
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
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
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;}
#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
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
#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
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
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
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
#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
#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
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
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
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
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
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
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
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
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
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
#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
#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
#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
#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
#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
#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
#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
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 }}
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 }}
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 }}
Recommended