Prévia do material em texto
Prof. Claudio Cesar de Oliveira Cordeiro
001 claudio_cesar_cordeiro@yahoo.com.br Ter, 03/09/13
Capítulo 04
Funções
Linguagem de Programação C++
Funções
002 claudio_cesar_cordeiro@yahoo.com.br http://www.dei.isep.ipp.pt/~pbsousa/aulas/ano_0/2006_07/c/Sebenta-cpp-03-2006.pdf
Linguagem de Programação C++
► Conceito
► Sintaxe de uma Função
► Passos para Programação Modular Usando Funções
► Chamada de uma Função
► Cinco Motivos Para Usarmos Funções
► Escopo das Variáveis
► Variáveis Globais
► Variáveis Locais
► Definição de uma Função Antes e Depois de main()
► Sintaxe do Protótipo de uma Função
► Estrutura de um Programa C++ - Mais completa
► Função int main (argc, char*argv[])
► Stack (Pilha) – Como a Função retorna o valor
► Passagem de Parâmetros Para uma Função
Funções
003 claudio_cesar_cordeiro@yahoo.com.br .
Linguagem de Programação C++ Funções
Funções - Conceito
Funções nada mais são do que um conjunto de
linhas de código, ou bloco de comandos,
escrito fora do programa principal, que é
executado quando for chamado por ele.
Uma vez uma função sendo definida ela pode
ser chamada infinitas vezes, de forma que
possamos escrever programas modulares.
Cada módulo executaria uma função
específica.
A função, após sua execução retorna um, e
somente um, valor previsto que será usado
pelo programa principal, que é a função main().
004 claudio_cesar_cordeiro@yahoo.com.br Note que a função int main () nossa conhecida tem este formato.
Linguagem de Programação C++ Funções
Sintaxe da Definição de uma Função
tipo_dados identificação (arg_1, arg_2, ...)
{
bloco de comandos da função
}
Identificação é o nome
da função que segue a
mesma regra de
nomeação das variáveis
arg_1, arg_2, são
argumentos. São tipos
de dados seguidos de
um identificador.
Exemplos: int var, int
num, int soma. Número
de argumentos pode ser
nulo. Exemplo: main()
Tipo de dados –
qual tipo de dados
a função irá
retornar ao
programa
principal. Se
omitido o default é
int.
005 claudio_cesar_cordeiro@yahoo.com.br
Linguagem de Programação C++ Funções
Passos Para Programação Modular - Função
1º) Definir a função
2º) Escrever o código da função
3º) Escrever o código do programa principal
4º) Chamar a função passando o(s) parâme-
tro(s) para ela, ou não
5º) Receber (ou não) o valor retornado pela
função
6º) Tratar o valor retornado no programa prin-
cipal
006 claudio_cesar_cordeiro@yahoo.com.br A função main() é onde começa e termina nossos programas.
Linguagem de Programação C++
Exemplo 01 - Função soma (num1,num2)
Funções
#include <iostream>
using namespace std;
int soma (int num1, int num2)
{
int sum;
sum = num1 + num2;
return sum;
}
int main ()
{
int x, y, resultado; cout << endl << endl;
cout << "Uso de Funcao soma(x,y) para somar dois Inteiros" << endl;
cout << "************************************************" << endl << endl;
cout << endl << endl;
cout << "Entre dois numeros inteiros separados por espaco ...: ";
cin >> x; cin >> y;
resultado = soma (x, y);
cout << endl;
cout << "A soma dos dois numeros eh .........................: " << resultado;
cout << endl << endl << endl;
system (“pause”);
return 0;
}
Definição da função
int soma (int nun1, int num2)
Definição da
função main ()
Chamada da função soma(x,y) e seu retorno atribuído à variável resultado
007 claudio_cesar_cordeiro@yahoo.com.br .
Linguagem de Programação C++
Como acontece ...
Funções
int soma (int num1, int num2)
{
int sum;
sum = num1 + num2;
return sum;
}
int main ()
{
int x, y, resultado;
cin >> x; cin >> y;
resultado = soma (x, y);
cout << endl;
cout << "A soma eh ...: " << resultado;
return 0;
}
Função
retorna só e
somente um
valor!!!
Função soma (num1, num2)
Programa Principal
008 claudio_cesar_cordeiro@yahoo.com.br .
Linguagem de Programação C++
Exemplo 02 - Função void (sem argumentos)
Funções
#include <iostream>
using namespace std;
void mostra (void)
{
cout << endl
<< endl << "Esta funcao eh void! Nao retorna nada, so mostra esta msg";
}
int main ()
{
mostra();
}
cout << endl << endl < endl;
system (“pause”);
return 0;
}
Chamada de função void. Não foram enviados argumentos nem recebido retorno!
009 claudio_cesar_cordeiro@yahoo.com.br Snaith, PAUL – C++ Para Leigos Passo a Passo – Pág. 146
Linguagem de Programação C++
Cinco motivos para usarmos funções:
Funções
1º Módulos pequenos são mais fáceis de
codificar.
2º Em módulos pequenos é mais fácil
encontrar erros.
3º O trabalho em equipe é bem facilitado.
4º A função é escrita uma única vez e
usada muitas vezes.
5º Uma vez testada, e funcionando bem,
pode fazer parte de uma biblioteca para
uso futuro.
010 claudio_cesar_cordeiro@yahoo.com.br .
Linguagem de Programação C++
Exemplo 03 – Função Fatorial
Funções
#include <iostream>
using namespace std;
int fatorial (int num)
{
int fat=1;
while (num > 0)
{
fat = num * fat;
num--;
}
return fat;
}
int main ()
{ int x=0, resultado_fat=0;
cout << endl;
cout << "Calculo de Fatorial de Numeros Inteiros" << endl;
cout << "***************************************" << endl;
cout << endl << endl;
cout << "Entre numero para calcular seu fatorial .....: ";
cin >> x;
resultado_fat = fatorial(x);
cout << endl << endl;
cout << "O fatorial de " << x << " eh ..........................: " << resultado_fat;
cout << endl << endl << endl;
system ("pause");
return 0; }
Fatorial é uma
função recursiva,
isto é, ela chama
a si mesma!
011 claudio_cesar_cordeiro@yahoo.com.br .
Linguagem de Programação C++
Exemplo 04 – Converter Binário Para Decimal
Funções
#include <iostream>
using namespace std;
int binTOdeci (int num)
{
int bit7=0, bit6=0, bit5=0, bit4=0, bit3=0, bit2=0, bit1=0, bit0=0,deci=0;
bit7 = (num/10000000 % 10);
bit6 = (num/1000000) % 10;
bit5 = (num/100000) % 10;
bit4 = (num/10000) % 10;
bit3 = (num/1000) % 10;
bit2 = (num/100) % 10;
bit1 = (num/10) % 10;
bit0 = (num/1) % 10;
cout << endl;
deci = bit7*128 + bit6*64 + bit5*32 + bit4*16 + bit3*8 + bit2*4 + bit1*2 + bit0*1;
return deci;
}
int main()
{int numero=0,resultado=0;cin>>numero;resultado=binTOdeci(numero);cout<<
resultado;cout<<endl<<endl;system("pause");return 0;}
012 claudio_cesar_cordeiro@yahoo.com.br .
Linguagem de Programação C++
Exemplo 05 – Função square_root(float x)
Funções
#include <iostream>
#using <math.h>
using namespace std;
float square_root (float x)
{
float root=0;
root = pow(x,1.0/2.0);
return root;
}
int main()
{
float numero=0,resultado=0;cin>>numero;
resultado = square_root (numero);
cout<<resultado;cout<<endl<<endl;
system("pause");return 0;
}
013 claudio_cesar_cordeiro@yahoo.com.br .
Linguagem de Programação C++Escopo de Variáveis - Tipos de Variáveis no C++
Funções
Variáveis Globais
estão declaradas
FORA de qualquer
função, inclusive a
main().
VARIÁVEIS
GLOBAIS
Variáveis Locais
estão declaradas
DENTRO de uma
função qualquer,
inclusive main().
VARIÁVEIS
LOCAIS
Estão disponíveis
em qualquer
parte do
programa.
Qualquer função
pode lê-la ou
alterá-la.
Estão disponíveis
somente dentro
da função que as
declarou. Elas
nascem e
morrem dentro
da função.
014 claudio_cesar_cordeiro@yahoo.com.br .
Linguagem de Programação C++
Exemplo 06 – Função Alterando Variável Global
Funções
015 claudio_cesar_cordeiro@yahoo.com.br .
Linguagem de Programação C++
Exemplo 06 – Função Alterando Variável Global
Funções
05 void change_global (int d)
{
06 int x;
07 x = a + 3;
08 a = d + x;
}
#include <iostream>
using namespace std;
01 int a=0; //Variável Global!
void change_global (int d)
{
int x;
x = a + 3;
a = d + x;
}
int main ()
{
02 int z = 5;
03 cout << “Valor de a eh ...: " << a << endl;
04 change_global (z);
09 cout << “Valor de a eh ...: " << a << endl;
return 0;
}
08
016 claudio_cesar_cordeiro@yahoo.com.br .
Linguagem de Programação C++
Definição de Função Antes de main ()
Funções
#include <iostream>
using namespace std;
1. int a=0;
void change_global (int d)
{
int x;
x = a + 3;
a = d + x;
}
int main ()
{
2. int z = 5;
3. cout << “Valor de a eh ...: " << a << endl;
4. change_global (z);
9. cout << “Valor de a eh ...: " << a << endl;
return 0;
}
Todos os exemplos
que temos visto até
o momento temos a
função definida
antes da definição
da função main() e
de ser chamada por
ela.
Definição
Chamada da função void
017 claudio_cesar_cordeiro@yahoo.com.br .
Linguagem de Programação C++ Funções
#include <iostream>
using namespace std;
int a=0;
int main ()
{
int z = 5;
cout << “Valor de a eh ...: " << a << endl;
change_global (z);
cout << “Valor de a eh ...: " << a << endl;
return 0;
}
void change_global (int d)
{
int x;
x = a + 3;
a = d + x;
}
Neste caso o
compilador dá erro,
pois uma função é
chamada antes de
ter sido definida.
Definição de Função Depois de main ()
Mas colocar a
função depois de
main () é um boa
regra de
programação em
C++. Para resolver o
impasse devemos
definir o protótipo
da função antes de
main ().
Definição
Chamada
018 claudio_cesar_cordeiro@yahoo.com.br Note que a função int main () nossa conhecida tem este formato.
Linguagem de Programação C++ Funções
Sintaxe do Protótipo de uma Função
tipo_dados identificação (arg_1, arg_2, ...);
Tipo de dados –
qual tipo de dados
a função irá
retornar ao
programa
principal. Se
omitido o default é
int.
Identificação é o nome
da função que segue a
mesma regra de
nomeação das variáveis
arg_1, arg_2,
argumentos, são tipos
de dados seguidos de
seu identificador.
Exemplo: int var, int
num, int soma. Número
de argumentos pode ser
nulo. Exemplo: main()
Sintaxe do Protótipo de uma Função é
exatamente igual à da definição, exceto por dois
detalhes:
1º) termina com ponto vírgula
2º) não tem o bloco de comandos
O protótipo da função fica na
área externa da função
main(), entre as diretivas para
o compilador e main().
019 claudio_cesar_cordeiro@yahoo.com.br .
Linguagem de Programação C++ Funções
#include <iostream>
using namespace std;
int a=0;
void change_global (int d);
int main ();
int main ()
{
int z = 5;
cout << “Valor de a eh ...: " << a << endl;
change_global (z);
cout << “Valor de a eh ...: " << a << endl;
return 0;
}
void change_global (int d)
{
int x;
x = a + 3;
a = d + x;
}
Aqui estão
protótipos das
funções. Igualzinho
à sua definição COM
PONTO E VÍRGULA
NO FINAL!
Definição
Chamada
Protótipo de Função = definição com ;
Agora com o
protótipo da função
antes de main () o
compilador não dará
mais erro. E a função
main ()? Também tem
seu protótipo, que
normalmente é
omitido, sem
problemas.
Protótipos
020 claudio_cesar_cordeiro@yahoo.com.br
Linguagem de Programação C++
Estrutura de um Programa C++ - Mais completa
Funções
#include
#define
Diretivas do Pré-processador
float PI = 3.149265;
Declaração das Variáveis Globais
int fatorial (int x);
void change_global (int d);
Protótipo das Funções
main ()
{
cout << fatorial (5); system (“pause”); return 0;
}
Programa Principal – main ()
int fatorial (int x)
{
return fat;
}
Definição das Funções
http://www.dei.isep.ipp.pt/~pbsousa/aulas/ano_0/2006_07/c/Sebenta-cpp-03-2006.pdf
021 claudio_cesar_cordeiro@yahoo.com.br Valores das variáveis booleanas podem ser true ou false.
Linguagem de Programação C++
Outros Exemplos de Protótipos de Funções
Funções
int fatorial (int x);
void change_global (int d);
void imprime (void);
float area_circulo (float r);
int main ();
bool numero_perfeito (int n);
Recebe parâmetro inteiro
Retorna um valor inteiro
Retorna booleano
O default
para o tipo
da função é
int. Assim
main() ou int
main()
significam a
mesma
coisa!
022 claudio_cesar_cordeiro@yahoo.com.br http://publications.gbdirect.co.uk/c_book/chapter10/arguments_to_main.html
Linguagem de Programação C++ Funções
argc – argument count – é um contador do número de
argumentos passados para o programa.
Função int main (argc, char *argv[ ])
argv – argument vector – é um array de pointers para os
strings que são os argumentos. O tipo é quase sempre o
array de pointer para char (*argv).
Os argumentos são passados ao programa pelo linha de
comando do Sistema Operacional DOS ou UNIX. No DOS
executaríamos um exemplo assim, na linha de comando:
C:\> data 18 05 12 (o programa data.exe na raiz do drive c:\)
O programa data.exe converteria os parâmetros passados
(dd mm aa) em um data por extenso como 18 de maio de
2012.
023 claudio_cesar_cordeiro@yahoo.com.br LIFO – Last In First Out – O último dado a entrar na pilha é o primeiro a sair.
Linguagem de Programação C++
Stack – Pilha – Como a função retorna o valor?
Funções
Argumentos e
Variáveis de Ambiente
Stack Frame
Stack Frame
Stack Frame
Variáveis Globais
Instruções do Programa
Heap
S
t
a
c
k
D
a
d
o
s
C
ó
d
i
g
o
É na stack
frame da pilha
(stack) que os
argumentos e
endereços das
funções são
armazenados.
Quando a função
termina, a sua
stack frame é
destruída.
A pilha funciona
segundo o
princípio LIFO.
Layout Simplificado da Memória
024 claudio_cesar_cordeiro@yahoo.com.br
Linguagem de Programação C++
Passagem de Argumentos Para Funções
Funções
Existem três formas de passagem de valor(es)
através dos argumentos para as funções:
1ª) Passagem de parâmetros(ou argumentos)
por valor e
2ª) Passagem de parâmetros por referência.
3ª) Passagem de valores por omissão de
argumentos
Nos exemplos vistos até aqui a passagem dos
parâmetros para a função foi feita por valor.
http://www.dei.isep.ipp.pt/~pbsousa/aulas/ano_0/2006_07/c/Sebenta-cpp-03-2006.pdf
025 claudio_cesar_cordeiro@yahoo.com.br
Linguagem de Programação C++
Passagem de Argumentos Por Valor
Funções
#include <iostream>
#using <math.h>
using namespace std;
float square_root (float x)
{
float root=0;
root = pow(x,1.0/2.0);
return root;
}
int main()
{
float numero=0,resultado=0;
cin>>numero;
resultado = square_root (numero);
cout<<resultado;
cout<<endl<<endl;
system("pause");return 0;
}
float square_root (float x)
{
float root=0;
root = pow(x,1.0/2.0);
return root;
}
.
.
.
Stack
Frame
.
http://www.dei.isep.ipp.pt/~pbsousa/aulas/ano_0/2006_07/c/Sebenta-cpp-03-2006.pdf
claudio_cesar_cordeiro@yahoo.com.br
Linguagem de Programação C++ Funções
#include <iostream>
using namespace std;
void divisao_inteira (int dividendo, int divisor,
int &quociente, int &resto);
int main ()
{
int D, d, q, r; //Dividendo, divisor, quociente e resto
cout << endl;
cout << "Funcao divisao_inteira - Passagem Valores Referencia" << endl;
cout << "****************************************************“
<< endl << endl;
cout << endl;
cout << "Entre o dividendo ...........: "; cin >> D;
cout << "Entre o divisor .............: "; cin >> d;
divisao_inteira (D,d,q,r);
cout << endl;
cout << "O quociente de " << D << " por " << d << " eh .....: " << q << endl;
cout << "O resto de " << D << " por " << d << " eh .........: " << r << endl;
}
Note que o quociente e o
resto serão tratados pela
função divisao_inteira. No
final main() teve acesso ao
quociente e ao resto e que
também a função é void,
isto significa que não
retorna nada para main().
Nota: Com a Passagem por Parâmetros obtemos, indiretamente, a mais de um valor de retorno da função.
Exemplo 07 – Função divisao_inteira – Parte 1/2
Passagem de Argumentos Por Referência
026 http://www.dei.isep.ipp.pt/~pbsousa/aulas/ano_0/2006_07/c/Sebenta-cpp-03-2006.pdf
claudio_cesar_cordeiro@yahoo.com.br
Linguagem de Programação C++
Exemplo 07 – Função divisao_inteira – Parte 2/2
Funções
#include <iostream>
using namespace std;
void divisao_inteira (int dividendo,
int divisor,
int &quociente, int &resto)
{
quociente =0;
while (dividendo >= divisor)
{
dividendo = dividendo - divisor;
quociente = quociente + 1;
}
resto = dividendo;
}
Passagem de Argumentos Por Referência
http://www.dei.isep.ipp.pt/~pbsousa/aulas/ano_0/2006_07/c/Sebenta-cpp-03-2006.pdf
& é um Operador de
Endereço que faz
referência ao endereço de
memória da variável, na
memória RAM.
.
.
027
028 claudio_cesar_cordeiro@yahoo.com.br
Linguagem de Programação C++
Passagem de Variáveis Por Valor e Referência
Funções
#include <iostream>
using namespace std;
void divisao_inteira (int dividendo, int divisor, int &quociente, int &resto);
int main ()
{
int D, d, q, r
cin >> D;
cin >> d;
D = 23;
d = 5;
divisao_inteira ( D, d, q, r );
return 0;
}
.
.
.
.
.
.
.
. . .
. .
23 5 endereço de q
endereço de r
As variáveis D e q foram passadas por valor, que dentro da
função divisao_inteira serão as variáveis quociente e
divisor. As variáveis q e r foram passadas por referência, o
que significa dizer que quando a função alterar as
variáveis quociente e resto, as variáveis q e r de main()
serão automaticamente alteradas na memória, através de
seus endereços passados pelo operador &.
http://www.dei.isep.ipp.pt/~pbsousa/aulas/ano_0/2006_07/c/Sebenta-cpp-03-2006.pdf
029 claudio_cesar_cordeiro@yahoo.com.br
Linguagem de Programação C++ Funções
#include <iostream>
using namespace std;
int divide (int a, int b=2)
{
int r;
r = a / b;
return r;
}
int main ()
{
cout << end << divide (12) << endl; //Passando um parâmetro e omitindo o segundo
cout << divide (12,4) << endl; //Passando os dois parâmetros
cout << endl;
system (“pause”);
return 0;
}
Exemplo 08 – Passagem sem/com Omissão
Temos duas formas de chamar a Função
http://www.dei.isep.ipp.pt/~pbsousa/aulas/ano_0/2006_07/c/Sebenta-cpp-03-2006.pdf
Bibliografia
030 claudio_cesar_cordeiro@yahoo.com.br .
1. Snaith, Paul. C++ Para Leigos – Passo a Passo. Editora Ciência Moderna Ltda, 1999
2. Bueno, André Duarte. Programação Orientada a Objeto com C++ -. Editora Novatec Ltda, 2003
3. Montenegro, Fernando e Pacheco, Roberto. Orientação a Objetos em C++. Editora Ciência Moderna Ltda, 1994
4. Manzano, José Augusto e Oliveira, Jayr Figueiredo – Algoritmos – lógica para Desenvolvimento de Programação –
Editora Érica – São Paulo – 1996
5. Apostila de Dev-C++ , Educação Online, visitado em 30/03/2012
http://www.educaonline.eng.br/UNISANTA/HTML/DOWNLOAD/APOSTILAS/apostila%20de%20dev.pdf
6. A Linguagem de Programação C++ - Apostila de Enrique Camargo Trevelin – FEIS – UNESP – Visitado em Qui,
03/05/12 - http://www.dee.feis.unesp.br/graduacao/disciplinas/langcpp/index.php?pagina=home
7. http://www.mspc.eng.br/info/cpp_oper_10.shtml
8. http://msdn.microsoft.com/pt-br/library/8e4x783s(v=vs.90).aspx
9. http://pt.wikipedia.org/wiki/Operadores_em_C_e_C%2B%2B#Operadores_aritm.C3.A9ticos
10. http://pt.wikibooks.org/wiki/Programar_em_C
11. Wikipedia, http://wikipedia.org, visitado em Dom, 06/504/12.
http://pt.wikipedia.org/wiki/Operadores_em_C_e_C%2B%2B
12. http://www.tiexpert.net/programacao/c/math.php
13. http://www.cprogramming.com/tutorial/c/lesson3.html
14. http://www.cplusplus.com/articles/EywTURfi/
15. http://pt.wikiversity.org/wiki/Curso_de_C%2B%2B/Operadores
16. http://msdn.microsoft.com/pt-br/library/8e4x783s(v=vs.90).aspx
17. http://en.cppreference.com/w/
18. http://www.java2s.com/Code/Cpp/Console/CatalogConsole.htm
19. http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1048380213&id=1043284385
20. http://www.digitalmars.com/rtl/conio.html
21. http://www.dei.isep.ipp.pt/~pbsousa/aulas/ano_0/2006_07/c/Sebenta-cpp-03-2006.pdf
22. http://publications.gbdirect.co.uk/c_book/the_c_book.pdf
Linguagem de Programação C++