Você está na página 1de 24

Funções Referências

ECOI04
Algoritmos e Estrutura de Dados I
Funções

Sandro Izidoro

Universidade Federal de Itajubá - UNIFEI


Câmpus Theodomiro Carneiro Santiago - Itabira

17 de agosto de 2022

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 1 / 24


Funções Referências

Sumário

1 Funções

2 Referências

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 2 / 24


Funções Referências

Funções

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 3 / 24


Funções Referências

Introdução

Uma função é um conjunto de instruções projetadas para cumprir uma tarefa es-
pecífica e agrupadas numa unidade com um identificador próprio.
A principal razão para usar funções é a de dividir a tarefa original em módulos que
simplificam e organizam o programa como um todo.
Outra razão é reduzir o tamanho do programa. Qualquer sequência de instruções
que se repita no programa é candidata a ser uma função.
Em C/C++, um programa pode conter uma ou mais funções, das quais uma delas
deve ser a função main ( ).
Chamar uma função é o meio pelo qual é solicitado ao programa que desvie o fluxo
de controle de execução para a função, execute suas instruções e depois volte à
instrução seguinte à da chamada a função.

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 4 / 24


Funções Referências

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 conhecidas na função na qual são definidas.
A maioria das funções tem uma lista de parâmetros que proveem os meios de
transferir informações entre funções. Os parâmetros de uma função também são
variáveis locais.
1 / / Exemplo 01 − Funcao para c a l c u l a r o quadrado dos numeros i n t e i r o s de 1 a 5 0 .
2
3 # include < iostream >
4
5 using namespace s t d ;
6
7 i n t quadrado ( i n t ) ; / / p r o t o t i p o da funcao .
8
9 i n t main ( ) {
10 f o r ( i n t x =1; x <=50; x ++)
11 c o u t << quadrado ( x ) << " " ;
12 return 0;
13 }
14
15 / / d e f i n i c a o da funcao
16 i n t quadrado ( i n t y ) {
17 return y * y ;
18 }

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 5 / 24


Funções Referências

Definições de Funções

Existem 3 maneiras de retornar o controle para o ponto no qual uma função foi cha-
mada:
Se a função não fornecer um valor como resultado, o controle é retornado quando
a chave que indica o término da função é alcançada;
Ao executar o comando return;
Se a função fornecer um valor como resultado, o comando return expressão;
retorna o valor da expressão para a função que realizou a chamada.

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 6 / 24


Funções Referências

Definições de Funções

1 / / Exemplo 02 − Converte a t e mp e r at u r a de graus F a h r e n h e i t em graus C e l s i u s .


2
3 # include < iostream >
4
5 using namespace s t d ;
6
7 int Celsius ( int ) ; / / p r o t o t i p o
8
9 i n t main ( ) {
10 i n t C, F ;
11 c o u t << " D i g i t e a t em p e ra t u ra em F a h r e n h e i t : " ;
12 c i n >> F ;
13 C = C e l s i u s ( F ) ; / / chamada da funcao
14 c o u t << " C e l s i u s : " << C;
15 return 0;
16 }
17
18 int Celsius ( int fahr ) {
19 i n t C;
20 C = ( f a h r − 32) * 5 / 9 ;
21 r e t u r n C;
22 }

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 7 / 24


Funções Referências

Parâmetros da Função

Existem, basicamente, dois tipos de parâmetros:

Parâmetros por valor: Quando as funções criaram uma nova variável para rece-
ber o valor passado pela função chamadora. Uma característica importante deste
mecanismo é que, se for utilizado uma variável como argumento, a variável que
é utilizada como parâmetro não pode alterar o conteúdo da variável argumento,
mesmo que ela seja modificada dentro da função.
Parâmetros por referência: Quando a função pode acessar as variáveis da fun-
ção chamadora. Além deste benefício, este mecanismo possibilita que uma função
retorne mais de um valor para a função que chama. Os valores a serem retorna-
dos são colocados em referências de variáveis da função chamadora.

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 8 / 24


Funções Referências

Parâmetros da Função

1 / / Exemplo 03 − Parametro por v a l o r


2
3 # include < iostream >
4
5 using namespace s t d ;
6
7 void Somar ( i n t X) {
8 X++;
9 c o u t << X << " \ n " ;
10 }
11
12 i n t main ( ) {
13 i n t Y=0;
14 Somar ( Y) ;
15 c o u t << Y << " \ n " ;
16 return 0;
17 }

Neste exemplo, a função Somar incrementa a variável parâmetro X. Mas esta


