Вы находитесь на странице: 1из 31

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

Procedimentos Material traduzido e adaptado de: [1] How to program, 3rd edition 2001, Deitel & Deitel

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

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

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

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

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

e scanf)  Possibilita o desenvolvimento de código de forma independente  Proporciona uma camada de

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)

em C são formados por:  funções predefinidas da linguagem C  funções definidas por usuários

Funções

Você já utilizou funções predefinidas de C:

main()

printf(), scanf(), pow()

Funções definidas pelo usuário

Nosso próprio código

Também pode utilizar as funções predefinidas

 Funções definidas pelo usuário • Nosso próprio código • Também pode utilizar as funções predefinidas

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

• Proporcione uma função e argumentos • A função executa operações • A função retorna resultados

o Analogia:

Funções

O chefe chama um funcionário para executar uma tarefa

O funcionario recebe as informações necessárias,

executa o trabalho e retorna os resultados Ocultamento de informações: O chefe não conhece os detalhes do trabalho executado pelo funcionário.

resultados • Ocultamento de informações: O chefe não conhece os detalhes do trabalho executado pelo funcionário.

Funções Visão Matemática

 f x ( )  x 2  2 x  3
f x
(
)
x
2 
2
x
3

Qual o resultado paraf(2)?

f (2)

(2)

2

2(2)

3

 

f (2) é11

4

  

4

3

11

argumento

função

Valor

retornado

2
2

f ( x )

11
11
2  2(2) 3    f (2) é11 4    4 3

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

que as definiu  Parâmetros • Permitem o envio de informações de uma função para outra

Funções - Estrutura

o

o

type function_name ( type arg1, type arg2 ) { }

type function_name (type arg1, type arg2 )

{

}

statements; double product(double x, double y)
statements;
double product(double x, double y)

Uma função para calcular o produto de 2 números

{

 

double result;

result = x * y; return result;

}

Cabeçalho da função

Tipo de retorno

result; } Cabeçalho da função  Tipo de retorno (se existir)  Nome • Descritivo 

(se existir)

Nome

Descritivo

Argumentos (ou lista de parâmetros)

Obs: tipo de dado e nome

Comandos

Declaração de Variáveis

Operações

Valor de retorno (se existir)

• Obs: tipo de dado e nome Comandos  Declaração de Variáveis  Operações  Valor

Tipos de Funções

o Funções que retornam valor

Usar um tipo de dado como tipo de retorno

int sum( arg_list,…)

float sum( arg_list,…)

char sum( arg_list,…)

Usar o retorno de valor no corpo de função

return valor;

Seu resultado é utilizado na função chamadora

X = sum(… );

de valor no corpo de função • return valor;  Seu resultado é utilizado na função

Tipos de Funções

o Funções que não retornam valor

Usar o tipo de retorno void

void sum( arg_list,…)

Na literatura também são conhecidas como procedimento (procedure)

de retorno void • void sum( arg_list ,…)  Na literatura também são conhecidas como procedimento

o

o

o

o

Protótipo da função

#include <stdio.h> /* function prototype */ double product(double x, double y);

int main()

*/ double product( double x, double y); int main() double var1 = 3.0, var2 = 5.0;

double var1 = 3.0, var2 = 5.0; double ans;

ans = product(var1, var2);

printf("var1 = %.2f\n" "var2 = %.2f\n",var1,var2); printf("var1*var2 = %g\n", ans);

/* function definition */ double product(double x, double y)

double result; result = x * y; return result;

}

y) double result; result = x * y; return result; }  Como a declaração de

Como a declaração de uma variável

Avisa ao compilador que a função será definida depois

Observar o “;” !!

