Baixe o app para aproveitar ainda mais
Prévia do material em texto
Algoritmos Aula 9 - Funções Introdução Um dos grandes objetivos da programação de computadores é criar programas simples e que sejam facilmente entendidos por outras pessoas. Porém, é muito comum que os programas tenham 500, 1000 ou mais linhas de código. Às vezes este número é necessário; outras vezes percebemos que ele pode ser reduzido. Será que não existem partes de um programa que poderíamos separar e tratar como um programa à parte, ou um subprograma? Desta forma, toda vez que aquela parte fosse necessária, chamaríamos somente ela. Isso é possível e tem um nome: procedimentos e funções. E é isso que vamos ver nesta aula. Bons estudos! Situação-problema Para começar a nossa aula, vamos imaginar a seguinte situação... Imagine que você acabou de ser contratado por uma grande empresa que fabrica smartphones e você será um dos responsáveis por criar o software do telefone. Como o Android é bem popular aqui no Brasil, imagine que você vai ter que criar uma versão do Android para embutir no mais novo celular da empresa. Como você pensaria em desenvolver esse programa? Veja bem, o celular funciona como um grande laço: • Enquanto o botão de desligar não for acionado, espere algum comando do usuário; • Se o ícone de fazer ligação for pressionado, então abra a tela de chamadas; • Se o ícone do navegador for pressionado, então abra o navegador; • E assim por diante. Acontece que o programa do celular não é sequencial. Não podemos prever o que o usuário vai fazer, então precisamos criar subprogramas que são chamados à medida que o usuário faz uma determinada ação. Exemplo Por exemplo: executar o navegador, e depois que ele foi executado, o programa volta ao laço inicial, onde o programa espera a próxima ação ou o botão desligar é acionado. Basicamente é isso que fazemos quando temos um programa muito grande e temos a possibilidade de simplificá-lo: usando subprogramas, chamados de funções ou procedimentos. Aliás, as funções são o grande diferencial da linguagem C, que originou a linguagem C++. Ou seja, quando você tiver um problema muito grande, até mesmo em questões pessoais, tente dividi-lo em problemas menores, e desta forma, solucionando cada pequeno problema, a parte maior também será resolvida. Como as Funções e Procedimentos funcionam? Observe a figura a seguir: A figura basicamente explica o funcionamento de uma função ou procedimento. O procedimento é um grupo de comandos que realiza uma determinada tarefa específica que é executada quando o procedimento é chamado. Quando o programa principal chama o procedimento, o fluxo do programa é desviado para o procedimento, o qual é executado em seguida, e após a sua finalização, o procedimento volta à execução do programa principal normalmente. Já usamos um procedimento em alguns de nossos programas anteriores. Lembra-se do system(“cls”)? O que este comando faz? Na verdade é hora de ajustarmos nosso vocabulário: na verdade, system(“cls”) é um procedimento. Sendo assim, o que este procedimento faz? Veja o código a seguir: No código anterior, o programa segue o seu fluxo normal, imprime a mensagem “Digite o seu nome”, lê o valor do usuário e chama em seguida o procedimento system(“cls”). Internamente, a execução do programa é interrompida, o fluxo é desviado para o código do procedimento system(“cls”), o qual usa vários comandos internos para limpar a tela, e depois devolve o fluxo para o programa principal e imprime a mensagem “Olá... tudo bem?”. É que isso ocorre tão rápido e transparente para o usuário que dá a sensação de que o programa está ocorrendo sequencialmente, mas não está. Atenção É igual ao programa do celular de que falamos no início. Parece que é um programa sequencial, não é? Mas, no fundo, um programa para celular é na verdade um grande looping cheio de chamadas a procedimentos específicos, como por exemplo, fazer ligação, navegar na internet, executar a calculadora etc. Diferenças entre Funções e Procedimentos Agora, vamos supor que você está desenvolvendo um programa que vai trabalhar com algumas operações matemáticas, como por exemplo, calcular o MDC entre dois números, verificar se um número é primo etc. Poderíamos criar procedimentos para isso, correto? Mas temos algumas melhorias que podemos fazer nos procedimentos. Por exemplo, criar procedimentos que funcionariam assim: Esse retorno pode ser então usado no programa que chamou o procedimento. Então, temos aqui a função. A função é um procedimento que possui obrigatoriamente um retorno. O procedimento não possui retorno. Lembra que o system(“cls”) é um procedimento? Que retorno ele devolve ao programa principal? Nenhum! Logo, é um procedimento. Atenção Daqui para a frente, não vamos mais usar no nosso vocabulário de C++ a palavra “procedimento”. Uma vez que o procedimento é uma função, mas que não retorna valor, então vamos usar apenas “função”, combinado? Por que usamos Funções? Existem várias vantagens de se usar funções. Vejamos: • Para uma melhor legibilidade, como já citamos; • Para modularizar o programa em partes menores e mais funcionais; • Para melhorar a manutenção e permitir a alteração de uma determinada parte do código de uma maneira mais rápida; • Para evitar que uma parte do código seja repetida várias vezes em um programa; • Para o reaproveitamento de código: uma função que você faz pode ser usada por outro programador. Funções em C++ A sintaxe de uma função em C++ é a seguinte: Vejamos um exemplo aqui Imagine que, em um programa que está desenvolvendo, você precise que o usuário digite a tecla “c” para poder continuar o programa. Como já vimos, isto pode ser feito dentro de um laço. Uma ideia é criar uma função, que chamaremos de teclac() para realizar esta tarefa. Observe a implementação da função: 1 void teclac(){ 2 int tecla; 3 cout<<"*** Pressione <c> para continuar ***"; 4 do { 5 tecla = getch(); 6 if (tecla!=99){ 7 cout<<"\nDigite <c>"<<endl; 8 } 9 } while (tecla!=99); 10 } O programa principal teria um código parecido com este: int main(void){ ... teclac(); ... teclac(); ... teclac(); ... return 0; } Viu que, se não tivesse a função, teríamos de repetir o loop toda vez? Na seção Notas, abordaremos a função getch Parâmetros Na função teclac() que fizemos, você deve ter notado que a chamada dela no programa principal é muito simples. É como chamar a função getch(): basta usá-la e pronto! Função getch() Tem como objetivo ler uma tecla digitada pelo usuário e retornar o valor numérico da tecla. Cada tecla no computador tem um código, e o código da tecla “c” é 99. A função getch() é definida na biblioteca conio.h, e para usar a função, é necessário incluir a biblioteca no programa. Mas algumas funções precisam receber valores para serem executadas. Como já vimos, uma função para calcular a raiz quadrada de um número precisa receber o número para que a função seja executada. Algumas funções, como o exemplo do MDC, precisam de dois ou mais parâmetros, enfim, para a linguagem C++ ficar mais versátil, o uso de parâmetros é permitido. Os parâmetros possibilitam que seja definido sobre quais dados a função deve funcionar. Para definir os parâmetros de uma função, é preciso que o tipo da variável seja declarado antes do nome da variável. Se houver mais do que um, os outros parâmetros são separados porvírgulas. Veja o exemplo a seguir: Os parâmetros da função, quando estão na declaração da função, são chamados de parâmetros formais (como o float a, int b na função anterior). Na chamada da função, são chamados de parâmetros reais ou argumentos. Atenção Os parâmetros devem ser passados de acordo com sua posição. Ou seja, o tipo do primeiro argumento (na chamada) tem que “casar” com o tipo do primeiro parâmetro formal (na declaração da função); o tipo do segundo argumento “casa” com o segundo tipo do parâmetro formal, e assim por diante. Os nomes das variáveis da chamada e da declaração não precisam ser os mesmos. Vejamos um exemplo aqui 1 #include <iostream> 2 using namespace std; 3 4 void soma(int n1, float n2){ 5 float resultado; 6 resultado = n1+n2; 7 cout<<"Soma = "<<resultado<<"\n"; 8 } 9 10 int main (void){ 11 int a = 100; 12 float b = 25.5; 13 soma(a,b); 14 } Na linha 13, os argumentos são 100 (int) e 25.5 (float). A função é chamada e o valor 100 é copiado na variável n1, e o valor 25.5 é copiado na variável n2. Portanto, os tipos da chamada “casam” com a ordem dos tipos da declaração da função e esta é executada. Dentro da função, o compilador não sabe os valores das variáveis a e b; somente de n1, n2 e resultado, que foi criada dentro da função. O resultado desse programa é esta tela: Retorno de uma Função A função soma que acabamos de mostrar apresenta uma mensagem informando o resultado da conta dentro da função (veja a linha 7). A função tem que fazer exatamente o que o nome dela propõe. Se estamos fazendo uma soma, então ela deveria fazer somente a soma, e o resultado, o próprio programa principal se encarrega de fazer. Porém, dessa forma vamos precisar que a função retorne um valor para quem a chamar (neste caso, o programa principal). Essa palavra é obrigatória para as funções que não retornam valor. As que retornam valor, no lugar da palavra void, terão que indicar o tipo do retorno, como mostra a função soma() abaixo, agora modificada: Veja que agora a declaração da função, na linha 4, tem o tipo do retorno da função: float. E obrigatoriamente temos que ter a palavra reservada return dentro da função para indicar o valor que será devolvido como resultado da função. Nesse caso, o valor é devolvido e atribuído à variável retorno na linha 13.Portanto, quando não tiver valor de retorno, a função tem um void na sua declaração. Quando retornar algum valor, ela tem que ter o tipo do retorno e usar o return dentro da função. Escopo de Variáveis O escopo de uma variável é o bloco de código onde a variável é válida. Desta forma, temos algumas considerações a fazer: • As variáveis são válidas nos blocos em que foram definidas • As variáveis que são definidas dentro de uma função são chamadas de variáveis locais • Os parâmetros formais de uma função valem somente dentro da função • Uma variável que foi definida dentro de uma função não é acessível em outras funções, mesmo se os nomes forem exatamente iguais Vejamos um exemplo aqui Veja o exemplo a seguir e observe a variação do valor da variável b dentro e fora de cada função: 1 #include <iostream> 2 using namespace std; 3 4 void funcao1(){ 5 int b; 6 b=-10; 7 cout<<"Valor de B dentro da funcao1: "<<b<<endl; 8 } 9 10 void funcao2(){ 11 int b; 12 b=1000; 13 cout<<"Valor de B dentro da funcao2: "<<b<<endl; 14 } 15 16 int main (void){ 17 int b; 18 b=5; 19 cout<<"Valor de B: "<<b<<endl; 20 b=500; 21 funcao1(); 22 cout<<"Valor de B: "<<b<<endl; 23 b=300; 24 funcao2(); 25 cout<<"Valor de B: "<<b<<endl; 26 } 2 O resultado do programa é: Finalizando O estudo das funções em C++ é muito amplo, e nosso objetivo aqui é iniciar os seus estudos. Ao longo de todas as aulas, usamos as funções o tempo todo, e talvez você não tenha notado que o próprio programa principal em C++ é uma função. Por isso usamos o return 0 no final dos programas: para retornar o valor 0 a quem chamou o programa; neste caso, o sistema operacional. O possui milhares de funções predefinidas, e saber usá-las é muito importante. Desta forma, evitamos a “reinvenção da roda”, como por exemplo, desenhar figuras de funções matemáticas, funções de estruturas de dados, de manipulação de strings etc. Já existe muita coisa pronta. Basta saber em qual biblioteca a função desejada se encontra e incluir a biblioteca corretamente dentro do programa. Como foi o caso da função getch(). Atividades Para testar seus conhecimentos do que estudamos até aqui, que tal fazermos uns exercícios? 1. É possível que uma função chame outra função? Até agora, vimos que o programa principal chama uma função, e depois que ela é executada, o programa volta ao fluxo principal. Mas será que existem situações nas quais uma função precisa chamar outra? A distância entre dois pontos com coordenadas (x1,y1) e (x2,y2) é dada pela fórmula: Sendo assim, e usando a biblioteca cmath.h para calcular a raiz quadrada e as potenciações, faça um programa que calcule a distância entre dois pontos, dada as suas coordenadas,informadas pelo usuário. 2. Qual a finalidade de usar funções em C++? a) Fazer tarefas específicas. b) Fazer com que os programas rodem mais rápido. c) Reduzir o número de linhas de código. d) Tornar o programa mais fácil. e) Deixar os laços de repetição mais curtos. 3. Analise as frases a seguir: i. Uma função pode retornar mais de um valor simultaneamente. ii. Uma função precisa estar declarada para poder funcionar. iii. Se uma função não retorna valor, o tipo de retorno deve ser declarado como void. De acordo com o que vimos na aula, as frases são respectivamente: a) Verdadeira, verdadeira, verdadeira. b) Falsa, falsa, falsa. c) Verdadeira, verdadeira, falsa. d) Verdadeira, falsa, falsa. e) Falsa, verdadeira, verdadeira. 4. Analise as frases abaixo: i. Em uma função, o return não é necessário se o tipo de retorno é diferente de void. ii. Uma variável local declarada em uma função não é válida fora da função. iii. Uma função pode ter mais do que um parâmetro. Os valores dos parâmetros são passados para a função quando ela é chamada. Quais das frases são verdadeiras? a) Somente i b) Somente ii c) Somente iii d) Somente i e iii e) Somente ii e iii 5. A função abaixo está (assinale a alternativa com a justificativa correta): void minhafuncao(int x,int y){ cout<<x*y; return(x*y); } a) Correta. O código está correto. b) Errada, pois não podemos retornar dessa forma (x*y). c) Errada, pois não há variáveis locais. d) Errada, pois o tipo de retorno é void e há um return. e) Errada, pois o cout está incorreto. 6. Observe os códigos de declaração abaixo: i. int soma(int x,y) ii. int soma(x,y) iii. int soma(int x,void y) Quais deles estão corretos? a) Somente i b) Somente ii c) Somente iii d) Todos estão corretos. e) Nenhum está correto. Chaves de resposta: Questão 1: #include <iostream> #include <math.h> using namespace std; float distancia(int x1,int y1,int x2,int y2){ float termo1, termo2, resultado; termo1 = pow((x2-x1),2); termo2 = pow((y2-y1),2); resultado = sqrt(termo1+termo2); return resultado; } int main (void){ int x1,y1,x2,y2; float dist; cout<<"Digite a coordenada Xdo ponto 1:"<<endl; cin>>x1; cout<<"Digite a coordenada Y do ponto 1:"<<endl; cin>>y1; cout<<"Digite a coordenada X do ponto 2:"<<endl; cin>>x2; cout<<"Digite a coordenada Y do ponto 2:"<<endl; cin>>y2; dist = distancia(x1,y1,x2,y2); cout<<"A distancia entre os dois pontos eh "<<dist; } Questão 2: Resposta: Letra a. O objetivo de uma função é realizar tarefas específicas e modularizar o programa. Isto não implica em reduzir o número de linhas de código. Questão 3: Resposta: Letra e. Uma função não pode retornar mais do que um valor. As afirmações ii e iii estão corretas. Questão 4: Resposta: Letra e. As frases ii e iii são verdadeiras. A frase i está incorreta: o return é obrigatório quando o tipo é diferente de void. Questão 5: Resposta: Letra d. A função possui um return e o tipo de retorno dela é void. Questão 6: Resposta: Letra e. Todos têm algum tipo de erro. (i) Falta o tipo do parâmetro y. (ii) Falta o tipo dos parâmetros x e y. (iii) Não podemos ter tipo void nos parâmetros.
Compartilhar