alteração não afeta a variável Y que continua valendo 0. A variável X apenas
recebeu o valor de Y durante a chamada da função.

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 9 / 24


Funções Referências

Parâmetros da Função

1 / / Exemplo 04 − Parametro por r e f e r e n c i a


2
3 # include < iostream >
4
5 using namespace s t d ;
6
7 void Somar ( i n t & X) {
8 X++;
9 c o u t << X << " \ n " ;
10 }
11
12 i n t main ( ) {
13 i n t Y=0;
14 Somar ( Y) ;
15 c o u t << Y << " \ n " ;
16 return 0;
17 }

Neste exemplo, a função Somar incrementa a variável parâmetro X. Como X é


uma referência da variável Y, o valor de Y é alterado. Após o encerramento da
função, Y passa a valer 1.

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 10 / 24


Funções Referências

Operador Unário de Referência: &

1 / / Exemplo 05 − Operador Unario de R e f e r e n c i a : &


2
3 # include < iostream >
4
5 using namespace s t d ;
6
7 i n t main ( ) {
8 int n;
9 i n t & n1 = n ;
10 n =5;
11 c o u t << n1 << " \ n " ;
12 n1 = 1 5 ;
13 c o u t << n << " \ n " ;
14 return 0;
15 }

O operador de referência cria outro nome para uma variável já existente. Toda
referência deve ser obrigatoriamente inicializada.
É possível combinar a palavra-chave const com a declaração de uma variável re-
ferência (read-only). Dessa forma o conteúdo da variável não poderá ser alterado
com a utilização da variável referência.

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 11 / 24


Funções Referências

Exemplo - Parâmetros por Referência

1 / / Exemplo 06 − Funcao que t r o c a o conteudo de duas v a r i a v e i s para ordenar t r e s


numeros
2
3 # include < iostream >
4
5 using namespace s t d ;
6
7 void Troca ( i n t & X , i n t & Y) {
8 i n t temp=X ;
9 X = Y;
10 Y = temp ;
11 }
12
13 i n t main ( ) {
14 i n t A , B , C;
15 c o u t << " \ n D i g i t e 3 numeros : " ;
16 c i n >> A >> B >> C;
17 i f ( A > B) Troca ( A , B) ;
18 i f ( A > C) Troca ( A , C) ;
19 i f ( B > C) Troca ( B , C) ;
20 c o u t << A << " " << B << " " << C << " \ n " ;
21 return 0;
22 }

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 12 / 24


Funções Referências

Argumentos Padrão (Default)

O protótipo de uma função pode incluir valores padrão para um, alguns ou todos
os parâmetros. Se omitidos os argumentos correspondentes, os valores padrões
serão automaticamente utilizados.
1 / / Exemplo 07 − Funcao com v a l o r e s padrao
2
3 # include < iostream >
4
5 using namespace s t d ;
6
7 void Linha ( i n t = 20 , char = ’ * ’ ) ; / / p r o t o t i p o
8
9 i n t main ( ) {
10 Linha ( ) ; c o u t << " \ n " ;
11 Linha ( 3 4 ) ; c o u t << " \ n " ;
12 Linha ( 4 5 , ’ = ’ ) ; c o u t << " \ n " ;
13 return 0;
14 }
15
16 void Linha ( i n t n , char ch ) {
17 f o r ( i n t i =0; i <n ; i ++) c o u t << ch ;
18 }

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 13 / 24


Funções Referências

Sobrecarga de Funções

Sobrecarregar funções significa criar uma família de funções com o mesmo nome,
mas com a lista de parâmetros diferentes (aridade ou tipo).

1 / / Exemplo 08 − Sobrecarga de Funcao


2
3 # include < iostream >
4
5 using namespace s t d ;
6
7 i n t Cubo ( i n t ) ; / / p r o t o t i p o
8 f l o a t Cubo ( f l o a t ) ; / / p r o t o t i p o
9 double Cubo ( double ) ; / / p r o t o t i p o
10
11 i n t main ( ) {
12 c o u t << Cubo ( 5 ) << " \ n " ;
13 c o u t << Cubo ( 1 2 . 3 4 f ) << " \ n " ;
14 c o u t << Cubo ( 1 2 . 3 4 ) << " \ n " ;
15 return 0;
16 }
17
18 i n t Cubo ( i n t n ) { r e t u r n n * n * n ; }
19
20 f l o a t Cubo ( f l o a t n ) { r e t u r n n * n * n ; }
21
22 double Cubo ( double n ) { r e t u r n n * n * n ; }

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 14 / 24