a função será definida depois • Observar o “;” !! Definição da função { } {

Definição da funçã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 ;

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

chamada'  O Controle é transferido para a função chamada  O código da função chamada

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

não sofre alteração  Usado quando não se tem necessidade de modificar o valor de um

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

realizadas dentro da função, alteram a informação original • Alterações repercutem no documento original

Exemplo de Chamada de Função

Execução da função

#include<stdio.h>

#include<stdlib.h>

void por_valor(int a){

a = a + 2; printf("por valor a= : %d \n", a);

}

void por_referencia(int * a){

*a = *a + 2; printf("por referencia a= : %d \n", *a);

}

int main(){ int a = 10;

printf("Valor de a original: %d \n", a);

por_valor(a); printf("a nao foi alterado: %d \n", a); por_referencia(&a); printf("a foi alterado: %d \n", a);

}

RAM

100

101

102

103

104

105

106

107

108

109

110

111

Exemplo de execução da

chamada por VALOR!

Exemplo de execução da chamada por VALOR!

Exemplo de Chamada de Função

Execução da função

#include<stdio.h>

#include<stdlib.h>

void por_valor(int a){

a = a + 2; printf("por valor a= : %d \n", a);

}

void por_referencia(int * a){

*a = *a + 2; printf("por referencia a= : %d \n", *a);

}

int main(){ int a = 10;

printf("Valor de a original: %d \n", a);

por_valor(a); printf("a nao foi alterado: %d \n", a); por_referencia(&a); printf("a foi alterado: %d \n", a);

}

printf("a foi alterado: %d \n", a); } RAM     100   101   102

RAM

   

100

 

101

 

102

 

103

 

104

 

105

 

106

a

10

107

 

108

 

109

 

110

 

111

Exemplo de Chamada de Função

Execução da função

#include<stdio.h>

#include<stdlib.h>

void por_valor(int a){

a = a + 2; printf("por valor a= : %d \n", a);

}

void por_referencia(int * a){

*a = *a + 2; printf("por referencia a= : %d \n", *a);

}

int main(){ int a = 10;

printf("Valor de a original: %d \n", a);

por_valor(a); printf("a nao foi alterado: %d \n", a); por_referencia(&a); printf("a foi alterado: %d \n", a);

}

printf("a foi alterado: %d \n", a); } RAM     100   101   102

RAM

   

100

 

101

 

102

 

103

 

104

 

105

 

106

a

10

107

 

108

 

109

 

110

 

111

Exemplo de Chamada de Função

Execução da função

#include<stdio.h>

#include<stdlib.h>

void por_valor(int a){

void por_valor(int a){

a = a + 2;

a = a + 2;

printf("por valor a= : %d \n", a);

printf("por valor a= : %d \n", a);

}

}

void por_referencia(int * a){

*a = *a + 2; printf("por referencia a= : %d \n", *a);

}

int main(){

int a = 10;

printf("Valor de a original: %d \n", a);

por_valor(a); printf("a nao foi alterado: %d \n", a); por_referencia(&a); printf("a foi alterado: %d \n", a);

}

printf("a foi alterado: %d \n", a); } a RAM a 10 100   101   102
printf("a foi alterado: %d \n", a); } a RAM a 10 100   101   102

a

RAM

a

10

100

 

101

 

102

 

103

 

104

 

105

 

106

10

107

 

108

 

109

 

110

 

111

Exemplo de Chamada de Função

Execução da função

#include<stdio.h>

#include<stdlib.h>

void por_valor(int a){

void por_valor(int a){

a = a + 2;

a = a + 2;

printf("por valor a= : %d \n", a);

printf("por valor a= : %d \n", a);

}

}

void por_referencia(int * a){

*a = *a + 2; printf("por referencia a= : %d \n", *a);

}

int main(){

int a = 10;

printf("Valor de a original: %d \n", a);

por_valor(a); printf("a nao foi alterado: %d \n", a); por_referencia(&a); printf("a foi alterado: %d \n", a);

}

printf("a foi alterado: %d \n", a); } a RAM a 12 100   101   102
printf("a foi alterado: %d \n", a); } a RAM a 12 100   101   102

a

RAM

a

12

100

 

101

 

102

 

103

 

104

 

105

 

106

10

107

 

108

 

109

 

110

 

111

Exemplo de Chamada de Função

Execução da função

#include<stdio.h>

#include<stdlib.h>

void por_valor(int a){

a = a + 2; printf("por valor a= : %d \n", a);

}

