Baixe o app para aproveitar ainda mais
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++
Compartilhar