Algoritmos e Programação

Funções e Procedimentos
Material traduzido e adaptado de:
[1] How to program, 3rd edition 2001, Deitel & Deitel
[2] E BJ Furman

Introdução
o Dividir e Conquistar
Construção de programas em pequenas partes /

componentes
Estas partes são chamadas de módulos
Cada parte é mais gerenciável do que o programa
original

Programação Modular
o Dividir um programa em partes menores
Modulos, Subrotinas, Procedimentos, Funções

o O que motiva a modularização?
Ajuda a tratar a complexidade
• Blocos menores de código
• Mais fáceis de ler

Programação Modular Estimula o reuso de código • Em um único programa ou em vários (Ex: printf e scanf) Possibilita o desenvolvimento de código de forma independente Proporciona uma camada de abstração .

Modularização em C o Funções São os alicerces da linguagem C o Programas em C são formados por: funções predefinidas da linguagem C funções definidas por usuários (programadores) .

pow() Funções definidas pelo usuário • Nosso próprio código • Também pode utilizar as funções predefinidas .Funções Você já utilizou funções predefinidas de C: • main() • printf(). scanf().

Funções o Chamada de Funções Invocando funções • Proporcione uma função e argumentos • A função executa operações • A função retorna resultados .

executa o trabalho e retorna os resultados • Ocultamento de informações: O chefe não conhece os detalhes do trabalho executado pelo funcionário.Funções o Analogia: O chefe chama um funcionário para executar uma tarefa • O funcionario recebe as informações necessárias. .

Funções – Visão Matemática  f ( x)  x 2  2 x  3 Qual o resultado para f(2)? f (2)  (2) 2  2(2)  3  4  4  3  11  f (2) é 11 argumento 2 função f ( x) Valor retornado 11 .

Funções – Visão da Computação o Funções Todas as variáveis declaradas em uma função são variáveis locais • São conhecidas apenas pela função que as definiu Parâmetros • Permitem o envio de informações de uma função para outra • Variáveis locais .

Estrutura o Cabeçalho da função  Tipo de retorno (se existir)  Nome type function_name (type arg1. double y) { double result. } • Descritivo  Argumentos (ou lista de parâmetros) • Obs: tipo de dado e nome o Comandos  Declaração de Variáveis  Operações  Valor de retorno (se Uma função para calcular o produto de 2 números double product(double x. return result.Funções . result = x * y. type arg2 ) { statements. existir) } .

