Você está na página 1de 14

BAC004: 5 - Funções Page 1 of 14

Site: BAC004 at http://bac004.wikidot.com


Source page: 5 - Funções at http://bac004.wikidot.com/funcoes

5 - Funções

Fold
Table of Contents
5.1 Funções Sem Passagem de Parâmetros e Sem Retorno
Exemplo 1
Chamada de função
Exemplo 2
Protótipo da Função
Exemplo 3
5.2 Funções Com Passagem de Parâmetros e Sem Retorno
Exemplo 1
Exemplo 2
5.3 Funções Sem Passagem de Parâmetros e Com Retorno
Exemplo
5.4 Funções Com Passagem de Parâmetros e Com Retorno
Exemplo
5.5 Passagem de Parâmetros Por Valor e Por Referência
Passagem de Parâmetro Por Valor
Passagem de Parâmetro Por Referência
Exemplo 1
Exemplo 2
5.6 Funções Predefinidas
Exemplo 1
Exemplo 2
5.7 Exercícios

Modularização é o mecanismo para se dividir um programa em módulos. Um módulo é um


trecho de programa que possui seus próprios objetos (variáveis, constantes, tipos) e que
realizam uma tarefa específica. Para ser executado, um módulo precisa ser ativado pelo
programa principal ou por um outro módulo.

As principais motivações para se modularizar um programa são: (a) evitar repetição de


código; (b) dividir e estruturar melhor um algoritmo e (c) aumentar a legibilidade do código.
A divisão de um programa em módulo traz os seguintes benefícios: (a) manutenção mais
simples, pois os módulos são independentes; (b) elaboração e testes em separado e (c)
reutilização do módulo em outros programas.

A ativação (ou chamada) de um módulo é o meio pelo qual é solicitado ao programa que
desvie o fluxo de controle de execução para o módulo, execute suas instruções e depois
volte à instrução seguinte à da chamada do módulo.

Em C/C++ a modularização é feita através das funções. As funções são módulos que
podem receber valores externos, chamados parâmetros ou argumentos, e também podem
retornar um valor produzido por ela chamado retorno.

Como descrito no capítulo 1.3, um programa C/C++ consiste na definição de uma ou mais
funções, e que todo programa C/C++ deve possuir uma função chamada main. Abaixo
temos a sintaxe de como definir uma função.

http://bac004.wikidot.com/printer--friendly//funcoes 4/5/2011
BAC004: 5 - Funções Page 2 of 14

1 tipo nomedafuncao(declaração dos parâmetros) ?

2 {
3 €€€€// instruções;
4 }
5

Neste capítulo será demonstrado como definir outras funções, além da função principal
main, e como utilizar algumas funções predefinidas na biblioteca cmath do C/C++.

5.1 Funções Sem Passagem de Parâmetros e Sem


Retorno
O tipo mais simples de função em C/C++ possui a sintaxe representada na figura a seguir.

Esta função é simples pois não recebe nenhuma informação no momento de sua chamada
(parâmetros) e também não retorna nenhum valor para quem a chamou. A forma de
identificar que a função não retorna nenhuma informação é utilizando o tipo de retorno como
void.

Exemplo 1

1 void€ imprime( ) ?

2 {
3 €€€€cout<<”Teste de funcao”;
4 }
5

Chamada de função
A chamada de uma função é o meio pelo qual o programa é solicitado que desvie o controle
e passe para a definição da função, execute suas instruções e depois volte à instrução
seguinte a da chamada.

Chama-se uma função pelo seu nome seguido de abertura de parênteses, nenhum ou mais
parâmetros sem os tipos, e o fechamento de parêntese. No exemplo abaixo, na linha 17,
chama-se a função escrevendo-se soma().

Exemplo 2
Considere o seguinte programa que chama uma função soma que lê dois números digitados
pelo usuário e imprime a sua soma.

http://bac004.wikidot.com/printer--friendly//funcoes 4/5/2011
BAC004: 5 - Funções Page 3 of 14

1 #include<iostream> ?

2 using namespace std;


3 €€
4 void soma()
5 {
6 €€int n1,n2, s;
7 €€cout<<"Digite o primeiro numero: "<<endl;
8 €€cin>>n1;
9 €€cout<<"Digite o segundo numero: "<<endl;
10 €€cin>>n2;
11 €€s = n1 + n2;
12 €€cout<<"\n Soma = "<<s;
13 }
14 €€
15 int main()
16 {
17 €€soma(); // chamada da função
18 €€return 0;
19 }
20

