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

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

DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

Apresentações semelhantes


Apresentação em tema: "DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto."— Transcrição da apresentação:

1 rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel Carga Horária: 60 h

2 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 2 Tópicos 5.1Introdução 5.2Módulos de Programas em C 5.3Biblioteca de Funções Matemáticas 5.4Funções 5.5Definições de Função 5.6Protótipos de Funções 5.7Arquivos de Cabeçalho 5.8Chamada de Funções por Valor e por Referência 5.9Geração de Números Aleatórios 5.10Exemplo: Jogo de Azar Tópicos 5.1Introdução 5.2Módulos de Programas em C 5.3Biblioteca de Funções Matemáticas 5.4Funções 5.5Definições de Função 5.6Protótipos de Funções 5.7Arquivos de Cabeçalho 5.8Chamada de Funções por Valor e por Referência 5.9Geração de Números Aleatórios 5.10Exemplo: Jogo de Azar Introdução à Programação

3 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 3 Tópicos 5.11Classes de Armazenamento 5.12Regras de Escopo 5.13Recursividade 5.14Exemplo de Recursividade: Série de Fibonacci 5.15Recursividade vs. Iteração Tópicos 5.11Classes de Armazenamento 5.12Regras de Escopo 5.13Recursividade 5.14Exemplo de Recursividade: Série de Fibonacci 5.15Recursividade vs. Iteração Introdução à Programação

4 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 4 Divisão para a conquista Construção de programas a partir de partes ou componentes menores Módulos Maior facilidade de gestão de cada módulo do que do programa original Divisão para a conquista Construção de programas a partir de partes ou componentes menores Módulos Maior facilidade de gestão de cada módulo do que do programa original 5.1 Introdução

5 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 5 Funções Módulos em C Possibilidade de combinação de funções definidas pelo usuário com funções das bibliotecas nos programas Existência de uma vasta gama de funções na biblioteca padrão de C Funções Módulos em C Possibilidade de combinação de funções definidas pelo usuário com funções das bibliotecas nos programas Existência de uma vasta gama de funções na biblioteca padrão de C 5.2 Módulos de Programas em C

6 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 6 Chamadas de Funções Invocação de funções Explicitação do nome da função e passagem de argumentos (dados) Realização de operações ou manipulações pela função Retorno dos resultados pela função Chamadas de Funções Invocação de funções Explicitação do nome da função e passagem de argumentos (dados) Realização de operações ou manipulações pela função Retorno dos resultados pela função 5.2 Módulos de Programas em C

7 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 7 Chamadas de Funções Analogia Solicitação de execução de uma tarefa pelo patrão a um empregado Aquisição de informações sobre a tarefa pelo empregado Execução da tarefa Retorno dos resultados Ocultação da informação (patrão não conhece os detalhes) Chamadas de Funções Analogia Solicitação de execução de uma tarefa pelo patrão a um empregado Aquisição de informações sobre a tarefa pelo empregado Execução da tarefa Retorno dos resultados Ocultação da informação (patrão não conhece os detalhes) 5.2 Módulos de Programas em C

8 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 8 Biblioteca de Funções Matemáticas Execução de cálculos matemáticos comuns #include Formato para a chamada de funções Nome_da_Função(argumento1, …, argumentoN); Uso da vígula como separador em listas múltiplas de argumentos Biblioteca de Funções Matemáticas Execução de cálculos matemáticos comuns #include Formato para a chamada de funções Nome_da_Função(argumento1, …, argumentoN); Uso da vígula como separador em listas múltiplas de argumentos 5.3 Biblioteca de Funções Matemáticas