Seu resultado é utilizado na função chamadora • X = sum(…..).…) Usar o retorno de valor no corpo de função • return valor. .…) • char sum( arg_list.…) • float sum( arg_list.Tipos de Funções o Funções que retornam valor Usar um tipo de dado como tipo de retorno • int sum( arg_list.

…) Na literatura também são conhecidas como procedimento (procedure) .Tipos de Funções o Funções que não retornam valor Usar o tipo de retorno void • void sum( arg_list.

} /* function definition */ double product(double x.h> /* function prototype */ double product(double x. ans = product(var1. ans). printf("var1 = %. var2 = 5. double y).0. int main() { double var1 = 3. return result.0. } . double ans.” !! o Definição da função o Retorno da função  O comando return termina a execução de uma função  Controle retorna para a função chamadora  se return expression. var2).o Protótipo da função  Como a declaração de uma variável • Avisa ao compilador que a função será definida depois • Observar o “.var2).2f\n". result = x * y. printf("var1*var2 = %g\n".2f\n" "var2 = %. double y) { double result.var1. • • o O valor da expressão é retornado como o valor retornado pela função Somente um valor pode ser retornado dessa forma Chamada a função  main() é a ‘função chamadora’  product() é a ‘função chamada'  O Controle é transferido para a função chamada  O código da função chamada é então executado #include <stdio.

Chamada de Funções o Chamada por Valor Cópia da informação é passada para a função • Como a cópia de um documento Mudanças realizadas nos argumentos dentro da função não alteram o valor original • Se alterar a cópia do documento. o documento original não sofre alteração Usado quando não se tem necessidade de modificar o valor de um argumanto dentro da função .

Chamada de Funções o Chamada por referência Passa a informação original para a função • Como se o documento original fosse encaminhado Mudanças realizadas dentro da função. alteram a informação original • Alterações repercutem no documento original .

} void por_referencia(int * a){ *a = *a + 2. printf("por referencia a= : %d \n". } RAM 100 101 102 103 104 105 106 107 108 109 110 111 . por_valor(a). a).h> void por_valor(int a){ a = a + 2.h> #include<stdlib. printf("por valor a= : %d \n". a). printf("a foi alterado: %d \n". por_referencia(&a). printf("Valor de a original: %d \n". printf("a nao foi alterado: %d \n". a). a).Exemplo de Chamada de Função Execução da função #include<stdio. *a). } int main(){ int a = 10.

Exemplo de execução da chamada por VALOR! .

a). printf("por referencia a= : %d \n".h> void por_valor(int a){ a = a + 2. *a). por_valor(a). printf("Valor de a original: %d \n". a). a). por_referencia(&a). } int main(){ int a = 10. } void por_referencia(int * a){ *a = *a + 2. printf("a nao foi alterado: %d \n". printf("a foi alterado: %d \n".h> #include<stdlib. printf("por valor a= : %d \n". } 100 101 102 103 104 105 106 a 10 107 108 109 110 111 . a).Exemplo de Chamada de Função Execução da função RAM #include<stdio.

printf("a foi alterado: %d \n". a). *a). por_valor(a).h> void por_valor(int a){ a = a + 2. printf("a nao foi alterado: %d \n". } int main(){ int a = 10. } void por_referencia(int * a){ *a = *a + 2.h> #include<stdlib. printf("por valor a= : %d \n". a). printf("Valor de a original: %d \n". por_referencia(&a).Exemplo de Chamada de Função Execução da função RAM #include<stdio. printf("por referencia a= : %d \n". } 100 101 102 103 104 105 106 a 10 107 108 109 110 111 . a). a).

printf("por valor a= : %d \n". printf("por valor a= : %d \n". por_valor(a). printf("a nao foi alterado: %d \n".h> #include<stdlib. por_referencia(&a). printf("Valor de a original: %d \n". } int main(){ int a = 10. a = a + 2. printf("a foi alterado: %d \n". printf("por referencia a= : %d \n". a). a). a). a).h> void por_valor(int a){ void por_valor(int a){ a = a + 2. a). } a RAM 10 101 102 103 } void por_referencia(int * a){ *a = *a + 2. *a). } 100 104 105 106 a 10 107 108 109 110 111 .Exemplo de Chamada de Função Execução da função #include<stdio.

*a).Exemplo de Chamada de Função Execução da função #include<stdio. a). printf("por valor a= : %d \n". } 100 104 105 106 a 10 107 108 109 110 111 . a). printf("por valor a= : %d \n".h> #include<stdlib. por_valor(a). a).h> void por_valor(int a){ void por_valor(int a){ a = a + 2. printf("a nao foi alterado: %d \n". printf("por referencia a= : %d \n". printf("a foi alterado: %d \n". a). } int main(){ int a = 10. por_referencia(&a). a = a + 2. } a RAM 12 101 102 103 } void por_referencia(int * a){ *a = *a + 2. a). printf("Valor de a original: %d \n".

a). printf("Valor de a original: %d \n". a).Exemplo de Chamada de Função Execução da função #include<stdio. } int main(){ int a = 10. a).h> #include<stdlib. por_valor(a). printf("por referencia a= : %d \n". printf("a foi alterado: %d \n". por_referencia(&a). a). printf("por valor a= : %d \n".h> void por_valor(int a){ a = a + 2. printf("a nao foi alterado: %d \n". } void por_referencia(int * a){ *a = *a + 2. *a). } a RAM 12 100 101 Variável a da função main 102 se mantém inalterada!!!! 103por Essa é a chamada VALOR!!! Apenas104 o valor da variável é passado para o parâmetro da105 função 106 a 10 107 108 109 110 111 .

Exemplo de execução da chamada por REFERÊNCIA! .

*a). } 100 101 102 103 104 105 106 a 10 107 108 109 110 111 . por_valor(a). printf("por referencia a= : %d \n".Exemplo de Chamada de Função Execução da função RAM #include<stdio.h> void por_valor(int a){ a = a + 2. a). a). } int main(){ int a = 10.h> #include<stdlib. printf("por valor a= : %d \n". printf("a foi alterado: %d \n". a). } void por_referencia(int * a){ *a = *a + 2. printf("Valor de a original: %d \n". printf("a nao foi alterado: %d \n". a). por_referencia(&a).

por_valor(a). variável um ponteiro! printf("por valor a= : %d é\n". } Na passagem por referência. o parâmetro da função recebe o RAM endereço de memória 100e não o valor! 101 a 102 103 void por_referencia(int * a){ void *a por_referencia(int * a){ = *a + 2.Exemplo de Chamada de Função Execução da função #include<stdio. printf("a foi alterado: %d \n".h> O operador *. a). referencia a= : %d \n". } } int main(){ int a = 10. printf("por printf("por referencia a= : %d \n". a). } 104 105 106 a 10 107 108 109 110 111 . printf("Valor de a original: %d \n". *a).h> na declaração de uma void por_valor(int a){ variável indica que esta a = a + 2. a). *a). *a = *a + 2. quando usado #include<stdlib. a). por_referencia(&a). printf("a nao foi alterado: %d \n".

printf("por valor a= : %d \n". o parâmetro da função recebe o RAM endereço de memória 100e não o valor! 101 a 107 103 void por_referencia(int * a){ void *a por_referencia(int * a){ = *a + 2. } Na passagem por referência. *a = *a + 2. por_referencia(&a). a). a). *a). printf("por printf("por referencia a= : %d \n". a). printf("a nao foi alterado: %d \n". *a). } 102 104 105 106 a 10 107 108 109 110 111 .h> void por_valor(int a){ a = a + 2. a). printf("Valor de a original: %d \n". por_valor(a). referencia a= : %d \n". } } int main(){ int a = 10. printf("a foi alterado: %d \n".Exemplo de Chamada de Função Execução da função #include<stdio.h> #include<stdlib.

quando usado a #include<stdlib. realizada no endereço de a= : %d \n". a). printf("a foi alterado: %d \n". a). por_valor(a). *a = *a + 2. referencia a= : %d \n". printf("Valor de a original: %d \n". a). por_referencia(&a).h> O operador *. a). indica void a){ que a operação deve ser a = a + 2. } } int main(){ int a = 10. printf("por valor memória apontado! } Na passagem por referência. printf("por printf("por referencia a= : %d \n".Exemplo de Chamada de Função Execução da função #include<stdio. o RAM parâmetro da função recebe o 100e não o endereço de memória valor! 101 a 107 103 void por_referencia(int * a){ void *a por_referencia(int * a){ = *a + 2. *a). } 102 104 105 106 a 10 107 108 109 110 111 . printf("a nao foi alterado: %d \n".h> frentepor_valor(int de um ponteiro. *a).

referencia a= : %d \n". *a = *a + 2.. printf("Valor de a original: %d \n". por_referencia(&a). } 102 104 105 106 a 10 107 108 109 110 111 . memória. *a).. printf("por printf("por referencia a= : %d \n". } Na passagem por referência. a). a). printf("a foi alterado: %d \n".vai alterar o conteúdo da posição 107 de printf("por valor a= : %d \n". por_valor(a). a).h> void por_valor(int a){ Esta a operação = a + 2. } } int main(){ int a = 10.. *a).h> #include<stdlib. o RAM parâmetro da função recebe o 100e não o endereço de memória valor! 101 a 107 103 void por_referencia(int * a){ void *a por_referencia(int * a){ = *a + 2. printf("a nao foi alterado: %d \n".Exemplo de Chamada de Função Execução da função #include<stdio. a).

a).Exemplo de Chamada de Função Execução da função #include<stdio.h> #include<stdlib. printf("por printf("por referencia a= : %d \n". a). *a). } 102 104 105 106 a 12 107 108 109 110 111 .h> void por_valor(int a){ a = a + 2. printf("a foi alterado: %d \n". por_valor(a). referencia a= : %d \n". *a = *a + 2. o RAM parâmetro da função recebe o 100e não o endereço de memória valor! 101 a 107 103 void por_referencia(int * a){ void *a por_referencia(int * a){ = *a + 2. } } int main(){ int a = 10. *a). a). por_referencia(&a). a). printf("a nao foi alterado: %d \n". printf("Valor de a original: %d \n". } Na passagem por referência. printf("por valor a= : %d \n".

2007. 3rd edition 2001. Edilene Aparecida Veneruchi de.. Pascal. São Paulo: Prentice Hall. C/C++.Referências o How to program. 2ª Ed. Deitel & Deitel o E BJ Furman o Ascencio. Ana Fernanda Gomes e Campos. Edilene Aparecida Veneruchi de. Fundamentos da Programação de Computadores – C/C++ e Java. . 2002. São Paulo: Prentice Hall. o Ascencio. Fundamentos da Programação de Computadores – Algoritmos. Ana Fernanda Gomes e Campos.