Funções Referências

Funções inline

A palavra-chave inline, quando colocada como primeiro elemento do cabeçalho


da definição de uma função, causa à inserção de uma nova cópia da função em
todo lugar onde ela é chamada.
A chamada a uma função provoca o desvio do controle do programa para o código
da função e, ao término da execução deste código, um novo desvio para a instru-
ção seguinte à da chamada.
Por um lado o uso de funções poupa espaço de memória, por outro requer mais
tempo de execução.
Se a função é pequena (uma ou duas instruções), as instruções necessárias à
sua chamada podem ocupar mais espaço de memória que as instruções do seu
próprio código.
Neste caso, é aconselhável criar funções inline.

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 15 / 24


Funções Referências

Passando Vetores como Parâmetros de Funções

Para passar um vetor como argumento para uma função, é necessário especificar
o nome do vetor sem os colchetes.
Frequentemente, ao passar um vetor para uma função, o tamanho do vetor tam-
bém é passado, para que a função possa processar o número total de elementos
do vetor.
A linguagem C/C++ automaticamente passa os vetores às funções usando cha-
madas por referência simulada. Isso ocorre por motivos de desempenho. Se os
vetores fossem passados por chamadas por valor, seria passada uma cópia de
cada elemento. Para vetores grandes isso seria demorado e consumiria um es-
paço considerável de memória.
As funções chamadas podem modificar os valores dos elementos nos vetores ori-
ginais do chamador.
O nome do vetor é o endereço do primeiro elemento do vetor. Para uma função
receber um vetor por meio de uma chamada de função, sua lista de parâmetros
deve especificar que um vetor será recebido.

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 16 / 24


Funções Referências

Passando Vetores como Parâmetros de Funções


1 / / Exemplo 09 − Passando Vetores como Parametros de Funcoes
2
3 # include < iostream >
4
5 using namespace s t d ;
6
7 void m o d i f i c a I d a d e s ( i n t [ ] , i n t ) ; / / p r o t o t i p o
8
9 i n t main ( ) {
10 const i n t Tamanho = 5 ;
11 i n t Idades [ Tamanho ] = { 0 , 1 , 2 , 3 , 4 } ;
12 c o u t << " \ nVetor O r i g i n a l : " ;
13
14 f o r ( i n t i =0; i <Tamanho ; i ++)
15 c o u t << Idades [ i ] << " " ;
16
17 m o d i f i c a I d a d e s ( Idades , Tamanho ) ;
18
19 c o u t << " \ nVetor M o d i f i c a d o : " ;
20
21 f o r ( i n t i =0; i <Tamanho ; i ++)
22 c o u t << Idades [ i ] << " " ;
23 c o u t << " \ n " ;
24 return 0;
25 }
26 void m o d i f i c a I d a d e s ( i n t b [ ] , i n t tam ) {
27 f o r ( i n t i =0; i <tam ; i ++)
28 b [ i ]++;
29 }

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 17 / 24


Funções Referências

Passando Vetores como Parâmetros de Funções

Podem existir situações nas quais não se deve permitir que uma função modifique
os elementos de um vetor.
Como os vetores são sempre passados por chamadas por referência, as modifica-
ções nos valores de um vetor são difíceis de controlar.
Entretanto, pode-se utilizar o qualificador de tipo const também com ponteiros.
Quando uma função especifica um parâmetro vetor que é precedido por const, os
elementos do vetor se tornam constantes no corpo da função e qualquer tentativa
de modificar um elemento resulta em um erro de compilação.

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 18 / 24


Funções Referências

Argumentos de Linha de Comando

1 / / Exemplo 10 − Argumentos de l i n h a de comando


2
3 # include < iostream >
4
5 using namespace s t d ;
6
7 i n t main ( i n t argc , char * * argv ) {
8 c o u t << " \ nNumero de argumentos : " << argc << " \ n " ;
9 f o r ( i n t i =0; i <argc ; i ++)
10 c o u t << " \ nArgumento " << i << " : " << argv [ i ] << " \ n " ;
11 return 0;
12 }

A função main() recebe dois argumentos: argc e argv.


O primeiro argumento representa o número de argumentos.
O segundo argumento corresponde a uma matriz de ponteiros para strings, onde
cada string representa um dos argumentos da linha de comando.
A primeira cadeia, argv[0], é sempre o nome do programa sendo executado e o
seu caminho de localização no disco.

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 19 / 24


Funções Referências

Ponteiros para Funções


