Unidade 2 - Funções
Unidade 2 - Funções
Unidade 2 - Funções
TÉCNICAS DE PROGRAMAÇÃO
UNIDADE 2 - FUNÇÕ ES
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%3… 1/29
22/02/2023, 16:54 Técnicas de Programação
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%3… 2/29
22/02/2023, 16:54 Técnicas de Programação
Introdução
Iniciamos aqui mais uma unidade de nossa conversa sobre técnicas de programação. Agora falaremos sobre
funçõ es. A primeira imagem que pode vir à sua cabeça é uma função matemática “f(x)”: falaremos de
matemática? Não propriamente dito, falaremos sobre uma outra forma de estruturar um có digo de forma a
definir um bloco de instruçõ es para uma certa funcionalidade. Mas, então, funçõ es servem apenas para deixar
o programa estruturado, mais fácil de ser visualizado? Sim, um dos objetivos é este, mas há, também, outros
motivos para elas existirem, é o que veremos nessa unidade. Sabemos que uma função encapsula um conjunto
de instruçõ es. O programa principal “main()” é uma função? Exato! O programa principal “main()” foi a
primeira função que manipulamos aqui na nossa disciplina. Aqui falaremos também sobre outras, mas,
principalmente, falaremos de como criar funçõ es. Mas, se função é um bloco de instruçõ es para uma certa
funcionalidade, então, os blocos delimitados por “{“ e “}” dos comandos condicionais e comandos de
repetição são também funçõ es? Não, funçõ es são mais abrangentes: elas envolvem as instruçõ es de forma
mais ampla, ou seja, envolvem, inclusive, os comandos condicionais e os laços de repetição.
Neste capítulo abordaremos os aspectos relacionados aos conceitos e implementação de funçõ es. Para tanto,
falaremos sobre suas nomenclaturas e funcionamento assim como os seus retornos de valores e parâmetros.
Figura 1 - Sistema modular formado por vários programas que podem estar em execução em dispositivos
distintos – cada dispositivo suportado pelo seu respectivo sistema operacional.
Fonte: Elaborada pelo autor, 2019.
Na figura acima, o sistema é formado por vários programas que utilizam as funcionalidades exportadas pelo
sistema operacional em execução no respectivo dispositivo computacional. Tais funcionalidades são
acessíveis por intermédio das funçõ es do sistema, disponibilizadas através das bibliotecas padrõ es. Cada
programa, por sua vez, pode ser composto por vários arquivos-fonte (arquivos “.c”). Em função da
complexidade do programa, é sugerível a sua decomposição em vários arquivos de codificação, separados por
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%3… 3/29
22/02/2023, 16:54 Técnicas de Programação
funcionalidades. Por exemplo, tais funcionalidades poderão ser distinguidas entre aquelas que objetivam a
interação com o usuário, aquelas que realizam acesso à um banco de dados e aquelas que fazem os
processamentos internos do sistema. Essas funcionalidades, por sua vez, são conseguidas através da
codificação de funçõ es específicas.
VOCÊ O CONHECE?
A ideia de modularizaçã o surgiu no final da dé cada de 1960, na chamada “crise do
software”. Na ocasiã o, Dijkstra já defendia a ideia de modularizaçã o tendo inclusive,
apresentado em 1972, na ACM (Association for Computing Machinery – literalmente,
em portuguê s, Associaçã o para Má quinas de Computaçã o), o trabalho intitulado “The
Humble Programmer” (O Humilde Programador). Para saber um pouco mais sobre
Dijkstra, você poderá acessar este artigo aqui
<http://horizontes.sbc.org.br/index.php/2017/10/23/807/
(http://horizontes.sbc.org.br/index.php/2017/10/23/807/)>. (MOCHETTI, 2017).
Essa ideia de dividir o programa em funçõ es é um dos conceitos da modularização de sistemas, mais
especificamente, modularização de programas.
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%3… 4/29
22/02/2023, 16:54 Técnicas de Programação
Mas, quais são as vantagens de uma programação modular, contendo inclusive funçõ es em sua codificação?
Modularizar não significa apenas deixar o có digo organizado, mas sim, apresenta uma série de vantagens,
segundo Deitel, (2011). Para conhecer quais são essas vantagens, clique nas abas abaixo.
•
Implementação
Facilita o processo de criação, testes e correção de erros: a implementação, testes e correçõ es, com
o uso de mó dulos fica mais pontual, ou seja, pode-se focar apenas em uma funcionalidade
específica; desta forma, consegue-se por exemplo, corrigir erros mais facilmente pois a localização
do có digo, dentre milhares de linhas de có digo, fica mais rápida. Com funçõ es é possível trocar
toda uma função por outra de versão acima.
Incorporação
Possibilidade de reutilização do có digo: o bloco representado pela função poderá ser utilizado em
outro projeto bastando incorporá-la ao có digo.
Função
Evitar reescrita do có digo ao longo do arquivo-fonte: caso uma certa ação representada por diversas
linhas de có digo seja requerida em vários momentos e em vários pontos do programa, não será
necessário reescrever o có digo e sim, apenas chamar a função.
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%3… 5/29
22/02/2023, 16:54 Técnicas de Programação
Até então falamos de alguns conceitos inerentes às funçõ es mas, na prática, será que já usamos funçõ es nesta
disciplina além da função “main()”? A resposta é positiva, por exemplo, o “printf” é uma função da chamada
biblioteca padrão; que evoca funcionalidades do sistema operacional para intervir nas açõ es que culmina na
manipulação do sistema de vídeo do dispositivo computacional. Outros exemplos de funçõ es que já
utilizamos são: scanf, strlen, strcmp, strcpy, atoi e itoa.
VOCÊ SABIA?
Você sabia que as funções poderã o ser evocadas remotamente? Em sistemas ditos
como sistemas distribuídos, um programa pode evocar uma funçã o remota,
localizada em outro computador. Essa chamada é realizada por meio de RPC
(Remote Procedure Call, ou em portuguê s, Chamada a Procedimentos Remotos).
Para ler sobre o assunto e, inclusive, ver códigos-exemplo em C, você pode acessar
este link <http://www.eletrica.ufpr.br/pedroso/2009/TE090/Aulas/rpc.pdf
(http://www.eletrica.ufpr.br/pedroso/2009/TE090/Aulas/rpc.pdf )>. Em Java,
existe algo semelhante chamado RMI (Remote Method Invocation, em portuguê s,
Invocaçã o de Mé todo Remoto). (PEDROSO, 2006).
Mas, como criar funçõ es? A seguir veremos mais detalhes de como criar as funçõ es e como elas funcionam no
escopo de sua execução no dispositivo computacional.
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%3… 6/29
22/02/2023, 16:54 Técnicas de Programação
Mas, o que é tipo de retorno e o que são parâmetros de uma função? Porque o “main” tem um tipo de retorno
“int”? E os parâmetros do main? Uma função pode ter ausência de parâmetros? Antes de conversarmos sobre
essas dú vidas, vamos falar sobre como funcionam as funçõ es.
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%3… 7/29
22/02/2023, 16:54 Técnicas de Programação
Figura 2 - Cenário criado para a chamada de uma função. O fluxo é desviado para que as instruçõ es
pertinentes à função sejam executadas.
Fonte: Elaborada pelo autor, 2019.
Na figura acima, são destacados os eventos de salvamento e recuperação de contexto; estes eventos são
responsáveis por salvar e recuperar em uma região da memó ria principal mapeada na forma de pilha de
dados, o valor dentre outras informaçõ es, do registrador PC (program conter, ou, contador de programa). O
registrador PC, também chamado de IP (instruction pointer, ou, ponteiro de instrução) é uma estrutura de
hardware que armazena o endereço da linha a ser executada. Na chamada da função, esse valor corresponde
ao ponto que houve a evocação da função: esse ponto será restaurado para que a execução do programa
continue na linha imediatamente apó s a chamada da função.
Uma outra questão para entendermos sobre o funcionamento das funçõ es diz respeito às variáveis; declarar
uma variável dentro da função é a mesma coisa que declararmos fora? Para respondermos à tal
questionamento, veremos, a seguir, o corpo de uma função.
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%3… 8/29
22/02/2023, 16:54 Técnicas de Programação
int main( )
{
int y;
. . .
}
No trecho acima, encontramos a declaração de “x” fora de qualquer função, enquanto a declaração de “y”
encontra-se dentro do corpo da “main()”. Podemos ver, ainda, uma função “funcao1”, que manipula tanto “x”
quanto “y” para atribuir os seus valores às variáveis “a” e “b”, respectivamente. Como a variável “x” é global, a
“funcao1” poderá acessá-la em seu có digo, porém, haverá um erro de compilação na linha “b = y” do tipo
“variável y não declarada” pois, pelo fato de ser local a “main”, não é visível à “funcao1”.
Uma variável local existe na memó ria apenas durante a execução da função. Quando a função acaba o seu
processamento e o fluxo voltam para o ponto de chamada, as variáveis locais são apagadas da memó ria. Caso
a função seja chamada localmente, serão alocadas, novamente, as variáveis locais sendo os seus valores
iniciados novamente; os valores da execução antiga são perdidos, a menos que se use o modificador “static”
(por exemplo, “static int a”).
Para ilustrar melhor uma função, vamos supor o có digo a seguir:
#include <stdio.h>
int x;
void funcaoTeste( )
{
int a;
a = x;
printf(“Valor de 'a': %d\n”,a);
x++;
}
int main( )
{
x = 0;
funcaoTeste();
printf(“Valor de 'x': %d\n”,x);
}
No exemplo acima, temos a função “funcaoTeste()” que cria a variável local “a” e manipula, também, a
variável global “x”. A função “funcaoTeste()” é evocada a partir da função “main()” – apó s a sua finalização,
ocorre a execução da linha que contém o có digo: “printf(“Valor de 'x': %d\n”,x);”.
Você deve estar se perguntando: Mas, e o tipo da função? Para que serve, por exemplo, o “int” antes do
“main()”? Veremos agora a questão de retorno das funçõ es.
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%3… 9/29
22/02/2023, 16:54 Técnicas de Programação
Mas, toda função deve retornar um valor? O retorno de valor de uma função não é um item obrigató rio; neste
caso, uma função consiste apenas de uma sequência de açõ es sem o retorno do resultado de seu
processamento.
Para alguns autores, como Ascencio (2012), em outras linguagens como a linguagem PASCAL, diferencia-se
uma função com retorno e uma função sem retorno. Para se adequar à linguagem, uma função que nada
retorna é chamada de procedimento (“procedure”). Já de acordo com Puga (2016), a diferença básica entre
procedimento e função consiste no fato de que as funçõ es poderão ser usadas em expressõ es, ou seja, usadas
como parte geradora de um valor que será atribuído à uma variável. No caso do procedimento, como ele não
retorna valor, não será possível utilizá-lo em expressõ es de atribuição.
No caso da linguagem C/C++, a diferenciação se faz apenas na definição do tipo do retorno. O uso é definido
pelo programador, por exemplo, a função “printf” geralmente é usada fora de expressõ es, porém, ela retorna a
quantidade de caracteres impressos e poderia ser usada da seguinte forma:
Como podemos perceber pela linha de có digo acima, a linguagem C/C++ não faz muita distinção entre uma
função retornando ou não retornando valor. Mas, como diferenciar na implementação? Para exemplificar,
vamos dar uma olhada no có digo colocado abaixo:
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 10/29
22/02/2023, 16:54 Técnicas de Programação
No có digo acima, definimos como “void” o tipo do retorno da função “Espera( )”. Quando se define uma
função com o tipo “void” (vazio) não necessitamos usar o “return <valor>” ao final de seu processamento.
Caso seja necessário interromper o processamento de uma função do tipo “void”, basta inserir um “return”
sem valor de retorno, ou seja, simplesmente: “return;”.
Vejamos mais um exemplo:
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 11/29
22/02/2023, 16:54 Técnicas de Programação
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 12/29
22/02/2023, 16:54 Técnicas de Programação
funçõ es que dependem da existência das variáveis globais. Uma consequência deste tipo de dependência é a
dificuldade de manutenção, pois qualquer alteração, por exemplo, nas variáveis globais, afetam todas as
funçõ es delas dependentes.
Todas as funçõ es que não possuem retorno dependem de variáveis globais para o seu funcionamento? Não, a
dependência ou não de variáveis globais dependerá exclusivamente de suas funcionalidades para as quais
uma função é implementada. Mas, existem funçõ es que retornam valores? Sim, veremos como implementar
funçõ es que retornam valores a seguir.
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 13/29
22/02/2023, 16:54 Técnicas de Programação
scanf("%d",&qtd);
for (; i < qtd ; i++)
{
printf("Sorteio [%d]: %d\n",i+1,DezenaSorteada());
}
return 0;
}
No có digo acima temos um exemplo de uma função que retorna um valor inteiro. No caso específico do
exemplo, a função “DezenaSorteada()” retorna um valor entre 1 e 60 para que seja impresso na tela para o
usuário por intermédio da linha “printf("Sorteio [%d]: %d\n",i+1,DezenaSorteada());”. Para tanto, foram
utilizadas as funçõ es “srand”, que inicia o gerador de nú meros aleató rios, “time()” que retornará o tempo
transcorrido desde 1 de janeiro de 1970 (em segundos) – que servirá como “semente” para a iniciação do
gerador de nú meros aleató rios e, por fim, a função “rand()”, que retornará um valor inteiro entre 0 e a
constante “RAND_MAX” (definida no arquivo header “stdlib.h”).
O có digo com “return” deve ser inserido apenas na ú ltima linha de uma função? Não necessariamente. Pode-
se colocar “return” ao longo do corpo da função, para interromper a função e voltar ao ponto de chamada
caso algum erro tenha ocorrido. Um exemplo de “return” ao longo do corpo da função está referenciado no
trecho de có digo a seguir:
int funcao( )
{
int x,y;
. . .
if(y == 0)
return -1;
. . .
return abs(x / y);
}
No exemplo acima, temos o término antecipado da função em virtude da situação de erro testada no comando
condicional (no caso, o denominador da divisão não pode assumir o valor 0). Ao ser verificada essa condição
de erro, a função retorna o valor “-1”. Foi escolhido esse valor como retorno de erro pois, em operação
normal, a função sempre retornará um valor positivo representado pelo valor absoluto da divisão de “x” por
“y”. O valor absoluto é conseguido através da utilização da função “abs()”, definida no arquivo header
“stdlib.h”. Essa finalização feita antes de se chegar ao final da função poderá ser usada, também, em casos
normais de execução, onde um certo objetivo já tenha sido cumprido. Você pode ficar a se perguntar: eu já ouvi
falar em um comando chamado “break” (usado nos laços de repetição e, inclusive no comando
“switch...case”). O “break” tem a mesma funcionalidade em relação ao “return”? Para falarmos sobre essa
dú vida, vamos analisar o có digo abaixo:
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 14/29
22/02/2023, 16:54 Técnicas de Programação
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 15/29
22/02/2023, 16:54 Técnicas de Programação
No có digo acima, temos o uso de “return” e de “break”. Podemos ver que, ao utilizar-se o “return”, não é
colocada a parte “else” nos comandos condicionais pelo fato de que a execução é interrompida, retornando à
posição de chamada da função (no caso, retornando ao “main”). Por sua vez, acontece a interrupção do laço,
continuando na pró pria função quando usado o “break”. Desta forma, a função retornará um valor positivo
indicando a posição do elemento buscado dentro do vetor ou retornará um valor negativo indicando uma
operação malsucedida. Para finalizar, foram sublinhadas no có digo, todas as ocorrências de funçõ es para que
possamos identificar e diferenciar o que é comando e o que é função dentro da linguagem C/C++. Vamos então
reescrever o exemplo do menu de opçõ es (mostrado quando estávamos falando sobre funçõ es que não
retornam valor) usando funçõ es que retornam valor?
Na versão do có digo acima, podemos notar que a variável “opcao” desapareceu da lista de variáveis globais. O
intercâmbio referente à escolha do usuário passou a ser por intermédio do retorno da função “EntradaMenu(
)”. Sendo assim, a coesão, em relação a essa função passou a ser baixa pois não há dependências de variáveis
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 16/29
22/02/2023, 16:54 Técnicas de Programação
globais. No caso do exemplo acima, a função retorna um tipo “opcao”; desta forma, podemos mencionar que
uma função pode retornar qualquer tipo de dados previamente definido. Vamos ver um outro exemplo? Para
tanto, suponha o có digo abaixo, de uma calculadora, para realizar as quatro operaçõ es aritméticas básicas:
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 17/29
22/02/2023, 16:54 Técnicas de Programação
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 18/29
22/02/2023, 16:54 Técnicas de Programação
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 19/29
22/02/2023, 16:54 Técnicas de Programação
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 20/29
22/02/2023, 16:54 Técnicas de Programação
Neste có digo, cada operação aritmética é representada por uma função. Para simplificar o exemplo, não estão
sendo tratadas condiçõ es de erro, como por exemplo, a divisão por 0. A partir da escolha realizada pelo
usuário, feita por intermédio da função “Menu()”, a instanciação da variável “res” é feita com o retorno da
função correspondente.
(https://www.vivaolinux.com.br/artigo/Parametros-interessantes-do-scanf-e-do-printf-em-C)
(https://www.vivaolinux.com.br/artigo/Parametros-interessantes-do-scanf-e-do-printf-em-C)Até o momento,
falamos apenas sobre o retorno das funçõ es. Mas, como passar valores para as funçõ es de modo que elas
possam coletar e processar valores diferentes a cada chamada? Isso é o veremos a seguir, quando
conversaremos sobre “parâmetros” das funçõ es.
2.7 Parâmetros
Como já antecipamos um pouco, parâmetros servem para informar à função qual deve ser o conjunto de
valores que precisam ser processados. Para ficar mais claro, vamos voltar ao exemplo da função matemática
“seno”. Ao usarmos “y=seno(x)” já fica subtendido que desejamos atribuir à variável “y” o valor do seno
referente a “x” graus. Desta forma, podemos falar que “x” é o parâmetro da função “seno”. Na computação não é
diferente, ou seja, parâmetro são os valores passados para as funçõ es para que elas possam realizar os seus
processamentos específicos.
Antes de entrarmos especificamente nos parâmetros das funçõ es, vamos nos prender um pouco na função
“main()”. Será que podemos passar argumentos quando evocamos o programa por intermédio da linha de
comando (prompt ou cmd)? Sim, a função “main()” consegue receber parâmetros, basta implementar como
sugere o trecho de có digo a seguir:
A função “main()” admite dois parâmetros passados pela linha de comando: o primeiro parâmetro, do tipo
inteiro, indica a quantidade de argumentos passados. Caso o usuário não passe parâmetros, a variável (no
nosso exemplo, chamada como “argc”) tem o valor 1. O valor 1 refere-se ao pró prio nome do programa
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 21/29
22/02/2023, 16:54 Técnicas de Programação
passado como parâmetro pelo sistema operacional – que ocupa a posição 0 do vetor, “argv”, que contém a
lista de parâmetros. Os demais parâmetros, quando existirem, poderão ser acessados nas posiçõ es
subsequentes à posição 0.
Mas, e o caso das funçõ es que não sejam a função “main()”? Como devemos passar informaçõ es para elas?
Para a passagem de parâmetros em uma função deveremos criar uma lista de variáveis em sua interface na
seguinte forma:
<tipo_de_retorno> NomeDaFunção (lista de parâmetros)
Sendo que a lista de parâmetros se assemelha à criação de variáveis, ou seja, as variáveis deverão ser criadas
de acordo com a sintaxe:
(<tipo1> var1, <tipo2> var2, . . .)
Por exemplo, no caso termos uma função que receba, como parâmetros, dois valores inteiros para seja
realizada e retornado o valor de uma soma, teríamos:
A ordem de definição das variáveis deverá ser a mesma em relação à chamada da função, ou seja, o primeiro
parâmetro passado será associado ao primeiro parâmetro da interface da função, o segundo da chamada ao
segundo da interface e assim por diante. Cada parâmetro poderá ser passado por valor ou por referência,
conforme será descrito a seguir. (MIZRAHI, 2008).
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 22/29
22/02/2023, 16:54 Técnicas de Programação
No có digo acima, temos uma função (“soma_dobro”) que recebe dois parâmetros: “a” e “b”. Como sabemos
que os parâmetros são passados por valor? No caso, podemos verificar que cada parâmetro é definido pela
seguinte sintaxe:
Mas, alterando-se dentro da função os valores das variáveis passadas como parâmetros (“a” e “b”), não serão
alterados os valores das variáveis na origem da chamada (no caso, as variáveis “x” e “y”)? Não há esse perigo,
pois, quando se passar por valor, cada parâmetro origina uma variável local que é instanciada com o valor
passado pela variável na origem da chamada. Neste caso, por exemplo, as variáveis “x” e “a” são totalmente
distintas. A figura a seguir mostra melhor o que acabamos de falar.
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 23/29
22/02/2023, 16:54 Técnicas de Programação
Figura 3 - Passagem de parâmetros por valor. Cada parâmetro da função implica na criação de uma variável
local que recebe uma có pia do valor passado como parâmetro, não afetando a variável que originou a
informação.
Fonte: PUGA, 2016. p. 267.
Para finalizar, podemos falar que utilizamos passagem por valor quando desejamos manter as informaçõ es
intactas no ponto de chamada ou, ainda, quando a função não objetiva alteraçõ es nos valores dos parâmetros
mas sim, apenas usá-los como fonte de dados para prosseguir o seu processamento.
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 24/29
22/02/2023, 16:54 Técnicas de Programação
Para começar, notamos que aparece o símbolo “*” na definição dos parâmetros da função. O símbolo “*” ((
)) indica que estamos, ao invés de um valor, recebendo uma posição de memó ria cujo
conteú do será manipulado pela função. Esse mesmo sinal aparece quando manipulamos as variáveis no
corpo da função. Em tal ocasião, o sinal “*” denota o conteú do da posição de memó ria. Por exemplo, na linha
; ” podemos traduzir como: o conteú do da posição de memó ria apontada por “a”
recebe o conteú do da posição de memó ria apontado por “a” vezes 2. Desta forma, como estamos atribuindo
um valor para uma posição de memó ria, automaticamente estamos alterando o valor da variável que originou
o parâmetro na chamada da função (no caso do exemplo, a variável “x”).
Já que estamos falando que “*x” indica uma posição de memó ria, significa que temos que passar para a função
não um valor e, sim, uma posição de memó ria. Este feito é conseguido utilizando-se o sinal “&”. No caso do
exemplo, a chamada “ " pode ser traduzida como: evoca-se a função
“soma_dobro” passando como parâmetros a posição de memó ria apontada por “x” e a posição de memó ria
apontada por “y”. Creio que agora, você está começando a entender sobre o motivo de usarmos o símbolo “&”
na utilização da função “scanf”. No caso, passamos o endereço da variável passada pela “scanf” para que a
função possa nos devolver o valor fornecido pelo usuário.
A figura a seguir ilustra esse processo de passagem por parâmetro tomando por base o exemplo de có digo
acima.
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 25/29
22/02/2023, 16:54 Técnicas de Programação
Figura 4 - Passagem de parâmetros por referência. Cada parâmetro representa uma posição de memó ria cujo
endereço é o mesmo da variável passada na chamada da função, desta forma, qualquer alteração sobre os
parâmetros afeta as variáveis que originaram a informação.
Fonte: PUGA, 2016. p. 268.
No caso da figura acima, está sendo suposto que as variáveis “x” e “y” estão localizadas nas posiçõ es 800 e
300 da memó ria, respectivamente. Sendo assim, qualquer alteração dentro da função “soma_dobro” será
realizada exatamente em tais posiçõ es de memó ria, modificando, consequentemente, os valores de “x” e de
“y”.
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 26/29
22/02/2023, 16:54 Técnicas de Programação
O “#ifndef” serve para testar se já foi definido a constante “SOMADOBRO”; caso já tenha sido definida, aborta-
se a inclusão do arquivo “.h” específico, senão, define-se a constante “SOMADOBRO” por intermédio do
“#define” (pode-se colocar qualquer valor associado a esta constante), e inclui o protó tipo da função nas
regras de compilação. O “#ifndef” evita que ocorra duplicidade de definiçõ es quando o arquivo “.h” for
referenciado por vários arquivos “.c”.
Em relação ao có digo-fonte, a ú nica diferença é que apareceria a linha:
Utilizar passagem de parâmetros nas funçõ es impacta o fator de seu acoplamento. Acoplamento relaciona-se
ao grau de interdependência dos mó dulos, ou seja, como os mó dulos compartilham, por exemplo, variáveis
globais; no caso, alteraçõ es nas estruturas de tais variáveis impacta diretamente sobre os mó dulos tendo que,
neste caso, haver modificaçõ es em todos os mó dulos que as utiliza. Utilizar passagem de parâmetros nas
funçõ es representa a construção de mó dulos com acoplamento fraco. Acoplamento fraco significa uma maior
independência entre os mó dulos e, consequentemente, às variáveis compartilhadas globalmente.
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 27/29
22/02/2023, 16:54 Técnicas de Programação
CASO
Um profissional da á rea de computaçã o, ao receber um projeto, ficou a pensar em
como organizar e estruturar o seu código. Ao verificar o alto grau de
complexidade do sistema, começou a refletir sobre a modularizaçã o.
Imediatamente, já lhe veio à cabeça os conceitos de acoplamento e de coesã o:
acoplamento no sentido de como os módulos/funções iriam intercambiar
informações e, coesã o, no sentido de nã o haver, por exemplo, sobreposiçã o das
funcionalidades. Diante disso, mesmo sem definir o estilo de programaçã o
(estruturada ou orientada a objetos), a primeira medida que tomou foi aplicar
conceitos da Engenharia de Software. Para tanto, ele estudou padrões e modelos
como: GRASP (General Responsibility Assignment Software Principles – Princípios
Gerais de Atribuiçã o e de Responsabilidade do Software), UML (Unified Modeling
Language – Linguagem de Modelagem Unificada) e o princípio SRP do SOLID
(Single Responsibility Principle – Princípio da Responsabilidade Ú nica). Em suma,
ele resolveu fazer esse exercício de abstraçã o pois, um sistema deve ser
otimizado, bem definido e bem estruturado, independentemente de qual
paradigma de linguagem será adotado.
Construir uma função com fraco acoplamento torna o reaproveitamento do có digo e alteraçõ es em seu có digo
mais fáceis. Tal facilidade é conseguida pois toda evocação é baseada em passagem de parâmetros, ou seja,
sem a necessidade de dependência, por exemplo, de variáveis globais.
Síntese
Chegamos ao fim do nosso segundo encontro sobre técnicas de programação. Tivemos agora, a oportunidade
de ampliar os conceitos e funcionalidades da programação estruturada, mais especificamente, da
programação usando a linguagem C. Com os pontos abordados, você já conseguirá implementar programas
mais complexos e torná-los mais eficientes e estruturados pela utilização de técnicas de modularização
utilizando funçõ es. Com os temas estudados até aqui, esperamos que você continue treinando e
incrementando os seus programas computacionais de forma a deixá-los mais eficientes e organizados.
Nesta unidade, você teve a oportunidade de:
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 28/29
22/02/2023, 16:54 Técnicas de Programação
Bibliografia
ASCENCIO, A. F. G. Fundamentos de Programação de Computadores: Algoritmos, PASCAL, C/C++ (Padrão ANSI)
e Java. 3. Ed. São Paulo: Pearson Education do Brasil, 2012. Disponível em: <https://
 nimabrasil.blackboard.com/>. Acesso em: 08/07/2019.
DEITEL, P. J.; DEITEL, H. C: Como Programar. 6. ed. São Paulo: Pearson Prentice Hall, 2011. Disponível em:
<https://Â nimabrasil.blackboard.com/>. Acesso em: 08/07/2019.
LAVRATTI, F. Modularização de Código C. 30 min. São Paulo: TDC. The Developers Conference, 2014.
Disponível em: < (https://www.infoq.com/br/presentations/modularizacao-de-codigo-
c/)https://www.infoq.com/br/presentations/modularizacao-de-codigo-c/
(https://www.infoq.com/br/presentations/modularizacao-de-codigo-c/)>. Acesso em: 08/07/2019.
MIZRAHI, V. V. Treinamento em Linguagem C. 2. ed. São Paulo: Pearson Prentice Hall, 2008. Disponível em
<https://Â nimabrasil.blackboard.com/>. Acesso em 08/07/2019.
MOCHETTI, K. Dijkstra, um Pioneiro em todas as Á reas. Revista digital SBC Horizontes. 2017. Disponível
em: <http://horizontes.sbc.org.br/index.php/2017/10/23/807/
(http://horizontes.sbc.org.br/index.php/2017/10/23/807/)>. Acesso em 08/07/2019.
PEDROSO, C. M. Laboratório de Redes. Remote Procedure Call – RPC. 2006. Disponível em:
<http://www.eletrica.ufpr.br/pedroso/2009/TE090/Aulas/rpc.pdf
(http://www.eletrica.ufpr.br/pedroso/2009/TE090/Aulas/rpc.pdf)>. Acesso em: 08/07/2019.
PUGA, S.; RISSETTI, G. Ló gica de Programação e Estruturas de Dados – com Aplicaçõ es em Java. 3 ed. São
Paulo: Pearson Education do Brasil, 2016. Disponível em: <https://Â nimabrasil.blackboard.com/>. Acesso
em: 08/07/2019.
SCHLEMER, E. Parâmetros Interessantes do scanf e do printf em C. 2009. Disponível em: <
(https://www.vivaolinux.com.br/artigo/Parametros-interessantes-do-scanf-e-do-printf-em-
C)https://www.vivaolinux.com.br/artigo/Parametros-interessantes-do-scanf-e-do-printf-em-C
(https://www.vivaolinux.com.br/artigo/Parametros-interessantes-do-scanf-e-do-printf-em-C)>. Acesso em:
08/07/2019.
https://student.ulife.com.br/ContentPlayer/Index?lc=gd%2fd12LVVHhOTw1%2f21SPDQ%3d%3d&l=Cftg%2fqYAWV10o0QR%2fFXMCA%3d%… 29/29