No exemplo, o programa começa sua execução na função main linha 15. Posteriormente,
executa a linha 17 que possui uma chamada à função soma. Neste ponto, o fluxo de
execução é desviado para a linha 4. Depois são executadas as linhas 4 até 12. Quando a
execução chega na linha 13 é identificado o final da função e o fluxo de execução retorna
para a linha 16, exatamente abaixo de onde ocorreu o desvio para a função soma. Em
seguida é executada a linha 18 que retorna 0 para o sistema operacional.

Considere nas Tabelas seguintes o Teste de Mesa para uma entrada: n1 = 5 e n2 = 7.

Função main Função soma


Função Saída Variáveis Saída
linha void soma( ) Linha n1 n2 s
17 desvio linha 4 4
retorna 0 para o sistema 5
18
operacional
6 lixo lixo lixo
Digite o
7 .. .. .. primeiro
numero:
8 5 .. ..
Digite o
9 .. .. .. segundo
numero:
10 .. 7 ..
11 .. .. 12
Soma =
12 .. .. ..
12
volta para linha 17

http://bac004.wikidot.com/printer--friendly//funcoes 4/5/2011
BAC004: 5 - Funções Page 4 of 14

No teste de mesa acima, cada função possui sua própria tabela, representando exatamente o
escopo das variáveis, ou seja, o local onde cada variável existe durante o processo de
execução.

Para simplificar a construção da tabela, utiliza-se " (aspas duplas) ou .. (dois pontos) nas
linhas subsequentes quando não houver alteração dos valores das variáveis, desta forma é
possível saber o ponto exato onde elas foram modificadas.

Protótipo da Função
Note que no exemplo acima o código da função foi definido antes da função main. Em
C/C++ também é possível escrever funções depois da função main, desde que se defina o
protótipo da função antes da função main.

O protótipo da função tem a mesma forma de definição da função, exceto por terminar com
ponto-e-vírgula após o fechamento do parêntese. No exemplo abaixo, na linha 4, é
demonstrado o uso do protótipo.

Exemplo 3

1 #include<iostream> ?
2 using namespace std;
3 €€
4 void soma(); //protótipo da função
5 €€
6 int main()
7 {
8 €€soma();
9 €€return 0;
10 }
11 €€
12 void soma()
13 {
14 €€int n1,n2, s;
15 €€cout<<"Digite o primeiro numero: "<<endl;
16 €€cin>>n1;
17 €€cout<<"Digite o segundo numero: "<<endl;
18 €€cin>>n2;
19 €€s = n1 + n2;
20 €€cout<<"\n Soma = "<<s;
21 }
22

5.2 Funções Com Passagem de Parâmetros e Sem


Retorno
O segundo tipo de função é representado por aquelas que recebem valores no momento em
que são chamadas (parâmetros) e não retorna valor para quem as chamou (void). A
sintaxe está representada na figura abaixo.

http://bac004.wikidot.com/printer--friendly//funcoes 4/5/2011
BAC004: 5 - Funções Page 5 of 14

Exemplo 1
No exemplo abaixo é definida uma função que receberá dois parâmetros (string e int) no
momento de sua chamada.

1 void welcome(string nome, int idade) ?


2 {
3 €€cout<<"Bem vindo(a)\nNome:"<<nome<<endl<<"Idade:"<<idade;
4 }
5

Os parâmetros da função são variáveis locais, portanto, podem ser usados dentro da
função. Eles são usados como um meio para comunicação entre as funções pois recebem (ou
retornam) valores de outras funções.

Exemplo 2
Considere o seguinte programa que chama uma função soma com dois parâmetros do tipo
int e imprime a sua soma.

1 #include<iostream> ?
2 using namespace std;
3 €€
4 void soma(int n1, int n2)
5 {
6 €€int s;
7 €€s = n1 + n2;
8 €€cout<<"\n Soma = "<<s;
9 }
10 €€
11 int main()
12 {
13 €€int numero1, numero2;
14 €€cout<<"Digite o primeiro numero: "<<endl;
15 €€cin>>numero1;
16 €€cout<<"Digite o segundo numero: "<<endl;
17 €€cin>>numero2;
18 €€soma(numero1,numero2); //chamada da função
19 €€return 0;
20 }
21

