Universidade Federal Rural do Semi-Árido Departamento de Ciências Ambientais Programação Aplicada à Engenharia Aula 09: Funções Silvio Fernandes 2009.1 1
Introdução A melhor maneira de desenvolver e manter um grande programa é construí-lo a partir de pequenas partes ou componentes Técnica Dividir para Conquistar Os módulos em C++ são chamados funçõese classes Combinação entre funções novas que o programador escreve e funções préempacotadas da biblioteca padrão 2
Introdução Funções definem tarefas específicas que podem ser usadas em muitos pontos de um programa Um função é invocada(executar a tarefa designada por ela) por uma chamada de função Uma chamada de função especifica o nome da função e fornece informações (argumentos) necessária para a função executar 3
Introdução Uma analogia: o chefe (chamador de função) pede para um funcionário (função chamada) executar uma tarefa e retornar(devolver) os resultados main worker1 worker2 worker3 worker4 worker5 4
Funções da biblioteca matemática Permitem o programador executar cálculos matemáticos comuns As funções normalmente são chamadas escrevendo o nome da função seguido pelo parêntese esquerdo, depois pelo argumento (ou uma lista separados por vírgula) e o parêntese direito cout << sqrt(900.0); 5
Funções da biblioteca matemática A função sqrt é chamada para calcular a raiz quadrada de 900.0. Essa função recebe um double e retorna um double Todas as funções da biblioteca matemática retornam double Para usar as funções da biblioteca matemática, inclua o arquivo de cabeçalho <cmath> ou <math.h> 6
Funções da biblioteca matemática Os argumentos de funções podem ser constantes, variáveis ou expressões Se c1 = 13.0, d = 3.0 e f = 4.0, o comando cout << sqrt(c1+d*f); Calcula e imprime a raiz quadrada de 25, ou seja, 5 A seguir alguma funções da biblioteca matemática, onde as variáveis xe ysão double 7
Funções da biblioteca matemática Método Descrição Exemplo ceil( x ) arredonda x para o menor inteiro não menor que x ceil( 9.2 ) é 10.0 ceil( -9.8 ) é -9.0 cos( x ) co-seno trigonométrico de x (radianos) cos( 0.0 ) é 1.0 exp( x ) função exponencial e x exp( 1.0 ) é 2.71828 fabs( x ) valor absoluto de x fabs( 5.1) é 5.1 fabs( -8.6) é 8.6 floor( x ) arredonda xpara o maior inteiro não maior que x floor( 9.2 ) é 9.0 floor( -9.8 ) é -10.0 fmod( x, y ) resto de x/y como ponto flutuante fmod(13.657, 2333) é 1.992 log( x ) logaritmo natural de x (base e) log(2.718282 ) é 1.0 log10( x ) logaritmo de x (base 10) log10( 100.0 ) é 2.0 pow( x, y ) x elevado à potência de y pow( 2, 7 ) é 128 sin( x ) seno trigonométrico de x (em radianos) sin( 0.0 ) é 0 sqrt( x ) raiz quadrada de x sqrt( 900.0 ) é 30.0 tan( x ) tangente trigonométrica de x (radianos) tan( 0.0 ) é 0 8
Definições de funções Todas as variáveis declaradas em definições de função são variáveis locais elas só são conhecida na função na qual são definidas A maioria das funções tem uma lista de parâmetrosque provêem os meios para transferir informações entre funções Os parâmetros de uma função também são variáveis locais 9
Definições de funções Cada programa consiste em uma função main que chama as funções da biblioteca padrão ou definidas pelo programador para realizar as tarefas #include <iostream> int square( int ); //protótipo da função int main(){ for ( int x = 1; x <= 10; x++ ) cout << square( x ) << " ; cout << endl; return 0; } // Definição da função int square( int y ){ return y * y; } 10
Definições de funções O formato de uma definição de função é tipo do valor de retorno nome da função(lista de parâmetros){ } declarações e comandos //corpo da função ou bloco Um tipo de retorno voidindica que a função não retorna um valor A lista de parâmetros é separada por vígula, incluindo o tipo de cada parâmetro. Se a função não possui parâmetros a lista é voidou simplesmente vazia 11
Definições de funções Há três maneiras de retornar o controle para o ponto no qual a função foi chamada return; //para funções void Se a função não retorna nenhum valor o } indica fim da função então é retornado returnexpressao; // quando a função retorna algum valor como resultado 12
Protótipos de Funções Diz ao compilador o nome da função, o tipo dos dados retornados pela função, o número de parâmetros que a função espera receber, os tipos dos parâmetros e a ordem na qual esses parâmetros são esperados Ex: int maximum(int, int, int); 13
Protótipos de Funções Os protótipos permitem o compilador converter tipos automaticamente A tabela a seguir classifica os tipos do maior tipo para menor tipo 14
Protótipos de Funções Tipos de Dados long double double float unsigned long int sinônimo de unsigned long long int sinônimo de long unsigned int sinônimo de unsigned int unsigned short int sinônimo de unsigned short short int sinônimo de short unsigned char char bool false torna-se 0, true torna-se 1 15
Arquivos de cabeçalho Cada biblioteca padrão tem um arquivo de cabeçalhocorrespondente contendo os protótipos de todas as funções daquela biblioteca e definições dos vários tipos de dados e constantes necessários por elas Os arquivos de cabeçalho terminam com.h Os arquivos de cabeçalho definidos pelo programador deve terminar com.h 16
Principais arquivos de cabeçalho Arquivo de cab. Explicação <cassert> <cctype> <cfloat> <climits> <cmath> <cstdio> <cstdlib> Contém macros e informações para adicionar diagnósticos que ajudam o programador a realizar depuração. Ver. antiga <assert.h> Contém protótipos para funções que examinam caracteresem busca de determinadas propriedades dos caracteres e para funções que podem ser usadas para converter letras maiúsculas em minúsculas e vice-versa. Ver. antiga <ctype.h> Contémlimites do sistema para o tamanho dos números de ponto flutuante. Ver. antiga <float.h> Contém os limites do sistema para os tamanhosdos números inteiros. Ver. antiga <limits.h> Contém protótipos de funçõesda biblioteca matemática. Ver. antiga <math.h> Contém proptótiposde funções de entrada/saídae as informações utilizadas por elas. Ver. antiga <stdio.h> Protótipos de funções para conversãode números em texto e texto em números, alocação de memória, números aleatórios e outras funções com várias finalidades. Ver. antiga <stdlib.h> 17
Principais arquivos de cabeçalho Arquivo de cab. <cstring> <ctime> <iostream> <iomanip> <fstream> <utility> <vector>,<list>, <deque>, queue>, <stack>, <zmap>, <set>, <bitset> Explicação Protótipos de funções para processamento de strings. Ver. antiga <string.h> Funções para manipular horários e datas. Ver. antiga <time.h> Funções padrão de entrada e saída. Ver. antiga <iostream.h> Funções para os manipuladores de streamque permitem a formatação de dados. Ver. antiga <iomanip.h> Funções que executam operações de entrada e saída de arquivos em disco. Ver. antiga <fstream.h> Contém classes e funções que são usadas por muitos arquivosde cabeçalho da biblioteca padrão Contém classes que implementam contêineres, usados para armazenar dados durante a execução de um programa. 18
Principais arquivos de cabeçalho Arquivo de cab. Explicação <functional> <memory> <iterator> <algorthm> <exception> <stdexcept> <string> <sstream> <typeinfo> Contém classes e funções usadas por algoritmosda biblioteca padrão Contém classes e funções usadas paraalocar memória para os contêineres da biblioteca padrão Contém classes para acessar dados nos contêineres da biblioteca padrão Contém funções para manipular dados nos contêineres Estes arquivos contêm classes que são usadas para tratamento de exceções(erros) Contém a definição da classe string Funções que realizam operações de entrada e saída para strings na memória Contém classes para a identificação de tipos em tempo de execução 19
Geração de números aleatórios Considere o seguinte comando i = rand(); A função rand()gera um inteiro entre 0 e RAND_MAX(constante definida em <cstdlib>) Quando a função rand() é chamada, todos os números entre 0 e RAND_MAX terão a mesma probabilidade Para produzir inteiros no intervalo de 0 a 5 usamos o operador módulo (%) junto com rand() rand() % 6 20
Geração de números aleatórios Isso é chamado ajuste de escalae o 6 o fator de escala Ex: Simular 20 lançamentos de um dado de 6 faces #include <iostream.h> #include <iomanip.h> #include <cstdlib.h> int main(){ for ( int i = 1; i <= 20; i++ ) { cout << setw( 10 ) << ( 1 + rand() % 6 ); if ( i % 5 == 0 ) cout << endl; } return 0; } 21
Geração de números aleatórios A função rand() gera números pseudo-aleatórios A função srandda biblioteca padrão utiliza um argumento como sementeda função randde forma a produzir uma seqüência diferentes de números aleatórios a cada execução do programa O protótipo de srand é encontrado em<cstdlib> Se desejássemos randomizar sem necessidade de fornecer uma semente cada vez, poderíamos usar srand( time (0) ); Isso faz com que o computador leia seu relógio para obter automaticamente o valor da semente. A função timeretorna a hora de calendário atual e está na biblioteca <ctime> 22
Enum Cria um tipo definido pelo usuário chamado de enumeração enum nome_novo_tipo {valor1, valor2, valor3}; Os valores são constantes inteiras representados pelos idetificadores (valor1,...) Ex: enum Meses {JAN = 1, FEV, MAR, ABR, MAI, JUN, JUL, AGO, SET, OUT, NOV, DEZ}; 23
Regras de Escopo A parte do programa na qual um identificador tem significado é conhecida como seu escopo Escopo de arquivo Identificadores declarados fora de qualquer função. Eles são conhecidos por todas as funções (variáveis globais, definições e protótipos de funções) Escopo de bloco Identificadores declarados entre {} (variáveis locais, vistas só dentro do bloco) 24
Regras de Escopo Escopo de função Identificadores declarados dentro de funções Escopo de protótipo de função Se identificadores forem usados no protótipo de uma função (lista de parâmetros), será ignorado pelo compilador. O protótipo de função necessita apenas dos tipos dos parâmetros. 25
Recursão Função recursiva é uma função que chama a si mesma, direta ou indiretamente Quando uma função chama a si mesma, essa nova chamada pode chamar uma terceira e assim por diante Quando a última cópia da função retorna o resultado (através de return), para aquela que chamou. E assim por diante até a primeira chamada 26
Fatorial iterativo (não recursivo) Fatorial de um inteiro não-negativo n (n!) é n * (n-1) * (n-2) *... * 1 Com 1! e 0! Igual a 1, por definição O fatorial de numberpode ser calculado como fatorial = 1; for(int counter = number; counter >= 1; counter-- ){ fatorial *= counter; } Chega-se a definição recursiva n! = n*n(n-1)! 27
Fatorial recursivo Função recursiva do fatorial unsigned long factorial ( unsigned long number){ if (number <= 1) //caso base return 1; else return number * factorial(number -1); } 28
Fatorial recursivo Calculo recursivo de 5! 120 é o valor final 5! 5 * 4! 4 * 3! 3 * 2! 2 * 1! 1 5! 5 * 4! 5! = 5*4*3*2*1=120 é o valor retornado 4 * 3! 4! = 4*3*2*1=24 é o valor retornado 3 * 2! 3! = 3*2*1=6 é o valor retornado 2 * 1! 1 2! = 2*1 é o valor retornado 1 é o valor retornado Processamento de chamadas recursivas Valores retornados de cada chamada 29
Referência DEITEL, H. M.; DEITEL, P. J. C++ como programar. 3 ed. Porto Alegre: Bookman, 2001. 30