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 Carga Horária:60 h.

Apresentações semelhantes


Apresentação em tema: "DSC/CCT/UFCG Profs.:José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel Carga Horária:60 h."— 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 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 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 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  Componentes do programa que se repetem em pontos distintos 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 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 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) 5.2 Módulos de Programas em C

8 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 8  Funções de Entrada e Saída  #include – contém entrada scanf() e saída printf()  Execução de cálculos matemáticos comuns  Funções matemáticas  #include  Processamento de textos  #include  Outras , ; 5.3 Bibliotecas de Funções

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 5.3 Biblioteca de Funções Matemáticas

10 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 10  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

11 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 11 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

12 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 12 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

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 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

14 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 14 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 parametros (= pares tipo identificador)  Um tipo deve ser listado explicitamente para cada parâmetro, caso contrário o parâmetro será considerado do tipo int

15 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 15  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

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

17 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 17 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)

18 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 18  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

19 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 19 5.5 Definições de Funções /* Este programa lê nome e notas de alunos e determina a média da turma e o melhor aluno */ #include void lerdados(); /* protóitipo da função */ char nome[20]=""; float nota; int main() { char melhor_aluno[20]=""; int contador; float media, melhor_nota, soma; /* INICIALIZACAO */ soma = 0; contador = 0; lerdados(); /* chamada da função */ /* PROCESSAMENTO */ melhor_nota = nota; strcpy(melhor_aluno, nome); while (nota != -1) {soma = soma+nota; contador = contador + 1; lerdados(); /* chamada da função */ if (nota > melhor_nota) {melhor_nota = nota; strcpy(melhor_aluno, nome); } /* FINALIZACAO */ if (contador != 0) {media = soma / contador; printf("\nA media da turma e: %.2f\n", media); printf("O melhor aluno eh: %s", melhor_aluno); printf(" com a nota %.2f", melhor_nota); } else printf("\nNenhum aluno digitado."); getch(); return 0; } void lerdados() { printf("Digite o nome do proximo aluno: "); scanf("%s", &nome); printf("\nDigite a nota deste aluno: "); scanf("%f", &nota); return; }

20 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 20 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 função principal  Função com o protótipo int maximo(int, int, int);  Recebimento de 3 parâmetros int  Retorno de 1 dado int

21 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 21 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)); sqrt(4)  Resultado gerado  Cálculo correto de sqrt(4) e impressão do valor 2.000

22 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 22 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)

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

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

25 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 25 5.7 Arquivos-Cabeçalhos /* Programa que forma várias palavras de tamanho variável a partir de letras digitadas */ #include char palavra[20]; #include "form_pala.h" main() { int tamanho; /* inicialização */ printf("\nDigite o tamanho da primeira palavra \n"); scanf("%d", &tamanho); /* Processamento */ do { formapalavra(tamanho); resultado(); printf("\nDigite o tamanho da proxima palavra \n"); scanf("%d", &tamanho); } while (tamanho!=0); /* Finalizaçao */ return 0; }

26 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 26 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

27 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 27 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

28 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 28 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

29 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 29 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 0 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

30 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 30  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 program foi compilado (em segundos)  “Aleatorização" da semente 5.9 Geração de Números Aleatórios

31 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 31 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

32 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 32 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

33 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 33 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

34 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 34 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 \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

35 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 35 5.11 Classes de Armazenamento  IDENTIFICADORES  variáveis  Possuem um nome, um tipo e um valor  funções  Possuem nome, tipo, valor e parâmetros  IDENTIFICADORES também possuem  Classes de armazenamento, tempo de validade, escopo e ligação.

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

37 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 37 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;

38 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 38 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

39 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 39 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.)

40 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 40  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

41 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 41 5.8Variáveis globais  Acesso a partir de qualquer função  Declarar antes do main()  Exemplo: #include... void lerdados(); /* protótipo da função */ float nota; /* variável global */ main() { float melhor_nota;.. melhor_nota = nota;.. } void lerdados() /* função */ {... scanf(("%s", &nota);... }

42 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 42 5.8Variáveis globais #include void lerdados(); char nome[20]=""; float nota; int main() { char melhor_aluno[20]=""; int contador; float media, melhor_nota, soma; /* Inicialização */ soma = 0; contador = 0; lerdados(); /* chamada da função */ /* Processamento */ melhor_nota = nota; strcpy(melhor_aluno, nome); while (nota != -1) {soma = soma+nota; contador = contador + 1; lerdados(); /* chamada da função */  if (nota > melhor_nota) {melhor_nota = nota; strcpy(melhor_aluno, nome); } /* Finalização */ if (contador != 0) {media = soma / contador; printf("\nA media da turma e: \n%.2f", media); printf("O melhor aluno eh: %s", melhor_aluno); printf(" com a nota %.2f", melhor_nota); } else printf("\nNenhum aluno digitado."); return 0; } void lerdados() { printf("Digite o nome do proximo aluno: "); scanf("%s", &nome); printf("\nDigite a nota deste aluno: "); scanf("%f", &nota); return; }

43 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 43 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}

44 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 44 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}

45 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 45 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

46 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 46 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

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

48 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 48  Exemplo  Fatoriais  5! = 5 * 4 * 3 * 2 * 1 e 4! = 3 * 2 * 1  Importante observar que  5! = 5 * 4!  4! = 4 * 3!...  Possibilidade de computação recursiva de fatoriais 1!=0!=1  Solução do caso básico ( 1!=0!=1 ) e extensão para  n! = n * (n-1)! Para todo n > 1 5.13 Recursividade

49 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 49 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( 0 ) = 0 e fib( 1 ) = 1  fib( n ) = fib( n - 1 ) + fib( n – 2 ), para todo n>1 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); }

50 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 50 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)

51 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 51 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}

52 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 52 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

53 rangel@dsc.ufpb.br rangel@lmrs-semarh.ufpb.br DSC/CCT/UFCG 53 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

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

55 rangel@dsc.ufpb.br DSC/CCT/UFCG 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 Carga Horária:60 h."

Apresentações semelhantes


Anúncios Google