No exemplo, o programa começa sua execução na função main linha 11. Posteriormente,
executa as linhas 12 a 17 onde recebe do usuário dois números. Depois executa a linha 18

http://bac004.wikidot.com/printer--friendly//funcoes 4/5/2011
BAC004: 5 - Funções Page 6 of 14

que possui uma chamada à função soma onde é passado como parâmetro o valor das
variáveis numero1 e numero2. Neste ponto, o fluxo de execução é desviado para a linha 4,
neste momento os valores de numero1 e numero2 são copiados para as variáveis locais
n1 e n2, respectivamente. Depois são executadas as linhas 5 até 8. Quando a execução
chega na linha 9 é identificado o final da função e o fluxo de execução retorna para a linha
18, exatamente abaixo de onde ocorreu o desvio para a função soma. Em seguida é
executada a linha 19 que retorna 0 para o sistema operacional.

Considere nas Tabelas seguintes o Teste de Mesa para uma entrada: numero1 = 10 e
numero2 = 6.

Função main
Variáveis Função Saída
linha numero1 numero2 void soma(int, int)
13 lixo lixo
Digite o primeiro
14 .. ..
numero:
15 10 ..
Digite o segundo
16 .. ..
numero:
17 .. 6
soma(10,6) — desvio
18 .. ..
linha 4
19 retorna 0 para o sistema operacional

Função soma
Variáveis Saída
Linha n1 n2 s
4 10 6
5 .. ..
6 .. .. lixo
7 .. .. 16
8 .. .. .. Soma = 16
volta para linha 18

Observações:
■ Caso a função fosse definida após a função main o protótipo seria void soma(int n1,
int n2);.
■ Na chamada da função, pode-se invocar a função passando valores do tipo dos
parâmetros. Exemplo soma(7,8);.
■ A ordem e o tipo dos parâmetros devem ser respeitados na chamada da função.

http://bac004.wikidot.com/printer--friendly//funcoes 4/5/2011
BAC004: 5 - Funções Page 7 of 14

5.3 Funções Sem Passagem de Parâmetros e Com


Retorno
O terceiro tipo de função não recebe valores no momento em que são chamadas mas
retornam um valor para quem a chamou (retorno). A sintaxe está representada na figura
abaixo.

O tipo de retorno pode ser qualquer tipo de dado apresentado no Capítulo 2.2 (int, float,
char, string , …). Exemplo: a função main possui o tipo de retorno int que é devolvido para
o sistema operacional.

O retorno da função é feito através do comando return. Este comando ao ser processado
termina a execução da função e retorna o controle para a instrução seguinte do código da
chamada. Nas funções onde o tipo de retorno é void pode-se utilizar o comando return; e
nas demais funções o comando return tipodeRetorno;. No exemplo abaixo na linha 12 é
demonstrado o uso do return.

Exemplo
Considere o seguinte programa que chama uma função soma sem parâmetros e retorna um
valor inteiro (int) para a função que a chamou.

1 #include<iostream> ?
2 using namespace std;
3 €€
4 int soma()
5 {
6 €€int n1,n2,s;
7 €€cout<<"Digite o primeiro numero: "<<endl;
8 €€cin>>n1;
9 €€cout<<"Digite o segundo numero: "<<endl;
10 €€cin>>n2;
11 €€s = n1 + n2;
12 €€return s;
13 }
14 €€
15 int main()
16 {
17 €€int resultado;
18 €€resultado=soma();
19 €€cout<<"\n Soma = "<<resultado;
20 €€return 0;
21 }
22

http://bac004.wikidot.com/printer--friendly//funcoes 4/5/2011
BAC004: 5 - Funções Page 8 of 14

No exemplo, o programa começa sua execução na função main linha 15 e executa as linhas
16 e 17. Depois executa a linha 18 que possui uma chamada à função soma sem
parâmetro que após a sua execução atribuir o seu retorno para a variável resultado.
Neste ponto, o fluxo de execução é desviado para a linha 4 onde são executados as linhas de
4 até 11. Quando a execução chega na linha 12 é acionado o comando return que retorna o
valor de s para quem chamou a função terminando a sua execução. O fluxo de execução
retorna para a linha 19 após a variável resultado (linha 18) ter recebido o resultado da
função. A linha 19 é executada e imprime a soma na tela e em seguida a linha 20 que
retorna 0 para o sistema operacional.