9 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 9 Formato para a chamada de funções printf( "%.2f", sqrt( 900.0 ) ); Chamada da função sqrt, a qual retorna a raiz quadrada de seu argumento Todas as funções matemáticas retornam dados do tipo double Argumentos Constantes, variáveis ou expressões Formato para a chamada de funções printf( "%.2f", sqrt( 900.0 ) ); Chamada da função sqrt, a qual retorna a raiz quadrada de seu argumento Todas as funções matemáticas retornam dados do tipo double Argumentos Constantes, variáveis ou expressões 5.3 Biblioteca de Funções Matemáticas

10 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 10 5.4 Funções Funções Modularização de um programa Todas as variáveis declaradas dentro de funções são variáveis locais Conhecidas apenas no contexto da função Parâmetros Informação da comunicação entre funções Variáveis locais Funções Modularização de um programa Todas as variáveis declaradas dentro de funções são variáveis locais Conhecidas apenas no contexto da função Parâmetros Informação da comunicação entre funções Variáveis locais

11 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 11 5.4 Funções Benefícios de funções Divisão para conquista Desenvolvimento gerenciável de programas Reusabilidade de Software Uso de funções existentes como blocos para a construção de novos programas Abstração Ocultação de detalhes internos (funções da biblioteca) Repetição de código evitada Benefícios de funções Divisão para conquista Desenvolvimento gerenciável de programas Reusabilidade de Software Uso de funções existentes como blocos para a construção de novos programas Abstração Ocultação de detalhes internos (funções da biblioteca) Repetição de código evitada

12 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 12 5.5 Definições de Funções Formato de Definição de uma Função tipo_do_valor_de_retorno nome_da_função (lista de parâmetros ) { declarações e atribuições } nome_da_função nome_da_função Qualquer identificador válido Formato de Definição de uma Função tipo_do_valor_de_retorno nome_da_função (lista de parâmetros ) { declarações e atribuições } nome_da_função nome_da_função Qualquer identificador válido

13 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 13 5.5 Definições de Funções Formato de Definição de uma Função lista_de_parâmetros lista_de_parâmetros Declaração de uma série de parâmetros Um tipo deve ser listado explicitamente para cada parâmetro, caso contrário o parâmetro será considerado do tipo int Formato de Definição de uma Função lista_de_parâmetros lista_de_parâmetros Declaração de uma série de parâmetros Um tipo deve ser listado explicitamente para cada parâmetro, caso contrário o parâmetro será considerado do tipo int

14 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 14 Formato de Definição de uma Função tipo_do_valor_de_retorno nome_da_função (lista de parâmetros ) { declarações e atribuições } Declarações e atribuições Corpo da função (bloco de código) Variáveis podem ser declaradas dentro dos blocos (podem ser aninhadas) Funções não podem ser definidas dentro de outras funções Formato de Definição de uma Função tipo_do_valor_de_retorno nome_da_função (lista de parâmetros ) { declarações e atribuições } Declarações e atribuições Corpo da função (bloco de código) Variáveis podem ser declaradas dentro dos blocos (podem ser aninhadas) Funções não podem ser definidas dentro de outras funções 5.5 Definições de Funções

15 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 15 Formato de Definição de uma Função Retorno do Controle Quando não há retorno return; Se algo for retornado return expressão ; Formato de Definição de uma Função Retorno do Controle Quando não há retorno return; Se algo for retornado return expressão ; 5.5 Definições de Funções

16 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 16 5.5 Definições de Funções 02 #include 03 04 int maximo( int, int, int ); /* protótipo da função */ 05 int main() 06 { 07 int a, b, c; 08 09 printf( Digite três inteiros: " ); 10 scanf( "%d%d%d", &a, &b, &c ); 11 printf( O maximo eh: %d\n", maximo( a, b, c ) ); 12 13 return 0; 14 } 01 /* Determinação do máximo de três inteiros */ Função Principal (Programa Principal)

17 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 17 Função Máximo 5.5 Definições de Funções 15 /* Definição da função maximo */ 16 int maximo( int x, int y, int z ) 17 { 18 int max = x; 19 20 if ( y > max ) 21 max = y; 22 23 if ( z > max ) 24 max = z; 25 26 return max; 27 } Digite três inteiros: 22 85 17 Maximo eh: 85 Digite três inteiros: 22 85 17 Maximo eh: 85

