Buscar

Algoritmos Aula 9 Funções

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.

Continue navegando