Considere nas Tabelas seguintes o Teste de Mesa para a entrada: n1 = 7 e n2 = 5.

Função main Função soma


Variáveis Função Saída Variáveis Saída
int Linha n1 n2 s
linha resultado soma
4
()
5
17 lixo
6 lixo lixo lixo
soma
()— Digite o
18 12
desvio 7 .. .. .. primeiro
linha 4 numero:
Soma 8 7 .. ..
19 ..
= 12
Digite o
retorna 0 para o sistema 9 .. .. .. segundo
20
operacional numero:
10 .. 5 ..
11 .. .. 12
Retorna o valor 12 e volta
12
para linha 18

Observações:
■ Podemos utilizar mais de um comando return na mesma função.
■ O informação retornada pelo comando return deve ser do mesmo tipo definido na
função.

5.4 Funções Com Passagem de Parâmetros e Com


Retorno
O quarto tipo de função é representado por aquelas que recebem valores no momento em
que são chamadas (parâmetros) e retornam um valor para quem a chamou (retorno). A
sintaxe está representada na figura abaixo.

http://bac004.wikidot.com/printer--friendly//funcoes 4/5/2011
BAC004: 5 - Funções Page 9 of 14

Exemplo
Considere o seguinte programa que chama uma função soma com dois parâmetros do tipo
int e retorna um valor inteiro (int) contendo a soma para a função que a chamou.

1 #include<iostream> ?
2 using namespace std;
3 €€
4 int soma(int n1, int n2)
5 {
6 €€int s;
7 €€s = n1 + n2;
8 €€return s;
9 }
10 €€
11 int main()
12 {
13 €€int numero1, numero2, resultado;
14 €€cout<<"Digite o primeiro numero: "<<endl;
15 €€cin>>numero1;
16 €€cout<<"Digite o segundo numero: "<<endl;
17 €€cin>>numero2;
18 €€resultado=soma(numero1,numero2);
19 €€cout<<"\n Soma = "<<resultado;
20 €€return 0;
21 }
22

No exemplo, o programa começa sua execução na função main linha 11. Posteriormente,
executa as linhas 12 a 17 onde recebe do usuário dois números. Depois executa a linha 18
que possui uma chamada à função soma onde é passado como parâmetro o valor das
variáveis numero1 e numero2. Neste ponto, o fluxo de execução é desviado para a linha 4,
neste momento os valores de numero1 e numero2 são copiados para as variáveis locais
n1 e n2, respectivamente. Depois são executados as linhas 5 até 7. Quando a execução
chega na linha 8 é acionado o comando return que retorna o valor de s para quem chamou
a função terminando a sua execução. O fluxo de execução retorna para a linha 19 após a
variável resultado (linha 18) ter recebido o resultado da função soma. A linha 19 é
executada e imprime a soma na tela e em seguida a linha 20 que retorna 0 para o sistema
operacional.

Considere nas Tabelas seguintes o Teste de Mesa para a entrada: numero1 = 3 e numero2 =
4.

Função main

http://bac004.wikidot.com/printer--friendly//funcoes 4/5/2011
BAC004: 5 - Funções Page 10 of 14

Variáveis Função Saída


linha numero1 numero2 resultado int soma(int, int)
13 lixo lixo lixo
Digite o primeiro
14 .. .. ..
numero:
15 3 .. ..
Digite o segundo
16 .. .. ..
numero:
17 .. 4 ..
soma(3,4) —
18 .. .. 7
desvio linha 4
19 .. .. .. Soma = 7
20 retorna 0 para o sistema operacional

Função soma
Variáveis Saída
Linha n1 n2 s
4 3 4
5 .. ..
6 .. .. lixo
7 .. .. 7
8 Retorna o valor 7 e volta para linha 18

5.5 Passagem de Parâmetros Por Valor e Por


Referência
A passagem de parâmetros pode ser feita de duas formas, por valor e por referência.

Passagem de Parâmetro Por Valor


A passagem de parâmetros por valor significa que a função trabalhará com cópias dos
valores passados no momento de sua chamada, desta forma, qualquer alteração dos valores
nas variáveis correspondentes dentro da função não afetam os valores das variáveis
utilizadas como parâmetros. Até este momento todas as funções apresentadas utilizam a
passagem de parâmetros por valor.