18 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 18 5.6 Protótipos de Funções Protótipo de uma Função Nome da função Parâmetros O QUE a função recebe Tipo de Retorno Tipo de dado que a função retorna (default int ) Uso no processo de validação de funções Necessidade de inclusão do protótipo apenas se a definição da função sucede a sua ativação Função com o protótipo int maximo(int, int, int); Recebimento de 3 parâmetros int Retorno de 1 dado int Protótipo de uma Função Nome da função Parâmetros O QUE a função recebe Tipo de Retorno Tipo de dado que a função retorna (default int ) Uso no processo de validação de funções Necessidade de inclusão do protótipo apenas se a definição da função sucede a sua ativação Função com o protótipo int maximo(int, int, int); Recebimento de 3 parâmetros int Retorno de 1 dado int

19 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 19 5.6 Protótipos de Funções Coerção de Argumentos Imposição de argumentos do tipo apropriado Exemplo Função sqrt Possibilidade de chamada com um argumento int, embora o protótipo em math.h especifique um argumento double printf(%.3f\n, sqrt(4)); printf(%.3f\n, sqrt(4)); sqrt(4) Resultado gerado Cálculo correto de sqrt(4) e impressão do valor 2.000 Coerção de Argumentos Imposição de argumentos do tipo apropriado Exemplo Função sqrt Possibilidade de chamada com um argumento int, embora o protótipo em math.h especifique um argumento double printf(%.3f\n, sqrt(4)); printf(%.3f\n, sqrt(4)); sqrt(4) Resultado gerado Cálculo correto de sqrt(4) e impressão do valor 2.000

20 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 20 5.6 Protótipos de Funções Regras de Promoção Especificação de como alguns tipos podem ser convertidos para outros sem perda de dados Possibilidade de cometimento de erros Conversão de double em int Truncamento da parte fracionária do valor double Aplicação automática a expressões contendo dois ou mais tipos de dados (mistas) Regras de Promoção Especificação de como alguns tipos podem ser convertidos para outros sem perda de dados Possibilidade de cometimento de erros Conversão de double em int Truncamento da parte fracionária do valor double Aplicação automática a expressões contendo dois ou mais tipos de dados (mistas)

21 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 21 5.7 Arquivos de Cabeçalho Arquivos de Cabeçalho Contêm os protótipos das funções das bibliotecas referenciadas no programa e outras definições E.g.,, Necessidade de inclusão da(s) linha(s) #include Arquivos de Cabeçalho Contêm os protótipos das funções das bibliotecas referenciadas no programa e outras definições E.g.,, Necessidade de inclusão da(s) linha(s) #include

22 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 22 5.7 Arquivos-Cabeçalhos Arquivos-Cabeçalhos Customizados Criação de arquivos com funções Salvamento Inclusão em outros arquivos #include nome_do_arquivo.h Reuso das funções Arquivos-Cabeçalhos Customizados Criação de arquivos com funções Salvamento Inclusão em outros arquivos #include nome_do_arquivo.h Reuso das funções

23 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 23 5.8Chamada de Funções por Valor e por Referência Uso na invocação de funções Chamada por valor Cópia do(s) argumento(s) passado(s) para a função Alterações do(s) argumento(s) na função não exercem influência sobre o(s) valor(es) original(ais) Uso quando não há necessidade de alteração do argumento pela função Prevenção contra alterações acidentais Uso na invocação de funções Chamada por valor Cópia do(s) argumento(s) passado(s) para a função Alterações do(s) argumento(s) na função não exercem influência sobre o(s) valor(es) original(ais) Uso quando não há necessidade de alteração do argumento pela função Prevenção contra alterações acidentais

