Baixe o app para aproveitar ainda mais
Prévia do material em texto
ECT1203 Linguagem de Programação 2014.2 Prof. Caroline Rocha Aula 11 – Funções Universidade Federal do Rio Grande do Norte Escola de Ciências e Tecnologia Hora de silenciar o celular • Manter o celular sempre desligado/silencioso quando estiver em sala de aula • Nunca atender o celular em sala de aula Objetivo da Aula • Introduzir o conceito de funções em C++ • Motivar o uso de funções Uma função é ... Um conjunto de comandos agrupados em um bloco, destinado a realizar uma tarefa particular, que recebe um nome e através deste pode ser ativado. Será que isso é tão novo assim? Exemplos de funções • sqrt(valor) • pow(x,2) • rand() • cos(ang) OBS: cin e cout são objetos, a compreensão de objetos está fora do escopo da nossa disciplina. Curiosidade: Alguém sabe como o computador calcula o cosseno de um ângulo? Exemplo: cos(68) Resposta: Polinômio de Mclaurin Pergunta: eu preciso conhecer o polinômio de Mclaurin para usar a função cos() nos meus programas? Para que servem as funções? • Dividir um problemas maior em vários menores, simplificando e organizando o código; • Reduzir o tamanho do programa; • Permitir reaproveitamento de código; • Permitir a alteração de um trecho de código de uma forma mais rápida; • Para que os blocos do programa não fiquem grandes demais e mais difíceis de entender; • Separar o programa em partes(blocos) que possam ser logicamente compreendidos de forma isolada; ... A função pow(x,y) Como será o algoritmo da função pow()? pow(2,3) = 23 = 2*2*2 pow(5,4) = 54 = 5*5*5*5 pow(x,2) = x2 = x*x pow(a,b) = ab = a multiplicado por ele mesmo, uma quantidade b de vezes int prod = 1; for(int i=0; i<y; i++){ prod *= x; } Como o compilador faz para executar o algoritmo acima quando encontra pow(x,y) no código?? A função pow(x,y) Como o compilador raciocina pow()? Não conheço esse comando... Depois dele tem algo entre parênteses, então é uma função!! #include <iostream> #include <cmath> using namespace std; int main ( ) { int a, b, result; a = 2; b = 3; result = pow(a,b); cout << result; return 0; } Como o compilador raciocina Será uma função criada pelo usuário?? Não é. #include <iostream> #include <cmath> using namespace std; int main ( ) { int a, b, result; a = 2; b = 3; result = pow(a,b); cout << result; return 0; } Como o compilador raciocina Será que está na biblioteca iostream? Não! #include <iostream> #include <cmath> using namespace std; int main ( ) { int a, b, result; a = 2; b = 3; result = pow(a,b); cout << result; return 0; } Como o compilador raciocina Está na biblioteca cmath? Se não estiver lá, não tem em lugar nenhum e esse programa tem um erro. #include <iostream> #include <cmath> using namespace std; int main ( ) { int a, b, result; a = 2; b = 3; result = pow(a,b); cout << result; return 0; } Como o compilador raciocina int pow(int x, int y){ int prod = 1; for(int i=0; i<y; i++) prod = prod * x; return prod; } Processamento Entrada Saída Qual é a entrada e a saída? Como o compilador raciocina int pow(int x, int y){ int prod = 1; for(int i=0; i<y; i++) prod = prod * x; return prod; } Quem são eles no programa? Processamento base expoente exponencial Como o compilador raciocina Quem são x e y? Onde devo armazenar prod? #include <iostream> #include <cmath> using namespace std; int main ( ){ int a, b, result; a = 2; b = 3; result = pow(a,b); cout << result; return 0; } int pow(int x, int y){ int prod = 1; for(int i=0; i<y; i++) prod = prod * x; return prod; } Como o compilador raciocina x é a y é b prod é result #include <iostream> #include <cmath> using namespace std; int main ( ){ int a, b, result; a = 2; b = 3; result = pow(a,b); cout << result; return 0; } int pow(int x, int y){ int prod = 1; for(int i=0; i<y; i++) prod = prod * x; return prod; } Chamando uma função Chamar uma função é o meio pelo qual solicitamos que o programa desvie o controle, passe a executar as instruções da função e, ao término desta, volte o controle para a posição seguinte à da chamada à função. • A chamada deve respeitar a definição da função: nome, entrada e saída. • A sintaxe da instrução de chamada é a mesma tanto para funções escritas por outros programadores como para as que escrevemos. Chamada a função e controle de fluxo #include <iostream> #include <cmath> using namespace std; int main ( ){ int a, b, result; a = 2; b = 3; result = pow(a,b); cout << result; return 0; } int pow(int x, int y){ int prod = 1; for(int i=0; i<y; i++) prod = prod * x; return prod; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Definindo sua própria função • A primeira linha é o cabeçalho da definição da função. • tipo_da_função é o tipo do valor retornado por meio do comando return. tipo_da_função nome_da_função (lista de parâmetros) { corpo da função } int max(int a, int b){ if(a > b) return a; else return b; } Definindo sua própria função • A lista de parâmetros, também chamada de lista de argumentos, é opcional. A função pode não ter entrada (void). tipo_da_função nome_da_função (lista de parâmetros) { corpo da função } int max(int a, int b){ if(a > b) return a; else return b; } O comando return Sintaxe do comando return: A instrução return expressão; tem os seguintes efeitos: 1) avaliação da expressão 2) conversão automática do resultado da expressão para o tipo da função 3) retorno do resultado 4) término da execução da função e retorno do controle para a instrução seguinte do código de chamada • return; • return expressão; • return (expressão); O comando return Função com um comando return Função com mais de um comando return int le_numero(void){ int numero; cout <<"Digite um numero inteiro: "; cin >> numero; return numero; } int max(int a, int b){ if(a > b) return a; else return b; } O comando return • O valor de retorno é obtido através de uma chamada à função. Por exemplo: x = le_numero(); y = le_numero(); O comando return • Existem funções que não retornam nenhum valor. • Essas funções possuem tipo de retorno void. void imprime(int inicio, int fim){ for(int i=inicio; i<=fim; i++) cout << i << endl; } O comando return • Funções do tipo void podem ter comando return sem expressão, servindo para terminar a execução da função. • Em funções do tipo void, o comando return não é obrigatório. • Uma função sem comando return termina quando encontra a chave de fechamento. • Uma função não pode ser chamada sem antes ter sido declarada. • No exemplo, temos a declaração das funções: Declaração de uma função A declaração de uma função, dita protótipo da função, é uma instrução, geralmente colocada no iníciodo programa, que estabelece o tipo da função e os argumentos que ela recebe. • a função le_numero() é do tipo int e não recebe argumentos • a função max() é do tipo int e recebe como argumento dois valores do tipo int int le_numero(void); int max(int a, int b); Funções definidas pelo programador • Em geral, o nome de uma função aparece em três lugares em um programa: 1) na declaração (protótipo/assinatura) 2) na definição 3) na chamada Declaração de funções (protótipos) Chamadas de funções Definição de funções #include <iostream> using namespace std; int le_numero(void); int max(int a, int b); int main(){ int x, y; x = le_numero(); y = le_numero(); cout<<"Maior valor: “<< max(x,y); return 0; } int le_numero(void){ int numero; cout<<"Digite um numero inteiro:"; cin >> numero; return numero; } int max(int a, int b){ if(a > b) return a; else return b; } Observações 1) No protótipo de uma função, o seu tipo, o número e o tipo dos parâmetros devem corresponder àqueles do cabeçalho da definição. 2) O nome dos parâmetros podem ser omitidos na declaração. 3) Se uma função não tem parâmetros, pode-se declarar a lista de parâmetros como (void) ou simplesmente () Outras observações 1) Se uma função é definida antes da sua primeira chamada, esta não precisa ser declarada. 2) O comando return pode retornar somente um único valor. 3) Se uma função não tem valor de retorno, deve-se indicar o tipo de retorno como void. 4) Não se pode definir funções dentro de uma outra função. Parâmetros de uma função • São visíveis apenas dentro da função: são criadas na entrada e destruídas na saída da função. • No momento da chamada de uma função, o número e o tipo dos parâmetros devem corresponder à declaração da função. • Os parâmetros são convertidos automaticamente para os tipos da declaração antes de serem passados à função. Variáveis locais que são inicializadas pelos valores passados na chamada da função. Passagem de parâmetros • Em geral, pode-se passar parâmetros para funções de duas maneiras: 1) Por valor: o valor do argumento é copiado para o parâmetro e as alterações feitas no parâmetro não tem efeito sobre a variável usada na chamada da função 2) Por referência: o endereço de uma variável copiado para o parâmetro, assim as mudanças feitas no parâmetro afetam a variável usada na chamada da função Passagem de parâmetros por valor o valor de n é copiado para o parâmetro x da função quadrado() na atribuição, apenas a variável local x é modificada a variável n, usada para chamar quadrado(), ainda tem o valor 10 Passagem de parâmetros por valor Passagem de parâmetros por referência A referencia de n é passado para o parâmetro x da função quadrado() na atribuição, a variável referenciada por x é modificada a variável n, usada para chamar quadrado(), teve seu valor modificado Operador unário de referência & Escopo de variáveis • As variáveis podem ser declaradas em três lugares: 1) dentro de funções variáveis locais 2) como parâmetros de funções parâmetros formais 3) fora de todas as funções variáveis globais O escopo de uma variável é o bloco de código onde esta variável é válida (visível). Variáveis locais void funcao1(void){ int x; x = -10; } void funcao2(void){ int x, y; x = 2; y = 18; } • São visíveis apenas dentro de seu próprio bloco de código. Um bloco de código é delimitado por { }. • O espaço de memória usado pela variável é liberado na saída do bloco de código. Variáveis globais • São visíveis no programa inteiro. • O espaço de memória fica reservado durante toda a execução do programa. Variáveis globais São úteis quando o mesmo dado é usado em muitas funções Ocupam espaço de memória mesmo quando desnecessárias Podem levar a erros no programa Variáveis globais x locais Qual a diferença entre as funções? int produto(int x, int y) { return (x * y); } int x, y; int produto(void) { return (x * y); } Variáveis globais x locais int produto(int x, int y) { return (x * y); } int x, y; int produto(void) { return (x * y); } Qual a diferença entre as funções? Tipos de variáveis • globais: são variáveis definidas fora de qualquer função. Por este motivo elas são visíveis por todas as funções do programa. A sua vida vai do início do programa até o fim dele. • estáticas: são variáveis definidas dentro de uma função com palavra static antes do tipo da variável. São visíveis apenas dentro da função em que foram definidas. A sua vida vai do início do programa até o fim dele • locais: são variáveis definidas dentro de uma função. Por este motivo, elas são visíveis apenas dentro da função em que foram definidas. Ao contrário das variáveis estáticas, as variáveis locais começam a existir quando uma função começa a ser executada e deixam de existir quando a função termina. Tipos de variáveis • globais: são variáveis definidas fora de qualquer função. Por este motivo elas são visíveis por todas as funções do programa. A sua vida vai do início do programa até o fim dele. • estáticas: são variáveis definidas dentro de uma função com palavra static antes do tipo da variável. São visíveis apenas dentro da função em que foram definidas. A sua vida vai do início do programa até o fim dele. • locais: são variáveis definidas dentro de uma função. Por este motivo, elas são visíveis apenas dentro da função em que foram definidas. Ao contrário das variáveis estáticas, as variáveis locais começam a existir quando uma função começa a ser executada e deixam de existir quando a função termina. Tipos de variáveis • globais: são variáveis definidas fora de qualquer função. Por este motivo elas são visíveis por todas as funções do programa. A sua vida vai do início do programa até o fim dele. • estáticas: são variáveis definidas dentro de uma função com palavra static antes do tipo da variável. São visíveis apenas dentro da função em que foram definidas. A sua vida vai do início do programa até o fim dele. • locais: são variáveis definidas dentro de uma função. Por este motivo, elas são visíveis apenas dentro da função em que foram definidas. Ao contrário das variáveis estáticas, as variáveis locais começam a existir quando uma função começa a ser executada e deixam de existir quando a função termina. Tipos de variáveis • parâmetros: funcionam exatamente como variáveis locais, tanto com relação a visibilidade como com relação a escopo. A única diferença é que elas recebem valores ou endereços do programa principal. • variáveis dinâmicas: dinâmicas são criadas no heap e têm sua vida determinada pela alocação e a desalocação de seu espaço. Sua visibilidade está relacionada com seu endereço de memória. Tipos de variáveis • parâmetros: funcionam exatamente como variáveis locais, tanto com relação a visibilidade como com relação a escopo. A única diferença é que elas recebem valores ou endereços do programa principal. • variáveis dinâmicas: dinâmicas são criadas no heap e têm sua vida determinada pela alocação e a desalocação de seu espaço. Sua visibilidade está relacionada com seu endereço de memória. LIVRE Gerenciamento de memória em C++ Código do programa Variáveis globais e estáticas Heap Pilha • Quando uma função é chamada, um espaço é alocado na pilha para esta função,espaço este serve para guardar as variáveis locais e parâmetros da função. • Quando uma função é terminada e o programa volta à função chamadora, a área de pilha desta função é desalocada. Assim, suas variáveis locais e parâmetros desaparecem. Exercício Faça um programa que calcula a soma do n primeiros números primos, onde n é fornecido pelo usuário. #include <iostream> #include <cmath> using namespace std; int primo(int); int soma_primos(int); int main(){ int n; cout << “Digite um número não-negativo: ”; cin >> n; cout << “Soma dos ” << n << “ primeiros primos: ” << soma_primos(n); return 0; } int primo(int m){ int n = (int) sqrt(m); for(int i=2; i<=n; i++) if(m%i == 0) return 1; return 0; } int soma_primos(int n){ int soma = 0, cont = 0, m = 2; while(cont < n){ if( primo(m) ){ soma += m; cont++; } m++; } return soma; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 Exercício Faça um programa que calcula as raízes de uma equação do segundo grau , onde a, b e c são números reais fornecidos pelo usuário. Observação: use funções para calcular e imprimir o resultado. )0( 2 cbxax
Compartilhar