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

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

Introdução à Programação

Apresentações semelhantes


Apresentação em tema: "Introdução à Programação"— Transcrição da apresentação:

1 Introdução à Programação
Capítulo 5 Funções Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel Carga Horária: 60 h

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

3 Introdução à Programação
Tópicos 5.11 Classes de Armazenamento 5.12 Regras de Escopo 5.13 Recursividade 5.14 Exemplo de Recursividade: Série de Fibonacci 5.15 Recursividade vs. Iteração

4 5.1 Introdução 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 5.2 Módulos de Programas em 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

6 5.2 Módulos de Programas em C
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

7 5.2 Módulos de Programas em C
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)

8 5.3 Biblioteca de Funções Matemáticas
Execução de cálculos matemáticos comuns #include <math.h> 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

9 5.3 Biblioteca de Funções Matemáticas
Formato para a chamada de funções printf( "%.2f", sqrt( ) ); 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

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

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

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  Qualquer identificador válido

13 5.5 Definições de Funções Formato de Definição de uma Função
Lista_de_Parâmetros  Declaração de uma série de parametros Um tipo deve ser listado explicitamente para cada parâmetro, caso contrário o parâmetro será considerado do tipo int

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

15 5.5 Definições de Funções Formato de Definição de uma Função
Retorno do Controle Quando não há retorno return; Se algo for retornado return expression;

16 5.5 Definições de Funções Função Principal (Programa Principal)
01 /* Determinação do máximo de três inteiros */ 02 #include <stdio.h> 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 }

17 5.5 Definições de Funções Função Máximo
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: Maximo eh: 85

18 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 <stdio.h> #include <string.h> #include <conio.h> void lerdados(); 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; } /* 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;

19 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

20 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)); Resultado gerado  Cálculo correto de sqrt(4) e impressão do valor 2.000

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

22 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. <stdlib.h> , <math.h> , <conio.h> Necessidade de inclusão da(s) linha(s) #include <nome_do_arquivo> #include <math.h>

23 5.7 Arquivos-Cabeçalhos Arquivos-Cabeçalhos Customizados
Criação de arquivos com funções Salvamento <nome_do_arquivo.h> Inclusão em outros arquivos #include “nome_do_arquivo.h” Reuso das funções

24 5.7 Arquivos-Cabeçalhos void formapal(int n) { char letra[1], palavra[20]; int cont; /* inicializa‡ao */ strcpy(palavra,""); /* Processamento */ for(cont=1;cont<=n;cont++) printf("Digite uma letra minusculas: "); scanf("%s", &letra); strcat(palavra, letra); } /* Finaliza‡ao */ printf("\nA palavra e:** %s**\n ", palavra); return; /* Programa que forma várias palavras de tamanho variável a partir de letras digitadas */ #include <stdio.h> #include <string.h> #include "formapal.h" main() { int tamanho; /* inicializa‡ao */ printf("\nDigite o tamanho da primeira palavra \n"); scanf("%d", &tamanho); /* Processamento */ do { formapal(tamanho); printf("\nDigite o tamanho da proxima palavra \n"); } while (tamanho!=0); /* Finaliza‡ao */ return 0;

25 5.8 Chamada 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

26 5.8 Chamada 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

27 5.9 Geração de Números Aleatórios
Função rand Inclusão de <stdlib.h> 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

28 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

29 5.9 Geração de Números Aleatórios
Função srand Inclusão de <stdlib.h> 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.h> time( NULL ) Retorno do tempo no qual o program foi compilado (em segundos) “Aleatorização" da semente

30 5.9 Geração de Números Aleatórios
01 Programa para randomização no lançamento de um dado */ 02 #include <stdlib.h> 03 #include <stdio.h> 04 05 int main() 06 { 07 int i; 08 unsigned semente; Digite a semente: 67 09 10 printf( “Digite a semente: " ); 11 scanf( "%u", &semente ); 12 srand(semente); 13 for ( i = 1; i <= 10; i++ ) { printf( "%10d", 1 + ( rand() % 6 ) ); if ( i % 5 == 0 ) printf( "\n" ); Digite a semente: 867 17 } 18 return 0; 19 }

31 5.10 Exemplo: 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