24 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 24 5.8Chamada de Funções por Valor e por Referência Chamada por referência Passagem do(s) argumento(s) original(ais) Alterações do(s) argumento(s) na função implicam alterações no(s) original(ais) Uso apenas com funções confiáveis que precisem modificar a variável original Foco atual Chamada por valor Chamada por referência Passagem do(s) argumento(s) original(ais) Alterações do(s) argumento(s) na função implicam alterações no(s) original(ais) Uso apenas com funções confiáveis que precisem modificar a variável original Foco atual Chamada por valor

25 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 25 5.9 Geração de Números Aleatórios Função rand Inclusão de Retorno de um número aleatório entre 0 and RAND_MAX (pelo menos 32767 ) i = rand(); Pseudo-aleatoriedade Seqüência pré-definida de números aleatórios Mesma seqüência para qualquer chamada à função Função rand Inclusão de Retorno de um número aleatório entre 0 and RAND_MAX (pelo menos 32767 ) i = rand(); Pseudo-aleatoriedade Seqüência pré-definida de números aleatórios Mesma seqüência para qualquer chamada à função

26 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 26 5.9 Geração de Números Aleatórios Ajuste de Escala Obtenção de um número aleatório entre 1 e n 1 + ( rand() % n ) rand() % n retorna um número entre 1 e n-1 Adição de 1 para gerar um número aleatório entre 1 e n 1 + ( rand() % 6) Número entre 1 e 6 Ajuste de Escala Obtenção de um número aleatório entre 1 e n 1 + ( rand() % n ) rand() % n retorna um número entre 1 e n-1 Adição de 1 para gerar um número aleatório entre 1 e n 1 + ( rand() % 6) Número entre 1 e 6

27 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 27 Função srand Inclusão de Definição de uma semente (seed) inteira e deslocamento de sua seqüência aleatória para aquela locação srand( seed ); srand( time( NULL ) ); // inclusão de time( NULL ) Retorno do tempo no qual o programa foi compilado (em segundos) Aleatorização" da semente Função srand Inclusão de Definição de uma semente (seed) inteira e deslocamento de sua seqüência aleatória para aquela locação srand( seed ); srand( time( NULL ) ); // inclusão de time( NULL ) Retorno do tempo no qual o programa foi compilado (em segundos) Aleatorização" da semente 5.9 Geração de Números Aleatórios

28 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 28 5.9 Geração de Números Aleatórios 01 Programa para randomização no lançamento de um dado */ 02 #include 03 #include 04 05 int main() 06 { 07 int i; 08 unsigned semente; 09 10 printf( Digite a semente: " ); 11 scanf( "%u", &semente ); 12 srand(semente); 13 for ( i = 1; i <= 10; i++ ) { 14 printf( "%10d", 1 + ( rand() % 6 ) ); 15 if ( i % 5 == 0 ) 16 printf( "\n" ); 17 } 18 return 0; 19 } Digite a semente:867 Digite a semente: 867 2 4 6 1 6 2 4 6 1 6 1 1 3 6 2 1 1 3 6 2 Digite a semente:867 Digite a semente: 867 2 4 6 1 6 2 4 6 1 6 1 1 3 6 2 1 1 3 6 2 Digite a semente: 67 6 1 4 6 2 6 1 4 6 2 1 6 1 6 4 1 6 1 6 4 Digite a semente: 67 6 1 4 6 2 6 1 4 6 2 1 6 1 6 4 1 6 1 6 4

29 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 29 5.10Exemplo: Jogo de Azar Simulador de Craps Regras Lançamento de dois dados 7 ou 11 na primeira rodada, o jogador vence 2, 3 ou 12 na primeira rodada (craps), o jogador perde (i.e. a casa vence) 4, 5, 6, 8, 9 ou 10 na primeira rodada, a soma torna-se o ponto do jogador Jogador ganhará se continuar lançando os dados até fazer seu ponto e isto ocorrer antes de obter 7 como resultado Simulador de Craps Regras Lançamento de dois dados 7 ou 11 na primeira rodada, o jogador vence 2, 3 ou 12 na primeira rodada (craps), o jogador perde (i.e. a casa vence) 4, 5, 6, 8, 9 ou 10 na primeira rodada, a soma torna-se o ponto do jogador Jogador ganhará se continuar lançando os dados até fazer seu ponto e isto ocorrer antes de obter 7 como resultado