Passagem de Parâmetro Por Referência


A passagem de parâmetros por referência significa que a função trabalhará com as
próprias variáveis passadas no momento de sua chamada. Assim, qualquer alteração nos
valores das variáveis correspondentes dentro da função afetam as variáveis passadas como
parâmetros.

Este mecanismo permite que a função retorne mais de um valor para a função que chama.

Para definir que um parâmetro será passado como referência para uma função, utilizamos o
símbolo & antes do nome da variável no cabeçalho da função, indicando que ela é um alias

http://bac004.wikidot.com/printer--friendly//funcoes 4/5/2011
BAC004: 5 - Funções Page 11 of 14

(apelido, referência, outro nome) para a variável passada como parâmetro. Veja os
exemplos abaixo.

Exemplo 1
Neste exemplo, o parâmetro a será a própria variável (passagem de parâmetro por
referência) e o parâmetro b receberá uma cópia da variável (passagem de parâmetro
por valor).

1 double operacaoX(double€ &a, int b) ?

2 {
3 €€€€//instruções
4 }
5

Exemplo 2
Considere o programa abaixo que chama uma função nao_muda e a função muda.

1 #include ?
2 using namespace std;
3 €€
4 void nao_muda(int a, double b)€€ //passagem por valor
5 {
6 €€€a+=2;€€€ // significa a=a+2;
7 €€€b+=5;€€€ // significa b=b+5;
8 }
9 €€
10 void muda(int &a, double &b)€€€€ //passagem por referência
11 {
12 €€€a+=2;
13 €€€b+=5;
14 }
15 €€
16 int main()
17 {
18 €€int n1=5;
19 €€double n2=6.0;
20 €€cout<<"n1 = "<<n1<<" n2 = "<<n2<<endl;
21 €€nao_muda(n1,n2);
22 €€cout<<"Valores apos a funcao nao_muda n1 = "<<n1<<" n2 = "<<n2<<endl;
23 €€muda(n1,n2);
24 €€cout<<"Valores apos a funcao muda n1 = "<<n1<<" n2 = "<<n2<<endl;
25 €€return 0;
26 }
27
3 4

No exemplo, o programa começa sua execução na função main linha 16. Posteriormente,
executa as linhas 17 a 19 onde as variáveis n1 e n2 recebem dois valores e a linha 20 que
apresenta na tela os valores de n1 e n2. Em seguida, executa a linha 21 que possui uma
chamada à função nao_muda onde são passados como parâmetros os valores das
variáveis n1 e n2. Neste ponto, o fluxo de execução é desviado para a linha 4, neste
momento os valores de n1 e n2 são copiados para as variáveis locais a e b,
respectivamente. Depois são executadas as linhas 5 a 7 que modificam os valores das
variáveis locais a e b. Quando a execução chega na linha 8 é alcançado o fim da função e o

http://bac004.wikidot.com/printer--friendly//funcoes 4/5/2011
BAC004: 5 - Funções Page 12 of 14

fluxo de execução retorna para a linha 22. Na linha 22 são apresentados na tela os valores
de n1 e n2 com os mesmos valores apresentados na linha 20. Depois é executada a linha 23
que possui uma chamada à função muda onde são passados como parâmetros as variáveis
n1 e n2. Um desvio do fluxo de execução é feito para a linha 10, neste momento é criada a
referência das variáveis n1 e n2 para as variáveis a e b, respectivamente. Depois são
executadas as linhas 11 a 13 que modificam os valores das variáveis locais a e b que são as
variáveis n1 e n2 com nomes diferentes. Quando a execução chega na linha 14 é alcançado
o fim da função e o fluxo de execução retorna para a linha 24. Na linha 24 são apresentados
na tela os valores de n1 e n2 agora com novos valores. E por fim, é executada a linha 25
que retorna 0 para o sistema operacional.

Considere nas Tabelas seguintes o Teste de Mesa para a entrada: n1 = 5 e n2 = 6.0.