void por_referencia(int * a){

*a = *a + 2; printf("por referencia a= : %d \n", *a);

}

int main(){

int a = 10;

printf("Valor de a original: %d \n", a);

por_valor(a); printf("a nao foi alterado: %d \n", a); por_referencia(&a); printf("a foi alterado: %d \n", a);

}

RAM

a 12 100 101 Variável a da função main 102 se mantém inalterada!!!! Essa é
a
12
100
101
Variável a da função main
102
se mantém inalterada!!!!
Essa é a chamada por
103
VALOR!!! Apenas o valor
104
da variável é passado para
105
o parâmetro da função
106
a
10
107
108
109
110
111

Exemplo de execução da

chamada por REFERÊNCIA!

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

Exemplo de Chamada de Função

Execução da função

#include<stdio.h>

#include<stdlib.h>

void por_valor(int a){

a = a + 2; printf("por valor a= : %d \n", a);

}

void por_referencia(int * a){

*a = *a + 2; printf("por referencia a= : %d \n", *a);

}

int main(){ int a = 10;

printf("Valor de a original: %d \n", a);

por_valor(a); printf("a nao foi alterado: %d \n", a); por_referencia(&a); printf("a foi alterado: %d \n", a);

}

printf("a foi alterado: %d \n", a); } RAM     100   101   102

RAM

   

100

 

101

 

102

 

103

 

104

 

105

 

106

a

10

107

 

108

 

109

 

110

 

111

Exemplo de Chamada de Função

Na passagem por referência, o parâmetro da RAM função recebe o endereço de memória e
Na passagem por referência, o
parâmetro da RAM função recebe o
endereço de memória e não o
100
valor!
101
a
102
103
104
105
106
a
10 107
108
109
110
111

Execução da função

O operador *, quando usado na declaração de uma variável indica que esta variável é
O operador *, quando usado
na declaração de uma
variável indica que esta
variável é um ponteiro!

#include<stdio.h>

#include<stdlib.h>

void por_valor(int a){

a = a + 2;

printf("por valor a= : %d \n", a);

}

void por_referencia(int * a){

void por_referencia(int * a){

*a = *a + 2;

}

}

int main(){ int a = 10;

*a = *a + 2;

printf("por referencia a= : %d \n", *a);

printf("Valor de a original: %d \n", a);

por_valor(a); printf("a nao foi alterado: %d \n", a); por_referencia(&a); printf("a foi alterado: %d \n", a);

}

printf("por referencia a= : %d \n", *a);

por_referencia(&a); printf("a foi alterado: %d \n", a); } printf("por referencia a= : %d \n", *a);

Exemplo de Chamada de Função

Na passagem por referência, o parâmetro da RAM função recebe o endereço de memória e
Na passagem por referência, o
parâmetro da RAM função recebe o
endereço de memória e não o
100
valor!
101
a
107 102
103
104
105
106
a
10 107
108
109
110
111

Execução da função

#include<stdio.h>

#include<stdlib.h>

void por_valor(int a){

a = a + 2; printf("por valor a= : %d \n", a);

}

void por_referencia(int * a){

void por_referencia(int * a){

*a = *a + 2;

}

}

int main(){ int a = 10;

*a = *a + 2;

printf("por referencia a= : %d \n", *a);

printf("Valor de a original: %d \n", a);

por_valor(a); printf("a nao foi alterado: %d \n", a); por_referencia(&a); printf("a foi alterado: %d \n", a);

}

por_referencia(&a); printf("a foi alterado: %d \n", a); } printf("por referencia a= : %d \n", *a);

printf("por referencia a= : %d \n", *a);

por_referencia(&a); printf("a foi alterado: %d \n", a); } printf("por referencia a= : %d \n", *a);

Exemplo de Chamada de Função

Na passagem por referência, o parâmetro da RAM função recebe o endereço de memória e
Na passagem por referência, o
parâmetro da RAM função recebe o
endereço de memória e não o
100
valor!
101
a
107 102
103
104
105
106
a
10 107
108
109
110
111

Execução da função