30 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 30 01 /* Simulador de Craps */ 02 #include 03 #include 04 #include 05 06 int rola_dados( void ); 07 08 int main() 09 { 10 int placar, soma, ponto; 11 12 srand( time( NULL ) ); 13 soma = rola_dados(); /* primeiro lançamento dos dados */ 14 switch ( soma ) { 15 case 7: case 11: /* ganha na primeira rodada */ 16 placar = 1; 17 break; 18 case 2: case 3: case 12: /* perde na primeira rodada */ 19 placar = 2; 20 break; 21 default: /* armazena ponto */ 22 placar = 0; 23 ponto = soma; 24 printf( O total de pontos eh %d\n", ponto ); 25 break; 26 } 27 while (placar == 0) { /* continua jogando */ 28 soma = rola_dados(); 5.10Exemplo: Jogo de Azar

31 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 31 5.10Exemplo: Jogo de Azar 29 if (soma == ponto) /* vence fazendo ponto */ 30 placar = 1; 31 else 32 if (soma == 7) /* perde obtendo o valor 7 */ 33 placar = 2; 34 } 35 if (placar == 1) 36 printf( O jogador venceu\n" ); 37 else 38 printf( " O jogador perdeu\n " ); 39 return 0; 40 } 41 int rola_dados( void ) 42 { 43 int dado1, dado2, soma; 44 dado1 = 1 + ( rand() % 6 ); 45 dado2 = 1 + ( rand() % 6 ); 46 soma = dado1 + dado2; 47 printf( O jogador lançou %d + %d = %d vezes\n", dado1, dado2, soma ); 48 return soma; 49 } O jogador lançou 6 + 5 = 11 O jogadorvenceu O jogador venceu O jogador lançou 6 + 5 = 11 O jogadorvenceu O jogador venceu O jogador lançou 6 + 6 = 12 O jogador perdeu O jogador lançou 6 + 6 = 12 O jogador perdeu O jogador lançou 4 + 6 = 10 O total de pontos eh 10 O jogador lançou 2 + 4 = 6 O jogador lançou6 + 5 = 11 O jogador lançou 6 + 5 = 11 O jogador lançou3 + 3 = 6 O jogador lançou 3 + 3 = 6 O jogador lançou6 + 4 = 10 O jogador lançou 6 + 4 = 10 O jogador venceu O jogador lançou 4 + 6 = 10 O total de pontos eh 10 O jogador lançou 2 + 4 = 6 O jogador lançou6 + 5 = 11 O jogador lançou 6 + 5 = 11 O jogador lançou3 + 3 = 6 O jogador lançou 3 + 3 = 6 O jogador lançou6 + 4 = 10 O jogador lançou 6 + 4 = 10 O jogador venceu O jogador lançou 1 + 3 = 4 O total de pontos eh 4 O jogador lançou 1 + 4 = 5 O jogador lançou5 + 4 = 9 O jogador lançou 5 + 4 = 9 O jogador lançou4 + 6 = 10 O jogador lançou 4 + 6 = 10 O jogador lançou6 + 3 = 9 O jogador lançou 6 + 3 = 9 O jogador lançou1 + 2 = 3 O jogador lançou 1 + 2 = 3 O jogador lançou5 + 2 = 7 O jogador lançou 5 + 2 = 7 O jogador perdeu O jogador lançou 1 + 3 = 4 O total de pontos eh 4 O jogador lançou 1 + 4 = 5 O jogador lançou5 + 4 = 9 O jogador lançou 5 + 4 = 9 O jogador lançou4 + 6 = 10 O jogador lançou 4 + 6 = 10 O jogador lançou6 + 3 = 9 O jogador lançou 6 + 3 = 9 O jogador lançou1 + 2 = 3 O jogador lançou 1 + 2 = 3 O jogador lançou5 + 2 = 7 O jogador lançou 5 + 2 = 7 O jogador perdeu

