Você está na página 1de 96

14/11/22, 09:42 Linguagem C: funções

Linguagem C: funções
Profª. Paulo Vidal

Descrição A definição das funções em linguagem C, sua aplicação e os principais


conceitos em sua utilização, incluindo passagem de parâmetros, retorno
de valores e recursão. Acesso às bibliotecas padrão, além de vantagens
do emprego delas.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 1/96
14/11/22, 09:42 Linguagem C: funções

Propósito A linguagem C é muito utilizada no desenvolvimento de softwares


básicos e de aplicativos que demandam um desempenho avançado.
Recurso avançado dessa linguagem, as funções utilizadas no
desenvolvimento de programas com linguagem C permitem ao
programador fazer com que eles sejam mais confiáveis e manuteníveis.

Preparação Para editar, compilar e executar os programas deste conteúdo, é


necessário utilizar uma ferramenta de desenvolvimento de programas
na linguagem C. Existem três compiladores de utilização grátis em
sistemas operacionais Windows: CodeBlocks, DevC++ e Genny. Escolha
uma das ferramentas para desenvolver os programas descritos em
exemplos e exercícios. Caso você possua outro compilador para a
linguagem C diferente dos citados acima, também pode utilizá-lo.

Objetivos

Módulo 1 Módulo 2

Funções: forma geral, valor Matrizes e estruturas como


de retorno, passagem de argumentos de função
parâmetros e escopo
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 2/96
14/11/22, 09:42
parâmetros e escopo Linguagem C: funções

Empregar como parâmetros de uma função


vetores, matrizes e estruturas.
Identificar na função o nome, os
parâmetros, o valor de retorno e o escopo
de variáveis.

Módulo 3 Módulo 4

Recursividade Utilização de biblioteca


padrão
Aplicar o conceito de recursividade na
programação.
Selecionar as funções na biblioteca padrão
adequadas à solução de um programa.

Introdução
De forma paralela ao desenvolvimento dos computadores digitais, ocorreu o
das linguagens de programação. Podemos classificar essas linguagens em
gerações.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 3/96
14/11/22, 09:42 Linguagem C: funções

As de primeira geração são as linguagens de máquina, isto é, linguagens


executadas diretamente pelo hardware. A principal característica delas é não
abstrair as operações executadas pela plataforma de hardware que as
implementa. Um pouco mais à frente no desenvolvimento, temos as
linguagens de segunda geração. Sua principal característica é a sintaxe
humanizada, isto é, o emprego de comandos parecidos com a linguagem
humana, e o surgimento de sub-rotinas.

As linguagens de terceira geração aprimoram o conceito de sub-rotina,


permitindo que sejam passados dados como parâmetros para a sub-rotina e
recebendo como retorno um resultado do cálculo executado. A sub-rotina
com tais aprimoramentos é chamada de função. Veremos como a
linguagem C, que é uma linguagem de terceira geração, permite o emprego
de funções.

Inicialmente, apresentaremos os componentes da estrutura de uma função


em C, mostrando, em seguida, como elaborar programas com funções.
Veremos também as aplicações avançadas por meio de recursividade, isto é,
uma função que chama a si mesma. Por fim, identificaremos um conjunto de
funções predefinidas da biblioteca padrão da linguagem C que está
disponível para o desenvolvedor.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 4/96
14/11/22, 09:42 Linguagem C: funções

1 - Funções: forma geral, valor de retorno, passagem de


parâmetros e escopo
Ao final deste módulo, você será capaz de identificar na função o nome, os parâmetros, o valor de
retorno e o escopo de variáveis.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 5/96
14/11/22, 09:42 Linguagem C: funções

O que são funções?


Funções são blocos de instruções que executam uma tarefa específica. Uma de
suas aplicações é ajudar a lidar com a complexidade de um programa. Assim, à
medida que aumenta a complexidade de programação na resolução de um
problema, pode-se dividir o programa em partes menores, ou seja, as funções
(também chamadas de módulos), para facilitar o entendimento e o
desenvolvimento dele. Desse modo, veremos a seguir como:

code code code


Escrever Criar e passar Devolver um
funções. parâmetros. valor como
resultado de
uma função e
definir
variáveis
locais.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 6/96
14/11/22, 09:42 Linguagem C: funções

Objetivo na utilização de funções


Digamos que você esteja escrevendo um programa C e precise executar a
mesma tarefa nesse programa mais de uma vez. Nesse caso, você tem duas
opções:

Opção 1 Opção 2
Usar o mesmo conjunto de instruções Criar uma função e chamá-la sempre
sempre que quiser realizar a tarefa. que tiver de realizar essa tarefa.

Usar a opção 2 é uma boa prática. Um bom programador, afinal, sempre usa
funções ao escrever código em C. Na linguagem C, todas as ações ocorrem
dentro de funções. O programa principal, aliás, é uma função. Vejamos um
exemplo com um código que imprime duas frases:

Linguagem C
content_copy

1 #include <stdio.h>
2 main()
3 {
4 printf('Seja bem-vindo(a).\n');
5 printf('Ao módulo 1.\n');

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 7/96
14/11/22, 09:42 Linguagem C: funções

6 }
7

Nesse trecho em linguagem C, a função main() é chamada automaticamente no


início do programa. A segunda função usada é o printf(), que é chamada duas
vezes. Observe que a definição da função printf() está na biblioteca stdio.

Atenção!

Todo programa em C sempre terá de possuir a função main() escrita no seu


código independentemente do número e da variedade de funções que o
programa contenha.

Outra forma na utilização de funções é o programador criar as próprias funções.


As que criamos em um programa são conhecidas como funções definidas pelo
usuário.

No desenvolvimento de aplicações, as funções são criadas com os seguintes


objetivos:

Melhorar a legibilidade do código.

Melhorar a capacidade de reutilização do código (a mesma função pode


ser usada em qualquer programa em vez de se escrever o mesmo código
do zero).

Reduzir o tamanho do código (conjuntos duplicados de instruções são


substituídos por chamadas de função).
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 8/96
14/11/22, 09:42 Linguagem C: funções

Separar o programa em partes (blocos) que possam ser logicamente


compreendidos de forma isolada e que facilitem a depuração de erros.

Sintaxe da função
Agora aprenderemos como criar funções definidas pelo usuário e como usá-las
na programação C. A declaração de uma função é dividida em dois passos:

code code
Passo 1 Passo 2
arrow_forward
Declaração do protótipo da Declaração da função
função. propriamente dita.

O protótipo da função é composto basicamente pelo seu cabeçalho, isto é, o tipo


de retorno, o nome da função e seus parâmetros. O protótipo serve para avisar
ao compilador que aquela função existe.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 9/96
14/11/22, 09:42 Linguagem C: funções

O local correto de declarar o protótipo da função é no header file , ou seja, no


arquivo .h. Por isso é que, para usar a função da biblioteca stdio, foi necessário
incluir o header file dessa biblioteca no código do exemplo acima. A sintaxe da
declaração do protótipo de uma função é:

Pseudocódigo
content_copy

1 tipo nome_da_função (tipo var1, ..., tipo varN);

A sintaxe da declaração do corpo de uma função é bastante semelhante à


declaração do protótipo. A principal diferença é o bloco de comandos da função
após a lista de parâmetros em vez do caractere “;”:

Pseudocódigo
content_copy

1 tipo nome_da_função (tipo var1, ..., tipo varN) {


2 corpo da função
3 }

Dica

A declaração do protótipo é opcional. Caso ela não seja feita, a declaração do


corpo da função valerá como protótipo.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 10/96
14/11/22, 09:42 Linguagem C: funções

Os seguintes componentes fazem parte da declaração de uma função:

Nome da função expand_more

A escolha do nome de uma função obedece às regras apresentadas na


designação de variáveis. Tal nome precisa ser único (não pode ser igual
ao de outra função ou de uma variável) e especificar aquilo que a função,
na realidade, faz. Além disso, ele precisa ser de fácil leitura e
interpretação.

Tipo da função expand_more

Representa o tipo do dado retornado pela função ao seu término. Caso


ela não retorne nenhum valor, utiliza-se o tipo void, que não possui objeto
de dados associado.

Parâmetros expand_more

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 11/96
14/11/22, 09:42 Linguagem C: funções

Eles ficam localizados entre parênteses após o nome da função, sendo


constituídos pelos nomes das variáveis que recebem os argumentos na
chamada função, separados por vírgulas e acompanhados de seus
respectivos tipos. Caso a função não contenha parâmetros, a lista de
parâmetros será vazia, embora, ainda assim, seja necessário grafar os
parênteses.

Corpo da função expand_more

Trata-se dos comandos que realizam a computação desejada. Esse


código é privativo da função, ou seja, outra função só pode acessá-lo por
meio de uma chamada à função.

Vejamos um exemplo de declaração de função. Nesse exemplo, a função


declarada soma dois números inteiros:

Linguagem C
content_copy

