Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
ECT1203 Linguagem de Programação 2012.1 Prof. Diego Rodrigues de Carvalho Profa. Idalmis Milián Sardina Prof. Luiz Eduardo Cunha Leite Prof. Marconi Câmara Rodrigues Prof. Marcelo Henrique Ramalho Nobre Aula 10 – 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 Revisão da aula passada Strings: É um vetor de caracteres char nome[50]; Principal diferença para os vetores numéricos: usa o ‘\0’ para marcar o final do espaço utilizado. Leitura e escrita em strings. Leitura: gets(nome); Escrita: puts(nome); Comandos de manipulação de strings Copiar: strcpy(nome,”joao”); Concatenar: strcat(nome,sobrenome); Tamanho utilizado: strlen(nome); Comparação: strcmp(nome1,nome2); Objetivo da Aula Introduzir o conceito de funções em C++ Motivar o uso de funções Esses são os objetivos da aula Uma função em C++ é ... 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) gets(nome) strcat(nome,sobrenome) 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? ex: 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? Para dividir um problemas maior em vários menores, simplificando e organizando o código; Reduzir o tamanho do programa; Para permitir reaproveitamento de código; Para 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; Para separar o programa em partes(blocos) que possam ser logicamente compreendidos de forma isolada; Etc. A função pow() 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 Como será esse algoritmo? pow(x,y) int prod =1,i; for(i=0;i<y;i++){ prod *=x; } Como o compilador faz para executar o algoritmo acima quando encontra pow(x,y) no código?? Como o compilador raciocina pow? não conheço esse comando... Depois dele tem algo entre parênteses, então é uma função!! Como o compilador raciocina Será uma função criada pelo usuário?? Não é. Como o compilador raciocina Será que está na biblioteca* iostream?. *Biblioteca = Conjunto de funções. Como o compilador raciocina Será que está na biblioteca math.h? Se não estiver lá não tem em canto nenhum e esse programa tem um erro. Como o compilador raciocina ????? Como o compilador raciocina Modelo de processamento. Quem são as entradas? E as saídas? Processamento Entrada Saída Como o compilador raciocina No algoritmo, que é base, expoente e exponencial? Processamento Base Exponencial Expoente Como o compilador raciocina Quem são eles no programa? Processamento Base(x) Exponencial(prod) Expoente(y) Como o compilador raciocina Quem são eles no programa? Processamento Base(x) Exponencial(prod) Expoente(y) Como o compilador raciocina Quem é x,y? onde devo armazenar prod? Como o compilador raciocina x é a y é b prod é result Definindo uma 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 } Definindo uma 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 } O comando return Sintaxe de um comando return: A instrução return expressão; tem os seguintes efeitos: avaliação da expressão conversão automática do resultado da expressão para o tipo da função retorno do resultado 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 No exemplo anterior, temos a definição das funções: Função com um comando return Função com mais de um comando return O comando return Funções do tipo void podem ter um 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 O valor de retorno é obtido através de uma chamada à função, como no exemplo: Funções definidas pelo usuário Declaração e definição de funções Em geral, o nome de uma função aparece em três lugares em um programa: na declaração (protótipo/assinatura) na definição na chamada Exemplo 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 n1, int n2); int main(void) { int x,y; x = le_numero(); y = le_numero(); cout << "\nO maximo e:" << max(x,y); return 0; } int le_numero(void) { int numero; cout << "\nDigite um numero inteiro: "; cin >> numero; return numero; } int max(int n1, int n2) { if(n1 > n2) return n1; else return n2; } 30 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ício do programa, que estabelece o tipo da função e os argumentos que ela recebe. a função de nome le_numero() é do tipo int e não recebe argumentos a função de nome max() é do tipo int e recebe como argumento dois valores do tipo int Observações 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. O nome dos parâmetros podem ser omitidos na declaração. Se uma função não tem parâmetros, pode-se declarar a lista de parâmetros como (void) ou simplesmente () Outras observações Se uma função é definida antes da sua primeira chamada, esta não precisa ser declarada. O comando return pode retornar somente um único valor. Se uma função não tem valor de retorno, deve-se indicar o tipo de retorno como void Não se pode definir funções dentro de uma outra função. Escopo de variáveis As variáveis podem ser declaradas em três lugares: dentro de funções variáveis locais como parâmetros de funções parâmetros formais 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 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. nota: 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. exemplo Em alguns compiladores, programas com variáveis locais declaradas em outras partes do bloco de código não são compilados. No entanto, esse não é o caso no Dev C++. Mostrar exemplos de outros blocos de código usando o Dev C++. 35 Variáveis globais exemplo: São visíveis no programa inteiro. O espaço de memória fica reservado durante toda a execução do programa. #include <iostream> using namespace std; int lado; int area(void); int main(void) { cout << "\nDigite o lado do quadrado: "; cin >> lado; cout << "\nArea = " << area(); return 0; } int area(void) { return lado*lado; } 36 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 37 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); } 38 Variáveis globais x locais geral 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? específica * Usar o Dev C++ para mostrar como o escopo de variáveis locais prevalece sobre o de globais de mesmo nome. 39 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: 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 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 #include <iostream> using namespace std; int quadrado(int); int main(void) { int n = 10; cout << quadrado(n) << "\n"; cout << n << "\n"; return 0; } int quadrado(int x) { x = x * x; return x; } 42 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 & #include <iostream> using namespace std; int quadrado(int); int main(void) { int n = 10; cout << quadrado(n) << "\n"; cout << n << "\n"; return 0; } int quadrado(int x) { x = x * x; return x; } 43 Passagem de parâmetros por valor Considere o seguinte programa: Qual é o problema? #include <iostream> using namespace std; void troca(int, int); int main(void){ int a=3, b = 5; cout << "\na = "<<a<< " b = "<<b; troca(a,b); cout << "\na = "<<a<<" b = "<<b; return 0; } void troca(int a, int b) { int temp = a; a = b; b = temp; } 44 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. #include <iostream> #include <cmath> using namespace std; void resolve_equacao(float, float, float); int main(void){ float a, b, c; cout << "Este programa resolve equacoes do tipo ax^2 + bx + c = 0\n"; cout << "Digite os valores de a, b e c: "; cin >> a >> b >> c; resolve_equacao(a,b,c); return 0; } void resolve_equacao(float a, float b, float c){ float delta, x1, x2; if (a != 0) { delta = pow(b,2) - 4*a*c; cout << "DELTA: " << delta << "\n"; if(delta >= 0) { x1 = (-b+sqrt(delta))/(2*a); x2 = (-b-sqrt(delta))/(2*a); cout << "x1 = "<< x1 << " e x2 = "<< x2 << "\n"; } else cout << "Nao foi posssivel encontrar as raizes pois sao imaginarias"; } else if(b != 0){ x1 = -c/b; cout << "x = " << x1 << "\n"; } else cout << "Esta equacao nao tem solucao!\n"; } 46