32 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 32 5.11 Classes de Armazenamento Especificadores de classes de armazenamento Tempo (ou duração) de Armazenamento Período durante o qual o identificador permanece na memória Escopo Local no qual o objeto pode ser referenciado no programa Linkage (ligação) Especificação dos arquivos nos quais um identificador é conhecido Especificadores de classes de armazenamento Tempo (ou duração) de Armazenamento Período durante o qual o identificador permanece na memória Escopo Local no qual o objeto pode ser referenciado no programa Linkage (ligação) Especificação dos arquivos nos quais um identificador é conhecido

33 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 33 5.11 Classes de Armazenamento Armazenamento Automático Criação do objeto quando o bloco no qual é declarado for acionado Existência do objeto enquanto o bloco estiver ativo Destruição do objeto quando o bloco for descartado auto Default para variáveis locais auto double x, y; register Tentativa de conservação de uma variável em um registrador de alta velocidade Uso apenas para variáveis automáticas register int counter = 1; Armazenamento Automático Criação do objeto quando o bloco no qual é declarado for acionado Existência do objeto enquanto o bloco estiver ativo Destruição do objeto quando o bloco for descartado auto Default para variáveis locais auto double x, y; register Tentativa de conservação de uma variável em um registrador de alta velocidade Uso apenas para variáveis automáticas register int counter = 1;

34 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 34 5.11 Classes de Armazenamento Armazenamento Estático Existência das variáveis durante toda a execução do programa Valor default: zero static Variáveis locais definidas em funções Manutenção do valor após o término da função Conhecimento apenas pela própria função extern Default para variáveis globais e nomes de funções Conhecimento por qualquer função Armazenamento Estático Existência das variáveis durante toda a execução do programa Valor default: zero static Variáveis locais definidas em funções Manutenção do valor após o término da função Conhecimento apenas pela própria função extern Default para variáveis globais e nomes de funções Conhecimento por qualquer função

35 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 35 5.12 Regras de Escopo Escopo de Arquivo Identificador definido fora da função, conhecido por todas as funções Uso para variáveis globais, definições de funções, protótipos de funções Escopo de Função Referência possível apenas dentro do corpo de uma função Uso apenas para rótulos ( start:, case:, etc.) Escopo de Arquivo Identificador definido fora da função, conhecido por todas as funções Uso para variáveis globais, definições de funções, protótipos de funções Escopo de Função Referência possível apenas dentro do corpo de uma função Uso apenas para rótulos ( start:, case:, etc.)

36 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 36 Escopo de Bloco Declaração de um identificador dentro do bloco Início do escopo do bloco na declaração Término do escopo do bloco na chave direita Uso para variáveis e parâmetros de funções (variáveis locais de funções ) Ocultação de blocos exteriores dos blocos interiores se houver variáveis com nomes iguais em ambos os blocos Escopo de Protótipo de Função Uso para identificadores em listas de parâmetros Escopo de Bloco Declaração de um identificador dentro do bloco Início do escopo do bloco na declaração Término do escopo do bloco na chave direita Uso para variáveis e parâmetros de funções (variáveis locais de funções ) Ocultação de blocos exteriores dos blocos interiores se houver variáveis com nomes iguais em ambos os blocos Escopo de Protótipo de Função Uso para identificadores em listas de parâmetros 5.12 Regras de Escopo