1 / / Exemplo 11 − P o n t e i r o s para funcoes
2
3 # include < iostream >
4
5 using namespace s t d ;
6
7 void Exemplo ( ) {
8 c o u t << "Uma funcao para e x e m p l i f i c a r p o n t e i r o s \ n " ;
9 }
10
11 i n t main ( ) {
12 void ( * PtrFun ) ( void ) ; / / d e c l ar a c a o do p o n t e i r o
13 PtrFun = Exemplo ; / / A t r i b u i c a o do endereco da funcao
14 ( * PtrFun ) ( ) ; / / Chamada da funcao a t r a v e s do p o n t e i r o
15 return 0;
16 }

Um ponteiro para função é uma variável que armazena o endereço de uma função
na memória, permitindo a execução da função através deste ponteiro.
No Exemplo 11 (linha 12) tem a declaração de uma variável ponteiro, PtrFun. Os
parênteses envolvendo a variável são necessários para que o compilador consiga
distinguir a declaração de um ponteiro com o cabeçalho de uma função. O nome
da função sem os parênteses é o seu endereço. Caso contrário o compilador
entenderia como uma chamada da função.
A aritmética com ponteiros para funções não é definida, ou seja, não é possível
incrementar ou decrementar ponteiros para funções.
Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 20 / 24
Funções Referências

Ponteiros para Funções

1 / / Exemplo 12 − P o n t e i r o s para funcao com parametros


2
3 # include < iostream >
4
5 using namespace s t d ;
6
7 i n t SomaVetor ( i n t * b , i n t tam ) {
8 i n t Soma=0;
9 f o r ( i n t i =0; i <tam ; i ++)
10 Soma += b [ i ] ;
11 r e t u r n Soma ;
12 }
13
14 i n t main ( ) {
15 i n t ( * PtrFun ) ( i n t * , i n t ) ; / / d e c l ar a c a o do p o n t e i r o
16 const i n t Tamanho = 5 ;
17 i n t Idades [ Tamanho ] = { 0 , 1 , 2 , 3 , 4 } ;
18 PtrFun = SomaVetor ;
19 c o u t << " \ n T o t a l do V e t o r : " << PtrFun ( Idades , Tamanho ) ;
20 c o u t << " \ n " ;
21 return 0;
22 }

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 21 / 24


Funções Referências

Função Recursiva
Na linguagem C/C++, assim como em muitas outras linguagens de programação,
uma função pode chamar a si própria (função recursiva).
Há certos algoritmos que são mais eficientes quando feitos de maneira recursiva,
entretanto, o código gerado por uma função recursiva geralmente exige a utilização
de mais memória, o que pode tornar a execução mais lenta.
Todo cuidado é pouco ao se fazer funções recursivas.
A primeira coisa a se providenciar é um critério de parada. Este vai determinar
quando a função deverá parar de chamar a si mesma, impedindo uma recursivi-
dade sem fim.
1 / / Exemplo 13 − Funcao Recursiva
2
3 # include < iostream >
4
5 using namespace s t d ;
6
7 long f a t o r i a l ( i n t n ) {
8 r e t u r n ( ( n == 0 ) ? long ( 1 ) : long ( n ) * f a t o r i a l ( n −1) ) ;
9 }
10
11 i n t main ( ) {
12 f o r ( i n t x = 1 ; x <= 8 ; x ++)
13 c o u t << f a t o r i a l ( x ) << " \ n " ;
14 return 0;
15 }

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 22 / 24


Funções Referências

Referências

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 23 / 24


Funções Referências

Referências

1 Material elaborado a partir das notas de aula do professor Edmilson Marmo


Moreira (UNIFEI).
2 Deitel, H. M. & Deitel, P. J. C++ Como Programar. 5a. edição. Porto Alegre:
Bookman, 2009.
3 Victorine Viviane Mizrahi. Treinamento em Linguagem C++ – Módulo 1 e 2.
Makon Books, São Paulo, 2007.
4 Ziviani, Nivio. Projeto de algoritmos: com implementações em Pascal e C. 3 ed
rev. e ampl. São Paulo: Cengage Learning, 2011.
5 Feofiloff, Paulo. Algoritmos em linguagem C. Rio de Janeiro: Elsevier, 2009.
6 Drozdek, Adam. Estrutura de Dados e Algoritmos em C++. Pioneira Thomson
Learning, São Paulo, 2002.

Sandro Izidoro UNIFEI - ICT ECOI04 17 de agosto de 2022 24 / 24

Você também pode gostar