1 int calcula_soma (int nr1, int nr2) {


2 int soma = nr1 + nr2;

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 12/96
14/11/22, 09:42 Linguagem C: funções

3 return soma;
4 }
5

Agora, vamos identificar cada um dos elementos do código:

Nome da função Parâmetros


calcula_soma. int nr1, int nr2.

Tipo da função Corpo da função


int, indicando que essa função retorna Composto pelos comandos: int soma
um inteiro após seu término. = nr1 + nr2;
e return soma;

Melhorando o código com o uso de


funções
A utilização de funções permite reduzir o tamanho do código no qual conjuntos
duplicados de instruções são substituídos por chamadas de função e melhoram

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 13/96
14/11/22, 09:42 Linguagem C: funções

a legibilidade do código. Apresentaremos dois exemplos que mostram esses


conceitos.

Em nosso primeiro exemplo, o programa imprime no monitor quatro linhas de


asteriscos utilizando o comando for com o formato a seguir. Clique em executar
e veja o resultado:

Exemplo 1
info_outlineTUTORIAL
d content_copyCOPIAR
C Input

1 #include <stdio.h>
2 main() {
3 int i;
4
5 for (i=1 ; i<=4 ; i++)
6 putchar('*');
7 putchar('\n');
8 Console
play_arrow Executar
9 for (i=1 ; i<=6 ; i++)
10 putchar('*');
11 putchar('\n');
12
13 for (i=1 ; i<=8 ; i++)
14 putchar('*');

Dica

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 14/96
14/11/22, 09:42 Linguagem C: funções

Utilizamos emuladores de ambientes de desenvolvimento em nossos exemplos


práticos. Dessa forma, você pode apagar o código apresentado e fazer seus
próprios testes.

Para imprimir cada linha, utiliza-se o comando for nas linhas 5, 9, 13 e 17. Dentro
do for, existe a função putchar(), tendo como argumento o caractere '*' a ser
impresso (linhas 6, 10, 14 e 18). A função tem a seguinte sintaxe:

Pseudocódigo
content_copy

1 int putchar( int caractere );

Essa função exibe um único caractere na tela. O argumento passado será


convertido para caractere e mostrado na tela. As linhas 7, 11 e 15 mostram a
função putchar('\n'), que, após imprimir a linha de asteriscos, salta para próxima
linha.

Se olharmos com atenção o código, veremos que o comando for aparece quatro
vezes, diferindo somente no número de iterações, o qual, por sua vez, representa
o tamanho da linha. Se quisermos modificar o programa para imprimir mais
linhas com asteriscos, precisaremos incluir mais linhas com outros laços de
repetição for, ou seja, teremos de colocar mais código.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 15/96
14/11/22, 09:42 Linguagem C: funções

Utilizando o conceito de função, podemos fatorar o código do


programa e torná-lo mais legível. O ideal seria escrever uma
única função linha a ser responsável pela escrita de uma linha
na tela, que recebe como parâmetro o número de asteriscos a
serem impressos em cada chamada.

Se quisermos escrever quatro asteriscos, invocaremos a função linha(4); se


preferirmos sete asteriscos, a função linha(7); 30 asteriscos, a função linha(30).
Perceba que a função é sempre a mesma (função linha). O que muda é o número
de caracteres a ser colocado na tela.

No programa anterior, o nosso main() passaria a ser:

Linguagem C
content_copy

1 main() {
2 linha(4);
3 linha(6);
4 linha(8);
5 linha(10);
6 }

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 16/96
14/11/22, 09:42 Linguagem C: funções

Como seria então escrita a função linha? Essa função recebe, dentro de
parênteses, um valor do tipo inteiro a ser atribuído a uma variável: o parâmetro.
Uma vez atribuído o argumento ao parâmetro, o laço for, na função linha, terá de
executar o número de vezes que está armazenado nessa variável.

Podemos planejar a função da seguinte forma:

Nome da função Tipo da função Núm

A função a ser escrita será Não tem tipo, isto é, a função A fu


linha(); não retorna nenhum valor após parâ
sua execução; então, coloca-se
como void.

O programa do exemplo 1 pode ser substituído usando a função do Exemplo 2 a


seguir. Leia o código e identifique as diferenças.

Exemplo 2
info_outlineTUTORIAL
d content_copyCOPIAR
C Input

1 #include <stdio.h>
2
3 void linha(int num) {
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 17/96
14/11/22, 09:42 Linguagem C: funções

4 int i;
5 for (i=1 ; i<=num ; i++)
6 putchar('*');
7 putchar('\n');
8 } Console
play_arrow Executar
9
10 main() {
11 linha(4);
12 linha(6);
13 linha(8);
14 linha(10);

Vemos que o número de instruções do programa foi reduzido. Se precisarmos


colocar mais uma linha com sete asteriscos a ser impressa, a redução será
mantida, pois basta acrescentar a chamada de função linha(7). Então, vamos
analisar a diferença primordial entre os dois exemplos:

Exemplo 1 Exemplo 2

Ao fazer uma leitura inicial O código da função linha() é


do Exemplo 1, o apresentado no início, não
programador tem de sendo preciso procurar em
compreender os detalhes outros lugares para
dos quatro laços for. Os entender como funciona a
close função Em seguida na
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 18/96
14/11/22, 09:42 Linguagem C: funções
função. Em seguida, na
quatro laços tornam o
função main(), a leitura das
código mais extenso e
quatro chamadas da função
prejudicam a legibilidade do
mostra claramente a lógica
programa.
de como as linhas serão
apresentadas.

Como vimos, o Exemplo 2, além de reduzir o código, também permitiu a melhora


da legibilidade, ou seja, melhor leitura e entendimento do código.

Passagem de parâmetros e corpo de uma


função
A comunicação com uma função se faz graças aos argumentos que lhe são
enviados e aos parâmetros presentes na função que os recebe. Mas qual é a
diferença de argumento e parâmetro?

Argumento é o valor passado para o parâmetro.

Assim, no exemplo a seguir, vemos que 5 é o argumento passado para o


https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 19/96
14/11/22, 09:42 Linguagem C: funções

parâmetro num da função soma, isto é, implicitamente ocorre a atribuição


num=5;.

Para entender a comunicação entre funções de um programa em C, é


necessário rever o conceito de variável e de escopo de uma variável.

Uma variável é uma entidade capaz de armazenar um objeto de dados. Para isso,
toda variável possui:

Um tipo Um Uma alocação


Que define como objeto
identificador Que é o espaço em
de dados e que será Que nada mais é que o memória RAM
armazenado (sua nome da variável. destinado a armazenar
codificação em o objeto de dados.
memória), além das
operações permitidas
para tal objeto.

O escopo de uma variável é o trecho de código no qual a variável é visível, isto é,


o trecho no qual seu conteúdo pode ser manipulado. Em C, as variáveis podem
ter dois tipos de escopo:

Global Local
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 20/96
14/11/22, 09:42 Linguagem C: funções

Válidas e visíveis em todo programa. Válidas e visíveis somente na função


em que foram declaradas.

Revistos esses conceitos, podemos estudar como se comportam os parâmetros


de uma função, que pode ter 0, 1, 2 ou mais parâmetros, dependendo apenas das
necessidades do programador. Cada função necessita, no entanto, saber qual é
o tipo de cada um dos parâmetros.

Objetos de dados pertencentes a qualquer tipo de dados da linguagem podem


ser enviados como argumentos para uma função, mesmo que o tipo de dados
seja definido pelo programador. Os parâmetros de uma função são separados
por vírgula, sendo absolutamente necessário que, para cada um deles, seja
indicado o seu tipo.

Linguagem C
content_copy

1 funcao(int a, char letra, float k)

O que foi referido anteriormente continua a ser verdade para os parâmetros de


uma função que sejam do mesmo tipo.

Linguagem C
content_copy

1 funcao(int x, int y, int k) /* Exemplo Correto */


https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 21/96
14/11/22, 09:42 Linguagem C: funções

2 funcao(int x, y, k) /* Exemplo Incorreto */

Um parâmetro não é nada mais do que uma variável local à função a que
pertence. Ele é automaticamente inicializado com o valor do argumento enviado
pela função invocadora.

Argumentos são valores (objetos de dados ou referências a eles) passados


como parâmetros para uma função. Essa passagem deve ser realizada
colocando-os dentro de parênteses e separados por vírgulas imediatamente
após o nome da função. Existem diversas mecânicas de passagem de
parâmetros para funções. Duas são mais comuns:

Passagem de parâmetros por valor expand_more

Ocorre implicitamente a atribuição parâmetro = argumento.

Passagem de parâmetros por referência expand_more

O parâmetro e o argumento compartilham a alocação de memória; assim,


qualquer alteração no valor do parâmetro dentro do corpo da função
implica uma alteração na variável passada como parâmetro por

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 22/96
14/11/22, 09:42 Linguagem C: funções

referência (somente variáveis simples podem ser passadas por


referência).

Atenção!

A linguagem C só implementa a passagem de parâmetros por valor; entretanto, a


passagem de parâmetros por referência pode ser simulada.

Quando se faz a chamada de uma função, o número e o tipo dos argumentos


enviados devem ser coincidentes com os parâmetros presentes no cabeçalho da
função.

No exemplo seguinte, a funcao1 recebe três parâmetros que ela armazena em


três variáveis denominadas letra (do tipo char), n (do tipo int) e z (do tipo float).
As variáveis letra, n e z são automaticamente iniciadas com os valores ‘B’, 125 e
20.456, respectivamente, que lhe são enviadas a partir do main().

Linguagem C
content_copy

1 funcao1(char letra, int n, float z)


2 {
3 …
4 }
5
6 main()

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 23/96
14/11/22, 09:42 Linguagem C: funções

7 {
8 …
9 funcao1( ‘B’, 125, 20.456); /* chamada da função */
10 …
11 {

O número de argumentos enviados para uma função deve ser igual ao de


parâmetros existentes no cabeçalho da função. O tipo dos objetos de dados
correspondentes aos argumentos precisa corresponder igualmente aos tipos
dos parâmetros na mesma ordem em que foram declarados. Se a função
receber mais de um parâmetro, os argumentos enviados são associados aos
parâmetros da função pela ordem em que são escritos. Após o conceito de
passagem de parâmetros, podemos resumir como funciona uma função:

code O código de uma função só é executado quando ela é


invocada em alguma parte do programa ao qual está, de
algum modo, ligado.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 24/96
14/11/22, 09:42 Linguagem C: funções

Sempre que uma função é invocada, a função que a invoca é


code
“suspensa” temporariamente. Em seguida, são executadas
as instruções presentes no corpo da função. Uma vez
terminada a função, o controle de execução do programa
volta ao local em que ela foi invocada.

code O programa que invoca uma função pode enviar


argumentos, que são recebidos pela função. Eles são
recebidos e armazenados em variáveis locais, que são
automaticamente iniciadas com os valores enviados. A
essas variáveis dá-se o nome de parâmetros.

code Depois de terminar o seu funcionamento, uma função pode


devolver um valor para o programa que a invocou.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 25/96
14/11/22, 09:42 Linguagem C: funções

Nosso próximo exemplo é uma versão alterada do programa do Exemplo 2 de


forma que a função linha escreva qualquer caractere – e não apenas o caractere
asterisco.

Exemplo 3
info_outlineTUTORIAL
d content_copyCOPIAR
C Input

1 #include <stdio.h>
2
3 linha(int num,char ch)
4 {
5 int i;
6 for (i=1 ; i<=num ; i++)
7 putchar(ch);
8 putchar('\n'); Console
play_arrow Executar
9 }
10
11 main()
12 {
13 linha(3,'+');
14 linha(5,'+');

Foi adicionado um segundo parâmetro à função, permitindo a escrita de uma


linha com qualquer caractere que se deve passar a adicionar na chamada da
função.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 26/96
14/11/22, 09:42 Linguagem C: funções

Observe o cabeçalho da função na linha 3 contendo dois parâmetros (num e ch),


bem como as chamadas da função nas linhas 13 até 16. Cada chamada passa o
número e o tipo de caracteres a ser impresso.

O corpo da função
O corpo de uma função possui três características:

É constituído por instruções de C de acordo com a sintaxe da linguagem.


Tem de se seguir imediatamente ao cabeçalho da função.
É escrito entre chaves.

Atenção!
O cabeçalho de uma função nunca deve ser seguido de ponto e vírgula (;), caso
contrário, estaríamos declarando um protótipo da função.

Sempre que uma função é invocada pelo programa, o corpo da função é


executado, instrução a instrução, até terminar esse corpo ou encontrar a
instrução return, voltando imediatamente à função em que foi invocada. Dentro
do corpo de uma função, pode-se:

code code
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 27/96
14/11/22, 09:42 Linguagem C: funções

Empregar qualquer Invocar qualquer


instrução ou conjuntos função, seja ela escrita
de instruções da pelo usuário ou
linguagem C. pertencente a uma
biblioteca.
No entanto, não é possível definir funções dentro delas. O número de instruções
que pode estar presente dentro de uma função não tem qualquer limite, mas ele
deve ser relativamente pequeno e responsável por realizar uma única tarefa.

Funções que retornam um valor


É possível que uma função seja responsável por realizar determinada tarefa e
que, uma vez terminada, devolva um único valor (objeto de dados) como
resultado. A devolução de um resultado é feita por meio da instrução return,
seguida do valor a ser devolvido.

Para calcular a soma de dois números inteiros, a função responsável por essa
tarefa precisa ter a capacidade de realizar a soma e de retornar o resultado dela,
como no código a seguir:

Repare as duas instruções acima. A função soma terá de receber dois inteiros (3

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 28/96
14/11/22, 09:42 Linguagem C: funções

e 4) e de devolver um resultado (objeto de dados de valor 7) do tipo inteiro para a


variável n, que corresponderá à soma dos dois parâmetros recebidos pela
função. A função printf() imprime o valor 7 armazenado na variável n.
Observemos agora o código da função:

Linguagem C
content_copy

1 int soma(int nr1, int nr2)


2 {
3 int resultado;
4 resultado = nr1 + nr2;
5 return resultado;
6 }

Tipo de retorno é int (inteiro). A palavra reservada int é colocada do lado


esquerdo do nome da função.

Dica
Na linguagem C, o tipo default de retorno é int, isto é, caso o tipo da função seja
omitido, o tipo de retorno será int.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 29/96
14/11/22, 09:42 Linguagem C: funções

Repare que a soma de nr1 e nr2 é colocada numa variável do tipo inteiro
(resultado) cujo objeto de dados armazenado por ela é, em seguida, devolvido
como resultado da função. Os parâmetros da função são nr1 e nr2. O valor a
retornar é armazenado na variável resultado.

Escopo de variáveis
Como vimos, as variáveis podem ser declaradas dentro do corpo de uma função.
Elas são visíveis, ou seja, conhecidas apenas dentro da própria função. Por isso,
são denominadas variáveis locais.

A declaração de variáveis dentro de uma função precisa ser realizada antes de


qualquer instrução, como mostra a estrutura da função a seguir:

Pseudocódigo
content_copy

1 função( ..........)
2 {
3 declaração de variáveis
4 instruções
5 }

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 30/96
14/11/22, 09:42 Linguagem C: funções

Essas variáveis só podem ser utilizadas dentro da própria função. Se uma


mesma variável for declarada em duas funções distintas, não haverá qualquer
tipo de problema, pois o compilador sabe qual utilizar em cada uma delas.
Apesar de terem o mesmo nome, elas são variáveis distintas sem qualquer
relação, do mesmo modo que pode haver dois indivíduos chamados Paulo em
salas de aula distintas.

Depois de terminada a execução de determinada função, todas as suas variáveis


locais são destruídas. As variáveis, portanto, são desalocadas (ou desalojadas)
da memória. Eis um programa que mostra o uso de escopo de variáveis:

Exemplo 4
info_outlineTUTORIAL
d content_copyCOPIAR
C Input

1 #include <stdio.h>
2
3 void escopo1() {
4 int A;
5 A = -100;
6 printf("Valor de A dentro
7 }
8 Console
play_arrow Executar
9 void escopo2() {
10 int A;
11 A = -200;
12 printf("Valor de A dentro

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 31/96
14/11/22, 09:42 Linguagem C: funções

13 }
14

Para mostrar o escopo de variáveis, criamos a variável A em vários locais.


Embora sejam do mesmo tipo e nome, elas são diferentes, pois foram definidas
nas funções main(), escopo1() e escopo2().

Criaremos a tabela adiante para acompanhar os valores de cada variável A ao


longo da execução do programa:

Valor de A na Valo
Execução
função main() função

Linha 17 10

Linha 18 10

Linha 19 20

Linha 20 20

Linha 5 20

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 32/96
14/11/22, 09:42 Linguagem C: funções

Valor de A na Valo
Execução
função main() função

Linha 6 20

Linha 21 20

Linha 22 30

Linha 23 30

Linha 11 30

Linha 12 30

Linha 24 30

Tabela: Valores das variáveis A no programa do Exemplo 4.


Elaborada por: Paulo Vidal.

A coluna que mostra a variável A na função main() sempre tem um valor


https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 33/96
14/11/22, 09:42 Linguagem C: funções

enquanto o programa está em execução. De forma diferente, a variável A na


função escopo1() e a presente na função escopo2() só possuem um valor
enquanto a respectiva função está em execução. Depois que ela é executada, a
variável A é destruída.

A variável local definida no escopo da função só fica alocada


na memória enquanto a função é executada.

Argumentos, parâmetros e escopo: como


video_library utilizar corretamente esses conceitos
No vídeo a seguir, demonstraremos, por meio de um exemplo, como esses
conceitos se aplicam na construção de funções em linguagem C.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 34/96
14/11/22, 09:42 Linguagem C: funções

Falta pouco para atingir seus objetivos.

Vamos praticar alguns conceitos?

Questão 1

Analise o código a seguir e assinale a opção que mostra o resultado correto


após a execução do programa.

Assinale a opção correta:

A Resultado = 60

B Resultado = 16

C Resultado = 32

D Resultado = 10

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 35/96
14/11/22, 09:42 Linguagem C: funções

E Resultado = 8

Parabéns! A alternativa C está correta.

No comando “printf ("Resultado = %d


", funcao(5));”, a função funcao1(5) é
chamada e tem o valor 5 como parâmetro. A funcao1() calcula 2n (codificado
no comando for), sendo n o valor recebido. Desse modo, 25 = 32. Tal
resultado é armazenado na variável result, que é retornado para a função
main() por intermédio do comando “return result;”.

Questão 2

Analise o código adiante em relação ao escopo das variáveis e o resultado do


programa após a execução.

Assinale a resposta correta da saída do programa acima.

Valor de X = 21, Y = 49

A
Valor de X = 21, Y = 49

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 36/96
14/11/22, 09:42 Linguagem C: funções

Valor de X = 21, Y = 50

B
Valor de X = 21, Y = 50

Valor de X = 20, Y = 50

C
Valor de X = 20, Y = 50

Valor de X = 21, Y = 49

D
Valor de X = 20, Y = 50

Valor de X = 20, Y = 50

E
Valor de X = 21, Y = 49

Parabéns! A alternativa D está correta.

Verifica-se que, na linha 14, a função imprimir(X,Y) é chamada e recebe como


parâmetros X=20 e Y=50. Após a execução dos comandos nas linhas 5 e 6, X
= 21 e Y = 49 (variáveis locais na função imprimir). O comando “printf ("Valor
de X = %d, Y = %d
", X, Y);”, localizado na linha 7, imprime o resultado “Valor de
X = 21, Y = 49”. A função imprimir() termina sua execução, e a próxima

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 37/96
14/11/22, 09:42 Linguagem C: funções

instrução a ser executada é o comando printf ("Valor de X = %d, Y = %d


", X,
Y);”, na linha 15, resultando nesta saída: Valor de X = 20, Y = 50.

2 - Matrizes e estruturas como argumentos de função


Ao final deste módulo, você será capaz de empregar como parâmetros de uma função vetores,
matrizes e estruturas.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 38/96
14/11/22, 09:42 Linguagem C: funções

Passagem de vetores para funções


Um vetor é uma abstração comum na maioria das linguagens de programação.
Ele nada mais é que uma variável capaz de armazenar um agregado homogêneo
de objetos de dados, isto é, objetos de dados pertencentes a um mesmo tipo.
Para identificá-los unicamente, o vetor emprega um índice, ou seja, um número
inteiro que distingue qual objeto de dados será acessado. No trecho de código a
seguir, veremos um exemplo de como isso é feito:

Linguagem C
content_copy

1 int vet1[20]; // declaração


2
3 vet1[0]=10; //atribuição 1
4 vet1[1]=5; //atribuição 2
5 vet1[2]=6; //atribuição 3

Na linha com comentário “declaração”, é feita a declaração de uma variável vet1


associada ao tipo inteiro. Observe que, se vet1 fosse uma variável inteira comum,
a declaração terminaria após seu nome com um ponto e vírgula “;”.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 39/96
14/11/22, 09:42 Linguagem C: funções

Entretanto, a declaração continua com o numeral 20 entre colchetes. A


semântica disso é que a variável vet1 não armazena somente um inteiro, mas
também agrega 20 objetos de dados do tipo inteiro.

Sendo assim, como é possível acessar cada objeto de dados


individualmente?

Isso é feito com a identificação da posição do objeto que se deseja acessar


dentro do agregado. O primeiro objeto sempre é identificado pela posição “0” e o
último, no nosso exemplo, pela “19”. Note que a variável vet1 é única, ou seja,
para identificar um dos objetos de dados, é fundamental dizer qual deles, o que é
feito pelo mecanismo já descrito. Assim, no exemplo anterior, a linha com
comentário “atribuição 1” armazena o valor “10” na primeira posição do vetor; a
com “atribuição 2”, o valor “5” na segunda posição – e assim por diante.

Recordado o conceito de vetor, demonstraremos como é feita a passagem de


vetores como parâmetros para funções. Para isso, definiremos duas variáveis
tipo vetor descritas a seguir:

Linguagem C
content_copy

1 int vet1[20];
2 int vet2[30];

Imaginemos que seja nossa intenção iniciar os vetores vet1 e vet2 com o valor
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 40/96
14/11/22, 09:42 Linguagem C: funções

zero em todas as posições e que pretendamos utilizar uma função para realizar
tal carga inicial. Como os vetores possuem dimensões diferentes, teremos
eventualmente de definir duas funções distintas (uma para vetores com 20
inteiros e outra para aqueles com 30 inteiros). Escrevamos o código de cada
uma delas:

Linguagem C
content_copy

1 void inic1(int s[20])


2 {
3 int i;
4 for(i=0;i<20;i++)
5 s[i]=0;
6 }
7 void inic2(int s[30])
8 {
9 int i;
10 for(i=0;i<30;i++)
11 s[i]=0;
12 }

Temos, assim, o código das funções inic1 e inic2. Cada uma tem como

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 41/96
14/11/22, 09:42 Linguagem C: funções

parâmetro um vetor de inteiros. A invocação dessas funções na função main()


precisa ser realizada da seguinte forma:

Linguagem C
content_copy

1 main()
2 {
3 int vet1[20];
4 int vet2[30];
5 inic1(vet1); /* Iniciar o vetor vet1 usando a função
6 inic2(vet2); /* Iniciar o vetor vet2 usando a função
7 }
8

Repare que é enviado um vetor com 20 inteiros à função inic1, que deve ter um
parâmetro do mesmo tipo da variável. Observe ainda que as funções inic1 e inic2
têm semânticas muito parecidas.

Será possível escrever uma única função que seja capaz de


inicializar um vetor de qualquer tamanho?

A resposta é sim. Vejamos como isso acontece. Em C, existe a dualidade


vetor/ponteiro, isto é, uma variável declarada como vetor pode ser vista como
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 42/96
14/11/22, 09:42 Linguagem C: funções

um ponteiro. Para facilitar, vamos relembrar agora o conceito dele. Um ponteiro é


uma variável que armazena um endereço de memória. Os ponteiros são
declarados com a estrutura sintática a seguir:

Linguagem C
content_copy

1 int *a;

A semântica dessa declaração é que a variável “a” armazena um objeto de dados


que é um endereço de memória.

Mas para que serve o tipo inteiro associado na declaração?

A resposta é: para interpretar o conteúdo do endereço armazenado em “a” como


um inteiro. Vamos ver isso por meio de um exemplo:

Vamos analisar as três primeiras linhas:

code Linha 1

É declarada uma variável inteira tradicional. Como sabemos,


toda variável é armazenada em um endereço de memória.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html#
Ch d d l ã d iá l 43/96
14/11/22, 09:42 Linguagem C: funções
Chamamos esse endereço de alocação da variável.

Vamos supor que a variável “a” tenha alocação no endereço


0x0300 (o hexadecimal foi usado por ser usual para
expressar endereços). Assim, o valor 10 é armazenado
nesse endereço após a inicialização da variável.

code Linha 2

É declarado um ponteiro. Desse modo, “b” armazena um


endereço de memória, sendo inicializado com o endereço
da alocação de “a” (isso é feito por meio do operador &, que
retorna o endereço da alocação de uma variável). Ou seja, a
variável “b” armazena o endereço 0x0300.

code Linha 3

É invocada a função printf; conforme foi escrita, a função


printf imprime um inteiro, que, por sua vez, corresponde à
avaliação da expressão “*b”. O operador asterisco “*” aplica-

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html#
t i i t t bj t d d d tid 44/96
14/11/22, 09:42 Linguagem C: funções
se a ponteiros e interpreta o objeto de dados contido no
endereço armazenado em seu argumento como um inteiro.
Lembre-se de que “b” foi declarada como int *b; por isso, o
operador “*” interpreta o conteúdo do endereço armazenado
por b como inteiro. Dessa forma, como o endereço
armazenado em “b” é o endereço da alocação de “a”, o
conteúdo interpretado é o da variável “a”: 10. Sendo assim, o
resultado da execução seria:

10

0x0300

Na linguagem C, existe a dualidade vetor/ponteiro. Dessa forma, ao declararmos


int vet1[20];, vet1 poderá ser visto como um vetor caso seja sucedido por
colchetes ou como ponteiro caso seja grafado sozinho. Dessa maneira, vet1 é
um ponteiro para o endereço de memória onde está armazenado o primeiro
elemento do vetor. Mas como podemos utilizar isso?

Imagine que desejemos criar uma única função para inicializar vetores de
inteiros de qualquer tamanho. Como procederíamos? Simples: em vez de passar
o vetor com seu tamanho como parâmetro, passaremos um ponteiro. O código a
seguir exemplifica o uso:

Linguagem C
content_copy
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 45/96
14/11/22, 09:42 Linguagem C: funções
content_copy

1 void inic(int *s, int tam)


2 {
3 int i;
4 for(i=0;i<tam;i++)
5 s[i]=0;
6 }
7 int main()
8 {
9 int a[20];
10 int b[30];
11 inic (a,20);
12 inic (b,30);
13 return 0;
14 }

Observe que a função inic tem dois parâmetros:

“s” “tam”
É um ponteiro. O parâmetro “s” foi É um inteiro. O parâmetro “tam” foi
declarado como ponteiro, embora, no utilizado para definir até onde
corpo da função, tenha sido utilizado inicializar o vetor.
como vetor.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 46/96
14/11/22, 09:42 Linguagem C: funções

Passagem de matrizes para funções


A passagem de matrizes para funções é semelhante à de vetores para funções.
Uma matriz nada mais é que um vetor de vetores, isto é, um agregado de
vetores. Sendo assim, cada objeto de dados é identificado unicamente por dois
índices que chamamos de linha e coluna.

Como exemplo, construiremos uma função que receba uma matriz quadrada e
retorne a soma dos elementos da diagonal principal. Uma matriz quadrada é
definida como uma matriz com o número de linhas igual ao de colunas, tendo a
diagonal principal composta pelos elementos que têm o índice da linha igual ao
da coluna de uma matriz quadrada. Uma matriz M3x3 possui 9 valores, enquanto
a diagonal principal é formada por 3 elementos (M1,1, M2,2, M3,3). Nosso
próximo programa calcula a soma da diagonal principal de uma matriz quadrada
M3x3 , utilizando uma função para executar essa tarefa.

Exemplo 1
info_outlineTUTORIAL
d content_copyCOPIAR
C Input

1 #include <stdio.h>
2 int soma_diagonal(int mat[3][3
3 int soma = 0;
4 for (int i=0; i < 3 ; i++
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 47/96
14/11/22, 09:42 Linguagem C: funções

5 {
6 for (int j=0; j < 3
7 if(i == j)
8 Console
play_arrow Executar
9 soma = som
10 }
11 return soma;
12 }
13 main()
14 {

Vamos à explicação do programa:

code Linha 2

Definição da função soma_diagonal, recebendo a matriz de


inteiros como parâmetro.

code Linha 3

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html#
D fi i ã d iá l ti i t d 48/96
14/11/22, 09:42 Linguagem C: funções
Definição da variável tipo int com zero, usada para
armazenar a soma dos elementos da diagonal principal.

code Linha 4

Laço for para a iteração de cada linha (variável i representa


o número da linha).

code Linha 5

Laço for para a iteração de cada coluna (variável j


representa o número da coluna). A varredura da matriz é por
coluna.

code Linha 6

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html#
C d if (i j) id tifi l t d di l 49/96
14/11/22, 09:42 Linguagem C: funções
Comando if (i == j) para identificar os elementos da diagonal
principal.

code Linha 7

Expressão matemática para somar os elementos da


diagonal principal.

code Linha 8

Comando return, devolvendo o valor da variável soma para o


main().

code Linhas 13 a 15

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html#
D fi i ã i i i li ã d ti Ob l t 50/96
14/11/22, 09:42 Linguagem C: funções
Definição e inicialização da matriz. Observe os elementos
das linhas 0, 1 e 2.

code Linha 16

Imprime a saída do programa “Soma da diagonal principal =


15”. A chamada da função soma_diagonal(matriz) pode ser
feita dentro do comando printf() como segundo argumento
da função printf(). A função soma_diagonal retorna o
resultado de um valor inteiro que é impresso na tela.

Recomendação
Retorne ao emulador, altere os valores e faça novos testes. Aproveite a
oportunidade para fixar os conceitos abordados e estimular o raciocínio lógico.

Passagem de registros para funções

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 51/96
14/11/22, 09:42 Linguagem C: funções

Um registro é uma abstração comum nas linguagens de programação. Ele


constitui basicamente um agregado heterogêneo de objetos de dados, isto é,
objetos de dados de tipos distintos acessados pela mesma declaração de
variável.

O trecho de código adiante exemplifica a declaração de um registro. Em


linguagem C, essa abstração é chamada de struct.

Linguagem C
content_copy

1 struct pessoa
2 {
3 char nome[50];
4 int idade;
5 float salario;
6 };

A semântica dessa declaração é que o registro (struct) pessoa agrega três


objetos de dados distintos:

looks_one looks_two looks_3


https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 52/96
14/11/22, 09:42 Linguagem C: funções

Um vetor de O inteiro idade. O número de


caracteres, ponto flutuante
identificado salário.
por nome.

A declaração da struct como está é equivalente à de um novo tipo. Esse tipo é


identificado por struct pessoa. Observe então que, como está, a declaração não
instancia uma variável. Para instanciá-la, é necessária a linha adicional descrita a
seguir.

Linguagem C
content_copy

1 struct pessoa funcionario;

O aceso a cada elemento do agregado heterogêneo é feito pelo operador ponto


“.”. Assim, para acessar o campo idade, por exemplo, basta grafar este código:

Linguagem C
content_copy

1 funcionario.idade = 50;

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 53/96
14/11/22, 09:42 Linguagem C: funções

Cuja semântica é: atribua o valor 50 ao campo idade do registro identificado por


funcionario.

Entendamos, por meio de um exemplo, como é possível passar uma struct como
parâmetro para uma função. Nosso próximo programa apresenta uma função
que permita escrever na tela os valores existentes em uma estrutura recebida
como argumento. Essa estrutura possui informações de um funcionário, como
nome completo, idade e salário.

Exemplo 2
info_outlineTUTORIAL
d content_copyCOPIAR
C Input

1 #include <stdio.h>
2
3 struct pessoa
4 {
5 char nome[50];
6 int idade;
7 float salario;
8 }; Console
play_arrow Executar
9
10 void exibir(struct pessoa f)
11 {
12 printf("Nome : %s\n",f.no
13 printf("Idade : %d\n",f.i
14 printf("Salário : %.2f\n"

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 54/96
14/11/22, 09:42 Linguagem C: funções

Vamos à explicação do programa:

code Linhas 3 a 8

Definição da struct pessoa com os campos nome, idade e


salário.

code Linha 10

Definição da função exibir(struct pessoa f). Note que a


variável f é o parâmetro recebido do tipo pessoa.

code Linhas 11 a 15

É o corpo da função no qual são impressos os dados do


funcionário. Veja que não existe o comando return, pois a
função não precisa retornar valor (o tipo da função é void).

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 55/96
14/11/22, 09:42 Linguagem C: funções

code Linha 19

Inicializa a variável p.

code Linha 20

Chamada da função exibir(p) com o parâmetro p.

Como se pode observar, o tipo a ser colocado no parâmetro da função


corresponde ao do argumento que lhe é enviado.

Simulando passagem de parâmetros por


video_library referência em C
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 56/96
14/11/22, 09:42 Linguagem C: funções

No vídeo a seguir, demonstraremos, por meio de um exemplo, como utilizar


ponteiros para simular a passagem de parâmetros por referência em C.

Falta pouco para atingir seus objetivos.

Vamos praticar alguns conceitos?

Questão 1

Interprete o programa a seguir, verifique o que a funcao2() faz e assinale qual


das opções será impressa na saída.

Marque a opção correta.

A -225

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 57/96
14/11/22, 09:42 Linguagem C: funções

B -23

C 20

D 19

E 225

Parabéns! A alternativa B está correta.

A funcao2() realiza a subtração dos elementos do vetor. A expressão


aritmética x = x - v[i] é executada a cada iteração do comando for. Quando i =
1 e x = 101, há a expressão x = x - v[1] = 101 – 30 = 71. Quando i = 2, x = 71 –
22 = 49. Quando i = 3, x = 49 – 31 = 18. Quando i = 4 (última rodada), x = 18 –
41 = -23. Desse modo, a função funcao2() retorna x = -23.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 58/96
14/11/22, 09:42 Linguagem C: funções

Questão 2

Interprete o programa adiante, verifique o que a função func3() faz e assinale


qual das opções será impressa na saída após a execução.

Aponte a opção correta.

A Paulo Cesar 50 10000,00

B Mauro Cesar 60 12500,00

C Paulo Victor 51 12000,00

D Paulo Cesar 60 12500,00

E Paulo Cesar 51 12500,00

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 59/96
14/11/22, 09:42 Linguagem C: funções

Parabéns! A alternativa E está correta.

São passadas três estruturas como parâmetros para a func3. A função


func3() recebe os parâmetros e imprime o nome da variável f1, a idade da
variável de f2 e o salário da variável. Com isso, a saída é “Paulo Cesar 51
12500,00”.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 60/96
14/11/22, 09:42 Linguagem C: funções

3 - Recursividade
Ao final deste módulo, você será capaz de aplicar o conceito de recursividade na programação.

Conceito de recursividade
Nós, seres humanos, temos como
característica o pensamento linear.
Por exemplo, se desejo fazer um bolo,
procuro a receita do bolo e sigo a
receita linearmente, passo a passo.
Inicialmente, executo o primeiro
passo, como colocar a farinha no
pote. Após isso, faço o segundo,
Seguir a receita de um bolo é um processo linear ou
seguindo essa linha até o último não recursivo.
passo: colocar o bolo para assar no
forno. Esse é o típico pensamento
linear ou não recursivo.

Analisemos um exemplo no domínio dos algoritmos.

Desejo determinar o maior elemento em uma sequência de n elementos. Para


isso, a maioria das pessoas criaria o seguinte algoritmo:

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 61/96
14/11/22, 09:42 Linguagem C: funções

1. Passo inicial: máximo = 1º elemento da sequência.


2. Passo geral: repito para o 2º elemento até o último elemento a seguinte
comparação:
3. Se máximo < elemento analisado, então máximo = elemento analisado.
4. Ao final, a variável máximo armazenará o maior elemento da sequência.

Esse raciocínio é intuitivo e bastante humano. No entanto, há uma segunda


abordagem para a solução do problema. A abordagem recursiva divide o
problema em subproblemas da mesma natureza do original. Vejamos como
seria essa abordagem para a determinação do máximo da sequência.

Podemos raciocinar que a determinação do máximo é feita de seguinte forma: o


máximo da sequência s1, s2, s3, ... sn, com n elementos, é o máximo entre s1 e o
máximo de s2, s3, s4, ..., sn. Quando fazemos tal divisão, transformamos o
problema original, que tinha tamanho n, em dois subproblemas:

Subproblema 1 Subproblema 2
De tamanho 1 (que chamamos de Determinação do máximo na
problema trivial ou infantil). sequência de tamanho n -1, isto é, a
sequência: s2, s3, ..., sn.

Nesse ponto surge a recursividade: o máximo da sequência s2, s3, ..., sn pode
ser resolvido da mesma forma, ou seja, é o máximo entre s2 e o máximo da
sequência s3, s4, ... sn. Tal é a essência do pensamento recursivo.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 62/96
14/11/22, 09:42 Linguagem C: funções

Analisando um exemplo de tamanho 4, qual seria o máximo


da sequência 10, 8, 20, 16?

Vejamos a resposta recursiva:

Passo 1 expand_more

É o máximo entre 10 e o máximo de 8, 20, 16.

Observe que, sem usar outro algoritmo, não conseguimos dizer quem é o
máximo de 8, 20, 16. Sendo assim, o passo 2 é necessário.

Passo 2 expand_more

Máximo de 8, 20, 16 é o máximo entre 8 e o máximo de 20,16.

Mais uma vez, não é possível apontar quem é o máximo da sequência 20,
16 sem executar um algoritmo, o que induz ao passo 3.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 63/96
14/11/22, 09:42 Linguagem C: funções

Passo 3 expand_more

Máximo de 20, 16 é o máximo entre 20 e a sequência 16, que é unitária.


Desse modo, o máximo entre 20, 16 é o maior valor entre 20 e 16, ou seja,
20.

Voltemos ao:

Passo 2: Agora sabemos o máximo da sequência 20,16: 20. Dessa forma, o


máximo entre 8, 20, 16 é o máximo entre 8 e 20, que é 20.
Passo 1: O máximo da sequência 10, 8, 20, 16 é o máximo entre 10 e 20:
20.

Tal é a abordagem recursiva para encontrar o máximo de uma sequência.

Resolvendo o quebra-cabeça Torres de


video_library Hannoi
No vídeo a seguir, mostraremos como o raciocínio recursivo é a abordagem mais

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 64/96
14/11/22, 09:42 Linguagem C: funções

simples para solução do quebra-cabeça.

Recursividade em C
Para as linguagens de programação, a recursividade é entendida como a
capacidade que uma linguagem tem de permitir que uma função possa invocar a
si mesma. A recursividade pode ser:

Direta Indireta

Uma função invoca a si Uma função f invoca outra


mesma no seu corpo de close função g, a qual, por sua
função. vez, volta a invocar a função
f.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 65/96
14/11/22, 09:42 Linguagem C: funções

Em nosso próximo programa, vamos implementar a função fatorial que calcula o


valor de n! utilizando o comando for, sendo que: n! = n * (n-1) * (n-2) * ... * 2 * 1 e
sabendo que 0!=1. Exemplo: 4! = 4*3*2*1 = 24.

Exemplo 1
info_outlineTUTORIAL
d content_copyCOPIAR
C Input

1 #include <stdio.h>
2 int fatorial(int n) {
3 int fat = 1;
4 for(int i = 1; i <= n; i+
5 fat = fat * i;
6 return fat;
7 }
8 main() Console
play_arrow Executar
9 {
10 int n;
11 printf("Entre com um núme
12 scanf("%d", &n);
13 printf("%d! = %u\n",n,fat
14 }

No entanto, poderemos olhar para a definição da função fatorial e verificar que n!

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 66/96
14/11/22, 09:42 Linguagem C: funções

= n * (n-1) * (n-2) * ... * 2 * 1 é equivalente a n! = n * (n-1)!, pois (n-1)! = (n-1) *


(n-2) * ... * 2 * 1. Dessa forma, a definição do fatorial é realizada pelo próprio
conceito de fatorial:

0! = 1
n! = n * (n-1)!

Agora, vamos construir uma função que calcule o valor do fatorial de n utilizando
o conceito de recursividade. A recursividade é uma forma de implementar um
laço por meio de chamadas sucessivas à mesma função.

Exemplo 2
info_outlineTUTORIAL
d content_copyCOPIAR
C Input

1 #include <stdio.h>
2
3 int fatorial(int n) {
4 if (n==0) /* Condição pa
5 return 1;
6 else
7 return n*fatorial(n-
8 } Console
play_arrow Executar
9
10 main() {
11 int n;
12 printf("Entre com um núme

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 67/96
14/11/22, 09:42 Linguagem C: funções

13 scanf("%d", &n);
14 i tf("%d! % \ " f t

Verificamos que o código da função com recursividade (linhas 3 a 8) ficou mais


simples que o presente no exemplo anterior.

Lógica de funcionamento de uma


chamada recursiva
Veremos agora o resultado de se invocar a função fatorial com o valor 4.

Passo 1 expand_more

Em primeiro lugar, vamos verificar se o valor passado à função é zero,


pois, nesse caso, não vale a pena realizar qualquer cálculo, sendo o
resultado igual a 1 (linhas 4 e 5). Como ele não é zero, o valor de
fatorial(4) é calculado aplicando a fórmula:

fatorial(4) = 4 * fatorial(3)

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 68/96
14/11/22, 09:42 Linguagem C: funções

Passo 2 expand_more

Como podemos observar, para obter o valor de fatorial(4), necessitamos


calcular o de fatorial(3). O cálculo de fatorial(4) fica dependente do
cálculo de fatorial(3). Realizamos então este cálculo: fatorial(3) = 3 *
fatorial(2).

Passo 3 expand_more

O mesmo volta a acontecer, havendo a necessidade de calcular


fatorial(2), ficando fatorial(3) também dependente fatorial(2). Vamos
então realizar este cálculo: fatorial(2) = 2 * fatorial(1).

Passo 4 expand_more

Tendo a necessidade de calcular fatorial(1), fica o fatorial(2) também


dependente do cálculo de fatorial(1) = 1 * fatorial(0).

O cálculo de fatorial(0) finaliza as chamadas recursivas à função e


retorna 1, pois

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 69/96
14/11/22, 09:42 Linguagem C: funções

fatorial(0) = 1. Dessa forma, já podemos obter o valor de fatorial(1), pois:

fatorial(1) = 1 * fatorial(0) = 1 * 1 = 1.

O mesmo se pode dizer para fatorial(2): fatorial(2) = 2 * fatorial(1) = 2 * 1


=2

Continuando, eis o cálculo de fatorial(3) = 3 * fatorial(2) = 3 * 2 = 6.

E, finalmente, temos a capacidade de calcular o valor de fatorial(4):


fatorial(4) = 4 * fatorial(3) = 4 * 6 = 24.

Observe que, se a função fatorial não tivesse a condição de parada do comando


if(n==0) return 1, ela seria reduzida ao código a seguir:

Linguagem C
content_copy

1 int fatorial(int n) {
2 return n*fatorial(n-1); /* chamada recursiva */
3 }

O programa entraria em laço infinito (loop), pois a função não pararia de chamar
a si própria até esgotar toda a memória disponível.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 70/96
14/11/22, 09:42 Linguagem C: funções

Boas práticas na programação de funções


recursivas
Elencaremos três delas a seguir:

Critério de término

A primeira instrução de uma função recursiva deve ser sempre a


implementação do critério de término das chamadas, isto é, a condição
ou as condições que se deve verificar para que a função pare de invocar a
si própria.

Chamada recursiva

Após codificar o critério de término, será preciso escrever a chamada


recursiva da função, que sempre é relativa a um subconjunto. Repare, por
exemplo, que, ao invocar a função fatorial com o valor n, a sua chamada
recursiva é sempre realizada com n-1.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 71/96
14/11/22, 09:42 Linguagem C: funções

Menos código

Com a recursividade, ganha-se, devido à menor quantidade de código


escrito, mais legibilidade. Entretanto, perde-se em termos de
desempenho.

Falta pouco para atingir seus objetivos.

Vamos praticar alguns conceitos?

Questão 1

Em um programa na linguagem C, duas funções fazem chamadas recíprocas:


uma função f1 faz uma chamada a uma função f2, que, por sua vez, faz outra
a f1. Isso é uma técnica de programação chamada de

A programação orientada a funções.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# i id d di 72/96
14/11/22, 09:42 Linguagem C: funções

B recursividade direta.

C lista circular.

D recursividade indireta.

E lista indireta.

Parabéns! A alternativa D está correta.

A recursividade indireta ocorre quando uma função, que vamos nominar f1,
faz chamada a outra função (nominada f2). Caso a função f2 chame f1 em
seu interior, temos um exemplo de recursividade indireta.

Questão 2

Interprete o código a seguir e assinale a opção correta quanto ao valor


retornado pela função recursividade com o parâmetro de valor 5.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 73/96
14/11/22, 09:42 Linguagem C: funções

Javascript
content_copy

1 #include < stdio.h >


2 int recursividade(int n)
3 {
4 if (n>0) {
5 n = 2*recursividade(n-1);
6 return n;
7 }
8 else return 1;
9 }
10 int main()
11 {
12 recursividade(5);
13 }

A 4

B 128

C 16
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 74/96
14/11/22, 09:42 Linguagem C: funções
C 16

D 64

E 32

Parabéns! A alternativa E está correta.

A função recursividade calcula o valor de 2n, sendo n o expoente. Assim,


como o parâmetro recebido de função é 5, o valor retornado é 25 = 32.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 75/96
14/11/22, 09:42 Linguagem C: funções

4 - Utilização de biblioteca padrão


Ao final deste módulo, você será capaz de selecionar as funções na biblioteca padrão adequadas à
solução de um programa.

História da biblioteca padrão do ANSI C


https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 76/96
14/11/22, 09:42 Linguagem C: funções

Antes de ser padronizada, a linguagem C não fornecia funcionalidades nativas


como operações de entrada e saída. Com o tempo, a comunidade de usuários
compartilhou ideias e implementações, o que é atualmente chamado de
biblioteca padrão. Vejamos um pouco da história:

1970 1980 198

A linguagem C tornou-se cada Aumentaram os problemas de AA


vez mais popular. Diferentes compatibilidade por conta Inst
universidades e organizações dessas diferentes versões. com
estavam criando as próprias esp
variações dessa linguagem para ling
seus projetos. ANS

Parte do padrão C89 é o conjunto de bibliotecas denominado biblioteca padrão


do ANSI C. Por isso, abordaremos neste módulo as funções da biblioteca ANSI
C. De maneira mais específica, veremos o que elas são e como usá-las em seu
programa.

Bibliotecas
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 77/96
14/11/22, 09:42 Linguagem C: funções

Anteriormente, entendemos como


codificar funções em linguagem C. No
entanto, suponha que, cada vez que
pretenda programar, você tenha de
reescrever aquelas funções básicas
que todo programa utiliza. Um
exemplo simples é a função de
impressão na tela. Imagine que, toda
vez que for escrever um programa,
você precise reprogramar uma função
para escrever na tela. Não tem muito
sentido, certo?

Como podemos resolver esse problema?

Uma solução é agrupar funções de uso corriqueiro em bibliotecas de funções.


Com isso, quando a função for necessária, bastará usar a biblioteca para ter a
funcionalidade desejada disponível. Conforme já frisamos, a padronização das
bibliotecas já foi feita na década de 1990. Ainda assim, entenderemos como isso
é implementado.

Para entender a forma de disponibilizar bibliotecas, é necessário lembrar como


as linguagens de segunda e terceira geração são executadas por computadores.
Como se sabe, eles somente executam linguagem de máquina. Desse modo,

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 78/96
14/11/22, 09:42 Linguagem C: funções

qualquer outra linguagem de programação deve ser traduzida para a de máquina.


Há duas formas de implementar essa tradução:

Interpretação Compilação
Comando a comando. Todos os comandos do programa de
uma única vez.

Comentário
Existem vantagens e desvantagens em ambas, mas não nos aprofundaremos
nessas questões.

A linguagem C é uma linguagem


compilada. Assim, como já vimos,
todo o código é analisado e traduzido
para linguagem de máquina de uma
vez. Para um programa simples, o
processo não parece muito complexo;
entretanto, para um complexo,
composto por diversas
funcionalidades distintas, ele não é
nada obvio.

Suponha que um programa seja composto por vários arquivos diferentes, cada
um agrupando funções relacionadas a alguma funcionalidade, como, por

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 79/96
14/11/22, 09:42 Linguagem C: funções

exemplo, um sistema escrito em linguagem C composto por três arquivos:

insert_drive_file insert_drive_file insert_drive_file


gui.c bd.c principal.c
Agrupa as funções da Agrupa as funções de Com o programa
interface gráfica. comunicação com o principal e suas funções
banco de dados. acessórias.

O passo de tradução do programa em linguagem C para a de máquina é


chamado de compilação. Cada arquivo é compilado individualmente, gerando
um arquivo em linguagem de máquina (usualmente com extensão bin). Assim,
para o nosso exemplo, a compilação dos arquivos gui.c, bd.c e principal.c geraria
três arquivos distintos: gui.bin, bd.bin, principal.bin, que contêm a tradução das
funções contidas em cada arquivo “.c” para a linguagem de máquina.

Como juntar esses três arquivos em um único programa


executável?

Isso é feito por outro aplicativo: o link editor. Sendo assim, para gerar um
programa executável, são necessários dois passos:

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 80/96
14/11/22, 09:42 Linguagem C: funções

Compilação Link edição

Passo em que é feita a Onde os diversos arquivos


tradução da linguagem de arrow_forward bin (em linguagem de
alto nível para a de máquina) são ligados em
máquina. um único executável.

Aqui surge um problema. Suponha que, dentro de uma função contida no arquivo
principal.c, haja a necessidade de invocar outra declarada em gui.c. Vamos supor
ainda, por exemplo, que precisemos chamar a função draw_window(), a qual, por
questões de simplificação, não tem parâmetros.

A função (draw_window) foi escrita e compilada sem erros – só que em outro


arquivo. Dessa maneira, ao ser invocada dentro de uma função contida no
arquivo principal.c, essa função é desconhecida; assim, o compilador reporta um
erro. Como resolver isso? Por meio do uso de protótipos de funções.

Recomendação

É considerada uma boa prática de programação associar a cada arquivo com


extensão “.c” outro com extensão “.h”, que, como já vimos, é chamada de header
file ou arquivo cabeçalho. Nesse arquivo, inserirmos todos os protótipos de
funções contidas no arquivo “.c” associado a ele. Logo, quando fazemos o
include do arquivo “.h” no início do nosso código, estamos incluindo todos os

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 81/96
14/11/22, 09:42 Linguagem C: funções

protótipos de funções daquele arquivo “.c” associado. Por isso, não ocorrem
erros de compilação.

Qual é a relação disso tudo com o uso de bibliotecas padrão? Uma biblioteca
nada mais é do que um código em linguagem C já compilado pelo fornecedor da
biblioteca, que será o link editado com o seu código em linguagem C. Entretanto,
para que o compilador seja capaz de não reportar erros no passo de compilação,
será necessário adicionar o arquivo “.h”, que contém os protótipos das funções
implementadas na biblioteca. A imagem a seguir ilustra tal processo:

Adicionando arquivo de protótipos das funções na biblioteca.

Por essa razão, é fundamental realizar o “#include” do arquivo “.h” no início do


código que usa determinada biblioteca. Esse comando “#include” – que, na
verdade, constitui uma diretiva de compilação – insere no ponto que é declarado
o conteúdo do arquivo “.h” (algo muito parecido com um “control-v/control-c”).

Vamos ao exemplo. Suponha que nosso desejo seja compilar o código a seguir:

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 82/96
14/11/22, 09:42 Linguagem C: funções

Linguagem C
content_copy

1 #include ”gui.h”
2 #include “db.h”
3
4 void desenha_resposta_consulta ()
5 {
6 char saida[80];
7 query_db (saída,”select * from aluno where matricula=
8 draw_window (saida);
9 }

Observe que a função query_db, assim como a draw_window, não está


codificada no arquivo. Isso vai resultar em um erro? Em princípio, sim, a menos
que o protótipo dessas funções esteja declarado nos arquivos “.h” incluídos pela
diretiva “#include”. Imagine então que o conteúdo do arquivo db.h seja este:

Linguagem C
content_copy

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 83/96
14/11/22, 09:42 Linguagem C: funções

1 int open_db (char *database);


2 int close_db (char *database);
3 void query_db (char *saída, char *query);

E que o conteúdo de gui.h seja:

Linguagem C
content_copy

1 void draw_window (char *str);

Podemos perceber que os protótipos das funções utilizadas estão nos arquivos
“.h”; assim, o compilador substituirá a diretiva “#include” pelo conteúdo do
arquivo. Ou seja, para fins de análise, o compilador “verá” o código a seguir:

Linguagem C
content_copy

1 void draw_window (char *str);


2 int open_db (char *database);
3 int close_db (char *database);
4 void query_db (char *saída, char *query);
5

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 84/96
14/11/22, 09:42 Linguagem C: funções

6 void desenha_resposta_consulta ()
7 {
8 char saida[80];
9 query_db (saída,”select * from aluno where matricula
10 draw_window (saida);
11 }

Como os protótipos das funções utilizadas estão declarados, não ocorrerão


erros de compilação. Mas esse código já pode ser executado?

A resposta é não. O protótipo da função não carrega o corpo da função. Esse


corpo foi compilado em outro arquivo ou pertence a uma biblioteca. Por isso, o
código só pode ser executado após link edição.

Vantagens de usar funções da biblioteca


C
A seguir temos as principais vantagens de usar funções da biblioteca C:

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 85/96
14/11/22, 09:42 Linguagem C: funções

As funções funcionam expand_more

Uma das razões mais importantes para você usar as funções de


biblioteca é simplesmente porque elas funcionam. Além de terem
passado por vários testes rigorosos, essas funções são fáceis de usar.

As funções são otimizadas para desempenho expand_more

A manutenção contínua da "biblioteca padrão" por um grupo dedicado de


desenvolvedores as torna constantemente melhores. No processo, eles
são capazes de criar o código mais eficiente para desempenho máximo.

Economiza um tempo considerável de desenvolvimento expand_more

Como as funções gerais, como imprimir em uma tela ou calcular a raiz


quadrada, entre outras, já estão prontas para uso, você não deve se
preocupar em criá-las novamente.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 86/96
14/11/22, 09:42 Linguagem C: funções

As funções permitem a portabilidade dos programas expand_more

Com as necessidades do mundo real em constante mudança, o esperado


é que seu aplicativo funcione sempre e em qualquer plataforma
computacional (conjunto do sistema operacional e hardware). As funções
da biblioteca o ajudarão, já que elas fazem a mesma coisa em todos os
computadores.

Arquivos de cabeçalho da biblioteca


padrão na linguagem C
Veja a descrição dos arquivos de cabeçalho da biblioteca padrão na linguagem
C:

< math.h > < time.h > < lo

Funções matemáticas. Funções de data e hora. Fun

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 87/96
14/11/22, 09:42 Linguagem C: funções

Em nosso próximo exemplo, para calcular a raiz quadrada de um número, você


pode usar a função de biblioteca sqrt(). Essa função é definida no arquivo de
cabeçalho < math.h >.

Exemplo 1
info_outlineTUTORIAL
d content_copyCOPIAR
C Input

1 #include <stdio.h>
2 #include <math.h>
3 main()
4 {
5 float num, raiz;
6 printf("Digite um número:
7 scanf("%f", &num);
8 raiz = sqrt(num); /* FUNÇÃ Console
play_arrow Executar
9 printf("Raiz quadrada de %

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 88/96
14/11/22, 09:42 Linguagem C: funções

10 }
11

Recomendação
Aproveite para estudar mais e fazer novos testes. Desafie-se a implementar
outros programas. É muito importante que você pratique os conceitos estudados
e procure descobrir novos caminhos para as soluções desejadas. A evolução é
resultado da prática constante. Não desista, você está no caminho certo!

Pesquisando funções nas bibliotecas ANSI


video_library C
No vídeo a seguir, demonstraremos como pesquisar e aplicar as funções das
bibliotecas ANSI C.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 89/96
14/11/22, 09:42 Linguagem C: funções

Falta pouco para atingir seus objetivos.

Vamos praticar alguns conceitos?

Questão 1

Em relação às boas práticas de programação, é recomendável que o


desenvolvedor empregue as funções da biblioteca padrão em C. Assinale a
opção correta quanto à vantagem na utilização de funções da biblioteca
padrão na programação em C.

As funções disponíveis dificultam a portabilidade dos


A
programas.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 90/96
14/11/22, 09:42 Linguagem C: funções

Não sabemos se as funções foram criadas com um código


B eficiente para desempenho máximo, pois não foram
realizados testes durante a programação.

A elaboração das especificações das funções da biblioteca


C não envolve organizações de padronização, apenas
universidades e empresas.

O programador economiza um tempo considerável de


D
desenvolvimento, pois as funções estão prontas para uso.

As funções têm apresentado diversos erros de


E
implementação que dificultam a programação.

Parabéns! A alternativa D está correta.

Como as funções gerais, como imprimir em uma tela e calcular a raiz


quadrada, entre outras, já estão prontas para uso, não será preciso se
preocupar em criá-las novamente, pois elas já estão disponíveis e
economizam tempo de programação.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 91/96
14/11/22, 09:42 Linguagem C: funções

Questão 2

Você está codificando um programa e precisa verificar se determinado


caractere digitado é maiúsculo ou minúsculo, tomar uma decisão e invocar
determinada função em relação ao tipo de caractere escolhido. Você sabe
que, na biblioteca padrão, existem funções de manipulação de caracteres.
Marque a opção com o arquivo cabeçalho que você precisa incluir no
programa para resolver tal problema.

A < math.h >

B < ctype.h >

C < stdio.h >

D < stdlib.h >

E
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 92/96
14/11/22, 09:42 Linguagem C: funções
E < string.h >

Parabéns! A alternativa B está correta.

O arquivo < ctype.h > define o conjunto de funções usado para classificar
caracteres por seus tipos ou para converter entre maiúsculas e minúsculas
de uma forma que seja independente do conjunto de caracteres usado
(normalmente ASCII ou uma de suas extensões), além de, entre outras
funções, verificar se determinado caractere é minúsculo ou maiúsculo.

Considerações finais
Iniciamos este conteúdo com a apresentação da estrutura de uma função: o tipo,
o nome, os parâmetros, o corpo da função e o valor de retorno. Pontuamos, em
seguida, que o código de uma função só é executado quando ela é invocada em
alguma parte do programa.

Sempre que uma função é invocada, o programa que a invoca é “suspenso”


https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 93/96
14/11/22, 09:42 Linguagem C: funções

temporariamente. Em seguida, são executadas as instruções presentes no corpo


dela. Uma vez terminada a função, o controle de execução do programa volta ao
local em que ela foi invocada.

Vimos ainda que qualquer tipo de dados da linguagem pode ser enviado como
parâmetro para uma função, mesmo o tipo de dado que venha a ser definido pelo
programador. Esses tipos podem ser de dados básicos, bem como tipos
definidos pelos usuário, como vetores, matrizes e estruturas.

Também demonstramos que C é uma linguagem com capacidade recursiva, isto


é, uma função que, direta ou indiretamente, pode invocar a si própria por meio de
outra função. A recursividade é uma técnica de desenvolvimento particularmente
útil na implementação de alguns algoritmos de pesquisa, poupando muito tempo
aos programadores.

Finalizamos nosso texto incentivando o uso das funções da biblioteca padrão,


uma vez que elas permitem uma diminuição considerável do tempo a ser
utilizado no desenvolvimento. Esse processo facilita a portabilidade dos
programas.

headset Podcast
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 94/96
14/11/22, 09:42 Linguagem C: funções

Ouça o podcast. Nele falaremos sobre a aplicação de conceitos de modularidade


em programas complexos.

Referências
DAMAS, L. Linguagem C. 10. ed. Rio de Janeiro: LTC, 2007.

SCHILDT, H. C completo e total. São Paulo: Makron Books, 1997.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 95/96
14/11/22, 09:42 Linguagem C: funções

Explore +
Consulte na internet:

Documentação de referência da Microsoft

• MICROSOFT. Funções (C). Microsoft Ignite. Publicado em: 15 ago. 2021.

b) Manual do GNU C (implementação livre da linguagem C)

• GNU. The GNU C reference manual. Consultado na internet em: 3 nov. 2021.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 96/96

Você também pode gostar