37 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 37 01/* Exemplo de escopo */ 02#include 03void a(void); /* protótipo da função a */ 04void b(void); /* protótipo da função b */ 05void c(void); /* protótipo da função c */ 06int x = 1; /* variável global */ 07int main() 08{ 09 int x = 5; /* variável local para main */ 10 printf(x local no escopo externo de main é %d\n", x ); 11{ /* início de um novo escopo */ 12int x = 7; 13printf( x local no escopo interno de main é %d\n", x ); 14} /* término do novo escopo */ 15printf( x local no escopo externo de main é %d\n", x ); 16a(); /* a contém x local automática */ 17b(); /* b contém x local estática*/ 18c(); /* c usa x global */ 19a(); /* a reinicializa x local automática */ 20b(); /* x local estática mantém seu valor anterior */ 21c(); /* x global também mantém seu valor */ 5.12 Regras de Escopo 22printf( x local em main é %d\n", x ); 23return 0; 24}

38 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 38 5.12 Regras de Escopo 25void a(void) 26{ 27int x = 25; /* inicializada a cada vez em que a é chamada */ 28printf( "\nx local em a é %d depois de entrar em a\n", x ); 29++x; 30printf( "x local em a é %d antes de sair de a\n", x ); 31} 32void b(void) 33{ 34static int x = 50; /* inicializa somente na primeira vez em que b é chamada */ 35printf( "\nx local estática é %d ao entrar em b\n", x ); 36++x; 37printf( " x local estática é %d ao sair de b\n", x ); 38} 39void c(void) 40{ 41printf( "\n x global é %d ao entrar em c\n", x ); 42x *= 10; 43printf( " x global eh %d ao sair de c\n", x ); 44}

39 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 39 x local no escopo externo de main é 5 x local no escopo interno de main é 7 x local no escopo externo de main é 5 x local em a é 25 depois de entrar em a x local em a é 26 antes de sair de a x local estática é 50 ao entrar em b x local estática é 51 ao sair de b x global é 1 ao entrar em c x global é 10 ao sair de c x local em a é 25 depois de entrar a x local em a é 26 antes de sair de a x local estática é 51 ao entrar em b x local estática é 52 ao sair de b x global é 10 ao entrar em c x global é 100 ao sair de c x local em main é 5 5.12 Regras de Escopo

40 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 40 5.13 Recursividade Funções Recursivas Auto-chamadas Possibilidade de solução apenas de um caso básico Fragmentação de um problema em O que é possível fazer O que não é possível fazer Necessidade de tal parte do problema se assemelhe ao problema original (versão mais simples ou menor) Função Chamada a uma nova cópia de si própria (chamada recursiva ou etapa de recursão) para a solução do que não é possível fazer Funções Recursivas Auto-chamadas Possibilidade de solução apenas de um caso básico Fragmentação de um problema em O que é possível fazer O que não é possível fazer Necessidade de tal parte do problema se assemelhe ao problema original (versão mais simples ou menor) Função Chamada a uma nova cópia de si própria (chamada recursiva ou etapa de recursão) para a solução do que não é possível fazer

41 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 41 5.13 Recursividade Funções Recursivas Caso básico eventualmente solucionado Extensão, processamento e solução do problema como um todo Funções Recursivas Caso básico eventualmente solucionado Extensão, processamento e solução do problema como um todo

42 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 42 Exemplo Fatoriais 5! = 5 * 4 * 3 * 2 * 1 Importante observar que 5! = 5 * 4! 4! = 4 * 3!... Possibilidade de computação recursiva de factoriais 1!=0!=1 Solução do caso básico ( 1!=0!=1 ) e extensão para 2! = 2 * 1! = 2 * 1 = 2; 3! = 3 * 2! = 3 * 2 = 6; Exemplo Fatoriais 5! = 5 * 4 * 3 * 2 * 1 Importante observar que 5! = 5 * 4! 4! = 4 * 3!... Possibilidade de computação recursiva de factoriais 1!=0!=1 Solução do caso básico ( 1!=0!=1 ) e extensão para 2! = 2 * 1! = 2 * 1 = 2; 3! = 3 * 2! = 3 * 2 = 6; 5.13 Recursividade