32 5.10 Exemplo: Jogo de Azar 01 /* Simulador de Craps */
02 #include <stdio.h> 03 #include <stdlib.h> 04 #include <time.h> 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 ) { case 7: case 11: /* ganha na primeira rodada */ placar = 1; break; case 2: case 3: case 12: /* perde na primeira rodada */ placar = 2; break; default: /* armazena ponto */ placar = 0; ponto = soma; printf( “O total de pontos eh %d\n", ponto ); break; 26 } 27 while (placar == 0) { /* continua jogando */ soma = rola_dados();

33 5.10 Exemplo: 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 } O jogador lançou = 4 O total de pontos eh 4 O jogador lançou = 5 O jogador lançou = 9 O jogador lançou = 10 O jogador lançou = 9 O jogador lançou = 3 O jogador lançou = 7 O jogador perdeu O jogador lançou = 10 O total de pontos eh 10 O jogador lançou = 6 O jogador lançou = 11 O jogador lançou = 6 O jogador lançou = 10 O jogador venceu 35 if (placar == 1) printf( “O jogador venceu\n" ); 37 else 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 = 12 O jogador perdeu O jogador lançou = 11 O jogador venceu

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

35 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 objeto pode ser referenciado no programa Linkage (ligação)  Especificação dos arquivos nos quais um identificador é conhecido

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

37 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

38 5.12 Regras de Escopo Escopo de Arquivo Escopo de Função
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.)

39 5.12 Regras de Escopo Escopo de Bloco Escopo de Protótipo de Função
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

40 5.8 Variá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); ...

41 5.8 Variáveis globais #include <stdio.h>
#include <string.h> 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;

42 5.12 Regras de Escopo 01 /* Exemplo de escopo */
02 #include <stdio.h> 03 void a(void); /* protótipo da função a */ 04 void b(void); /* protótipo da função b */ 05 void c(void); /* protótipo da função c */ 06 int x = 1; /* variável global */ 07 int 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 */ 12 int x = 7; 13 printf( “x local no escopo interno de main é %d\n", x ); 14 } /* término do novo escopo */ 15 printf( “x local no escopo externo de main é %d\n", x ); 16 a(); /* a contém x local automática */ 17 b(); /* b contém x local estática*/ 18 c(); /* c usa x global */ 19 a(); /* a reinicializa x local automática */ 20 b(); /* x local estática mantém seu valor anterior */ 21 c(); /* x global também mantém seu valor */ 22 printf( “x local em main é %d\n", x ); 23 return 0; 24 }

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

44 5.12 Regras de Escopo x local no escopo externo de main é 5
x local no escopo interno de main é 7 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 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

45 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

46 5.13 Recursividade Funções Recursivas
Caso básico eventualmente solucionado Extensão, processamento e solução do problema como um todo

47 5.13 Recursividade Exemplo Fatoriais 5! = 5 * 4 * 3 * 2 * 1
Importante observar que 5! = 5 * 4! 4! = 4 * 3! ... Possibilidade de computação recursiva de factoriais 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;

48 5.14 Exemplo de Uso de Recursividade: Série de Fibonacci
Cada número é a soma dos dois anteriores Possibilidade de solução recursiva fib( n ) = fib( n - 1 ) + fib( n – 2 ) 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); }

49 5.14 Exemplo de Uso de Recursividade: Série de Fibonacci
Série de chamadas recursivas à função fibonacci f(3) return f(2) + f(1) return f(1) + f(0) return 1 return 1 return 0

50 5.14 Exemplo de Uso de Recursividade: Série de Fibonacci
01 /* Função recursiva da Série de Fibonacci */ 02 #include <stdio.h> 03 04 long fibonacci(long); 05 int 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 */ 16 long fibonacci(long n) 17 { 18 if (n == 0 || n == 1) return n; 20 else return fibonacci(n - 1) + fibonacci(n - 2); 22 }

51 5.14 Exemplo de Uso de Recursividade: Série de Fibonacci
Exemplo de Saída 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) =

52 5.15 Recursividade 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

53 5.15 Recursividade vs. Iteração
Ponto de Equilíbrio Ponderação entre desempenho (iteração) e qualidade da engenharia de software (recursividade )

54 José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria
Ulrich Schiel UNIVERSIDADE FEDERAL DE CAMPINA GRANDE CENTRO DE CIÊNCIAS E TECNOLOGIA DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO


Carregar ppt "Introdução à Programação"

Apresentações semelhantes


Anúncios Google