#include<stdio.h> O operador *, quando usado a #include<stdlib.h> frente de um ponteiro, indica void
#include<stdio.h>
O operador *, quando usado a
#include<stdlib.h>
frente de um ponteiro, indica
void por_valor(int a){
que a operação deve ser
a = a + 2;
realizada no endereço de
}

printf("por valor a= : %d \n", a);

memória apontado! void por_referencia(int * a){

void por_referencia(int * a){

*a = *a + 2;

*a = *a + 2;

printf("por referencia a= : %d \n", *a);

}

}

int main(){ int a = 10;

printf("Valor de a original: %d \n", a);

por_valor(a); printf("a nao foi alterado: %d \n", a); por_referencia(&a); printf("a foi alterado: %d \n", a);

}

por_referencia(&a); printf("a foi alterado: %d \n", a); } printf("por referencia a= : %d \n", *a);

printf("por referencia a= : %d \n", *a);

por_referencia(&a); printf("a foi alterado: %d \n", a); } printf("por referencia a= : %d \n", *a);

Exemplo de Chamada de Função

Na passagem por referência, o parâmetro da RAM função recebe o endereço de memória e
Na passagem por referência, o
parâmetro da RAM função recebe o
endereço de memória e não o
100
valor!
101
a
107 102
103
104
105
106
a
10 107
108
109
110
111

Execução da função

#include<stdio.h>

#include<stdlib.h>

void por_valor(int a){ Esta operação vai alterar o a = a + 2; conteúdo da
void por_valor(int a){
Esta operação vai alterar o
a = a + 2;
conteúdo da posição 107 de
}

printf("por valor a= : %d \n", a);

memória void por_referencia(int * a){

void por_referencia(int * a){

*a = *a + 2;

}

}

int main(){ int a = 10;

*a = *a + 2;

printf("por referencia a= : %d \n", *a);

printf("Valor de a original: %d \n", a);

por_valor(a); printf("a nao foi alterado: %d \n", a); por_referencia(&a); printf("a foi alterado: %d \n", a);

}

por_referencia(&a); printf("a foi alterado: %d \n", a); } printf("por referencia a= : %d \n", *a);

printf("por referencia a= : %d \n", *a);

por_referencia(&a); printf("a foi alterado: %d \n", a); } printf("por referencia a= : %d \n", *a);

Exemplo de Chamada de Função

Na passagem por referência, o parâmetro da RAM função recebe o endereço de memória e
Na passagem por referência, o
parâmetro da RAM função recebe o
endereço de memória e não o
100
valor!
101
a
107 102
103
104
105
106
a
12 107
108
109
110
111

Execução da função

#include<stdio.h>

#include<stdlib.h>

void por_valor(int a){

a = a + 2; printf("por valor a= : %d \n", a);

}

void por_referencia(int * a){

void por_referencia(int * a){

*a = *a + 2;

}

}

int main(){ int a = 10;

*a = *a + 2;

printf("por referencia a= : %d \n", *a);

printf("Valor de a original: %d \n", a);

por_valor(a); printf("a nao foi alterado: %d \n", a); por_referencia(&a); printf("a foi alterado: %d \n", a);

}

por_referencia(&a); printf("a foi alterado: %d \n", a); } printf("por referencia a= : %d \n", *a);

printf("por referencia a= : %d \n", *a);

por_referencia(&a); printf("a foi alterado: %d \n", a); } printf("por referencia a= : %d \n", *a);

Referências

o How to program, 3rd edition 2001, Deitel &

Deitel o E BJ Furman o Ascencio, Ana Fernanda Gomes e Campos, Edilene Aparecida Veneruchi de. Fundamentos da Programação de Computadores Algoritmos, Pascal, C/C++. São Paulo: Prentice Hall, 2002.

o Ascencio, Ana Fernanda Gomes e Campos,

Edilene Aparecida Veneruchi de. Fundamentos da Programação de Computadores C/C++ e Java. São Paulo: Prentice Hall, 2ª Ed., 2007.

Veneruchi de. Fundamentos da Programação de Computadores – C/C++ e Java. São Paulo: Prentice Hall, 2ª