Função main
Variáveis Função Saída
void nao_muda void muda
linha n1 n2
(int, int) (&int, &int)
18 5
19 .. 6.0
20 .. .. n1=5 n2=6.0
nao_muda(5,
21 .. .. 6.0) —
desvio linha 4
Valores após a funcao
22 .. ..
nao_muda n1 = 5 n2 = 6.0
muda(n1,
n2) —
23 7 11.0
desvio linha
10
Valores apos a funcao
24 .. ..
muda n1=7 n2=11.0
25 retorna 0 para o sistema operacional

Função nao_muda Função muda


Variáveis Saída Variáveis Saída
Linha a b Linha &a &b
4 5 6.0 10 5 6.0
5 .. .. 11 .. ..
6 7 .. 12 7 ..
7 .. 11.0 13 .. 11.0
volta para linha 21 volta para linha 23

5.6 Funções Predefinidas


Em C/C++ existem várias bibliotecas com funções predefinidas. Uma das bibliotecas mais
úteis é a biblioteca matemática cmath ou math.h . Abaixo alguns exemplos.

http://bac004.wikidot.com/printer--friendly//funcoes 4/5/2011
BAC004: 5 - Funções Page 13 of 14

função Comentário Protótipo


double ceil ( double x );
ceil(x) Arredonda um número real para cima.
float ceil ( float x );
double cos ( double x );
cos(x) Calcula o cosseno de x (em radianos).
float cos ( float x );
Obtém o número natural e elevado à double exp ( double x );
exp(x)
potência x. float exp ( float x );
double fabs ( double x );
fabs(x) Obtém o valor absoluto de x.
float fabs ( float x );
Arredonda um número real para double floor ( double x );
floor(x)
baixo. float floor ( float x );
double log ( double x );
log(x) Obtém o logaritmo natural de x.
float log ( float x );
log10 double log10 ( double x );
Obtém o logaritmo de base 10 de x.
(x) float log10 ( float x );
double pow ( double base, double
exponent );
pow float pow ( float base, float
Calcula a potência de x elevado a y.
(x,y) exponent );
double pow ( double base, int
exponent );
double sin ( double x );
sen(x) Calcula o seno de x (em radianos)
float sin ( float x );
double sqrt ( double x );
sqrt(x) Calcula a raiz quadrada de x.
float sqrt ( float x );

Exemplo 1

1 #include<iostream> ?
2 #include<cmath>
3 using namespace std;
4 €€
5 int main()
6 {
7 €€double base, expoente, resultado;
8 €€cout<<"Digite a base de um numero exponencial";
9 €€cin>>base;
10 €€cout<<"Digite o expoente de um numero exponencial";
11 €€cout<<expoente;
12 €€resultado = pow(base,expoente);€
13 €€cout<<"O valor do numero exponencial e = "<<resultado;
14 €€return 0;
15 }
16

http://bac004.wikidot.com/printer--friendly//funcoes 4/5/2011
BAC004: 5 - Funções Page 14 of 14

Exemplo 2

1 #include<iostream> ?
2 #include<cmath>
3 using namespace std;
4 €€
5 int main()
6 {
7 €€double numero, raiz;
8 €€cout<<"Digite um numero";
9 €€cin>>numero;
10 €€raiz = sqrt(numero);€
11 €€cout<<"A raiz quadrada de "<<numero<<" e " <<raiz;
12 €€return 0;
13 }
14

5.7 Exercícios
1. Escreva uma função que receba como argumento o ano e retorne true se for um ano
bissexto e false se não for. Um ano é bissexto se for divisível por 4, mas não por 100.
Um ano também é bissexto se for divisível por 400.
2. Escreva uma função que receba um número float como argumento e retorne, em
outros dois argumentos passados por referência, a parte inteira e a parte decimal
desse número.
3. Escreva uma função que ordene o valor de três argumentos do tipo char. Por
exemplo, se ch1, ch2, ch3 são variáveis do tipo char com valores, respectivamente
'B', 'A' e 'C', após a chamada à função, as variáveis conterão, respectivamente, 'A', 'B'
e 'C'.
4. Escreva uma função chamada maior que receba 2 números inteiros e retornará o
maior deles.
5. Escreva uma função chamada maior3 que receba 3 números inteiros e utilizando a
função maior do exercício 4, retorne o maior deles.

page revision: 137, last edited: 4 Apr 2011, 22:47 GMT-03 (17 hours ago)

Unless stated otherwise Content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0
License

http://bac004.wikidot.com/printer--friendly//funcoes 4/5/2011

Você também pode gostar