43 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 43 5.14Exemplo de Uso de Recursividade: Série de Fibonacci Série de Fibonacci (0, 1, 1, 2, 3, 5, 8...) Cada número é a soma dos dois anteriores Possibilidade de solução recursiva fib( n ) = fib( n - 1 ) + fib( n – 2 ) fib( n ) = fib( n - 1 ) + fib( n – 2 ) fibonacci Código para a função fibonacci long fibonacci( long n ) { if (n == 0 || n == 1) // caso básico return n; else return fibonacci(n – 1) + fibonacci(n – 2); } Série de Fibonacci (0, 1, 1, 2, 3, 5, 8...) Cada número é a soma dos dois anteriores Possibilidade de solução recursiva fib( n ) = fib( n - 1 ) + fib( n – 2 ) fib( n ) = fib( n - 1 ) + fib( n – 2 ) fibonacci Código para a função fibonacci long fibonacci( long n ) { if (n == 0 || n == 1) // caso básico return n; else return fibonacci(n – 1) + fibonacci(n – 2); }

44 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 44 return 0 f(2) f(0) return 1 fibonacci Série de chamadas recursivas à função fibonacci 5.14Exemplo de Uso de Recursividade: Série de Fibonacci f(1) return 1 return return+ + f(3) f(1)

45 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 45 5.14Exemplo de Uso de Recursividade: Série de Fibonacci 01/* Função recursiva da Série de Fibonacci */ 02#include 03 04long fibonacci(long); 05int main() 06{ 07 long resultado, numero; 08 09 printf(Digite um inteiro: "); 10 scanf( "%ld", &numero ); 11 resultado = fibonacci(numero); 12 printf("Fibonacci( %ld ) = %ld\n", numero, resultado); 13 return 0; 14} 15/* Definição recursiva da função fibonacci */ 16long fibonacci(long n) 17{ 18 if (n == 0 || n == 1) 19 return n; 20 else 21 return fibonacci(n - 1) + fibonacci(n - 2); 22}

46 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 46 Digite um inteiro: 2 Fibonacci(2) = 1 Digite um inteiro : 3 Fibonacci(3) = 2 Digite um inteiro : 4 Fibonacci(4) = 3 Digite um inteiro : 5 Fibonacci(5) = 5 Digite um inteiro : 6 Fibonacci(6) = 8 Digite um inteiro : 10 Fibonacci(10) = 55 Digite um inteiro : 20 Fibonacci(20) = 6765 Digite um inteiro : 30 Fibonacci(30) = 832040 5.14Exemplo de Uso de Recursividade: Série de Fibonacci Exemplo de Saída

47 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 47 5.15Recursividade vs. Iteração Repetição Iteração Laço explícito Recursividade Chamadas repetidas à função Terminação Iteração Falha na condição do laço Recursividade Reconhecimento do caso básico Iteração/Recursividade Possibilidade de laços infinitos Repetição Iteração Laço explícito Recursividade Chamadas repetidas à função Terminação Iteração Falha na condição do laço Recursividade Reconhecimento do caso básico Iteração/Recursividade Possibilidade de laços infinitos

48 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 48 5.15Recursividade vs. Iteração Ponto de Equilíbrio Ponderação entre desempenho (iteração) e qualidade da engenharia de software (recursividade ) Ponto de Equilíbrio Ponderação entre desempenho (iteração) e qualidade da engenharia de software (recursividade )

49 rangel@dsc.ufpb.br DSC/CCT/UFCG José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO UNIVERSIDADE FEDERAL DE CAMPINA GRANDE CENTRO DE CIÊNCIAS E TECNOLOGIA


Carregar ppt "DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto."

Apresentações semelhantes


Anúncios Google